@poolzin/pool-bot 2026.4.29 → 2026.4.30

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-1DWuMa4l.js","sources":["../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/development/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/development/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/development/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/development/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/development/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/development/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/development/decorators/state.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/development/decorators/query.js","../../../ui/src/ui/assistant-identity.ts","../../../ui/src/ui/storage.ts","../../../src/sessions/session-key-utils.ts","../../../ui/src/ui/navigation.ts","../../../ui/src/ui/icons.ts","../../../src/shared/text/reasoning-tags.ts","../../../ui/src/ui/format.ts","../../../ui/src/ui/chat/message-extract.ts","../../../ui/src/ui/uuid.ts","../../../ui/src/ui/controllers/chat.ts","../../../ui/src/ui/controllers/sessions.ts","../../../ui/src/ui/app-tool-stream.ts","../../../ui/src/ui/app-scroll.ts","../../../ui/src/ui/controllers/config/form-utils.ts","../../../ui/src/ui/controllers/config.ts","../../../ui/src/ui/controllers/cron.ts","../../../ui/src/ui/controllers/channels.ts","../../../ui/src/ui/controllers/debug.ts","../../../ui/src/ui/controllers/logs.ts","../../../node_modules/.pnpm/@noble+ed25519@3.0.0/node_modules/@noble/ed25519/index.js","../../../ui/src/ui/device-identity.ts","../../../ui/src/ui/device-auth.ts","../../../ui/src/ui/controllers/devices.ts","../../../ui/src/ui/controllers/nodes.ts","../../../ui/src/ui/controllers/exec-approvals.ts","../../../ui/src/ui/controllers/presence.ts","../../../ui/src/ui/controllers/skills.ts","../../../ui/src/ui/theme.ts","../../../ui/src/ui/theme-transition.ts","../../../ui/src/ui/app-polling.ts","../../../ui/src/ui/app-settings.ts","../../../ui/src/ui/app-chat.ts","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/development/directive.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/development/directive-helpers.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/development/directives/repeat.js","../../../ui/src/ui/chat/message-normalizer.ts","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/development/directives/unsafe-html.js","../../../node_modules/.pnpm/dompurify@3.3.1/node_modules/dompurify/dist/purify.es.mjs","../../../node_modules/.pnpm/marked@17.0.1/node_modules/marked/lib/marked.esm.js","../../../ui/src/ui/markdown.ts","../../../ui/src/ui/chat/copy-as-markdown.ts","../../../ui/src/ui/tool-display.ts","../../../ui/src/ui/chat/constants.ts","../../../ui/src/ui/chat/tool-helpers.ts","../../../ui/src/ui/chat/tool-cards.ts","../../../ui/src/ui/chat/grouped-render.ts","../../../ui/src/ui/views/markdown-sidebar.ts","../../../ui/src/ui/components/resizable-divider.ts","../../../ui/src/ui/views/chat.ts","../../../ui/src/ui/views/config-form.shared.ts","../../../ui/src/ui/views/config-form.node.ts","../../../ui/src/ui/views/config-form.render.ts","../../../ui/src/ui/views/config-form.analyze.ts","../../../ui/src/ui/views/config.ts","../../../ui/src/ui/views/channels.shared.ts","../../../ui/src/ui/views/channels.config.ts","../../../ui/src/ui/views/channels.discord.ts","../../../ui/src/ui/views/channels.googlechat.ts","../../../ui/src/ui/views/channels.imessage.ts","../../../ui/src/ui/views/channels.nostr-profile-form.ts","../../../ui/src/ui/views/channels.nostr.ts","../../../ui/src/ui/views/channels.signal.ts","../../../ui/src/ui/views/channels.slack.ts","../../../ui/src/ui/views/channels.telegram.ts","../../../ui/src/ui/views/channels.whatsapp.ts","../../../ui/src/ui/views/channels.ts","../../../ui/src/ui/presenter.ts","../../../ui/src/ui/views/cron.ts","../../../ui/src/ui/views/debug.ts","../../../ui/src/ui/views/instances.ts","../../../ui/src/ui/views/logs.ts","../../../ui/src/ui/views/nodes-shared.ts","../../../ui/src/ui/views/nodes-exec-approvals.ts","../../../ui/src/ui/views/nodes.ts","../../../ui/src/ui/views/overview.ts","../../../ui/src/ui/views/sessions.ts","../../../ui/src/ui/views/exec-approval.ts","../../../ui/src/ui/views/skills.ts","../../../ui/src/ui/app-render.helpers.ts","../../../ui/src/ui/app-render.ts","../../../ui/src/ui/app-defaults.ts","../../../ui/src/ui/controllers/agents.ts","../../../src/gateway/protocol/client-info.ts","../../../src/gateway/device-auth.ts","../../../ui/src/ui/gateway.ts","../../../ui/src/ui/controllers/exec-approval.ts","../../../ui/src/ui/controllers/assistant-identity.ts","../../../ui/src/ui/app-gateway.ts","../../../ui/src/ui/app-lifecycle.ts","../../../ui/src/ui/app-channels.ts","../../../ui/src/ui/app.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst NODE_MODE = false;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n/**\n * Whether the current browser supports `adoptedStyleSheets`.\n */\nexport const supportsAdoptingStyleSheets = global.ShadowRoot &&\n (global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&\n 'adoptedStyleSheets' in Document.prototype &&\n 'replace' in CSSStyleSheet.prototype;\nconst constructionToken = Symbol();\nconst cssTagCache = new WeakMap();\n/**\n * A container for a string of CSS text, that may be used to create a CSSStyleSheet.\n *\n * CSSResult is the return value of `css`-tagged template literals and\n * `unsafeCSS()`. In order to ensure that CSSResults are only created via the\n * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly.\n */\nexport class CSSResult {\n constructor(cssText, strings, safeToken) {\n // This property needs to remain unminified.\n this['_$cssResult$'] = true;\n if (safeToken !== constructionToken) {\n throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');\n }\n this.cssText = cssText;\n this._strings = strings;\n }\n // This is a getter so that it's lazy. In practice, this means stylesheets\n // are not created until the first element instance is made.\n get styleSheet() {\n // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is\n // constructable.\n let styleSheet = this._styleSheet;\n const strings = this._strings;\n if (supportsAdoptingStyleSheets && styleSheet === undefined) {\n const cacheable = strings !== undefined && strings.length === 1;\n if (cacheable) {\n styleSheet = cssTagCache.get(strings);\n }\n if (styleSheet === undefined) {\n (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(this.cssText);\n if (cacheable) {\n cssTagCache.set(strings, styleSheet);\n }\n }\n }\n return styleSheet;\n }\n toString() {\n return this.cssText;\n }\n}\nconst textFromCSSResult = (value) => {\n // This property needs to remain unminified.\n if (value['_$cssResult$'] === true) {\n return value.cssText;\n }\n else if (typeof value === 'number') {\n return value;\n }\n else {\n throw new Error(`Value passed to 'css' function must be a 'css' function result: ` +\n `${value}. Use 'unsafeCSS' to pass non-literal values, but take care ` +\n `to ensure page security.`);\n }\n};\n/**\n * Wrap a value for interpolation in a {@linkcode css} tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value) => new CSSResult(typeof value === 'string' ? value : String(value), undefined, constructionToken);\n/**\n * A template literal tag which can be used with LitElement's\n * {@linkcode LitElement.styles} property to set element styles.\n *\n * For security reasons, only literal string values and number may be used in\n * embedded expressions. To incorporate non-literal values {@linkcode unsafeCSS}\n * may be used inside an expression.\n */\nexport const css = (strings, ...values) => {\n const cssText = strings.length === 1\n ? strings[0]\n : values.reduce((acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1], strings[0]);\n return new CSSResult(cssText, strings, constructionToken);\n};\n/**\n * Applies the given styles to a `shadowRoot`. When Shadow DOM is\n * available but `adoptedStyleSheets` is not, styles are appended to the\n * `shadowRoot` to [mimic the native feature](https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/adoptedStyleSheets).\n * Note, when shimming is used, any styles that are subsequently placed into\n * the shadowRoot should be placed *before* any shimmed adopted styles. This\n * will match spec behavior that gives adopted sheets precedence over styles in\n * shadowRoot.\n */\nexport const adoptStyles = (renderRoot, styles) => {\n if (supportsAdoptingStyleSheets) {\n renderRoot.adoptedStyleSheets = styles.map((s) => s instanceof CSSStyleSheet ? s : s.styleSheet);\n }\n else {\n for (const s of styles) {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = global['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = s.cssText;\n renderRoot.appendChild(style);\n }\n }\n};\nconst cssResultFromStyleSheet = (sheet) => {\n let cssText = '';\n for (const rule of sheet.cssRules) {\n cssText += rule.cssText;\n }\n return unsafeCSS(cssText);\n};\nexport const getCompatibleStyle = supportsAdoptingStyleSheets ||\n (NODE_MODE && global.CSSStyleSheet === undefined)\n ? (s) => s\n : (s) => s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s;\n//# sourceMappingURL=css-tag.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * Use this module if you want to create your own base class extending\n * {@link ReactiveElement}.\n * @packageDocumentation\n */\nimport { getCompatibleStyle, adoptStyles, } from './css-tag.js';\n// In the Node build, this import will be injected by Rollup:\n// import {HTMLElement, customElements} from '@lit-labs/ssr-dom-shim';\nexport * from './css-tag.js';\n// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022\nconst { is, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, getPrototypeOf, } = Object;\nconst NODE_MODE = false;\n// Lets a minifier replace globalThis references with a minified name\nconst global = globalThis;\nif (NODE_MODE) {\n global.customElements ??= customElements;\n}\nconst DEV_MODE = true;\nlet issueWarning;\nconst trustedTypes = global\n .trustedTypes;\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n ? trustedTypes.emptyScript\n : '';\nconst polyfillSupport = DEV_MODE\n ? global.reactiveElementPolyfillSupportDevMode\n : global.reactiveElementPolyfillSupport;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n global.litIssuedWarnings ??= new Set();\n /**\n * Issue a warning if we haven't already, based either on `code` or `warning`.\n * Warnings are disabled automatically only by `warning`; disabling via `code`\n * can be done by users.\n */\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!global.litIssuedWarnings.has(warning) &&\n !global.litIssuedWarnings.has(code)) {\n console.warn(warning);\n global.litIssuedWarnings.add(warning);\n }\n };\n queueMicrotask(() => {\n issueWarning('dev-mode', `Lit is in dev mode. Not recommended for production!`);\n // Issue polyfill support warning.\n if (global.ShadyDOM?.inUse && polyfillSupport === undefined) {\n issueWarning('polyfill-support-missing', `Shadow DOM is being polyfilled via \\`ShadyDOM\\` but ` +\n `the \\`polyfill-support\\` module has not been loaded.`);\n }\n });\n}\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event) => {\n const shouldEmit = global\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(new CustomEvent('lit-debug', {\n detail: event,\n }));\n }\n : undefined;\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty = (prop, _obj) => prop;\nexport const defaultConverter = {\n toAttribute(value, type) {\n switch (type) {\n case Boolean:\n value = value ? emptyStringForBooleanAttribute : null;\n break;\n case Object:\n case Array:\n // if the value is `null` or `undefined` pass this through\n // to allow removing/no change behavior.\n value = value == null ? value : JSON.stringify(value);\n break;\n }\n return value;\n },\n fromAttribute(value, type) {\n let fromValue = value;\n switch (type) {\n case Boolean:\n fromValue = value !== null;\n break;\n case Number:\n fromValue = value === null ? null : Number(value);\n break;\n case Object:\n case Array:\n // Do *not* generate exception when invalid JSON is set as elements\n // don't normally complain on being mis-configured.\n // TODO(sorvell): Do generate exception in *dev mode*.\n try {\n // Assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n fromValue = JSON.parse(value);\n }\n catch (e) {\n fromValue = null;\n }\n break;\n }\n return fromValue;\n },\n};\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual = (value, old) => !is(value, old);\nconst defaultPropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n useDefault: false,\n hasChanged: notEqual,\n};\n// Ensure metadata is enabled. TypeScript does not polyfill\n// Symbol.metadata, so we must ensure that it exists.\nSymbol.metadata ??= Symbol('metadata');\n// Map from a class's metadata object to property options\n// Note that we must use nullish-coalescing assignment so that we only use one\n// map even if we load multiple version of this module.\nglobal.litPropertyMetadata ??= new WeakMap();\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclasses to render updates as desired.\n * @noInheritDoc\n */\nexport class ReactiveElement\n// In the Node build, this `extends` clause will be substituted with\n// `(globalThis.HTMLElement ?? HTMLElement)`.\n//\n// This way, we will first prefer any global `HTMLElement` polyfill that the\n// user has assigned, and then fall back to the `HTMLElement` shim which has\n// been imported (see note at the top of this file about how this import is\n// generated by Rollup). Note that the `HTMLElement` variable has been\n// shadowed by this import, so it no longer refers to the global.\n extends HTMLElement {\n /**\n * Adds an initializer function to the class that is called during instance\n * construction.\n *\n * This is useful for code that runs against a `ReactiveElement`\n * subclass, such as a decorator, that needs to do work for each\n * instance, such as setting up a `ReactiveController`.\n *\n * ```ts\n * const myDecorator = (target: typeof ReactiveElement, key: string) => {\n * target.addInitializer((instance: ReactiveElement) => {\n * // This is run during construction of the element\n * new MyController(instance);\n * });\n * }\n * ```\n *\n * Decorating a field will then cause each instance to run an initializer\n * that adds a controller:\n *\n * ```ts\n * class MyElement extends LitElement {\n * @myDecorator foo;\n * }\n * ```\n *\n * Initializers are stored per-constructor. Adding an initializer to a\n * subclass does not add it to a superclass. Since initializers are run in\n * constructors, initializers will run in order of the class hierarchy,\n * starting with superclasses and progressing to the instance's class.\n *\n * @nocollapse\n */\n static addInitializer(initializer) {\n this.__prepare();\n (this._initializers ??= []).push(initializer);\n }\n /**\n * Returns a list of attributes corresponding to the registered properties.\n * @nocollapse\n * @category attributes\n */\n static get observedAttributes() {\n // Ensure we've created all properties\n this.finalize();\n // this.__attributeToPropertyMap is only undefined after finalize() in\n // ReactiveElement itself. ReactiveElement.observedAttributes is only\n // accessed with ReactiveElement as the receiver when a subclass or mixin\n // calls super.observedAttributes\n return (this.__attributeToPropertyMap && [...this.__attributeToPropertyMap.keys()]);\n }\n /**\n * Creates a property accessor on the element prototype if one does not exist\n * and stores a {@linkcode PropertyDeclaration} for the property with the\n * given options. The property setter calls the property's `hasChanged`\n * property option or uses a strict identity check to determine whether or not\n * to request an update.\n *\n * This method may be overridden to customize properties; however,\n * when doing so, it's important to call `super.createProperty` to ensure\n * the property is setup correctly. This method calls\n * `getPropertyDescriptor` internally to get a descriptor to install.\n * To customize what properties do when they are get or set, override\n * `getPropertyDescriptor`. To customize the options for a property,\n * implement `createProperty` like this:\n *\n * ```ts\n * static createProperty(name, options) {\n * options = Object.assign(options, {myOption: true});\n * super.createProperty(name, options);\n * }\n * ```\n *\n * @nocollapse\n * @category properties\n */\n static createProperty(name, options = defaultPropertyDeclaration) {\n // If this is a state property, force the attribute to false.\n if (options.state) {\n options.attribute = false;\n }\n this.__prepare();\n // Whether this property is wrapping accessors.\n // Helps control the initial value change and reflection logic.\n if (this.prototype.hasOwnProperty(name)) {\n options = Object.create(options);\n options.wrapped = true;\n }\n this.elementProperties.set(name, options);\n if (!options.noAccessor) {\n const key = DEV_MODE\n ? // Use Symbol.for in dev mode to make it easier to maintain state\n // when doing HMR.\n Symbol.for(`${String(name)} (@property() cache)`)\n : Symbol();\n const descriptor = this.getPropertyDescriptor(name, key, options);\n if (descriptor !== undefined) {\n defineProperty(this.prototype, name, descriptor);\n }\n }\n }\n /**\n * Returns a property descriptor to be defined on the given named property.\n * If no descriptor is returned, the property will not become an accessor.\n * For example,\n *\n * ```ts\n * class MyElement extends LitElement {\n * static getPropertyDescriptor(name, key, options) {\n * const defaultDescriptor =\n * super.getPropertyDescriptor(name, key, options);\n * const setter = defaultDescriptor.set;\n * return {\n * get: defaultDescriptor.get,\n * set(value) {\n * setter.call(this, value);\n * // custom action.\n * },\n * configurable: true,\n * enumerable: true\n * }\n * }\n * }\n * ```\n *\n * @nocollapse\n * @category properties\n */\n static getPropertyDescriptor(name, key, options) {\n const { get, set } = getOwnPropertyDescriptor(this.prototype, name) ?? {\n get() {\n return this[key];\n },\n set(v) {\n this[key] = v;\n },\n };\n if (DEV_MODE && get == null) {\n if ('value' in (getOwnPropertyDescriptor(this.prototype, name) ?? {})) {\n throw new Error(`Field ${JSON.stringify(String(name))} on ` +\n `${this.name} was declared as a reactive property ` +\n `but it's actually declared as a value on the prototype. ` +\n `Usually this is due to using @property or @state on a method.`);\n }\n issueWarning('reactive-property-without-getter', `Field ${JSON.stringify(String(name))} on ` +\n `${this.name} was declared as a reactive property ` +\n `but it does not have a getter. This will be an error in a ` +\n `future version of Lit.`);\n }\n return {\n get,\n set(value) {\n const oldValue = get?.call(this);\n set?.call(this, value);\n this.requestUpdate(name, oldValue, options);\n },\n configurable: true,\n enumerable: true,\n };\n }\n /**\n * Returns the property options associated with the given property.\n * These options are defined with a `PropertyDeclaration` via the `properties`\n * object or the `@property` decorator and are registered in\n * `createProperty(...)`.\n *\n * Note, this method should be considered \"final\" and not overridden. To\n * customize the options for a given property, override\n * {@linkcode createProperty}.\n *\n * @nocollapse\n * @final\n * @category properties\n */\n static getPropertyOptions(name) {\n return this.elementProperties.get(name) ?? defaultPropertyDeclaration;\n }\n /**\n * Initializes static own properties of the class used in bookkeeping\n * for element properties, initializers, etc.\n *\n * Can be called multiple times by code that needs to ensure these\n * properties exist before using them.\n *\n * This method ensures the superclass is finalized so that inherited\n * property metadata can be copied down.\n * @nocollapse\n */\n static __prepare() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('elementProperties', this))) {\n // Already prepared\n return;\n }\n // Finalize any superclasses\n const superCtor = getPrototypeOf(this);\n superCtor.finalize();\n // Create own set of initializers for this class if any exist on the\n // superclass and copy them down. Note, for a small perf boost, avoid\n // creating initializers unless needed.\n if (superCtor._initializers !== undefined) {\n this._initializers = [...superCtor._initializers];\n }\n // Initialize elementProperties from the superclass\n this.elementProperties = new Map(superCtor.elementProperties);\n }\n /**\n * Finishes setting up the class so that it's ready to be registered\n * as a custom element and instantiated.\n *\n * This method is called by the ReactiveElement.observedAttributes getter.\n * If you override the observedAttributes getter, you must either call\n * super.observedAttributes to trigger finalization, or call finalize()\n * yourself.\n *\n * @nocollapse\n */\n static finalize() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('finalized', this))) {\n return;\n }\n this.finalized = true;\n this.__prepare();\n // Create properties from the static properties block:\n if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n const props = this.properties;\n const propKeys = [\n ...getOwnPropertyNames(props),\n ...getOwnPropertySymbols(props),\n ];\n for (const p of propKeys) {\n this.createProperty(p, props[p]);\n }\n }\n // Create properties from standard decorator metadata:\n const metadata = this[Symbol.metadata];\n if (metadata !== null) {\n const properties = litPropertyMetadata.get(metadata);\n if (properties !== undefined) {\n for (const [p, options] of properties) {\n this.elementProperties.set(p, options);\n }\n }\n }\n // Create the attribute-to-property map\n this.__attributeToPropertyMap = new Map();\n for (const [p, options] of this.elementProperties) {\n const attr = this.__attributeNameForProperty(p, options);\n if (attr !== undefined) {\n this.__attributeToPropertyMap.set(attr, p);\n }\n }\n this.elementStyles = this.finalizeStyles(this.styles);\n if (DEV_MODE) {\n if (this.hasOwnProperty('createProperty')) {\n issueWarning('no-override-create-property', 'Overriding ReactiveElement.createProperty() is deprecated. ' +\n 'The override will not be called with standard decorators');\n }\n if (this.hasOwnProperty('getPropertyDescriptor')) {\n issueWarning('no-override-get-property-descriptor', 'Overriding ReactiveElement.getPropertyDescriptor() is deprecated. ' +\n 'The override will not be called with standard decorators');\n }\n }\n }\n /**\n * Takes the styles the user supplied via the `static styles` property and\n * returns the array of styles to apply to the element.\n * Override this method to integrate into a style management system.\n *\n * Styles are deduplicated preserving the _last_ instance in the list. This\n * is a performance optimization to avoid duplicated styles that can occur\n * especially when composing via subclassing. The last item is kept to try\n * to preserve the cascade order with the assumption that it's most important\n * that last added styles override previous styles.\n *\n * @nocollapse\n * @category styles\n */\n static finalizeStyles(styles) {\n const elementStyles = [];\n if (Array.isArray(styles)) {\n // Dedupe the flattened array in reverse order to preserve the last items.\n // Casting to Array<unknown> works around TS error that\n // appears to come from trying to flatten a type CSSResultArray.\n const set = new Set(styles.flat(Infinity).reverse());\n // Then preserve original order by adding the set items in reverse order.\n for (const s of set) {\n elementStyles.unshift(getCompatibleStyle(s));\n }\n }\n else if (styles !== undefined) {\n elementStyles.push(getCompatibleStyle(styles));\n }\n return elementStyles;\n }\n /**\n * Returns the property name for the given attribute `name`.\n * @nocollapse\n */\n static __attributeNameForProperty(name, options) {\n const attribute = options.attribute;\n return attribute === false\n ? undefined\n : typeof attribute === 'string'\n ? attribute\n : typeof name === 'string'\n ? name.toLowerCase()\n : undefined;\n }\n constructor() {\n super();\n this.__instanceProperties = undefined;\n /**\n * True if there is a pending update as a result of calling `requestUpdate()`.\n * Should only be read.\n * @category updates\n */\n this.isUpdatePending = false;\n /**\n * Is set to `true` after the first update. The element code cannot assume\n * that `renderRoot` exists before the element `hasUpdated`.\n * @category updates\n */\n this.hasUpdated = false;\n /**\n * Name of currently reflecting property\n */\n this.__reflectingProperty = null;\n this.__initialize();\n }\n /**\n * Internal only override point for customizing work done when elements\n * are constructed.\n */\n __initialize() {\n this.__updatePromise = new Promise((res) => (this.enableUpdating = res));\n this._$changedProperties = new Map();\n // This enqueues a microtask that must run before the first update, so it\n // must be called before requestUpdate()\n this.__saveInstanceProperties();\n // ensures first update will be caught by an early access of\n // `updateComplete`\n this.requestUpdate();\n this.constructor._initializers?.forEach((i) => i(this));\n }\n /**\n * Registers a `ReactiveController` to participate in the element's reactive\n * update cycle. The element automatically calls into any registered\n * controllers during its lifecycle callbacks.\n *\n * If the element is connected when `addController()` is called, the\n * controller's `hostConnected()` callback will be immediately called.\n * @category controllers\n */\n addController(controller) {\n (this.__controllers ??= new Set()).add(controller);\n // If a controller is added after the element has been connected,\n // call hostConnected. Note, re-using existence of `renderRoot` here\n // (which is set in connectedCallback) to avoid the need to track a\n // first connected state.\n if (this.renderRoot !== undefined && this.isConnected) {\n controller.hostConnected?.();\n }\n }\n /**\n * Removes a `ReactiveController` from the element.\n * @category controllers\n */\n removeController(controller) {\n this.__controllers?.delete(controller);\n }\n /**\n * Fixes any properties set on the instance before upgrade time.\n * Otherwise these would shadow the accessor and break these properties.\n * The properties are stored in a Map which is played back after the\n * constructor runs.\n */\n __saveInstanceProperties() {\n const instanceProperties = new Map();\n const elementProperties = this.constructor\n .elementProperties;\n for (const p of elementProperties.keys()) {\n if (this.hasOwnProperty(p)) {\n instanceProperties.set(p, this[p]);\n delete this[p];\n }\n }\n if (instanceProperties.size > 0) {\n this.__instanceProperties = instanceProperties;\n }\n }\n /**\n * Returns the node into which the element should render and by default\n * creates and returns an open shadowRoot. Implement to customize where the\n * element's DOM is rendered. For example, to render into the element's\n * childNodes, return `this`.\n *\n * @return Returns a node into which to render.\n * @category rendering\n */\n createRenderRoot() {\n const renderRoot = this.shadowRoot ??\n this.attachShadow(this.constructor.shadowRootOptions);\n adoptStyles(renderRoot, this.constructor.elementStyles);\n return renderRoot;\n }\n /**\n * On first connection, creates the element's renderRoot, sets up\n * element styling, and enables updating.\n * @category lifecycle\n */\n connectedCallback() {\n // Create renderRoot before controllers `hostConnected`\n this.renderRoot ??=\n this.createRenderRoot();\n this.enableUpdating(true);\n this.__controllers?.forEach((c) => c.hostConnected?.());\n }\n /**\n * Note, this method should be considered final and not overridden. It is\n * overridden on the element instance with a function that triggers the first\n * update.\n * @category updates\n */\n enableUpdating(_requestedUpdate) { }\n /**\n * Allows for `super.disconnectedCallback()` in extensions while\n * reserving the possibility of making non-breaking feature additions\n * when disconnecting at some point in the future.\n * @category lifecycle\n */\n disconnectedCallback() {\n this.__controllers?.forEach((c) => c.hostDisconnected?.());\n }\n /**\n * Synchronizes property values when attributes change.\n *\n * Specifically, when an attribute is set, the corresponding property is set.\n * You should rarely need to implement this callback. If this method is\n * overridden, `super.attributeChangedCallback(name, _old, value)` must be\n * called.\n *\n * See [responding to attribute changes](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#responding_to_attribute_changes)\n * on MDN for more information about the `attributeChangedCallback`.\n * @category attributes\n */\n attributeChangedCallback(name, _old, value) {\n this._$attributeToProperty(name, value);\n }\n __propertyToAttribute(name, value) {\n const elemProperties = this.constructor.elementProperties;\n const options = elemProperties.get(name);\n const attr = this.constructor.__attributeNameForProperty(name, options);\n if (attr !== undefined && options.reflect === true) {\n const converter = options.converter?.toAttribute !==\n undefined\n ? options.converter\n : defaultConverter;\n const attrValue = converter.toAttribute(value, options.type);\n if (DEV_MODE &&\n this.constructor.enabledWarnings.includes('migration') &&\n attrValue === undefined) {\n issueWarning('undefined-attribute-value', `The attribute value for the ${name} property is ` +\n `undefined on element ${this.localName}. The attribute will be ` +\n `removed, but in the previous version of \\`ReactiveElement\\`, ` +\n `the attribute would not have changed.`);\n }\n // Track if the property is being reflected to avoid\n // setting the property again via `attributeChangedCallback`. Note:\n // 1. this takes advantage of the fact that the callback is synchronous.\n // 2. will behave incorrectly if multiple attributes are in the reaction\n // stack at time of calling. However, since we process attributes\n // in `update` this should not be possible (or an extreme corner case\n // that we'd like to discover).\n // mark state reflecting\n this.__reflectingProperty = name;\n if (attrValue == null) {\n this.removeAttribute(attr);\n }\n else {\n this.setAttribute(attr, attrValue);\n }\n // mark state not reflecting\n this.__reflectingProperty = null;\n }\n }\n /** @internal */\n _$attributeToProperty(name, value) {\n const ctor = this.constructor;\n // Note, hint this as an `AttributeMap` so closure clearly understands\n // the type; it has issues with tracking types through statics\n const propName = ctor.__attributeToPropertyMap.get(name);\n // Use tracking info to avoid reflecting a property value to an attribute\n // if it was just set because the attribute changed.\n if (propName !== undefined && this.__reflectingProperty !== propName) {\n const options = ctor.getPropertyOptions(propName);\n const converter = typeof options.converter === 'function'\n ? { fromAttribute: options.converter }\n : options.converter?.fromAttribute !== undefined\n ? options.converter\n : defaultConverter;\n // mark state reflecting\n this.__reflectingProperty = propName;\n const convertedValue = converter.fromAttribute(value, options.type);\n this[propName] =\n convertedValue ??\n this.__defaultValues?.get(propName) ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n convertedValue;\n // mark state not reflecting\n this.__reflectingProperty = null;\n }\n }\n /**\n * Requests an update which is processed asynchronously. This should be called\n * when an element should update based on some state not triggered by setting\n * a reactive property. In this case, pass no arguments. It should also be\n * called when manually implementing a property setter. In this case, pass the\n * property `name` and `oldValue` to ensure that any configured property\n * options are honored.\n *\n * @param name name of requesting property\n * @param oldValue old value of requesting property\n * @param options property options to use instead of the previously\n * configured options\n * @param useNewValue if true, the newValue argument is used instead of\n * reading the property value. This is important to use if the reactive\n * property is a standard private accessor, as opposed to a plain\n * property, since private members can't be dynamically read by name.\n * @param newValue the new value of the property. This is only used if\n * `useNewValue` is true.\n * @category updates\n */\n requestUpdate(name, oldValue, options, useNewValue = false, newValue) {\n // If we have a property key, perform property update steps.\n if (name !== undefined) {\n if (DEV_MODE && name instanceof Event) {\n issueWarning(``, `The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()`);\n }\n const ctor = this.constructor;\n if (useNewValue === false) {\n newValue = this[name];\n }\n options ??= ctor.getPropertyOptions(name);\n const changed = (options.hasChanged ?? notEqual)(newValue, oldValue) ||\n // When there is no change, check a corner case that can occur when\n // 1. there's a initial value which was not reflected\n // 2. the property is subsequently set to this value.\n // For example, `prop: {useDefault: true, reflect: true}`\n // and el.prop = 'foo'. This should be considered a change if the\n // attribute is not set because we will now reflect the property to the attribute.\n (options.useDefault &&\n options.reflect &&\n newValue === this.__defaultValues?.get(name) &&\n !this.hasAttribute(ctor.__attributeNameForProperty(name, options)));\n if (changed) {\n this._$changeProperty(name, oldValue, options);\n }\n else {\n // Abort the request if the property should not be considered changed.\n return;\n }\n }\n if (this.isUpdatePending === false) {\n this.__updatePromise = this.__enqueueUpdate();\n }\n }\n /**\n * @internal\n */\n _$changeProperty(name, oldValue, { useDefault, reflect, wrapped }, initializeValue) {\n // Record default value when useDefault is used. This allows us to\n // restore this value when the attribute is removed.\n if (useDefault && !(this.__defaultValues ??= new Map()).has(name)) {\n this.__defaultValues.set(name, initializeValue ?? oldValue ?? this[name]);\n // if this is not wrapping an accessor, it must be an initial setting\n // and in this case we do not want to record the change or reflect.\n if (wrapped !== true || initializeValue !== undefined) {\n return;\n }\n }\n // TODO (justinfagnani): Create a benchmark of Map.has() + Map.set(\n // vs just Map.set()\n if (!this._$changedProperties.has(name)) {\n // On the initial change, the old value should be `undefined`, except\n // with `useDefault`\n if (!this.hasUpdated && !useDefault) {\n oldValue = undefined;\n }\n this._$changedProperties.set(name, oldValue);\n }\n // Add to reflecting properties set.\n // Note, it's important that every change has a chance to add the\n // property to `__reflectingProperties`. This ensures setting\n // attribute + property reflects correctly.\n if (reflect === true && this.__reflectingProperty !== name) {\n (this.__reflectingProperties ??= new Set()).add(name);\n }\n }\n /**\n * Sets up the element to asynchronously update.\n */\n async __enqueueUpdate() {\n this.isUpdatePending = true;\n try {\n // Ensure any previous update has resolved before updating.\n // This `await` also ensures that property changes are batched.\n await this.__updatePromise;\n }\n catch (e) {\n // Refire any previous errors async so they do not disrupt the update\n // cycle. Errors are refired so developers have a chance to observe\n // them, and this can be done by implementing\n // `window.onunhandledrejection`.\n Promise.reject(e);\n }\n const result = this.scheduleUpdate();\n // If `scheduleUpdate` returns a Promise, we await it. This is done to\n // enable coordinating updates with a scheduler. Note, the result is\n // checked to avoid delaying an additional microtask unless we need to.\n if (result != null) {\n await result;\n }\n return !this.isUpdatePending;\n }\n /**\n * Schedules an element update. You can override this method to change the\n * timing of updates by returning a Promise. The update will await the\n * returned Promise, and you should resolve the Promise to allow the update\n * to proceed. If this method is overridden, `super.scheduleUpdate()`\n * must be called.\n *\n * For instance, to schedule updates to occur just before the next frame:\n *\n * ```ts\n * override protected async scheduleUpdate(): Promise<unknown> {\n * await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n * super.scheduleUpdate();\n * }\n * ```\n * @category updates\n */\n scheduleUpdate() {\n const result = this.performUpdate();\n if (DEV_MODE &&\n this.constructor.enabledWarnings.includes('async-perform-update') &&\n typeof result?.then ===\n 'function') {\n issueWarning('async-perform-update', `Element ${this.localName} returned a Promise from performUpdate(). ` +\n `This behavior is deprecated and will be removed in a future ` +\n `version of ReactiveElement.`);\n }\n return result;\n }\n /**\n * Performs an element update. Note, if an exception is thrown during the\n * update, `firstUpdated` and `updated` will not be called.\n *\n * Call `performUpdate()` to immediately process a pending update. This should\n * generally not be needed, but it can be done in rare cases when you need to\n * update synchronously.\n *\n * @category updates\n */\n performUpdate() {\n // Abort any update if one is not pending when this is called.\n // This can happen if `performUpdate` is called early to \"flush\"\n // the update.\n if (!this.isUpdatePending) {\n return;\n }\n debugLogEvent?.({ kind: 'update' });\n if (!this.hasUpdated) {\n // Create renderRoot before first update. This occurs in `connectedCallback`\n // but is done here to support out of tree calls to `enableUpdating`/`performUpdate`.\n this.renderRoot ??=\n this.createRenderRoot();\n if (DEV_MODE) {\n // Produce warning if any reactive properties on the prototype are\n // shadowed by class fields. Instance fields set before upgrade are\n // deleted by this point, so any own property is caused by class field\n // initialization in the constructor.\n const ctor = this.constructor;\n const shadowedProperties = [...ctor.elementProperties.keys()].filter((p) => this.hasOwnProperty(p) && p in getPrototypeOf(this));\n if (shadowedProperties.length) {\n throw new Error(`The following properties on element ${this.localName} will not ` +\n `trigger updates as expected because they are set using class ` +\n `fields: ${shadowedProperties.join(', ')}. ` +\n `Native class fields and some compiled output will overwrite ` +\n `accessors used for detecting changes. See ` +\n `https://lit.dev/msg/class-field-shadowing ` +\n `for more information.`);\n }\n }\n // Mixin instance properties once, if they exist.\n if (this.__instanceProperties) {\n // TODO (justinfagnani): should we use the stored value? Could a new value\n // have been set since we stored the own property value?\n for (const [p, value] of this.__instanceProperties) {\n this[p] = value;\n }\n this.__instanceProperties = undefined;\n }\n // Trigger initial value reflection and populate the initial\n // `changedProperties` map, but only for the case of properties created\n // via `createProperty` on accessors, which will not have already\n // populated the `changedProperties` map since they are not set.\n // We can't know if these accessors had initializers, so we just set\n // them anyway - a difference from experimental decorators on fields and\n // standard decorators on auto-accessors.\n // For context see:\n // https://github.com/lit/lit/pull/4183#issuecomment-1711959635\n const elementProperties = this.constructor\n .elementProperties;\n if (elementProperties.size > 0) {\n for (const [p, options] of elementProperties) {\n const { wrapped } = options;\n const value = this[p];\n if (wrapped === true &&\n !this._$changedProperties.has(p) &&\n value !== undefined) {\n this._$changeProperty(p, undefined, options, value);\n }\n }\n }\n }\n let shouldUpdate = false;\n const changedProperties = this._$changedProperties;\n try {\n shouldUpdate = this.shouldUpdate(changedProperties);\n if (shouldUpdate) {\n this.willUpdate(changedProperties);\n this.__controllers?.forEach((c) => c.hostUpdate?.());\n this.update(changedProperties);\n }\n else {\n this.__markUpdated();\n }\n }\n catch (e) {\n // Prevent `firstUpdated` and `updated` from running when there's an\n // update exception.\n shouldUpdate = false;\n // Ensure element can accept additional updates after an exception.\n this.__markUpdated();\n throw e;\n }\n // The update is no longer considered pending and further updates are now allowed.\n if (shouldUpdate) {\n this._$didUpdate(changedProperties);\n }\n }\n /**\n * Invoked before `update()` to compute values needed during the update.\n *\n * Implement `willUpdate` to compute property values that depend on other\n * properties and are used in the rest of the update process.\n *\n * ```ts\n * willUpdate(changedProperties) {\n * // only need to check changed properties for an expensive computation.\n * if (changedProperties.has('firstName') || changedProperties.has('lastName')) {\n * this.sha = computeSHA(`${this.firstName} ${this.lastName}`);\n * }\n * }\n *\n * render() {\n * return html`SHA: ${this.sha}`;\n * }\n * ```\n *\n * @category updates\n */\n willUpdate(_changedProperties) { }\n // Note, this is an override point for polyfill-support.\n // @internal\n _$didUpdate(changedProperties) {\n this.__controllers?.forEach((c) => c.hostUpdated?.());\n if (!this.hasUpdated) {\n this.hasUpdated = true;\n this.firstUpdated(changedProperties);\n }\n this.updated(changedProperties);\n if (DEV_MODE &&\n this.isUpdatePending &&\n this.constructor.enabledWarnings.includes('change-in-update')) {\n issueWarning('change-in-update', `Element ${this.localName} scheduled an update ` +\n `(generally because a property was set) ` +\n `after an update completed, causing a new update to be scheduled. ` +\n `This is inefficient and should be avoided unless the next update ` +\n `can only be scheduled as a side effect of the previous update.`);\n }\n }\n __markUpdated() {\n this._$changedProperties = new Map();\n this.isUpdatePending = false;\n }\n /**\n * Returns a Promise that resolves when the element has completed updating.\n * The Promise value is a boolean that is `true` if the element completed the\n * update without triggering another update. The Promise result is `false` if\n * a property was set inside `updated()`. If the Promise is rejected, an\n * exception was thrown during the update.\n *\n * To await additional asynchronous work, override the `getUpdateComplete`\n * method. For example, it is sometimes useful to await a rendered element\n * before fulfilling this Promise. To do this, first await\n * `super.getUpdateComplete()`, then any subsequent state.\n *\n * @return A promise of a boolean that resolves to true if the update completed\n * without triggering another update.\n * @category updates\n */\n get updateComplete() {\n return this.getUpdateComplete();\n }\n /**\n * Override point for the `updateComplete` promise.\n *\n * It is not safe to override the `updateComplete` getter directly due to a\n * limitation in TypeScript which means it is not possible to call a\n * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n * This method should be overridden instead. For example:\n *\n * ```ts\n * class MyElement extends LitElement {\n * override async getUpdateComplete() {\n * const result = await super.getUpdateComplete();\n * await this._myChild.updateComplete;\n * return result;\n * }\n * }\n * ```\n *\n * @return A promise of a boolean that resolves to true if the update completed\n * without triggering another update.\n * @category updates\n */\n getUpdateComplete() {\n return this.__updatePromise;\n }\n /**\n * Controls whether or not `update()` should be called when the element requests\n * an update. By default, this method always returns `true`, but this can be\n * customized to control when to update.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n shouldUpdate(_changedProperties) {\n return true;\n }\n /**\n * Updates the element. This method reflects property values to attributes.\n * It can be overridden to render and keep updated element DOM.\n * Setting properties inside this method will *not* trigger\n * another update.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n update(_changedProperties) {\n // The forEach() expression will only run when __reflectingProperties is\n // defined, and it returns undefined, setting __reflectingProperties to\n // undefined\n this.__reflectingProperties &&= this.__reflectingProperties.forEach((p) => this.__propertyToAttribute(p, this[p]));\n this.__markUpdated();\n }\n /**\n * Invoked whenever the element is updated. Implement to perform\n * post-updating tasks via DOM APIs, for example, focusing an element.\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n updated(_changedProperties) { }\n /**\n * Invoked when the element is first updated. Implement to perform one time\n * work on the element after update.\n *\n * ```ts\n * firstUpdated() {\n * this.renderRoot.getElementById('my-text-area').focus();\n * }\n * ```\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n firstUpdated(_changedProperties) { }\n}\n/**\n * Memoized list of all element styles.\n * Created lazily on user subclasses when finalizing the class.\n * @nocollapse\n * @category styles\n */\nReactiveElement.elementStyles = [];\n/**\n * Options used when calling `attachShadow`. Set this property to customize\n * the options for the shadowRoot; for example, to create a closed\n * shadowRoot: `{mode: 'closed'}`.\n *\n * Note, these options are used in `createRenderRoot`. If this method\n * is customized, options should be respected if possible.\n * @nocollapse\n * @category rendering\n */\nReactiveElement.shadowRootOptions = { mode: 'open' };\n// Assigned here to work around a jscompiler bug with static fields\n// when compiling to ES5.\n// https://github.com/google/closure-compiler/issues/3177\nReactiveElement[JSCompiler_renameProperty('elementProperties', ReactiveElement)] = new Map();\nReactiveElement[JSCompiler_renameProperty('finalized', ReactiveElement)] = new Map();\n// Apply polyfills if available\npolyfillSupport?.({ ReactiveElement });\n// Dev mode warnings...\nif (DEV_MODE) {\n // Default warning set.\n ReactiveElement.enabledWarnings = [\n 'change-in-update',\n 'async-perform-update',\n ];\n const ensureOwnWarnings = function (ctor) {\n if (!ctor.hasOwnProperty(JSCompiler_renameProperty('enabledWarnings', ctor))) {\n ctor.enabledWarnings = ctor.enabledWarnings.slice();\n }\n };\n ReactiveElement.enableWarning = function (warning) {\n ensureOwnWarnings(this);\n if (!this.enabledWarnings.includes(warning)) {\n this.enabledWarnings.push(warning);\n }\n };\n ReactiveElement.disableWarning = function (warning) {\n ensureOwnWarnings(this);\n const i = this.enabledWarnings.indexOf(warning);\n if (i >= 0) {\n this.enabledWarnings.splice(i, 1);\n }\n };\n}\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for ReactiveElement usage.\n(global.reactiveElementVersions ??= []).push('2.1.2');\nif (DEV_MODE && global.reactiveElementVersions.length > 1) {\n queueMicrotask(() => {\n issueWarning('multiple-versions', `Multiple versions of Lit loaded. Loading multiple versions ` +\n `is not recommended.`);\n });\n}\n//# sourceMappingURL=reactive-element.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst DEV_MODE = true;\nconst ENABLE_EXTRA_SECURITY_HOOKS = true;\nconst ENABLE_SHADYDOM_NOPATCH = true;\nconst NODE_MODE = false;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event) => {\n const shouldEmit = global\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(new CustomEvent('lit-debug', {\n detail: event,\n }));\n }\n : undefined;\n// Used for connecting beginRender and endRender events when there are nested\n// renders when errors are thrown preventing an endRender event from being\n// called.\nlet debugLogRenderId = 0;\nlet issueWarning;\nif (DEV_MODE) {\n global.litIssuedWarnings ??= new Set();\n /**\n * Issue a warning if we haven't already, based either on `code` or `warning`.\n * Warnings are disabled automatically only by `warning`; disabling via `code`\n * can be done by users.\n */\n issueWarning = (code, warning) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (!global.litIssuedWarnings.has(warning) &&\n !global.litIssuedWarnings.has(code)) {\n console.warn(warning);\n global.litIssuedWarnings.add(warning);\n }\n };\n queueMicrotask(() => {\n issueWarning('dev-mode', `Lit is in dev mode. Not recommended for production!`);\n });\n}\nconst wrap = ENABLE_SHADYDOM_NOPATCH &&\n global.ShadyDOM?.inUse &&\n global.ShadyDOM?.noPatch === true\n ? global.ShadyDOM.wrap\n : (node) => node;\nconst trustedTypes = global.trustedTypes;\n/**\n * Our TrustedTypePolicy for HTML which is declared using the html template\n * tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n */\nconst policy = trustedTypes\n ? trustedTypes.createPolicy('lit-html', {\n createHTML: (s) => s,\n })\n : undefined;\nconst identityFunction = (value) => value;\nconst noopSanitizer = (_node, _name, _type) => identityFunction;\n/** Sets the global sanitizer factory. */\nconst setSanitizer = (newSanitizer) => {\n if (!ENABLE_EXTRA_SECURITY_HOOKS) {\n return;\n }\n if (sanitizerFactoryInternal !== noopSanitizer) {\n throw new Error(`Attempted to overwrite existing lit-html security policy.` +\n ` setSanitizeDOMValueFactory should be called at most once.`);\n }\n sanitizerFactoryInternal = newSanitizer;\n};\n/**\n * Only used in internal tests, not a part of the public API.\n */\nconst _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => {\n sanitizerFactoryInternal = noopSanitizer;\n};\nconst createSanitizer = (node, name, type) => {\n return sanitizerFactoryInternal(node, name, type);\n};\n// Added to an attribute name to mark the attribute as bound so we can find\n// it easily.\nconst boundAttributeSuffix = '$lit$';\n// This marker is used in many syntactic positions in HTML, so it must be\n// a valid element name and attribute name. We don't support dynamic names (yet)\n// but this at least ensures that the parse tree is closer to the template\n// intention.\nconst marker = `lit$${Math.random().toFixed(9).slice(2)}$`;\n// String used to tell if a comment is a marker comment\nconst markerMatch = '?' + marker;\n// Text used to insert a comment marker node. We use processing instruction\n// syntax because it's slightly smaller, but parses as a comment node.\nconst nodeMarker = `<${markerMatch}>`;\nconst d = NODE_MODE && global.document === undefined\n ? {\n createTreeWalker() {\n return {};\n },\n }\n : document;\n// Creates a dynamic marker. We never have to search for these in the DOM.\nconst createMarker = () => d.createComment('');\nconst isPrimitive = (value) => value === null || (typeof value != 'object' && typeof value != 'function');\nconst isArray = Array.isArray;\nconst isIterable = (value) => isArray(value) ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof value?.[Symbol.iterator] === 'function';\nconst SPACE_CHAR = `[ \\t\\n\\f\\r]`;\nconst ATTR_VALUE_CHAR = `[^ \\t\\n\\f\\r\"'\\`<>=]`;\nconst NAME_CHAR = `[^\\\\s\"'>=/]`;\n// These regexes represent the five parsing states that we care about in the\n// Template's HTML scanner. They match the *end* of the state they're named\n// after.\n// Depending on the match, we transition to a new state. If there's no match,\n// we stay in the same state.\n// Note that the regexes are stateful. We utilize lastIndex and sync it\n// across the multiple regexes used. In addition to the five regexes below\n// we also dynamically create a regex to find the matching end tags for raw\n// text elements.\n/**\n * End of text is: `<` followed by:\n * (comment start) or (tag) or (dynamic tag binding)\n */\nconst textEndRegex = /<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g;\nconst COMMENT_START = 1;\nconst TAG_NAME = 2;\nconst DYNAMIC_TAG_NAME = 3;\nconst commentEndRegex = /-->/g;\n/**\n * Comments not started with <!--, like </{, can be ended by a single `>`\n */\nconst comment2EndRegex = />/g;\n/**\n * The tagEnd regex matches the end of the \"inside an opening\" tag syntax\n * position. It either matches a `>`, an attribute-like sequence, or the end\n * of the string after a space (attribute-name position ending).\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#elements-attributes\n *\n * \" \\t\\n\\f\\r\" are HTML space characters:\n * https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * So an attribute is:\n * * The name: any character except a whitespace character, (\"), ('), \">\",\n * \"=\", or \"/\". Note: this is different from the HTML spec which also excludes control characters.\n * * Followed by zero or more space characters\n * * Followed by \"=\"\n * * Followed by zero or more space characters\n * * Followed by:\n * * Any character except space, ('), (\"), \"<\", \">\", \"=\", (`), or\n * * (\") then any non-(\"), or\n * * (') then any non-(')\n */\nconst tagEndRegex = new RegExp(`>|${SPACE_CHAR}(?:(${NAME_CHAR}+)(${SPACE_CHAR}*=${SPACE_CHAR}*(?:${ATTR_VALUE_CHAR}|(\"|')|))|$)`, 'g');\nconst ENTIRE_MATCH = 0;\nconst ATTRIBUTE_NAME = 1;\nconst SPACES_AND_EQUALS = 2;\nconst QUOTE_CHAR = 3;\nconst singleQuoteAttrEndRegex = /'/g;\nconst doubleQuoteAttrEndRegex = /\"/g;\n/**\n * Matches the raw text elements.\n *\n * Comments are not parsed within raw text elements, so we need to search their\n * text content for marker strings.\n */\nconst rawTextElement = /^(?:script|style|textarea|title)$/i;\n/** TemplateResult types */\nconst HTML_RESULT = 1;\nconst SVG_RESULT = 2;\nconst MATHML_RESULT = 3;\n// TemplatePart types\n// IMPORTANT: these must match the values in PartType\nconst ATTRIBUTE_PART = 1;\nconst CHILD_PART = 2;\nconst PROPERTY_PART = 3;\nconst BOOLEAN_ATTRIBUTE_PART = 4;\nconst EVENT_PART = 5;\nconst ELEMENT_PART = 6;\nconst COMMENT_PART = 7;\n/**\n * Generates a template literal tag function that returns a TemplateResult with\n * the given result type.\n */\nconst tag = (type) => (strings, ...values) => {\n // Warn against templates octal escape sequences\n // We do this here rather than in render so that the warning is closer to the\n // template definition.\n if (DEV_MODE && strings.some((s) => s === undefined)) {\n console.warn('Some template strings are undefined.\\n' +\n 'This is probably caused by illegal octal escape sequences.');\n }\n if (DEV_MODE) {\n // Import static-html.js results in a circular dependency which g3 doesn't\n // handle. Instead we know that static values must have the field\n // `_$litStatic$`.\n if (values.some((val) => val?.['_$litStatic$'])) {\n issueWarning('', `Static values 'literal' or 'unsafeStatic' cannot be used as values to non-static templates.\\n` +\n `Please use the static 'html' tag function. See https://lit.dev/docs/templates/expressions/#static-expressions`);\n }\n }\n return {\n // This property needs to remain unminified.\n ['_$litType$']: type,\n strings,\n values,\n };\n};\n/**\n * Interprets a template literal as an HTML template that can efficiently\n * render to and update a container.\n *\n * ```ts\n * const header = (title: string) => html`<h1>${title}</h1>`;\n * ```\n *\n * The `html` tag returns a description of the DOM to render as a value. It is\n * lazy, meaning no work is done until the template is rendered. When rendering,\n * if a template comes from the same expression as a previously rendered result,\n * it's efficiently updated instead of replaced.\n */\nexport const html = tag(HTML_RESULT);\n/**\n * Interprets a template literal as an SVG fragment that can efficiently render\n * to and update a container.\n *\n * ```ts\n * const rect = svg`<rect width=\"10\" height=\"10\"></rect>`;\n *\n * const myImage = html`\n * <svg viewBox=\"0 0 10 10\" xmlns=\"http://www.w3.org/2000/svg\">\n * ${rect}\n * </svg>`;\n * ```\n *\n * The `svg` *tag function* should only be used for SVG fragments, or elements\n * that would be contained **inside** an `<svg>` HTML element. A common error is\n * placing an `<svg>` *element* in a template tagged with the `svg` tag\n * function. The `<svg>` element is an HTML element and should be used within a\n * template tagged with the {@linkcode html} tag function.\n *\n * In LitElement usage, it's invalid to return an SVG fragment from the\n * `render()` method, as the SVG fragment will be contained within the element's\n * shadow root and thus not be properly contained within an `<svg>` HTML\n * element.\n */\nexport const svg = tag(SVG_RESULT);\n/**\n * Interprets a template literal as MathML fragment that can efficiently render\n * to and update a container.\n *\n * ```ts\n * const num = mathml`<mn>1</mn>`;\n *\n * const eq = html`\n * <math>\n * ${num}\n * </math>`;\n * ```\n *\n * The `mathml` *tag function* should only be used for MathML fragments, or\n * elements that would be contained **inside** a `<math>` HTML element. A common\n * error is placing a `<math>` *element* in a template tagged with the `mathml`\n * tag function. The `<math>` element is an HTML element and should be used\n * within a template tagged with the {@linkcode html} tag function.\n *\n * In LitElement usage, it's invalid to return an MathML fragment from the\n * `render()` method, as the MathML fragment will be contained within the\n * element's shadow root and thus not be properly contained within a `<math>`\n * HTML element.\n */\nexport const mathml = tag(MATHML_RESULT);\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nexport const noChange = Symbol.for('lit-noChange');\n/**\n * A sentinel value that signals a ChildPart to fully clear its content.\n *\n * ```ts\n * const button = html`${\n * user.isAdmin\n * ? html`<button>DELETE</button>`\n * : nothing\n * }`;\n * ```\n *\n * Prefer using `nothing` over other falsy values as it provides a consistent\n * behavior between various expression binding contexts.\n *\n * In child expressions, `undefined`, `null`, `''`, and `nothing` all behave the\n * same and render no nodes. In attribute expressions, `nothing` _removes_ the\n * attribute, while `undefined` and `null` will render an empty string. In\n * property expressions `nothing` becomes `undefined`.\n */\nexport const nothing = Symbol.for('lit-nothing');\n/**\n * The cache of prepared templates, keyed by the tagged TemplateStringsArray\n * and _not_ accounting for the specific template tag used. This means that\n * template tags cannot be dynamic - they must statically be one of html, svg,\n * or attr. This restriction simplifies the cache lookup, which is on the hot\n * path for rendering.\n */\nconst templateCache = new WeakMap();\nconst walker = d.createTreeWalker(d, 129 /* NodeFilter.SHOW_{ELEMENT|COMMENT} */);\nlet sanitizerFactoryInternal = noopSanitizer;\nfunction trustFromTemplateString(tsa, stringFromTSA) {\n // A security check to prevent spoofing of Lit template results.\n // In the future, we may be able to replace this with Array.isTemplateObject,\n // though we might need to make that check inside of the html and svg\n // functions, because precompiled templates don't come in as\n // TemplateStringArray objects.\n if (!isArray(tsa) || !tsa.hasOwnProperty('raw')) {\n let message = 'invalid template strings array';\n if (DEV_MODE) {\n message = `\n Internal Error: expected template strings to be an array\n with a 'raw' field. Faking a template strings array by\n calling html or svg like an ordinary function is effectively\n the same as calling unsafeHtml and can lead to major security\n issues, e.g. opening your code up to XSS attacks.\n If you're using the html or svg tagged template functions normally\n and still seeing this error, please file a bug at\n https://github.com/lit/lit/issues/new?template=bug_report.md\n and include information about your build tooling, if any.\n `\n .trim()\n .replace(/\\n */g, '\\n');\n }\n throw new Error(message);\n }\n return policy !== undefined\n ? policy.createHTML(stringFromTSA)\n : stringFromTSA;\n}\n/**\n * Returns an HTML string for the given TemplateStringsArray and result type\n * (HTML or SVG), along with the case-sensitive bound attribute names in\n * template order. The HTML contains comment markers denoting the `ChildPart`s\n * and suffixes on bound attributes denoting the `AttributeParts`.\n *\n * @param strings template strings array\n * @param type HTML or SVG\n * @return Array containing `[html, attrNames]` (array returned for terseness,\n * to avoid object fields since this code is shared with non-minified SSR\n * code)\n */\nconst getTemplateHtml = (strings, type) => {\n // Insert makers into the template HTML to represent the position of\n // bindings. The following code scans the template strings to determine the\n // syntactic position of the bindings. They can be in text position, where\n // we insert an HTML comment, attribute value position, where we insert a\n // sentinel string and re-write the attribute name, or inside a tag where\n // we insert the sentinel string.\n const l = strings.length - 1;\n // Stores the case-sensitive bound attribute names in the order of their\n // parts. ElementParts are also reflected in this array as undefined\n // rather than a string, to disambiguate from attribute bindings.\n const attrNames = [];\n let html = type === SVG_RESULT ? '<svg>' : type === MATHML_RESULT ? '<math>' : '';\n // When we're inside a raw text tag (not it's text content), the regex\n // will still be tagRegex so we can find attributes, but will switch to\n // this regex when the tag ends.\n let rawTextEndRegex;\n // The current parsing state, represented as a reference to one of the\n // regexes\n let regex = textEndRegex;\n for (let i = 0; i < l; i++) {\n const s = strings[i];\n // The index of the end of the last attribute name. When this is\n // positive at end of a string, it means we're in an attribute value\n // position and need to rewrite the attribute name.\n // We also use a special value of -2 to indicate that we encountered\n // the end of a string in attribute name position.\n let attrNameEndIndex = -1;\n let attrName;\n let lastIndex = 0;\n let match;\n // The conditions in this loop handle the current parse state, and the\n // assignments to the `regex` variable are the state transitions.\n while (lastIndex < s.length) {\n // Make sure we start searching from where we previously left off\n regex.lastIndex = lastIndex;\n match = regex.exec(s);\n if (match === null) {\n break;\n }\n lastIndex = regex.lastIndex;\n if (regex === textEndRegex) {\n if (match[COMMENT_START] === '!--') {\n regex = commentEndRegex;\n }\n else if (match[COMMENT_START] !== undefined) {\n // We started a weird comment, like </{\n regex = comment2EndRegex;\n }\n else if (match[TAG_NAME] !== undefined) {\n if (rawTextElement.test(match[TAG_NAME])) {\n // Record if we encounter a raw-text element. We'll switch to\n // this regex at the end of the tag.\n rawTextEndRegex = new RegExp(`</${match[TAG_NAME]}`, 'g');\n }\n regex = tagEndRegex;\n }\n else if (match[DYNAMIC_TAG_NAME] !== undefined) {\n if (DEV_MODE) {\n throw new Error('Bindings in tag names are not supported. Please use static templates instead. ' +\n 'See https://lit.dev/docs/templates/expressions/#static-expressions');\n }\n regex = tagEndRegex;\n }\n }\n else if (regex === tagEndRegex) {\n if (match[ENTIRE_MATCH] === '>') {\n // End of a tag. If we had started a raw-text element, use that\n // regex\n regex = rawTextEndRegex ?? textEndRegex;\n // We may be ending an unquoted attribute value, so make sure we\n // clear any pending attrNameEndIndex\n attrNameEndIndex = -1;\n }\n else if (match[ATTRIBUTE_NAME] === undefined) {\n // Attribute name position\n attrNameEndIndex = -2;\n }\n else {\n attrNameEndIndex = regex.lastIndex - match[SPACES_AND_EQUALS].length;\n attrName = match[ATTRIBUTE_NAME];\n regex =\n match[QUOTE_CHAR] === undefined\n ? tagEndRegex\n : match[QUOTE_CHAR] === '\"'\n ? doubleQuoteAttrEndRegex\n : singleQuoteAttrEndRegex;\n }\n }\n else if (regex === doubleQuoteAttrEndRegex ||\n regex === singleQuoteAttrEndRegex) {\n regex = tagEndRegex;\n }\n else if (regex === commentEndRegex || regex === comment2EndRegex) {\n regex = textEndRegex;\n }\n else {\n // Not one of the five state regexes, so it must be the dynamically\n // created raw text regex and we're at the close of that element.\n regex = tagEndRegex;\n rawTextEndRegex = undefined;\n }\n }\n if (DEV_MODE) {\n // If we have a attrNameEndIndex, which indicates that we should\n // rewrite the attribute name, assert that we're in a valid attribute\n // position - either in a tag, or a quoted attribute value.\n console.assert(attrNameEndIndex === -1 ||\n regex === tagEndRegex ||\n regex === singleQuoteAttrEndRegex ||\n regex === doubleQuoteAttrEndRegex, 'unexpected parse state B');\n }\n // We have four cases:\n // 1. We're in text position, and not in a raw text element\n // (regex === textEndRegex): insert a comment marker.\n // 2. We have a non-negative attrNameEndIndex which means we need to\n // rewrite the attribute name to add a bound attribute suffix.\n // 3. We're at the non-first binding in a multi-binding attribute, use a\n // plain marker.\n // 4. We're somewhere else inside the tag. If we're in attribute name\n // position (attrNameEndIndex === -2), add a sequential suffix to\n // generate a unique attribute name.\n // Detect a binding next to self-closing tag end and insert a space to\n // separate the marker from the tag end:\n const end = regex === tagEndRegex && strings[i + 1].startsWith('/>') ? ' ' : '';\n html +=\n regex === textEndRegex\n ? s + nodeMarker\n : attrNameEndIndex >= 0\n ? (attrNames.push(attrName),\n s.slice(0, attrNameEndIndex) +\n boundAttributeSuffix +\n s.slice(attrNameEndIndex)) +\n marker +\n end\n : s + marker + (attrNameEndIndex === -2 ? i : end);\n }\n const htmlResult = html +\n (strings[l] || '<?>') +\n (type === SVG_RESULT ? '</svg>' : type === MATHML_RESULT ? '</math>' : '');\n // Returned as an array for terseness\n return [trustFromTemplateString(strings, htmlResult), attrNames];\n};\nclass Template {\n constructor(\n // This property needs to remain unminified.\n { strings, ['_$litType$']: type }, options) {\n this.parts = [];\n let node;\n let nodeIndex = 0;\n let attrNameIndex = 0;\n const partCount = strings.length - 1;\n const parts = this.parts;\n // Create template element\n const [html, attrNames] = getTemplateHtml(strings, type);\n this.el = Template.createElement(html, options);\n walker.currentNode = this.el.content;\n // Re-parent SVG or MathML nodes into template root\n if (type === SVG_RESULT || type === MATHML_RESULT) {\n const wrapper = this.el.content.firstChild;\n wrapper.replaceWith(...wrapper.childNodes);\n }\n // Walk the template to find binding markers and create TemplateParts\n while ((node = walker.nextNode()) !== null && parts.length < partCount) {\n if (node.nodeType === 1) {\n if (DEV_MODE) {\n const tag = node.localName;\n // Warn if `textarea` includes an expression and throw if `template`\n // does since these are not supported. We do this by checking\n // innerHTML for anything that looks like a marker. This catches\n // cases like bindings in textarea there markers turn into text nodes.\n if (/^(?:textarea|template)$/i.test(tag) &&\n node.innerHTML.includes(marker)) {\n const m = `Expressions are not supported inside \\`${tag}\\` ` +\n `elements. See https://lit.dev/msg/expression-in-${tag} for more ` +\n `information.`;\n if (tag === 'template') {\n throw new Error(m);\n }\n else\n issueWarning('', m);\n }\n }\n // TODO (justinfagnani): for attempted dynamic tag names, we don't\n // increment the bindingIndex, and it'll be off by 1 in the element\n // and off by two after it.\n if (node.hasAttributes()) {\n for (const name of node.getAttributeNames()) {\n if (name.endsWith(boundAttributeSuffix)) {\n const realName = attrNames[attrNameIndex++];\n const value = node.getAttribute(name);\n const statics = value.split(marker);\n const m = /([.?@])?(.*)/.exec(realName);\n parts.push({\n type: ATTRIBUTE_PART,\n index: nodeIndex,\n name: m[2],\n strings: statics,\n ctor: m[1] === '.'\n ? PropertyPart\n : m[1] === '?'\n ? BooleanAttributePart\n : m[1] === '@'\n ? EventPart\n : AttributePart,\n });\n node.removeAttribute(name);\n }\n else if (name.startsWith(marker)) {\n parts.push({\n type: ELEMENT_PART,\n index: nodeIndex,\n });\n node.removeAttribute(name);\n }\n }\n }\n // TODO (justinfagnani): benchmark the regex against testing for each\n // of the 3 raw text element names.\n if (rawTextElement.test(node.tagName)) {\n // For raw text elements we need to split the text content on\n // markers, create a Text node for each segment, and create\n // a TemplatePart for each marker.\n const strings = node.textContent.split(marker);\n const lastIndex = strings.length - 1;\n if (lastIndex > 0) {\n node.textContent = trustedTypes\n ? trustedTypes.emptyScript\n : '';\n // Generate a new text node for each literal section\n // These nodes are also used as the markers for child parts\n for (let i = 0; i < lastIndex; i++) {\n node.append(strings[i], createMarker());\n // Walk past the marker node we just added\n walker.nextNode();\n parts.push({ type: CHILD_PART, index: ++nodeIndex });\n }\n // Note because this marker is added after the walker's current\n // node, it will be walked to in the outer loop (and ignored), so\n // we don't need to adjust nodeIndex here\n node.append(strings[lastIndex], createMarker());\n }\n }\n }\n else if (node.nodeType === 8) {\n const data = node.data;\n if (data === markerMatch) {\n parts.push({ type: CHILD_PART, index: nodeIndex });\n }\n else {\n let i = -1;\n while ((i = node.data.indexOf(marker, i + 1)) !== -1) {\n // Comment node has a binding marker inside, make an inactive part\n // The binding won't work, but subsequent bindings will\n parts.push({ type: COMMENT_PART, index: nodeIndex });\n // Move to the end of the match\n i += marker.length - 1;\n }\n }\n }\n nodeIndex++;\n }\n if (DEV_MODE) {\n // If there was a duplicate attribute on a tag, then when the tag is\n // parsed into an element the attribute gets de-duplicated. We can detect\n // this mismatch if we haven't precisely consumed every attribute name\n // when preparing the template. This works because `attrNames` is built\n // from the template string and `attrNameIndex` comes from processing the\n // resulting DOM.\n if (attrNames.length !== attrNameIndex) {\n throw new Error(`Detected duplicate attribute bindings. This occurs if your template ` +\n `has duplicate attributes on an element tag. For example ` +\n `\"<input ?disabled=\\${true} ?disabled=\\${false}>\" contains a ` +\n `duplicate \"disabled\" attribute. The error was detected in ` +\n `the following template: \\n` +\n '`' +\n strings.join('${...}') +\n '`');\n }\n }\n // We could set walker.currentNode to another node here to prevent a memory\n // leak, but every time we prepare a template, we immediately render it\n // and re-use the walker in new TemplateInstance._clone().\n debugLogEvent &&\n debugLogEvent({\n kind: 'template prep',\n template: this,\n clonableTemplate: this.el,\n parts: this.parts,\n strings,\n });\n }\n // Overridden via `litHtmlPolyfillSupport` to provide platform support.\n /** @nocollapse */\n static createElement(html, _options) {\n const el = d.createElement('template');\n el.innerHTML = html;\n return el;\n }\n}\nfunction resolveDirective(part, value, parent = part, attributeIndex) {\n // Bail early if the value is explicitly noChange. Note, this means any\n // nested directive is still attached and is not run.\n if (value === noChange) {\n return value;\n }\n let currentDirective = attributeIndex !== undefined\n ? parent.__directives?.[attributeIndex]\n : parent.__directive;\n const nextDirectiveConstructor = isPrimitive(value)\n ? undefined\n : // This property needs to remain unminified.\n value['_$litDirective$'];\n if (currentDirective?.constructor !== nextDirectiveConstructor) {\n // This property needs to remain unminified.\n currentDirective?.['_$notifyDirectiveConnectionChanged']?.(false);\n if (nextDirectiveConstructor === undefined) {\n currentDirective = undefined;\n }\n else {\n currentDirective = new nextDirectiveConstructor(part);\n currentDirective._$initialize(part, parent, attributeIndex);\n }\n if (attributeIndex !== undefined) {\n (parent.__directives ??= [])[attributeIndex] =\n currentDirective;\n }\n else {\n parent.__directive = currentDirective;\n }\n }\n if (currentDirective !== undefined) {\n value = resolveDirective(part, currentDirective._$resolve(part, value.values), currentDirective, attributeIndex);\n }\n return value;\n}\n/**\n * An updateable instance of a Template. Holds references to the Parts used to\n * update the template instance.\n */\nclass TemplateInstance {\n constructor(template, parent) {\n this._$parts = [];\n /** @internal */\n this._$disconnectableChildren = undefined;\n this._$template = template;\n this._$parent = parent;\n }\n // Called by ChildPart parentNode getter\n get parentNode() {\n return this._$parent.parentNode;\n }\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n // This method is separate from the constructor because we need to return a\n // DocumentFragment and we don't want to hold onto it with an instance field.\n _clone(options) {\n const { el: { content }, parts: parts, } = this._$template;\n const fragment = (options?.creationScope ?? d).importNode(content, true);\n walker.currentNode = fragment;\n let node = walker.nextNode();\n let nodeIndex = 0;\n let partIndex = 0;\n let templatePart = parts[0];\n while (templatePart !== undefined) {\n if (nodeIndex === templatePart.index) {\n let part;\n if (templatePart.type === CHILD_PART) {\n part = new ChildPart(node, node.nextSibling, this, options);\n }\n else if (templatePart.type === ATTRIBUTE_PART) {\n part = new templatePart.ctor(node, templatePart.name, templatePart.strings, this, options);\n }\n else if (templatePart.type === ELEMENT_PART) {\n part = new ElementPart(node, this, options);\n }\n this._$parts.push(part);\n templatePart = parts[++partIndex];\n }\n if (nodeIndex !== templatePart?.index) {\n node = walker.nextNode();\n nodeIndex++;\n }\n }\n // We need to set the currentNode away from the cloned tree so that we\n // don't hold onto the tree even if the tree is detached and should be\n // freed.\n walker.currentNode = d;\n return fragment;\n }\n _update(values) {\n let i = 0;\n for (const part of this._$parts) {\n if (part !== undefined) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'set part',\n part,\n value: values[i],\n valueIndex: i,\n values,\n templateInstance: this,\n });\n if (part.strings !== undefined) {\n part._$setValue(values, part, i);\n // The number of values the part consumes is part.strings.length - 1\n // since values are in between template spans. We increment i by 1\n // later in the loop, so increment it by part.strings.length - 2 here\n i += part.strings.length - 2;\n }\n else {\n part._$setValue(values[i]);\n }\n }\n i++;\n }\n }\n}\nclass ChildPart {\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n // ChildParts that are not at the root should always be created with a\n // parent; only RootChildNode's won't, so they return the local isConnected\n // state\n return this._$parent?._$isConnected ?? this.__isConnected;\n }\n constructor(startNode, endNode, parent, options) {\n this.type = CHILD_PART;\n this._$committedValue = nothing;\n // The following fields will be patched onto ChildParts when required by\n // AsyncDirective\n /** @internal */\n this._$disconnectableChildren = undefined;\n this._$startNode = startNode;\n this._$endNode = endNode;\n this._$parent = parent;\n this.options = options;\n // Note __isConnected is only ever accessed on RootParts (i.e. when there is\n // no _$parent); the value on a non-root-part is \"don't care\", but checking\n // for parent would be more code\n this.__isConnected = options?.isConnected ?? true;\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n // Explicitly initialize for consistent class shape.\n this._textSanitizer = undefined;\n }\n }\n /**\n * The parent node into which the part renders its content.\n *\n * A ChildPart's content consists of a range of adjacent child nodes of\n * `.parentNode`, possibly bordered by 'marker nodes' (`.startNode` and\n * `.endNode`).\n *\n * - If both `.startNode` and `.endNode` are non-null, then the part's content\n * consists of all siblings between `.startNode` and `.endNode`, exclusively.\n *\n * - If `.startNode` is non-null but `.endNode` is null, then the part's\n * content consists of all siblings following `.startNode`, up to and\n * including the last child of `.parentNode`. If `.endNode` is non-null, then\n * `.startNode` will always be non-null.\n *\n * - If both `.endNode` and `.startNode` are null, then the part's content\n * consists of all child nodes of `.parentNode`.\n */\n get parentNode() {\n let parentNode = wrap(this._$startNode).parentNode;\n const parent = this._$parent;\n if (parent !== undefined &&\n parentNode?.nodeType === 11 /* Node.DOCUMENT_FRAGMENT */) {\n // If the parentNode is a DocumentFragment, it may be because the DOM is\n // still in the cloned fragment during initial render; if so, get the real\n // parentNode the part will be committed into by asking the parent.\n parentNode = parent.parentNode;\n }\n return parentNode;\n }\n /**\n * The part's leading marker node, if any. See `.parentNode` for more\n * information.\n */\n get startNode() {\n return this._$startNode;\n }\n /**\n * The part's trailing marker node, if any. See `.parentNode` for more\n * information.\n */\n get endNode() {\n return this._$endNode;\n }\n _$setValue(value, directiveParent = this) {\n if (DEV_MODE && this.parentNode === null) {\n throw new Error(`This \\`ChildPart\\` has no \\`parentNode\\` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit's control such that the part's marker nodes were ejected from DOM. For example, setting the element's \\`innerHTML\\` or \\`textContent\\` can do this.`);\n }\n value = resolveDirective(this, value, directiveParent);\n if (isPrimitive(value)) {\n // Non-rendering child values. It's important that these do not render\n // empty text nodes to avoid issues with preventing default <slot>\n // fallback content.\n if (value === nothing || value == null || value === '') {\n if (this._$committedValue !== nothing) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit nothing to child',\n start: this._$startNode,\n end: this._$endNode,\n parent: this._$parent,\n options: this.options,\n });\n this._$clear();\n }\n this._$committedValue = nothing;\n }\n else if (value !== this._$committedValue && value !== noChange) {\n this._commitText(value);\n }\n // This property needs to remain unminified.\n }\n else if (value['_$litType$'] !== undefined) {\n this._commitTemplateResult(value);\n }\n else if (value.nodeType !== undefined) {\n if (DEV_MODE && this.options?.host === value) {\n this._commitText(`[probable mistake: rendered a template's host in itself ` +\n `(commonly caused by writing \\${this} in a template]`);\n console.warn(`Attempted to render the template host`, value, `inside itself. This is almost always a mistake, and in dev mode `, `we render some warning text. In production however, we'll `, `render it, which will usually result in an error, and sometimes `, `in the element disappearing from the DOM.`);\n return;\n }\n this._commitNode(value);\n }\n else if (isIterable(value)) {\n this._commitIterable(value);\n }\n else {\n // Fallback, will render the string representation\n this._commitText(value);\n }\n }\n _insert(node) {\n return wrap(wrap(this._$startNode).parentNode).insertBefore(node, this._$endNode);\n }\n _commitNode(value) {\n if (this._$committedValue !== value) {\n this._$clear();\n if (ENABLE_EXTRA_SECURITY_HOOKS &&\n sanitizerFactoryInternal !== noopSanitizer) {\n const parentNodeName = this._$startNode.parentNode?.nodeName;\n if (parentNodeName === 'STYLE' || parentNodeName === 'SCRIPT') {\n let message = 'Forbidden';\n if (DEV_MODE) {\n if (parentNodeName === 'STYLE') {\n message =\n `Lit does not support binding inside style nodes. ` +\n `This is a security risk, as style injection attacks can ` +\n `exfiltrate data and spoof UIs. ` +\n `Consider instead using css\\`...\\` literals ` +\n `to compose styles, and do dynamic styling with ` +\n `css custom properties, ::parts, <slot>s, ` +\n `and by mutating the DOM rather than stylesheets.`;\n }\n else {\n message =\n `Lit does not support binding inside script nodes. ` +\n `This is a security risk, as it could allow arbitrary ` +\n `code execution.`;\n }\n }\n throw new Error(message);\n }\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit node',\n start: this._$startNode,\n parent: this._$parent,\n value: value,\n options: this.options,\n });\n this._$committedValue = this._insert(value);\n }\n }\n _commitText(value) {\n // If the committed value is a primitive it means we called _commitText on\n // the previous render, and we know that this._$startNode.nextSibling is a\n // Text node. We can now just replace the text content (.data) of the node.\n if (this._$committedValue !== nothing &&\n isPrimitive(this._$committedValue)) {\n const node = wrap(this._$startNode).nextSibling;\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n if (this._textSanitizer === undefined) {\n this._textSanitizer = createSanitizer(node, 'data', 'property');\n }\n value = this._textSanitizer(value);\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit text',\n node,\n value,\n options: this.options,\n });\n node.data = value;\n }\n else {\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n const textNode = d.createTextNode('');\n this._commitNode(textNode);\n // When setting text content, for security purposes it matters a lot\n // what the parent is. For example, <style> and <script> need to be\n // handled with care, while <span> does not. So first we need to put a\n // text node into the document, then we can sanitize its content.\n if (this._textSanitizer === undefined) {\n this._textSanitizer = createSanitizer(textNode, 'data', 'property');\n }\n value = this._textSanitizer(value);\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit text',\n node: textNode,\n value,\n options: this.options,\n });\n textNode.data = value;\n }\n else {\n this._commitNode(d.createTextNode(value));\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit text',\n node: wrap(this._$startNode).nextSibling,\n value,\n options: this.options,\n });\n }\n }\n this._$committedValue = value;\n }\n _commitTemplateResult(result) {\n // This property needs to remain unminified.\n const { values, ['_$litType$']: type } = result;\n // If $litType$ is a number, result is a plain TemplateResult and we get\n // the template from the template cache. If not, result is a\n // CompiledTemplateResult and _$litType$ is a CompiledTemplate and we need\n // to create the <template> element the first time we see it.\n const template = typeof type === 'number'\n ? this._$getTemplate(result)\n : (type.el === undefined &&\n (type.el = Template.createElement(trustFromTemplateString(type.h, type.h[0]), this.options)),\n type);\n if (this._$committedValue?._$template === template) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'template updating',\n template,\n instance: this._$committedValue,\n parts: this._$committedValue._$parts,\n options: this.options,\n values,\n });\n this._$committedValue._update(values);\n }\n else {\n const instance = new TemplateInstance(template, this);\n const fragment = instance._clone(this.options);\n debugLogEvent &&\n debugLogEvent({\n kind: 'template instantiated',\n template,\n instance,\n parts: instance._$parts,\n options: this.options,\n fragment,\n values,\n });\n instance._update(values);\n debugLogEvent &&\n debugLogEvent({\n kind: 'template instantiated and updated',\n template,\n instance,\n parts: instance._$parts,\n options: this.options,\n fragment,\n values,\n });\n this._commitNode(fragment);\n this._$committedValue = instance;\n }\n }\n // Overridden via `litHtmlPolyfillSupport` to provide platform support.\n /** @internal */\n _$getTemplate(result) {\n let template = templateCache.get(result.strings);\n if (template === undefined) {\n templateCache.set(result.strings, (template = new Template(result)));\n }\n return template;\n }\n _commitIterable(value) {\n // For an Iterable, we create a new InstancePart per item, then set its\n // value to the item. This is a little bit of overhead for every item in\n // an Iterable, but it lets us recurse easily and efficiently update Arrays\n // of TemplateResults that will be commonly returned from expressions like:\n // array.map((i) => html`${i}`), by reusing existing TemplateInstances.\n // If value is an array, then the previous render was of an\n // iterable and value will contain the ChildParts from the previous\n // render. If value is not an array, clear this part and make a new\n // array for ChildParts.\n if (!isArray(this._$committedValue)) {\n this._$committedValue = [];\n this._$clear();\n }\n // Lets us keep track of how many items we stamped so we can clear leftover\n // items from a previous render\n const itemParts = this._$committedValue;\n let partIndex = 0;\n let itemPart;\n for (const item of value) {\n if (partIndex === itemParts.length) {\n // If no existing part, create a new one\n // TODO (justinfagnani): test perf impact of always creating two parts\n // instead of sharing parts between nodes\n // https://github.com/lit/lit/issues/1266\n itemParts.push((itemPart = new ChildPart(this._insert(createMarker()), this._insert(createMarker()), this, this.options)));\n }\n else {\n // Reuse an existing part\n itemPart = itemParts[partIndex];\n }\n itemPart._$setValue(item);\n partIndex++;\n }\n if (partIndex < itemParts.length) {\n // itemParts always have end nodes\n this._$clear(itemPart && wrap(itemPart._$endNode).nextSibling, partIndex);\n // Truncate the parts array so _value reflects the current state\n itemParts.length = partIndex;\n }\n }\n /**\n * Removes the nodes contained within this Part from the DOM.\n *\n * @param start Start node to clear from, for clearing a subset of the part's\n * DOM (used when truncating iterables)\n * @param from When `start` is specified, the index within the iterable from\n * which ChildParts are being removed, used for disconnecting directives\n * in those Parts.\n *\n * @internal\n */\n _$clear(start = wrap(this._$startNode).nextSibling, from) {\n this._$notifyConnectionChanged?.(false, true, from);\n while (start !== this._$endNode) {\n // The non-null assertion is safe because if _$startNode.nextSibling is\n // null, then _$endNode is also null, and we would not have entered this\n // loop.\n const n = wrap(start).nextSibling;\n wrap(start).remove();\n start = n;\n }\n }\n /**\n * Implementation of RootPart's `isConnected`. Note that this method\n * should only be called on `RootPart`s (the `ChildPart` returned from a\n * top-level `render()` call). It has no effect on non-root ChildParts.\n * @param isConnected Whether to set\n * @internal\n */\n setConnected(isConnected) {\n if (this._$parent === undefined) {\n this.__isConnected = isConnected;\n this._$notifyConnectionChanged?.(isConnected);\n }\n else if (DEV_MODE) {\n throw new Error('part.setConnected() may only be called on a ' +\n 'RootPart returned from render().');\n }\n }\n}\nclass AttributePart {\n get tagName() {\n return this.element.tagName;\n }\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n constructor(element, name, strings, parent, options) {\n this.type = ATTRIBUTE_PART;\n /** @internal */\n this._$committedValue = nothing;\n /** @internal */\n this._$disconnectableChildren = undefined;\n this.element = element;\n this.name = name;\n this._$parent = parent;\n this.options = options;\n if (strings.length > 2 || strings[0] !== '' || strings[1] !== '') {\n this._$committedValue = new Array(strings.length - 1).fill(new String());\n this.strings = strings;\n }\n else {\n this._$committedValue = nothing;\n }\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n this._sanitizer = undefined;\n }\n }\n /**\n * Sets the value of this part by resolving the value from possibly multiple\n * values and static strings and committing it to the DOM.\n * If this part is single-valued, `this._strings` will be undefined, and the\n * method will be called with a single value argument. If this part is\n * multi-value, `this._strings` will be defined, and the method is called\n * with the value array of the part's owning TemplateInstance, and an offset\n * into the value array from which the values should be read.\n * This method is overloaded this way to eliminate short-lived array slices\n * of the template instance values, and allow a fast-path for single-valued\n * parts.\n *\n * @param value The part value, or an array of values for multi-valued parts\n * @param valueIndex the index to start reading values from. `undefined` for\n * single-valued parts\n * @param noCommit causes the part to not commit its value to the DOM. Used\n * in hydration to prime attribute parts with their first-rendered value,\n * but not set the attribute, and in SSR to no-op the DOM operation and\n * capture the value for serialization.\n *\n * @internal\n */\n _$setValue(value, directiveParent = this, valueIndex, noCommit) {\n const strings = this.strings;\n // Whether any of the values has changed, for dirty-checking\n let change = false;\n if (strings === undefined) {\n // Single-value binding case\n value = resolveDirective(this, value, directiveParent, 0);\n change =\n !isPrimitive(value) ||\n (value !== this._$committedValue && value !== noChange);\n if (change) {\n this._$committedValue = value;\n }\n }\n else {\n // Interpolation case\n const values = value;\n value = strings[0];\n let i, v;\n for (i = 0; i < strings.length - 1; i++) {\n v = resolveDirective(this, values[valueIndex + i], directiveParent, i);\n if (v === noChange) {\n // If the user-provided value is `noChange`, use the previous value\n v = this._$committedValue[i];\n }\n change ||=\n !isPrimitive(v) || v !== this._$committedValue[i];\n if (v === nothing) {\n value = nothing;\n }\n else if (value !== nothing) {\n value += (v ?? '') + strings[i + 1];\n }\n // We always record each value, even if one is `nothing`, for future\n // change detection.\n this._$committedValue[i] = v;\n }\n }\n if (change && !noCommit) {\n this._commitValue(value);\n }\n }\n /** @internal */\n _commitValue(value) {\n if (value === nothing) {\n wrap(this.element).removeAttribute(this.name);\n }\n else {\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n if (this._sanitizer === undefined) {\n this._sanitizer = sanitizerFactoryInternal(this.element, this.name, 'attribute');\n }\n value = this._sanitizer(value ?? '');\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit attribute',\n element: this.element,\n name: this.name,\n value,\n options: this.options,\n });\n wrap(this.element).setAttribute(this.name, (value ?? ''));\n }\n }\n}\nclass PropertyPart extends AttributePart {\n constructor() {\n super(...arguments);\n this.type = PROPERTY_PART;\n }\n /** @internal */\n _commitValue(value) {\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n if (this._sanitizer === undefined) {\n this._sanitizer = sanitizerFactoryInternal(this.element, this.name, 'property');\n }\n value = this._sanitizer(value);\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit property',\n element: this.element,\n name: this.name,\n value,\n options: this.options,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.element[this.name] = value === nothing ? undefined : value;\n }\n}\nclass BooleanAttributePart extends AttributePart {\n constructor() {\n super(...arguments);\n this.type = BOOLEAN_ATTRIBUTE_PART;\n }\n /** @internal */\n _commitValue(value) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit boolean attribute',\n element: this.element,\n name: this.name,\n value: !!(value && value !== nothing),\n options: this.options,\n });\n wrap(this.element).toggleAttribute(this.name, !!value && value !== nothing);\n }\n}\nclass EventPart extends AttributePart {\n constructor(element, name, strings, parent, options) {\n super(element, name, strings, parent, options);\n this.type = EVENT_PART;\n if (DEV_MODE && this.strings !== undefined) {\n throw new Error(`A \\`<${element.localName}>\\` has a \\`@${name}=...\\` listener with ` +\n 'invalid content. Event listeners in templates must have exactly ' +\n 'one expression and no surrounding text.');\n }\n }\n // EventPart does not use the base _$setValue/_resolveValue implementation\n // since the dirty checking is more complex\n /** @internal */\n _$setValue(newListener, directiveParent = this) {\n newListener =\n resolveDirective(this, newListener, directiveParent, 0) ?? nothing;\n if (newListener === noChange) {\n return;\n }\n const oldListener = this._$committedValue;\n // If the new value is nothing or any options change we have to remove the\n // part as a listener.\n const shouldRemoveListener = (newListener === nothing && oldListener !== nothing) ||\n newListener.capture !==\n oldListener.capture ||\n newListener.once !==\n oldListener.once ||\n newListener.passive !==\n oldListener.passive;\n // If the new value is not nothing and we removed the listener, we have\n // to add the part as a listener.\n const shouldAddListener = newListener !== nothing &&\n (oldListener === nothing || shouldRemoveListener);\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit event listener',\n element: this.element,\n name: this.name,\n value: newListener,\n options: this.options,\n removeListener: shouldRemoveListener,\n addListener: shouldAddListener,\n oldListener,\n });\n if (shouldRemoveListener) {\n this.element.removeEventListener(this.name, this, oldListener);\n }\n if (shouldAddListener) {\n this.element.addEventListener(this.name, this, newListener);\n }\n this._$committedValue = newListener;\n }\n handleEvent(event) {\n if (typeof this._$committedValue === 'function') {\n this._$committedValue.call(this.options?.host ?? this.element, event);\n }\n else {\n this._$committedValue.handleEvent(event);\n }\n }\n}\nclass ElementPart {\n constructor(element, parent, options) {\n this.element = element;\n this.type = ELEMENT_PART;\n /** @internal */\n this._$disconnectableChildren = undefined;\n this._$parent = parent;\n this.options = options;\n }\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n _$setValue(value) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit to element binding',\n element: this.element,\n value,\n options: this.options,\n });\n resolveDirective(this, value);\n }\n}\n/**\n * END USERS SHOULD NOT RELY ON THIS OBJECT.\n *\n * Private exports for use by other Lit packages, not intended for use by\n * external users.\n *\n * We currently do not make a mangled rollup build of the lit-ssr code. In order\n * to keep a number of (otherwise private) top-level exports mangled in the\n * client side code, we export a _$LH object containing those members (or\n * helper methods for accessing private fields of those members), and then\n * re-export them for use in lit-ssr. This keeps lit-ssr agnostic to whether the\n * client-side code is being used in `dev` mode or `prod` mode.\n *\n * This has a unique name, to disambiguate it from private exports in\n * lit-element, which re-exports all of lit-html.\n *\n * @private\n */\nexport const _$LH = {\n // Used in lit-ssr\n _boundAttributeSuffix: boundAttributeSuffix,\n _marker: marker,\n _markerMatch: markerMatch,\n _HTML_RESULT: HTML_RESULT,\n _getTemplateHtml: getTemplateHtml,\n // Used in tests and private-ssr-support\n _TemplateInstance: TemplateInstance,\n _isIterable: isIterable,\n _resolveDirective: resolveDirective,\n _ChildPart: ChildPart,\n _AttributePart: AttributePart,\n _BooleanAttributePart: BooleanAttributePart,\n _EventPart: EventPart,\n _PropertyPart: PropertyPart,\n _ElementPart: ElementPart,\n};\n// Apply polyfills if available\nconst polyfillSupport = DEV_MODE\n ? global.litHtmlPolyfillSupportDevMode\n : global.litHtmlPolyfillSupport;\npolyfillSupport?.(Template, ChildPart);\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for lit-html usage.\n(global.litHtmlVersions ??= []).push('3.3.2');\nif (DEV_MODE && global.litHtmlVersions.length > 1) {\n queueMicrotask(() => {\n issueWarning('multiple-versions', `Multiple versions of Lit loaded. ` +\n `Loading multiple versions is not recommended.`);\n });\n}\n/**\n * Renders a value, usually a lit-html TemplateResult, to the container.\n *\n * This example renders the text \"Hello, Zoe!\" inside a paragraph tag, appending\n * it to the container `document.body`.\n *\n * ```js\n * import {html, render} from 'lit';\n *\n * const name = \"Zoe\";\n * render(html`<p>Hello, ${name}!</p>`, document.body);\n * ```\n *\n * @param value Any [renderable\n * value](https://lit.dev/docs/templates/expressions/#child-expressions),\n * typically a {@linkcode TemplateResult} created by evaluating a template tag\n * like {@linkcode html} or {@linkcode svg}.\n * @param container A DOM container to render to. The first render will append\n * the rendered value to the container, and subsequent renders will\n * efficiently update the rendered value if the same result type was\n * previously rendered there.\n * @param options See {@linkcode RenderOptions} for options documentation.\n * @see\n * {@link https://lit.dev/docs/libraries/standalone-templates/#rendering-lit-html-templates| Rendering Lit HTML Templates}\n */\nexport const render = (value, container, options) => {\n if (DEV_MODE && container == null) {\n // Give a clearer error message than\n // Uncaught TypeError: Cannot read properties of null (reading\n // '_$litPart$')\n // which reads like an internal Lit error.\n throw new TypeError(`The container to render into may not be ${container}`);\n }\n const renderId = DEV_MODE ? debugLogRenderId++ : 0;\n const partOwnerNode = options?.renderBefore ?? container;\n // This property needs to remain unminified.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let part = partOwnerNode['_$litPart$'];\n debugLogEvent &&\n debugLogEvent({\n kind: 'begin render',\n id: renderId,\n value,\n container,\n options,\n part,\n });\n if (part === undefined) {\n const endNode = options?.renderBefore ?? null;\n // This property needs to remain unminified.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n partOwnerNode['_$litPart$'] = part = new ChildPart(container.insertBefore(createMarker(), endNode), endNode, undefined, options ?? {});\n }\n part._$setValue(value);\n debugLogEvent &&\n debugLogEvent({\n kind: 'end render',\n id: renderId,\n value,\n container,\n options,\n part,\n });\n return part;\n};\nif (ENABLE_EXTRA_SECURITY_HOOKS) {\n render.setSanitizer = setSanitizer;\n render.createSanitizer = createSanitizer;\n if (DEV_MODE) {\n render._testOnlyClearSanitizerFactoryDoNotCallOrElse =\n _testOnlyClearSanitizerFactoryDoNotCallOrElse;\n }\n}\n//# sourceMappingURL=lit-html.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * The main LitElement module, which defines the {@linkcode LitElement} base\n * class and related APIs.\n *\n * LitElement components can define a template and a set of observed\n * properties. Changing an observed property triggers a re-render of the\n * element.\n *\n * Import {@linkcode LitElement} and {@linkcode html} from this module to\n * create a component:\n *\n * ```js\n * import {LitElement, html} from 'lit-element';\n *\n * class MyElement extends LitElement {\n *\n * // Declare observed properties\n * static get properties() {\n * return {\n * adjective: {}\n * }\n * }\n *\n * constructor() {\n * this.adjective = 'awesome';\n * }\n *\n * // Define the element's template\n * render() {\n * return html`<p>your ${adjective} template here</p>`;\n * }\n * }\n *\n * customElements.define('my-element', MyElement);\n * ```\n *\n * `LitElement` extends {@linkcode ReactiveElement} and adds lit-html\n * templating. The `ReactiveElement` class is provided for users that want to\n * build their own custom element base classes that don't use lit-html.\n *\n * @packageDocumentation\n */\nimport { ReactiveElement } from '@lit/reactive-element';\nimport { render, noChange } from 'lit-html';\nexport * from '@lit/reactive-element';\nexport * from 'lit-html';\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty = (prop, _obj) => prop;\nconst DEV_MODE = true;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n global.litIssuedWarnings ??= new Set();\n /**\n * Issue a warning if we haven't already, based either on `code` or `warning`.\n * Warnings are disabled automatically only by `warning`; disabling via `code`\n * can be done by users.\n */\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!global.litIssuedWarnings.has(warning) &&\n !global.litIssuedWarnings.has(code)) {\n console.warn(warning);\n global.litIssuedWarnings.add(warning);\n }\n };\n}\n/**\n * Base element class that manages element properties and attributes, and\n * renders a lit-html template.\n *\n * To define a component, subclass `LitElement` and implement a\n * `render` method to provide the component's template. Define properties\n * using the {@linkcode LitElement.properties properties} property or the\n * {@linkcode property} decorator.\n */\nexport class LitElement extends ReactiveElement {\n constructor() {\n super(...arguments);\n /**\n * @category rendering\n */\n this.renderOptions = { host: this };\n this.__childPart = undefined;\n }\n /**\n * @category rendering\n */\n createRenderRoot() {\n const renderRoot = super.createRenderRoot();\n // When adoptedStyleSheets are shimmed, they are inserted into the\n // shadowRoot by createRenderRoot. Adjust the renderBefore node so that\n // any styles in Lit content render before adoptedStyleSheets. This is\n // important so that adoptedStyleSheets have precedence over styles in\n // the shadowRoot.\n this.renderOptions.renderBefore ??= renderRoot.firstChild;\n return renderRoot;\n }\n /**\n * Updates the element. This method reflects property values to attributes\n * and calls `render` to render DOM via lit-html. Setting properties inside\n * this method will *not* trigger another update.\n * @param changedProperties Map of changed properties with old values\n * @category updates\n */\n update(changedProperties) {\n // Setting properties in `render` should not trigger an update. Since\n // updates are allowed after super.update, it's important to call `render`\n // before that.\n const value = this.render();\n if (!this.hasUpdated) {\n this.renderOptions.isConnected = this.isConnected;\n }\n super.update(changedProperties);\n this.__childPart = render(value, this.renderRoot, this.renderOptions);\n }\n /**\n * Invoked when the component is added to the document's DOM.\n *\n * In `connectedCallback()` you should setup tasks that should only occur when\n * the element is connected to the document. The most common of these is\n * adding event listeners to nodes external to the element, like a keydown\n * event handler added to the window.\n *\n * ```ts\n * connectedCallback() {\n * super.connectedCallback();\n * addEventListener('keydown', this._handleKeydown);\n * }\n * ```\n *\n * Typically, anything done in `connectedCallback()` should be undone when the\n * element is disconnected, in `disconnectedCallback()`.\n *\n * @category lifecycle\n */\n connectedCallback() {\n super.connectedCallback();\n this.__childPart?.setConnected(true);\n }\n /**\n * Invoked when the component is removed from the document's DOM.\n *\n * This callback is the main signal to the element that it may no longer be\n * used. `disconnectedCallback()` should ensure that nothing is holding a\n * reference to the element (such as event listeners added to nodes external\n * to the element), so that it is free to be garbage collected.\n *\n * ```ts\n * disconnectedCallback() {\n * super.disconnectedCallback();\n * window.removeEventListener('keydown', this._handleKeydown);\n * }\n * ```\n *\n * An element may be re-connected after being disconnected.\n *\n * @category lifecycle\n */\n disconnectedCallback() {\n super.disconnectedCallback();\n this.__childPart?.setConnected(false);\n }\n /**\n * Invoked on each update to perform rendering tasks. This method may return\n * any value renderable by lit-html's `ChildPart` - typically a\n * `TemplateResult`. Setting properties inside this method will *not* trigger\n * the element to update.\n * @category rendering\n */\n render() {\n return noChange;\n }\n}\n// This property needs to remain unminified.\nLitElement['_$litElement$'] = true;\n/**\n * Ensure this class is marked as `finalized` as an optimization ensuring\n * it will not needlessly try to `finalize`.\n *\n * Note this property name is a string to prevent breaking Closure JS Compiler\n * optimizations. See @lit/reactive-element for more information.\n */\nLitElement[JSCompiler_renameProperty('finalized', LitElement)] = true;\n// Install hydration if available\nglobal.litElementHydrateSupport?.({ LitElement });\n// Apply polyfills if available\nconst polyfillSupport = DEV_MODE\n ? global.litElementPolyfillSupportDevMode\n : global.litElementPolyfillSupport;\npolyfillSupport?.({ LitElement });\n/**\n * END USERS SHOULD NOT RELY ON THIS OBJECT.\n *\n * Private exports for use by other Lit packages, not intended for use by\n * external users.\n *\n * We currently do not make a mangled rollup build of the lit-ssr code. In order\n * to keep a number of (otherwise private) top-level exports mangled in the\n * client side code, we export a _$LE object containing those members (or\n * helper methods for accessing private fields of those members), and then\n * re-export them for use in lit-ssr. This keeps lit-ssr agnostic to whether the\n * client-side code is being used in `dev` mode or `prod` mode.\n *\n * This has a unique name, to disambiguate it from private exports in\n * lit-html, since this module re-exports all of lit-html.\n *\n * @private\n */\nexport const _$LE = {\n _$attributeToProperty: (el, name, value) => {\n // eslint-disable-next-line\n el._$attributeToProperty(name, value);\n },\n // eslint-disable-next-line\n _$changedProperties: (el) => el._$changedProperties,\n};\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for LitElement usage.\n(global.litElementVersions ??= []).push('4.2.2');\nif (DEV_MODE && global.litElementVersions.length > 1) {\n queueMicrotask(() => {\n issueWarning('multiple-versions', `Multiple versions of Lit loaded. Loading multiple versions ` +\n `is not recommended.`);\n });\n}\n//# sourceMappingURL=lit-element.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * Class decorator factory that defines the decorated class as a custom element.\n *\n * ```js\n * @customElement('my-element')\n * class MyElement extends LitElement {\n * render() {\n * return html``;\n * }\n * }\n * ```\n * @category Decorator\n * @param tagName The tag name of the custom element to define.\n */\nexport const customElement = (tagName) => (classOrTarget, context) => {\n if (context !== undefined) {\n context.addInitializer(() => {\n customElements.define(tagName, classOrTarget);\n });\n }\n else {\n customElements.define(tagName, classOrTarget);\n }\n};\n//# sourceMappingURL=custom-element.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\nimport { defaultConverter, notEqual, } from '../reactive-element.js';\nconst DEV_MODE = true;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n globalThis.litIssuedWarnings ??= new Set();\n /**\n * Issue a warning if we haven't already, based either on `code` or `warning`.\n * Warnings are disabled automatically only by `warning`; disabling via `code`\n * can be done by users.\n */\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!globalThis.litIssuedWarnings.has(warning) &&\n !globalThis.litIssuedWarnings.has(code)) {\n console.warn(warning);\n globalThis.litIssuedWarnings.add(warning);\n }\n };\n}\nconst legacyProperty = (options, proto, name) => {\n const hasOwnProperty = proto.hasOwnProperty(name);\n proto.constructor.createProperty(name, options);\n // For accessors (which have a descriptor on the prototype) we need to\n // return a descriptor, otherwise TypeScript overwrites the descriptor we\n // define in createProperty() with the original descriptor. We don't do this\n // for fields, which don't have a descriptor, because this could overwrite\n // descriptor defined by other decorators.\n return hasOwnProperty\n ? Object.getOwnPropertyDescriptor(proto, name)\n : undefined;\n};\n// This is duplicated from a similar variable in reactive-element.ts, but\n// actually makes sense to have this default defined with the decorator, so\n// that different decorators could have different defaults.\nconst defaultPropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n/**\n * Wraps a class accessor or setter so that `requestUpdate()` is called with the\n * property name and old value when the accessor is set.\n */\nexport const standardProperty = (options = defaultPropertyDeclaration, target, context) => {\n const { kind, metadata } = context;\n if (DEV_MODE && metadata == null) {\n issueWarning('missing-class-metadata', `The class ${target} is missing decorator metadata. This ` +\n `could mean that you're using a compiler that supports decorators ` +\n `but doesn't support decorator metadata, such as TypeScript 5.1. ` +\n `Please update your compiler.`);\n }\n // Store the property options\n let properties = globalThis.litPropertyMetadata.get(metadata);\n if (properties === undefined) {\n globalThis.litPropertyMetadata.set(metadata, (properties = new Map()));\n }\n if (kind === 'setter') {\n options = Object.create(options);\n options.wrapped = true;\n }\n properties.set(context.name, options);\n if (kind === 'accessor') {\n // Standard decorators cannot dynamically modify the class, so we can't\n // replace a field with accessors. The user must use the new `accessor`\n // keyword instead.\n const { name } = context;\n return {\n set(v) {\n const oldValue = target.get.call(this);\n target.set.call(this, v);\n this.requestUpdate(name, oldValue, options, true, v);\n },\n init(v) {\n if (v !== undefined) {\n this._$changeProperty(name, undefined, options, v);\n }\n return v;\n },\n };\n }\n else if (kind === 'setter') {\n const { name } = context;\n return function (value) {\n const oldValue = this[name];\n target.call(this, value);\n this.requestUpdate(name, oldValue, options, true, value);\n };\n }\n throw new Error(`Unsupported decorator location: ${kind}`);\n};\n/**\n * A class field or accessor decorator which creates a reactive property that\n * reflects a corresponding attribute value. When a decorated property is set\n * the element will update and render. A {@linkcode PropertyDeclaration} may\n * optionally be supplied to configure property features.\n *\n * This decorator should only be used for public fields. As public fields,\n * properties should be considered as primarily settable by element users,\n * either via attribute or the property itself.\n *\n * Generally, properties that are changed by the element should be private or\n * protected fields and should use the {@linkcode state} decorator.\n *\n * However, sometimes element code does need to set a public property. This\n * should typically only be done in response to user interaction, and an event\n * should be fired informing the user; for example, a checkbox sets its\n * `checked` property when clicked and fires a `changed` event. Mutating public\n * properties should typically not be done for non-primitive (object or array)\n * properties. In other cases when an element needs to manage state, a private\n * property decorated via the {@linkcode state} decorator should be used. When\n * needed, state properties can be initialized via public properties to\n * facilitate complex interactions.\n *\n * ```ts\n * class MyElement {\n * @property({ type: Boolean })\n * clicked = false;\n * }\n * ```\n * @category Decorator\n * @ExportDecoratedItems\n */\nexport function property(options) {\n return (protoOrTarget, nameOrContext\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) => {\n return (typeof nameOrContext === 'object'\n ? standardProperty(options, protoOrTarget, nameOrContext)\n : legacyProperty(options, protoOrTarget, nameOrContext));\n };\n}\n//# sourceMappingURL=property.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\nimport { property } from './property.js';\n/**\n * Declares a private or protected reactive property that still triggers\n * updates to the element when it changes. It does not reflect from the\n * corresponding attribute.\n *\n * Properties declared this way must not be used from HTML or HTML templating\n * systems, they're solely for properties internal to the element. These\n * properties may be renamed by optimization tools like closure compiler.\n * @category Decorator\n */\nexport function state(options) {\n return property({\n ...options,\n // Add both `state` and `attribute` because we found a third party\n // controller that is keying off of PropertyOptions.state to determine\n // whether a field is a private internal property or not.\n state: true,\n attribute: false,\n });\n}\n//# sourceMappingURL=state.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { desc } from './base.js';\nconst DEV_MODE = true;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n globalThis.litIssuedWarnings ??= new Set();\n /**\n * Issue a warning if we haven't already, based either on `code` or `warning`.\n * Warnings are disabled automatically only by `warning`; disabling via `code`\n * can be done by users.\n */\n issueWarning = (code, warning) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (!globalThis.litIssuedWarnings.has(warning) &&\n !globalThis.litIssuedWarnings.has(code)) {\n console.warn(warning);\n globalThis.litIssuedWarnings.add(warning);\n }\n };\n}\n/**\n * A property decorator that converts a class property into a getter that\n * executes a querySelector on the element's renderRoot.\n *\n * @param selector A DOMString containing one or more selectors to match.\n * @param cache An optional boolean which when true performs the DOM query only\n * once and caches the result.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\n *\n * ```ts\n * class MyElement {\n * @query('#first')\n * first: HTMLDivElement;\n *\n * render() {\n * return html`\n * <div id=\"first\"></div>\n * <div id=\"second\"></div>\n * `;\n * }\n * }\n * ```\n * @category Decorator\n */\nexport function query(selector, cache) {\n return ((protoOrTarget, nameOrContext, descriptor) => {\n const doQuery = (el) => {\n const result = (el.renderRoot?.querySelector(selector) ?? null);\n if (DEV_MODE && result === null && cache && !el.hasUpdated) {\n const name = typeof nameOrContext === 'object'\n ? nameOrContext.name\n : nameOrContext;\n issueWarning('', `@query'd field ${JSON.stringify(String(name))} with the 'cache' ` +\n `flag set for selector '${selector}' has been accessed before ` +\n `the first update and returned null. This is expected if the ` +\n `renderRoot tree has not been provided beforehand (e.g. via ` +\n `Declarative Shadow DOM). Therefore the value hasn't been cached.`);\n }\n // TODO: if we want to allow users to assert that the query will never\n // return null, we need a new option and to throw here if the result\n // is null.\n return result;\n };\n if (cache) {\n // Accessors to wrap from either:\n // 1. The decorator target, in the case of standard decorators\n // 2. The property descriptor, in the case of experimental decorators\n // on auto-accessors.\n // 3. Functions that access our own cache-key property on the instance,\n // in the case of experimental decorators on fields.\n const { get, set } = typeof nameOrContext === 'object'\n ? protoOrTarget\n : (descriptor ??\n (() => {\n const key = DEV_MODE\n ? Symbol(`${String(nameOrContext)} (@query() cache)`)\n : Symbol();\n return {\n get() {\n return this[key];\n },\n set(v) {\n this[key] = v;\n },\n };\n })());\n return desc(protoOrTarget, nameOrContext, {\n get() {\n let result = get.call(this);\n if (result === undefined) {\n result = doQuery(this);\n if (result !== null || this.hasUpdated) {\n set.call(this, result);\n }\n }\n return result;\n },\n });\n }\n else {\n // This object works as the return type for both standard and\n // experimental decorators.\n return desc(protoOrTarget, nameOrContext, {\n get() {\n return doQuery(this);\n },\n });\n }\n });\n}\n//# sourceMappingURL=query.js.map","const MAX_ASSISTANT_NAME = 50;\nconst MAX_ASSISTANT_AVATAR = 200;\n\nexport const DEFAULT_ASSISTANT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_AVATAR = \"A\";\n\nexport type AssistantIdentity = {\n agentId?: string | null;\n name: string;\n avatar: string | null;\n};\n\ndeclare global {\n interface Window {\n __CLAWDBOT_ASSISTANT_NAME__?: string;\n __CLAWDBOT_ASSISTANT_AVATAR__?: string;\n }\n}\n\nfunction coerceIdentityValue(value: string | undefined, maxLength: number): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n if (trimmed.length <= maxLength) return trimmed;\n return trimmed.slice(0, maxLength);\n}\n\nexport function normalizeAssistantIdentity(\n input?: Partial<AssistantIdentity> | null,\n): AssistantIdentity {\n const name =\n coerceIdentityValue(input?.name, MAX_ASSISTANT_NAME) ?? DEFAULT_ASSISTANT_NAME;\n const avatar = coerceIdentityValue(input?.avatar ?? undefined, MAX_ASSISTANT_AVATAR) ?? null;\n const agentId =\n typeof input?.agentId === \"string\" && input.agentId.trim()\n ? input.agentId.trim()\n : null;\n return { agentId, name, avatar };\n}\n\nexport function resolveInjectedAssistantIdentity(): AssistantIdentity {\n if (typeof window === \"undefined\") {\n return normalizeAssistantIdentity({});\n }\n return normalizeAssistantIdentity({\n name: window.__CLAWDBOT_ASSISTANT_NAME__,\n avatar: window.__CLAWDBOT_ASSISTANT_AVATAR__,\n });\n}\n","const KEY = \"poolbot.control.settings.v1\";\n\nimport type { ThemeMode } from \"./theme\";\n\nexport type UiSettings = {\n gatewayUrl: string;\n token: string;\n sessionKey: string;\n lastActiveSessionKey: string;\n theme: ThemeMode;\n chatFocusMode: boolean;\n chatShowThinking: boolean;\n splitRatio: number; // Sidebar split ratio (0.4 to 0.7, default 0.6)\n navCollapsed: boolean; // Collapsible sidebar state\n navGroupsCollapsed: Record<string, boolean>; // Which nav groups are collapsed\n personality: string; // Active personality ID\n skin: string; // Active skin/theme ID\n};\n\nexport function loadSettings(): UiSettings {\n const defaultUrl = (() => {\n const proto = location.protocol === \"https:\" ? \"wss\" : \"ws\";\n return `${proto}://${location.host}`;\n })();\n\n const defaults: UiSettings = {\n gatewayUrl: defaultUrl,\n token: \"\",\n sessionKey: \"main\",\n lastActiveSessionKey: \"main\",\n theme: \"system\",\n chatFocusMode: false,\n chatShowThinking: true,\n splitRatio: 0.6,\n navCollapsed: false,\n navGroupsCollapsed: {},\n personality: \"default\",\n skin: \"default\",\n };\n\n try {\n const raw = localStorage.getItem(KEY);\n if (!raw) return defaults;\n const parsed = JSON.parse(raw) as Partial<UiSettings>;\n return {\n gatewayUrl:\n typeof parsed.gatewayUrl === \"string\" && parsed.gatewayUrl.trim()\n ? parsed.gatewayUrl.trim()\n : defaults.gatewayUrl,\n token: typeof parsed.token === \"string\" ? parsed.token : defaults.token,\n sessionKey:\n typeof parsed.sessionKey === \"string\" && parsed.sessionKey.trim()\n ? parsed.sessionKey.trim()\n : defaults.sessionKey,\n lastActiveSessionKey:\n typeof parsed.lastActiveSessionKey === \"string\" &&\n parsed.lastActiveSessionKey.trim()\n ? parsed.lastActiveSessionKey.trim()\n : (typeof parsed.sessionKey === \"string\" &&\n parsed.sessionKey.trim()) ||\n defaults.lastActiveSessionKey,\n theme:\n parsed.theme === \"light\" ||\n parsed.theme === \"dark\" ||\n parsed.theme === \"system\"\n ? parsed.theme\n : defaults.theme,\n chatFocusMode:\n typeof parsed.chatFocusMode === \"boolean\"\n ? parsed.chatFocusMode\n : defaults.chatFocusMode,\n chatShowThinking:\n typeof parsed.chatShowThinking === \"boolean\"\n ? parsed.chatShowThinking\n : defaults.chatShowThinking,\n splitRatio:\n typeof parsed.splitRatio === \"number\" &&\n parsed.splitRatio >= 0.4 &&\n parsed.splitRatio <= 0.7\n ? parsed.splitRatio\n : defaults.splitRatio,\n navCollapsed:\n typeof parsed.navCollapsed === \"boolean\"\n ? parsed.navCollapsed\n : defaults.navCollapsed,\n navGroupsCollapsed:\n typeof parsed.navGroupsCollapsed === \"object\" &&\n parsed.navGroupsCollapsed !== null\n ? parsed.navGroupsCollapsed\n : defaults.navGroupsCollapsed,\n personality:\n typeof parsed.personality === \"string\" && parsed.personality.trim()\n ? parsed.personality.trim()\n : defaults.personality,\n skin:\n typeof parsed.skin === \"string\" && parsed.skin.trim()\n ? parsed.skin.trim()\n : defaults.skin,\n };\n } catch {\n return defaults;\n }\n}\n\nexport function saveSettings(next: UiSettings) {\n localStorage.setItem(KEY, JSON.stringify(next));\n}\n","export type ParsedAgentSessionKey = {\n agentId: string;\n rest: string;\n};\n\nexport function parseAgentSessionKey(\n sessionKey: string | undefined | null,\n): ParsedAgentSessionKey | null {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) {\n return null;\n }\n const parts = raw.split(\":\").filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n if (parts[0] !== \"agent\") {\n return null;\n }\n const agentId = parts[1]?.trim();\n const rest = parts.slice(2).join(\":\");\n if (!agentId || !rest) {\n return null;\n }\n return { agentId, rest };\n}\n\nexport function isCronRunSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseAgentSessionKey(sessionKey);\n if (!parsed) {\n return false;\n }\n return /^cron:[^:]+:run:[^:]+$/.test(parsed.rest);\n}\n\nexport function isCronSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseAgentSessionKey(sessionKey);\n if (!parsed) {\n return false;\n }\n return parsed.rest.toLowerCase().startsWith(\"cron:\");\n}\n\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) {\n return false;\n }\n if (raw.toLowerCase().startsWith(\"subagent:\")) {\n return true;\n }\n const parsed = parseAgentSessionKey(raw);\n return Boolean((parsed?.rest ?? \"\").toLowerCase().startsWith(\"subagent:\"));\n}\n\nexport function getSubagentDepth(sessionKey: string | undefined | null): number {\n const raw = (sessionKey ?? \"\").trim().toLowerCase();\n if (!raw) {\n return 0;\n }\n return raw.split(\":subagent:\").length - 1;\n}\n\nexport function isAcpSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n if (normalized.startsWith(\"acp:\")) {\n return true;\n }\n const parsed = parseAgentSessionKey(raw);\n return Boolean((parsed?.rest ?? \"\").toLowerCase().startsWith(\"acp:\"));\n}\n\nconst THREAD_SESSION_MARKERS = [\":thread:\", \":topic:\"];\n\nexport function resolveThreadParentSessionKey(\n sessionKey: string | undefined | null,\n): string | null {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) {\n return null;\n }\n const normalized = raw.toLowerCase();\n let idx = -1;\n for (const marker of THREAD_SESSION_MARKERS) {\n const candidate = normalized.lastIndexOf(marker);\n if (candidate > idx) {\n idx = candidate;\n }\n }\n if (idx <= 0) {\n return null;\n }\n const parent = raw.slice(0, idx).trim();\n return parent ? parent : null;\n}\n","import type { IconName } from \"./icons.js\";\n\nexport const TAB_GROUPS = [\n { label: \"Chat\", tabs: [\"chat\"] },\n {\n label: \"Control\",\n tabs: [\"overview\", \"channels\", \"instances\", \"sessions\", \"cron\"],\n },\n { label: \"Agent\", tabs: [\"skills\", \"nodes\"] },\n { label: \"Insights\", tabs: [\"usage\"] },\n { label: \"Settings\", tabs: [\"config\", \"debug\", \"logs\"] },\n] as const;\n\nexport type Tab =\n | \"overview\"\n | \"channels\"\n | \"instances\"\n | \"sessions\"\n | \"cron\"\n | \"skills\"\n | \"nodes\"\n | \"usage\"\n | \"chat\"\n | \"config\"\n | \"debug\"\n | \"logs\";\n\nconst TAB_PATHS: Record<Tab, string> = {\n overview: \"/overview\",\n channels: \"/channels\",\n instances: \"/instances\",\n sessions: \"/sessions\",\n cron: \"/cron\",\n skills: \"/skills\",\n nodes: \"/nodes\",\n usage: \"/usage\",\n chat: \"/chat\",\n config: \"/config\",\n debug: \"/debug\",\n logs: \"/logs\",\n};\n\nconst PATH_TO_TAB = new Map(\n Object.entries(TAB_PATHS).map(([tab, path]) => [path, tab as Tab]),\n);\n\nexport function normalizeBasePath(basePath: string): string {\n if (!basePath) return \"\";\n let base = basePath.trim();\n if (!base.startsWith(\"/\")) base = `/${base}`;\n if (base === \"/\") return \"\";\n if (base.endsWith(\"/\")) base = base.slice(0, -1);\n return base;\n}\n\nexport function normalizePath(path: string): string {\n if (!path) return \"/\";\n let normalized = path.trim();\n if (!normalized.startsWith(\"/\")) normalized = `/${normalized}`;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nexport function pathForTab(tab: Tab, basePath = \"\"): string {\n const base = normalizeBasePath(basePath);\n const path = TAB_PATHS[tab];\n return base ? `${base}${path}` : path;\n}\n\nexport function tabFromPath(pathname: string, basePath = \"\"): Tab | null {\n const base = normalizeBasePath(basePath);\n let path = pathname || \"/\";\n if (base) {\n if (path === base) {\n path = \"/\";\n } else if (path.startsWith(`${base}/`)) {\n path = path.slice(base.length);\n }\n }\n let normalized = normalizePath(path).toLowerCase();\n if (normalized.endsWith(\"/index.html\")) normalized = \"/\";\n if (normalized === \"/\") return \"chat\";\n return PATH_TO_TAB.get(normalized) ?? null;\n}\n\nexport function inferBasePathFromPathname(pathname: string): string {\n let normalized = normalizePath(pathname);\n if (normalized.endsWith(\"/index.html\")) {\n normalized = normalizePath(normalized.slice(0, -\"/index.html\".length));\n }\n if (normalized === \"/\") return \"\";\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.length === 0) return \"\";\n for (let i = 0; i < segments.length; i++) {\n const candidate = `/${segments.slice(i).join(\"/\")}`.toLowerCase();\n if (PATH_TO_TAB.has(candidate)) {\n const prefix = segments.slice(0, i);\n return prefix.length ? `/${prefix.join(\"/\")}` : \"\";\n }\n }\n return `/${segments.join(\"/\")}`;\n}\n\nexport function iconForTab(tab: Tab): IconName {\n switch (tab) {\n case \"chat\":\n return \"messageSquare\";\n case \"overview\":\n return \"barChart\";\n case \"channels\":\n return \"link\";\n case \"instances\":\n return \"radio\";\n case \"sessions\":\n return \"fileText\";\n case \"cron\":\n return \"loader\";\n case \"skills\":\n return \"zap\";\n case \"nodes\":\n return \"monitor\";\n case \"usage\":\n return \"barChart\";\n case \"config\":\n return \"settings\";\n case \"debug\":\n return \"bug\";\n case \"logs\":\n return \"scrollText\";\n default:\n return \"folder\";\n }\n}\n\nexport function titleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Overview\";\n case \"channels\":\n return \"Channels\";\n case \"instances\":\n return \"Instances\";\n case \"sessions\":\n return \"Sessions\";\n case \"cron\":\n return \"Cron Jobs\";\n case \"skills\":\n return \"Skills\";\n case \"nodes\":\n return \"Nodes\";\n case \"usage\":\n return \"Usage & Costs\";\n case \"chat\":\n return \"Chat\";\n case \"config\":\n return \"Config\";\n case \"debug\":\n return \"Debug\";\n case \"logs\":\n return \"Logs\";\n default:\n return \"Control\";\n }\n}\n\nexport function subtitleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Gateway status, entry points, and a fast health read.\";\n case \"channels\":\n return \"Manage channels and settings.\";\n case \"instances\":\n return \"Presence beacons from connected clients and nodes.\";\n case \"sessions\":\n return \"Inspect active sessions and adjust per-session defaults.\";\n case \"cron\":\n return \"Schedule wakeups and recurring agent runs.\";\n case \"skills\":\n return \"Manage skill availability and API key injection.\";\n case \"nodes\":\n return \"Paired devices, capabilities, and command exposure.\";\n case \"usage\":\n return \"Token usage, cost breakdown, and session analytics.\";\n case \"chat\":\n return \"Direct gateway chat session for quick interventions.\";\n case \"config\":\n return \"Edit ~/.poolbot/poolbot.json safely.\";\n case \"debug\":\n return \"Gateway snapshots, events, and manual RPC calls.\";\n case \"logs\":\n return \"Live tail of the gateway file logs.\";\n default:\n return \"\";\n }\n}\n","import { html, type TemplateResult } from \"lit\";\n\n// Lucide-style SVG icons\n// All icons use currentColor for stroke\n\nexport const icons = {\n // Navigation icons\n messageSquare: html`<svg viewBox=\"0 0 24 24\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>`,\n barChart: html`<svg viewBox=\"0 0 24 24\"><line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"10\"/><line x1=\"18\" x2=\"18\" y1=\"20\" y2=\"4\"/><line x1=\"6\" x2=\"6\" y1=\"20\" y2=\"16\"/></svg>`,\n link: html`<svg viewBox=\"0 0 24 24\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>`,\n radio: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14\"/></svg>`,\n fileText: html`<svg viewBox=\"0 0 24 24\"><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" x2=\"8\" y1=\"13\" y2=\"13\"/><line x1=\"16\" x2=\"8\" y1=\"17\" y2=\"17\"/><line x1=\"10\" x2=\"8\" y1=\"9\" y2=\"9\"/></svg>`,\n zap: html`<svg viewBox=\"0 0 24 24\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg>`,\n monitor: html`<svg viewBox=\"0 0 24 24\"><rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"/><line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"/><line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"/></svg>`,\n settings: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`,\n bug: html`<svg viewBox=\"0 0 24 24\"><path d=\"m8 2 1.88 1.88\"/><path d=\"M14.12 3.88 16 2\"/><path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"/><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"/><path d=\"M12 20v-9\"/><path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\"/><path d=\"M6 13H2\"/><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\"/><path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\"/><path d=\"M22 13h-4\"/><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\"/></svg>`,\n scrollText: html`<svg viewBox=\"0 0 24 24\"><path d=\"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4\"/><path d=\"M19 17V5a2 2 0 0 0-2-2H4\"/><path d=\"M15 8h-5\"/><path d=\"M15 12h-5\"/></svg>`,\n folder: html`<svg viewBox=\"0 0 24 24\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"/></svg>`,\n\n // UI icons\n menu: html`<svg viewBox=\"0 0 24 24\"><line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\"/><line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\"/><line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\"/></svg>`,\n x: html`<svg viewBox=\"0 0 24 24\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`,\n check: html`<svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"/></svg>`,\n copy: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`,\n search: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg>`,\n brain: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\"/><path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\"/><path d=\"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\"/><path d=\"M17.599 6.5a3 3 0 0 0 .399-1.375\"/><path d=\"M6.003 5.125A3 3 0 0 0 6.401 6.5\"/><path d=\"M3.477 10.896a4 4 0 0 1 .585-.396\"/><path d=\"M19.938 10.5a4 4 0 0 1 .585.396\"/><path d=\"M6 18a4 4 0 0 1-1.967-.516\"/><path d=\"M19.967 17.484A4 4 0 0 1 18 18\"/></svg>`,\n book: html`<svg viewBox=\"0 0 24 24\"><path d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20\"/></svg>`,\n loader: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 2v4\"/><path d=\"m16.2 7.8 2.9-2.9\"/><path d=\"M18 12h4\"/><path d=\"m16.2 16.2 2.9 2.9\"/><path d=\"M12 18v4\"/><path d=\"m4.9 19.1 2.9-2.9\"/><path d=\"M2 12h4\"/><path d=\"m4.9 4.9 2.9 2.9\"/></svg>`,\n\n // Tool icons\n wrench: html`<svg viewBox=\"0 0 24 24\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/></svg>`,\n fileCode: html`<svg viewBox=\"0 0 24 24\"><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/><path d=\"m10 13-2 2 2 2\"/><path d=\"m14 17 2-2-2-2\"/></svg>`,\n edit: html`<svg viewBox=\"0 0 24 24\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n penLine: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/></svg>`,\n paperclip: html`<svg viewBox=\"0 0 24 24\"><path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\"/></svg>`,\n globe: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"/><path d=\"M2 12h20\"/></svg>`,\n eye: html`<svg viewBox=\"0 0 24 24\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`,\n eyeOff: html`<svg viewBox=\"0 0 24 24\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>`,\n image: html`<svg viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>`,\n smartphone: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\"/><path d=\"M12 18h.01\"/></svg>`,\n shield: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/><path d=\"m9 12 2 2 4-4\"/></svg>`,\n plug: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 22v-5\"/><path d=\"M9 8V2\"/><path d=\"M15 8V2\"/><path d=\"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z\"/></svg>`,\n circle: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`,\n puzzle: html`<svg viewBox=\"0 0 24 24\"><path d=\"M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.076.874.54 1.02 1.02a2.5 2.5 0 1 0 3.237-3.237c-.48-.146-.944-.505-1.02-1.02a.98.98 0 0 1 .303-.917l1.526-1.526A2.402 2.402 0 0 1 11.998 2c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.236 3.236c-.464.18-.894.527-.967 1.02Z\"/></svg>`,\n} as const;\n\nexport type IconName = keyof typeof icons;\n\nexport function icon(name: IconName): TemplateResult {\n return icons[name];\n}\n\nexport function renderIcon(name: IconName, className = \"nav-item__icon\"): TemplateResult {\n return html`<span class=${className} aria-hidden=\"true\">${icons[name]}</span>`;\n}\n\n// Legacy function for compatibility\nexport function renderEmojiIcon(iconContent: string | TemplateResult, className: string): TemplateResult {\n return html`<span class=${className} aria-hidden=\"true\">${iconContent}</span>`;\n}\n\nexport function setEmojiIcon(target: HTMLElement | null, icon: string): void {\n if (!target) return;\n target.textContent = icon;\n}\n","export type ReasoningTagMode = \"strict\" | \"preserve\";\nexport type ReasoningTagTrim = \"none\" | \"start\" | \"both\";\n\nconst QUICK_TAG_RE = /<\\s*\\/?\\s*(?:think(?:ing)?|thought|antthinking|final)\\b/i;\nconst FINAL_TAG_RE = /<\\s*\\/?\\s*final\\b[^<>]*>/gi;\nconst THINKING_TAG_RE = /<\\s*(\\/?)\\s*(?:think(?:ing)?|thought|antthinking)\\b[^<>]*>/gi;\n\ninterface CodeRegion {\n start: number;\n end: number;\n}\n\nfunction findCodeRegions(text: string): CodeRegion[] {\n const regions: CodeRegion[] = [];\n\n const fencedRe = /(^|\\n)(```|~~~)[^\\n]*\\n[\\s\\S]*?(?:\\n\\2(?:\\n|$)|$)/g;\n for (const match of text.matchAll(fencedRe)) {\n const start = (match.index ?? 0) + match[1].length;\n regions.push({ start, end: start + match[0].length - match[1].length });\n }\n\n const inlineRe = /`+[^`]+`+/g;\n for (const match of text.matchAll(inlineRe)) {\n const start = match.index ?? 0;\n const end = start + match[0].length;\n const insideFenced = regions.some((r) => start >= r.start && end <= r.end);\n if (!insideFenced) {\n regions.push({ start, end });\n }\n }\n\n regions.sort((a, b) => a.start - b.start);\n return regions;\n}\n\nfunction isInsideCode(pos: number, regions: CodeRegion[]): boolean {\n return regions.some((r) => pos >= r.start && pos < r.end);\n}\n\nfunction applyTrim(value: string, mode: ReasoningTagTrim): string {\n if (mode === \"none\") {\n return value;\n }\n if (mode === \"start\") {\n return value.trimStart();\n }\n return value.trim();\n}\n\nexport function stripReasoningTagsFromText(\n text: string,\n options?: {\n mode?: ReasoningTagMode;\n trim?: ReasoningTagTrim;\n },\n): string {\n if (!text) {\n return text;\n }\n if (!QUICK_TAG_RE.test(text)) {\n return text;\n }\n\n const mode = options?.mode ?? \"strict\";\n const trimMode = options?.trim ?? \"both\";\n\n let cleaned = text;\n if (FINAL_TAG_RE.test(cleaned)) {\n FINAL_TAG_RE.lastIndex = 0;\n const finalMatches: Array<{ start: number; length: number; inCode: boolean }> = [];\n const preCodeRegions = findCodeRegions(cleaned);\n for (const match of cleaned.matchAll(FINAL_TAG_RE)) {\n const start = match.index ?? 0;\n finalMatches.push({\n start,\n length: match[0].length,\n inCode: isInsideCode(start, preCodeRegions),\n });\n }\n\n for (let i = finalMatches.length - 1; i >= 0; i--) {\n const m = finalMatches[i];\n if (!m.inCode) {\n cleaned = cleaned.slice(0, m.start) + cleaned.slice(m.start + m.length);\n }\n }\n } else {\n FINAL_TAG_RE.lastIndex = 0;\n }\n\n const codeRegions = findCodeRegions(cleaned);\n\n THINKING_TAG_RE.lastIndex = 0;\n let result = \"\";\n let lastIndex = 0;\n let inThinking = false;\n\n for (const match of cleaned.matchAll(THINKING_TAG_RE)) {\n const idx = match.index ?? 0;\n const isClose = match[1] === \"/\";\n\n if (isInsideCode(idx, codeRegions)) {\n continue;\n }\n\n if (!inThinking) {\n result += cleaned.slice(lastIndex, idx);\n if (!isClose) {\n inThinking = true;\n }\n } else if (isClose) {\n inThinking = false;\n }\n\n lastIndex = idx + match[0].length;\n }\n\n if (!inThinking || mode === \"preserve\") {\n result += cleaned.slice(lastIndex);\n }\n\n return applyTrim(result, trimMode);\n}\n","import { stripReasoningTagsFromText } from \"../../../src/shared/text/reasoning-tags.js\";\n\nexport function formatMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n return new Date(ms).toLocaleString();\n}\n\nexport function formatAgo(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n const diff = Date.now() - ms;\n if (diff < 0) return \"just now\";\n const sec = Math.round(diff / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n return `${day}d ago`;\n}\n\n/** Alias used by cron views for relative timestamp formatting. */\nexport const formatRelativeTimestamp = formatAgo;\n\nexport function formatDurationMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n if (ms < 1000) return `${ms}ms`;\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h`;\n const day = Math.round(hr / 24);\n return `${day}d`;\n}\n\nexport function formatList(values?: Array<string | null | undefined>): string {\n if (!values || values.length === 0) return \"none\";\n return values.filter((v): v is string => Boolean(v && v.trim())).join(\", \");\n}\n\nexport function clampText(value: string, max = 120): string {\n if (value.length <= max) return value;\n return `${value.slice(0, Math.max(0, max - 1))}…`;\n}\n\nexport function truncateText(value: string, max: number): {\n text: string;\n truncated: boolean;\n total: number;\n} {\n if (value.length <= max) {\n return { text: value, truncated: false, total: value.length };\n }\n return {\n text: value.slice(0, Math.max(0, max)),\n truncated: true,\n total: value.length,\n };\n}\n\nexport function toNumber(value: string, fallback: number): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function parseList(input: string): string[] {\n return input\n .split(/[,\\n]/)\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n}\n\nexport function stripThinkingTags(value: string): string {\n return stripReasoningTagsFromText(value, { mode: \"preserve\", trim: \"start\" });\n}\n","import { stripThinkingTags } from \"../format\";\n\nconst ENVELOPE_PREFIX = /^\\[([^\\]]+)\\]\\s*/;\nconst ENVELOPE_CHANNELS = [\n \"WebChat\",\n \"WhatsApp\",\n \"Telegram\",\n \"Signal\",\n \"Slack\",\n \"Discord\",\n \"iMessage\",\n \"Teams\",\n \"Matrix\",\n \"Zalo\",\n \"Zalo Personal\",\n \"BlueBubbles\",\n];\n\nconst textCache = new WeakMap<object, string | null>();\nconst thinkingCache = new WeakMap<object, string | null>();\n\nfunction looksLikeEnvelopeHeader(header: string): boolean {\n if (/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z\\b/.test(header)) return true;\n if (/\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}\\b/.test(header)) return true;\n return ENVELOPE_CHANNELS.some((label) => header.startsWith(`${label} `));\n}\n\nexport function stripEnvelope(text: string): string {\n const match = text.match(ENVELOPE_PREFIX);\n if (!match) return text;\n const header = match[1] ?? \"\";\n if (!looksLikeEnvelopeHeader(header)) return text;\n return text.slice(match[0].length);\n}\n\nexport function extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"\";\n const content = m.content;\n if (typeof content === \"string\") {\n const processed = role === \"assistant\" ? stripThinkingTags(content) : stripEnvelope(content);\n return processed;\n }\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) {\n const joined = parts.join(\"\\n\");\n const processed = role === \"assistant\" ? stripThinkingTags(joined) : stripEnvelope(joined);\n return processed;\n }\n }\n if (typeof m.text === \"string\") {\n const processed = role === \"assistant\" ? stripThinkingTags(m.text) : stripEnvelope(m.text);\n return processed;\n }\n return null;\n}\n\nexport function extractTextCached(message: unknown): string | null {\n if (!message || typeof message !== \"object\") return extractText(message);\n const obj = message as object;\n if (textCache.has(obj)) return textCache.get(obj) ?? null;\n const value = extractText(message);\n textCache.set(obj, value);\n return value;\n}\n\nexport function extractThinking(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n const parts: string[] = [];\n if (Array.isArray(content)) {\n for (const p of content) {\n const item = p as Record<string, unknown>;\n if (item.type === \"thinking\" && typeof item.thinking === \"string\") {\n const cleaned = item.thinking.trim();\n if (cleaned) parts.push(cleaned);\n }\n }\n }\n if (parts.length > 0) return parts.join(\"\\n\");\n\n // Back-compat: older logs may still have <think> tags inside text blocks.\n const rawText = extractRawText(message);\n if (!rawText) return null;\n const matches = [\n ...rawText.matchAll(\n /<\\s*think(?:ing)?\\s*>([\\s\\S]*?)<\\s*\\/\\s*think(?:ing)?\\s*>/gi,\n ),\n ];\n const extracted = matches\n .map((m) => (m[1] ?? \"\").trim())\n .filter(Boolean);\n return extracted.length > 0 ? extracted.join(\"\\n\") : null;\n}\n\nexport function extractThinkingCached(message: unknown): string | null {\n if (!message || typeof message !== \"object\") return extractThinking(message);\n const obj = message as object;\n if (thinkingCache.has(obj)) return thinkingCache.get(obj) ?? null;\n const value = extractThinking(message);\n thinkingCache.set(obj, value);\n return value;\n}\n\nexport function extractRawText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n\nexport function formatReasoningMarkdown(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) return \"\";\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => `_${line}_`);\n return lines.length ? [\"_Reasoning:_\", ...lines].join(\"\\n\") : \"\";\n}\n","export type CryptoLike = {\n randomUUID?: (() => string) | undefined;\n getRandomValues?: ((array: Uint8Array) => Uint8Array) | undefined;\n};\n\nlet warnedWeakCrypto = false;\n\nfunction uuidFromBytes(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(\n 16,\n 20,\n )}-${hex.slice(20)}`;\n}\n\nfunction weakRandomBytes(): Uint8Array {\n const bytes = new Uint8Array(16);\n const now = Date.now();\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);\n bytes[0] ^= now & 0xff;\n bytes[1] ^= (now >>> 8) & 0xff;\n bytes[2] ^= (now >>> 16) & 0xff;\n bytes[3] ^= (now >>> 24) & 0xff;\n return bytes;\n}\n\nfunction warnWeakCryptoOnce() {\n if (warnedWeakCrypto) return;\n warnedWeakCrypto = true;\n console.warn(\"[uuid] crypto API missing; falling back to weak randomness\");\n}\n\nexport function generateUUID(cryptoLike: CryptoLike | null = globalThis.crypto): string {\n if (cryptoLike && typeof cryptoLike.randomUUID === \"function\") return cryptoLike.randomUUID();\n\n if (cryptoLike && typeof cryptoLike.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoLike.getRandomValues(bytes);\n return uuidFromBytes(bytes);\n }\n\n warnWeakCryptoOnce();\n return uuidFromBytes(weakRandomBytes());\n}\n","import { extractText } from \"../chat/message-extract\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport { generateUUID } from \"../uuid\";\nimport type { ChatAttachment } from \"../ui-types\";\n\nexport type ChatState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatThinkingLevel: string | null;\n chatSending: boolean;\n chatMessage: string;\n chatAttachments: ChatAttachment[];\n chatRunId: string | null;\n chatStream: string | null;\n chatStreamStartedAt: number | null;\n lastError: string | null;\n};\n\nexport type ChatEventPayload = {\n runId: string;\n sessionKey: string;\n state: \"delta\" | \"final\" | \"aborted\" | \"error\";\n message?: unknown;\n errorMessage?: string;\n};\n\nexport async function loadChatHistory(state: ChatState) {\n if (!state.client || !state.connected) return;\n state.chatLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"chat.history\", {\n sessionKey: state.sessionKey,\n limit: 200,\n })) as { messages?: unknown[]; thinkingLevel?: string | null };\n state.chatMessages = Array.isArray(res.messages) ? res.messages : [];\n state.chatThinkingLevel = res.thinkingLevel ?? null;\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.chatLoading = false;\n }\n}\n\nfunction dataUrlToBase64(dataUrl: string): { content: string; mimeType: string } | null {\n const match = /^data:([^;]+);base64,(.+)$/.exec(dataUrl);\n if (!match) return null;\n return { mimeType: match[1], content: match[2] };\n}\n\nexport async function sendChatMessage(\n state: ChatState,\n message: string,\n attachments?: ChatAttachment[],\n): Promise<boolean> {\n if (!state.client || !state.connected) return false;\n const msg = message.trim();\n const hasAttachments = attachments && attachments.length > 0;\n if (!msg && !hasAttachments) return false;\n\n const now = Date.now();\n\n // Build user message content blocks\n const contentBlocks: Array<{ type: string; text?: string; source?: unknown }> = [];\n if (msg) {\n contentBlocks.push({ type: \"text\", text: msg });\n }\n // Add image previews to the message for display\n if (hasAttachments) {\n for (const att of attachments) {\n contentBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: att.mimeType, data: att.dataUrl },\n });\n }\n }\n\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"user\",\n content: contentBlocks,\n timestamp: now,\n },\n ];\n\n state.chatSending = true;\n state.lastError = null;\n const runId = generateUUID();\n state.chatRunId = runId;\n state.chatStream = \"\";\n state.chatStreamStartedAt = now;\n\n // Convert attachments to API format\n const apiAttachments = hasAttachments\n ? attachments\n .map((att) => {\n const parsed = dataUrlToBase64(att.dataUrl);\n if (!parsed) return null;\n return {\n type: \"image\",\n mimeType: parsed.mimeType,\n content: parsed.content,\n };\n })\n .filter((a): a is NonNullable<typeof a> => a !== null)\n : undefined;\n\n try {\n await state.client.request(\"chat.send\", {\n sessionKey: state.sessionKey,\n message: msg,\n deliver: false,\n idempotencyKey: runId,\n attachments: apiAttachments,\n });\n return true;\n } catch (err) {\n const error = String(err);\n state.chatRunId = null;\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.lastError = error;\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Error: \" + error }],\n timestamp: Date.now(),\n },\n ];\n return false;\n } finally {\n state.chatSending = false;\n }\n}\n\nexport async function abortChatRun(state: ChatState): Promise<boolean> {\n if (!state.client || !state.connected) return false;\n const runId = state.chatRunId;\n try {\n await state.client.request(\n \"chat.abort\",\n runId\n ? { sessionKey: state.sessionKey, runId }\n : { sessionKey: state.sessionKey },\n );\n return true;\n } catch (err) {\n state.lastError = String(err);\n return false;\n }\n}\n\nexport function handleChatEvent(\n state: ChatState,\n payload?: ChatEventPayload,\n) {\n if (!payload) return null;\n if (payload.sessionKey !== state.sessionKey) return null;\n\n // Final from another run (e.g. sub-agent announce): refresh history to show new message.\n // See https://github.com/poolbot/poolbot/issues/1909\n if (\n payload.runId &&\n state.chatRunId &&\n payload.runId !== state.chatRunId\n ) {\n if (payload.state === \"final\") return \"final\";\n return null;\n }\n\n if (payload.state === \"delta\") {\n const next = extractText(payload.message);\n if (typeof next === \"string\") {\n const current = state.chatStream ?? \"\";\n if (!current || next.length >= current.length) {\n state.chatStream = next;\n }\n }\n } else if (payload.state === \"final\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n } else if (payload.state === \"aborted\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n } else if (payload.state === \"error\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n state.lastError = payload.errorMessage ?? \"chat error\";\n }\n return payload.state;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { toNumber } from \"../format\";\nimport type { SessionsListResult } from \"../types\";\n\nexport type SessionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive: string;\n sessionsFilterLimit: string;\n sessionsIncludeGlobal: boolean;\n sessionsIncludeUnknown: boolean;\n};\n\nexport async function loadSessions(state: SessionsState) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n const params: Record<string, unknown> = {\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n };\n const activeMinutes = toNumber(state.sessionsFilterActive, 0);\n const limit = toNumber(state.sessionsFilterLimit, 0);\n if (activeMinutes > 0) params.activeMinutes = activeMinutes;\n if (limit > 0) params.limit = limit;\n const res = (await state.client.request(\"sessions.list\", params)) as\n | SessionsListResult\n | undefined;\n if (res) state.sessionsResult = res;\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n\nexport async function patchSession(\n state: SessionsState,\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n },\n) {\n if (!state.client || !state.connected) return;\n const params: Record<string, unknown> = { key };\n if (\"label\" in patch) params.label = patch.label;\n if (\"thinkingLevel\" in patch) params.thinkingLevel = patch.thinkingLevel;\n if (\"verboseLevel\" in patch) params.verboseLevel = patch.verboseLevel;\n if (\"reasoningLevel\" in patch) params.reasoningLevel = patch.reasoningLevel;\n try {\n await state.client.request(\"sessions.patch\", params);\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n }\n}\n\nexport async function deleteSession(state: SessionsState, key: string) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n const confirmed = window.confirm(\n `Delete session \"${key}\"?\\n\\nDeletes the session entry and archives its transcript.`,\n );\n if (!confirmed) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n await state.client.request(\"sessions.delete\", { key, deleteTranscript: true });\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n","import { truncateText } from \"./format\";\n\nconst TOOL_STREAM_LIMIT = 50;\nconst TOOL_STREAM_THROTTLE_MS = 80;\nconst TOOL_OUTPUT_CHAR_LIMIT = 120_000;\n\nexport type AgentEventPayload = {\n runId: string;\n seq: number;\n stream: string;\n ts: number;\n sessionKey?: string;\n data: Record<string, unknown>;\n};\n\nexport type ToolStreamEntry = {\n toolCallId: string;\n runId: string;\n sessionKey?: string;\n name: string;\n args?: unknown;\n output?: string;\n startedAt: number;\n updatedAt: number;\n message: Record<string, unknown>;\n};\n\ntype ToolStreamHost = {\n sessionKey: string;\n chatRunId: string | null;\n toolStreamById: Map<string, ToolStreamEntry>;\n toolStreamOrder: string[];\n chatToolMessages: Record<string, unknown>[];\n toolStreamSyncTimer: number | null;\n};\n\nfunction extractToolOutputText(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n const content = record.content;\n if (!Array.isArray(content)) return null;\n const parts = content\n .map((item) => {\n if (!item || typeof item !== \"object\") return null;\n const entry = item as Record<string, unknown>;\n if (entry.type === \"text\" && typeof entry.text === \"string\") return entry.text;\n return null;\n })\n .filter((part): part is string => Boolean(part));\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n\nfunction formatToolOutput(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n const contentText = extractToolOutputText(value);\n let text: string;\n if (typeof value === \"string\") {\n text = value;\n } else if (contentText) {\n text = contentText;\n } else {\n try {\n text = JSON.stringify(value, null, 2);\n } catch {\n text = String(value);\n }\n }\n const truncated = truncateText(text, TOOL_OUTPUT_CHAR_LIMIT);\n if (!truncated.truncated) return truncated.text;\n return `${truncated.text}\\n\\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`;\n}\n\nfunction buildToolStreamMessage(entry: ToolStreamEntry): Record<string, unknown> {\n const content: Array<Record<string, unknown>> = [];\n content.push({\n type: \"toolcall\",\n name: entry.name,\n arguments: entry.args ?? {},\n });\n if (entry.output) {\n content.push({\n type: \"toolresult\",\n name: entry.name,\n text: entry.output,\n });\n }\n return {\n role: \"assistant\",\n toolCallId: entry.toolCallId,\n runId: entry.runId,\n content,\n timestamp: entry.startedAt,\n };\n}\n\nfunction trimToolStream(host: ToolStreamHost) {\n if (host.toolStreamOrder.length <= TOOL_STREAM_LIMIT) return;\n const overflow = host.toolStreamOrder.length - TOOL_STREAM_LIMIT;\n const removed = host.toolStreamOrder.splice(0, overflow);\n for (const id of removed) host.toolStreamById.delete(id);\n}\n\nfunction syncToolStreamMessages(host: ToolStreamHost) {\n host.chatToolMessages = host.toolStreamOrder\n .map((id) => host.toolStreamById.get(id)?.message)\n .filter((msg): msg is Record<string, unknown> => Boolean(msg));\n}\n\nexport function flushToolStreamSync(host: ToolStreamHost) {\n if (host.toolStreamSyncTimer != null) {\n clearTimeout(host.toolStreamSyncTimer);\n host.toolStreamSyncTimer = null;\n }\n syncToolStreamMessages(host);\n}\n\nexport function scheduleToolStreamSync(host: ToolStreamHost, force = false) {\n if (force) {\n flushToolStreamSync(host);\n return;\n }\n if (host.toolStreamSyncTimer != null) return;\n host.toolStreamSyncTimer = window.setTimeout(\n () => flushToolStreamSync(host),\n TOOL_STREAM_THROTTLE_MS,\n );\n}\n\nexport function resetToolStream(host: ToolStreamHost) {\n host.toolStreamById.clear();\n host.toolStreamOrder = [];\n host.chatToolMessages = [];\n flushToolStreamSync(host);\n}\n\nexport type CompactionStatus = {\n active: boolean;\n startedAt: number | null;\n completedAt: number | null;\n};\n\ntype CompactionHost = ToolStreamHost & {\n compactionStatus?: CompactionStatus | null;\n compactionClearTimer?: number | null;\n};\n\nconst COMPACTION_TOAST_DURATION_MS = 5000;\n\nexport function handleCompactionEvent(host: CompactionHost, payload: AgentEventPayload) {\n const data = payload.data ?? {};\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n\n // Clear any existing timer\n if (host.compactionClearTimer != null) {\n window.clearTimeout(host.compactionClearTimer);\n host.compactionClearTimer = null;\n }\n\n if (phase === \"start\") {\n host.compactionStatus = {\n active: true,\n startedAt: Date.now(),\n completedAt: null,\n };\n } else if (phase === \"end\") {\n host.compactionStatus = {\n active: false,\n startedAt: host.compactionStatus?.startedAt ?? null,\n completedAt: Date.now(),\n };\n // Auto-clear the toast after duration\n host.compactionClearTimer = window.setTimeout(() => {\n host.compactionStatus = null;\n host.compactionClearTimer = null;\n }, COMPACTION_TOAST_DURATION_MS);\n }\n}\n\nexport function handleAgentEvent(host: ToolStreamHost, payload?: AgentEventPayload) {\n if (!payload) return;\n\n // Handle compaction events\n if (payload.stream === \"compaction\") {\n handleCompactionEvent(host as CompactionHost, payload);\n return;\n }\n\n if (payload.stream !== \"tool\") return;\n const sessionKey =\n typeof payload.sessionKey === \"string\" ? payload.sessionKey : undefined;\n if (sessionKey && sessionKey !== host.sessionKey) return;\n // Fallback: only accept session-less events for the active run.\n if (!sessionKey && host.chatRunId && payload.runId !== host.chatRunId) return;\n if (host.chatRunId && payload.runId !== host.chatRunId) return;\n if (!host.chatRunId) return;\n\n const data = payload.data ?? {};\n const toolCallId = typeof data.toolCallId === \"string\" ? data.toolCallId : \"\";\n if (!toolCallId) return;\n const name = typeof data.name === \"string\" ? data.name : \"tool\";\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n const args = phase === \"start\" ? data.args : undefined;\n const output =\n phase === \"update\"\n ? formatToolOutput(data.partialResult)\n : phase === \"result\"\n ? formatToolOutput(data.result)\n : undefined;\n\n const now = Date.now();\n let entry = host.toolStreamById.get(toolCallId);\n if (!entry) {\n entry = {\n toolCallId,\n runId: payload.runId,\n sessionKey,\n name,\n args,\n output,\n startedAt: typeof payload.ts === \"number\" ? payload.ts : now,\n updatedAt: now,\n message: {},\n };\n host.toolStreamById.set(toolCallId, entry);\n host.toolStreamOrder.push(toolCallId);\n } else {\n entry.name = name;\n if (args !== undefined) entry.args = args;\n if (output !== undefined) entry.output = output;\n entry.updatedAt = now;\n }\n\n entry.message = buildToolStreamMessage(entry);\n trimToolStream(host);\n scheduleToolStreamSync(host, phase === \"result\");\n}\n","type ScrollHost = {\n updateComplete: Promise<unknown>;\n querySelector: (selectors: string) => Element | null;\n style: CSSStyleDeclaration;\n chatScrollFrame: number | null;\n chatScrollTimeout: number | null;\n chatHasAutoScrolled: boolean;\n chatUserNearBottom: boolean;\n logsScrollFrame: number | null;\n logsAtBottom: boolean;\n topbarObserver: ResizeObserver | null;\n};\n\nexport function scheduleChatScroll(host: ScrollHost, force = false) {\n if (host.chatScrollFrame) cancelAnimationFrame(host.chatScrollFrame);\n if (host.chatScrollTimeout != null) {\n clearTimeout(host.chatScrollTimeout);\n host.chatScrollTimeout = null;\n }\n const pickScrollTarget = () => {\n const container = host.querySelector(\".chat-thread\") as HTMLElement | null;\n if (container) {\n const overflowY = getComputedStyle(container).overflowY;\n const canScroll =\n overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n container.scrollHeight - container.clientHeight > 1;\n if (canScroll) return container;\n }\n return (document.scrollingElement ?? document.documentElement) as HTMLElement | null;\n };\n // Wait for Lit render to complete, then scroll\n void host.updateComplete.then(() => {\n host.chatScrollFrame = requestAnimationFrame(() => {\n host.chatScrollFrame = null;\n const target = pickScrollTarget();\n if (!target) return;\n const distanceFromBottom =\n target.scrollHeight - target.scrollTop - target.clientHeight;\n const shouldStick = force || host.chatUserNearBottom || distanceFromBottom < 200;\n if (!shouldStick) return;\n if (force) host.chatHasAutoScrolled = true;\n target.scrollTop = target.scrollHeight;\n host.chatUserNearBottom = true;\n const retryDelay = force ? 150 : 120;\n host.chatScrollTimeout = window.setTimeout(() => {\n host.chatScrollTimeout = null;\n const latest = pickScrollTarget();\n if (!latest) return;\n const latestDistanceFromBottom =\n latest.scrollHeight - latest.scrollTop - latest.clientHeight;\n const shouldStickRetry =\n force || host.chatUserNearBottom || latestDistanceFromBottom < 200;\n if (!shouldStickRetry) return;\n latest.scrollTop = latest.scrollHeight;\n host.chatUserNearBottom = true;\n }, retryDelay);\n });\n });\n}\n\nexport function scheduleLogsScroll(host: ScrollHost, force = false) {\n if (host.logsScrollFrame) cancelAnimationFrame(host.logsScrollFrame);\n void host.updateComplete.then(() => {\n host.logsScrollFrame = requestAnimationFrame(() => {\n host.logsScrollFrame = null;\n const container = host.querySelector(\".log-stream\") as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n const shouldStick = force || distanceFromBottom < 80;\n if (!shouldStick) return;\n container.scrollTop = container.scrollHeight;\n });\n });\n}\n\nexport function handleChatScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n host.chatUserNearBottom = distanceFromBottom < 200;\n}\n\nexport function handleLogsScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n host.logsAtBottom = distanceFromBottom < 80;\n}\n\nexport function resetChatScroll(host: ScrollHost) {\n host.chatHasAutoScrolled = false;\n host.chatUserNearBottom = true;\n}\n\nexport function exportLogs(lines: string[], label: string) {\n if (lines.length === 0) return;\n const blob = new Blob([`${lines.join(\"\\n\")}\\n`], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, \"-\");\n anchor.href = url;\n anchor.download = `poolbot-logs-${label}-${stamp}.log`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport function observeTopbar(host: ScrollHost) {\n if (typeof ResizeObserver === \"undefined\") return;\n const topbar = host.querySelector(\".topbar\");\n if (!topbar) return;\n const update = () => {\n const { height } = topbar.getBoundingClientRect();\n host.style.setProperty(\"--topbar-height\", `${height}px`);\n };\n update();\n host.topbarObserver = new ResizeObserver(() => update());\n host.topbarObserver.observe(topbar);\n}\n","export function cloneConfigObject<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport function serializeConfigForm(form: Record<string, unknown>): string {\n return `${JSON.stringify(form, null, 2).trimEnd()}\\n`;\n}\n\nexport function setPathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n value: unknown,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n const nextKey = path[i + 1];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n if (current[key] == null) {\n current[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n const record = current as Record<string, unknown>;\n if (record[key] == null) {\n record[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = record[key] as Record<string, unknown> | unknown[];\n }\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) current[lastKey] = value;\n return;\n }\n if (typeof current === \"object\" && current != null) {\n (current as Record<string, unknown>)[lastKey] = value;\n }\n}\n\nexport function removePathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n current = (current as Record<string, unknown>)[key] as\n | Record<string, unknown>\n | unknown[];\n }\n if (current == null) return;\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) current.splice(lastKey, 1);\n return;\n }\n if (typeof current === \"object\" && current != null) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type {\n ConfigSchemaResponse,\n ConfigSnapshot,\n ConfigUiHints,\n} from \"../types\";\nimport {\n cloneConfigObject,\n removePathValue,\n serializeConfigForm,\n setPathValue,\n} from \"./config/form-utils\";\n\nexport type ConfigState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n applySessionKey: string;\n configLoading: boolean;\n configRaw: string;\n configRawOriginal: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configApplying: boolean;\n updateRunning: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaVersion: string | null;\n configSchemaLoading: boolean;\n configUiHints: ConfigUiHints;\n configForm: Record<string, unknown> | null;\n configFormOriginal: Record<string, unknown> | null;\n configFormDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n configSearchQuery: string;\n configActiveSection: string | null;\n configActiveSubsection: string | null;\n lastError: string | null;\n};\n\nexport async function loadConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n applyConfigSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configLoading = false;\n }\n}\n\nexport async function loadConfigSchema(state: ConfigState) {\n if (!state.client || !state.connected) return;\n if (state.configSchemaLoading) return;\n state.configSchemaLoading = true;\n try {\n const res = (await state.client.request(\n \"config.schema\",\n {},\n )) as ConfigSchemaResponse;\n applyConfigSchema(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSchemaLoading = false;\n }\n}\n\nexport function applyConfigSchema(\n state: ConfigState,\n res: ConfigSchemaResponse,\n) {\n state.configSchema = res.schema ?? null;\n state.configUiHints = res.uiHints ?? {};\n state.configSchemaVersion = res.version ?? null;\n}\n\nexport function applyConfigSnapshot(state: ConfigState, snapshot: ConfigSnapshot) {\n state.configSnapshot = snapshot;\n const rawFromSnapshot =\n typeof snapshot.raw === \"string\"\n ? snapshot.raw\n : snapshot.config && typeof snapshot.config === \"object\"\n ? serializeConfigForm(snapshot.config as Record<string, unknown>)\n : state.configRaw;\n if (!state.configFormDirty || state.configFormMode === \"raw\") {\n state.configRaw = rawFromSnapshot;\n } else if (state.configForm) {\n state.configRaw = serializeConfigForm(state.configForm);\n } else {\n state.configRaw = rawFromSnapshot;\n }\n state.configValid = typeof snapshot.valid === \"boolean\" ? snapshot.valid : null;\n state.configIssues = Array.isArray(snapshot.issues) ? snapshot.issues : [];\n\n if (!state.configFormDirty) {\n state.configForm = cloneConfigObject(snapshot.config ?? {});\n state.configFormOriginal = cloneConfigObject(snapshot.config ?? {});\n state.configRawOriginal = rawFromSnapshot;\n }\n}\n\nexport async function saveConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configSaving = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? serializeConfigForm(state.configForm)\n : state.configRaw;\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Config hash missing; reload and retry.\";\n return;\n }\n await state.client.request(\"config.set\", { raw, baseHash });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSaving = false;\n }\n}\n\nexport async function applyConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configApplying = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? serializeConfigForm(state.configForm)\n : state.configRaw;\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Config hash missing; reload and retry.\";\n return;\n }\n await state.client.request(\"config.apply\", {\n raw,\n baseHash,\n sessionKey: state.applySessionKey,\n });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configApplying = false;\n }\n}\n\nexport async function runUpdate(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.updateRunning = true;\n state.lastError = null;\n try {\n await state.client.request(\"update.run\", {\n sessionKey: state.applySessionKey,\n });\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.updateRunning = false;\n }\n}\n\nexport function updateConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n setPathValue(base, path, value);\n state.configForm = base;\n state.configFormDirty = true;\n if (state.configFormMode === \"form\") {\n state.configRaw = serializeConfigForm(base);\n }\n}\n\nexport function removeConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n removePathValue(base, path);\n state.configForm = base;\n state.configFormDirty = true;\n if (state.configFormMode === \"form\") {\n state.configRaw = serializeConfigForm(base);\n }\n}\n","import { toNumber } from \"../format\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n};\n\nexport async function loadCronStatus(state: CronState) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.status\", {})) as CronStatus;\n state.cronStatus = res;\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\nexport async function loadCronJobs(state: CronState) {\n if (!state.client || !state.connected) return;\n if (state.cronLoading) return;\n state.cronLoading = true;\n state.cronError = null;\n try {\n const res = (await state.client.request(\"cron.list\", {\n includeDisabled: true,\n })) as { jobs?: CronJob[] };\n state.cronJobs = Array.isArray(res.jobs) ? res.jobs : [];\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronLoading = false;\n }\n}\n\nexport function buildCronSchedule(form: CronFormState) {\n if (form.scheduleKind === \"at\") {\n const ms = Date.parse(form.scheduleAt);\n if (!Number.isFinite(ms)) throw new Error(\"Invalid run time.\");\n return { kind: \"at\" as const, atMs: ms };\n }\n if (form.scheduleKind === \"every\") {\n const amount = toNumber(form.everyAmount, 0);\n if (amount <= 0) throw new Error(\"Invalid interval amount.\");\n const unit = form.everyUnit;\n const mult = unit === \"minutes\" ? 60_000 : unit === \"hours\" ? 3_600_000 : 86_400_000;\n return { kind: \"every\" as const, everyMs: amount * mult };\n }\n const expr = form.cronExpr.trim();\n if (!expr) throw new Error(\"Cron expression required.\");\n return { kind: \"cron\" as const, expr, tz: form.cronTz.trim() || undefined };\n}\n\nexport function buildCronPayload(form: CronFormState) {\n if (form.payloadKind === \"systemEvent\") {\n const text = form.payloadText.trim();\n if (!text) throw new Error(\"System event text required.\");\n return { kind: \"systemEvent\" as const, text };\n }\n const message = form.payloadText.trim();\n if (!message) throw new Error(\"Agent message required.\");\n const payload: {\n kind: \"agentTurn\";\n message: string;\n deliver?: boolean;\n channel?: string;\n to?: string;\n timeoutSeconds?: number;\n } = { kind: \"agentTurn\", message };\n if (form.deliver) payload.deliver = true;\n if (form.channel) payload.channel = form.channel;\n if (form.to.trim()) payload.to = form.to.trim();\n const timeoutSeconds = toNumber(form.timeoutSeconds, 0);\n if (timeoutSeconds > 0) payload.timeoutSeconds = timeoutSeconds;\n return payload;\n}\n\nexport async function addCronJob(state: CronState) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n const schedule = buildCronSchedule(state.cronForm);\n const payload = buildCronPayload(state.cronForm);\n const agentId = state.cronForm.agentId.trim();\n const job = {\n name: state.cronForm.name.trim(),\n description: state.cronForm.description.trim() || undefined,\n agentId: agentId || undefined,\n enabled: state.cronForm.enabled,\n schedule,\n sessionTarget: state.cronForm.sessionTarget,\n wakeMode: state.cronForm.wakeMode,\n payload,\n isolation:\n state.cronForm.postToMainPrefix.trim() &&\n state.cronForm.sessionTarget === \"isolated\"\n ? { postToMainPrefix: state.cronForm.postToMainPrefix.trim() }\n : undefined,\n };\n if (!job.name) throw new Error(\"Name required.\");\n await state.client.request(\"cron.add\", job);\n state.cronForm = {\n ...state.cronForm,\n name: \"\",\n description: \"\",\n payloadText: \"\",\n };\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function toggleCronJob(\n state: CronState,\n job: CronJob,\n enabled: boolean,\n) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.update\", { id: job.id, patch: { enabled } });\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function runCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.run\", { id: job.id, mode: \"force\" });\n await loadCronRuns(state, job.id);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function removeCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.remove\", { id: job.id });\n if (state.cronRunsJobId === job.id) {\n state.cronRunsJobId = null;\n state.cronRuns = [];\n }\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function loadCronRuns(state: CronState, jobId: string) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.runs\", {\n id: jobId,\n limit: 50,\n })) as { entries?: CronRunLogEntry[] };\n state.cronRunsJobId = jobId;\n state.cronRuns = Array.isArray(res.entries) ? res.entries : [];\n } catch (err) {\n state.cronError = String(err);\n }\n}\n","import type { ChannelsStatusSnapshot } from \"../types\";\nimport type { ChannelsState } from \"./channels.types\";\n\nexport type { ChannelsState };\n\nexport async function loadChannels(state: ChannelsState, probe: boolean) {\n if (!state.client || !state.connected) return;\n if (state.channelsLoading) return;\n state.channelsLoading = true;\n state.channelsError = null;\n try {\n const res = (await state.client.request(\"channels.status\", {\n probe,\n timeoutMs: 8000,\n })) as ChannelsStatusSnapshot;\n state.channelsSnapshot = res;\n state.channelsLastSuccess = Date.now();\n } catch (err) {\n state.channelsError = String(err);\n } finally {\n state.channelsLoading = false;\n }\n}\n\nexport async function startWhatsAppLogin(state: ChannelsState, force: boolean) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.start\", {\n force,\n timeoutMs: 30000,\n })) as { message?: string; qrDataUrl?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginQrDataUrl = res.qrDataUrl ?? null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function waitWhatsAppLogin(state: ChannelsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.wait\", {\n timeoutMs: 120000,\n })) as { connected?: boolean; message?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginConnected = res.connected ?? null;\n if (res.connected) state.whatsappLoginQrDataUrl = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function logoutWhatsApp(state: ChannelsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n await state.client.request(\"channels.logout\", { channel: \"whatsapp\" });\n state.whatsappLoginMessage = \"Logged out.\";\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n } finally {\n state.whatsappBusy = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { HealthSnapshot, StatusSummary } from \"../types\";\n\nexport type DebugState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n};\n\nexport async function loadDebug(state: DebugState) {\n if (!state.client || !state.connected) return;\n if (state.debugLoading) return;\n state.debugLoading = true;\n try {\n const [status, health, models, heartbeat] = await Promise.all([\n state.client.request(\"status\", {}),\n state.client.request(\"health\", {}),\n state.client.request(\"models.list\", {}),\n state.client.request(\"last-heartbeat\", {}),\n ]);\n state.debugStatus = status as StatusSummary;\n state.debugHealth = health as HealthSnapshot;\n const modelPayload = models as { models?: unknown[] } | undefined;\n state.debugModels = Array.isArray(modelPayload?.models)\n ? modelPayload?.models\n : [];\n state.debugHeartbeat = heartbeat as unknown;\n } catch (err) {\n state.debugCallError = String(err);\n } finally {\n state.debugLoading = false;\n }\n}\n\nexport async function callDebugMethod(state: DebugState) {\n if (!state.client || !state.connected) return;\n state.debugCallError = null;\n state.debugCallResult = null;\n try {\n const params = state.debugCallParams.trim()\n ? (JSON.parse(state.debugCallParams) as unknown)\n : {};\n const res = await state.client.request(state.debugCallMethod.trim(), params);\n state.debugCallResult = JSON.stringify(res, null, 2);\n } catch (err) {\n state.debugCallError = String(err);\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\nexport type LogsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n logsLoading: boolean;\n logsError: string | null;\n logsCursor: number | null;\n logsFile: string | null;\n logsEntries: LogEntry[];\n logsTruncated: boolean;\n logsLastFetchAt: number | null;\n logsLimit: number;\n logsMaxBytes: number;\n};\n\nconst LOG_BUFFER_LIMIT = 2000;\nconst LEVELS = new Set<LogLevel>([\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n]);\n\nfunction parseMaybeJsonString(value: unknown) {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) return null;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction normalizeLevel(value: unknown): LogLevel | null {\n if (typeof value !== \"string\") return null;\n const lowered = value.toLowerCase() as LogLevel;\n return LEVELS.has(lowered) ? lowered : null;\n}\n\nexport function parseLogLine(line: string): LogEntry {\n if (!line.trim()) return { raw: line, message: line };\n try {\n const obj = JSON.parse(line) as Record<string, unknown>;\n const meta =\n obj && typeof obj._meta === \"object\" && obj._meta !== null\n ? (obj._meta as Record<string, unknown>)\n : null;\n const time =\n typeof obj.time === \"string\"\n ? obj.time\n : typeof meta?.date === \"string\"\n ? meta?.date\n : null;\n const level = normalizeLevel(meta?.logLevelName ?? meta?.level);\n\n const contextCandidate =\n typeof obj[\"0\"] === \"string\"\n ? (obj[\"0\"] as string)\n : typeof meta?.name === \"string\"\n ? (meta?.name as string)\n : null;\n const contextObj = parseMaybeJsonString(contextCandidate);\n let subsystem: string | null = null;\n if (contextObj) {\n if (typeof contextObj.subsystem === \"string\") subsystem = contextObj.subsystem;\n else if (typeof contextObj.module === \"string\") subsystem = contextObj.module;\n }\n if (!subsystem && contextCandidate && contextCandidate.length < 120) {\n subsystem = contextCandidate;\n }\n\n let message: string | null = null;\n if (typeof obj[\"1\"] === \"string\") message = obj[\"1\"] as string;\n else if (!contextObj && typeof obj[\"0\"] === \"string\") message = obj[\"0\"] as string;\n else if (typeof obj.message === \"string\") message = obj.message as string;\n\n return {\n raw: line,\n time,\n level,\n subsystem,\n message: message ?? line,\n meta: meta ?? undefined,\n };\n } catch {\n return { raw: line, message: line };\n }\n}\n\nexport async function loadLogs(\n state: LogsState,\n opts?: { reset?: boolean; quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.logsLoading && !opts?.quiet) return;\n if (!opts?.quiet) state.logsLoading = true;\n state.logsError = null;\n try {\n const res = await state.client.request(\"logs.tail\", {\n cursor: opts?.reset ? undefined : state.logsCursor ?? undefined,\n limit: state.logsLimit,\n maxBytes: state.logsMaxBytes,\n });\n const payload = res as {\n file?: string;\n cursor?: number;\n size?: number;\n lines?: unknown;\n truncated?: boolean;\n reset?: boolean;\n };\n const lines = Array.isArray(payload.lines)\n ? (payload.lines.filter((line) => typeof line === \"string\") as string[])\n : [];\n const entries = lines.map(parseLogLine);\n const shouldReset = Boolean(opts?.reset || payload.reset || state.logsCursor == null);\n state.logsEntries = shouldReset\n ? entries\n : [...state.logsEntries, ...entries].slice(-LOG_BUFFER_LIMIT);\n if (typeof payload.cursor === \"number\") state.logsCursor = payload.cursor;\n if (typeof payload.file === \"string\") state.logsFile = payload.file;\n state.logsTruncated = Boolean(payload.truncated);\n state.logsLastFetchAt = Date.now();\n } catch (err) {\n state.logsError = String(err);\n } finally {\n if (!opts?.quiet) state.logsLoading = false;\n }\n}\n","/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */\n/**\n * 5KB JS implementation of ed25519 EdDSA signatures.\n * Compliant with RFC8032, FIPS 186-5 & ZIP215.\n * @module\n * @example\n * ```js\nimport * as ed from '@noble/ed25519';\n(async () => {\n const secretKey = ed.utils.randomSecretKey();\n const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);\n const pubKey = await ed.getPublicKeyAsync(secretKey); // Sync methods are also present\n const signature = await ed.signAsync(message, secretKey);\n const isValid = await ed.verifyAsync(signature, message, pubKey);\n})();\n```\n */\n/**\n * Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².\n * * P = `2n**255n - 19n` // field over which calculations are done\n * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points\n * * h = 8 // cofactor\n * * a = `Fp.create(BigInt(-1))` // equation param\n * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param\n * * Gx, Gy are coordinates of Generator / base point\n */\nconst ed25519_CURVE = {\n p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\n n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\n h: 8n,\n a: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,\n d: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\n Gx: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\n Gy: 0x6666666666666666666666666666666666666666666666666666666666666658n,\n};\nconst { p: P, n: N, Gx, Gy, a: _a, d: _d, h } = ed25519_CURVE;\nconst L = 32; // field / group byte length\nconst L2 = 64;\n// Helpers and Precomputes sections are reused between libraries\n// ## Helpers\n// ----------\nconst captureTrace = (...args) => {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n};\nconst err = (message = '') => {\n const e = new Error(message);\n captureTrace(e, err);\n throw e;\n};\nconst isBig = (n) => typeof n === 'bigint'; // is big integer\nconst isStr = (s) => typeof s === 'string'; // is string\nconst isBytes = (a) => a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n/** Asserts something is Uint8Array. */\nconst abytes = (value, length, title = '') => {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n err(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n};\n/** create Uint8Array */\nconst u8n = (len) => new Uint8Array(len);\nconst u8fr = (buf) => Uint8Array.from(buf);\nconst padh = (n, pad) => n.toString(16).padStart(pad, '0');\nconst bytesToHex = (b) => Array.from(abytes(b))\n .map((e) => padh(e, 2))\n .join('');\nconst C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters\nconst _ch = (ch) => {\n if (ch >= C._0 && ch <= C._9)\n return ch - C._0; // '2' => 50-48\n if (ch >= C.A && ch <= C.F)\n return ch - (C.A - 10); // 'B' => 66-(65-10)\n if (ch >= C.a && ch <= C.f)\n return ch - (C.a - 10); // 'b' => 98-(97-10)\n return;\n};\nconst hexToBytes = (hex) => {\n const e = 'hex invalid';\n if (!isStr(hex))\n return err(e);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n return err(e);\n const array = u8n(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n // treat each char as ASCII\n const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined)\n return err(e);\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n};\nconst cr = () => globalThis?.crypto; // WebCrypto is available in all modern environments\nconst subtle = () => cr()?.subtle ?? err('crypto.subtle must be defined, consider polyfill');\n// prettier-ignore\nconst concatBytes = (...arrs) => {\n const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0)); // create u8a of summed length\n let pad = 0; // walk through each array,\n arrs.forEach(a => { r.set(a, pad); pad += a.length; }); // ensure they have proper type\n return r;\n};\n/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */\nconst randomBytes = (len = L) => {\n const c = cr();\n return c.getRandomValues(u8n(len));\n};\nconst big = BigInt;\nconst assertRange = (n, min, max, msg = 'bad number: out of range') => (isBig(n) && min <= n && n < max ? n : err(msg));\n/** modular division */\nconst M = (a, b = P) => {\n const r = a % b;\n return r >= 0n ? r : b + r;\n};\nconst modN = (a) => M(a, N);\n/** Modular inversion using euclidean GCD (non-CT). No negative exponent for now. */\n// prettier-ignore\nconst invert = (num, md) => {\n if (num === 0n || md <= 0n)\n err('no inverse n=' + num + ' mod=' + md);\n let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;\n while (a !== 0n) {\n const q = b / a, r = b % a;\n const m = x - u * q, n = y - v * q;\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point\n};\nconst callHash = (name) => {\n // @ts-ignore\n const fn = hashes[name];\n if (typeof fn !== 'function')\n err('hashes.' + name + ' not set');\n return fn;\n};\nconst hash = (msg) => callHash('sha512')(msg);\nconst apoint = (p) => (p instanceof Point ? p : err('Point expected'));\n// ## End of Helpers\n// -----------------\nconst B256 = 2n ** 256n;\n/** Point in XYZT extended coordinates. */\nclass Point {\n static BASE;\n static ZERO;\n X;\n Y;\n Z;\n T;\n constructor(X, Y, Z, T) {\n const max = B256;\n this.X = assertRange(X, 0n, max);\n this.Y = assertRange(Y, 0n, max);\n this.Z = assertRange(Z, 1n, max);\n this.T = assertRange(T, 0n, max);\n Object.freeze(this);\n }\n static CURVE() {\n return ed25519_CURVE;\n }\n static fromAffine(p) {\n return new Point(p.x, p.y, 1n, M(p.x * p.y));\n }\n /** RFC8032 5.1.3: Uint8Array to Point. */\n static fromBytes(hex, zip215 = false) {\n const d = _d;\n // Copy array to not mess it up.\n const normed = u8fr(abytes(hex, L));\n // adjust first LE byte = last BE byte\n const lastByte = hex[31];\n normed[31] = lastByte & ~0x80;\n const y = bytesToNumLE(normed);\n // zip215=true: 0 <= y < 2^256\n // zip215=false, RFC8032: 0 <= y < 2^255-19\n const max = zip215 ? B256 : P;\n assertRange(y, 0n, max);\n const y2 = M(y * y); // y²\n const u = M(y2 - 1n); // u=y²-1\n const v = M(d * y2 + 1n); // v=dy²+1\n let { isValid, value: x } = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (!isValid)\n err('bad point: y not sqrt'); // not square root: bad point\n const isXOdd = (x & 1n) === 1n; // adjust sign of x coordinate\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === 0n && isLastByteOdd)\n err('bad point: x==0, isLastByteOdd'); // x=0, x_0=1\n if (isLastByteOdd !== isXOdd)\n x = M(-x);\n return new Point(x, y, 1n, M(x * y)); // Z=1, T=xy\n }\n static fromHex(hex, zip215) {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /** Checks if the point is valid and on-curve. */\n assertValidity() {\n const a = _a;\n const d = _d;\n const p = this;\n if (p.is0())\n return err('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = M(X * X); // X²\n const Y2 = M(Y * Y); // Y²\n const Z2 = M(Z * Z); // Z²\n const Z4 = M(Z2 * Z2); // Z⁴\n const aX2 = M(X2 * a); // aX²\n const left = M(Z2 * M(aX2 + Y2)); // (aX² + Y²)Z²\n const right = M(Z4 + M(d * M(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right)\n return err('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = M(X * Y);\n const ZT = M(Z * T);\n if (XY !== ZT)\n return err('bad point: equation left != right (2)');\n return this;\n }\n /** Equality check: compare points P&Q. */\n equals(other) {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality\n const X1Z2 = M(X1 * Z2);\n const X2Z1 = M(X2 * Z1);\n const Y1Z2 = M(Y1 * Z2);\n const Y2Z1 = M(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(I);\n }\n /** Flip point over y coordinate. */\n negate() {\n return new Point(M(-this.X), this.Y, this.Z, M(-this.T));\n }\n /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */\n double() {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const a = _a;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n const A = M(X1 * X1);\n const B = M(Y1 * Y1);\n const C = M(2n * M(Z1 * Z1));\n const D = M(a * A);\n const x1y1 = X1 + Y1;\n const E = M(M(x1y1 * x1y1) - A - B);\n const G = D + B;\n const F = G - C;\n const H = D - B;\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */\n add(other) {\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = apoint(other); // doesn't check if other on-curve\n const a = _a;\n const d = _d;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3\n const A = M(X1 * X2);\n const B = M(Y1 * Y2);\n const C = M(T1 * d * T2);\n const D = M(Z1 * Z2);\n const E = M((X1 + Y1) * (X2 + Y2) - A - B);\n const F = M(D - C);\n const G = M(D + C);\n const H = M(B - a * A);\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(apoint(other).negate());\n }\n /**\n * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.\n * Uses {@link wNAF} for base point.\n * Uses fake point to mitigate side-channel leakage.\n * @param n scalar by which point is multiplied\n * @param safe safe mode guards against timing attacks; unsafe mode is faster\n */\n multiply(n, safe = true) {\n if (!safe && (n === 0n || this.is0()))\n return I;\n assertRange(n, 1n, N);\n if (n === 1n)\n return this;\n if (this.equals(G))\n return wNAF(n).p;\n // init result point & fake point\n let p = I;\n let f = G;\n for (let d = this; n > 0n; d = d.double(), n >>= 1n) {\n // if bit is present, add to point\n // if not present, add to fake, for timing safety\n if (n & 1n)\n p = p.add(d);\n else if (safe)\n f = f.add(d);\n }\n return p;\n }\n multiplyUnsafe(scalar) {\n return this.multiply(scalar, false);\n }\n /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */\n toAffine() {\n const { X, Y, Z } = this;\n // fast-paths for ZERO point OR Z=1\n if (this.equals(I))\n return { x: 0n, y: 1n };\n const iz = invert(Z, P);\n // (Z * Z^-1) must be 1, otherwise bad math\n if (M(Z * iz) !== 1n)\n err('invalid inverse');\n // x = X*Z^-1; y = Y*Z^-1\n const x = M(X * iz);\n const y = M(Y * iz);\n return { x, y };\n }\n toBytes() {\n const { x, y } = this.assertValidity().toAffine();\n const b = numTo32bLE(y);\n // store sign in first LE byte\n b[31] |= x & 1n ? 0x80 : 0;\n return b;\n }\n toHex() {\n return bytesToHex(this.toBytes());\n }\n clearCofactor() {\n return this.multiply(big(h), false);\n }\n isSmallOrder() {\n return this.clearCofactor().is0();\n }\n isTorsionFree() {\n // Multiply by big number N. We can't `mul(N)` because of checks. Instead, we `mul(N/2)*2+1`\n let p = this.multiply(N / 2n, false).double();\n if (N % 2n)\n p = p.add(this);\n return p.is0();\n }\n}\n/** Generator / base point */\nconst G = new Point(Gx, Gy, 1n, M(Gx * Gy));\n/** Identity / zero point */\nconst I = new Point(0n, 1n, 1n, 0n);\n// Static aliases\nPoint.BASE = G;\nPoint.ZERO = I;\nconst numTo32bLE = (num) => hexToBytes(padh(assertRange(num, 0n, B256), L2)).reverse();\nconst bytesToNumLE = (b) => big('0x' + bytesToHex(u8fr(abytes(b)).reverse()));\nconst pow2 = (x, power) => {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n};\n// prettier-ignore\nconst pow_2_252_3 = (x) => {\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n};\nconst RM1 = 0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n; // √-1\n// for sqrt comp\n// prettier-ignore\nconst uvRatio = (u, v) => {\n const v3 = M(v * v * v); // v³\n const v7 = M(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7).pow_p_5_8; // (uv⁷)^(p-5)/8\n let x = M(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = M(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = M(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === M(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === M(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((M(x) & 1n) === 1n)\n x = M(-x); // edIsNegative\n return { isValid: useRoot1 || useRoot2, value: x };\n};\n// N == L, just weird naming\nconst modL_LE = (hash) => modN(bytesToNumLE(hash)); // modulo L; but little-endian\n/** hashes.sha512 should conform to the interface. */\n// TODO: rename\nconst sha512a = (...m) => hashes.sha512Async(concatBytes(...m)); // Async SHA512\nconst sha512s = (...m) => callHash('sha512')(concatBytes(...m));\n// RFC8032 5.1.5\nconst hash2extK = (hashed) => {\n // slice creates a copy, unlike subarray\n const head = hashed.slice(0, L);\n head[0] &= 248; // Clamp bits: 0b1111_1000\n head[31] &= 127; // 0b0111_1111\n head[31] |= 64; // 0b0100_0000\n const prefix = hashed.slice(L, L2); // secret key \"prefix\"\n const scalar = modL_LE(head); // modular division over curve order\n const point = G.multiply(scalar); // public key point\n const pointBytes = point.toBytes(); // point serialized to Uint8Array\n return { head, prefix, scalar, point, pointBytes };\n};\n// RFC8032 5.1.5; getPublicKey async, sync. Hash priv key and extract point.\nconst getExtendedPublicKeyAsync = (secretKey) => sha512a(abytes(secretKey, L)).then(hash2extK);\nconst getExtendedPublicKey = (secretKey) => hash2extK(sha512s(abytes(secretKey, L)));\n/** Creates 32-byte ed25519 public key from 32-byte secret key. Async. */\nconst getPublicKeyAsync = (secretKey) => getExtendedPublicKeyAsync(secretKey).then((p) => p.pointBytes);\n/** Creates 32-byte ed25519 public key from 32-byte secret key. To use, set `hashes.sha512` first. */\nconst getPublicKey = (priv) => getExtendedPublicKey(priv).pointBytes;\nconst hashFinishA = (res) => sha512a(res.hashable).then(res.finish);\nconst hashFinishS = (res) => res.finish(sha512s(res.hashable));\n// Code, shared between sync & async sign\nconst _sign = (e, rBytes, msg) => {\n const { pointBytes: P, scalar: s } = e;\n const r = modL_LE(rBytes); // r was created outside, reduce it modulo L\n const R = G.multiply(r).toBytes(); // R = [r]B\n const hashable = concatBytes(R, P, msg); // dom2(F, C) || R || A || PH(M)\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n const S = modN(r + modL_LE(hashed) * s); // S = (r + k * s) mod L; 0 <= s < l\n return abytes(concatBytes(R, numTo32bLE(S)), L2); // 64-byte sig: 32b R.x + 32b LE(S)\n };\n return { hashable, finish };\n};\n/**\n * Signs message using secret key. Async.\n * Follows RFC8032 5.1.6.\n */\nconst signAsync = async (message, secretKey) => {\n const m = abytes(message);\n const e = await getExtendedPublicKeyAsync(secretKey);\n const rBytes = await sha512a(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishA(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\n/**\n * Signs message using secret key. To use, set `hashes.sha512` first.\n * Follows RFC8032 5.1.6.\n */\nconst sign = (message, secretKey) => {\n const m = abytes(message);\n const e = getExtendedPublicKey(secretKey);\n const rBytes = sha512s(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishS(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\nconst defaultVerifyOpts = { zip215: true };\nconst _verify = (sig, msg, pub, opts = defaultVerifyOpts) => {\n sig = abytes(sig, L2); // Signature hex str/Bytes, must be 64 bytes\n msg = abytes(msg); // Message hex str/Bytes\n pub = abytes(pub, L);\n const { zip215 } = opts; // switch between zip215 and rfc8032 verif\n let A;\n let R;\n let s;\n let SB;\n let hashable = Uint8Array.of();\n try {\n A = Point.fromBytes(pub, zip215); // public key A decoded\n R = Point.fromBytes(sig.slice(0, L), zip215); // 0 <= R < 2^256: ZIP215 R can be >= P\n s = bytesToNumLE(sig.slice(L, L2)); // Decode second half as an integer S\n SB = G.multiply(s, false); // in the range 0 <= s < L\n hashable = concatBytes(R.toBytes(), A.toBytes(), msg); // dom2(F, C) || R || A || PH(M)\n }\n catch (error) { }\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n if (SB == null)\n return false; // false if try-catch catched an error\n if (!zip215 && A.isSmallOrder())\n return false; // false for SBS: Strongly Binding Signature\n const k = modL_LE(hashed); // decode in little-endian, modulo L\n const RkA = R.add(A.multiply(k, false)); // [8]R + [8][k]A'\n return RkA.add(SB.negate()).clearCofactor().is0(); // [8][S]B = [8]R + [8][k]A'\n };\n return { hashable, finish };\n};\n/** Verifies signature on message and public key. Async. Follows RFC8032 5.1.7. */\nconst verifyAsync = async (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishA(_verify(signature, message, publicKey, opts));\n/** Verifies signature on message and public key. To use, set `hashes.sha512` first. Follows RFC8032 5.1.7. */\nconst verify = (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishS(_verify(signature, message, publicKey, opts));\n/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */\nconst etc = {\n bytesToHex: bytesToHex,\n hexToBytes: hexToBytes,\n concatBytes: concatBytes,\n mod: M,\n invert: invert,\n randomBytes: randomBytes,\n};\nconst hashes = {\n sha512Async: async (message) => {\n const s = subtle();\n const m = concatBytes(message);\n return u8n(await s.digest('SHA-512', m.buffer));\n },\n sha512: undefined,\n};\n// FIPS 186 B.4.1 compliant key generation produces private keys\n// with modulo bias being neglible. takes >N+16 bytes, returns (hash mod n-1)+1\nconst randomSecretKey = (seed = randomBytes(L)) => seed;\nconst keygen = (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = getPublicKey(secretKey);\n return { secretKey, publicKey };\n};\nconst keygenAsync = async (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = await getPublicKeyAsync(secretKey);\n return { secretKey, publicKey };\n};\n/** ed25519-specific key utilities. */\nconst utils = {\n getExtendedPublicKeyAsync: getExtendedPublicKeyAsync,\n getExtendedPublicKey: getExtendedPublicKey,\n randomSecretKey: randomSecretKey,\n};\n// ## Precomputes\n// --------------\nconst W = 8; // W is window size\nconst scalarBits = 256;\nconst pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop\nconst pwindowSize = 2 ** (W - 1); // 128 for W=8\nconst precompute = () => {\n const points = [];\n let p = G;\n let b = p;\n for (let w = 0; w < pwindows; w++) {\n b = p;\n points.push(b);\n for (let i = 1; i < pwindowSize; i++) {\n b = b.add(p);\n points.push(b);\n } // i=1, bc we skip 0\n p = b.double();\n }\n return points;\n};\nlet Gpows = undefined; // precomputes for base point G\n// const-time negate\nconst ctneg = (cnd, p) => {\n const n = p.negate();\n return cnd ? n : p;\n};\n/**\n * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by\n * caching multiples of G (base point). Cache is stored in 32MB of RAM.\n * Any time `G.multiply` is done, precomputes are used.\n * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.\n *\n * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,\n * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.\n *\n * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().\n */\nconst wNAF = (n) => {\n const comp = Gpows || (Gpows = precompute());\n let p = I;\n let f = G; // f must be G, or could become I in the end\n const pow_2_w = 2 ** W; // 256 for W=8\n const maxNum = pow_2_w; // 256 for W=8\n const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111\n const shiftBy = big(W); // 8 for W=8\n for (let w = 0; w < pwindows; w++) {\n let wbits = Number(n & mask); // extract W bits.\n n >>= shiftBy; // shift number by W bits.\n // We use negative indexes to reduce size of precomputed table by 2x.\n // Instead of needing precomputes 0..256, we only calculate them for 0..128.\n // If an index > 128 is found, we do (256-index) - where 256 is next window.\n // Naive: index +127 => 127, +224 => 224\n // Optimized: index +127 => 127, +224 => 256-32\n if (wbits > pwindowSize) {\n wbits -= maxNum;\n n += 1n;\n }\n const off = w * pwindowSize;\n const offF = off; // offsets, evaluate both\n const offP = off + Math.abs(wbits) - 1;\n const isEven = w % 2 !== 0; // conditions, evaluate both\n const isNeg = wbits < 0;\n if (wbits === 0) {\n // off == I: can't add it. Adding random offF instead.\n f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point\n }\n else {\n p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point\n }\n }\n if (n !== 0n)\n err('invalid wnaf');\n return { p, f }; // return both real and fake points for JIT\n};\n// !! Remove the export to easily use in REPL / browser console\nexport { etc, getPublicKey, getPublicKeyAsync, hash, hashes, keygen, keygenAsync, Point, sign, signAsync, utils, verify, verifyAsync, };\n","import { getPublicKeyAsync, signAsync, utils } from \"@noble/ed25519\";\n\ntype StoredIdentity = {\n version: 1;\n deviceId: string;\n publicKey: string;\n privateKey: string;\n createdAtMs: number;\n};\n\nexport type DeviceIdentity = {\n deviceId: string;\n publicKey: string;\n privateKey: string;\n};\n\nconst STORAGE_KEY = \"poolbot-device-identity-v1\";\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/g, \"\");\n}\n\nfunction base64UrlDecode(input: string): Uint8Array {\n const normalized = input.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n const binary = atob(padded);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) out[i] = binary.charCodeAt(i);\n return out;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nasync function fingerprintPublicKey(publicKey: Uint8Array): Promise<string> {\n const hash = await crypto.subtle.digest(\"SHA-256\", publicKey);\n return bytesToHex(new Uint8Array(hash));\n}\n\nasync function generateIdentity(): Promise<DeviceIdentity> {\n const privateKey = utils.randomSecretKey();\n const publicKey = await getPublicKeyAsync(privateKey);\n const deviceId = await fingerprintPublicKey(publicKey);\n return {\n deviceId,\n publicKey: base64UrlEncode(publicKey),\n privateKey: base64UrlEncode(privateKey),\n };\n}\n\nexport async function loadOrCreateDeviceIdentity(): Promise<DeviceIdentity> {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as StoredIdentity;\n if (\n parsed?.version === 1 &&\n typeof parsed.deviceId === \"string\" &&\n typeof parsed.publicKey === \"string\" &&\n typeof parsed.privateKey === \"string\"\n ) {\n const derivedId = await fingerprintPublicKey(base64UrlDecode(parsed.publicKey));\n if (derivedId !== parsed.deviceId) {\n const updated: StoredIdentity = {\n ...parsed,\n deviceId: derivedId,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n return {\n deviceId: derivedId,\n publicKey: parsed.publicKey,\n privateKey: parsed.privateKey,\n };\n }\n return {\n deviceId: parsed.deviceId,\n publicKey: parsed.publicKey,\n privateKey: parsed.privateKey,\n };\n }\n }\n } catch {\n // fall through to regenerate\n }\n\n const identity = await generateIdentity();\n const stored: StoredIdentity = {\n version: 1,\n deviceId: identity.deviceId,\n publicKey: identity.publicKey,\n privateKey: identity.privateKey,\n createdAtMs: Date.now(),\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n return identity;\n}\n\nexport async function signDevicePayload(privateKeyBase64Url: string, payload: string) {\n const key = base64UrlDecode(privateKeyBase64Url);\n const data = new TextEncoder().encode(payload);\n const sig = await signAsync(data, key);\n return base64UrlEncode(sig);\n}\n","export type DeviceAuthEntry = {\n token: string;\n role: string;\n scopes: string[];\n updatedAtMs: number;\n};\n\ntype DeviceAuthStore = {\n version: 1;\n deviceId: string;\n tokens: Record<string, DeviceAuthEntry>;\n};\n\nconst STORAGE_KEY = \"poolbot.device.auth.v1\";\n\nfunction normalizeRole(role: string): string {\n return role.trim();\n}\n\nfunction normalizeScopes(scopes: string[] | undefined): string[] {\n if (!Array.isArray(scopes)) return [];\n const out = new Set<string>();\n for (const scope of scopes) {\n const trimmed = scope.trim();\n if (trimmed) out.add(trimmed);\n }\n return [...out].sort();\n}\n\nfunction readStore(): DeviceAuthStore | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as DeviceAuthStore;\n if (!parsed || parsed.version !== 1) return null;\n if (!parsed.deviceId || typeof parsed.deviceId !== \"string\") return null;\n if (!parsed.tokens || typeof parsed.tokens !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStore(store: DeviceAuthStore) {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(store));\n } catch {\n // best-effort\n }\n}\n\nexport function loadDeviceAuthToken(params: {\n deviceId: string;\n role: string;\n}): DeviceAuthEntry | null {\n const store = readStore();\n if (!store || store.deviceId !== params.deviceId) return null;\n const role = normalizeRole(params.role);\n const entry = store.tokens[role];\n if (!entry || typeof entry.token !== \"string\") return null;\n return entry;\n}\n\nexport function storeDeviceAuthToken(params: {\n deviceId: string;\n role: string;\n token: string;\n scopes?: string[];\n}): DeviceAuthEntry {\n const role = normalizeRole(params.role);\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: params.deviceId,\n tokens: {},\n };\n const existing = readStore();\n if (existing && existing.deviceId === params.deviceId) {\n next.tokens = { ...existing.tokens };\n }\n const entry: DeviceAuthEntry = {\n token: params.token,\n role,\n scopes: normalizeScopes(params.scopes),\n updatedAtMs: Date.now(),\n };\n next.tokens[role] = entry;\n writeStore(next);\n return entry;\n}\n\nexport function clearDeviceAuthToken(params: { deviceId: string; role: string }) {\n const store = readStore();\n if (!store || store.deviceId !== params.deviceId) return;\n const role = normalizeRole(params.role);\n if (!store.tokens[role]) return;\n const next = { ...store, tokens: { ...store.tokens } };\n delete next.tokens[role];\n writeStore(next);\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { loadOrCreateDeviceIdentity } from \"../device-identity\";\nimport { clearDeviceAuthToken, storeDeviceAuthToken } from \"../device-auth\";\n\nexport type DeviceTokenSummary = {\n role: string;\n scopes?: string[];\n createdAtMs?: number;\n rotatedAtMs?: number;\n revokedAtMs?: number;\n lastUsedAtMs?: number;\n};\n\nexport type PendingDevice = {\n requestId: string;\n deviceId: string;\n displayName?: string;\n role?: string;\n remoteIp?: string;\n isRepair?: boolean;\n ts?: number;\n};\n\nexport type PairedDevice = {\n deviceId: string;\n displayName?: string;\n roles?: string[];\n scopes?: string[];\n remoteIp?: string;\n tokens?: DeviceTokenSummary[];\n createdAtMs?: number;\n approvedAtMs?: number;\n};\n\nexport type DevicePairingList = {\n pending: PendingDevice[];\n paired: PairedDevice[];\n};\n\nexport type DevicesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n devicesLoading: boolean;\n devicesError: string | null;\n devicesList: DevicePairingList | null;\n};\n\nexport async function loadDevices(state: DevicesState, opts?: { quiet?: boolean }) {\n if (!state.client || !state.connected) return;\n if (state.devicesLoading) return;\n state.devicesLoading = true;\n if (!opts?.quiet) state.devicesError = null;\n try {\n const res = (await state.client.request(\"device.pair.list\", {})) as DevicePairingList | null;\n state.devicesList = {\n pending: Array.isArray(res?.pending) ? res!.pending : [],\n paired: Array.isArray(res?.paired) ? res!.paired : [],\n };\n } catch (err) {\n if (!opts?.quiet) state.devicesError = String(err);\n } finally {\n state.devicesLoading = false;\n }\n}\n\nexport async function approveDevicePairing(state: DevicesState, requestId: string) {\n if (!state.client || !state.connected) return;\n try {\n await state.client.request(\"device.pair.approve\", { requestId });\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function rejectDevicePairing(state: DevicesState, requestId: string) {\n if (!state.client || !state.connected) return;\n const confirmed = window.confirm(\"Reject this device pairing request?\");\n if (!confirmed) return;\n try {\n await state.client.request(\"device.pair.reject\", { requestId });\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function rotateDeviceToken(\n state: DevicesState,\n params: { deviceId: string; role: string; scopes?: string[] },\n) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"device.token.rotate\", params)) as\n | { token?: string; role?: string; deviceId?: string; scopes?: string[] }\n | undefined;\n if (res?.token) {\n const identity = await loadOrCreateDeviceIdentity();\n const role = res.role ?? params.role;\n if (res.deviceId === identity.deviceId || params.deviceId === identity.deviceId) {\n storeDeviceAuthToken({\n deviceId: identity.deviceId,\n role,\n token: res.token,\n scopes: res.scopes ?? params.scopes ?? [],\n });\n }\n window.prompt(\"New device token (copy and store securely):\", res.token);\n }\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function revokeDeviceToken(\n state: DevicesState,\n params: { deviceId: string; role: string },\n) {\n if (!state.client || !state.connected) return;\n const confirmed = window.confirm(\n `Revoke token for ${params.deviceId} (${params.role})?`,\n );\n if (!confirmed) return;\n try {\n await state.client.request(\"device.token.revoke\", params);\n const identity = await loadOrCreateDeviceIdentity();\n if (params.deviceId === identity.deviceId) {\n clearDeviceAuthToken({ deviceId: identity.deviceId, role: params.role });\n }\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type NodesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n lastError: string | null;\n};\n\nexport async function loadNodes(\n state: NodesState,\n opts?: { quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.nodesLoading) return;\n state.nodesLoading = true;\n if (!opts?.quiet) state.lastError = null;\n try {\n const res = (await state.client.request(\"node.list\", {})) as {\n nodes?: Array<Record<string, unknown>>;\n };\n state.nodes = Array.isArray(res.nodes) ? res.nodes : [];\n } catch (err) {\n if (!opts?.quiet) state.lastError = String(err);\n } finally {\n state.nodesLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { cloneConfigObject, removePathValue, setPathValue } from \"./config/form-utils\";\n\nexport type ExecApprovalsDefaults = {\n security?: string;\n ask?: string;\n askFallback?: string;\n autoAllowSkills?: boolean;\n};\n\nexport type ExecApprovalsAllowlistEntry = {\n id?: string;\n pattern: string;\n lastUsedAt?: number;\n lastUsedCommand?: string;\n lastResolvedPath?: string;\n};\n\nexport type ExecApprovalsAgent = ExecApprovalsDefaults & {\n allowlist?: ExecApprovalsAllowlistEntry[];\n};\n\nexport type ExecApprovalsFile = {\n version?: number;\n socket?: { path?: string };\n defaults?: ExecApprovalsDefaults;\n agents?: Record<string, ExecApprovalsAgent>;\n};\n\nexport type ExecApprovalsSnapshot = {\n path: string;\n exists: boolean;\n hash: string;\n file: ExecApprovalsFile;\n};\n\nexport type ExecApprovalsTarget =\n | { kind: \"gateway\" }\n | { kind: \"node\"; nodeId: string };\n\nexport type ExecApprovalsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n execApprovalsLoading: boolean;\n execApprovalsSaving: boolean;\n execApprovalsDirty: boolean;\n execApprovalsSnapshot: ExecApprovalsSnapshot | null;\n execApprovalsForm: ExecApprovalsFile | null;\n execApprovalsSelectedAgent: string | null;\n lastError: string | null;\n};\n\nfunction resolveExecApprovalsRpc(target?: ExecApprovalsTarget | null): {\n method: string;\n params: Record<string, unknown>;\n} | null {\n if (!target || target.kind === \"gateway\") {\n return { method: \"exec.approvals.get\", params: {} };\n }\n const nodeId = target.nodeId.trim();\n if (!nodeId) return null;\n return { method: \"exec.approvals.node.get\", params: { nodeId } };\n}\n\nfunction resolveExecApprovalsSaveRpc(\n target: ExecApprovalsTarget | null | undefined,\n params: { file: ExecApprovalsFile; baseHash: string },\n): { method: string; params: Record<string, unknown> } | null {\n if (!target || target.kind === \"gateway\") {\n return { method: \"exec.approvals.set\", params };\n }\n const nodeId = target.nodeId.trim();\n if (!nodeId) return null;\n return { method: \"exec.approvals.node.set\", params: { ...params, nodeId } };\n}\n\nexport async function loadExecApprovals(\n state: ExecApprovalsState,\n target?: ExecApprovalsTarget | null,\n) {\n if (!state.client || !state.connected) return;\n if (state.execApprovalsLoading) return;\n state.execApprovalsLoading = true;\n state.lastError = null;\n try {\n const rpc = resolveExecApprovalsRpc(target);\n if (!rpc) {\n state.lastError = \"Select a node before loading exec approvals.\";\n return;\n }\n const res = (await state.client.request(rpc.method, rpc.params)) as ExecApprovalsSnapshot;\n applyExecApprovalsSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.execApprovalsLoading = false;\n }\n}\n\nexport function applyExecApprovalsSnapshot(\n state: ExecApprovalsState,\n snapshot: ExecApprovalsSnapshot,\n) {\n state.execApprovalsSnapshot = snapshot;\n if (!state.execApprovalsDirty) {\n state.execApprovalsForm = cloneConfigObject(snapshot.file ?? {});\n }\n}\n\nexport async function saveExecApprovals(\n state: ExecApprovalsState,\n target?: ExecApprovalsTarget | null,\n) {\n if (!state.client || !state.connected) return;\n state.execApprovalsSaving = true;\n state.lastError = null;\n try {\n const baseHash = state.execApprovalsSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Exec approvals hash missing; reload and retry.\";\n return;\n }\n const file =\n state.execApprovalsForm ??\n state.execApprovalsSnapshot?.file ??\n {};\n const rpc = resolveExecApprovalsSaveRpc(target, { file, baseHash });\n if (!rpc) {\n state.lastError = \"Select a node before saving exec approvals.\";\n return;\n }\n await state.client.request(rpc.method, rpc.params);\n state.execApprovalsDirty = false;\n await loadExecApprovals(state, target);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.execApprovalsSaving = false;\n }\n}\n\nexport function updateExecApprovalsFormValue(\n state: ExecApprovalsState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(\n state.execApprovalsForm ?? state.execApprovalsSnapshot?.file ?? {},\n );\n setPathValue(base, path, value);\n state.execApprovalsForm = base;\n state.execApprovalsDirty = true;\n}\n\nexport function removeExecApprovalsFormValue(\n state: ExecApprovalsState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(\n state.execApprovalsForm ?? state.execApprovalsSnapshot?.file ?? {},\n );\n removePathValue(base, path);\n state.execApprovalsForm = base;\n state.execApprovalsDirty = true;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type PresenceState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n};\n\nexport async function loadPresence(state: PresenceState) {\n if (!state.client || !state.connected) return;\n if (state.presenceLoading) return;\n state.presenceLoading = true;\n state.presenceError = null;\n state.presenceStatus = null;\n try {\n const res = (await state.client.request(\"system-presence\", {})) as\n | PresenceEntry[]\n | undefined;\n if (Array.isArray(res)) {\n state.presenceEntries = res;\n state.presenceStatus = res.length === 0 ? \"No instances yet.\" : null;\n } else {\n state.presenceEntries = [];\n state.presenceStatus = \"No presence payload.\";\n }\n } catch (err) {\n state.presenceError = String(err);\n } finally {\n state.presenceLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { SkillStatusReport } from \"../types\";\n\nexport type SkillsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsBusyKey: string | null;\n skillEdits: Record<string, string>;\n skillMessages: SkillMessageMap;\n};\n\nexport type SkillMessage = {\n kind: \"success\" | \"error\";\n message: string;\n};\n\nexport type SkillMessageMap = Record<string, SkillMessage>;\n\ntype LoadSkillsOptions = {\n clearMessages?: boolean;\n};\n\nfunction setSkillMessage(state: SkillsState, key: string, message?: SkillMessage) {\n if (!key.trim()) return;\n const next = { ...state.skillMessages };\n if (message) next[key] = message;\n else delete next[key];\n state.skillMessages = next;\n}\n\nfunction getErrorMessage(err: unknown) {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport async function loadSkills(state: SkillsState, options?: LoadSkillsOptions) {\n if (options?.clearMessages && Object.keys(state.skillMessages).length > 0) {\n state.skillMessages = {};\n }\n if (!state.client || !state.connected) return;\n if (state.skillsLoading) return;\n state.skillsLoading = true;\n state.skillsError = null;\n try {\n const res = (await state.client.request(\"skills.status\", {})) as\n | SkillStatusReport\n | undefined;\n if (res) state.skillsReport = res;\n } catch (err) {\n state.skillsError = getErrorMessage(err);\n } finally {\n state.skillsLoading = false;\n }\n}\n\nexport function updateSkillEdit(\n state: SkillsState,\n skillKey: string,\n value: string,\n) {\n state.skillEdits = { ...state.skillEdits, [skillKey]: value };\n}\n\nexport async function updateSkillEnabled(\n state: SkillsState,\n skillKey: string,\n enabled: boolean,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.update\", { skillKey, enabled });\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: enabled ? \"Skill enabled\" : \"Skill disabled\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function saveSkillApiKey(state: SkillsState, skillKey: string) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const apiKey = state.skillEdits[skillKey] ?? \"\";\n await state.client.request(\"skills.update\", { skillKey, apiKey });\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: \"API key saved\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function installSkill(\n state: SkillsState,\n skillKey: string,\n name: string,\n installId: string,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const result = (await state.client.request(\"skills.install\", {\n name,\n installId,\n timeoutMs: 120000,\n })) as { ok?: boolean; message?: string };\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: result?.message ?? \"Installed\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n","export type ThemeMode = \"system\" | \"light\" | \"dark\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport function getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"dark\";\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function resolveTheme(mode: ThemeMode): ResolvedTheme {\n if (mode === \"system\") return getSystemTheme();\n return mode;\n}\n","import type { ThemeMode } from \"./theme\";\n\nexport type ThemeTransitionContext = {\n element?: HTMLElement | null;\n pointerClientX?: number;\n pointerClientY?: number;\n};\n\nexport type ThemeTransitionOptions = {\n nextTheme: ThemeMode;\n applyTheme: () => void;\n context?: ThemeTransitionContext;\n currentTheme?: ThemeMode | null;\n};\n\ntype DocumentWithViewTransition = Document & {\n startViewTransition?: (callback: () => void) => { finished: Promise<void> };\n};\n\nconst clamp01 = (value: number) => {\n if (Number.isNaN(value)) return 0.5;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n};\n\nconst hasReducedMotionPreference = () => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n};\n\nconst cleanupThemeTransition = (root: HTMLElement) => {\n root.classList.remove(\"theme-transition\");\n root.style.removeProperty(\"--theme-switch-x\");\n root.style.removeProperty(\"--theme-switch-y\");\n};\n\nexport const startThemeTransition = ({\n nextTheme,\n applyTheme,\n context,\n currentTheme,\n}: ThemeTransitionOptions) => {\n if (currentTheme === nextTheme) return;\n\n const documentReference = globalThis.document ?? null;\n if (!documentReference) {\n applyTheme();\n return;\n }\n\n const root = documentReference.documentElement;\n const document_ = documentReference as DocumentWithViewTransition;\n const prefersReducedMotion = hasReducedMotionPreference();\n\n const canUseViewTransition =\n Boolean(document_.startViewTransition) && !prefersReducedMotion;\n\n if (canUseViewTransition) {\n let xPercent = 0.5;\n let yPercent = 0.5;\n\n if (\n context?.pointerClientX !== undefined &&\n context?.pointerClientY !== undefined &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01(context.pointerClientX / window.innerWidth);\n yPercent = clamp01(context.pointerClientY / window.innerHeight);\n } else if (context?.element) {\n const rect = context.element.getBoundingClientRect();\n if (\n rect.width > 0 &&\n rect.height > 0 &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01((rect.left + rect.width / 2) / window.innerWidth);\n yPercent = clamp01((rect.top + rect.height / 2) / window.innerHeight);\n }\n }\n\n root.style.setProperty(\"--theme-switch-x\", `${xPercent * 100}%`);\n root.style.setProperty(\"--theme-switch-y\", `${yPercent * 100}%`);\n root.classList.add(\"theme-transition\");\n\n try {\n const transition = document_.startViewTransition?.(() => {\n applyTheme();\n });\n if (transition?.finished) {\n void transition.finished.finally(() => cleanupThemeTransition(root));\n } else {\n cleanupThemeTransition(root);\n }\n } catch {\n cleanupThemeTransition(root);\n applyTheme();\n }\n return;\n }\n\n applyTheme();\n cleanupThemeTransition(root);\n};\n","import { loadLogs } from \"./controllers/logs\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadDebug } from \"./controllers/debug\";\nimport type { PoolbotApp } from \"./app\";\n\ntype PollingHost = {\n nodesPollInterval: number | null;\n logsPollInterval: number | null;\n debugPollInterval: number | null;\n tab: string;\n};\n\nexport function startNodesPolling(host: PollingHost) {\n if (host.nodesPollInterval != null) return;\n host.nodesPollInterval = window.setInterval(\n () => void loadNodes(host as unknown as PoolbotApp, { quiet: true }),\n 5000,\n );\n}\n\nexport function stopNodesPolling(host: PollingHost) {\n if (host.nodesPollInterval == null) return;\n clearInterval(host.nodesPollInterval);\n host.nodesPollInterval = null;\n}\n\nexport function startLogsPolling(host: PollingHost) {\n if (host.logsPollInterval != null) return;\n host.logsPollInterval = window.setInterval(() => {\n if (host.tab !== \"logs\") return;\n void loadLogs(host as unknown as PoolbotApp, { quiet: true });\n }, 2000);\n}\n\nexport function stopLogsPolling(host: PollingHost) {\n if (host.logsPollInterval == null) return;\n clearInterval(host.logsPollInterval);\n host.logsPollInterval = null;\n}\n\nexport function startDebugPolling(host: PollingHost) {\n if (host.debugPollInterval != null) return;\n host.debugPollInterval = window.setInterval(() => {\n if (host.tab !== \"debug\") return;\n void loadDebug(host as unknown as PoolbotApp);\n }, 3000);\n}\n\nexport function stopDebugPolling(host: PollingHost) {\n if (host.debugPollInterval == null) return;\n clearInterval(host.debugPollInterval);\n host.debugPollInterval = null;\n}\n","import { loadConfig, loadConfigSchema } from \"./controllers/config\";\nimport { loadCronJobs, loadCronStatus } from \"./controllers/cron\";\nimport { loadChannels } from \"./controllers/channels\";\nimport { loadDebug } from \"./controllers/debug\";\nimport { loadLogs } from \"./controllers/logs\";\nimport { loadDevices } from \"./controllers/devices\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadExecApprovals } from \"./controllers/exec-approvals\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport { loadSkills } from \"./controllers/skills\";\nimport { inferBasePathFromPathname, normalizeBasePath, normalizePath, pathForTab, tabFromPath, type Tab } from \"./navigation\";\nimport { saveSettings, type UiSettings } from \"./storage\";\nimport { resolveTheme, type ResolvedTheme, type ThemeMode } from \"./theme\";\nimport { startThemeTransition, type ThemeTransitionContext } from \"./theme-transition\";\nimport { scheduleChatScroll, scheduleLogsScroll } from \"./app-scroll\";\nimport { startLogsPolling, stopLogsPolling, startDebugPolling, stopDebugPolling } from \"./app-polling\";\nimport { refreshChat } from \"./app-chat\";\nimport type { PoolbotApp } from \"./app\";\n\ntype SettingsHost = {\n settings: UiSettings;\n theme: ThemeMode;\n themeResolved: ResolvedTheme;\n applySessionKey: string;\n sessionKey: string;\n tab: Tab;\n connected: boolean;\n chatHasAutoScrolled: boolean;\n logsAtBottom: boolean;\n eventLog: unknown[];\n eventLogBuffer: unknown[];\n basePath: string;\n themeMedia: MediaQueryList | null;\n themeMediaHandler: ((event: MediaQueryListEvent) => void) | null;\n};\n\nexport function applySettings(host: SettingsHost, next: UiSettings) {\n const normalized = {\n ...next,\n lastActiveSessionKey: next.lastActiveSessionKey?.trim() || next.sessionKey.trim() || \"main\",\n };\n host.settings = normalized;\n saveSettings(normalized);\n if (next.theme !== host.theme) {\n host.theme = next.theme;\n applyResolvedTheme(host, resolveTheme(next.theme));\n }\n host.applySessionKey = host.settings.lastActiveSessionKey;\n}\n\nexport function setLastActiveSessionKey(host: SettingsHost, next: string) {\n const trimmed = next.trim();\n if (!trimmed) return;\n if (host.settings.lastActiveSessionKey === trimmed) return;\n applySettings(host, { ...host.settings, lastActiveSessionKey: trimmed });\n}\n\nexport function applySettingsFromUrl(host: SettingsHost) {\n if (!window.location.search) return;\n const params = new URLSearchParams(window.location.search);\n const tokenRaw = params.get(\"token\");\n const passwordRaw = params.get(\"password\");\n const sessionRaw = params.get(\"session\");\n const gatewayUrlRaw = params.get(\"gatewayUrl\");\n let shouldCleanUrl = false;\n\n if (tokenRaw != null) {\n const token = tokenRaw.trim();\n if (token && token !== host.settings.token) {\n applySettings(host, { ...host.settings, token });\n }\n params.delete(\"token\");\n shouldCleanUrl = true;\n }\n\n if (passwordRaw != null) {\n const password = passwordRaw.trim();\n if (password) {\n (host as { password: string }).password = password;\n }\n params.delete(\"password\");\n shouldCleanUrl = true;\n }\n\n if (sessionRaw != null) {\n const session = sessionRaw.trim();\n if (session) {\n host.sessionKey = session;\n applySettings(host, {\n ...host.settings,\n sessionKey: session,\n lastActiveSessionKey: session,\n });\n }\n }\n\n if (gatewayUrlRaw != null) {\n const gatewayUrl = gatewayUrlRaw.trim();\n if (gatewayUrl && gatewayUrl !== host.settings.gatewayUrl) {\n applySettings(host, { ...host.settings, gatewayUrl });\n }\n params.delete(\"gatewayUrl\");\n shouldCleanUrl = true;\n }\n\n if (!shouldCleanUrl) return;\n const url = new URL(window.location.href);\n url.search = params.toString();\n window.history.replaceState({}, \"\", url.toString());\n}\n\nexport function setTab(host: SettingsHost, next: Tab) {\n if (host.tab !== next) host.tab = next;\n if (next === \"chat\") host.chatHasAutoScrolled = false;\n if (next === \"logs\")\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n else stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n if (next === \"debug\")\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n else stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n void refreshActiveTab(host);\n syncUrlWithTab(host, next, false);\n}\n\nexport function setTheme(\n host: SettingsHost,\n next: ThemeMode,\n context?: ThemeTransitionContext,\n) {\n const applyTheme = () => {\n host.theme = next;\n applySettings(host, { ...host.settings, theme: next });\n applyResolvedTheme(host, resolveTheme(next));\n };\n startThemeTransition({\n nextTheme: next,\n applyTheme,\n context,\n currentTheme: host.theme,\n });\n}\n\nexport async function refreshActiveTab(host: SettingsHost) {\n if (host.tab === \"overview\") await loadOverview(host);\n if (host.tab === \"channels\") await loadChannelsTab(host);\n if (host.tab === \"instances\") await loadPresence(host as unknown as PoolbotApp);\n if (host.tab === \"sessions\") await loadSessions(host as unknown as PoolbotApp);\n if (host.tab === \"cron\") await loadCron(host);\n if (host.tab === \"skills\") await loadSkills(host as unknown as PoolbotApp);\n if (host.tab === \"nodes\") {\n await loadNodes(host as unknown as PoolbotApp);\n await loadDevices(host as unknown as PoolbotApp);\n await loadConfig(host as unknown as PoolbotApp);\n await loadExecApprovals(host as unknown as PoolbotApp);\n }\n if (host.tab === \"chat\") {\n await refreshChat(host as unknown as Parameters<typeof refreshChat>[0]);\n scheduleChatScroll(\n host as unknown as Parameters<typeof scheduleChatScroll>[0],\n !host.chatHasAutoScrolled,\n );\n }\n if (host.tab === \"config\") {\n await loadConfigSchema(host as unknown as PoolbotApp);\n await loadConfig(host as unknown as PoolbotApp);\n }\n if (host.tab === \"debug\") {\n await loadDebug(host as unknown as PoolbotApp);\n host.eventLog = host.eventLogBuffer;\n }\n if (host.tab === \"logs\") {\n host.logsAtBottom = true;\n await loadLogs(host as unknown as PoolbotApp, { reset: true });\n scheduleLogsScroll(\n host as unknown as Parameters<typeof scheduleLogsScroll>[0],\n true,\n );\n }\n}\n\nexport function inferBasePath() {\n if (typeof window === \"undefined\") return \"\";\n const configured = window.__CLAWDBOT_CONTROL_UI_BASE_PATH__;\n if (typeof configured === \"string\" && configured.trim()) {\n return normalizeBasePath(configured);\n }\n return inferBasePathFromPathname(window.location.pathname);\n}\n\nexport function syncThemeWithSettings(host: SettingsHost) {\n host.theme = host.settings.theme ?? \"system\";\n applyResolvedTheme(host, resolveTheme(host.theme));\n}\n\nexport function applyResolvedTheme(host: SettingsHost, resolved: ResolvedTheme) {\n host.themeResolved = resolved;\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.dataset.theme = resolved;\n root.style.colorScheme = resolved;\n}\n\nexport function attachThemeListener(host: SettingsHost) {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n host.themeMedia = window.matchMedia(\"(prefers-color-scheme: dark)\");\n host.themeMediaHandler = (event) => {\n if (host.theme !== \"system\") return;\n applyResolvedTheme(host, event.matches ? \"dark\" : \"light\");\n };\n if (typeof host.themeMedia.addEventListener === \"function\") {\n host.themeMedia.addEventListener(\"change\", host.themeMediaHandler);\n return;\n }\n const legacy = host.themeMedia as MediaQueryList & {\n addListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.addListener(host.themeMediaHandler);\n}\n\nexport function detachThemeListener(host: SettingsHost) {\n if (!host.themeMedia || !host.themeMediaHandler) return;\n if (typeof host.themeMedia.removeEventListener === \"function\") {\n host.themeMedia.removeEventListener(\"change\", host.themeMediaHandler);\n return;\n }\n const legacy = host.themeMedia as MediaQueryList & {\n removeListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.removeListener(host.themeMediaHandler);\n host.themeMedia = null;\n host.themeMediaHandler = null;\n}\n\nexport function syncTabWithLocation(host: SettingsHost, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, host.basePath) ?? \"chat\";\n setTabFromRoute(host, resolved);\n syncUrlWithTab(host, resolved, replace);\n}\n\nexport function onPopState(host: SettingsHost) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, host.basePath);\n if (!resolved) return;\n\n const url = new URL(window.location.href);\n const session = url.searchParams.get(\"session\")?.trim();\n if (session) {\n host.sessionKey = session;\n applySettings(host, {\n ...host.settings,\n sessionKey: session,\n lastActiveSessionKey: session,\n });\n }\n\n setTabFromRoute(host, resolved);\n}\n\nexport function setTabFromRoute(host: SettingsHost, next: Tab) {\n if (host.tab !== next) host.tab = next;\n if (next === \"chat\") host.chatHasAutoScrolled = false;\n if (next === \"logs\")\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n else stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n if (next === \"debug\")\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n else stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n if (host.connected) void refreshActiveTab(host);\n}\n\nexport function syncUrlWithTab(host: SettingsHost, tab: Tab, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const targetPath = normalizePath(pathForTab(tab, host.basePath));\n const currentPath = normalizePath(window.location.pathname);\n const url = new URL(window.location.href);\n\n if (tab === \"chat\" && host.sessionKey) {\n url.searchParams.set(\"session\", host.sessionKey);\n } else {\n url.searchParams.delete(\"session\");\n }\n\n if (currentPath !== targetPath) {\n url.pathname = targetPath;\n }\n\n if (replace) {\n window.history.replaceState({}, \"\", url.toString());\n } else {\n window.history.pushState({}, \"\", url.toString());\n }\n}\n\nexport function syncUrlWithSessionKey(\n host: SettingsHost,\n sessionKey: string,\n replace: boolean,\n) {\n if (typeof window === \"undefined\") return;\n const url = new URL(window.location.href);\n url.searchParams.set(\"session\", sessionKey);\n if (replace) window.history.replaceState({}, \"\", url.toString());\n else window.history.pushState({}, \"\", url.toString());\n}\n\nexport async function loadOverview(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as PoolbotApp, false),\n loadPresence(host as unknown as PoolbotApp),\n loadSessions(host as unknown as PoolbotApp),\n loadCronStatus(host as unknown as PoolbotApp),\n loadDebug(host as unknown as PoolbotApp),\n ]);\n}\n\nexport async function loadChannelsTab(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as PoolbotApp, true),\n loadConfigSchema(host as unknown as PoolbotApp),\n loadConfig(host as unknown as PoolbotApp),\n ]);\n}\n\nexport async function loadCron(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as PoolbotApp, false),\n loadCronStatus(host as unknown as PoolbotApp),\n loadCronJobs(host as unknown as PoolbotApp),\n ]);\n}\n","import { abortChatRun, loadChatHistory, sendChatMessage } from \"./controllers/chat\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport { generateUUID } from \"./uuid\";\nimport { resetToolStream } from \"./app-tool-stream\";\nimport { scheduleChatScroll } from \"./app-scroll\";\nimport { setLastActiveSessionKey } from \"./app-settings\";\nimport { normalizeBasePath } from \"./navigation\";\nimport type { GatewayHelloOk } from \"./gateway\";\nimport { parseAgentSessionKey } from \"../../../src/sessions/session-key-utils.js\";\nimport type { PoolbotApp } from \"./app\";\nimport type { ChatAttachment, ChatQueueItem } from \"./ui-types\";\n\ntype ChatHost = {\n connected: boolean;\n chatMessage: string;\n chatAttachments: ChatAttachment[];\n chatQueue: ChatQueueItem[];\n chatRunId: string | null;\n chatSending: boolean;\n sessionKey: string;\n basePath: string;\n hello: GatewayHelloOk | null;\n chatAvatarUrl: string | null;\n};\n\nexport function isChatBusy(host: ChatHost) {\n return host.chatSending || Boolean(host.chatRunId);\n}\n\nexport function isChatStopCommand(text: string) {\n const trimmed = text.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized === \"/stop\") return true;\n return (\n normalized === \"stop\" ||\n normalized === \"esc\" ||\n normalized === \"abort\" ||\n normalized === \"wait\" ||\n normalized === \"exit\"\n );\n}\n\nexport async function handleAbortChat(host: ChatHost) {\n if (!host.connected) return;\n host.chatMessage = \"\";\n await abortChatRun(host as unknown as PoolbotApp);\n}\n\nfunction enqueueChatMessage(host: ChatHost, text: string, attachments?: ChatAttachment[]) {\n const trimmed = text.trim();\n const hasAttachments = Boolean(attachments && attachments.length > 0);\n if (!trimmed && !hasAttachments) return;\n host.chatQueue = [\n ...host.chatQueue,\n {\n id: generateUUID(),\n text: trimmed,\n createdAt: Date.now(),\n attachments: hasAttachments ? attachments?.map((att) => ({ ...att })) : undefined,\n },\n ];\n}\n\nasync function sendChatMessageNow(\n host: ChatHost,\n message: string,\n opts?: {\n previousDraft?: string;\n restoreDraft?: boolean;\n attachments?: ChatAttachment[];\n previousAttachments?: ChatAttachment[];\n restoreAttachments?: boolean;\n },\n) {\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n const ok = await sendChatMessage(host as unknown as PoolbotApp, message, opts?.attachments);\n if (!ok && opts?.previousDraft != null) {\n host.chatMessage = opts.previousDraft;\n }\n if (!ok && opts?.previousAttachments) {\n host.chatAttachments = opts.previousAttachments;\n }\n if (ok) {\n setLastActiveSessionKey(host as unknown as Parameters<typeof setLastActiveSessionKey>[0], host.sessionKey);\n }\n if (ok && opts?.restoreDraft && opts.previousDraft?.trim()) {\n host.chatMessage = opts.previousDraft;\n }\n if (ok && opts?.restoreAttachments && opts.previousAttachments?.length) {\n host.chatAttachments = opts.previousAttachments;\n }\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0]);\n if (ok && !host.chatRunId) {\n void flushChatQueue(host);\n }\n return ok;\n}\n\nasync function flushChatQueue(host: ChatHost) {\n if (!host.connected || isChatBusy(host)) return;\n const [next, ...rest] = host.chatQueue;\n if (!next) return;\n host.chatQueue = rest;\n const ok = await sendChatMessageNow(host, next.text, { attachments: next.attachments });\n if (!ok) {\n host.chatQueue = [next, ...host.chatQueue];\n }\n}\n\nexport function removeQueuedMessage(host: ChatHost, id: string) {\n host.chatQueue = host.chatQueue.filter((item) => item.id !== id);\n}\n\nexport async function handleSendChat(\n host: ChatHost,\n messageOverride?: string,\n opts?: { restoreDraft?: boolean },\n) {\n if (!host.connected) return;\n const previousDraft = host.chatMessage;\n const message = (messageOverride ?? host.chatMessage).trim();\n const attachments = host.chatAttachments ?? [];\n const attachmentsToSend = messageOverride == null ? attachments : [];\n const hasAttachments = attachmentsToSend.length > 0;\n\n // Allow sending with just attachments (no message text required)\n if (!message && !hasAttachments) return;\n\n if (isChatStopCommand(message)) {\n await handleAbortChat(host);\n return;\n }\n\n if (messageOverride == null) {\n host.chatMessage = \"\";\n // Clear attachments when sending\n host.chatAttachments = [];\n }\n\n if (isChatBusy(host)) {\n enqueueChatMessage(host, message, attachmentsToSend);\n return;\n }\n\n await sendChatMessageNow(host, message, {\n previousDraft: messageOverride == null ? previousDraft : undefined,\n restoreDraft: Boolean(messageOverride && opts?.restoreDraft),\n attachments: hasAttachments ? attachmentsToSend : undefined,\n previousAttachments: messageOverride == null ? attachments : undefined,\n restoreAttachments: Boolean(messageOverride && opts?.restoreDraft),\n });\n}\n\nexport async function refreshChat(host: ChatHost) {\n await Promise.all([\n loadChatHistory(host as unknown as PoolbotApp),\n loadSessions(host as unknown as PoolbotApp),\n refreshChatAvatar(host),\n ]);\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0], true);\n}\n\nexport const flushChatQueueForEvent = flushChatQueue;\n\ntype SessionDefaultsSnapshot = {\n defaultAgentId?: string;\n};\n\nfunction resolveAgentIdForSession(host: ChatHost): string | null {\n const parsed = parseAgentSessionKey(host.sessionKey);\n if (parsed?.agentId) return parsed.agentId;\n const snapshot = host.hello?.snapshot as { sessionDefaults?: SessionDefaultsSnapshot } | undefined;\n const fallback = snapshot?.sessionDefaults?.defaultAgentId?.trim();\n return fallback || \"main\";\n}\n\nfunction buildAvatarMetaUrl(basePath: string, agentId: string): string {\n const base = normalizeBasePath(basePath);\n const encoded = encodeURIComponent(agentId);\n return base ? `${base}/avatar/${encoded}?meta=1` : `/avatar/${encoded}?meta=1`;\n}\n\nexport async function refreshChatAvatar(host: ChatHost) {\n if (!host.connected) {\n host.chatAvatarUrl = null;\n return;\n }\n const agentId = resolveAgentIdForSession(host);\n if (!agentId) {\n host.chatAvatarUrl = null;\n return;\n }\n host.chatAvatarUrl = null;\n const url = buildAvatarMetaUrl(host.basePath, agentId);\n try {\n const res = await fetch(url, { method: \"GET\" });\n if (!res.ok) {\n host.chatAvatarUrl = null;\n return;\n }\n const data = (await res.json()) as { avatarUrl?: unknown };\n const avatarUrl = typeof data.avatarUrl === \"string\" ? data.avatarUrl.trim() : \"\";\n host.chatAvatarUrl = avatarUrl || null;\n } catch {\n host.chatAvatarUrl = null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nexport const PartType = {\n ATTRIBUTE: 1,\n CHILD: 2,\n PROPERTY: 3,\n BOOLEAN_ATTRIBUTE: 4,\n EVENT: 5,\n ELEMENT: 6,\n};\n/**\n * Creates a user-facing directive function from a Directive class. This\n * function has the same parameters as the directive's render() method.\n */\nexport const directive = (c) => (...values) => ({\n // This property needs to remain unminified.\n ['_$litDirective$']: c,\n values,\n});\n/**\n * Base class for creating custom directives. Users should extend this class,\n * implement `render` and/or `update`, and then pass their subclass to\n * `directive`.\n */\nexport class Directive {\n constructor(_partInfo) { }\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n /** @internal */\n _$initialize(part, parent, attributeIndex) {\n this.__part = part;\n this._$parent = parent;\n this.__attributeIndex = attributeIndex;\n }\n /** @internal */\n _$resolve(part, props) {\n return this.update(part, props);\n }\n update(_part, props) {\n return this.render(...props);\n }\n}\n//# sourceMappingURL=directive.js.map","/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { _$LH, } from './lit-html.js';\nconst { _ChildPart: ChildPart } = _$LH;\nconst ENABLE_SHADYDOM_NOPATCH = true;\nconst wrap = ENABLE_SHADYDOM_NOPATCH &&\n window.ShadyDOM?.inUse &&\n window.ShadyDOM?.noPatch === true\n ? window.ShadyDOM.wrap\n : (node) => node;\n/**\n * Tests if a value is a primitive value.\n *\n * See https://tc39.github.io/ecma262/#sec-typeof-operator\n */\nexport const isPrimitive = (value) => value === null || (typeof value != 'object' && typeof value != 'function');\nexport const TemplateResultType = {\n HTML: 1,\n SVG: 2,\n MATHML: 3,\n};\n/**\n * Tests if a value is a TemplateResult or a CompiledTemplateResult.\n */\nexport const isTemplateResult = (value, type) => type === undefined\n ? // This property needs to remain unminified.\n value?.['_$litType$'] !== undefined\n : value?.['_$litType$'] === type;\n/**\n * Tests if a value is a CompiledTemplateResult.\n */\nexport const isCompiledTemplateResult = (value) => {\n return value?.['_$litType$']?.h != null;\n};\n/**\n * Tests if a value is a DirectiveResult.\n */\nexport const isDirectiveResult = (value) => \n// This property needs to remain unminified.\nvalue?.['_$litDirective$'] !== undefined;\n/**\n * Retrieves the Directive class for a DirectiveResult\n */\nexport const getDirectiveClass = (value) => \n// This property needs to remain unminified.\nvalue?.['_$litDirective$'];\n/**\n * Tests whether a part has only a single-expression with no strings to\n * interpolate between.\n *\n * Only AttributePart and PropertyPart can have multiple expressions.\n * Multi-expression parts have a `strings` property and single-expression\n * parts do not.\n */\nexport const isSingleExpression = (part) => part.strings === undefined;\nconst createMarker = () => document.createComment('');\n/**\n * Inserts a ChildPart into the given container ChildPart's DOM, either at the\n * end of the container ChildPart, or before the optional `refPart`.\n *\n * This does not add the part to the containerPart's committed value. That must\n * be done by callers.\n *\n * @param containerPart Part within which to add the new ChildPart\n * @param refPart Part before which to add the new ChildPart; when omitted the\n * part added to the end of the `containerPart`\n * @param part Part to insert, or undefined to create a new part\n */\nexport const insertPart = (containerPart, refPart, part) => {\n const container = wrap(containerPart._$startNode).parentNode;\n const refNode = refPart === undefined ? containerPart._$endNode : refPart._$startNode;\n if (part === undefined) {\n const startNode = wrap(container).insertBefore(createMarker(), refNode);\n const endNode = wrap(container).insertBefore(createMarker(), refNode);\n part = new ChildPart(startNode, endNode, containerPart, containerPart.options);\n }\n else {\n const endNode = wrap(part._$endNode).nextSibling;\n const oldParent = part._$parent;\n const parentChanged = oldParent !== containerPart;\n if (parentChanged) {\n part._$reparentDisconnectables?.(containerPart);\n // Note that although `_$reparentDisconnectables` updates the part's\n // `_$parent` reference after unlinking from its current parent, that\n // method only exists if Disconnectables are present, so we need to\n // unconditionally set it here\n part._$parent = containerPart;\n // Since the _$isConnected getter is somewhat costly, only\n // read it once we know the subtree has directives that need\n // to be notified\n let newConnectionState;\n if (part._$notifyConnectionChanged !== undefined &&\n (newConnectionState = containerPart._$isConnected) !==\n oldParent._$isConnected) {\n part._$notifyConnectionChanged(newConnectionState);\n }\n }\n if (endNode !== refNode || parentChanged) {\n let start = part._$startNode;\n while (start !== endNode) {\n const n = wrap(start).nextSibling;\n wrap(container).insertBefore(start, refNode);\n start = n;\n }\n }\n }\n return part;\n};\n/**\n * Sets the value of a Part.\n *\n * Note that this should only be used to set/update the value of user-created\n * parts (i.e. those created using `insertPart`); it should not be used\n * by directives to set the value of the directive's container part. Directives\n * should return a value from `update`/`render` to update their part state.\n *\n * For directives that require setting their part value asynchronously, they\n * should extend `AsyncDirective` and call `this.setValue()`.\n *\n * @param part Part to set\n * @param value Value to set\n * @param index For `AttributePart`s, the index to set\n * @param directiveParent Used internally; should not be set by user\n */\nexport const setChildPartValue = (part, value, directiveParent = part) => {\n part._$setValue(value, directiveParent);\n return part;\n};\n// A sentinel value that can never appear as a part value except when set by\n// live(). Used to force a dirty-check to fail and cause a re-render.\nconst RESET_VALUE = {};\n/**\n * Sets the committed value of a ChildPart directly without triggering the\n * commit stage of the part.\n *\n * This is useful in cases where a directive needs to update the part such\n * that the next update detects a value change or not. When value is omitted,\n * the next update will be guaranteed to be detected as a change.\n *\n * @param part\n * @param value\n */\nexport const setCommittedValue = (part, value = RESET_VALUE) => (part._$committedValue = value);\n/**\n * Returns the committed value of a ChildPart.\n *\n * The committed value is used for change detection and efficient updates of\n * the part. It can differ from the value set by the template or directive in\n * cases where the template value is transformed before being committed.\n *\n * - `TemplateResult`s are committed as a `TemplateInstance`\n * - Iterables are committed as `Array<ChildPart>`\n * - All other types are committed as the template value or value returned or\n * set by a directive.\n *\n * @param part\n */\nexport const getCommittedValue = (part) => part._$committedValue;\n/**\n * Removes a ChildPart from the DOM, including any of its content and markers.\n *\n * Note: The only difference between this and clearPart() is that this also\n * removes the part's start node. This means that the ChildPart must own its\n * start node, ie it must be a marker node specifically for this part and not an\n * anchor from surrounding content.\n *\n * @param part The Part to remove\n */\nexport const removePart = (part) => {\n part._$clear();\n part._$startNode.remove();\n};\nexport const clearPart = (part) => {\n part._$clear();\n};\n//# sourceMappingURL=directive-helpers.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { noChange } from '../lit-html.js';\nimport { directive, Directive, PartType } from '../directive.js';\nimport { insertPart, getCommittedValue, removePart, setCommittedValue, setChildPartValue, } from '../directive-helpers.js';\n// Helper for generating a map of array item to its index over a subset\n// of an array (used to lazily generate `newKeyToIndexMap` and\n// `oldKeyToIndexMap`)\nconst generateMap = (list, start, end) => {\n const map = new Map();\n for (let i = start; i <= end; i++) {\n map.set(list[i], i);\n }\n return map;\n};\nclass RepeatDirective extends Directive {\n constructor(partInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.CHILD) {\n throw new Error('repeat() can only be used in text expressions');\n }\n }\n _getValuesAndKeys(items, keyFnOrTemplate, template) {\n let keyFn;\n if (template === undefined) {\n template = keyFnOrTemplate;\n }\n else if (keyFnOrTemplate !== undefined) {\n keyFn = keyFnOrTemplate;\n }\n const keys = [];\n const values = [];\n let index = 0;\n for (const item of items) {\n keys[index] = keyFn ? keyFn(item, index) : index;\n values[index] = template(item, index);\n index++;\n }\n return {\n values,\n keys,\n };\n }\n render(items, keyFnOrTemplate, template) {\n return this._getValuesAndKeys(items, keyFnOrTemplate, template).values;\n }\n update(containerPart, [items, keyFnOrTemplate, template]) {\n // Old part & key lists are retrieved from the last update (which may\n // be primed by hydration)\n const oldParts = getCommittedValue(containerPart);\n const { values: newValues, keys: newKeys } = this._getValuesAndKeys(items, keyFnOrTemplate, template);\n // We check that oldParts, the committed value, is an Array as an\n // indicator that the previous value came from a repeat() call. If\n // oldParts is not an Array then this is the first render and we return\n // an array for lit-html's array handling to render, and remember the\n // keys.\n if (!Array.isArray(oldParts)) {\n this._itemKeys = newKeys;\n return newValues;\n }\n // In SSR hydration it's possible for oldParts to be an array but for us\n // to not have item keys because the update() hasn't run yet. We set the\n // keys to an empty array. This will cause all oldKey/newKey comparisons\n // to fail and execution to fall to the last nested brach below which\n // reuses the oldPart.\n const oldKeys = (this._itemKeys ??= []);\n // New part list will be built up as we go (either reused from\n // old parts or created for new keys in this update). This is\n // saved in the above cache at the end of the update.\n const newParts = [];\n // Maps from key to index for current and previous update; these\n // are generated lazily only when needed as a performance\n // optimization, since they are only required for multiple\n // non-contiguous changes in the list, which are less common.\n let newKeyToIndexMap;\n let oldKeyToIndexMap;\n // Head and tail pointers to old parts and new values\n let oldHead = 0;\n let oldTail = oldParts.length - 1;\n let newHead = 0;\n let newTail = newValues.length - 1;\n // Overview of O(n) reconciliation algorithm (general approach\n // based on ideas found in ivi, vue, snabbdom, etc.):\n //\n // * We start with the list of old parts and new values (and\n // arrays of their respective keys), head/tail pointers into\n // each, and we build up the new list of parts by updating\n // (and when needed, moving) old parts or creating new ones.\n // The initial scenario might look like this (for brevity of\n // the diagrams, the numbers in the array reflect keys\n // associated with the old parts or new values, although keys\n // and parts/values are actually stored in parallel arrays\n // indexed using the same head/tail pointers):\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [ , , , , , , ]\n // newKeys: [0, 2, 1, 4, 3, 7, 6] <- reflects the user's new\n // item order\n // newHead ^ ^ newTail\n //\n // * Iterate old & new lists from both sides, updating,\n // swapping, or removing parts at the head/tail locations\n // until neither head nor tail can move.\n //\n // * Example below: keys at head pointers match, so update old\n // part 0 in-place (no need to move it) and record part 0 in\n // the `newParts` list. The last thing we do is advance the\n // `oldHead` and `newHead` pointers (will be reflected in the\n // next diagram).\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [0, , , , , , ] <- heads matched: update 0\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance both oldHead\n // & newHead\n // newHead ^ ^ newTail\n //\n // * Example below: head pointers don't match, but tail\n // pointers do, so update part 6 in place (no need to move\n // it), and record part 6 in the `newParts` list. Last,\n // advance the `oldTail` and `oldHead` pointers.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [0, , , , , , 6] <- tails matched: update 6\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance both oldTail\n // & newTail\n // newHead ^ ^ newTail\n //\n // * If neither head nor tail match; next check if one of the\n // old head/tail items was removed. We first need to generate\n // the reverse map of new keys to index (`newKeyToIndexMap`),\n // which is done once lazily as a performance optimization,\n // since we only hit this case if multiple non-contiguous\n // changes were made. Note that for contiguous removal\n // anywhere in the list, the head and tails would advance\n // from either end and pass each other before we get to this\n // case and removals would be handled in the final while loop\n // without needing to generate the map.\n //\n // * Example below: The key at `oldTail` was removed (no longer\n // in the `newKeyToIndexMap`), so remove that part from the\n // DOM and advance just the `oldTail` pointer.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [0, , , , , , 6] <- 5 not in new map: remove\n // newKeys: [0, 2, 1, 4, 3, 7, 6] 5 and advance oldTail\n // newHead ^ ^ newTail\n //\n // * Once head and tail cannot move, any mismatches are due to\n // either new or moved items; if a new key is in the previous\n // \"old key to old index\" map, move the old part to the new\n // location, otherwise create and insert a new part. Note\n // that when moving an old part we null its position in the\n // oldParts array if it lies between the head and tail so we\n // know to skip it when the pointers get there.\n //\n // * Example below: neither head nor tail match, and neither\n // were removed; so find the `newHead` key in the\n // `oldKeyToIndexMap`, and move that old part's DOM into the\n // next head position (before `oldParts[oldHead]`). Last,\n // null the part in the `oldPart` array since it was\n // somewhere in the remaining oldParts still to be scanned\n // (between the head and tail pointers) so that we know to\n // skip that old part on future iterations.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, , , , , 6] <- stuck: update & move 2\n // newKeys: [0, 2, 1, 4, 3, 7, 6] into place and advance\n // newHead\n // newHead ^ ^ newTail\n //\n // * Note that for moves/insertions like the one above, a part\n // inserted at the head pointer is inserted before the\n // current `oldParts[oldHead]`, and a part inserted at the\n // tail pointer is inserted before `newParts[newTail+1]`. The\n // seeming asymmetry lies in the fact that new parts are\n // moved into place outside in, so to the right of the head\n // pointer are old parts, and to the right of the tail\n // pointer are new parts.\n //\n // * We always restart back from the top of the algorithm,\n // allowing matching and simple updates in place to\n // continue...\n //\n // * Example below: the head pointers once again match, so\n // simply update part 1 and record it in the `newParts`\n // array. Last, advance both head pointers.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, , , , 6] <- heads matched: update 1\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance both oldHead\n // & newHead\n // newHead ^ ^ newTail\n //\n // * As mentioned above, items that were moved as a result of\n // being stuck (the final else clause in the code below) are\n // marked with null, so we always advance old pointers over\n // these so we're comparing the next actual old value on\n // either end.\n //\n // * Example below: `oldHead` is null (already placed in\n // newParts), so advance `oldHead`.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6] <- old head already used:\n // newParts: [0, 2, 1, , , , 6] advance oldHead\n // newKeys: [0, 2, 1, 4, 3, 7, 6]\n // newHead ^ ^ newTail\n //\n // * Note it's not critical to mark old parts as null when they\n // are moved from head to tail or tail to head, since they\n // will be outside the pointer range and never visited again.\n //\n // * Example below: Here the old tail key matches the new head\n // key, so the part at the `oldTail` position and move its\n // DOM to the new head position (before `oldParts[oldHead]`).\n // Last, advance `oldTail` and `newHead` pointers.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, 4, , , 6] <- old tail matches new\n // newKeys: [0, 2, 1, 4, 3, 7, 6] head: update & move 4,\n // advance oldTail & newHead\n // newHead ^ ^ newTail\n //\n // * Example below: Old and new head keys match, so update the\n // old head part in place, and advance the `oldHead` and\n // `newHead` pointers.\n //\n // oldHead v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, 4, 3, ,6] <- heads match: update 3\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance oldHead &\n // newHead\n // newHead ^ ^ newTail\n //\n // * Once the new or old pointers move past each other then all\n // we have left is additions (if old list exhausted) or\n // removals (if new list exhausted). Those are handled in the\n // final while loops at the end.\n //\n // * Example below: `oldHead` exceeded `oldTail`, so we're done\n // with the main loop. Create the remaining part and insert\n // it at the new head position, and the update is complete.\n //\n // (oldHead > oldTail)\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, 4, 3, 7 ,6] <- create and insert 7\n // newKeys: [0, 2, 1, 4, 3, 7, 6]\n // newHead ^ newTail\n //\n // * Note that the order of the if/else clauses is not\n // important to the algorithm, as long as the null checks\n // come first (to ensure we're always working on valid old\n // parts) and that the final else clause comes last (since\n // that's where the expensive moves occur). The order of\n // remaining clauses is just a simple guess at which cases\n // will be most common.\n //\n // * Note, we could calculate the longest\n // increasing subsequence (LIS) of old items in new position,\n // and only move those not in the LIS set. However that costs\n // O(nlogn) time and adds a bit more code, and only helps\n // make rare types of mutations require fewer moves. The\n // above handles removes, adds, reversal, swaps, and single\n // moves of contiguous items in linear time, in the minimum\n // number of moves. As the number of multiple moves where LIS\n // might help approaches a random shuffle, the LIS\n // optimization becomes less helpful, so it seems not worth\n // the code at this point. Could reconsider if a compelling\n // case arises.\n while (oldHead <= oldTail && newHead <= newTail) {\n if (oldParts[oldHead] === null) {\n // `null` means old part at head has already been used\n // below; skip\n oldHead++;\n }\n else if (oldParts[oldTail] === null) {\n // `null` means old part at tail has already been used\n // below; skip\n oldTail--;\n }\n else if (oldKeys[oldHead] === newKeys[newHead]) {\n // Old head matches new head; update in place\n newParts[newHead] = setChildPartValue(oldParts[oldHead], newValues[newHead]);\n oldHead++;\n newHead++;\n }\n else if (oldKeys[oldTail] === newKeys[newTail]) {\n // Old tail matches new tail; update in place\n newParts[newTail] = setChildPartValue(oldParts[oldTail], newValues[newTail]);\n oldTail--;\n newTail--;\n }\n else if (oldKeys[oldHead] === newKeys[newTail]) {\n // Old head matches new tail; update and move to new tail\n newParts[newTail] = setChildPartValue(oldParts[oldHead], newValues[newTail]);\n insertPart(containerPart, newParts[newTail + 1], oldParts[oldHead]);\n oldHead++;\n newTail--;\n }\n else if (oldKeys[oldTail] === newKeys[newHead]) {\n // Old tail matches new head; update and move to new head\n newParts[newHead] = setChildPartValue(oldParts[oldTail], newValues[newHead]);\n insertPart(containerPart, oldParts[oldHead], oldParts[oldTail]);\n oldTail--;\n newHead++;\n }\n else {\n if (newKeyToIndexMap === undefined) {\n // Lazily generate key-to-index maps, used for removals &\n // moves below\n newKeyToIndexMap = generateMap(newKeys, newHead, newTail);\n oldKeyToIndexMap = generateMap(oldKeys, oldHead, oldTail);\n }\n if (!newKeyToIndexMap.has(oldKeys[oldHead])) {\n // Old head is no longer in new list; remove\n removePart(oldParts[oldHead]);\n oldHead++;\n }\n else if (!newKeyToIndexMap.has(oldKeys[oldTail])) {\n // Old tail is no longer in new list; remove\n removePart(oldParts[oldTail]);\n oldTail--;\n }\n else {\n // Any mismatches at this point are due to additions or\n // moves; see if we have an old part we can reuse and move\n // into place\n const oldIndex = oldKeyToIndexMap.get(newKeys[newHead]);\n const oldPart = oldIndex !== undefined ? oldParts[oldIndex] : null;\n if (oldPart === null) {\n // No old part for this value; create a new one and\n // insert it\n const newPart = insertPart(containerPart, oldParts[oldHead]);\n setChildPartValue(newPart, newValues[newHead]);\n newParts[newHead] = newPart;\n }\n else {\n // Reuse old part\n newParts[newHead] = setChildPartValue(oldPart, newValues[newHead]);\n insertPart(containerPart, oldParts[oldHead], oldPart);\n // This marks the old part as having been used, so that\n // it will be skipped in the first two checks above\n oldParts[oldIndex] = null;\n }\n newHead++;\n }\n }\n }\n // Add parts for any remaining new values\n while (newHead <= newTail) {\n // For all remaining additions, we insert before last new\n // tail, since old pointers are no longer valid\n const newPart = insertPart(containerPart, newParts[newTail + 1]);\n setChildPartValue(newPart, newValues[newHead]);\n newParts[newHead++] = newPart;\n }\n // Remove any remaining unused old parts\n while (oldHead <= oldTail) {\n const oldPart = oldParts[oldHead++];\n if (oldPart !== null) {\n removePart(oldPart);\n }\n }\n // Save order of new parts for next round\n this._itemKeys = newKeys;\n // Directly set part value, bypassing it's dirty-checking\n setCommittedValue(containerPart, newParts);\n return noChange;\n }\n}\n/**\n * A directive that repeats a series of values (usually `TemplateResults`)\n * generated from an iterable, and updates those items efficiently when the\n * iterable changes based on user-provided `keys` associated with each item.\n *\n * Note that if a `keyFn` is provided, strict key-to-DOM mapping is maintained,\n * meaning previous DOM for a given key is moved into the new position if\n * needed, and DOM will never be reused with values for different keys (new DOM\n * will always be created for new keys). This is generally the most efficient\n * way to use `repeat` since it performs minimum unnecessary work for insertions\n * and removals.\n *\n * The `keyFn` takes two parameters, the item and its index, and returns a unique key value.\n *\n * ```js\n * html`\n * <ol>\n * ${repeat(this.items, (item) => item.id, (item, index) => {\n * return html`<li>${index}: ${item.name}</li>`;\n * })}\n * </ol>\n * `\n * ```\n *\n * **Important**: If providing a `keyFn`, keys *must* be unique for all items in a\n * given call to `repeat`. The behavior when two or more items have the same key\n * is undefined.\n *\n * If no `keyFn` is provided, this directive will perform similar to mapping\n * items to values, and DOM will be reused against potentially different items.\n */\nexport const repeat = directive(RepeatDirective);\n//# sourceMappingURL=repeat.js.map","/**\n * Message normalization utilities for chat rendering.\n */\n\nimport type {\n NormalizedMessage,\n MessageContentItem,\n} from \"../types/chat-types\";\n\n/**\n * Normalize a raw message object into a consistent structure.\n */\nexport function normalizeMessage(message: unknown): NormalizedMessage {\n const m = message as Record<string, unknown>;\n let role = typeof m.role === \"string\" ? m.role : \"unknown\";\n\n // Detect tool messages by common gateway shapes.\n // Some tool events come through as assistant role with tool_* items in the content array.\n const hasToolId =\n typeof m.toolCallId === \"string\" || typeof m.tool_call_id === \"string\";\n\n const contentRaw = m.content;\n const contentItems = Array.isArray(contentRaw) ? contentRaw : null;\n const hasToolContent =\n Array.isArray(contentItems) &&\n contentItems.some((item) => {\n const x = item as Record<string, unknown>;\n const t = String(x.type ?? \"\").toLowerCase();\n return t === \"toolresult\" || t === \"tool_result\";\n });\n\n const hasToolName =\n typeof (m as Record<string, unknown>).toolName === \"string\" ||\n typeof (m as Record<string, unknown>).tool_name === \"string\";\n\n if (hasToolId || hasToolContent || hasToolName) {\n role = \"toolResult\";\n }\n\n // Extract content\n let content: MessageContentItem[] = [];\n\n if (typeof m.content === \"string\") {\n content = [{ type: \"text\", text: m.content }];\n } else if (Array.isArray(m.content)) {\n content = m.content.map((item: Record<string, unknown>) => ({\n type: (item.type as MessageContentItem[\"type\"]) || \"text\",\n text: item.text as string | undefined,\n name: item.name as string | undefined,\n args: item.args || item.arguments,\n }));\n } else if (typeof m.text === \"string\") {\n content = [{ type: \"text\", text: m.text }];\n }\n\n const timestamp = typeof m.timestamp === \"number\" ? m.timestamp : Date.now();\n const id = typeof m.id === \"string\" ? m.id : undefined;\n\n return { role, content, timestamp, id };\n}\n\n/**\n * Normalize role for grouping purposes.\n */\nexport function normalizeRoleForGrouping(role: string): string {\n const lower = role.toLowerCase();\n // Preserve original casing when it's already a core role.\n if (role === \"user\" || role === \"User\") return role;\n if (role === \"assistant\") return \"assistant\";\n if (role === \"system\") return \"system\";\n // Keep tool-related roles distinct so the UI can style/toggle them.\n if (\n lower === \"toolresult\" ||\n lower === \"tool_result\" ||\n lower === \"tool\" ||\n lower === \"function\"\n ) {\n return \"tool\";\n }\n return role;\n}\n\n/**\n * Check if a message is a tool result message based on its role.\n */\nexport function isToolResultMessage(message: unknown): boolean {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role.toLowerCase() : \"\";\n return role === \"toolresult\" || role === \"tool_result\";\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { nothing, noChange } from '../lit-html.js';\nimport { directive, Directive, PartType } from '../directive.js';\nconst HTML_RESULT = 1;\nexport class UnsafeHTMLDirective extends Directive {\n constructor(partInfo) {\n super(partInfo);\n this._value = nothing;\n if (partInfo.type !== PartType.CHILD) {\n throw new Error(`${this.constructor.directiveName}() can only be used in child bindings`);\n }\n }\n render(value) {\n if (value === nothing || value == null) {\n this._templateResult = undefined;\n return (this._value = value);\n }\n if (value === noChange) {\n return value;\n }\n if (typeof value != 'string') {\n throw new Error(`${this.constructor.directiveName}() called with a non-string value`);\n }\n if (value === this._value) {\n return this._templateResult;\n }\n this._value = value;\n const strings = [value];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n strings.raw = strings;\n // WARNING: impersonating a TemplateResult like this is extremely\n // dangerous. Third-party directives should not do this.\n return (this._templateResult = {\n // Cast to a known set of integers that satisfy ResultType so that we\n // don't have to export ResultType and possibly encourage this pattern.\n // This property needs to remain unminified.\n ['_$litType$']: this.constructor\n .resultType,\n strings,\n values: [],\n });\n }\n}\nUnsafeHTMLDirective.directiveName = 'unsafeHTML';\nUnsafeHTMLDirective.resultType = HTML_RESULT;\n/**\n * Renders the result as HTML, rather than text.\n *\n * The values `undefined`, `null`, and `nothing`, will all result in no content\n * (empty string) being rendered.\n *\n * Note, this is unsafe to use with any user-provided input that hasn't been\n * sanitized or escaped, as it may lead to cross-site-scripting\n * vulnerabilities.\n */\nexport const unsafeHTML = directive(UnsafeHTMLDirective);\n//# sourceMappingURL=unsafe-html.js.map","/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ARIA_ATTR: ARIA_ATTR,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n DATA_ATTR: DATA_ATTR,\n DOCTYPE_NAME: DOCTYPE_NAME,\n ERB_EXPR: ERB_EXPR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.3.1';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with <html>... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (cfg.ADD_ATTR) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n if (cfg.ADD_FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n /**\n * _removeAttribute\n *\n * @param name an Attribute name\n * @param element a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, element) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: element.getAttributeNode(name),\n from: element\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: element\n });\n }\n element.removeAttribute(name);\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * _isClobbered\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n };\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param value object to check whether it's a DOM node\n * @return true is object is a DOM node\n */\n const _isNode = function _isNode(value) {\n return typeof Node === 'function' && value instanceof Node;\n };\n function _executeHooks(hooks, currentNode, data) {\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName])) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const {\n attributes\n } = currentNode;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * marked v17.0.1 - a markdown parser\n * Copyright (c) 2018-2025, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=L();function Z(u){T=u}var C={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var me=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceTabs:/^\\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,unescapeTest:/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\")},xe=/^(?:[ \\t]*(?:\\n|$))+/,be=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,I=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Te=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,N=/(?:[*+-]|\\d{1,9}[.)])/,re=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,se=k(re).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Oe=k(re).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),Q=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,we=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,ye=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Pe=k(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,N).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",j=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Se=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",j).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),ie=k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),$e=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",ie).getRegex(),U={blockquote:$e,code:be,def:ye,fences:Re,heading:Te,hr:I,html:Se,lheading:se,list:Pe,newline:xe,paragraph:ie,table:C,text:we},te=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),_e={...U,lheading:Oe,table:te,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",te).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},Le={...U,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",j).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:C,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",se).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Me=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,ze=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,oe=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,D=/[\\p{P}\\p{S}]/u,K=/[\\s\\p{P}\\p{S}]/u,ae=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,K).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Ie=/(?!~)[\\s\\p{P}\\p{S}]/u,Ee=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Be=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",me?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/,qe=k(ue,\"u\").replace(/punct/g,D).getRegex(),ve=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",De=k(pe,\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),He=k(pe,\"gu\").replace(/notPunctSpace/g,Ee).replace(/punctSpace/g,Ie).replace(/punct/g,le).getRegex(),Ze=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),Ge=k(/\\\\(punct)/,\"gu\").replace(/punct/g,D).getRegex(),Ne=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Qe=k(j).replace(\"(?:-->|$)\",\"-->\").getRegex(),Fe=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",Qe).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/,je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ue=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),ne=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,W={_backpedal:C,anyPunctuation:Ge,autolink:Ne,blockSkip:Be,br:oe,code:ze,del:C,emStrongLDelim:qe,emStrongRDelimAst:De,emStrongRDelimUnd:Ze,escape:Me,link:je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ue,tag:Fe,text:Ae,url:C},Ke={...W,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},G={...W,emStrongRDelimAst:He,emStrongLDelim:ve,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",ne).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",ne).getRegex()},We={...G,br:k(oe).replace(\"{2,}\",\"*\").getRegex(),text:k(G.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},E={normal:U,gfm:_e,pedantic:Le},M={normal:W,gfm:G,breaks:We,pedantic:Ke};var Xe={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ke=u=>Xe[u];function w(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function X(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function J(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function z(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function Je(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:z(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=Je(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:z(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let g=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=g,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.blockquote(f);s[s.length-1]=O,r=r.substring(0,r.length-R.raw.length)+O.raw,i=i.substring(0,i.length-R.text.length)+O.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.list(f);s[s.length-1]=O,r=r.substring(0,r.length-h.raw.length)+O.raw,i=i.substring(0,i.length-R.raw.length)+O.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let g=t[2].split(`\n`,1)[0].replace(this.rules.other.listReplaceTabs,O=>\" \".repeat(3*O.length)),h=e.split(`\n`,1)[0],R=!g.trim(),f=0;if(this.options.pedantic?(f=2,c=g.trimStart()):R?f=t[1].length+1:(f=t[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=g.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let O=this.rules.other.nextBulletRegex(f),V=this.rules.other.hrRegex(f),Y=this.rules.other.fencesBeginRegex(f),ee=this.rules.other.headingBeginRegex(f),fe=this.rules.other.htmlBeginRegex(f);for(;e;){let H=e.split(`\n`,1)[0],A;if(h=H,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\" \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\" \"),Y.test(h)||ee.test(h)||fe.test(h)||O.test(h)||V.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||g.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Y.test(g)||ee.test(g)||V.test(g))break;c+=`\n`+h}!R&&!h.trim()&&(R=!0),p+=H+`\n`,e=e.substring(H.length+1),g=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0]?.type===\"text\"||l.tokens[0]?.type===\"paragraph\"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.checked,i.loose?l.tokens[0]&&[\"paragraph\",\"text\"].includes(l.tokens[0].type)&&\"tokens\"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(g=>g.type===\"space\"),c=p.length>0&&p.some(g=>this.rules.other.anyLine.test(g.raw));i.loose=c}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=J(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(J(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=z(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),ge(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return ge(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let g=[...r[0]][0].length,h=e.slice(0,s+r.index+g+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:\"del\",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:E.normal,inline:M.normal};this.options.pedantic?(t.block=E.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=E.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:E,inline:M}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),g;this.options.extensions.startInline.forEach(h=>{g=h.call({lexer:this},c),typeof g==\"number\"&&g>=0&&(p=Math.min(p,g))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var P=class{options;parser;constructor(e){this.options=e||T}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+w(r)+'\">'+(n?i:w(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:w(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${w(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=X(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+w(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=X(e);if(i===null)return w(n);e=i;let s=`<img src=\"${e}\" alt=\"${n}\"`;return t&&(s+=` title=\"${w(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:w(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var S=class{options;block;constructor(e){this.options=e||T}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var B=class{defaults=L();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=$;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new S;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];S.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(s))return(async()=>{let g=await o.call(i,p);return l.call(i,g)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let g=await o.apply(i,p);return g===!1&&(g=await l.apply(i,p)),g})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+w(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var _=new B;function d(u,e){return _.parse(u,e)}d.options=d.setOptions=function(u){return _.setOptions(u),d.defaults=_.defaults,Z(d.defaults),d};d.getDefaults=L;d.defaults=T;d.use=function(...u){return _.use(...u),d.defaults=_.defaults,Z(d.defaults),d};d.walkTokens=function(u,e){return _.walkTokens(u,e)};d.parseInline=_.parseInline;d.Parser=b;d.parser=b.parse;d.Renderer=P;d.TextRenderer=$;d.Lexer=x;d.lexer=x.lex;d.Tokenizer=y;d.Hooks=S;d.parse=d;var Dt=d.options,Ht=d.setOptions,Zt=d.use,Gt=d.walkTokens,Nt=d.parseInline,Qt=d,Ft=b.parse,jt=x.lex;export{S as Hooks,x as Lexer,B as Marked,b as Parser,P as Renderer,$ as TextRenderer,y as Tokenizer,T as defaults,L as getDefaults,jt as lexer,d as marked,Dt as options,Qt as parse,Nt as parseInline,Ft as parser,Ht as setOptions,Zt as use,Gt as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import DOMPurify from \"dompurify\";\nimport { marked } from \"marked\";\nimport { truncateText } from \"./format\";\n\nmarked.setOptions({\n gfm: true,\n breaks: true,\n mangle: false,\n});\n\nconst allowedTags = [\n \"a\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"del\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"hr\",\n \"i\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"strong\",\n \"table\",\n \"tbody\",\n \"td\",\n \"th\",\n \"thead\",\n \"tr\",\n \"ul\",\n];\n\nconst allowedAttrs = [\"class\", \"href\", \"rel\", \"target\", \"title\", \"start\"];\n\nlet hooksInstalled = false;\nconst MARKDOWN_CHAR_LIMIT = 140_000;\nconst MARKDOWN_PARSE_LIMIT = 40_000;\nconst MARKDOWN_CACHE_LIMIT = 200;\nconst MARKDOWN_CACHE_MAX_CHARS = 50_000;\nconst markdownCache = new Map<string, string>();\n\nfunction getCachedMarkdown(key: string): string | null {\n const cached = markdownCache.get(key);\n if (cached === undefined) return null;\n markdownCache.delete(key);\n markdownCache.set(key, cached);\n return cached;\n}\n\nfunction setCachedMarkdown(key: string, value: string) {\n markdownCache.set(key, value);\n if (markdownCache.size <= MARKDOWN_CACHE_LIMIT) return;\n const oldest = markdownCache.keys().next().value;\n if (oldest) markdownCache.delete(oldest);\n}\n\nfunction installHooks() {\n if (hooksInstalled) return;\n hooksInstalled = true;\n\n DOMPurify.addHook(\"afterSanitizeAttributes\", (node) => {\n if (!(node instanceof HTMLAnchorElement)) return;\n const href = node.getAttribute(\"href\");\n if (!href) return;\n node.setAttribute(\"rel\", \"noreferrer noopener\");\n node.setAttribute(\"target\", \"_blank\");\n });\n}\n\nexport function toSanitizedMarkdownHtml(markdown: string): string {\n const input = markdown.trim();\n if (!input) return \"\";\n installHooks();\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n const cached = getCachedMarkdown(input);\n if (cached !== null) return cached;\n }\n const truncated = truncateText(input, MARKDOWN_CHAR_LIMIT);\n const suffix = truncated.truncated\n ? `\\n\\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`\n : \"\";\n if (truncated.text.length > MARKDOWN_PARSE_LIMIT) {\n const escaped = escapeHtml(`${truncated.text}${suffix}`);\n const html = `<pre class=\"code-block\">${escaped}</pre>`;\n const sanitized = DOMPurify.sanitize(html, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttrs,\n });\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n setCachedMarkdown(input, sanitized);\n }\n return sanitized;\n }\n const rendered = marked.parse(`${truncated.text}${suffix}`) as string;\n const sanitized = DOMPurify.sanitize(rendered, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttrs,\n });\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n setCachedMarkdown(input, sanitized);\n }\n return sanitized;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { html, type TemplateResult } from \"lit\";\nimport { icons } from \"../icons\";\n\nconst COPIED_FOR_MS = 1500;\nconst ERROR_FOR_MS = 2000;\nconst COPY_LABEL = \"Copy as markdown\";\nconst COPIED_LABEL = \"Copied\";\nconst ERROR_LABEL = \"Copy failed\";\n\ntype CopyButtonOptions = {\n text: () => string;\n label?: string;\n};\n\nasync function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction setButtonLabel(button: HTMLButtonElement, label: string) {\n button.title = label;\n button.setAttribute(\"aria-label\", label);\n}\n\nfunction createCopyButton(options: CopyButtonOptions): TemplateResult {\n const idleLabel = options.label ?? COPY_LABEL;\n return html`\n <button\n class=\"chat-copy-btn\"\n type=\"button\"\n title=${idleLabel}\n aria-label=${idleLabel}\n @click=${async (e: Event) => {\n const btn = e.currentTarget as HTMLButtonElement | null;\n const iconContainer = btn?.querySelector(\n \".chat-copy-btn__icon\",\n ) as HTMLElement | null;\n\n if (!btn || btn.dataset.copying === \"1\") return;\n\n btn.dataset.copying = \"1\";\n btn.setAttribute(\"aria-busy\", \"true\");\n btn.disabled = true;\n\n const copied = await copyTextToClipboard(options.text());\n if (!btn.isConnected) return;\n\n delete btn.dataset.copying;\n btn.removeAttribute(\"aria-busy\");\n btn.disabled = false;\n\n if (!copied) {\n btn.dataset.error = \"1\";\n setButtonLabel(btn, ERROR_LABEL);\n\n window.setTimeout(() => {\n if (!btn.isConnected) return;\n delete btn.dataset.error;\n setButtonLabel(btn, idleLabel);\n }, ERROR_FOR_MS);\n return;\n }\n\n btn.dataset.copied = \"1\";\n setButtonLabel(btn, COPIED_LABEL);\n\n window.setTimeout(() => {\n if (!btn.isConnected) return;\n delete btn.dataset.copied;\n setButtonLabel(btn, idleLabel);\n }, COPIED_FOR_MS);\n }}\n >\n <span class=\"chat-copy-btn__icon\" aria-hidden=\"true\">\n <span class=\"chat-copy-btn__icon-copy\">${icons.copy}</span>\n <span class=\"chat-copy-btn__icon-check\">${icons.check}</span>\n </span>\n </button>\n `;\n}\n\nexport function renderCopyAsMarkdownButton(markdown: string): TemplateResult {\n return createCopyButton({ text: () => markdown, label: COPY_LABEL });\n}\n","import rawConfig from \"./tool-display.json\";\nimport type { IconName } from \"./icons\";\n\ntype ToolDisplayActionSpec = {\n label?: string;\n detailKeys?: string[];\n};\n\ntype ToolDisplaySpec = {\n icon?: string;\n emoji?: string;\n title?: string;\n label?: string;\n detailKeys?: string[];\n actions?: Record<string, ToolDisplayActionSpec>;\n};\n\ntype ToolDisplayConfig = {\n version?: number;\n fallback?: ToolDisplaySpec;\n tools?: Record<string, ToolDisplaySpec>;\n};\n\nexport type ToolDisplay = {\n name: string;\n icon: IconName;\n emoji?: string;\n title: string;\n label: string;\n verb?: string;\n detail?: string;\n};\n\nconst TOOL_DISPLAY_CONFIG = rawConfig as ToolDisplayConfig;\nconst FALLBACK = TOOL_DISPLAY_CONFIG.fallback ?? { icon: \"puzzle\" };\nconst TOOL_MAP = TOOL_DISPLAY_CONFIG.tools ?? {};\n\nfunction normalizeToolName(name?: string): string {\n return (name ?? \"tool\").trim();\n}\n\nfunction defaultTitle(name: string): string {\n const cleaned = name.replace(/_/g, \" \").trim();\n if (!cleaned) return \"Tool\";\n return cleaned\n .split(/\\s+/)\n .map((part) =>\n part.length <= 2 && part.toUpperCase() === part\n ? part\n : `${part.at(0)?.toUpperCase() ?? \"\"}${part.slice(1)}`,\n )\n .join(\" \");\n}\n\nfunction normalizeVerb(value?: string): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/_/g, \" \");\n}\n\nfunction coerceDisplayValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n const firstLine = trimmed.split(/\\r?\\n/)[0]?.trim() ?? \"\";\n if (!firstLine) return undefined;\n return firstLine.length > 160 ? `${firstLine.slice(0, 157)}…` : firstLine;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n const values = value\n .map((item) => coerceDisplayValue(item))\n .filter((item): item is string => Boolean(item));\n if (values.length === 0) return undefined;\n const preview = values.slice(0, 3).join(\", \");\n return values.length > 3 ? `${preview}…` : preview;\n }\n return undefined;\n}\n\nfunction lookupValueByPath(args: unknown, path: string): unknown {\n if (!args || typeof args !== \"object\") return undefined;\n let current: unknown = args;\n for (const segment of path.split(\".\")) {\n if (!segment) return undefined;\n if (!current || typeof current !== \"object\") return undefined;\n const record = current as Record<string, unknown>;\n current = record[segment];\n }\n return current;\n}\n\nfunction resolveDetailFromKeys(args: unknown, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = lookupValueByPath(args, key);\n const display = coerceDisplayValue(value);\n if (display) return display;\n }\n return undefined;\n}\n\nfunction resolveReadDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n if (!path) return undefined;\n const offset = typeof record.offset === \"number\" ? record.offset : undefined;\n const limit = typeof record.limit === \"number\" ? record.limit : undefined;\n if (offset !== undefined && limit !== undefined) {\n return `${path}:${offset}-${offset + limit}`;\n }\n return path;\n}\n\nfunction resolveWriteDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n return path;\n}\n\nfunction resolveActionSpec(\n spec: ToolDisplaySpec | undefined,\n action: string | undefined,\n): ToolDisplayActionSpec | undefined {\n if (!spec || !action) return undefined;\n return spec.actions?.[action] ?? undefined;\n}\n\nexport function resolveToolDisplay(params: {\n name?: string;\n args?: unknown;\n meta?: string;\n}): ToolDisplay {\n const name = normalizeToolName(params.name);\n const key = name.toLowerCase();\n const spec = TOOL_MAP[key];\n const icon = (spec?.icon ?? FALLBACK.icon ?? \"puzzle\") as IconName;\n const emoji = spec?.emoji ?? FALLBACK.emoji ?? \"⚡\";\n const title = spec?.title ?? defaultTitle(name);\n const label = spec?.label ?? name;\n const actionRaw =\n params.args && typeof params.args === \"object\"\n ? ((params.args as Record<string, unknown>).action as string | undefined)\n : undefined;\n const action = typeof actionRaw === \"string\" ? actionRaw.trim() : undefined;\n const actionSpec = resolveActionSpec(spec, action);\n const verb = normalizeVerb(actionSpec?.label ?? action);\n\n let detail: string | undefined;\n if (key === \"read\") detail = resolveReadDetail(params.args);\n if (!detail && (key === \"write\" || key === \"edit\" || key === \"attach\")) {\n detail = resolveWriteDetail(params.args);\n }\n\n const detailKeys =\n actionSpec?.detailKeys ?? spec?.detailKeys ?? FALLBACK.detailKeys ?? [];\n if (!detail && detailKeys.length > 0) {\n detail = resolveDetailFromKeys(params.args, detailKeys);\n }\n\n if (!detail && params.meta) {\n detail = params.meta;\n }\n\n if (detail) {\n detail = shortenHomeInString(detail);\n }\n\n return {\n name,\n icon,\n emoji,\n title,\n label,\n verb,\n detail,\n };\n}\n\nexport function formatToolDetail(display: ToolDisplay): string | undefined {\n const parts: string[] = [];\n if (display.verb) parts.push(display.verb);\n if (display.detail) parts.push(display.detail);\n if (parts.length === 0) return undefined;\n return parts.join(\" · \");\n}\n\nexport function formatToolSummary(display: ToolDisplay): string {\n const detail = formatToolDetail(display);\n return detail ? `${display.label}: ${detail}` : display.label;\n}\n\nfunction shortenHomeInString(input: string): string {\n if (!input) return input;\n return input\n .replace(/\\/Users\\/[^/]+/g, \"~\")\n .replace(/\\/home\\/[^/]+/g, \"~\");\n}\n","/**\n * Chat-related constants for the UI layer.\n */\n\n/** Character threshold for showing tool output inline vs collapsed */\nexport const TOOL_INLINE_THRESHOLD = 80;\n\n/** Maximum lines to show in collapsed preview */\nexport const PREVIEW_MAX_LINES = 2;\n\n/** Maximum characters to show in collapsed preview */\nexport const PREVIEW_MAX_CHARS = 100;\n","/**\n * Helper functions for tool card rendering.\n */\n\nimport { PREVIEW_MAX_CHARS, PREVIEW_MAX_LINES } from \"./constants\";\n\n/**\n * Format tool output content for display in the sidebar.\n * Detects JSON and wraps it in a code block with formatting.\n */\nexport function formatToolOutputForSidebar(text: string): string {\n const trimmed = text.trim();\n // Try to detect and format JSON\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n const parsed = JSON.parse(trimmed);\n return \"```json\\n\" + JSON.stringify(parsed, null, 2) + \"\\n```\";\n } catch {\n // Not valid JSON, return as-is\n }\n }\n return text;\n}\n\n/**\n * Get a truncated preview of tool output text.\n * Truncates to first N lines or first N characters, whichever is shorter.\n */\nexport function getTruncatedPreview(text: string): string {\n const allLines = text.split(\"\\n\");\n const lines = allLines.slice(0, PREVIEW_MAX_LINES);\n const preview = lines.join(\"\\n\");\n if (preview.length > PREVIEW_MAX_CHARS) {\n return preview.slice(0, PREVIEW_MAX_CHARS) + \"…\";\n }\n return lines.length < allLines.length ? preview + \"…\" : preview;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatToolDetail, resolveToolDisplay } from \"../tool-display\";\nimport { icons } from \"../icons\";\nimport type { ToolCard } from \"../types/chat-types\";\nimport { TOOL_INLINE_THRESHOLD } from \"./constants\";\nimport {\n formatToolOutputForSidebar,\n getTruncatedPreview,\n} from \"./tool-helpers\";\nimport { isToolResultMessage } from \"./message-normalizer\";\nimport { extractTextCached } from \"./message-extract\";\n\n/**\n * Hermes-inspired Activity Feed: render tool execution as ┊ prefix line\n */\nexport function renderActivityFeedItem(\n card: ToolCard,\n opts?: { duration?: number; status?: \"running\" | \"success\" | \"error\" },\n) {\n const display = resolveToolDisplay({ name: card.name, args: card.args });\n const emoji = display.emoji ?? \"⚡\";\n const detail = formatToolDetail(display);\n const statusClass = opts?.status ? `chat-activity-item--${opts.status}` : \"\";\n const durationText = opts?.duration != null ? `${(opts.duration / 1000).toFixed(1)}s` : \"\";\n const prefix = opts?.status === \"running\" ? \"◌\" : opts?.status === \"error\" ? \"✕\" : \"┊\";\n\n return html`\n <div class=\"chat-activity-item ${statusClass}\">\n <span class=\"chat-activity-prefix\">${prefix}</span>\n <span class=\"chat-activity-emoji\">${emoji}</span>\n <span class=\"chat-activity-name\">${display.label}</span>\n ${detail\n ? html`<span class=\"chat-activity-detail\">${detail}</span>`\n : nothing}\n ${durationText\n ? html`<span class=\"chat-activity-duration\">${durationText}</span>`\n : nothing}\n ${opts?.status === \"success\"\n ? html`<span class=\"chat-activity-check\">✓</span>`\n : nothing}\n </div>\n `;\n}\n\n/**\n * Render a full activity feed from a list of tool cards\n */\nexport function renderActivityFeed(\n cards: ToolCard[],\n opts?: { collapsed?: boolean; maxVisible?: number },\n) {\n if (cards.length === 0) return nothing;\n const maxVisible = opts?.maxVisible ?? 3;\n const collapsed = opts?.collapsed ?? cards.length > maxVisible + 2;\n const feedClass = collapsed ? \"chat-activity-feed chat-activity-feed--collapsed\" : \"chat-activity-feed\";\n\n return html`\n <div class=\"${feedClass}\">\n ${cards.map((card) => renderActivityFeedItem(card, { status: \"success\" }))}\n ${collapsed\n ? html`\n <button\n class=\"chat-activity-expand\"\n @click=${(e: Event) => {\n const feed = (e.target as HTMLElement).closest(\".chat-activity-feed\");\n feed?.classList.toggle(\"chat-activity-feed--collapsed\");\n const btn = e.target as HTMLElement;\n btn.textContent = feed?.classList.contains(\"chat-activity-feed--collapsed\")\n ? `┊ +${cards.length - maxVisible} more`\n : \"┊ collapse\";\n }}\n >\n ┊ +${cards.length - maxVisible} more\n </button>\n `\n : nothing}\n </div>\n `;\n}\n\nexport function extractToolCards(message: unknown): ToolCard[] {\n const m = message as Record<string, unknown>;\n const content = normalizeContent(m.content);\n const cards: ToolCard[] = [];\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n const isToolCall =\n [\"toolcall\", \"tool_call\", \"tooluse\", \"tool_use\"].includes(kind) ||\n (typeof item.name === \"string\" && item.arguments != null);\n if (isToolCall) {\n cards.push({\n kind: \"call\",\n name: (item.name as string) ?? \"tool\",\n args: coerceArgs(item.arguments ?? item.args),\n });\n }\n }\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n if (kind !== \"toolresult\" && kind !== \"tool_result\") continue;\n const text = extractToolText(item);\n const name = typeof item.name === \"string\" ? item.name : \"tool\";\n cards.push({ kind: \"result\", name, text });\n }\n\n if (\n isToolResultMessage(message) &&\n !cards.some((card) => card.kind === \"result\")\n ) {\n const name =\n (typeof m.toolName === \"string\" && m.toolName) ||\n (typeof m.tool_name === \"string\" && m.tool_name) ||\n \"tool\";\n const text = extractTextCached(message) ?? undefined;\n cards.push({ kind: \"result\", name, text });\n }\n\n return cards;\n}\n\nexport function renderToolCardSidebar(\n card: ToolCard,\n onOpenSidebar?: (content: string) => void,\n) {\n const display = resolveToolDisplay({ name: card.name, args: card.args });\n const detail = formatToolDetail(display);\n const hasText = Boolean(card.text?.trim());\n\n const canClick = Boolean(onOpenSidebar);\n const handleClick = canClick\n ? () => {\n if (hasText) {\n onOpenSidebar!(formatToolOutputForSidebar(card.text!));\n return;\n }\n const info = `## ${display.label}\\n\\n${\n detail ? `**Command:** \\`${detail}\\`\\n\\n` : \"\"\n }*No output — tool completed successfully.*`;\n onOpenSidebar!(info);\n }\n : undefined;\n\n const isShort = hasText && (card.text?.length ?? 0) <= TOOL_INLINE_THRESHOLD;\n const showCollapsed = hasText && !isShort;\n const showInline = hasText && isShort;\n const isEmpty = !hasText;\n\n return html`\n <div\n class=\"chat-tool-card ${canClick ? \"chat-tool-card--clickable\" : \"\"}\"\n @click=${handleClick}\n role=${canClick ? \"button\" : nothing}\n tabindex=${canClick ? \"0\" : nothing}\n @keydown=${canClick\n ? (e: KeyboardEvent) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n handleClick?.();\n }\n : nothing}\n >\n <div class=\"chat-tool-card__header\">\n <div class=\"chat-tool-card__title\">\n <span class=\"chat-tool-card__icon\">${icons[display.icon]}</span>\n <span>${display.label}</span>\n </div>\n ${canClick\n ? html`<span class=\"chat-tool-card__action\">${hasText ? \"View\" : \"\"} ${icons.check}</span>`\n : nothing}\n ${isEmpty && !canClick ? html`<span class=\"chat-tool-card__status\">${icons.check}</span>` : nothing}\n </div>\n ${detail\n ? html`<div class=\"chat-tool-card__detail\">${detail}</div>`\n : nothing}\n ${isEmpty\n ? html`<div class=\"chat-tool-card__status-text muted\">Completed</div>`\n : nothing}\n ${showCollapsed\n ? html`<div class=\"chat-tool-card__preview mono\">${getTruncatedPreview(card.text!)}</div>`\n : nothing}\n ${showInline\n ? html`<div class=\"chat-tool-card__inline mono\">${card.text}</div>`\n : nothing}\n </div>\n `;\n}\n\nfunction normalizeContent(content: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(content)) return [];\n return content.filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nfunction coerceArgs(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n if (!trimmed) return value;\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n return JSON.parse(trimmed);\n } catch {\n return value;\n }\n}\n\nfunction extractToolText(item: Record<string, unknown>): string | undefined {\n if (typeof item.text === \"string\") return item.text;\n if (typeof item.content === \"string\") return item.content;\n return undefined;\n}\n","import { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport type { AssistantIdentity } from \"../assistant-identity\";\nimport { toSanitizedMarkdownHtml } from \"../markdown\";\nimport type { MessageGroup } from \"../types/chat-types\";\nimport { renderCopyAsMarkdownButton } from \"./copy-as-markdown\";\nimport { isToolResultMessage, normalizeRoleForGrouping } from \"./message-normalizer\";\nimport {\n extractTextCached,\n extractThinkingCached,\n formatReasoningMarkdown,\n} from \"./message-extract\";\nimport { extractToolCards, renderToolCardSidebar, renderActivityFeed } from \"./tool-cards\";\n\n/** Hermes-inspired thinking verbs that rotate */\nconst THINKING_VERBS = [\n \"thinking\", \"analyzing\", \"processing\", \"pondering\",\n \"musing\", \"considering\", \"reasoning\", \"reflecting\",\n \"examining\", \"investigating\", \"exploring\", \"deliberating\",\n];\n\nlet thinkingVerbIndex = 0;\n\nfunction getNextThinkingVerb(): string {\n const verb = THINKING_VERBS[thinkingVerbIndex % THINKING_VERBS.length];\n thinkingVerbIndex++;\n return verb;\n}\n\ntype ImageBlock = {\n url: string;\n alt?: string;\n};\n\nfunction extractImages(message: unknown): ImageBlock[] {\n const m = message as Record<string, unknown>;\n const content = m.content;\n const images: ImageBlock[] = [];\n\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null) continue;\n const b = block as Record<string, unknown>;\n\n if (b.type === \"image\") {\n // Handle source object format (from sendChatMessage)\n const source = b.source as Record<string, unknown> | undefined;\n if (source?.type === \"base64\" && typeof source.data === \"string\") {\n const data = source.data as string;\n const mediaType = (source.media_type as string) || \"image/png\";\n // If data is already a data URL, use it directly\n const url = data.startsWith(\"data:\")\n ? data\n : `data:${mediaType};base64,${data}`;\n images.push({ url });\n } else if (typeof b.url === \"string\") {\n images.push({ url: b.url });\n }\n } else if (b.type === \"image_url\") {\n // OpenAI format\n const imageUrl = b.image_url as Record<string, unknown> | undefined;\n if (typeof imageUrl?.url === \"string\") {\n images.push({ url: imageUrl.url });\n }\n }\n }\n }\n\n return images;\n}\n\nexport function renderReadingIndicatorGroup(assistant?: AssistantIdentity) {\n const verb = getNextThinkingVerb();\n\n return html`\n <div class=\"chat-group assistant\">\n ${renderAvatar(\"assistant\", assistant)}\n <div class=\"chat-group-messages\">\n <div class=\"chat-bubble chat-reading-indicator\" aria-hidden=\"true\">\n <span class=\"chat-reading-indicator__dots\">\n <span></span><span></span><span></span>\n </span>\n <span class=\"chat-reading-indicator__verb\">${verb}</span>\n </div>\n </div>\n </div>\n `;\n}\n\nexport function renderStreamingGroup(\n text: string,\n startedAt: number,\n onOpenSidebar?: (content: string) => void,\n assistant?: AssistantIdentity,\n) {\n const timestamp = new Date(startedAt).toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n const name = assistant?.name ?? \"Assistant\";\n\n return html`\n <div class=\"chat-group assistant\">\n ${renderAvatar(\"assistant\", assistant)}\n <div class=\"chat-group-messages\">\n ${renderGroupedMessage(\n {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n timestamp: startedAt,\n },\n { isStreaming: true, showReasoning: false },\n onOpenSidebar,\n )}\n <div class=\"chat-group-footer\">\n <span class=\"chat-sender-name\">${name}</span>\n <span class=\"chat-group-timestamp\">${timestamp}</span>\n </div>\n </div>\n </div>\n `;\n}\n\nexport function renderMessageGroup(\n group: MessageGroup,\n opts: {\n onOpenSidebar?: (content: string) => void;\n showReasoning: boolean;\n assistantName?: string;\n assistantAvatar?: string | null;\n },\n) {\n const normalizedRole = normalizeRoleForGrouping(group.role);\n const assistantName = opts.assistantName ?? \"Assistant\";\n const who =\n normalizedRole === \"user\"\n ? \"You\"\n : normalizedRole === \"assistant\"\n ? assistantName\n : normalizedRole;\n const roleClass =\n normalizedRole === \"user\"\n ? \"user\"\n : normalizedRole === \"assistant\"\n ? \"assistant\"\n : \"other\";\n const timestamp = new Date(group.timestamp).toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n\n return html`\n <div class=\"chat-group ${roleClass}\">\n ${renderAvatar(group.role, {\n name: assistantName,\n avatar: opts.assistantAvatar ?? null,\n })}\n <div class=\"chat-group-messages\">\n ${group.messages.map((item, index) =>\n renderGroupedMessage(\n item.message,\n {\n isStreaming:\n group.isStreaming && index === group.messages.length - 1,\n showReasoning: opts.showReasoning,\n },\n opts.onOpenSidebar,\n ),\n )}\n <div class=\"chat-group-footer\">\n <span class=\"chat-sender-name\">${who}</span>\n <span class=\"chat-group-timestamp\">${timestamp}</span>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderAvatar(\n role: string,\n assistant?: Pick<AssistantIdentity, \"name\" | \"avatar\">,\n) {\n const normalized = normalizeRoleForGrouping(role);\n const assistantName = assistant?.name?.trim() || \"Assistant\";\n const assistantAvatar = assistant?.avatar?.trim() || \"\";\n const initial =\n normalized === \"user\"\n ? \"U\"\n : normalized === \"assistant\"\n ? assistantName.charAt(0).toUpperCase() || \"A\"\n : normalized === \"tool\"\n ? \"⚙\"\n : \"?\";\n const className =\n normalized === \"user\"\n ? \"user\"\n : normalized === \"assistant\"\n ? \"assistant\"\n : normalized === \"tool\"\n ? \"tool\"\n : \"other\";\n\n if (assistantAvatar && normalized === \"assistant\") {\n if (isAvatarUrl(assistantAvatar)) {\n return html`<img\n class=\"chat-avatar ${className}\"\n src=\"${assistantAvatar}\"\n alt=\"${assistantName}\"\n />`;\n }\n return html`<div class=\"chat-avatar ${className}\">${assistantAvatar}</div>`;\n }\n\n return html`<div class=\"chat-avatar ${className}\">${initial}</div>`;\n}\n\nfunction isAvatarUrl(value: string): boolean {\n return (\n /^https?:\\/\\//i.test(value) ||\n /^data:image\\//i.test(value) ||\n value.startsWith(\"/\") // Relative paths from avatar endpoint\n );\n}\n\nfunction renderMessageImages(images: ImageBlock[]) {\n if (images.length === 0) return nothing;\n\n return html`\n <div class=\"chat-message-images\">\n ${images.map(\n (img) => html`\n <img\n src=${img.url}\n alt=${img.alt ?? \"Attached image\"}\n class=\"chat-message-image\"\n @click=${() => window.open(img.url, \"_blank\")}\n />\n `,\n )}\n </div>\n `;\n}\n\nfunction renderGroupedMessage(\n message: unknown,\n opts: { isStreaming: boolean; showReasoning: boolean },\n onOpenSidebar?: (content: string) => void,\n) {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n const isToolResult =\n isToolResultMessage(message) ||\n role.toLowerCase() === \"toolresult\" ||\n role.toLowerCase() === \"tool_result\" ||\n typeof m.toolCallId === \"string\" ||\n typeof m.tool_call_id === \"string\";\n\n const toolCards = extractToolCards(message);\n const hasToolCards = toolCards.length > 0;\n const images = extractImages(message);\n const hasImages = images.length > 0;\n\n const extractedText = extractTextCached(message);\n const extractedThinking =\n opts.showReasoning && role === \"assistant\"\n ? extractThinkingCached(message)\n : null;\n const markdownBase = extractedText?.trim() ? extractedText : null;\n const reasoningMarkdown = extractedThinking\n ? formatReasoningMarkdown(extractedThinking)\n : null;\n const markdown = markdownBase;\n const canCopyMarkdown = role === \"assistant\" && Boolean(markdown?.trim());\n\n const bubbleClasses = [\n \"chat-bubble\",\n canCopyMarkdown ? \"has-copy\" : \"\",\n opts.isStreaming ? \"streaming\" : \"\",\n \"fade-in\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (!markdown && hasToolCards && isToolResult) {\n return html`${toolCards.map((card) =>\n renderToolCardSidebar(card, onOpenSidebar),\n )}`;\n }\n\n if (!markdown && !hasToolCards && !hasImages) return nothing;\n\n return html`\n <div class=\"${bubbleClasses}\">\n ${canCopyMarkdown ? renderCopyAsMarkdownButton(markdown!) : nothing}\n ${renderMessageImages(images)}\n ${reasoningMarkdown\n ? html`<div class=\"chat-thinking\">${unsafeHTML(\n toSanitizedMarkdownHtml(reasoningMarkdown),\n )}</div>`\n : nothing}\n ${markdown\n ? html`<div class=\"chat-text\">${unsafeHTML(toSanitizedMarkdownHtml(markdown))}</div>`\n : nothing}\n ${toolCards.length > 1\n ? renderActivityFeed(toolCards)\n : toolCards.map((card) => renderToolCardSidebar(card, onOpenSidebar))}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport { icons } from \"../icons\";\nimport { toSanitizedMarkdownHtml } from \"../markdown\";\n\nexport type MarkdownSidebarProps = {\n content: string | null;\n error: string | null;\n onClose: () => void;\n onViewRawText: () => void;\n};\n\nexport function renderMarkdownSidebar(props: MarkdownSidebarProps) {\n return html`\n <div class=\"sidebar-panel\">\n <div class=\"sidebar-header\">\n <div class=\"sidebar-title\">Tool Output</div>\n <button @click=${props.onClose} class=\"btn\" title=\"Close sidebar\">\n ${icons.x}\n </button>\n </div>\n <div class=\"sidebar-content\">\n ${props.error\n ? html`\n <div class=\"callout danger\">${props.error}</div>\n <button @click=${props.onViewRawText} class=\"btn\" style=\"margin-top: 12px;\">\n View Raw Text\n </button>\n `\n : props.content\n ? html`<div class=\"sidebar-markdown\">${unsafeHTML(toSanitizedMarkdownHtml(props.content))}</div>`\n : html`<div class=\"muted\">No content available</div>`}\n </div>\n </div>\n `;\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * A draggable divider for resizable split views.\n * Dispatches 'resize' events with { splitRatio: number } detail.\n */\n@customElement(\"resizable-divider\")\nexport class ResizableDivider extends LitElement {\n @property({ type: Number }) splitRatio = 0.6;\n @property({ type: Number }) minRatio = 0.4;\n @property({ type: Number }) maxRatio = 0.7;\n\n private isDragging = false;\n private startX = 0;\n private startRatio = 0;\n\n static styles = css`\n :host {\n width: 4px;\n cursor: col-resize;\n background: var(--border, #333);\n transition: background 150ms ease-out;\n flex-shrink: 0;\n position: relative;\n }\n\n :host::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -4px;\n right: -4px;\n bottom: 0;\n }\n\n :host(:hover) {\n background: var(--accent, #007bff);\n }\n\n :host(.dragging) {\n background: var(--accent, #007bff);\n }\n `;\n\n render() {\n return html``;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"mousedown\", this.handleMouseDown);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"mousedown\", this.handleMouseDown);\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\n }\n\n private handleMouseDown = (e: MouseEvent) => {\n this.isDragging = true;\n this.startX = e.clientX;\n this.startRatio = this.splitRatio;\n this.classList.add(\"dragging\");\n\n document.addEventListener(\"mousemove\", this.handleMouseMove);\n document.addEventListener(\"mouseup\", this.handleMouseUp);\n\n e.preventDefault();\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n\n const container = this.parentElement;\n if (!container) return;\n\n const containerWidth = container.getBoundingClientRect().width;\n const deltaX = e.clientX - this.startX;\n const deltaRatio = deltaX / containerWidth;\n\n let newRatio = this.startRatio + deltaRatio;\n newRatio = Math.max(this.minRatio, Math.min(this.maxRatio, newRatio));\n\n this.dispatchEvent(\n new CustomEvent(\"resize\", {\n detail: { splitRatio: newRatio },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private handleMouseUp = () => {\n this.isDragging = false;\n this.classList.remove(\"dragging\");\n\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"resizable-divider\": ResizableDivider;\n }\n}\n","import { html, nothing } from \"lit\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport type { SessionsListResult } from \"../types\";\nimport type { ChatAttachment, ChatQueueItem } from \"../ui-types\";\nimport type { ChatItem, MessageGroup } from \"../types/chat-types\";\nimport { icons } from \"../icons\";\nimport {\n normalizeMessage,\n normalizeRoleForGrouping,\n} from \"../chat/message-normalizer\";\nimport {\n renderMessageGroup,\n renderReadingIndicatorGroup,\n renderStreamingGroup,\n} from \"../chat/grouped-render\";\nimport { renderMarkdownSidebar } from \"./markdown-sidebar\";\nimport \"../components/resizable-divider\";\n\nexport type CompactionIndicatorStatus = {\n active: boolean;\n startedAt: number | null;\n completedAt: number | null;\n};\n\nexport type ChatProps = {\n sessionKey: string;\n onSessionKeyChange: (next: string) => void;\n thinkingLevel: string | null;\n showThinking: boolean;\n loading: boolean;\n sending: boolean;\n canAbort?: boolean;\n compactionStatus?: CompactionIndicatorStatus | null;\n messages: unknown[];\n toolMessages: unknown[];\n stream: string | null;\n streamStartedAt: number | null;\n assistantAvatarUrl?: string | null;\n draft: string;\n queue: ChatQueueItem[];\n connected: boolean;\n canSend: boolean;\n disabledReason: string | null;\n error: string | null;\n sessions: SessionsListResult | null;\n // Focus mode\n focusMode: boolean;\n // Sidebar state\n sidebarOpen?: boolean;\n sidebarContent?: string | null;\n sidebarError?: string | null;\n splitRatio?: number;\n assistantName: string;\n assistantAvatar: string | null;\n // Image attachments\n attachments?: ChatAttachment[];\n onAttachmentsChange?: (attachments: ChatAttachment[]) => void;\n // Event handlers\n onRefresh: () => void;\n onToggleFocusMode: () => void;\n onDraftChange: (next: string) => void;\n onSend: () => void;\n onAbort?: () => void;\n onQueueRemove: (id: string) => void;\n onNewSession: () => void;\n onOpenSidebar?: (content: string) => void;\n onCloseSidebar?: () => void;\n onSplitRatioChange?: (ratio: number) => void;\n onChatScroll?: (event: Event) => void;\n};\n\nconst COMPACTION_TOAST_DURATION_MS = 5000;\n\nfunction renderCompactionIndicator(status: CompactionIndicatorStatus | null | undefined) {\n if (!status) return nothing;\n\n // Show \"compacting...\" while active\n if (status.active) {\n return html`\n <div class=\"callout info compaction-indicator compaction-indicator--active\">\n ${icons.loader} Compacting context...\n </div>\n `;\n }\n\n // Show \"compaction complete\" briefly after completion\n if (status.completedAt) {\n const elapsed = Date.now() - status.completedAt;\n if (elapsed < COMPACTION_TOAST_DURATION_MS) {\n return html`\n <div class=\"callout success compaction-indicator compaction-indicator--complete\">\n ${icons.check} Context compacted\n </div>\n `;\n }\n }\n\n return nothing;\n}\n\nfunction generateAttachmentId(): string {\n return `att-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction handlePaste(\n e: ClipboardEvent,\n props: ChatProps,\n) {\n const items = e.clipboardData?.items;\n if (!items || !props.onAttachmentsChange) return;\n\n const imageItems: DataTransferItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith(\"image/\")) {\n imageItems.push(item);\n }\n }\n\n if (imageItems.length === 0) return;\n\n e.preventDefault();\n\n for (const item of imageItems) {\n const file = item.getAsFile();\n if (!file) continue;\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl,\n mimeType: file.type,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsDataURL(file);\n }\n}\n\nfunction renderAttachmentPreview(props: ChatProps) {\n const attachments = props.attachments ?? [];\n if (attachments.length === 0) return nothing;\n\n return html`\n <div class=\"chat-attachments\">\n ${attachments.map(\n (att) => html`\n <div class=\"chat-attachment\">\n <img\n src=${att.dataUrl}\n alt=\"Attachment preview\"\n class=\"chat-attachment__img\"\n />\n <button\n class=\"chat-attachment__remove\"\n type=\"button\"\n aria-label=\"Remove attachment\"\n @click=${() => {\n const next = (props.attachments ?? []).filter(\n (a) => a.id !== att.id,\n );\n props.onAttachmentsChange?.(next);\n }}\n >\n ${icons.x}\n </button>\n </div>\n `,\n )}\n </div>\n `;\n}\n\nexport function renderChat(props: ChatProps) {\n const canCompose = props.connected;\n const isBusy = props.sending || props.stream !== null;\n const canAbort = Boolean(props.canAbort && props.onAbort);\n const activeSession = props.sessions?.sessions?.find(\n (row) => row.key === props.sessionKey,\n );\n const reasoningLevel = activeSession?.reasoningLevel ?? \"off\";\n const showReasoning = props.showThinking && reasoningLevel !== \"off\";\n const assistantIdentity = {\n name: props.assistantName,\n avatar: props.assistantAvatar ?? props.assistantAvatarUrl ?? null,\n };\n\n const hasAttachments = (props.attachments?.length ?? 0) > 0;\n const composePlaceholder = props.connected\n ? hasAttachments\n ? \"Add a message or paste more images...\"\n : \"Message (↩ to send, Shift+↩ for line breaks, paste images)\"\n : \"Connect to the gateway to start chatting…\";\n\n const splitRatio = props.splitRatio ?? 0.6;\n const sidebarOpen = Boolean(props.sidebarOpen && props.onCloseSidebar);\n const thread = html`\n <div\n class=\"chat-thread\"\n role=\"log\"\n aria-live=\"polite\"\n @scroll=${props.onChatScroll}\n >\n ${props.loading ? html`<div class=\"muted\">Loading chat…</div>` : nothing}\n ${repeat(buildChatItems(props), (item) => item.key, (item) => {\n if (item.kind === \"reading-indicator\") {\n return renderReadingIndicatorGroup(assistantIdentity);\n }\n\n if (item.kind === \"stream\") {\n return renderStreamingGroup(\n item.text,\n item.startedAt,\n props.onOpenSidebar,\n assistantIdentity,\n );\n }\n\n if (item.kind === \"group\") {\n return renderMessageGroup(item, {\n onOpenSidebar: props.onOpenSidebar,\n showReasoning,\n assistantName: props.assistantName,\n assistantAvatar: assistantIdentity.avatar,\n });\n }\n\n return nothing;\n })}\n </div>\n `;\n\n return html`\n <section class=\"card chat\">\n ${props.disabledReason\n ? html`<div class=\"callout\">${props.disabledReason}</div>`\n : nothing}\n\n ${props.error\n ? html`<div class=\"callout danger\">${props.error}</div>`\n : nothing}\n\n ${renderCompactionIndicator(props.compactionStatus)}\n\n ${props.focusMode\n ? html`\n <button\n class=\"chat-focus-exit\"\n type=\"button\"\n @click=${props.onToggleFocusMode}\n aria-label=\"Exit focus mode\"\n title=\"Exit focus mode\"\n >\n ${icons.x}\n </button>\n `\n : nothing}\n\n <div\n class=\"chat-split-container ${sidebarOpen ? \"chat-split-container--open\" : \"\"}\"\n >\n <div\n class=\"chat-main\"\n style=\"flex: ${sidebarOpen ? `0 0 ${splitRatio * 100}%` : \"1 1 100%\"}\"\n >\n ${thread}\n </div>\n\n ${sidebarOpen\n ? html`\n <resizable-divider\n .splitRatio=${splitRatio}\n @resize=${(e: CustomEvent) =>\n props.onSplitRatioChange?.(e.detail.splitRatio)}\n ></resizable-divider>\n <div class=\"chat-sidebar\">\n ${renderMarkdownSidebar({\n content: props.sidebarContent ?? null,\n error: props.sidebarError ?? null,\n onClose: props.onCloseSidebar!,\n onViewRawText: () => {\n if (!props.sidebarContent || !props.onOpenSidebar) return;\n props.onOpenSidebar(`\\`\\`\\`\\n${props.sidebarContent}\\n\\`\\`\\``);\n },\n })}\n </div>\n `\n : nothing}\n </div>\n\n ${props.queue.length\n ? html`\n <div class=\"chat-queue\" role=\"status\" aria-live=\"polite\">\n <div class=\"chat-queue__title\">Queued (${props.queue.length})</div>\n <div class=\"chat-queue__list\">\n ${props.queue.map(\n (item) => html`\n <div class=\"chat-queue__item\">\n <div class=\"chat-queue__text\">\n ${item.text ||\n (item.attachments?.length\n ? `Image (${item.attachments.length})`\n : \"\")}\n </div>\n <button\n class=\"btn chat-queue__remove\"\n type=\"button\"\n aria-label=\"Remove queued message\"\n @click=${() => props.onQueueRemove(item.id)}\n >\n ${icons.x}\n </button>\n </div>\n `,\n )}\n </div>\n </div>\n `\n : nothing}\n\n <div class=\"chat-compose\">\n ${renderAttachmentPreview(props)}\n <div class=\"chat-compose__row\">\n <label class=\"field chat-compose__field\">\n <span>Message</span>\n <textarea\n .value=${props.draft}\n ?disabled=${!props.connected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key !== \"Enter\") return;\n if (e.isComposing || e.keyCode === 229) return;\n if (e.shiftKey) return; // Allow Shift+Enter for line breaks\n if (!props.connected) return;\n e.preventDefault();\n if (canCompose) props.onSend();\n }}\n @input=${(e: Event) =>\n props.onDraftChange((e.target as HTMLTextAreaElement).value)}\n @paste=${(e: ClipboardEvent) => handlePaste(e, props)}\n placeholder=${composePlaceholder}\n ></textarea>\n </label>\n <div class=\"chat-compose__actions\">\n <button\n class=\"btn\"\n ?disabled=${!props.connected || (!canAbort && props.sending)}\n @click=${canAbort ? props.onAbort : props.onNewSession}\n >\n ${canAbort ? \"Stop\" : \"New session\"}\n </button>\n <button\n class=\"btn primary\"\n ?disabled=${!props.connected}\n @click=${props.onSend}\n >\n ${isBusy ? \"Queue\" : \"Send\"}<kbd class=\"btn-kbd\">↵</kbd>\n </button>\n </div>\n </div>\n </div>\n </section>\n `;\n}\n\nconst CHAT_HISTORY_RENDER_LIMIT = 200;\n\nfunction groupMessages(items: ChatItem[]): Array<ChatItem | MessageGroup> {\n const result: Array<ChatItem | MessageGroup> = [];\n let currentGroup: MessageGroup | null = null;\n\n for (const item of items) {\n if (item.kind !== \"message\") {\n if (currentGroup) {\n result.push(currentGroup);\n currentGroup = null;\n }\n result.push(item);\n continue;\n }\n\n const normalized = normalizeMessage(item.message);\n const role = normalizeRoleForGrouping(normalized.role);\n const timestamp = normalized.timestamp || Date.now();\n\n if (!currentGroup || currentGroup.role !== role) {\n if (currentGroup) result.push(currentGroup);\n currentGroup = {\n kind: \"group\",\n key: `group:${role}:${item.key}`,\n role,\n messages: [{ message: item.message, key: item.key }],\n timestamp,\n isStreaming: false,\n };\n } else {\n currentGroup.messages.push({ message: item.message, key: item.key });\n }\n }\n\n if (currentGroup) result.push(currentGroup);\n return result;\n}\n\nfunction buildChatItems(props: ChatProps): Array<ChatItem | MessageGroup> {\n const items: ChatItem[] = [];\n const history = Array.isArray(props.messages) ? props.messages : [];\n const tools = Array.isArray(props.toolMessages) ? props.toolMessages : [];\n const historyStart = Math.max(0, history.length - CHAT_HISTORY_RENDER_LIMIT);\n if (historyStart > 0) {\n items.push({\n kind: \"message\",\n key: \"chat:history:notice\",\n message: {\n role: \"system\",\n content: `Showing last ${CHAT_HISTORY_RENDER_LIMIT} messages (${historyStart} hidden).`,\n timestamp: Date.now(),\n },\n });\n }\n for (let i = historyStart; i < history.length; i++) {\n const msg = history[i];\n const normalized = normalizeMessage(msg);\n\n if (!props.showThinking && normalized.role.toLowerCase() === \"toolresult\") {\n continue;\n }\n\n items.push({\n kind: \"message\",\n key: messageKey(msg, i),\n message: msg,\n });\n }\n if (props.showThinking) {\n for (let i = 0; i < tools.length; i++) {\n items.push({\n kind: \"message\",\n key: messageKey(tools[i], i + history.length),\n message: tools[i],\n });\n }\n }\n\n if (props.stream !== null) {\n const key = `stream:${props.sessionKey}:${props.streamStartedAt ?? \"live\"}`;\n if (props.stream.trim().length > 0) {\n items.push({\n kind: \"stream\",\n key,\n text: props.stream,\n startedAt: props.streamStartedAt ?? Date.now(),\n });\n } else {\n items.push({ kind: \"reading-indicator\", key });\n }\n }\n\n return groupMessages(items);\n}\n\nfunction messageKey(message: unknown, index: number): string {\n const m = message as Record<string, unknown>;\n const toolCallId = typeof m.toolCallId === \"string\" ? m.toolCallId : \"\";\n if (toolCallId) return `tool:${toolCallId}`;\n const id = typeof m.id === \"string\" ? m.id : \"\";\n if (id) return `msg:${id}`;\n const messageId = typeof m.messageId === \"string\" ? m.messageId : \"\";\n if (messageId) return `msg:${messageId}`;\n const timestamp = typeof m.timestamp === \"number\" ? m.timestamp : null;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n if (timestamp != null) return `msg:${role}:${timestamp}:${index}`;\n return `msg:${role}:${index}`;\n}\n","import type { ConfigUiHints } from \"../types\";\n\nexport type JsonSchema = {\n type?: string | string[];\n title?: string;\n description?: string;\n properties?: Record<string, JsonSchema>;\n items?: JsonSchema | JsonSchema[];\n additionalProperties?: JsonSchema | boolean;\n enum?: unknown[];\n const?: unknown;\n default?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n nullable?: boolean;\n};\n\nexport function schemaType(schema: JsonSchema): string | undefined {\n if (!schema) return undefined;\n if (Array.isArray(schema.type)) {\n const filtered = schema.type.filter((t) => t !== \"null\");\n return filtered[0] ?? schema.type[0];\n }\n return schema.type;\n}\n\nexport function defaultValue(schema?: JsonSchema): unknown {\n if (!schema) return \"\";\n if (schema.default !== undefined) return schema.default;\n const type = schemaType(schema);\n switch (type) {\n case \"object\":\n return {};\n case \"array\":\n return [];\n case \"boolean\":\n return false;\n case \"number\":\n case \"integer\":\n return 0;\n case \"string\":\n return \"\";\n default:\n return \"\";\n }\n}\n\nexport function pathKey(path: Array<string | number>): string {\n return path.filter((segment) => typeof segment === \"string\").join(\".\");\n}\n\nexport function hintForPath(path: Array<string | number>, hints: ConfigUiHints) {\n const key = pathKey(path);\n const direct = hints[key];\n if (direct) return direct;\n const segments = key.split(\".\");\n for (const [hintKey, hint] of Object.entries(hints)) {\n if (!hintKey.includes(\"*\")) continue;\n const hintSegments = hintKey.split(\".\");\n if (hintSegments.length !== segments.length) continue;\n let match = true;\n for (let i = 0; i < segments.length; i += 1) {\n if (hintSegments[i] !== \"*\" && hintSegments[i] !== segments[i]) {\n match = false;\n break;\n }\n }\n if (match) return hint;\n }\n return undefined;\n}\n\nexport function humanize(raw: string) {\n return raw\n .replace(/_/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/\\s+/g, \" \")\n .replace(/^./, (m) => m.toUpperCase());\n}\n\nexport function isSensitivePath(path: Array<string | number>): boolean {\n const key = pathKey(path).toLowerCase();\n return (\n key.includes(\"token\") ||\n key.includes(\"password\") ||\n key.includes(\"secret\") ||\n key.includes(\"apikey\") ||\n key.endsWith(\"key\")\n );\n}\n","import { html, nothing, type TemplateResult } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport {\n defaultValue,\n hintForPath,\n humanize,\n isSensitivePath,\n pathKey,\n schemaType,\n type JsonSchema,\n} from \"./config-form.shared\";\n\nconst META_KEYS = new Set([\"title\", \"description\", \"default\", \"nullable\"]);\n\nfunction isAnySchema(schema: JsonSchema): boolean {\n const keys = Object.keys(schema ?? {}).filter((key) => !META_KEYS.has(key));\n return keys.length === 0;\n}\n\nfunction jsonValue(value: unknown): string {\n if (value === undefined) return \"\";\n try {\n return JSON.stringify(value, null, 2) ?? \"\";\n } catch {\n return \"\";\n }\n}\n\n// SVG Icons as template literals\nconst icons = {\n chevronDown: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>`,\n plus: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>`,\n minus: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>`,\n trash: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"></polyline><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path></svg>`,\n edit: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path></svg>`,\n};\n\nexport function renderNode(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult | typeof nothing {\n const { schema, value, path, hints, unsupported, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const type = schemaType(schema);\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const key = pathKey(path);\n\n if (unsupported.has(key)) {\n return html`<div class=\"cfg-field cfg-field--error\">\n <div class=\"cfg-field__label\">${label}</div>\n <div class=\"cfg-field__error\">Unsupported schema node. Use Raw mode.</div>\n </div>`;\n }\n\n // Handle anyOf/oneOf unions\n if (schema.anyOf || schema.oneOf) {\n const variants = schema.anyOf ?? schema.oneOf ?? [];\n const nonNull = variants.filter(\n (v) => !(v.type === \"null\" || (Array.isArray(v.type) && v.type.includes(\"null\")))\n );\n\n if (nonNull.length === 1) {\n return renderNode({ ...params, schema: nonNull[0] });\n }\n\n // Check if it's a set of literal values (enum-like)\n const extractLiteral = (v: JsonSchema): unknown | undefined => {\n if (v.const !== undefined) return v.const;\n if (v.enum && v.enum.length === 1) return v.enum[0];\n return undefined;\n };\n const literals = nonNull.map(extractLiteral);\n const allLiterals = literals.every((v) => v !== undefined);\n\n if (allLiterals && literals.length > 0 && literals.length <= 5) {\n // Use segmented control for small sets\n const resolvedValue = value ?? schema.default;\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-segmented\">\n ${literals.map((lit, idx) => html`\n <button\n type=\"button\"\n class=\"cfg-segmented__btn ${lit === resolvedValue || String(lit) === String(resolvedValue) ? 'active' : ''}\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, lit)}\n >\n ${String(lit)}\n </button>\n `)}\n </div>\n </div>\n `;\n }\n\n if (allLiterals && literals.length > 5) {\n // Use dropdown for larger sets\n return renderSelect({ ...params, options: literals, value: value ?? schema.default });\n }\n\n // Handle mixed primitive types\n const primitiveTypes = new Set(\n nonNull.map((variant) => schemaType(variant)).filter(Boolean)\n );\n const normalizedTypes = new Set(\n [...primitiveTypes].map((v) => (v === \"integer\" ? \"number\" : v))\n );\n\n if ([...normalizedTypes].every((v) => [\"string\", \"number\", \"boolean\"].includes(v as string))) {\n const hasString = normalizedTypes.has(\"string\");\n const hasNumber = normalizedTypes.has(\"number\");\n const hasBoolean = normalizedTypes.has(\"boolean\");\n\n if (hasBoolean && normalizedTypes.size === 1) {\n return renderNode({\n ...params,\n schema: { ...schema, type: \"boolean\", anyOf: undefined, oneOf: undefined },\n });\n }\n\n if (hasString || hasNumber) {\n return renderTextInput({\n ...params,\n inputType: hasNumber && !hasString ? \"number\" : \"text\",\n });\n }\n }\n }\n\n // Enum - use segmented for small, dropdown for large\n if (schema.enum) {\n const options = schema.enum;\n if (options.length <= 5) {\n const resolvedValue = value ?? schema.default;\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-segmented\">\n ${options.map((opt) => html`\n <button\n type=\"button\"\n class=\"cfg-segmented__btn ${opt === resolvedValue || String(opt) === String(resolvedValue) ? 'active' : ''}\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, opt)}\n >\n ${String(opt)}\n </button>\n `)}\n </div>\n </div>\n `;\n }\n return renderSelect({ ...params, options, value: value ?? schema.default });\n }\n\n // Object type - collapsible section\n if (type === \"object\") {\n return renderObject(params);\n }\n\n // Array type\n if (type === \"array\") {\n return renderArray(params);\n }\n\n // Boolean - toggle row\n if (type === \"boolean\") {\n const displayValue = typeof value === \"boolean\" ? value : typeof schema.default === \"boolean\" ? schema.default : false;\n return html`\n <label class=\"cfg-toggle-row ${disabled ? 'disabled' : ''}\">\n <div class=\"cfg-toggle-row__content\">\n <span class=\"cfg-toggle-row__label\">${label}</span>\n ${help ? html`<span class=\"cfg-toggle-row__help\">${help}</span>` : nothing}\n </div>\n <div class=\"cfg-toggle\">\n <input\n type=\"checkbox\"\n .checked=${displayValue}\n ?disabled=${disabled}\n @change=${(e: Event) => onPatch(path, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"cfg-toggle__track\"></span>\n </div>\n </label>\n `;\n }\n\n // Number/Integer\n if (type === \"number\" || type === \"integer\") {\n return renderNumberInput(params);\n }\n\n // String\n if (type === \"string\") {\n return renderTextInput({ ...params, inputType: \"text\" });\n }\n\n // Fallback\n return html`\n <div class=\"cfg-field cfg-field--error\">\n <div class=\"cfg-field__label\">${label}</div>\n <div class=\"cfg-field__error\">Unsupported type: ${type}. Use Raw mode.</div>\n </div>\n `;\n}\n\nfunction renderTextInput(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n disabled: boolean;\n showLabel?: boolean;\n inputType: \"text\" | \"number\";\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, disabled, onPatch, inputType } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const isSensitive = hint?.sensitive ?? isSensitivePath(path);\n const placeholder =\n hint?.placeholder ??\n (isSensitive ? \"••••\" : schema.default !== undefined ? `Default: ${schema.default}` : \"\");\n const displayValue = value ?? \"\";\n\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-input-wrap\">\n <input\n type=${isSensitive ? \"password\" : inputType}\n class=\"cfg-input\"\n placeholder=${placeholder}\n .value=${displayValue == null ? \"\" : String(displayValue)}\n ?disabled=${disabled}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n if (inputType === \"number\") {\n if (raw.trim() === \"\") {\n onPatch(path, undefined);\n return;\n }\n const parsed = Number(raw);\n onPatch(path, Number.isNaN(parsed) ? raw : parsed);\n return;\n }\n onPatch(path, raw);\n }}\n />\n ${schema.default !== undefined ? html`\n <button\n type=\"button\"\n class=\"cfg-input__reset\"\n title=\"Reset to default\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, schema.default)}\n >↺</button>\n ` : nothing}\n </div>\n </div>\n `;\n}\n\nfunction renderNumberInput(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const displayValue = value ?? schema.default ?? \"\";\n const numValue = typeof displayValue === \"number\" ? displayValue : 0;\n\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-number\">\n <button\n type=\"button\"\n class=\"cfg-number__btn\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, numValue - 1)}\n >−</button>\n <input\n type=\"number\"\n class=\"cfg-number__input\"\n .value=${displayValue == null ? \"\" : String(displayValue)}\n ?disabled=${disabled}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n const parsed = raw === \"\" ? undefined : Number(raw);\n onPatch(path, parsed);\n }}\n />\n <button\n type=\"button\"\n class=\"cfg-number__btn\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, numValue + 1)}\n >+</button>\n </div>\n </div>\n `;\n}\n\nfunction renderSelect(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n disabled: boolean;\n showLabel?: boolean;\n options: unknown[];\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, disabled, options, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const resolvedValue = value ?? schema.default;\n const currentIndex = options.findIndex(\n (opt) => opt === resolvedValue || String(opt) === String(resolvedValue),\n );\n const unset = \"__unset__\";\n\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <select\n class=\"cfg-select\"\n ?disabled=${disabled}\n .value=${currentIndex >= 0 ? String(currentIndex) : unset}\n @change=${(e: Event) => {\n const val = (e.target as HTMLSelectElement).value;\n onPatch(path, val === unset ? undefined : options[Number(val)]);\n }}\n >\n <option value=${unset}>Select...</option>\n ${options.map((opt, idx) => html`\n <option value=${String(idx)}>${String(opt)}</option>\n `)}\n </select>\n </div>\n `;\n}\n\nfunction renderObject(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, unsupported, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n\n const fallback = value ?? schema.default;\n const obj = fallback && typeof fallback === \"object\" && !Array.isArray(fallback)\n ? (fallback as Record<string, unknown>)\n : {};\n const props = schema.properties ?? {};\n const entries = Object.entries(props);\n\n // Sort by hint order\n const sorted = entries.sort((a, b) => {\n const orderA = hintForPath([...path, a[0]], hints)?.order ?? 0;\n const orderB = hintForPath([...path, b[0]], hints)?.order ?? 0;\n if (orderA !== orderB) return orderA - orderB;\n return a[0].localeCompare(b[0]);\n });\n\n const reserved = new Set(Object.keys(props));\n const additional = schema.additionalProperties;\n const allowExtra = Boolean(additional) && typeof additional === \"object\";\n\n // For top-level, don't wrap in collapsible\n if (path.length === 1) {\n return html`\n <div class=\"cfg-fields\">\n ${sorted.map(([propKey, node]) =>\n renderNode({\n schema: node,\n value: obj[propKey],\n path: [...path, propKey],\n hints,\n unsupported,\n disabled,\n onPatch,\n })\n )}\n ${allowExtra ? renderMapField({\n schema: additional as JsonSchema,\n value: obj,\n path,\n hints,\n unsupported,\n disabled,\n reservedKeys: reserved,\n onPatch,\n }) : nothing}\n </div>\n `;\n }\n\n // Nested objects get collapsible treatment\n return html`\n <details class=\"cfg-object\" open>\n <summary class=\"cfg-object__header\">\n <span class=\"cfg-object__title\">${label}</span>\n <span class=\"cfg-object__chevron\">${icons.chevronDown}</span>\n </summary>\n ${help ? html`<div class=\"cfg-object__help\">${help}</div>` : nothing}\n <div class=\"cfg-object__content\">\n ${sorted.map(([propKey, node]) =>\n renderNode({\n schema: node,\n value: obj[propKey],\n path: [...path, propKey],\n hints,\n unsupported,\n disabled,\n onPatch,\n })\n )}\n ${allowExtra ? renderMapField({\n schema: additional as JsonSchema,\n value: obj,\n path,\n hints,\n unsupported,\n disabled,\n reservedKeys: reserved,\n onPatch,\n }) : nothing}\n </div>\n </details>\n `;\n}\n\nfunction renderArray(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, unsupported, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n\n const itemsSchema = Array.isArray(schema.items) ? schema.items[0] : schema.items;\n if (!itemsSchema) {\n return html`\n <div class=\"cfg-field cfg-field--error\">\n <div class=\"cfg-field__label\">${label}</div>\n <div class=\"cfg-field__error\">Unsupported array schema. Use Raw mode.</div>\n </div>\n `;\n }\n\n const arr = Array.isArray(value) ? value : Array.isArray(schema.default) ? schema.default : [];\n\n return html`\n <div class=\"cfg-array\">\n <div class=\"cfg-array__header\">\n ${showLabel ? html`<span class=\"cfg-array__label\">${label}</span>` : nothing}\n <span class=\"cfg-array__count\">${arr.length} item${arr.length !== 1 ? 's' : ''}</span>\n <button\n type=\"button\"\n class=\"cfg-array__add\"\n ?disabled=${disabled}\n @click=${() => {\n const next = [...arr, defaultValue(itemsSchema)];\n onPatch(path, next);\n }}\n >\n <span class=\"cfg-array__add-icon\">${icons.plus}</span>\n Add\n </button>\n </div>\n ${help ? html`<div class=\"cfg-array__help\">${help}</div>` : nothing}\n\n ${arr.length === 0 ? html`\n <div class=\"cfg-array__empty\">\n No items yet. Click \"Add\" to create one.\n </div>\n ` : html`\n <div class=\"cfg-array__items\">\n ${arr.map((item, idx) => html`\n <div class=\"cfg-array__item\">\n <div class=\"cfg-array__item-header\">\n <span class=\"cfg-array__item-index\">#${idx + 1}</span>\n <button\n type=\"button\"\n class=\"cfg-array__item-remove\"\n title=\"Remove item\"\n ?disabled=${disabled}\n @click=${() => {\n const next = [...arr];\n next.splice(idx, 1);\n onPatch(path, next);\n }}\n >\n ${icons.trash}\n </button>\n </div>\n <div class=\"cfg-array__item-content\">\n ${renderNode({\n schema: itemsSchema,\n value: item,\n path: [...path, idx],\n hints,\n unsupported,\n disabled,\n showLabel: false,\n onPatch,\n })}\n </div>\n </div>\n `)}\n </div>\n `}\n </div>\n `;\n}\n\nfunction renderMapField(params: {\n schema: JsonSchema;\n value: Record<string, unknown>;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n reservedKeys: Set<string>;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, unsupported, disabled, reservedKeys, onPatch } = params;\n const anySchema = isAnySchema(schema);\n const entries = Object.entries(value ?? {}).filter(([key]) => !reservedKeys.has(key));\n\n return html`\n <div class=\"cfg-map\">\n <div class=\"cfg-map__header\">\n <span class=\"cfg-map__label\">Custom entries</span>\n <button\n type=\"button\"\n class=\"cfg-map__add\"\n ?disabled=${disabled}\n @click=${() => {\n const next = { ...(value ?? {}) };\n let index = 1;\n let key = `custom-${index}`;\n while (key in next) {\n index += 1;\n key = `custom-${index}`;\n }\n next[key] = anySchema ? {} : defaultValue(schema);\n onPatch(path, next);\n }}\n >\n <span class=\"cfg-map__add-icon\">${icons.plus}</span>\n Add Entry\n </button>\n </div>\n\n ${entries.length === 0 ? html`\n <div class=\"cfg-map__empty\">No custom entries.</div>\n ` : html`\n <div class=\"cfg-map__items\">\n ${entries.map(([key, entryValue]) => {\n const valuePath = [...path, key];\n const fallback = jsonValue(entryValue);\n return html`\n <div class=\"cfg-map__item\">\n <div class=\"cfg-map__item-key\">\n <input\n type=\"text\"\n class=\"cfg-input cfg-input--sm\"\n placeholder=\"Key\"\n .value=${key}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const nextKey = (e.target as HTMLInputElement).value.trim();\n if (!nextKey || nextKey === key) return;\n const next = { ...(value ?? {}) };\n if (nextKey in next) return;\n next[nextKey] = next[key];\n delete next[key];\n onPatch(path, next);\n }}\n />\n </div>\n <div class=\"cfg-map__item-value\">\n ${anySchema\n ? html`\n <textarea\n class=\"cfg-textarea cfg-textarea--sm\"\n placeholder=\"JSON value\"\n rows=\"2\"\n .value=${fallback}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const target = e.target as HTMLTextAreaElement;\n const raw = target.value.trim();\n if (!raw) {\n onPatch(valuePath, undefined);\n return;\n }\n try {\n onPatch(valuePath, JSON.parse(raw));\n } catch {\n target.value = fallback;\n }\n }}\n ></textarea>\n `\n : renderNode({\n schema,\n value: entryValue,\n path: valuePath,\n hints,\n unsupported,\n disabled,\n showLabel: false,\n onPatch,\n })}\n </div>\n <button\n type=\"button\"\n class=\"cfg-map__item-remove\"\n title=\"Remove entry\"\n ?disabled=${disabled}\n @click=${() => {\n const next = { ...(value ?? {}) };\n delete next[key];\n onPatch(path, next);\n }}\n >\n ${icons.trash}\n </button>\n </div>\n `;\n })}\n </div>\n `}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport { icons } from \"../icons\";\nimport {\n hintForPath,\n humanize,\n schemaType,\n type JsonSchema,\n} from \"./config-form.shared\";\nimport { renderNode } from \"./config-form.node\";\n\nexport type ConfigFormProps = {\n schema: JsonSchema | null;\n uiHints: ConfigUiHints;\n value: Record<string, unknown> | null;\n disabled?: boolean;\n unsupportedPaths?: string[];\n searchQuery?: string;\n activeSection?: string | null;\n activeSubsection?: string | null;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n};\n\n// SVG Icons for section cards (Lucide-style)\nconst sectionIcons = {\n env: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>`,\n update: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n agents: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2z\"></path><circle cx=\"8\" cy=\"14\" r=\"1\"></circle><circle cx=\"16\" cy=\"14\" r=\"1\"></circle></svg>`,\n auth: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path></svg>`,\n channels: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path></svg>`,\n messages: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"></path><polyline points=\"22,6 12,13 2,6\"></polyline></svg>`,\n commands: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><polyline points=\"4 17 10 11 4 5\"></polyline><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line></svg>`,\n hooks: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"></path><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"></path></svg>`,\n skills: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon></svg>`,\n tools: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"></path></svg>`,\n gateway: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"></path></svg>`,\n wizard: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M15 4V2\"></path><path d=\"M15 16v-2\"></path><path d=\"M8 9h2\"></path><path d=\"M20 9h2\"></path><path d=\"M17.8 11.8 19 13\"></path><path d=\"M15 9h0\"></path><path d=\"M17.8 6.2 19 5\"></path><path d=\"m3 21 9-9\"></path><path d=\"M12.2 6.2 11 5\"></path></svg>`,\n // Additional sections\n meta: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 20h9\"></path><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"></path></svg>`,\n logging: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line><polyline points=\"10 9 9 9 8 9\"></polyline></svg>`,\n browser: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"21.17\" y1=\"8\" x2=\"12\" y2=\"8\"></line><line x1=\"3.95\" y1=\"6.06\" x2=\"8.54\" y2=\"14\"></line><line x1=\"10.88\" y1=\"21.94\" x2=\"15.46\" y2=\"14\"></line></svg>`,\n ui: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line></svg>`,\n models: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line></svg>`,\n bindings: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"></line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"></line></svg>`,\n broadcast: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M4.9 19.1C1 15.2 1 8.8 4.9 4.9\"></path><path d=\"M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5\"></path><circle cx=\"12\" cy=\"12\" r=\"2\"></circle><path d=\"M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5\"></path><path d=\"M19.1 4.9C23 8.8 23 15.1 19.1 19\"></path></svg>`,\n audio: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M9 18V5l12-2v13\"></path><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><circle cx=\"18\" cy=\"16\" r=\"3\"></circle></svg>`,\n session: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"9\" cy=\"7\" r=\"4\"></circle><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"></path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"></path></svg>`,\n cron: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline></svg>`,\n web: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"></path></svg>`,\n discovery: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>`,\n canvasHost: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle><polyline points=\"21 15 16 10 5 21\"></polyline></svg>`,\n talk: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line></svg>`,\n plugins: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 2v6\"></path><path d=\"m4.93 10.93 4.24 4.24\"></path><path d=\"M2 12h6\"></path><path d=\"m4.93 13.07 4.24-4.24\"></path><path d=\"M12 22v-6\"></path><path d=\"m19.07 13.07-4.24-4.24\"></path><path d=\"M22 12h-6\"></path><path d=\"m19.07 10.93-4.24 4.24\"></path></svg>`,\n default: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline></svg>`,\n};\n\n// Section metadata\nexport const SECTION_META: Record<string, { label: string; description: string }> = {\n env: { label: \"Environment Variables\", description: \"Environment variables passed to the gateway process\" },\n update: { label: \"Updates\", description: \"Auto-update settings and release channel\" },\n agents: { label: \"Agents\", description: \"Agent configurations, models, and identities\" },\n auth: { label: \"Authentication\", description: \"API keys and authentication profiles\" },\n channels: { label: \"Channels\", description: \"Messaging channels (Telegram, Discord, Slack, etc.)\" },\n messages: { label: \"Messages\", description: \"Message handling and routing settings\" },\n commands: { label: \"Commands\", description: \"Custom slash commands\" },\n hooks: { label: \"Hooks\", description: \"Webhooks and event hooks\" },\n skills: { label: \"Skills\", description: \"Skill packs and capabilities\" },\n tools: { label: \"Tools\", description: \"Tool configurations (browser, search, etc.)\" },\n gateway: { label: \"Gateway\", description: \"Gateway server settings (port, auth, binding)\" },\n wizard: { label: \"Setup Wizard\", description: \"Setup wizard state and history\" },\n // Additional sections\n meta: { label: \"Metadata\", description: \"Gateway metadata and version information\" },\n logging: { label: \"Logging\", description: \"Log levels and output configuration\" },\n browser: { label: \"Browser\", description: \"Browser automation settings\" },\n ui: { label: \"UI\", description: \"User interface preferences\" },\n models: { label: \"Models\", description: \"AI model configurations and providers\" },\n bindings: { label: \"Bindings\", description: \"Key bindings and shortcuts\" },\n broadcast: { label: \"Broadcast\", description: \"Broadcast and notification settings\" },\n audio: { label: \"Audio\", description: \"Audio input/output settings\" },\n session: { label: \"Session\", description: \"Session management and persistence\" },\n cron: { label: \"Cron\", description: \"Scheduled tasks and automation\" },\n web: { label: \"Web\", description: \"Web server and API settings\" },\n discovery: { label: \"Discovery\", description: \"Service discovery and networking\" },\n canvasHost: { label: \"Canvas Host\", description: \"Canvas rendering and display\" },\n talk: { label: \"Talk\", description: \"Voice and speech settings\" },\n plugins: { label: \"Plugins\", description: \"Plugin management and extensions\" },\n};\n\nfunction getSectionIcon(key: string) {\n return sectionIcons[key as keyof typeof sectionIcons] ?? sectionIcons.default;\n}\n\nfunction matchesSearch(key: string, schema: JsonSchema, query: string): boolean {\n if (!query) return true;\n const q = query.toLowerCase();\n const meta = SECTION_META[key];\n\n // Check key name\n if (key.toLowerCase().includes(q)) return true;\n\n // Check label and description\n if (meta) {\n if (meta.label.toLowerCase().includes(q)) return true;\n if (meta.description.toLowerCase().includes(q)) return true;\n }\n\n return schemaMatches(schema, q);\n}\n\nfunction schemaMatches(schema: JsonSchema, query: string): boolean {\n if (schema.title?.toLowerCase().includes(query)) return true;\n if (schema.description?.toLowerCase().includes(query)) return true;\n if (schema.enum?.some((value) => String(value).toLowerCase().includes(query))) return true;\n\n if (schema.properties) {\n for (const [propKey, propSchema] of Object.entries(schema.properties)) {\n if (propKey.toLowerCase().includes(query)) return true;\n if (schemaMatches(propSchema, query)) return true;\n }\n }\n\n if (schema.items) {\n const items = Array.isArray(schema.items) ? schema.items : [schema.items];\n for (const item of items) {\n if (item && schemaMatches(item, query)) return true;\n }\n }\n\n if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n if (schemaMatches(schema.additionalProperties, query)) return true;\n }\n\n const unions = schema.anyOf ?? schema.oneOf ?? schema.allOf;\n if (unions) {\n for (const entry of unions) {\n if (entry && schemaMatches(entry, query)) return true;\n }\n }\n\n return false;\n}\n\nexport function renderConfigForm(props: ConfigFormProps) {\n if (!props.schema) {\n return html`<div class=\"muted\">Schema unavailable.</div>`;\n }\n const schema = props.schema;\n const value = props.value ?? {};\n if (schemaType(schema) !== \"object\" || !schema.properties) {\n return html`<div class=\"callout danger\">Unsupported schema. Use Raw.</div>`;\n }\n const unsupported = new Set(props.unsupportedPaths ?? []);\n const properties = schema.properties;\n const searchQuery = props.searchQuery ?? \"\";\n const activeSection = props.activeSection;\n const activeSubsection = props.activeSubsection ?? null;\n\n const entries = Object.entries(properties).sort((a, b) => {\n const orderA = hintForPath([a[0]], props.uiHints)?.order ?? 50;\n const orderB = hintForPath([b[0]], props.uiHints)?.order ?? 50;\n if (orderA !== orderB) return orderA - orderB;\n return a[0].localeCompare(b[0]);\n });\n\n const filteredEntries = entries.filter(([key, node]) => {\n if (activeSection && key !== activeSection) return false;\n if (searchQuery && !matchesSearch(key, node, searchQuery)) return false;\n return true;\n });\n\n let subsectionContext:\n | { sectionKey: string; subsectionKey: string; schema: JsonSchema }\n | null = null;\n if (activeSection && activeSubsection && filteredEntries.length === 1) {\n const sectionSchema = filteredEntries[0]?.[1];\n if (\n sectionSchema &&\n schemaType(sectionSchema) === \"object\" &&\n sectionSchema.properties &&\n sectionSchema.properties[activeSubsection]\n ) {\n subsectionContext = {\n sectionKey: activeSection,\n subsectionKey: activeSubsection,\n schema: sectionSchema.properties[activeSubsection],\n };\n }\n }\n\n if (filteredEntries.length === 0) {\n return html`\n <div class=\"config-empty\">\n <div class=\"config-empty__icon\">${icons.search}</div>\n <div class=\"config-empty__text\">\n ${searchQuery\n ? `No settings match \"${searchQuery}\"`\n : \"No settings in this section\"}\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"config-form config-form--modern\">\n ${subsectionContext\n ? (() => {\n const { sectionKey, subsectionKey, schema: node } = subsectionContext;\n const hint = hintForPath([sectionKey, subsectionKey], props.uiHints);\n const label = hint?.label ?? node.title ?? humanize(subsectionKey);\n const description = hint?.help ?? node.description ?? \"\";\n const sectionValue = (value as Record<string, unknown>)[sectionKey];\n const scopedValue =\n sectionValue && typeof sectionValue === \"object\"\n ? (sectionValue as Record<string, unknown>)[subsectionKey]\n : undefined;\n const id = `config-section-${sectionKey}-${subsectionKey}`;\n return html`\n <section class=\"config-section-card\" id=${id}>\n <div class=\"config-section-card__header\">\n <span class=\"config-section-card__icon\">${getSectionIcon(sectionKey)}</span>\n <div class=\"config-section-card__titles\">\n <h3 class=\"config-section-card__title\">${label}</h3>\n ${description\n ? html`<p class=\"config-section-card__desc\">${description}</p>`\n : nothing}\n </div>\n </div>\n <div class=\"config-section-card__content\">\n ${renderNode({\n schema: node,\n value: scopedValue,\n path: [sectionKey, subsectionKey],\n hints: props.uiHints,\n unsupported,\n disabled: props.disabled ?? false,\n showLabel: false,\n onPatch: props.onPatch,\n })}\n </div>\n </section>\n `;\n })()\n : filteredEntries.map(([key, node]) => {\n const meta = SECTION_META[key] ?? {\n label: key.charAt(0).toUpperCase() + key.slice(1),\n description: node.description ?? \"\",\n };\n\n return html`\n <section class=\"config-section-card\" id=\"config-section-${key}\">\n <div class=\"config-section-card__header\">\n <span class=\"config-section-card__icon\">${getSectionIcon(key)}</span>\n <div class=\"config-section-card__titles\">\n <h3 class=\"config-section-card__title\">${meta.label}</h3>\n ${meta.description\n ? html`<p class=\"config-section-card__desc\">${meta.description}</p>`\n : nothing}\n </div>\n </div>\n <div class=\"config-section-card__content\">\n ${renderNode({\n schema: node,\n value: (value as Record<string, unknown>)[key],\n path: [key],\n hints: props.uiHints,\n unsupported,\n disabled: props.disabled ?? false,\n showLabel: false,\n onPatch: props.onPatch,\n })}\n </div>\n </section>\n `;\n })}\n </div>\n `;\n}\n","import { pathKey, schemaType, type JsonSchema } from \"./config-form.shared\";\n\nexport type ConfigSchemaAnalysis = {\n schema: JsonSchema | null;\n unsupportedPaths: string[];\n};\n\nconst META_KEYS = new Set([\"title\", \"description\", \"default\", \"nullable\"]);\n\nfunction isAnySchema(schema: JsonSchema): boolean {\n const keys = Object.keys(schema ?? {}).filter((key) => !META_KEYS.has(key));\n return keys.length === 0;\n}\n\nfunction normalizeEnum(values: unknown[]): { enumValues: unknown[]; nullable: boolean } {\n const filtered = values.filter((value) => value != null);\n const nullable = filtered.length !== values.length;\n const enumValues: unknown[] = [];\n for (const value of filtered) {\n if (!enumValues.some((existing) => Object.is(existing, value))) {\n enumValues.push(value);\n }\n }\n return { enumValues, nullable };\n}\n\nexport function analyzeConfigSchema(raw: unknown): ConfigSchemaAnalysis {\n if (!raw || typeof raw !== \"object\") {\n return { schema: null, unsupportedPaths: [\"<root>\"] };\n }\n return normalizeSchemaNode(raw as JsonSchema, []);\n}\n\nfunction normalizeSchemaNode(\n schema: JsonSchema,\n path: Array<string | number>,\n): ConfigSchemaAnalysis {\n const unsupported = new Set<string>();\n const normalized: JsonSchema = { ...schema };\n const pathLabel = pathKey(path) || \"<root>\";\n\n if (schema.anyOf || schema.oneOf || schema.allOf) {\n const union = normalizeUnion(schema, path);\n if (union) return union;\n return { schema, unsupportedPaths: [pathLabel] };\n }\n\n const nullable = Array.isArray(schema.type) && schema.type.includes(\"null\");\n const type =\n schemaType(schema) ??\n (schema.properties || schema.additionalProperties ? \"object\" : undefined);\n normalized.type = type ?? schema.type;\n normalized.nullable = nullable || schema.nullable;\n\n if (normalized.enum) {\n const { enumValues, nullable: enumNullable } = normalizeEnum(normalized.enum);\n normalized.enum = enumValues;\n if (enumNullable) normalized.nullable = true;\n if (enumValues.length === 0) unsupported.add(pathLabel);\n }\n\n if (type === \"object\") {\n const properties = schema.properties ?? {};\n const normalizedProps: Record<string, JsonSchema> = {};\n for (const [key, value] of Object.entries(properties)) {\n const res = normalizeSchemaNode(value, [...path, key]);\n if (res.schema) normalizedProps[key] = res.schema;\n for (const entry of res.unsupportedPaths) unsupported.add(entry);\n }\n normalized.properties = normalizedProps;\n\n if (schema.additionalProperties === true) {\n unsupported.add(pathLabel);\n } else if (schema.additionalProperties === false) {\n normalized.additionalProperties = false;\n } else if (\n schema.additionalProperties &&\n typeof schema.additionalProperties === \"object\"\n ) {\n if (!isAnySchema(schema.additionalProperties as JsonSchema)) {\n const res = normalizeSchemaNode(\n schema.additionalProperties as JsonSchema,\n [...path, \"*\"],\n );\n normalized.additionalProperties =\n res.schema ?? (schema.additionalProperties as JsonSchema);\n if (res.unsupportedPaths.length > 0) unsupported.add(pathLabel);\n }\n }\n } else if (type === \"array\") {\n const itemsSchema = Array.isArray(schema.items)\n ? schema.items[0]\n : schema.items;\n if (!itemsSchema) {\n unsupported.add(pathLabel);\n } else {\n const res = normalizeSchemaNode(itemsSchema, [...path, \"*\"]);\n normalized.items = res.schema ?? itemsSchema;\n if (res.unsupportedPaths.length > 0) unsupported.add(pathLabel);\n }\n } else if (\n type !== \"string\" &&\n type !== \"number\" &&\n type !== \"integer\" &&\n type !== \"boolean\" &&\n !normalized.enum\n ) {\n unsupported.add(pathLabel);\n }\n\n return {\n schema: normalized,\n unsupportedPaths: Array.from(unsupported),\n };\n}\n\nfunction normalizeUnion(\n schema: JsonSchema,\n path: Array<string | number>,\n): ConfigSchemaAnalysis | null {\n if (schema.allOf) return null;\n const union = schema.anyOf ?? schema.oneOf;\n if (!union) return null;\n\n const literals: unknown[] = [];\n const remaining: JsonSchema[] = [];\n let nullable = false;\n\n for (const entry of union) {\n if (!entry || typeof entry !== \"object\") return null;\n if (Array.isArray(entry.enum)) {\n const { enumValues, nullable: enumNullable } = normalizeEnum(entry.enum);\n literals.push(...enumValues);\n if (enumNullable) nullable = true;\n continue;\n }\n if (\"const\" in entry) {\n if (entry.const == null) {\n nullable = true;\n continue;\n }\n literals.push(entry.const);\n continue;\n }\n if (schemaType(entry) === \"null\") {\n nullable = true;\n continue;\n }\n remaining.push(entry);\n }\n\n if (literals.length > 0 && remaining.length === 0) {\n const unique: unknown[] = [];\n for (const value of literals) {\n if (!unique.some((existing) => Object.is(existing, value))) {\n unique.push(value);\n }\n }\n return {\n schema: {\n ...schema,\n enum: unique,\n nullable,\n anyOf: undefined,\n oneOf: undefined,\n allOf: undefined,\n },\n unsupportedPaths: [],\n };\n }\n\n if (remaining.length === 1) {\n const res = normalizeSchemaNode(remaining[0], path);\n if (res.schema) {\n res.schema.nullable = nullable || res.schema.nullable;\n }\n return res;\n }\n\n const primitiveTypes = [\"string\", \"number\", \"integer\", \"boolean\"];\n if (\n remaining.length > 0 &&\n literals.length === 0 &&\n remaining.every((entry) => entry.type && primitiveTypes.includes(String(entry.type)))\n ) {\n return {\n schema: {\n ...schema,\n nullable,\n },\n unsupportedPaths: [],\n };\n }\n\n return null;\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport { analyzeConfigSchema, renderConfigForm, SECTION_META } from \"./config-form\";\nimport {\n hintForPath,\n humanize,\n schemaType,\n type JsonSchema,\n} from \"./config-form.shared\";\n\nexport type ConfigProps = {\n raw: string;\n originalRaw: string;\n valid: boolean | null;\n issues: unknown[];\n loading: boolean;\n saving: boolean;\n applying: boolean;\n updating: boolean;\n connected: boolean;\n schema: unknown | null;\n schemaLoading: boolean;\n uiHints: ConfigUiHints;\n formMode: \"form\" | \"raw\";\n formValue: Record<string, unknown> | null;\n originalValue: Record<string, unknown> | null;\n searchQuery: string;\n activeSection: string | null;\n activeSubsection: string | null;\n onRawChange: (next: string) => void;\n onFormModeChange: (mode: \"form\" | \"raw\") => void;\n onFormPatch: (path: Array<string | number>, value: unknown) => void;\n onSearchChange: (query: string) => void;\n onSectionChange: (section: string | null) => void;\n onSubsectionChange: (section: string | null) => void;\n onReload: () => void;\n onSave: () => void;\n onApply: () => void;\n onUpdate: () => void;\n};\n\n// SVG Icons for sidebar (Lucide-style)\nconst sidebarIcons = {\n all: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect></svg>`,\n env: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>`,\n update: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n agents: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2z\"></path><circle cx=\"8\" cy=\"14\" r=\"1\"></circle><circle cx=\"16\" cy=\"14\" r=\"1\"></circle></svg>`,\n auth: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path></svg>`,\n channels: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path></svg>`,\n messages: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"></path><polyline points=\"22,6 12,13 2,6\"></polyline></svg>`,\n commands: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"4 17 10 11 4 5\"></polyline><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line></svg>`,\n hooks: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"></path><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"></path></svg>`,\n skills: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon></svg>`,\n tools: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"></path></svg>`,\n gateway: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"></path></svg>`,\n wizard: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M15 4V2\"></path><path d=\"M15 16v-2\"></path><path d=\"M8 9h2\"></path><path d=\"M20 9h2\"></path><path d=\"M17.8 11.8 19 13\"></path><path d=\"M15 9h0\"></path><path d=\"M17.8 6.2 19 5\"></path><path d=\"m3 21 9-9\"></path><path d=\"M12.2 6.2 11 5\"></path></svg>`,\n // Additional sections\n meta: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 20h9\"></path><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"></path></svg>`,\n logging: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line><polyline points=\"10 9 9 9 8 9\"></polyline></svg>`,\n browser: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"21.17\" y1=\"8\" x2=\"12\" y2=\"8\"></line><line x1=\"3.95\" y1=\"6.06\" x2=\"8.54\" y2=\"14\"></line><line x1=\"10.88\" y1=\"21.94\" x2=\"15.46\" y2=\"14\"></line></svg>`,\n ui: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line></svg>`,\n models: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line></svg>`,\n bindings: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"></line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"></line></svg>`,\n broadcast: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4.9 19.1C1 15.2 1 8.8 4.9 4.9\"></path><path d=\"M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5\"></path><circle cx=\"12\" cy=\"12\" r=\"2\"></circle><path d=\"M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5\"></path><path d=\"M19.1 4.9C23 8.8 23 15.1 19.1 19\"></path></svg>`,\n audio: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 18V5l12-2v13\"></path><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><circle cx=\"18\" cy=\"16\" r=\"3\"></circle></svg>`,\n session: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"9\" cy=\"7\" r=\"4\"></circle><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"></path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"></path></svg>`,\n cron: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline></svg>`,\n web: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"></path></svg>`,\n discovery: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>`,\n canvasHost: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle><polyline points=\"21 15 16 10 5 21\"></polyline></svg>`,\n talk: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line></svg>`,\n plugins: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2v6\"></path><path d=\"m4.93 10.93 4.24 4.24\"></path><path d=\"M2 12h6\"></path><path d=\"m4.93 13.07 4.24-4.24\"></path><path d=\"M12 22v-6\"></path><path d=\"m19.07 13.07-4.24-4.24\"></path><path d=\"M22 12h-6\"></path><path d=\"m19.07 10.93-4.24 4.24\"></path></svg>`,\n default: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline></svg>`,\n};\n\n// Section definitions\nconst SECTIONS: Array<{ key: string; label: string }> = [\n { key: \"env\", label: \"Environment\" },\n { key: \"update\", label: \"Updates\" },\n { key: \"agents\", label: \"Agents\" },\n { key: \"auth\", label: \"Authentication\" },\n { key: \"channels\", label: \"Channels\" },\n { key: \"messages\", label: \"Messages\" },\n { key: \"commands\", label: \"Commands\" },\n { key: \"hooks\", label: \"Hooks\" },\n { key: \"skills\", label: \"Skills\" },\n { key: \"tools\", label: \"Tools\" },\n { key: \"gateway\", label: \"Gateway\" },\n { key: \"wizard\", label: \"Setup Wizard\" },\n];\n\ntype SubsectionEntry = {\n key: string;\n label: string;\n description?: string;\n order: number;\n};\n\nconst ALL_SUBSECTION = \"__all__\";\n\nfunction getSectionIcon(key: string) {\n return sidebarIcons[key as keyof typeof sidebarIcons] ?? sidebarIcons.default;\n}\n\nfunction resolveSectionMeta(key: string, schema?: JsonSchema): {\n label: string;\n description?: string;\n} {\n const meta = SECTION_META[key];\n if (meta) return meta;\n return {\n label: schema?.title ?? humanize(key),\n description: schema?.description ?? \"\",\n };\n}\n\nfunction resolveSubsections(params: {\n key: string;\n schema: JsonSchema | undefined;\n uiHints: ConfigUiHints;\n}): SubsectionEntry[] {\n const { key, schema, uiHints } = params;\n if (!schema || schemaType(schema) !== \"object\" || !schema.properties) return [];\n const entries = Object.entries(schema.properties).map(([subKey, node]) => {\n const hint = hintForPath([key, subKey], uiHints);\n const label = hint?.label ?? node.title ?? humanize(subKey);\n const description = hint?.help ?? node.description ?? \"\";\n const order = hint?.order ?? 50;\n return { key: subKey, label, description, order };\n });\n entries.sort((a, b) => (a.order !== b.order ? a.order - b.order : a.key.localeCompare(b.key)));\n return entries;\n}\n\nfunction computeDiff(\n original: Record<string, unknown> | null,\n current: Record<string, unknown> | null\n): Array<{ path: string; from: unknown; to: unknown }> {\n if (!original || !current) return [];\n const changes: Array<{ path: string; from: unknown; to: unknown }> = [];\n\n function compare(orig: unknown, curr: unknown, path: string) {\n if (orig === curr) return;\n if (typeof orig !== typeof curr) {\n changes.push({ path, from: orig, to: curr });\n return;\n }\n if (typeof orig !== \"object\" || orig === null || curr === null) {\n if (orig !== curr) {\n changes.push({ path, from: orig, to: curr });\n }\n return;\n }\n if (Array.isArray(orig) && Array.isArray(curr)) {\n if (JSON.stringify(orig) !== JSON.stringify(curr)) {\n changes.push({ path, from: orig, to: curr });\n }\n return;\n }\n const origObj = orig as Record<string, unknown>;\n const currObj = curr as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(origObj), ...Object.keys(currObj)]);\n for (const key of allKeys) {\n compare(origObj[key], currObj[key], path ? `${path}.${key}` : key);\n }\n }\n\n compare(original, current, \"\");\n return changes;\n}\n\nfunction truncateValue(value: unknown, maxLen = 40): string {\n let str: string;\n try {\n const json = JSON.stringify(value);\n str = json ?? String(value);\n } catch {\n str = String(value);\n }\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 3) + \"...\";\n}\n\nexport function renderConfig(props: ConfigProps) {\n const validity =\n props.valid == null ? \"unknown\" : props.valid ? \"valid\" : \"invalid\";\n const analysis = analyzeConfigSchema(props.schema);\n const formUnsafe = analysis.schema\n ? analysis.unsupportedPaths.length > 0\n : false;\n\n // Get available sections from schema\n const schemaProps = analysis.schema?.properties ?? {};\n const availableSections = SECTIONS.filter(s => s.key in schemaProps);\n\n // Add any sections in schema but not in our list\n const knownKeys = new Set(SECTIONS.map(s => s.key));\n const extraSections = Object.keys(schemaProps)\n .filter(k => !knownKeys.has(k))\n .map(k => ({ key: k, label: k.charAt(0).toUpperCase() + k.slice(1) }));\n\n const allSections = [...availableSections, ...extraSections];\n\n const activeSectionSchema =\n props.activeSection && analysis.schema && schemaType(analysis.schema) === \"object\"\n ? (analysis.schema.properties?.[props.activeSection] as JsonSchema | undefined)\n : undefined;\n const activeSectionMeta = props.activeSection\n ? resolveSectionMeta(props.activeSection, activeSectionSchema)\n : null;\n const subsections = props.activeSection\n ? resolveSubsections({\n key: props.activeSection,\n schema: activeSectionSchema,\n uiHints: props.uiHints,\n })\n : [];\n const allowSubnav =\n props.formMode === \"form\" &&\n Boolean(props.activeSection) &&\n subsections.length > 0;\n const isAllSubsection = props.activeSubsection === ALL_SUBSECTION;\n const effectiveSubsection = props.searchQuery\n ? null\n : isAllSubsection\n ? null\n : props.activeSubsection ?? (subsections[0]?.key ?? null);\n\n // Compute diff for showing changes (works for both form and raw modes)\n const diff = props.formMode === \"form\"\n ? computeDiff(props.originalValue, props.formValue)\n : [];\n const hasRawChanges = props.formMode === \"raw\" && props.raw !== props.originalRaw;\n const hasChanges = props.formMode === \"form\" ? diff.length > 0 : hasRawChanges;\n\n // Save/apply buttons require actual changes to be enabled.\n // Note: formUnsafe warns about unsupported schema paths but shouldn't block saving.\n const canSaveForm =\n Boolean(props.formValue) && !props.loading && Boolean(analysis.schema);\n const canSave =\n props.connected &&\n !props.saving &&\n hasChanges &&\n (props.formMode === \"raw\" ? true : canSaveForm);\n const canApply =\n props.connected &&\n !props.applying &&\n !props.updating &&\n hasChanges &&\n (props.formMode === \"raw\" ? true : canSaveForm);\n const canUpdate = props.connected && !props.applying && !props.updating;\n\n return html`\n <div class=\"config-layout\">\n <!-- Sidebar -->\n <aside class=\"config-sidebar\">\n <div class=\"config-sidebar__header\">\n <div class=\"config-sidebar__title\">Settings</div>\n <span class=\"pill pill--sm ${validity === \"valid\" ? \"pill--ok\" : validity === \"invalid\" ? \"pill--danger\" : \"\"}\">${validity}</span>\n </div>\n\n <!-- Search -->\n <div class=\"config-search\">\n <svg class=\"config-search__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <path d=\"M21 21l-4.35-4.35\"></path>\n </svg>\n <input\n type=\"text\"\n class=\"config-search__input\"\n placeholder=\"Search settings...\"\n .value=${props.searchQuery}\n @input=${(e: Event) => props.onSearchChange((e.target as HTMLInputElement).value)}\n />\n ${props.searchQuery ? html`\n <button\n class=\"config-search__clear\"\n @click=${() => props.onSearchChange(\"\")}\n >×</button>\n ` : nothing}\n </div>\n\n <!-- Section nav -->\n <nav class=\"config-nav\">\n <button\n class=\"config-nav__item ${props.activeSection === null ? \"active\" : \"\"}\"\n @click=${() => props.onSectionChange(null)}\n >\n <span class=\"config-nav__icon\">${sidebarIcons.all}</span>\n <span class=\"config-nav__label\">All Settings</span>\n </button>\n ${allSections.map(section => html`\n <button\n class=\"config-nav__item ${props.activeSection === section.key ? \"active\" : \"\"}\"\n @click=${() => props.onSectionChange(section.key)}\n >\n <span class=\"config-nav__icon\">${getSectionIcon(section.key)}</span>\n <span class=\"config-nav__label\">${section.label}</span>\n </button>\n `)}\n </nav>\n\n <!-- Mode toggle at bottom -->\n <div class=\"config-sidebar__footer\">\n <div class=\"config-mode-toggle\">\n <button\n class=\"config-mode-toggle__btn ${props.formMode === \"form\" ? \"active\" : \"\"}\"\n ?disabled=${props.schemaLoading || !props.schema}\n @click=${() => props.onFormModeChange(\"form\")}\n >\n Form\n </button>\n <button\n class=\"config-mode-toggle__btn ${props.formMode === \"raw\" ? \"active\" : \"\"}\"\n @click=${() => props.onFormModeChange(\"raw\")}\n >\n Raw\n </button>\n </div>\n </div>\n </aside>\n\n <!-- Main content -->\n <main class=\"config-main\">\n <!-- Action bar -->\n <div class=\"config-actions\">\n <div class=\"config-actions__left\">\n ${hasChanges ? html`\n <span class=\"config-changes-badge\">${props.formMode === \"raw\" ? \"Unsaved changes\" : `${diff.length} unsaved change${diff.length !== 1 ? \"s\" : \"\"}`}</span>\n ` : html`\n <span class=\"config-status muted\">No changes</span>\n `}\n </div>\n <div class=\"config-actions__right\">\n <button class=\"btn btn--sm\" ?disabled=${props.loading} @click=${props.onReload}>\n ${props.loading ? \"Loading…\" : \"Reload\"}\n </button>\n <button\n class=\"btn btn--sm primary\"\n ?disabled=${!canSave}\n @click=${props.onSave}\n >\n ${props.saving ? \"Saving…\" : \"Save\"}\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!canApply}\n @click=${props.onApply}\n >\n ${props.applying ? \"Applying…\" : \"Apply\"}\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!canUpdate}\n @click=${props.onUpdate}\n >\n ${props.updating ? \"Updating…\" : \"Update\"}\n </button>\n </div>\n </div>\n\n <!-- Diff panel (form mode only - raw mode doesn't have granular diff) -->\n ${hasChanges && props.formMode === \"form\" ? html`\n <details class=\"config-diff\">\n <summary class=\"config-diff__summary\">\n <span>View ${diff.length} pending change${diff.length !== 1 ? \"s\" : \"\"}</span>\n <svg class=\"config-diff__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </summary>\n <div class=\"config-diff__content\">\n ${diff.map(change => html`\n <div class=\"config-diff__item\">\n <div class=\"config-diff__path\">${change.path}</div>\n <div class=\"config-diff__values\">\n <span class=\"config-diff__from\">${truncateValue(change.from)}</span>\n <span class=\"config-diff__arrow\">→</span>\n <span class=\"config-diff__to\">${truncateValue(change.to)}</span>\n </div>\n </div>\n `)}\n </div>\n </details>\n ` : nothing}\n\n ${activeSectionMeta && props.formMode === \"form\"\n ? html`\n <div class=\"config-section-hero\">\n <div class=\"config-section-hero__icon\">${getSectionIcon(props.activeSection ?? \"\")}</div>\n <div class=\"config-section-hero__text\">\n <div class=\"config-section-hero__title\">${activeSectionMeta.label}</div>\n ${activeSectionMeta.description\n ? html`<div class=\"config-section-hero__desc\">${activeSectionMeta.description}</div>`\n : nothing}\n </div>\n </div>\n `\n : nothing}\n\n ${allowSubnav\n ? html`\n <div class=\"config-subnav\">\n <button\n class=\"config-subnav__item ${effectiveSubsection === null ? \"active\" : \"\"}\"\n @click=${() => props.onSubsectionChange(ALL_SUBSECTION)}\n >\n All\n </button>\n ${subsections.map(\n (entry) => html`\n <button\n class=\"config-subnav__item ${\n effectiveSubsection === entry.key ? \"active\" : \"\"\n }\"\n title=${entry.description || entry.label}\n @click=${() => props.onSubsectionChange(entry.key)}\n >\n ${entry.label}\n </button>\n `,\n )}\n </div>\n `\n : nothing}\n\n <!-- Form content -->\n <div class=\"config-content\">\n ${props.formMode === \"form\"\n ? html`\n ${props.schemaLoading\n ? html`<div class=\"config-loading\">\n <div class=\"config-loading__spinner\"></div>\n <span>Loading schema…</span>\n </div>`\n : renderConfigForm({\n schema: analysis.schema,\n uiHints: props.uiHints,\n value: props.formValue,\n disabled: props.loading || !props.formValue,\n unsupportedPaths: analysis.unsupportedPaths,\n onPatch: props.onFormPatch,\n searchQuery: props.searchQuery,\n activeSection: props.activeSection,\n activeSubsection: effectiveSubsection,\n })}\n ${formUnsafe\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n Form view can't safely edit some fields.\n Use Raw to avoid losing config entries.\n </div>`\n : nothing}\n `\n : html`\n <label class=\"field config-raw-field\">\n <span>Raw JSON5</span>\n <textarea\n .value=${props.raw}\n @input=${(e: Event) =>\n props.onRawChange((e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </label>\n `}\n </div>\n\n ${props.issues.length > 0\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n <pre class=\"code-block\">${JSON.stringify(props.issues, null, 2)}</pre>\n </div>`\n : nothing}\n </main>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { ChannelAccountSnapshot } from \"../types\";\nimport type { ChannelKey, ChannelsProps } from \"./channels.types\";\n\nexport function formatDuration(ms?: number | null) {\n if (!ms && ms !== 0) return \"n/a\";\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n return `${hr}h`;\n}\n\nexport function channelEnabled(key: ChannelKey, props: ChannelsProps) {\n const snapshot = props.snapshot;\n const channels = snapshot?.channels as Record<string, unknown> | null;\n if (!snapshot || !channels) return false;\n const channelStatus = channels[key] as Record<string, unknown> | undefined;\n const configured = typeof channelStatus?.configured === \"boolean\" && channelStatus.configured;\n const running = typeof channelStatus?.running === \"boolean\" && channelStatus.running;\n const connected = typeof channelStatus?.connected === \"boolean\" && channelStatus.connected;\n const accounts = snapshot.channelAccounts?.[key] ?? [];\n const accountActive = accounts.some(\n (account) => account.configured || account.running || account.connected,\n );\n return configured || running || connected || accountActive;\n}\n\nexport function getChannelAccountCount(\n key: ChannelKey,\n channelAccounts?: Record<string, ChannelAccountSnapshot[]> | null,\n): number {\n return channelAccounts?.[key]?.length ?? 0;\n}\n\nexport function renderChannelAccountCount(\n key: ChannelKey,\n channelAccounts?: Record<string, ChannelAccountSnapshot[]> | null,\n) {\n const count = getChannelAccountCount(key, channelAccounts);\n if (count < 2) return nothing;\n return html`<div class=\"account-count\">Accounts (${count})</div>`;\n}\n","import { html } from \"lit\";\n\nimport type { ConfigUiHints } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport {\n analyzeConfigSchema,\n renderNode,\n schemaType,\n type JsonSchema,\n} from \"./config-form\";\n\ntype ChannelConfigFormProps = {\n channelId: string;\n configValue: Record<string, unknown> | null;\n schema: unknown | null;\n uiHints: ConfigUiHints;\n disabled: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n};\n\nfunction resolveSchemaNode(\n schema: JsonSchema | null,\n path: Array<string | number>,\n): JsonSchema | null {\n let current = schema;\n for (const key of path) {\n if (!current) return null;\n const type = schemaType(current);\n if (type === \"object\") {\n const properties = current.properties ?? {};\n if (typeof key === \"string\" && properties[key]) {\n current = properties[key];\n continue;\n }\n const additional = current.additionalProperties;\n if (typeof key === \"string\" && additional && typeof additional === \"object\") {\n current = additional as JsonSchema;\n continue;\n }\n return null;\n }\n if (type === \"array\") {\n if (typeof key !== \"number\") return null;\n const items = Array.isArray(current.items) ? current.items[0] : current.items;\n current = items ?? null;\n continue;\n }\n return null;\n }\n return current;\n}\n\nfunction resolveChannelValue(\n config: Record<string, unknown>,\n channelId: string,\n): Record<string, unknown> {\n const channels = (config.channels ?? {}) as Record<string, unknown>;\n const fromChannels = channels[channelId];\n const fallback = config[channelId];\n const resolved =\n (fromChannels && typeof fromChannels === \"object\"\n ? (fromChannels as Record<string, unknown>)\n : null) ??\n (fallback && typeof fallback === \"object\"\n ? (fallback as Record<string, unknown>)\n : null);\n return resolved ?? {};\n}\n\nexport function renderChannelConfigForm(props: ChannelConfigFormProps) {\n const analysis = analyzeConfigSchema(props.schema);\n const normalized = analysis.schema;\n if (!normalized) {\n return html`<div class=\"callout danger\">Schema unavailable. Use Raw.</div>`;\n }\n const node = resolveSchemaNode(normalized, [\"channels\", props.channelId]);\n if (!node) {\n return html`<div class=\"callout danger\">Channel config schema unavailable.</div>`;\n }\n const configValue = props.configValue ?? {};\n const value = resolveChannelValue(configValue, props.channelId);\n return html`\n <div class=\"config-form\">\n ${renderNode({\n schema: node,\n value,\n path: [\"channels\", props.channelId],\n hints: props.uiHints,\n unsupported: new Set(analysis.unsupportedPaths),\n disabled: props.disabled,\n showLabel: false,\n onPatch: props.onPatch,\n })}\n </div>\n `;\n}\n\nexport function renderChannelConfigSection(params: {\n channelId: string;\n props: ChannelsProps;\n}) {\n const { channelId, props } = params;\n const disabled = props.configSaving || props.configSchemaLoading;\n return html`\n <div style=\"margin-top: 16px;\">\n ${props.configSchemaLoading\n ? html`<div class=\"muted\">Loading config schema…</div>`\n : renderChannelConfigForm({\n channelId,\n configValue: props.configForm,\n schema: props.configSchema,\n uiHints: props.configUiHints,\n disabled,\n onPatch: props.onConfigPatch,\n })}\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button\n class=\"btn primary\"\n ?disabled=${disabled || !props.configFormDirty}\n @click=${() => props.onConfigSave()}\n >\n ${props.configSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${disabled}\n @click=${() => props.onConfigReload()}\n >\n Reload\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { DiscordStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderDiscordCard(params: {\n props: ChannelsProps;\n discord?: DiscordStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, discord, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Discord</div>\n <div class=\"card-sub\">Bot status and channel configuration.</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${discord?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${discord?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${discord?.lastStartAt ? formatAgo(discord.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${discord?.lastProbeAt ? formatAgo(discord.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${discord?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${discord.lastError}\n </div>`\n : nothing}\n\n ${discord?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${discord.probe.ok ? \"ok\" : \"failed\"} ·\n ${discord.probe.status ?? \"\"} ${discord.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"discord\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { GoogleChatStatus } from \"../types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport type { ChannelsProps } from \"./channels.types\";\n\nexport function renderGoogleChatCard(params: {\n props: ChannelsProps;\n googleChat?: GoogleChatStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, googleChat, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Google Chat</div>\n <div class=\"card-sub\">Chat API webhook status and channel configuration.</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${googleChat ? (googleChat.configured ? \"Yes\" : \"No\") : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${googleChat ? (googleChat.running ? \"Yes\" : \"No\") : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Credential</span>\n <span>${googleChat?.credentialSource ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Audience</span>\n <span>\n ${googleChat?.audienceType\n ? `${googleChat.audienceType}${googleChat.audience ? ` · ${googleChat.audience}` : \"\"}`\n : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${googleChat?.lastStartAt ? formatAgo(googleChat.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${googleChat?.lastProbeAt ? formatAgo(googleChat.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${googleChat?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${googleChat.lastError}\n </div>`\n : nothing}\n\n ${googleChat?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${googleChat.probe.ok ? \"ok\" : \"failed\"} ·\n ${googleChat.probe.status ?? \"\"} ${googleChat.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"googlechat\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { IMessageStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderIMessageCard(params: {\n props: ChannelsProps;\n imessage?: IMessageStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, imessage, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">iMessage</div>\n <div class=\"card-sub\">macOS bridge status and channel configuration.</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${imessage?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${imessage?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${imessage?.lastStartAt ? formatAgo(imessage.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${imessage?.lastProbeAt ? formatAgo(imessage.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${imessage?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${imessage.lastError}\n </div>`\n : nothing}\n\n ${imessage?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${imessage.probe.ok ? \"ok\" : \"failed\"} ·\n ${imessage.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"imessage\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n}\n","/**\n * Nostr Profile Edit Form\n *\n * Provides UI for editing and publishing Nostr profile (kind:0).\n */\n\nimport { html, nothing, type TemplateResult } from \"lit\";\n\nimport type { NostrProfile as NostrProfileType } from \"../types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface NostrProfileFormState {\n /** Current form values */\n values: NostrProfileType;\n /** Original values for dirty detection */\n original: NostrProfileType;\n /** Whether the form is currently submitting */\n saving: boolean;\n /** Whether import is in progress */\n importing: boolean;\n /** Last error message */\n error: string | null;\n /** Last success message */\n success: string | null;\n /** Validation errors per field */\n fieldErrors: Record<string, string>;\n /** Whether to show advanced fields */\n showAdvanced: boolean;\n}\n\nexport interface NostrProfileFormCallbacks {\n /** Called when a field value changes */\n onFieldChange: (field: keyof NostrProfileType, value: string) => void;\n /** Called when save is clicked */\n onSave: () => void;\n /** Called when import is clicked */\n onImport: () => void;\n /** Called when cancel is clicked */\n onCancel: () => void;\n /** Called when toggle advanced is clicked */\n onToggleAdvanced: () => void;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction isFormDirty(state: NostrProfileFormState): boolean {\n const { values, original } = state;\n return (\n values.name !== original.name ||\n values.displayName !== original.displayName ||\n values.about !== original.about ||\n values.picture !== original.picture ||\n values.banner !== original.banner ||\n values.website !== original.website ||\n values.nip05 !== original.nip05 ||\n values.lud16 !== original.lud16\n );\n}\n\n// ============================================================================\n// Form Rendering\n// ============================================================================\n\nexport function renderNostrProfileForm(params: {\n state: NostrProfileFormState;\n callbacks: NostrProfileFormCallbacks;\n accountId: string;\n}): TemplateResult {\n const { state, callbacks, accountId } = params;\n const isDirty = isFormDirty(state);\n\n const renderField = (\n field: keyof NostrProfileType,\n label: string,\n opts: {\n type?: \"text\" | \"url\" | \"textarea\";\n placeholder?: string;\n maxLength?: number;\n help?: string;\n } = {}\n ) => {\n const { type = \"text\", placeholder, maxLength, help } = opts;\n const value = state.values[field] ?? \"\";\n const error = state.fieldErrors[field];\n\n const inputId = `nostr-profile-${field}`;\n\n if (type === \"textarea\") {\n return html`\n <div class=\"form-field\" style=\"margin-bottom: 12px;\">\n <label for=\"${inputId}\" style=\"display: block; margin-bottom: 4px; font-weight: 500;\">\n ${label}\n </label>\n <textarea\n id=\"${inputId}\"\n .value=${value}\n placeholder=${placeholder ?? \"\"}\n maxlength=${maxLength ?? 2000}\n rows=\"3\"\n style=\"width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px; resize: vertical; font-family: inherit;\"\n @input=${(e: InputEvent) => {\n const target = e.target as HTMLTextAreaElement;\n callbacks.onFieldChange(field, target.value);\n }}\n ?disabled=${state.saving}\n ></textarea>\n ${help ? html`<div style=\"font-size: 12px; color: var(--text-muted); margin-top: 2px;\">${help}</div>` : nothing}\n ${error ? html`<div style=\"font-size: 12px; color: var(--danger-color); margin-top: 2px;\">${error}</div>` : nothing}\n </div>\n `;\n }\n\n return html`\n <div class=\"form-field\" style=\"margin-bottom: 12px;\">\n <label for=\"${inputId}\" style=\"display: block; margin-bottom: 4px; font-weight: 500;\">\n ${label}\n </label>\n <input\n id=\"${inputId}\"\n type=${type}\n .value=${value}\n placeholder=${placeholder ?? \"\"}\n maxlength=${maxLength ?? 256}\n style=\"width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px;\"\n @input=${(e: InputEvent) => {\n const target = e.target as HTMLInputElement;\n callbacks.onFieldChange(field, target.value);\n }}\n ?disabled=${state.saving}\n />\n ${help ? html`<div style=\"font-size: 12px; color: var(--text-muted); margin-top: 2px;\">${help}</div>` : nothing}\n ${error ? html`<div style=\"font-size: 12px; color: var(--danger-color); margin-top: 2px;\">${error}</div>` : nothing}\n </div>\n `;\n };\n\n const renderPicturePreview = () => {\n const picture = state.values.picture;\n if (!picture) return nothing;\n\n return html`\n <div style=\"margin-bottom: 12px;\">\n <img\n src=${picture}\n alt=\"Profile picture preview\"\n style=\"max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);\"\n @error=${(e: Event) => {\n const img = e.target as HTMLImageElement;\n img.style.display = \"none\";\n }}\n @load=${(e: Event) => {\n const img = e.target as HTMLImageElement;\n img.style.display = \"block\";\n }}\n />\n </div>\n `;\n };\n\n return html`\n <div class=\"nostr-profile-form\" style=\"padding: 16px; background: var(--bg-secondary); border-radius: 8px; margin-top: 12px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"font-weight: 600; font-size: 16px;\">Edit Profile</div>\n <div style=\"font-size: 12px; color: var(--text-muted);\">Account: ${accountId}</div>\n </div>\n\n ${state.error\n ? html`<div class=\"callout danger\" style=\"margin-bottom: 12px;\">${state.error}</div>`\n : nothing}\n\n ${state.success\n ? html`<div class=\"callout success\" style=\"margin-bottom: 12px;\">${state.success}</div>`\n : nothing}\n\n ${renderPicturePreview()}\n\n ${renderField(\"name\", \"Username\", {\n placeholder: \"satoshi\",\n maxLength: 256,\n help: \"Short username (e.g., satoshi)\",\n })}\n\n ${renderField(\"displayName\", \"Display Name\", {\n placeholder: \"Satoshi Nakamoto\",\n maxLength: 256,\n help: \"Your full display name\",\n })}\n\n ${renderField(\"about\", \"Bio\", {\n type: \"textarea\",\n placeholder: \"Tell people about yourself...\",\n maxLength: 2000,\n help: \"A brief bio or description\",\n })}\n\n ${renderField(\"picture\", \"Avatar URL\", {\n type: \"url\",\n placeholder: \"https://example.com/avatar.jpg\",\n help: \"HTTPS URL to your profile picture\",\n })}\n\n ${state.showAdvanced\n ? html`\n <div style=\"border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px;\">\n <div style=\"font-weight: 500; margin-bottom: 12px; color: var(--text-muted);\">Advanced</div>\n\n ${renderField(\"banner\", \"Banner URL\", {\n type: \"url\",\n placeholder: \"https://example.com/banner.jpg\",\n help: \"HTTPS URL to a banner image\",\n })}\n\n ${renderField(\"website\", \"Website\", {\n type: \"url\",\n placeholder: \"https://example.com\",\n help: \"Your personal website\",\n })}\n\n ${renderField(\"nip05\", \"NIP-05 Identifier\", {\n placeholder: \"you@example.com\",\n help: \"Verifiable identifier (e.g., you@domain.com)\",\n })}\n\n ${renderField(\"lud16\", \"Lightning Address\", {\n placeholder: \"you@getalby.com\",\n help: \"Lightning address for tips (LUD-16)\",\n })}\n </div>\n `\n : nothing}\n\n <div style=\"display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n @click=${callbacks.onSave}\n ?disabled=${state.saving || !isDirty}\n >\n ${state.saving ? \"Saving...\" : \"Save & Publish\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onImport}\n ?disabled=${state.importing || state.saving}\n >\n ${state.importing ? \"Importing...\" : \"Import from Relays\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onToggleAdvanced}\n >\n ${state.showAdvanced ? \"Hide Advanced\" : \"Show Advanced\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onCancel}\n ?disabled=${state.saving}\n >\n Cancel\n </button>\n </div>\n\n ${isDirty\n ? html`<div style=\"font-size: 12px; color: var(--warning-color); margin-top: 8px;\">\n You have unsaved changes\n </div>`\n : nothing}\n </div>\n `;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create initial form state from existing profile\n */\nexport function createNostrProfileFormState(\n profile: NostrProfileType | undefined\n): NostrProfileFormState {\n const values: NostrProfileType = {\n name: profile?.name ?? \"\",\n displayName: profile?.displayName ?? \"\",\n about: profile?.about ?? \"\",\n picture: profile?.picture ?? \"\",\n banner: profile?.banner ?? \"\",\n website: profile?.website ?? \"\",\n nip05: profile?.nip05 ?? \"\",\n lud16: profile?.lud16 ?? \"\",\n };\n\n return {\n values,\n original: { ...values },\n saving: false,\n importing: false,\n error: null,\n success: null,\n fieldErrors: {},\n showAdvanced: Boolean(\n profile?.banner || profile?.website || profile?.nip05 || profile?.lud16\n ),\n };\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { ChannelAccountSnapshot, NostrStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport {\n renderNostrProfileForm,\n type NostrProfileFormState,\n type NostrProfileFormCallbacks,\n} from \"./channels.nostr-profile-form\";\n\n/**\n * Truncate a pubkey for display (shows first and last 8 chars)\n */\nfunction truncatePubkey(pubkey: string | null | undefined): string {\n if (!pubkey) return \"n/a\";\n if (pubkey.length <= 20) return pubkey;\n return `${pubkey.slice(0, 8)}...${pubkey.slice(-8)}`;\n}\n\nexport function renderNostrCard(params: {\n props: ChannelsProps;\n nostr?: NostrStatus | null;\n nostrAccounts: ChannelAccountSnapshot[];\n accountCountLabel: unknown;\n /** Profile form state (optional - if provided, shows form) */\n profileFormState?: NostrProfileFormState | null;\n /** Profile form callbacks */\n profileFormCallbacks?: NostrProfileFormCallbacks | null;\n /** Called when Edit Profile is clicked */\n onEditProfile?: () => void;\n}) {\n const {\n props,\n nostr,\n nostrAccounts,\n accountCountLabel,\n profileFormState,\n profileFormCallbacks,\n onEditProfile,\n } = params;\n const primaryAccount = nostrAccounts[0];\n const summaryConfigured = nostr?.configured ?? primaryAccount?.configured ?? false;\n const summaryRunning = nostr?.running ?? primaryAccount?.running ?? false;\n const summaryPublicKey =\n nostr?.publicKey ??\n (primaryAccount as { publicKey?: string } | undefined)?.publicKey;\n const summaryLastStartAt = nostr?.lastStartAt ?? primaryAccount?.lastStartAt ?? null;\n const summaryLastError = nostr?.lastError ?? primaryAccount?.lastError ?? null;\n const hasMultipleAccounts = nostrAccounts.length > 1;\n const showingForm = profileFormState !== null && profileFormState !== undefined;\n\n const renderAccountCard = (account: ChannelAccountSnapshot) => {\n const publicKey = (account as { publicKey?: string }).publicKey;\n const profile = (account as { profile?: { name?: string; displayName?: string } }).profile;\n const displayName = profile?.displayName ?? profile?.name ?? account.name ?? account.accountId;\n\n return html`\n <div class=\"account-card\">\n <div class=\"account-card-header\">\n <div class=\"account-card-title\">${displayName}</div>\n <div class=\"account-card-id\">${account.accountId}</div>\n </div>\n <div class=\"status-list account-card-status\">\n <div>\n <span class=\"label\">Running</span>\n <span>${account.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Configured</span>\n <span>${account.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Public Key</span>\n <span class=\"monospace\" title=\"${publicKey ?? \"\"}\">${truncatePubkey(publicKey)}</span>\n </div>\n <div>\n <span class=\"label\">Last inbound</span>\n <span>${account.lastInboundAt ? formatAgo(account.lastInboundAt) : \"n/a\"}</span>\n </div>\n ${account.lastError\n ? html`\n <div class=\"account-card-error\">${account.lastError}</div>\n `\n : nothing}\n </div>\n </div>\n `;\n };\n\n const renderProfileSection = () => {\n // If showing form, render the form instead of the read-only view\n if (showingForm && profileFormCallbacks) {\n return renderNostrProfileForm({\n state: profileFormState,\n callbacks: profileFormCallbacks,\n accountId: nostrAccounts[0]?.accountId ?? \"default\",\n });\n }\n\n const profile =\n (primaryAccount as\n | {\n profile?: {\n name?: string;\n displayName?: string;\n about?: string;\n picture?: string;\n nip05?: string;\n };\n }\n | undefined)?.profile ?? nostr?.profile;\n const { name, displayName, about, picture, nip05 } = profile ?? {};\n const hasAnyProfileData = name || displayName || about || picture || nip05;\n\n return html`\n <div style=\"margin-top: 16px; padding: 12px; background: var(--bg-secondary); border-radius: 8px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;\">\n <div style=\"font-weight: 500;\">Profile</div>\n ${summaryConfigured\n ? html`\n <button\n class=\"btn btn-sm\"\n @click=${onEditProfile}\n style=\"font-size: 12px; padding: 4px 8px;\"\n >\n Edit Profile\n </button>\n `\n : nothing}\n </div>\n ${hasAnyProfileData\n ? html`\n <div class=\"status-list\">\n ${picture\n ? html`\n <div style=\"margin-bottom: 8px;\">\n <img\n src=${picture}\n alt=\"Profile picture\"\n style=\"width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);\"\n @error=${(e: Event) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n </div>\n `\n : nothing}\n ${name ? html`<div><span class=\"label\">Name</span><span>${name}</span></div>` : nothing}\n ${displayName\n ? html`<div><span class=\"label\">Display Name</span><span>${displayName}</span></div>`\n : nothing}\n ${about\n ? html`<div><span class=\"label\">About</span><span style=\"max-width: 300px; overflow: hidden; text-overflow: ellipsis;\">${about}</span></div>`\n : nothing}\n ${nip05 ? html`<div><span class=\"label\">NIP-05</span><span>${nip05}</span></div>` : nothing}\n </div>\n `\n : html`\n <div style=\"color: var(--text-muted); font-size: 13px;\">\n No profile set. Click \"Edit Profile\" to add your name, bio, and avatar.\n </div>\n `}\n </div>\n `;\n };\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Nostr</div>\n <div class=\"card-sub\">Decentralized DMs via Nostr relays (NIP-04).</div>\n ${accountCountLabel}\n\n ${hasMultipleAccounts\n ? html`\n <div class=\"account-card-list\">\n ${nostrAccounts.map((account) => renderAccountCard(account))}\n </div>\n `\n : html`\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${summaryConfigured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${summaryRunning ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Public Key</span>\n <span class=\"monospace\" title=\"${summaryPublicKey ?? \"\"}\"\n >${truncatePubkey(summaryPublicKey)}</span\n >\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${summaryLastStartAt ? formatAgo(summaryLastStartAt) : \"n/a\"}</span>\n </div>\n </div>\n `}\n\n ${summaryLastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${summaryLastError}</div>`\n : nothing}\n\n ${renderProfileSection()}\n\n ${renderChannelConfigSection({ channelId: \"nostr\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(false)}>Refresh</button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { SignalStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderSignalCard(params: {\n props: ChannelsProps;\n signal?: SignalStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, signal, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Signal</div>\n <div class=\"card-sub\">signal-cli status and channel configuration.</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${signal?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${signal?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Base URL</span>\n <span>${signal?.baseUrl ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${signal?.lastStartAt ? formatAgo(signal.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${signal?.lastProbeAt ? formatAgo(signal.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${signal?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${signal.lastError}\n </div>`\n : nothing}\n\n ${signal?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${signal.probe.ok ? \"ok\" : \"failed\"} ·\n ${signal.probe.status ?? \"\"} ${signal.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"signal\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { SlackStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderSlackCard(params: {\n props: ChannelsProps;\n slack?: SlackStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, slack, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Slack</div>\n <div class=\"card-sub\">Socket mode status and channel configuration.</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${slack?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${slack?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${slack?.lastStartAt ? formatAgo(slack.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${slack?.lastProbeAt ? formatAgo(slack.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${slack?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${slack.lastError}\n </div>`\n : nothing}\n\n ${slack?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${slack.probe.ok ? \"ok\" : \"failed\"} ·\n ${slack.probe.status ?? \"\"} ${slack.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"slack\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { ChannelAccountSnapshot, TelegramStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderTelegramCard(params: {\n props: ChannelsProps;\n telegram?: TelegramStatus;\n telegramAccounts: ChannelAccountSnapshot[];\n accountCountLabel: unknown;\n}) {\n const { props, telegram, telegramAccounts, accountCountLabel } = params;\n const hasMultipleAccounts = telegramAccounts.length > 1;\n\n const renderAccountCard = (account: ChannelAccountSnapshot) => {\n const probe = account.probe as { bot?: { username?: string } } | undefined;\n const botUsername = probe?.bot?.username;\n const label = account.name || account.accountId;\n return html`\n <div class=\"account-card\">\n <div class=\"account-card-header\">\n <div class=\"account-card-title\">\n ${botUsername ? `@${botUsername}` : label}\n </div>\n <div class=\"account-card-id\">${account.accountId}</div>\n </div>\n <div class=\"status-list account-card-status\">\n <div>\n <span class=\"label\">Running</span>\n <span>${account.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Configured</span>\n <span>${account.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last inbound</span>\n <span>${account.lastInboundAt ? formatAgo(account.lastInboundAt) : \"n/a\"}</span>\n </div>\n ${account.lastError\n ? html`\n <div class=\"account-card-error\">\n ${account.lastError}\n </div>\n `\n : nothing}\n </div>\n </div>\n `;\n };\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Telegram</div>\n <div class=\"card-sub\">Bot status and channel configuration.</div>\n ${accountCountLabel}\n\n ${hasMultipleAccounts\n ? html`\n <div class=\"account-card-list\">\n ${telegramAccounts.map((account) => renderAccountCard(account))}\n </div>\n `\n : html`\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${telegram?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${telegram?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Mode</span>\n <span>${telegram?.mode ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${telegram?.lastStartAt ? formatAgo(telegram.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${telegram?.lastProbeAt ? formatAgo(telegram.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n `}\n\n ${telegram?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${telegram.lastError}\n </div>`\n : nothing}\n\n ${telegram?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${telegram.probe.ok ? \"ok\" : \"failed\"} ·\n ${telegram.probe.status ?? \"\"} ${telegram.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"telegram\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { WhatsAppStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport { formatDuration } from \"./channels.shared\";\n\nexport function renderWhatsAppCard(params: {\n props: ChannelsProps;\n whatsapp?: WhatsAppStatus;\n accountCountLabel: unknown;\n}) {\n const { props, whatsapp, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">WhatsApp</div>\n <div class=\"card-sub\">Link WhatsApp Web and monitor connection health.</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${whatsapp?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Linked</span>\n <span>${whatsapp?.linked ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${whatsapp?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Connected</span>\n <span>${whatsapp?.connected ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last connect</span>\n <span>\n ${whatsapp?.lastConnectedAt\n ? formatAgo(whatsapp.lastConnectedAt)\n : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Last message</span>\n <span>\n ${whatsapp?.lastMessageAt ? formatAgo(whatsapp.lastMessageAt) : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Auth age</span>\n <span>\n ${whatsapp?.authAgeMs != null\n ? formatDuration(whatsapp.authAgeMs)\n : \"n/a\"}\n </span>\n </div>\n </div>\n\n ${whatsapp?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${whatsapp.lastError}\n </div>`\n : nothing}\n\n ${props.whatsappMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.whatsappMessage}\n </div>`\n : nothing}\n\n ${props.whatsappQrDataUrl\n ? html`<div class=\"qr-wrap\">\n <img src=${props.whatsappQrDataUrl} alt=\"WhatsApp QR\" />\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(false)}\n >\n ${props.whatsappBusy ? \"Working…\" : \"Show QR\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(true)}\n >\n Relink\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppWait()}\n >\n Wait for scan\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppLogout()}\n >\n Logout\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Refresh\n </button>\n </div>\n\n ${renderChannelConfigSection({ channelId: \"whatsapp\", props })}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type {\n ChannelAccountSnapshot,\n ChannelUiMetaEntry,\n ChannelsStatusSnapshot,\n DiscordStatus,\n GoogleChatStatus,\n IMessageStatus,\n NostrProfile,\n NostrStatus,\n SignalStatus,\n SlackStatus,\n TelegramStatus,\n WhatsAppStatus,\n} from \"../types\";\nimport type {\n ChannelKey,\n ChannelsChannelData,\n ChannelsProps,\n} from \"./channels.types\";\nimport { channelEnabled, renderChannelAccountCount } from \"./channels.shared\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport { renderDiscordCard } from \"./channels.discord\";\nimport { renderGoogleChatCard } from \"./channels.googlechat\";\nimport { renderIMessageCard } from \"./channels.imessage\";\nimport { renderNostrCard } from \"./channels.nostr\";\nimport { renderSignalCard } from \"./channels.signal\";\nimport { renderSlackCard } from \"./channels.slack\";\nimport { renderTelegramCard } from \"./channels.telegram\";\nimport { renderWhatsAppCard } from \"./channels.whatsapp\";\n\nexport function renderChannels(props: ChannelsProps) {\n const channels = props.snapshot?.channels as Record<string, unknown> | null;\n const whatsapp = (channels?.whatsapp ?? undefined) as\n | WhatsAppStatus\n | undefined;\n const telegram = (channels?.telegram ?? undefined) as\n | TelegramStatus\n | undefined;\n const discord = (channels?.discord ?? null) as DiscordStatus | null;\n const googlechat = (channels?.googlechat ?? null) as GoogleChatStatus | null;\n const slack = (channels?.slack ?? null) as SlackStatus | null;\n const signal = (channels?.signal ?? null) as SignalStatus | null;\n const imessage = (channels?.imessage ?? null) as IMessageStatus | null;\n const nostr = (channels?.nostr ?? null) as NostrStatus | null;\n const channelOrder = resolveChannelOrder(props.snapshot);\n const orderedChannels = channelOrder\n .map((key, index) => ({\n key,\n enabled: channelEnabled(key, props),\n order: index,\n }))\n .sort((a, b) => {\n if (a.enabled !== b.enabled) return a.enabled ? -1 : 1;\n return a.order - b.order;\n });\n\n return html`\n <section class=\"grid grid-cols-2\">\n ${orderedChannels.map((channel) =>\n renderChannel(channel.key, props, {\n whatsapp,\n telegram,\n discord,\n googlechat,\n slack,\n signal,\n imessage,\n nostr,\n channelAccounts: props.snapshot?.channelAccounts ?? null,\n }),\n )}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Channel health</div>\n <div class=\"card-sub\">Channel status snapshots from the gateway.</div>\n </div>\n <div class=\"muted\">${props.lastSuccessAt ? formatAgo(props.lastSuccessAt) : \"n/a\"}</div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n <pre class=\"code-block\" style=\"margin-top: 12px;\">\n${props.snapshot ? JSON.stringify(props.snapshot, null, 2) : \"No snapshot yet.\"}\n </pre>\n </section>\n `;\n}\n\nfunction resolveChannelOrder(snapshot: ChannelsStatusSnapshot | null): ChannelKey[] {\n if (snapshot?.channelMeta?.length) {\n return snapshot.channelMeta.map((entry) => entry.id) as ChannelKey[];\n }\n if (snapshot?.channelOrder?.length) {\n return snapshot.channelOrder;\n }\n return [\n \"whatsapp\",\n \"telegram\",\n \"discord\",\n \"googlechat\",\n \"slack\",\n \"signal\",\n \"imessage\",\n \"nostr\",\n ];\n}\n\nfunction renderChannel(\n key: ChannelKey,\n props: ChannelsProps,\n data: ChannelsChannelData,\n) {\n const accountCountLabel = renderChannelAccountCount(\n key,\n data.channelAccounts,\n );\n switch (key) {\n case \"whatsapp\":\n return renderWhatsAppCard({\n props,\n whatsapp: data.whatsapp,\n accountCountLabel,\n });\n case \"telegram\":\n return renderTelegramCard({\n props,\n telegram: data.telegram,\n telegramAccounts: data.channelAccounts?.telegram ?? [],\n accountCountLabel,\n });\n case \"discord\":\n return renderDiscordCard({\n props,\n discord: data.discord,\n accountCountLabel,\n });\n case \"googlechat\":\n return renderGoogleChatCard({\n props,\n googlechat: data.googlechat,\n accountCountLabel,\n });\n case \"slack\":\n return renderSlackCard({\n props,\n slack: data.slack,\n accountCountLabel,\n });\n case \"signal\":\n return renderSignalCard({\n props,\n signal: data.signal,\n accountCountLabel,\n });\n case \"imessage\":\n return renderIMessageCard({\n props,\n imessage: data.imessage,\n accountCountLabel,\n });\n case \"nostr\": {\n const nostrAccounts = data.channelAccounts?.nostr ?? [];\n const primaryAccount = nostrAccounts[0];\n const accountId = primaryAccount?.accountId ?? \"default\";\n const profile =\n (primaryAccount as { profile?: NostrProfile | null } | undefined)?.profile ?? null;\n const showForm =\n props.nostrProfileAccountId === accountId ? props.nostrProfileFormState : null;\n const profileFormCallbacks = showForm\n ? {\n onFieldChange: props.onNostrProfileFieldChange,\n onSave: props.onNostrProfileSave,\n onImport: props.onNostrProfileImport,\n onCancel: props.onNostrProfileCancel,\n onToggleAdvanced: props.onNostrProfileToggleAdvanced,\n }\n : null;\n return renderNostrCard({\n props,\n nostr: data.nostr,\n nostrAccounts,\n accountCountLabel,\n profileFormState: showForm,\n profileFormCallbacks,\n onEditProfile: () => props.onNostrProfileEdit(accountId, profile),\n });\n }\n default:\n return renderGenericChannelCard(key, props, data.channelAccounts ?? {});\n }\n}\n\nfunction renderGenericChannelCard(\n key: ChannelKey,\n props: ChannelsProps,\n channelAccounts: Record<string, ChannelAccountSnapshot[]>,\n) {\n const label = resolveChannelLabel(props.snapshot, key);\n const status = props.snapshot?.channels?.[key] as Record<string, unknown> | undefined;\n const configured = typeof status?.configured === \"boolean\" ? status.configured : undefined;\n const running = typeof status?.running === \"boolean\" ? status.running : undefined;\n const connected = typeof status?.connected === \"boolean\" ? status.connected : undefined;\n const lastError = typeof status?.lastError === \"string\" ? status.lastError : undefined;\n const accounts = channelAccounts[key] ?? [];\n const accountCountLabel = renderChannelAccountCount(key, channelAccounts);\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">${label}</div>\n <div class=\"card-sub\">Channel status and configuration.</div>\n ${accountCountLabel}\n\n ${accounts.length > 0\n ? html`\n <div class=\"account-card-list\">\n ${accounts.map((account) => renderGenericAccount(account))}\n </div>\n `\n : html`\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${configured == null ? \"n/a\" : configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${running == null ? \"n/a\" : running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Connected</span>\n <span>${connected == null ? \"n/a\" : connected ? \"Yes\" : \"No\"}</span>\n </div>\n </div>\n `}\n\n ${lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${lastError}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: key, props })}\n </div>\n `;\n}\n\nfunction resolveChannelMetaMap(\n snapshot: ChannelsStatusSnapshot | null,\n): Record<string, ChannelUiMetaEntry> {\n if (!snapshot?.channelMeta?.length) return {};\n return Object.fromEntries(snapshot.channelMeta.map((entry) => [entry.id, entry]));\n}\n\nfunction resolveChannelLabel(\n snapshot: ChannelsStatusSnapshot | null,\n key: string,\n): string {\n const meta = resolveChannelMetaMap(snapshot)[key];\n return meta?.label ?? snapshot?.channelLabels?.[key] ?? key;\n}\n\nconst RECENT_ACTIVITY_THRESHOLD_MS = 10 * 60 * 1000; // 10 minutes\n\nfunction hasRecentActivity(account: ChannelAccountSnapshot): boolean {\n if (!account.lastInboundAt) return false;\n return Date.now() - account.lastInboundAt < RECENT_ACTIVITY_THRESHOLD_MS;\n}\n\nfunction deriveRunningStatus(account: ChannelAccountSnapshot): \"Yes\" | \"No\" | \"Active\" {\n if (account.running) return \"Yes\";\n // If we have recent inbound activity, the channel is effectively running\n if (hasRecentActivity(account)) return \"Active\";\n return \"No\";\n}\n\nfunction deriveConnectedStatus(account: ChannelAccountSnapshot): \"Yes\" | \"No\" | \"Active\" | \"n/a\" {\n if (account.connected === true) return \"Yes\";\n if (account.connected === false) return \"No\";\n // If connected is null/undefined but we have recent activity, show as active\n if (hasRecentActivity(account)) return \"Active\";\n return \"n/a\";\n}\n\nfunction renderGenericAccount(account: ChannelAccountSnapshot) {\n const runningStatus = deriveRunningStatus(account);\n const connectedStatus = deriveConnectedStatus(account);\n\n return html`\n <div class=\"account-card\">\n <div class=\"account-card-header\">\n <div class=\"account-card-title\">${account.name || account.accountId}</div>\n <div class=\"account-card-id\">${account.accountId}</div>\n </div>\n <div class=\"status-list account-card-status\">\n <div>\n <span class=\"label\">Running</span>\n <span>${runningStatus}</span>\n </div>\n <div>\n <span class=\"label\">Configured</span>\n <span>${account.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Connected</span>\n <span>${connectedStatus}</span>\n </div>\n <div>\n <span class=\"label\">Last inbound</span>\n <span>${account.lastInboundAt ? formatAgo(account.lastInboundAt) : \"n/a\"}</span>\n </div>\n ${account.lastError\n ? html`\n <div class=\"account-card-error\">\n ${account.lastError}\n </div>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","import { formatAgo, formatDurationMs, formatMs } from \"./format\";\nimport type { CronJob, GatewaySessionRow, PresenceEntry } from \"./types\";\n\nexport function formatPresenceSummary(entry: PresenceEntry): string {\n const host = entry.host ?? \"unknown\";\n const ip = entry.ip ? `(${entry.ip})` : \"\";\n const mode = entry.mode ?? \"\";\n const version = entry.version ?? \"\";\n return `${host} ${ip} ${mode} ${version}`.trim();\n}\n\nexport function formatPresenceAge(entry: PresenceEntry): string {\n const ts = entry.ts ?? null;\n return ts ? formatAgo(ts) : \"n/a\";\n}\n\nexport function formatNextRun(ms?: number | null) {\n if (!ms) return \"n/a\";\n return `${formatMs(ms)} (${formatAgo(ms)})`;\n}\n\nexport function formatSessionTokens(row: GatewaySessionRow) {\n if (row.totalTokens == null) return \"n/a\";\n const total = row.totalTokens ?? 0;\n const ctx = row.contextTokens ?? 0;\n return ctx ? `${total} / ${ctx}` : String(total);\n}\n\nexport function formatEventPayload(payload: unknown): string {\n if (payload == null) return \"\";\n try {\n return JSON.stringify(payload, null, 2);\n } catch {\n return String(payload);\n }\n}\n\nexport function formatCronState(job: CronJob) {\n const state = job.state ?? {};\n const next = state.nextRunAtMs ? formatMs(state.nextRunAtMs) : \"n/a\";\n const last = state.lastRunAtMs ? formatMs(state.lastRunAtMs) : \"n/a\";\n const status = state.lastStatus ?? \"n/a\";\n return `${status} · next ${next} · last ${last}`;\n}\n\nexport function formatCronSchedule(job: CronJob) {\n const s = job.schedule;\n if (s.kind === \"at\") return `At ${formatMs(s.atMs)}`;\n if (s.kind === \"every\") return `Every ${formatDurationMs(s.everyMs)}`;\n return `Cron ${s.expr}${s.tz ? ` (${s.tz})` : \"\"}`;\n}\n\nexport function formatCronPayload(job: CronJob) {\n const p = job.payload;\n if (p.kind === \"systemEvent\") return `System: ${p.text}`;\n return `Agent: ${p.message}`;\n}\n","import { html, nothing } from \"lit\";\nimport type { ChannelUiMetaEntry, CronJob, CronRunLogEntry, CronStatus } from \"../types.ts\";\nimport type { CronFormState } from \"../ui-types.ts\";\nimport { formatRelativeTimestamp, formatMs } from \"../format.ts\";\nimport { pathForTab } from \"../navigation.ts\";\nimport { formatCronSchedule, formatNextRun } from \"../presenter.ts\";\n\nexport type CronProps = {\n basePath: string;\n loading: boolean;\n status: CronStatus | null;\n jobs: CronJob[];\n error: string | null;\n busy: boolean;\n form: CronFormState;\n channels: string[];\n channelLabels?: Record<string, string>;\n channelMeta?: ChannelUiMetaEntry[];\n runsJobId: string | null;\n runs: CronRunLogEntry[];\n onFormChange: (patch: Partial<CronFormState>) => void;\n onRefresh: () => void;\n onAdd: () => void;\n onToggle: (job: CronJob, enabled: boolean) => void;\n onRun: (job: CronJob) => void;\n onRemove: (job: CronJob) => void;\n onLoadRuns: (jobId: string) => void;\n};\n\nfunction buildChannelOptions(props: CronProps): string[] {\n const options = [\"last\", ...props.channels.filter(Boolean)];\n const current = props.form.deliveryChannel?.trim();\n if (current && !options.includes(current)) {\n options.push(current);\n }\n const seen = new Set<string>();\n return options.filter((value) => {\n if (seen.has(value)) {\n return false;\n }\n seen.add(value);\n return true;\n });\n}\n\nfunction resolveChannelLabel(props: CronProps, channel: string): string {\n if (channel === \"last\") {\n return \"last\";\n }\n const meta = props.channelMeta?.find((entry) => entry.id === channel);\n if (meta?.label) {\n return meta.label;\n }\n return props.channelLabels?.[channel] ?? channel;\n}\n\nexport function renderCron(props: CronProps) {\n const channelOptions = buildChannelOptions(props);\n const selectedJob =\n props.runsJobId == null ? undefined : props.jobs.find((job) => job.id === props.runsJobId);\n const selectedRunTitle = selectedJob?.name ?? props.runsJobId ?? \"(select a job)\";\n const orderedRuns = props.runs.toSorted((a, b) => b.ts - a.ts);\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">Scheduler</div>\n <div class=\"card-sub\">Gateway-owned cron scheduler status.</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">Enabled</div>\n <div class=\"stat-value\">\n ${props.status ? (props.status.enabled ? \"Yes\" : \"No\") : \"n/a\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Jobs</div>\n <div class=\"stat-value\">${props.status?.jobs ?? \"n/a\"}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Next wake</div>\n <div class=\"stat-value\">${formatNextRun(props.status?.nextWakeAtMs ?? null)}</div>\n </div>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n ${props.error ? html`<span class=\"muted\">${props.error}</span>` : nothing}\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">New Job</div>\n <div class=\"card-sub\">Create a scheduled wakeup or agent run.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Name</span>\n <input\n .value=${props.form.name}\n @input=${(e: Event) =>\n props.onFormChange({ name: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Description</span>\n <input\n .value=${props.form.description}\n @input=${(e: Event) =>\n props.onFormChange({ description: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Agent ID</span>\n <input\n .value=${props.form.agentId}\n @input=${(e: Event) =>\n props.onFormChange({ agentId: (e.target as HTMLInputElement).value })}\n placeholder=\"default\"\n />\n </label>\n <label class=\"field checkbox\">\n <span>Enabled</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(e: Event) =>\n props.onFormChange({ enabled: (e.target as HTMLInputElement).checked })}\n />\n </label>\n <label class=\"field\">\n <span>Schedule</span>\n <select\n .value=${props.form.scheduleKind}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleKind: (e.target as HTMLSelectElement)\n .value as CronFormState[\"scheduleKind\"],\n })}\n >\n <option value=\"every\">Every</option>\n <option value=\"at\">At</option>\n <option value=\"cron\">Cron</option>\n </select>\n </label>\n </div>\n ${renderScheduleFields(props)}\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Session</span>\n <select\n .value=${props.form.sessionTarget}\n @change=${(e: Event) =>\n props.onFormChange({\n sessionTarget: (e.target as HTMLSelectElement)\n .value as CronFormState[\"sessionTarget\"],\n })}\n >\n <option value=\"main\">Main</option>\n <option value=\"isolated\">Isolated</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Wake mode</span>\n <select\n .value=${props.form.wakeMode}\n @change=${(e: Event) =>\n props.onFormChange({\n wakeMode: (e.target as HTMLSelectElement).value as CronFormState[\"wakeMode\"],\n })}\n >\n <option value=\"now\">Now</option>\n <option value=\"next-heartbeat\">Next heartbeat</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Payload</span>\n <select\n .value=${props.form.payloadKind}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadKind: (e.target as HTMLSelectElement)\n .value as CronFormState[\"payloadKind\"],\n })}\n >\n <option value=\"systemEvent\">System event</option>\n <option value=\"agentTurn\">Agent turn</option>\n </select>\n </label>\n </div>\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>${props.form.payloadKind === \"systemEvent\" ? \"System text\" : \"Agent message\"}</span>\n <textarea\n .value=${props.form.payloadText}\n @input=${(e: Event) =>\n props.onFormChange({\n payloadText: (e.target as HTMLTextAreaElement).value,\n })}\n rows=\"4\"\n ></textarea>\n </label>\n ${\n props.form.payloadKind === \"agentTurn\"\n ? html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Delivery</span>\n <select\n .value=${props.form.deliveryMode}\n @change=${(e: Event) =>\n props.onFormChange({\n deliveryMode: (e.target as HTMLSelectElement)\n .value as CronFormState[\"deliveryMode\"],\n })}\n >\n <option value=\"announce\">Announce summary (default)</option>\n <option value=\"none\">None (internal)</option>\n <option value=\"webhook\">Webhook</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Timeout (seconds)</span>\n <input\n .value=${props.form.timeoutSeconds}\n @input=${(e: Event) =>\n props.onFormChange({\n timeoutSeconds: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n ${\n props.form.deliveryMode === \"announce\"\n ? html`\n <label class=\"field\">\n <span>Channel</span>\n <select\n .value=${props.form.deliveryChannel || \"last\"}\n @change=${(e: Event) =>\n props.onFormChange({\n deliveryChannel: (e.target as HTMLSelectElement).value,\n })}\n >\n ${channelOptions.map(\n (channel) =>\n html`<option value=${channel}>\n ${resolveChannelLabel(props, channel)}\n </option>`,\n )}\n </select>\n </label>\n <label class=\"field\">\n <span>To</span>\n <input\n .value=${props.form.deliveryTo}\n @input=${(e: Event) =>\n props.onFormChange({\n deliveryTo: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"+1555… or chat id\"\n />\n </label>\n `\n : nothing\n }\n </div>\n `\n : nothing\n }\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn primary\" ?disabled=${props.busy} @click=${props.onAdd}>\n ${props.busy ? \"Saving…\" : \"Add job\"}\n </button>\n </div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Jobs</div>\n <div class=\"card-sub\">All scheduled jobs stored in the gateway.</div>\n ${\n props.jobs.length === 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px\">No jobs yet.</div>\n `\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.jobs.map((job) => renderJob(job, props))}\n </div>\n `\n }\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Run history</div>\n <div class=\"card-sub\">Latest runs for ${selectedRunTitle}.</div>\n ${\n props.runsJobId == null\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px\">Select a job to inspect run history.</div>\n `\n : orderedRuns.length === 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px\">No runs yet.</div>\n `\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${orderedRuns.map((entry) => renderRun(entry, props.basePath))}\n </div>\n `\n }\n </section>\n `;\n}\n\nfunction renderScheduleFields(props: CronProps) {\n const form = props.form;\n if (form.scheduleKind === \"at\") {\n return html`\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>Run at</span>\n <input\n type=\"datetime-local\"\n .value=${form.scheduleAt}\n @input=${(e: Event) =>\n props.onFormChange({\n scheduleAt: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `;\n }\n if (form.scheduleKind === \"every\") {\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Every</span>\n <input\n .value=${form.everyAmount}\n @input=${(e: Event) =>\n props.onFormChange({\n everyAmount: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Unit</span>\n <select\n .value=${form.everyUnit}\n @change=${(e: Event) =>\n props.onFormChange({\n everyUnit: (e.target as HTMLSelectElement).value as CronFormState[\"everyUnit\"],\n })}\n >\n <option value=\"minutes\">Minutes</option>\n <option value=\"hours\">Hours</option>\n <option value=\"days\">Days</option>\n </select>\n </label>\n </div>\n `;\n }\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Expression</span>\n <input\n .value=${form.cronExpr}\n @input=${(e: Event) =>\n props.onFormChange({ cronExpr: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Timezone (optional)</span>\n <input\n .value=${form.cronTz}\n @input=${(e: Event) =>\n props.onFormChange({ cronTz: (e.target as HTMLInputElement).value })}\n />\n </label>\n </div>\n `;\n}\n\nfunction renderJob(job: CronJob, props: CronProps) {\n const isSelected = props.runsJobId === job.id;\n const itemClass = `list-item list-item-clickable cron-job${isSelected ? \" list-item-selected\" : \"\"}`;\n return html`\n <div class=${itemClass} @click=${() => props.onLoadRuns(job.id)}>\n <div class=\"list-main\">\n <div class=\"list-title\">${job.name}</div>\n <div class=\"list-sub\">${formatCronSchedule(job)}</div>\n ${renderJobPayload(job)}\n ${job.agentId ? html`<div class=\"muted cron-job-agent\">Agent: ${job.agentId}</div>` : nothing}\n </div>\n <div class=\"list-meta\">\n ${renderJobState(job)}\n </div>\n <div class=\"cron-job-footer\">\n <div class=\"chip-row cron-job-chips\">\n <span class=${`chip ${job.enabled ? \"chip-ok\" : \"chip-danger\"}`}>\n ${job.enabled ? \"enabled\" : \"disabled\"}\n </span>\n <span class=\"chip\">${job.sessionTarget}</span>\n <span class=\"chip\">${job.wakeMode}</span>\n </div>\n <div class=\"row cron-job-actions\">\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onToggle(job, !job.enabled);\n }}\n >\n ${job.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onRun(job);\n }}\n >\n Run\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onLoadRuns(job.id);\n }}\n >\n History\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onRemove(job);\n }}\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderJobPayload(job: CronJob) {\n if (job.payload.kind === \"systemEvent\") {\n return html`<div class=\"cron-job-detail\">\n <span class=\"cron-job-detail-label\">System</span>\n <span class=\"muted cron-job-detail-value\">${job.payload.text}</span>\n </div>`;\n }\n\n const delivery = job.delivery;\n const deliveryTarget =\n delivery?.channel || delivery?.to\n ? ` (${delivery.channel ?? \"last\"}${delivery.to ? ` -> ${delivery.to}` : \"\"})`\n : \"\";\n\n return html`\n <div class=\"cron-job-detail\">\n <span class=\"cron-job-detail-label\">Prompt</span>\n <span class=\"muted cron-job-detail-value\">${job.payload.message}</span>\n </div>\n ${\n delivery\n ? html`<div class=\"cron-job-detail\">\n <span class=\"cron-job-detail-label\">Delivery</span>\n <span class=\"muted cron-job-detail-value\">${delivery.mode}${deliveryTarget}</span>\n </div>`\n : nothing\n }\n `;\n}\n\nfunction formatStateRelative(ms?: number) {\n if (typeof ms !== \"number\" || !Number.isFinite(ms)) {\n return \"n/a\";\n }\n return formatRelativeTimestamp(ms);\n}\n\nfunction renderJobState(job: CronJob) {\n const status = job.state?.lastStatus ?? \"n/a\";\n const statusClass =\n status === \"ok\"\n ? \"cron-job-status-ok\"\n : status === \"error\"\n ? \"cron-job-status-error\"\n : status === \"skipped\"\n ? \"cron-job-status-skipped\"\n : \"cron-job-status-na\";\n const nextRunAtMs = job.state?.nextRunAtMs;\n const lastRunAtMs = job.state?.lastRunAtMs;\n\n return html`\n <div class=\"cron-job-state\">\n <div class=\"cron-job-state-row\">\n <span class=\"cron-job-state-key\">Status</span>\n <span class=${`cron-job-status-pill ${statusClass}`}>${status}</span>\n </div>\n <div class=\"cron-job-state-row\">\n <span class=\"cron-job-state-key\">Next</span>\n <span class=\"cron-job-state-value\" title=${formatMs(nextRunAtMs)}>\n ${formatStateRelative(nextRunAtMs)}\n </span>\n </div>\n <div class=\"cron-job-state-row\">\n <span class=\"cron-job-state-key\">Last</span>\n <span class=\"cron-job-state-value\" title=${formatMs(lastRunAtMs)}>\n ${formatStateRelative(lastRunAtMs)}\n </span>\n </div>\n </div>\n `;\n}\n\nfunction renderRun(entry: CronRunLogEntry, basePath: string) {\n const chatUrl =\n typeof entry.sessionKey === \"string\" && entry.sessionKey.trim().length > 0\n ? `${pathForTab(\"chat\", basePath)}?session=${encodeURIComponent(entry.sessionKey)}`\n : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.status}</div>\n <div class=\"list-sub\">${entry.summary ?? \"\"}</div>\n </div>\n <div class=\"list-meta\">\n <div>${formatMs(entry.ts)}</div>\n <div class=\"muted\">${entry.durationMs ?? 0}ms</div>\n ${\n chatUrl\n ? html`<div><a class=\"session-link\" href=${chatUrl}>Open run chat</a></div>`\n : nothing\n }\n ${entry.error ? html`<div class=\"muted\">${entry.error}</div>` : nothing}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatEventPayload } from \"../presenter\";\nimport type { EventLogEntry } from \"../app-events\";\n\nexport type DebugProps = {\n loading: boolean;\n status: Record<string, unknown> | null;\n health: Record<string, unknown> | null;\n models: unknown[];\n heartbeat: unknown;\n eventLog: EventLogEntry[];\n callMethod: string;\n callParams: string;\n callResult: string | null;\n callError: string | null;\n onCallMethodChange: (next: string) => void;\n onCallParamsChange: (next: string) => void;\n onRefresh: () => void;\n onCall: () => void;\n};\n\nexport function renderDebug(props: DebugProps) {\n const securityAudit =\n props.status && typeof props.status === \"object\"\n ? (props.status as { securityAudit?: { summary?: Record<string, number> } }).securityAudit\n : null;\n const securitySummary = securityAudit?.summary ?? null;\n const critical = securitySummary?.critical ?? 0;\n const warn = securitySummary?.warn ?? 0;\n const info = securitySummary?.info ?? 0;\n const securityTone = critical > 0 ? \"danger\" : warn > 0 ? \"warn\" : \"success\";\n const securityLabel =\n critical > 0\n ? `${critical} critical`\n : warn > 0\n ? `${warn} warnings`\n : \"No critical issues\";\n\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Snapshots</div>\n <div class=\"card-sub\">Status, health, and heartbeat data.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"stack\" style=\"margin-top: 12px;\">\n <div>\n <div class=\"muted\">Status</div>\n ${securitySummary\n ? html`<div class=\"callout ${securityTone}\" style=\"margin-top: 8px;\">\n Security audit: ${securityLabel}${info > 0 ? ` · ${info} info` : \"\"}. Run\n <span class=\"mono\">poolbot security audit --deep</span> for details.\n </div>`\n : nothing}\n <pre class=\"code-block\">${JSON.stringify(props.status ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Health</div>\n <pre class=\"code-block\">${JSON.stringify(props.health ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Last heartbeat</div>\n <pre class=\"code-block\">${JSON.stringify(props.heartbeat ?? {}, null, 2)}</pre>\n </div>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">Manual RPC</div>\n <div class=\"card-sub\">Send a raw gateway method with JSON params.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Method</span>\n <input\n .value=${props.callMethod}\n @input=${(e: Event) =>\n props.onCallMethodChange((e.target as HTMLInputElement).value)}\n placeholder=\"system-presence\"\n />\n </label>\n <label class=\"field\">\n <span>Params (JSON)</span>\n <textarea\n .value=${props.callParams}\n @input=${(e: Event) =>\n props.onCallParamsChange((e.target as HTMLTextAreaElement).value)}\n rows=\"6\"\n ></textarea>\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn primary\" @click=${props.onCall}>Call</button>\n </div>\n ${props.callError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.callError}\n </div>`\n : nothing}\n ${props.callResult\n ? html`<pre class=\"code-block\" style=\"margin-top: 12px;\">${props.callResult}</pre>`\n : nothing}\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Models</div>\n <div class=\"card-sub\">Catalog from models.list.</div>\n <pre class=\"code-block\" style=\"margin-top: 12px;\">${JSON.stringify(\n props.models ?? [],\n null,\n 2,\n )}</pre>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Event Log</div>\n <div class=\"card-sub\">Latest gateway events.</div>\n ${props.eventLog.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No events yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.eventLog.map(\n (evt) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${evt.event}</div>\n <div class=\"list-sub\">${new Date(evt.ts).toLocaleTimeString()}</div>\n </div>\n <div class=\"list-meta\">\n <pre class=\"code-block\">${formatEventPayload(evt.payload)}</pre>\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatPresenceAge, formatPresenceSummary } from \"../presenter\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type InstancesProps = {\n loading: boolean;\n entries: PresenceEntry[];\n lastError: string | null;\n statusMessage: string | null;\n onRefresh: () => void;\n};\n\nexport function renderInstances(props: InstancesProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connected Instances</div>\n <div class=\"card-sub\">Presence beacons from the gateway and clients.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n ${props.statusMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.statusMessage}\n </div>`\n : nothing}\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.entries.length === 0\n ? html`<div class=\"muted\">No instances reported yet.</div>`\n : props.entries.map((entry) => renderEntry(entry))}\n </div>\n </section>\n `;\n}\n\nfunction renderEntry(entry: PresenceEntry) {\n const lastInput =\n entry.lastInputSeconds != null\n ? `${entry.lastInputSeconds}s ago`\n : \"n/a\";\n const mode = entry.mode ?? \"unknown\";\n const roles = Array.isArray(entry.roles) ? entry.roles.filter(Boolean) : [];\n const scopes = Array.isArray(entry.scopes) ? entry.scopes.filter(Boolean) : [];\n const scopesLabel =\n scopes.length > 0\n ? scopes.length > 3\n ? `${scopes.length} scopes`\n : `scopes: ${scopes.join(\", \")}`\n : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.host ?? \"unknown host\"}</div>\n <div class=\"list-sub\">${formatPresenceSummary(entry)}</div>\n <div class=\"chip-row\">\n <span class=\"chip\">${mode}</span>\n ${roles.map((role) => html`<span class=\"chip\">${role}</span>`)}\n ${scopesLabel ? html`<span class=\"chip\">${scopesLabel}</span>` : nothing}\n ${entry.platform ? html`<span class=\"chip\">${entry.platform}</span>` : nothing}\n ${entry.deviceFamily\n ? html`<span class=\"chip\">${entry.deviceFamily}</span>`\n : nothing}\n ${entry.modelIdentifier\n ? html`<span class=\"chip\">${entry.modelIdentifier}</span>`\n : nothing}\n ${entry.version ? html`<span class=\"chip\">${entry.version}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatPresenceAge(entry)}</div>\n <div class=\"muted\">Last input ${lastInput}</div>\n <div class=\"muted\">Reason ${entry.reason ?? \"\"}</div>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { LogEntry, LogLevel } from \"../types\";\n\nconst LEVELS: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"];\n\nexport type LogsProps = {\n loading: boolean;\n error: string | null;\n file: string | null;\n entries: LogEntry[];\n filterText: string;\n levelFilters: Record<LogLevel, boolean>;\n autoFollow: boolean;\n truncated: boolean;\n onFilterTextChange: (next: string) => void;\n onLevelToggle: (level: LogLevel, enabled: boolean) => void;\n onToggleAutoFollow: (next: boolean) => void;\n onRefresh: () => void;\n onExport: (lines: string[], label: string) => void;\n onScroll: (event: Event) => void;\n};\n\nfunction formatTime(value?: string | null) {\n if (!value) return \"\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleTimeString();\n}\n\nfunction matchesFilter(entry: LogEntry, needle: string) {\n if (!needle) return true;\n const haystack = [entry.message, entry.subsystem, entry.raw]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n}\n\nexport function renderLogs(props: LogsProps) {\n const needle = props.filterText.trim().toLowerCase();\n const levelFiltered = LEVELS.some((level) => !props.levelFilters[level]);\n const filtered = props.entries.filter((entry) => {\n if (entry.level && !props.levelFilters[entry.level]) return false;\n return matchesFilter(entry, needle);\n });\n const exportLabel = needle || levelFiltered ? \"filtered\" : \"visible\";\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Logs</div>\n <div class=\"card-sub\">Gateway file logs (JSONL).</div>\n </div>\n <div class=\"row\" style=\"gap: 8px;\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${filtered.length === 0}\n @click=${() => props.onExport(filtered.map((entry) => entry.raw), exportLabel)}\n >\n Export ${exportLabel}\n </button>\n </div>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"min-width: 220px;\">\n <span>Filter</span>\n <input\n .value=${props.filterText}\n @input=${(e: Event) =>\n props.onFilterTextChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search logs\"\n />\n </label>\n <label class=\"field checkbox\">\n <span>Auto-follow</span>\n <input\n type=\"checkbox\"\n .checked=${props.autoFollow}\n @change=${(e: Event) =>\n props.onToggleAutoFollow((e.target as HTMLInputElement).checked)}\n />\n </label>\n </div>\n\n <div class=\"chip-row\" style=\"margin-top: 12px;\">\n ${LEVELS.map(\n (level) => html`\n <label class=\"chip log-chip ${level}\">\n <input\n type=\"checkbox\"\n .checked=${props.levelFilters[level]}\n @change=${(e: Event) =>\n props.onLevelToggle(level, (e.target as HTMLInputElement).checked)}\n />\n <span>${level}</span>\n </label>\n `,\n )}\n </div>\n\n ${props.file\n ? html`<div class=\"muted\" style=\"margin-top: 10px;\">File: ${props.file}</div>`\n : nothing}\n ${props.truncated\n ? html`<div class=\"callout\" style=\"margin-top: 10px;\">\n Log output truncated; showing latest chunk.\n </div>`\n : nothing}\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 10px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"log-stream\" style=\"margin-top: 12px;\" @scroll=${props.onScroll}>\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"padding: 12px;\">No log entries.</div>`\n : filtered.map(\n (entry) => html`\n <div class=\"log-row\">\n <div class=\"log-time mono\">${formatTime(entry.time)}</div>\n <div class=\"log-level ${entry.level ?? \"\"}\">${entry.level ?? \"\"}</div>\n <div class=\"log-subsystem mono\">${entry.subsystem ?? \"\"}</div>\n <div class=\"log-message mono\">${entry.message ?? entry.raw}</div>\n </div>\n `,\n )}\n </div>\n </section>\n `;\n}\n","export type NodeTargetOption = {\n id: string;\n label: string;\n};\n\nexport type ConfigAgentOption = {\n id: string;\n name?: string;\n isDefault: boolean;\n index: number;\n record: Record<string, unknown>;\n};\n\nexport function resolveConfigAgents(config: Record<string, unknown> | null): ConfigAgentOption[] {\n const agentsNode = (config?.agents ?? {}) as Record<string, unknown>;\n const list = Array.isArray(agentsNode.list) ? agentsNode.list : [];\n const agents: ConfigAgentOption[] = [];\n\n list.forEach((entry, index) => {\n if (!entry || typeof entry !== \"object\") {\n return;\n }\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n if (!id) {\n return;\n }\n const name = typeof record.name === \"string\" ? record.name.trim() : undefined;\n const isDefault = record.default === true;\n agents.push({ id, name: name || undefined, isDefault, index, record });\n });\n\n return agents;\n}\n\nexport function resolveNodeTargets(\n nodes: Array<Record<string, unknown>>,\n requiredCommands: string[],\n): NodeTargetOption[] {\n const required = new Set(requiredCommands);\n const list: NodeTargetOption[] = [];\n\n for (const node of nodes) {\n const commands = Array.isArray(node.commands) ? node.commands : [];\n const supports = commands.some((cmd) => required.has(String(cmd)));\n if (!supports) {\n continue;\n }\n\n const nodeId = typeof node.nodeId === \"string\" ? node.nodeId.trim() : \"\";\n if (!nodeId) {\n continue;\n }\n\n const displayName =\n typeof node.displayName === \"string\" && node.displayName.trim()\n ? node.displayName.trim()\n : nodeId;\n list.push({\n id: nodeId,\n label: displayName === nodeId ? nodeId : `${displayName} · ${nodeId}`,\n });\n }\n\n list.sort((a, b) => a.label.localeCompare(b.label));\n return list;\n}\n","import { html, nothing } from \"lit\";\nimport type {\n ExecApprovalsAllowlistEntry,\n ExecApprovalsFile,\n} from \"../controllers/exec-approvals.js\";\nimport { clampText, formatRelativeTimestamp } from \"../format.js\";\nimport {\n resolveConfigAgents as resolveSharedConfigAgents,\n resolveNodeTargets,\n type NodeTargetOption,\n} from \"./nodes-shared.js\";\nimport type { NodesProps } from \"./nodes.js\";\n\ntype ExecSecurity = \"deny\" | \"allowlist\" | \"full\";\ntype ExecAsk = \"off\" | \"on-miss\" | \"always\";\n\ntype ExecApprovalsResolvedDefaults = {\n security: ExecSecurity;\n ask: ExecAsk;\n askFallback: ExecSecurity;\n autoAllowSkills: boolean;\n};\n\ntype ExecApprovalsAgentOption = {\n id: string;\n name?: string;\n isDefault?: boolean;\n};\n\ntype ExecApprovalsTargetNode = NodeTargetOption;\n\ntype ExecApprovalsState = {\n ready: boolean;\n disabled: boolean;\n dirty: boolean;\n loading: boolean;\n saving: boolean;\n form: ExecApprovalsFile | null;\n defaults: ExecApprovalsResolvedDefaults;\n selectedScope: string;\n selectedAgent: Record<string, unknown> | null;\n agents: ExecApprovalsAgentOption[];\n allowlist: ExecApprovalsAllowlistEntry[];\n target: \"gateway\" | \"node\";\n targetNodeId: string | null;\n targetNodes: ExecApprovalsTargetNode[];\n onSelectScope: (agentId: string) => void;\n onSelectTarget: (kind: \"gateway\" | \"node\", nodeId: string | null) => void;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n onRemove: (path: Array<string | number>) => void;\n onLoad: () => void;\n onSave: () => void;\n};\n\nconst EXEC_APPROVALS_DEFAULT_SCOPE = \"__defaults__\";\n\nconst SECURITY_OPTIONS: Array<{ value: ExecSecurity; label: string }> = [\n { value: \"deny\", label: \"Deny\" },\n { value: \"allowlist\", label: \"Allowlist\" },\n { value: \"full\", label: \"Full\" },\n];\n\nconst ASK_OPTIONS: Array<{ value: ExecAsk; label: string }> = [\n { value: \"off\", label: \"Off\" },\n { value: \"on-miss\", label: \"On miss\" },\n { value: \"always\", label: \"Always\" },\n];\n\nfunction normalizeSecurity(value?: string): ExecSecurity {\n if (value === \"allowlist\" || value === \"full\" || value === \"deny\") {\n return value;\n }\n return \"deny\";\n}\n\nfunction normalizeAsk(value?: string): ExecAsk {\n if (value === \"always\" || value === \"off\" || value === \"on-miss\") {\n return value;\n }\n return \"on-miss\";\n}\n\nfunction resolveExecApprovalsDefaults(\n form: ExecApprovalsFile | null,\n): ExecApprovalsResolvedDefaults {\n const defaults = form?.defaults ?? {};\n return {\n security: normalizeSecurity(defaults.security),\n ask: normalizeAsk(defaults.ask),\n askFallback: normalizeSecurity(defaults.askFallback ?? \"deny\"),\n autoAllowSkills: Boolean(defaults.autoAllowSkills ?? false),\n };\n}\n\nfunction resolveConfigAgents(config: Record<string, unknown> | null): ExecApprovalsAgentOption[] {\n return resolveSharedConfigAgents(config).map((entry) => ({\n id: entry.id,\n name: entry.name,\n isDefault: entry.isDefault,\n }));\n}\n\nfunction resolveExecApprovalsAgents(\n config: Record<string, unknown> | null,\n form: ExecApprovalsFile | null,\n): ExecApprovalsAgentOption[] {\n const configAgents = resolveConfigAgents(config);\n const approvalsAgents = Object.keys(form?.agents ?? {});\n const merged = new Map<string, ExecApprovalsAgentOption>();\n configAgents.forEach((agent) => merged.set(agent.id, agent));\n approvalsAgents.forEach((id) => {\n if (merged.has(id)) {\n return;\n }\n merged.set(id, { id });\n });\n const agents = Array.from(merged.values());\n if (agents.length === 0) {\n agents.push({ id: \"main\", isDefault: true });\n }\n agents.sort((a, b) => {\n if (a.isDefault && !b.isDefault) {\n return -1;\n }\n if (!a.isDefault && b.isDefault) {\n return 1;\n }\n const aLabel = a.name?.trim() ? a.name : a.id;\n const bLabel = b.name?.trim() ? b.name : b.id;\n return aLabel.localeCompare(bLabel);\n });\n return agents;\n}\n\nfunction resolveExecApprovalsScope(\n selected: string | null,\n agents: ExecApprovalsAgentOption[],\n): string {\n if (selected === EXEC_APPROVALS_DEFAULT_SCOPE) {\n return EXEC_APPROVALS_DEFAULT_SCOPE;\n }\n if (selected && agents.some((agent) => agent.id === selected)) {\n return selected;\n }\n return EXEC_APPROVALS_DEFAULT_SCOPE;\n}\n\nexport function resolveExecApprovalsState(props: NodesProps): ExecApprovalsState {\n const form = props.execApprovalsForm ?? props.execApprovalsSnapshot?.file ?? null;\n const ready = Boolean(form);\n const defaults = resolveExecApprovalsDefaults(form);\n const agents = resolveExecApprovalsAgents(props.configForm, form);\n const targetNodes = resolveExecApprovalsNodes(props.nodes);\n const target = props.execApprovalsTarget;\n let targetNodeId =\n target === \"node\" && props.execApprovalsTargetNodeId ? props.execApprovalsTargetNodeId : null;\n if (target === \"node\" && targetNodeId && !targetNodes.some((node) => node.id === targetNodeId)) {\n targetNodeId = null;\n }\n const selectedScope = resolveExecApprovalsScope(props.execApprovalsSelectedAgent, agents);\n const selectedAgent =\n selectedScope !== EXEC_APPROVALS_DEFAULT_SCOPE\n ? (((form?.agents ?? {})[selectedScope] as Record<string, unknown> | undefined) ?? null)\n : null;\n const allowlist = Array.isArray((selectedAgent as { allowlist?: unknown })?.allowlist)\n ? ((selectedAgent as { allowlist?: ExecApprovalsAllowlistEntry[] }).allowlist ?? [])\n : [];\n return {\n ready,\n disabled: props.execApprovalsSaving || props.execApprovalsLoading,\n dirty: props.execApprovalsDirty,\n loading: props.execApprovalsLoading,\n saving: props.execApprovalsSaving,\n form,\n defaults,\n selectedScope,\n selectedAgent,\n agents,\n allowlist,\n target,\n targetNodeId,\n targetNodes,\n onSelectScope: props.onExecApprovalsSelectAgent,\n onSelectTarget: props.onExecApprovalsTargetChange,\n onPatch: props.onExecApprovalsPatch,\n onRemove: props.onExecApprovalsRemove,\n onLoad: props.onLoadExecApprovals,\n onSave: props.onSaveExecApprovals,\n };\n}\n\nexport function renderExecApprovals(state: ExecApprovalsState) {\n const ready = state.ready;\n const targetReady = state.target !== \"node\" || Boolean(state.targetNodeId);\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between; align-items: center;\">\n <div>\n <div class=\"card-title\">Exec approvals</div>\n <div class=\"card-sub\">\n Allowlist and approval policy for <span class=\"mono\">exec host=gateway/node</span>.\n </div>\n </div>\n <button\n class=\"btn\"\n ?disabled=${state.disabled || !state.dirty || !targetReady}\n @click=${state.onSave}\n >\n ${state.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n\n ${renderExecApprovalsTarget(state)}\n\n ${\n !ready\n ? html`<div class=\"row\" style=\"margin-top: 12px; gap: 12px;\">\n <div class=\"muted\">Load exec approvals to edit allowlists.</div>\n <button class=\"btn\" ?disabled=${state.loading || !targetReady} @click=${state.onLoad}>\n ${state.loading ? \"Loading…\" : \"Load approvals\"}\n </button>\n </div>`\n : html`\n ${renderExecApprovalsTabs(state)}\n ${renderExecApprovalsPolicy(state)}\n ${\n state.selectedScope === EXEC_APPROVALS_DEFAULT_SCOPE\n ? nothing\n : renderExecApprovalsAllowlist(state)\n }\n `\n }\n </section>\n `;\n}\n\nfunction renderExecApprovalsTarget(state: ExecApprovalsState) {\n const hasNodes = state.targetNodes.length > 0;\n const nodeValue = state.targetNodeId ?? \"\";\n return html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">Target</div>\n <div class=\"list-sub\">\n Gateway edits local approvals; node edits the selected node.\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Host</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (value === \"node\") {\n const first = state.targetNodes[0]?.id ?? null;\n state.onSelectTarget(\"node\", nodeValue || first);\n } else {\n state.onSelectTarget(\"gateway\", null);\n }\n }}\n >\n <option value=\"gateway\" ?selected=${state.target === \"gateway\"}>Gateway</option>\n <option value=\"node\" ?selected=${state.target === \"node\"}>Node</option>\n </select>\n </label>\n ${\n state.target === \"node\"\n ? html`\n <label class=\"field\">\n <span>Node</span>\n <select\n ?disabled=${state.disabled || !hasNodes}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value.trim();\n state.onSelectTarget(\"node\", value ? value : null);\n }}\n >\n <option value=\"\" ?selected=${nodeValue === \"\"}>Select node</option>\n ${state.targetNodes.map(\n (node) =>\n html`<option\n value=${node.id}\n ?selected=${nodeValue === node.id}\n >\n ${node.label}\n </option>`,\n )}\n </select>\n </label>\n `\n : nothing\n }\n </div>\n </div>\n ${\n state.target === \"node\" && !hasNodes\n ? html`\n <div class=\"muted\">No nodes advertise exec approvals yet.</div>\n `\n : nothing\n }\n </div>\n `;\n}\n\nfunction renderExecApprovalsTabs(state: ExecApprovalsState) {\n return html`\n <div class=\"row\" style=\"margin-top: 12px; gap: 8px; flex-wrap: wrap;\">\n <span class=\"label\">Scope</span>\n <div class=\"row\" style=\"gap: 8px; flex-wrap: wrap;\">\n <button\n class=\"btn btn--sm ${state.selectedScope === EXEC_APPROVALS_DEFAULT_SCOPE ? \"active\" : \"\"}\"\n @click=${() => state.onSelectScope(EXEC_APPROVALS_DEFAULT_SCOPE)}\n >\n Defaults\n </button>\n ${state.agents.map((agent) => {\n const label = agent.name?.trim() ? `${agent.name} (${agent.id})` : agent.id;\n return html`\n <button\n class=\"btn btn--sm ${state.selectedScope === agent.id ? \"active\" : \"\"}\"\n @click=${() => state.onSelectScope(agent.id)}\n >\n ${label}\n </button>\n `;\n })}\n </div>\n </div>\n `;\n}\n\nfunction renderExecApprovalsPolicy(state: ExecApprovalsState) {\n const isDefaults = state.selectedScope === EXEC_APPROVALS_DEFAULT_SCOPE;\n const defaults = state.defaults;\n const agent = state.selectedAgent ?? {};\n const basePath = isDefaults ? [\"defaults\"] : [\"agents\", state.selectedScope];\n const agentSecurity = typeof agent.security === \"string\" ? agent.security : undefined;\n const agentAsk = typeof agent.ask === \"string\" ? agent.ask : undefined;\n const agentAskFallback = typeof agent.askFallback === \"string\" ? agent.askFallback : undefined;\n const securityValue = isDefaults ? defaults.security : (agentSecurity ?? \"__default__\");\n const askValue = isDefaults ? defaults.ask : (agentAsk ?? \"__default__\");\n const askFallbackValue = isDefaults ? defaults.askFallback : (agentAskFallback ?? \"__default__\");\n const autoOverride =\n typeof agent.autoAllowSkills === \"boolean\" ? agent.autoAllowSkills : undefined;\n const autoEffective = autoOverride ?? defaults.autoAllowSkills;\n const autoIsDefault = autoOverride == null;\n\n return html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">Security</div>\n <div class=\"list-sub\">\n ${isDefaults ? \"Default security mode.\" : `Default: ${defaults.security}.`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Mode</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (!isDefaults && value === \"__default__\") {\n state.onRemove([...basePath, \"security\"]);\n } else {\n state.onPatch([...basePath, \"security\"], value);\n }\n }}\n >\n ${\n !isDefaults\n ? html`<option value=\"__default__\" ?selected=${securityValue === \"__default__\"}>\n Use default (${defaults.security})\n </option>`\n : nothing\n }\n ${SECURITY_OPTIONS.map(\n (option) =>\n html`<option\n value=${option.value}\n ?selected=${securityValue === option.value}\n >\n ${option.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">Ask</div>\n <div class=\"list-sub\">\n ${isDefaults ? \"Default prompt policy.\" : `Default: ${defaults.ask}.`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Mode</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (!isDefaults && value === \"__default__\") {\n state.onRemove([...basePath, \"ask\"]);\n } else {\n state.onPatch([...basePath, \"ask\"], value);\n }\n }}\n >\n ${\n !isDefaults\n ? html`<option value=\"__default__\" ?selected=${askValue === \"__default__\"}>\n Use default (${defaults.ask})\n </option>`\n : nothing\n }\n ${ASK_OPTIONS.map(\n (option) =>\n html`<option\n value=${option.value}\n ?selected=${askValue === option.value}\n >\n ${option.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">Ask fallback</div>\n <div class=\"list-sub\">\n ${\n isDefaults\n ? \"Applied when the UI prompt is unavailable.\"\n : `Default: ${defaults.askFallback}.`\n }\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Fallback</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (!isDefaults && value === \"__default__\") {\n state.onRemove([...basePath, \"askFallback\"]);\n } else {\n state.onPatch([...basePath, \"askFallback\"], value);\n }\n }}\n >\n ${\n !isDefaults\n ? html`<option value=\"__default__\" ?selected=${askFallbackValue === \"__default__\"}>\n Use default (${defaults.askFallback})\n </option>`\n : nothing\n }\n ${SECURITY_OPTIONS.map(\n (option) =>\n html`<option\n value=${option.value}\n ?selected=${askFallbackValue === option.value}\n >\n ${option.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">Auto-allow skill CLIs</div>\n <div class=\"list-sub\">\n ${\n isDefaults\n ? \"Allow skill executables listed by the Gateway.\"\n : autoIsDefault\n ? `Using default (${defaults.autoAllowSkills ? \"on\" : \"off\"}).`\n : `Override (${autoEffective ? \"on\" : \"off\"}).`\n }\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Enabled</span>\n <input\n type=\"checkbox\"\n ?disabled=${state.disabled}\n .checked=${autoEffective}\n @change=${(event: Event) => {\n const target = event.target as HTMLInputElement;\n state.onPatch([...basePath, \"autoAllowSkills\"], target.checked);\n }}\n />\n </label>\n ${\n !isDefaults && !autoIsDefault\n ? html`<button\n class=\"btn btn--sm\"\n ?disabled=${state.disabled}\n @click=${() => state.onRemove([...basePath, \"autoAllowSkills\"])}\n >\n Use default\n </button>`\n : nothing\n }\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderExecApprovalsAllowlist(state: ExecApprovalsState) {\n const allowlistPath = [\"agents\", state.selectedScope, \"allowlist\"];\n const entries = state.allowlist;\n return html`\n <div class=\"row\" style=\"margin-top: 18px; justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Allowlist</div>\n <div class=\"card-sub\">Case-insensitive glob patterns.</div>\n </div>\n <button\n class=\"btn btn--sm\"\n ?disabled=${state.disabled}\n @click=${() => {\n const next = [...entries, { pattern: \"\" }];\n state.onPatch(allowlistPath, next);\n }}\n >\n Add pattern\n </button>\n </div>\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${\n entries.length === 0\n ? html`\n <div class=\"muted\">No allowlist entries yet.</div>\n `\n : entries.map((entry, index) => renderAllowlistEntry(state, entry, index))\n }\n </div>\n `;\n}\n\nfunction renderAllowlistEntry(\n state: ExecApprovalsState,\n entry: ExecApprovalsAllowlistEntry,\n index: number,\n) {\n const lastUsed = entry.lastUsedAt ? formatRelativeTimestamp(entry.lastUsedAt) : \"never\";\n const lastCommand = entry.lastUsedCommand ? clampText(entry.lastUsedCommand, 120) : null;\n const lastPath = entry.lastResolvedPath ? clampText(entry.lastResolvedPath, 120) : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.pattern?.trim() ? entry.pattern : \"New pattern\"}</div>\n <div class=\"list-sub\">Last used: ${lastUsed}</div>\n ${lastCommand ? html`<div class=\"list-sub mono\">${lastCommand}</div>` : nothing}\n ${lastPath ? html`<div class=\"list-sub mono\">${lastPath}</div>` : nothing}\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Pattern</span>\n <input\n type=\"text\"\n .value=${entry.pattern ?? \"\"}\n ?disabled=${state.disabled}\n @input=${(event: Event) => {\n const target = event.target as HTMLInputElement;\n state.onPatch(\n [\"agents\", state.selectedScope, \"allowlist\", index, \"pattern\"],\n target.value,\n );\n }}\n />\n </label>\n <button\n class=\"btn btn--sm danger\"\n ?disabled=${state.disabled}\n @click=${() => {\n if (state.allowlist.length <= 1) {\n state.onRemove([\"agents\", state.selectedScope, \"allowlist\"]);\n return;\n }\n state.onRemove([\"agents\", state.selectedScope, \"allowlist\", index]);\n }}\n >\n Remove\n </button>\n </div>\n </div>\n `;\n}\n\nfunction resolveExecApprovalsNodes(\n nodes: Array<Record<string, unknown>>,\n): ExecApprovalsTargetNode[] {\n return resolveNodeTargets(nodes, [\"system.execApprovals.get\", \"system.execApprovals.set\"]);\n}\n","import { html, nothing } from \"lit\";\nimport type {\n DevicePairingList,\n DeviceTokenSummary,\n PairedDevice,\n PendingDevice,\n} from \"../controllers/devices.js\";\nimport type { ExecApprovalsFile, ExecApprovalsSnapshot } from \"../controllers/exec-approvals.js\";\nimport { formatRelativeTimestamp, formatList } from \"../format.js\";\nimport { renderExecApprovals, resolveExecApprovalsState } from \"./nodes-exec-approvals.js\";\nimport { resolveConfigAgents, resolveNodeTargets, type NodeTargetOption } from \"./nodes-shared.js\";\nexport type NodesProps = {\n loading: boolean;\n nodes: Array<Record<string, unknown>>;\n devicesLoading: boolean;\n devicesError: string | null;\n devicesList: DevicePairingList | null;\n configForm: Record<string, unknown> | null;\n configLoading: boolean;\n configSaving: boolean;\n configDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n execApprovalsLoading: boolean;\n execApprovalsSaving: boolean;\n execApprovalsDirty: boolean;\n execApprovalsSnapshot: ExecApprovalsSnapshot | null;\n execApprovalsForm: ExecApprovalsFile | null;\n execApprovalsSelectedAgent: string | null;\n execApprovalsTarget: \"gateway\" | \"node\";\n execApprovalsTargetNodeId: string | null;\n onRefresh: () => void;\n onDevicesRefresh: () => void;\n onDeviceApprove: (requestId: string) => void;\n onDeviceReject: (requestId: string) => void;\n onDeviceRotate: (deviceId: string, role: string, scopes?: string[]) => void;\n onDeviceRevoke: (deviceId: string, role: string) => void;\n onLoadConfig: () => void;\n onLoadExecApprovals: () => void;\n onBindDefault: (nodeId: string | null) => void;\n onBindAgent: (agentIndex: number, nodeId: string | null) => void;\n onSaveBindings: () => void;\n onExecApprovalsTargetChange: (kind: \"gateway\" | \"node\", nodeId: string | null) => void;\n onExecApprovalsSelectAgent: (agentId: string) => void;\n onExecApprovalsPatch: (path: Array<string | number>, value: unknown) => void;\n onExecApprovalsRemove: (path: Array<string | number>) => void;\n onSaveExecApprovals: () => void;\n};\n\nexport function renderNodes(props: NodesProps) {\n const bindingState = resolveBindingsState(props);\n const approvalsState = resolveExecApprovalsState(props);\n return html`\n ${renderExecApprovals(approvalsState)}\n ${renderBindings(bindingState)}\n ${renderDevices(props)}\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Nodes</div>\n <div class=\"card-sub\">Paired devices and live links.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${\n props.nodes.length === 0\n ? html`\n <div class=\"muted\">No nodes found.</div>\n `\n : props.nodes.map((n) => renderNode(n))\n }\n </div>\n </section>\n `;\n}\n\nfunction renderDevices(props: NodesProps) {\n const list = props.devicesList ?? { pending: [], paired: [] };\n const pending = Array.isArray(list.pending) ? list.pending : [];\n const paired = Array.isArray(list.paired) ? list.paired : [];\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Devices</div>\n <div class=\"card-sub\">Pairing requests + role tokens.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.devicesLoading} @click=${props.onDevicesRefresh}>\n ${props.devicesLoading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n ${\n props.devicesError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.devicesError}</div>`\n : nothing\n }\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${\n pending.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-bottom: 8px;\">Pending</div>\n ${pending.map((req) => renderPendingDevice(req, props))}\n `\n : nothing\n }\n ${\n paired.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px; margin-bottom: 8px;\">Paired</div>\n ${paired.map((device) => renderPairedDevice(device, props))}\n `\n : nothing\n }\n ${\n pending.length === 0 && paired.length === 0\n ? html`\n <div class=\"muted\">No paired devices.</div>\n `\n : nothing\n }\n </div>\n </section>\n `;\n}\n\nfunction renderPendingDevice(req: PendingDevice, props: NodesProps) {\n const name = req.displayName?.trim() || req.deviceId;\n const age = typeof req.ts === \"number\" ? formatRelativeTimestamp(req.ts) : \"n/a\";\n const role = req.role?.trim() ? `role: ${req.role}` : \"role: -\";\n const repair = req.isRepair ? \" · repair\" : \"\";\n const ip = req.remoteIp ? ` · ${req.remoteIp}` : \"\";\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${name}</div>\n <div class=\"list-sub\">${req.deviceId}${ip}</div>\n <div class=\"muted\" style=\"margin-top: 6px;\">\n ${role} · requested ${age}${repair}\n </div>\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; gap: 8px; flex-wrap: wrap;\">\n <button class=\"btn btn--sm primary\" @click=${() => props.onDeviceApprove(req.requestId)}>\n Approve\n </button>\n <button class=\"btn btn--sm\" @click=${() => props.onDeviceReject(req.requestId)}>\n Reject\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderPairedDevice(device: PairedDevice, props: NodesProps) {\n const name = device.displayName?.trim() || device.deviceId;\n const ip = device.remoteIp ? ` · ${device.remoteIp}` : \"\";\n const roles = `roles: ${formatList(device.roles)}`;\n const scopes = `scopes: ${formatList(device.scopes)}`;\n const tokens = Array.isArray(device.tokens) ? device.tokens : [];\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${name}</div>\n <div class=\"list-sub\">${device.deviceId}${ip}</div>\n <div class=\"muted\" style=\"margin-top: 6px;\">${roles} · ${scopes}</div>\n ${\n tokens.length === 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px\">Tokens: none</div>\n `\n : html`\n <div class=\"muted\" style=\"margin-top: 10px;\">Tokens</div>\n <div style=\"display: flex; flex-direction: column; gap: 8px; margin-top: 6px;\">\n ${tokens.map((token) => renderTokenRow(device.deviceId, token, props))}\n </div>\n `\n }\n </div>\n </div>\n `;\n}\n\nfunction renderTokenRow(deviceId: string, token: DeviceTokenSummary, props: NodesProps) {\n const status = token.revokedAtMs ? \"revoked\" : \"active\";\n const scopes = `scopes: ${formatList(token.scopes)}`;\n const when = formatRelativeTimestamp(\n token.rotatedAtMs ?? token.createdAtMs ?? token.lastUsedAtMs ?? null,\n );\n return html`\n <div class=\"row\" style=\"justify-content: space-between; gap: 8px;\">\n <div class=\"list-sub\">${token.role} · ${status} · ${scopes} · ${when}</div>\n <div class=\"row\" style=\"justify-content: flex-end; gap: 6px; flex-wrap: wrap;\">\n <button\n class=\"btn btn--sm\"\n @click=${() => props.onDeviceRotate(deviceId, token.role, token.scopes)}\n >\n Rotate\n </button>\n ${\n token.revokedAtMs\n ? nothing\n : html`\n <button\n class=\"btn btn--sm danger\"\n @click=${() => props.onDeviceRevoke(deviceId, token.role)}\n >\n Revoke\n </button>\n `\n }\n </div>\n </div>\n `;\n}\n\ntype BindingAgent = {\n id: string;\n name: string | undefined;\n index: number;\n isDefault: boolean;\n binding: string | null;\n};\n\ntype BindingNode = NodeTargetOption;\n\ntype BindingState = {\n ready: boolean;\n disabled: boolean;\n configDirty: boolean;\n configLoading: boolean;\n configSaving: boolean;\n defaultBinding?: string | null;\n agents: BindingAgent[];\n nodes: BindingNode[];\n onBindDefault: (nodeId: string | null) => void;\n onBindAgent: (agentIndex: number, nodeId: string | null) => void;\n onSave: () => void;\n onLoadConfig: () => void;\n formMode: \"form\" | \"raw\";\n};\n\nfunction resolveBindingsState(props: NodesProps): BindingState {\n const config = props.configForm;\n const nodes = resolveExecNodes(props.nodes);\n const { defaultBinding, agents } = resolveAgentBindings(config);\n const ready = Boolean(config);\n const disabled = props.configSaving || props.configFormMode === \"raw\";\n return {\n ready,\n disabled,\n configDirty: props.configDirty,\n configLoading: props.configLoading,\n configSaving: props.configSaving,\n defaultBinding,\n agents,\n nodes,\n onBindDefault: props.onBindDefault,\n onBindAgent: props.onBindAgent,\n onSave: props.onSaveBindings,\n onLoadConfig: props.onLoadConfig,\n formMode: props.configFormMode,\n };\n}\n\nfunction renderBindings(state: BindingState) {\n const supportsBinding = state.nodes.length > 0;\n const defaultValue = state.defaultBinding ?? \"\";\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between; align-items: center;\">\n <div>\n <div class=\"card-title\">Exec node binding</div>\n <div class=\"card-sub\">\n Pin agents to a specific node when using <span class=\"mono\">exec host=node</span>.\n </div>\n </div>\n <button\n class=\"btn\"\n ?disabled=${state.disabled || !state.configDirty}\n @click=${state.onSave}\n >\n ${state.configSaving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n\n ${\n state.formMode === \"raw\"\n ? html`\n <div class=\"callout warn\" style=\"margin-top: 12px\">\n Switch the Config tab to <strong>Form</strong> mode to edit bindings here.\n </div>\n `\n : nothing\n }\n\n ${\n !state.ready\n ? html`<div class=\"row\" style=\"margin-top: 12px; gap: 12px;\">\n <div class=\"muted\">Load config to edit bindings.</div>\n <button class=\"btn\" ?disabled=${state.configLoading} @click=${state.onLoadConfig}>\n ${state.configLoading ? \"Loading…\" : \"Load config\"}\n </button>\n </div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">Default binding</div>\n <div class=\"list-sub\">Used when agents do not override a node binding.</div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Node</span>\n <select\n ?disabled=${state.disabled || !supportsBinding}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value.trim();\n state.onBindDefault(value ? value : null);\n }}\n >\n <option value=\"\" ?selected=${defaultValue === \"\"}>Any node</option>\n ${state.nodes.map(\n (node) =>\n html`<option\n value=${node.id}\n ?selected=${defaultValue === node.id}\n >\n ${node.label}\n </option>`,\n )}\n </select>\n </label>\n ${\n !supportsBinding\n ? html`\n <div class=\"muted\">No nodes with system.run available.</div>\n `\n : nothing\n }\n </div>\n </div>\n\n ${\n state.agents.length === 0\n ? html`\n <div class=\"muted\">No agents found.</div>\n `\n : state.agents.map((agent) => renderAgentBinding(agent, state))\n }\n </div>\n `\n }\n </section>\n `;\n}\n\nfunction renderAgentBinding(agent: BindingAgent, state: BindingState) {\n const bindingValue = agent.binding ?? \"__default__\";\n const label = agent.name?.trim() ? `${agent.name} (${agent.id})` : agent.id;\n const supportsBinding = state.nodes.length > 0;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${label}</div>\n <div class=\"list-sub\">\n ${agent.isDefault ? \"default agent\" : \"agent\"} ·\n ${\n bindingValue === \"__default__\"\n ? `uses default (${state.defaultBinding ?? \"any\"})`\n : `override: ${agent.binding}`\n }\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Binding</span>\n <select\n ?disabled=${state.disabled || !supportsBinding}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value.trim();\n state.onBindAgent(agent.index, value === \"__default__\" ? null : value);\n }}\n >\n <option value=\"__default__\" ?selected=${bindingValue === \"__default__\"}>\n Use default\n </option>\n ${state.nodes.map(\n (node) =>\n html`<option\n value=${node.id}\n ?selected=${bindingValue === node.id}\n >\n ${node.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n `;\n}\n\nfunction resolveExecNodes(nodes: Array<Record<string, unknown>>): BindingNode[] {\n return resolveNodeTargets(nodes, [\"system.run\"]);\n}\n\nfunction resolveAgentBindings(config: Record<string, unknown> | null): {\n defaultBinding?: string | null;\n agents: BindingAgent[];\n} {\n const fallbackAgent: BindingAgent = {\n id: \"main\",\n name: undefined,\n index: 0,\n isDefault: true,\n binding: null,\n };\n if (!config || typeof config !== \"object\") {\n return { defaultBinding: null, agents: [fallbackAgent] };\n }\n const tools = (config.tools ?? {}) as Record<string, unknown>;\n const exec = (tools.exec ?? {}) as Record<string, unknown>;\n const defaultBinding =\n typeof exec.node === \"string\" && exec.node.trim() ? exec.node.trim() : null;\n\n const agentsNode = (config.agents ?? {}) as Record<string, unknown>;\n if (!Array.isArray(agentsNode.list) || agentsNode.list.length === 0) {\n return { defaultBinding, agents: [fallbackAgent] };\n }\n\n const agents = resolveConfigAgents(config).map((entry) => {\n const toolsEntry = (entry.record.tools ?? {}) as Record<string, unknown>;\n const execEntry = (toolsEntry.exec ?? {}) as Record<string, unknown>;\n const binding =\n typeof execEntry.node === \"string\" && execEntry.node.trim() ? execEntry.node.trim() : null;\n return {\n id: entry.id,\n name: entry.name,\n index: entry.index,\n isDefault: entry.isDefault,\n binding,\n };\n });\n\n if (agents.length === 0) {\n agents.push(fallbackAgent);\n }\n\n return { defaultBinding, agents };\n}\n\nfunction renderNode(node: Record<string, unknown>) {\n const connected = Boolean(node.connected);\n const paired = Boolean(node.paired);\n const title =\n (typeof node.displayName === \"string\" && node.displayName.trim()) ||\n (typeof node.nodeId === \"string\" ? node.nodeId : \"unknown\");\n const caps = Array.isArray(node.caps) ? (node.caps as unknown[]) : [];\n const commands = Array.isArray(node.commands) ? (node.commands as unknown[]) : [];\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${title}</div>\n <div class=\"list-sub\">\n ${typeof node.nodeId === \"string\" ? node.nodeId : \"\"}\n ${typeof node.remoteIp === \"string\" ? ` · ${node.remoteIp}` : \"\"}\n ${typeof node.version === \"string\" ? ` · ${node.version}` : \"\"}\n </div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${paired ? \"paired\" : \"unpaired\"}</span>\n <span class=\"chip ${connected ? \"chip-ok\" : \"chip-warn\"}\">\n ${connected ? \"connected\" : \"offline\"}\n </span>\n ${caps.slice(0, 12).map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n ${commands.slice(0, 8).map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n </div>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { GatewayHelloOk } from \"../gateway\";\nimport { formatAgo } from \"../format\";\nimport { formatNextRun } from \"../presenter\";\nimport type { UiSettings } from \"../storage\";\n\nexport type OverviewProps = {\n connected: boolean;\n hello: GatewayHelloOk | null;\n settings: UiSettings;\n password: string;\n lastError: string | null;\n presenceCount: number;\n sessionsCount: number | null;\n cronEnabled: boolean | null;\n cronNext: number | null;\n lastChannelsRefresh: number | null;\n onSettingsChange: (next: UiSettings) => void;\n onPasswordChange: (next: string) => void;\n onSessionKeyChange: (next: string) => void;\n onConnect: () => void;\n onRefresh: () => void;\n};\n\ntype AlertItem = {\n severity: \"error\" | \"warning\" | \"info\";\n icon: string;\n title: string;\n description: string;\n};\n\nfunction buildAlerts(props: OverviewProps): AlertItem[] {\n const alerts: AlertItem[] = [];\n\n if (!props.connected) {\n alerts.push({\n severity: \"error\",\n icon: \"\\u26A0\\uFE0F\",\n title: \"Gateway Offline\",\n description: \"Cannot reach the gateway. Check the WebSocket URL and token.\",\n });\n }\n\n if (props.lastError) {\n const lower = props.lastError.toLowerCase();\n if (!lower.includes(\"unauthorized\") && !lower.includes(\"connect failed\")) {\n alerts.push({\n severity: \"error\",\n icon: \"\\u274C\",\n title: \"Gateway Error\",\n description: props.lastError,\n });\n }\n }\n\n if (props.cronEnabled === false) {\n alerts.push({\n severity: \"warning\",\n icon: \"\\u23F0\",\n title: \"Cron Disabled\",\n description: \"Scheduled agent runs are paused.\",\n });\n }\n\n if (props.lastChannelsRefresh && Date.now() - props.lastChannelsRefresh > 300_000) {\n alerts.push({\n severity: \"warning\",\n icon: \"\\uD83D\\uDD17\",\n title: \"Stale Channels\",\n description: `Last channel refresh was ${formatAgo(props.lastChannelsRefresh)}.`,\n });\n }\n\n return alerts;\n}\n\nfunction renderAlertBanner(alert: AlertItem) {\n const cls =\n alert.severity === \"error\"\n ? \"alert-banner--error\"\n : alert.severity === \"warning\"\n ? \"alert-banner--warn\"\n : \"alert-banner--info\";\n\n return html`\n <div class=\"alert-banner ${cls}\">\n <span class=\"alert-banner__icon\">${alert.icon}</span>\n <div class=\"alert-banner__body\">\n <div class=\"alert-banner__title\">${alert.title}</div>\n <div class=\"alert-banner__desc\">${alert.description}</div>\n </div>\n </div>\n `;\n}\n\nfunction renderHealthCard(\n label: string,\n value: string,\n hint: string,\n status: \"ok\" | \"warn\" | \"error\" = \"ok\",\n) {\n const dotCls = status === \"ok\" ? \"hc-dot--ok\" : status === \"warn\" ? \"hc-dot--warn\" : \"hc-dot--err\";\n return html`\n <div class=\"health-card\">\n <div class=\"health-card__header\">\n <span class=\"hc-dot ${dotCls}\"></span>\n <span class=\"health-card__label\">${label}</span>\n </div>\n <div class=\"health-card__value\">${value}</div>\n <div class=\"health-card__hint\">${hint}</div>\n </div>\n `;\n}\n\nexport function renderOverview(props: OverviewProps) {\n const snapshot = props.hello?.snapshot as\n | { uptimeMs?: number; policy?: { tickIntervalMs?: number } }\n | undefined;\n const uptimeMs = snapshot?.uptimeMs ?? 0;\n const uptime = uptimeMs ? formatAgo(Date.now() - uptimeMs) : \"n/a\";\n const tick = snapshot?.policy?.tickIntervalMs\n ? `${(snapshot.policy.tickIntervalMs / 1000).toFixed(snapshot.policy.tickIntervalMs % 1000 === 0 ? 0 : 1)}s`\n : \"n/a\";\n\n const alerts = buildAlerts(props);\n\n const gatewayStatus: \"ok\" | \"warn\" | \"error\" = props.connected\n ? \"ok\"\n : props.lastError\n ? \"error\"\n : \"warn\";\n const cronStatus: \"ok\" | \"warn\" | \"error\" =\n props.cronEnabled == null ? \"warn\" : props.cronEnabled ? \"ok\" : \"warn\";\n const channelsStatus: \"ok\" | \"warn\" | \"error\" =\n props.lastChannelsRefresh == null\n ? \"warn\"\n : Date.now() - props.lastChannelsRefresh > 300_000\n ? \"warn\"\n : \"ok\";\n\n const authHint = (() => {\n if (props.connected || !props.lastError) return null;\n const lower = props.lastError.toLowerCase();\n if (!lower.includes(\"unauthorized\") && !lower.includes(\"connect failed\")) return null;\n const hasToken = Boolean(props.settings.token.trim());\n const hasPassword = Boolean(props.password.trim());\n if (!hasToken && !hasPassword) {\n return html`\n <div class=\"muted\" style=\"margin-top: 8px;\">\n This gateway requires auth. Add a token or password, then click Connect.\n </div>\n `;\n }\n return html`\n <div class=\"muted\" style=\"margin-top: 8px;\">\n Auth failed. Update the token, then click Connect.\n </div>\n `;\n })();\n\n return html`\n ${alerts.length > 0\n ? html`<section class=\"alert-stack\">\n ${alerts.map(renderAlertBanner)}\n </section>`\n : nothing}\n\n <section class=\"health-grid\">\n ${renderHealthCard(\n \"Gateway\",\n props.connected ? \"Online\" : \"Offline\",\n props.connected ? `Uptime ${uptime}` : \"Not connected\",\n gatewayStatus,\n )}\n ${renderHealthCard(\n \"Instances\",\n String(props.presenceCount),\n \"Presence beacons active\",\n props.presenceCount > 0 ? \"ok\" : \"warn\",\n )}\n ${renderHealthCard(\n \"Sessions\",\n String(props.sessionsCount ?? \"n/a\"),\n \"Tracked by gateway\",\n \"ok\",\n )}\n ${renderHealthCard(\n \"Cron\",\n props.cronEnabled == null\n ? \"n/a\"\n : props.cronEnabled\n ? `${formatNextRun(props.cronNext)}`\n : \"Disabled\",\n props.cronEnabled ? \"Next scheduled run\" : \"Agent scheduling paused\",\n cronStatus,\n )}\n ${renderHealthCard(\n \"Channels\",\n props.lastChannelsRefresh ? formatAgo(props.lastChannelsRefresh) : \"n/a\",\n \"Last refresh\",\n channelsStatus,\n )}\n ${renderHealthCard(\n \"Tick\",\n tick,\n \"Gateway heartbeat interval\",\n \"ok\",\n )}\n </section>\n\n <section class=\"grid grid-cols-2\" style=\"margin-top: 18px;\">\n <div class=\"card glass-card\">\n <div class=\"card-title\">Gateway Access</div>\n <div class=\"card-sub\">Connection settings for the dashboard.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>WebSocket URL</span>\n <input\n .value=${props.settings.gatewayUrl}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, gatewayUrl: v });\n }}\n placeholder=\"ws://100.x.y.z:18789\"\n />\n </label>\n <label class=\"field\">\n <span>Gateway Token</span>\n <input\n .value=${props.settings.token}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, token: v });\n }}\n placeholder=\"POOLBOT_GATEWAY_TOKEN\"\n />\n </label>\n <label class=\"field\">\n <span>Password</span>\n <input\n type=\"password\"\n .value=${props.password}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onPasswordChange(v);\n }}\n placeholder=\"system or shared password\"\n />\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn\" @click=${() => props.onConnect()}>Connect</button>\n <button class=\"btn\" @click=${() => props.onRefresh()}>Refresh</button>\n </div>\n ${props.lastError ? html`<div class=\"callout danger\" style=\"margin-top: 14px;\">${props.lastError}${authHint ?? \"\"}</div>` : nothing}\n </div>\n\n <div class=\"card glass-card\">\n <div class=\"card-title\">Quick Actions</div>\n <div class=\"card-sub\">Common operations.</div>\n <div class=\"qa-grid\" style=\"margin-top: 16px;\">\n <div class=\"qa-item\">\n <div class=\"qa-item__label\">Reset Session</div>\n <div class=\"muted\">Use <span class=\"mono\">/new</span> or <span class=\"mono\">/reset</span> in chat.</div>\n </div>\n <div class=\"qa-item\">\n <div class=\"qa-item__label\">Tailscale Serve</div>\n <div class=\"muted\">Prefer serve mode to keep gateway on loopback with tailnet auth.</div>\n </div>\n <div class=\"qa-item\">\n <div class=\"qa-item__label\">Cron Sessions</div>\n <div class=\"muted\">Use isolated sessions for recurring agent runs.</div>\n </div>\n <div class=\"qa-item\">\n <div class=\"qa-item__label\">Doctor</div>\n <div class=\"muted\">Run <span class=\"mono\">poolbot doctor</span> for health checks and migrations.</div>\n </div>\n </div>\n </div>\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport { formatSessionTokens } from \"../presenter\";\nimport { pathForTab } from \"../navigation\";\nimport type { GatewaySessionRow, SessionsListResult } from \"../types\";\n\nexport type SessionsProps = {\n loading: boolean;\n result: SessionsListResult | null;\n error: string | null;\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n basePath: string;\n onFiltersChange: (next: {\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n }) => void;\n onRefresh: () => void;\n onPatch: (\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n },\n ) => void;\n onDelete: (key: string) => void;\n};\n\nconst THINK_LEVELS = [\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\"] as const;\nconst BINARY_THINK_LEVELS = [\"\", \"off\", \"on\"] as const;\nconst VERBOSE_LEVELS = [\n { value: \"\", label: \"inherit\" },\n { value: \"off\", label: \"off (explicit)\" },\n { value: \"on\", label: \"on\" },\n] as const;\nconst REASONING_LEVELS = [\"\", \"off\", \"on\", \"stream\"] as const;\n\nfunction normalizeProviderId(provider?: string | null): string {\n if (!provider) return \"\";\n const normalized = provider.trim().toLowerCase();\n if (normalized === \"z.ai\" || normalized === \"z-ai\") return \"zai\";\n return normalized;\n}\n\nfunction isBinaryThinkingProvider(provider?: string | null): boolean {\n return normalizeProviderId(provider) === \"zai\";\n}\n\nfunction resolveThinkLevelOptions(provider?: string | null): readonly string[] {\n return isBinaryThinkingProvider(provider) ? BINARY_THINK_LEVELS : THINK_LEVELS;\n}\n\nfunction resolveThinkLevelDisplay(value: string, isBinary: boolean): string {\n if (!isBinary) return value;\n if (!value || value === \"off\") return value;\n return \"on\";\n}\n\nfunction resolveThinkLevelPatchValue(value: string, isBinary: boolean): string | null {\n if (!value) return null;\n if (!isBinary) return value;\n if (value === \"on\") return \"low\";\n return value;\n}\n\nexport function renderSessions(props: SessionsProps) {\n const rows = props.result?.sessions ?? [];\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Sessions</div>\n <div class=\"card-sub\">Active session keys and per-session overrides.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\">\n <span>Active within (minutes)</span>\n <input\n .value=${props.activeMinutes}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: (e.target as HTMLInputElement).value,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Limit</span>\n <input\n .value=${props.limit}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: (e.target as HTMLInputElement).value,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Include global</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeGlobal}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: (e.target as HTMLInputElement).checked,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Include unknown</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeUnknown}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"muted\" style=\"margin-top: 12px;\">\n ${props.result ? `Store: ${props.result.path}` : \"\"}\n </div>\n\n <div class=\"table\" style=\"margin-top: 16px;\">\n <div class=\"table-head\">\n <div>Key</div>\n <div>Label</div>\n <div>Kind</div>\n <div>Updated</div>\n <div>Tokens</div>\n <div>Thinking</div>\n <div>Verbose</div>\n <div>Reasoning</div>\n <div>Actions</div>\n </div>\n ${rows.length === 0\n ? html`<div class=\"muted\">No sessions found.</div>`\n : rows.map((row) =>\n renderRow(row, props.basePath, props.onPatch, props.onDelete, props.loading),\n )}\n </div>\n </section>\n `;\n}\n\nfunction renderRow(\n row: GatewaySessionRow,\n basePath: string,\n onPatch: SessionsProps[\"onPatch\"],\n onDelete: SessionsProps[\"onDelete\"],\n disabled: boolean,\n) {\n const updated = row.updatedAt ? formatAgo(row.updatedAt) : \"n/a\";\n const rawThinking = row.thinkingLevel ?? \"\";\n const isBinaryThinking = isBinaryThinkingProvider(row.modelProvider);\n const thinking = resolveThinkLevelDisplay(rawThinking, isBinaryThinking);\n const thinkLevels = resolveThinkLevelOptions(row.modelProvider);\n const verbose = row.verboseLevel ?? \"\";\n const reasoning = row.reasoningLevel ?? \"\";\n const displayName = row.displayName ?? row.key;\n const canLink = row.kind !== \"global\";\n const chatUrl = canLink\n ? `${pathForTab(\"chat\", basePath)}?session=${encodeURIComponent(row.key)}`\n : null;\n\n return html`\n <div class=\"table-row\">\n <div class=\"mono\">${canLink\n ? html`<a href=${chatUrl} class=\"session-link\">${displayName}</a>`\n : displayName}</div>\n <div>\n <input\n .value=${row.label ?? \"\"}\n ?disabled=${disabled}\n placeholder=\"(optional)\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value.trim();\n onPatch(row.key, { label: value || null });\n }}\n />\n </div>\n <div>${row.kind}</div>\n <div>${updated}</div>\n <div>${formatSessionTokens(row)}</div>\n <div>\n <select\n .value=${thinking}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, {\n thinkingLevel: resolveThinkLevelPatchValue(value, isBinaryThinking),\n });\n }}\n >\n ${thinkLevels.map((level) =>\n html`<option value=${level}>${level || \"inherit\"}</option>`,\n )}\n </select>\n </div>\n <div>\n <select\n .value=${verbose}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { verboseLevel: value || null });\n }}\n >\n ${VERBOSE_LEVELS.map(\n (level) => html`<option value=${level.value}>${level.label}</option>`,\n )}\n </select>\n </div>\n <div>\n <select\n .value=${reasoning}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { reasoningLevel: value || null });\n }}\n >\n ${REASONING_LEVELS.map((level) =>\n html`<option value=${level}>${level || \"inherit\"}</option>`,\n )}\n </select>\n </div>\n <div>\n <button class=\"btn danger\" ?disabled=${disabled} @click=${() => onDelete(row.key)}>\n Delete\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { AppViewState } from \"../app-view-state\";\n\nfunction formatRemaining(ms: number): string {\n const remaining = Math.max(0, ms);\n const totalSeconds = Math.floor(remaining / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h`;\n}\n\nfunction renderMetaRow(label: string, value?: string | null) {\n if (!value) return nothing;\n return html`<div class=\"exec-approval-meta-row\"><span>${label}</span><span>${value}</span></div>`;\n}\n\nexport function renderExecApprovalPrompt(state: AppViewState) {\n const active = state.execApprovalQueue[0];\n if (!active) return nothing;\n const request = active.request;\n const remainingMs = active.expiresAtMs - Date.now();\n const remaining = remainingMs > 0 ? `expires in ${formatRemaining(remainingMs)}` : \"expired\";\n const queueCount = state.execApprovalQueue.length;\n return html`\n <div class=\"exec-approval-overlay\" role=\"dialog\" aria-live=\"polite\">\n <div class=\"exec-approval-card\">\n <div class=\"exec-approval-header\">\n <div>\n <div class=\"exec-approval-title\">Exec approval needed</div>\n <div class=\"exec-approval-sub\">${remaining}</div>\n </div>\n ${queueCount > 1\n ? html`<div class=\"exec-approval-queue\">${queueCount} pending</div>`\n : nothing}\n </div>\n <div class=\"exec-approval-command mono\">${request.command}</div>\n <div class=\"exec-approval-meta\">\n ${renderMetaRow(\"Host\", request.host)}\n ${renderMetaRow(\"Agent\", request.agentId)}\n ${renderMetaRow(\"Session\", request.sessionKey)}\n ${renderMetaRow(\"CWD\", request.cwd)}\n ${renderMetaRow(\"Resolved\", request.resolvedPath)}\n ${renderMetaRow(\"Security\", request.security)}\n ${renderMetaRow(\"Ask\", request.ask)}\n </div>\n ${state.execApprovalError\n ? html`<div class=\"exec-approval-error\">${state.execApprovalError}</div>`\n : nothing}\n <div class=\"exec-approval-actions\">\n <button\n class=\"btn primary\"\n ?disabled=${state.execApprovalBusy}\n @click=${() => state.handleExecApprovalDecision(\"allow-once\")}\n >\n Allow once\n </button>\n <button\n class=\"btn\"\n ?disabled=${state.execApprovalBusy}\n @click=${() => state.handleExecApprovalDecision(\"allow-always\")}\n >\n Always allow\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${state.execApprovalBusy}\n @click=${() => state.handleExecApprovalDecision(\"deny\")}\n >\n Deny\n </button>\n </div>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { clampText } from \"../format\";\nimport type { SkillStatusEntry, SkillStatusReport } from \"../types\";\nimport type { SkillMessageMap } from \"../controllers/skills\";\n\nexport type SkillsProps = {\n loading: boolean;\n report: SkillStatusReport | null;\n error: string | null;\n filter: string;\n edits: Record<string, string>;\n busyKey: string | null;\n messages: SkillMessageMap;\n onFilterChange: (next: string) => void;\n onRefresh: () => void;\n onToggle: (skillKey: string, enabled: boolean) => void;\n onEdit: (skillKey: string, value: string) => void;\n onSaveKey: (skillKey: string) => void;\n onInstall: (skillKey: string, name: string, installId: string) => void;\n};\n\nexport function renderSkills(props: SkillsProps) {\n const skills = props.report?.skills ?? [];\n const filter = props.filter.trim().toLowerCase();\n const filtered = filter\n ? skills.filter((skill) =>\n [skill.name, skill.description, skill.source]\n .join(\" \")\n .toLowerCase()\n .includes(filter),\n )\n : skills;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Skills</div>\n <div class=\"card-sub\">Bundled, managed, and workspace skills.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"flex: 1;\">\n <span>Filter</span>\n <input\n .value=${props.filter}\n @input=${(e: Event) =>\n props.onFilterChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search skills\"\n />\n </label>\n <div class=\"muted\">${filtered.length} shown</div>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 16px;\">No skills found.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${filtered.map((skill) => renderSkill(skill, props))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderSkill(skill: SkillStatusEntry, props: SkillsProps) {\n const busy = props.busyKey === skill.skillKey;\n const apiKey = props.edits[skill.skillKey] ?? \"\";\n const message = props.messages[skill.skillKey] ?? null;\n const canInstall =\n skill.install.length > 0 && skill.missing.bins.length > 0;\n const missing = [\n ...skill.missing.bins.map((b) => `bin:${b}`),\n ...skill.missing.env.map((e) => `env:${e}`),\n ...skill.missing.config.map((c) => `config:${c}`),\n ...skill.missing.os.map((o) => `os:${o}`),\n ];\n const reasons: string[] = [];\n if (skill.disabled) reasons.push(\"disabled\");\n if (skill.blockedByAllowlist) reasons.push(\"blocked by allowlist\");\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n ${skill.emoji ? `${skill.emoji} ` : \"\"}${skill.name}\n </div>\n <div class=\"list-sub\">${clampText(skill.description, 140)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${skill.source}</span>\n <span class=\"chip ${skill.eligible ? \"chip-ok\" : \"chip-warn\"}\">\n ${skill.eligible ? \"eligible\" : \"blocked\"}\n </span>\n ${skill.disabled ? html`<span class=\"chip chip-warn\">disabled</span>` : nothing}\n </div>\n ${missing.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Missing: ${missing.join(\", \")}\n </div>\n `\n : nothing}\n ${reasons.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Reason: ${reasons.join(\", \")}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; flex-wrap: wrap;\">\n <button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onToggle(skill.skillKey, skill.disabled)}\n >\n ${skill.disabled ? \"Enable\" : \"Disable\"}\n </button>\n ${canInstall\n ? html`<button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() =>\n props.onInstall(skill.skillKey, skill.name, skill.install[0].id)}\n >\n ${busy ? \"Installing…\" : skill.install[0].label}\n </button>`\n : nothing}\n </div>\n ${message\n ? html`<div\n class=\"muted\"\n style=\"margin-top: 8px; color: ${\n message.kind === \"error\"\n ? \"var(--danger-color, #d14343)\"\n : \"var(--success-color, #0a7f5a)\"\n };\"\n >\n ${message.message}\n </div>`\n : nothing}\n ${skill.primaryEnv\n ? html`\n <div class=\"field\" style=\"margin-top: 10px;\">\n <span>API key</span>\n <input\n type=\"password\"\n .value=${apiKey}\n @input=${(e: Event) =>\n props.onEdit(skill.skillKey, (e.target as HTMLInputElement).value)}\n />\n </div>\n <button\n class=\"btn primary\"\n style=\"margin-top: 8px;\"\n ?disabled=${busy}\n @click=${() => props.onSaveKey(skill.skillKey)}\n >\n Save key\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","import { html } from \"lit\";\nimport { repeat } from \"lit/directives/repeat.js\";\n\nimport type { AppViewState } from \"./app-view-state\";\nimport { iconForTab, pathForTab, titleForTab, type Tab } from \"./navigation\";\nimport { icons } from \"./icons\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport { syncUrlWithSessionKey } from \"./app-settings\";\nimport type { SessionsListResult } from \"./types\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\n\nexport function renderTab(state: AppViewState, tab: Tab) {\n const href = pathForTab(tab, state.basePath);\n return html`\n <a\n href=${href}\n class=\"nav-item ${state.tab === tab ? \"active\" : \"\"}\"\n @click=${(event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n event.preventDefault();\n state.setTab(tab);\n }}\n title=${titleForTab(tab)}\n >\n <span class=\"nav-item__icon\" aria-hidden=\"true\">${icons[iconForTab(tab)]}</span>\n <span class=\"nav-item__text\">${titleForTab(tab)}</span>\n </a>\n `;\n}\n\nexport function renderChatControls(state: AppViewState) {\n const sessionOptions = resolveSessionOptions(state.sessionKey, state.sessionsResult);\n const disableThinkingToggle = state.onboarding;\n const disableFocusToggle = state.onboarding;\n const showThinking = state.onboarding ? false : state.settings.chatShowThinking;\n const focusActive = state.onboarding ? true : state.settings.chatFocusMode;\n // Refresh icon\n const refreshIcon = html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"></path><path d=\"M21 3v5h-5\"></path></svg>`;\n const focusIcon = html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7V4h3\"></path><path d=\"M20 7V4h-3\"></path><path d=\"M4 17v3h3\"></path><path d=\"M20 17v3h-3\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>`;\n return html`\n <div class=\"chat-controls\">\n <label class=\"field chat-controls__session\">\n <select\n .value=${state.sessionKey}\n ?disabled=${!state.connected}\n @change=${(e: Event) => {\n const next = (e.target as HTMLSelectElement).value;\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.chatRunId = null;\n state.resetToolStream();\n state.resetChatScroll();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n syncUrlWithSessionKey(state, next, true);\n void loadChatHistory(state);\n }}\n >\n ${repeat(\n sessionOptions,\n (entry) => entry.key,\n (entry) =>\n html`<option value=${entry.key}>\n ${entry.displayName ?? entry.key}\n </option>`,\n )}\n </select>\n </label>\n <button\n class=\"btn btn--sm btn--icon\"\n ?disabled=${state.chatLoading || !state.connected}\n @click=${() => {\n state.resetToolStream();\n void loadChatHistory(state);\n }}\n title=\"Refresh chat history\"\n >\n ${refreshIcon}\n </button>\n <span class=\"chat-controls__separator\">|</span>\n <button\n class=\"btn btn--sm btn--icon ${showThinking ? \"active\" : \"\"}\"\n ?disabled=${disableThinkingToggle}\n @click=${() => {\n if (disableThinkingToggle) return;\n state.applySettings({\n ...state.settings,\n chatShowThinking: !state.settings.chatShowThinking,\n });\n }}\n aria-pressed=${showThinking}\n title=${disableThinkingToggle\n ? \"Disabled during onboarding\"\n : \"Toggle assistant thinking/working output\"}\n >\n ${icons.brain}\n </button>\n <button\n class=\"btn btn--sm btn--icon ${focusActive ? \"active\" : \"\"}\"\n ?disabled=${disableFocusToggle}\n @click=${() => {\n if (disableFocusToggle) return;\n state.applySettings({\n ...state.settings,\n chatFocusMode: !state.settings.chatFocusMode,\n });\n }}\n aria-pressed=${focusActive}\n title=${disableFocusToggle\n ? \"Disabled during onboarding\"\n : \"Toggle focus mode (hide sidebar + page header)\"}\n >\n ${focusIcon}\n </button>\n </div>\n `;\n}\n\nfunction resolveSessionOptions(sessionKey: string, sessions: SessionsListResult | null) {\n const seen = new Set<string>();\n const options: Array<{ key: string; displayName?: string }> = [];\n\n const resolvedCurrent = sessions?.sessions?.find((s) => s.key === sessionKey);\n\n // Add current session key first\n seen.add(sessionKey);\n options.push({ key: sessionKey, displayName: resolvedCurrent?.displayName });\n\n // Add sessions from the result\n if (sessions?.sessions) {\n for (const s of sessions.sessions) {\n if (!seen.has(s.key)) {\n seen.add(s.key);\n options.push({ key: s.key, displayName: s.displayName });\n }\n }\n }\n\n return options;\n}\n\nconst THEME_ORDER: ThemeMode[] = [\"system\", \"light\", \"dark\"];\n\nexport function renderThemeToggle(state: AppViewState) {\n const index = Math.max(0, THEME_ORDER.indexOf(state.theme));\n const applyTheme = (next: ThemeMode) => (event: MouseEvent) => {\n const element = event.currentTarget as HTMLElement;\n const context: ThemeTransitionContext = { element };\n if (event.clientX || event.clientY) {\n context.pointerClientX = event.clientX;\n context.pointerClientY = event.clientY;\n }\n state.setTheme(next, context);\n };\n\n return html`\n <div class=\"theme-toggle\" style=\"--theme-index: ${index};\">\n <div class=\"theme-toggle__track\" role=\"group\" aria-label=\"Theme\">\n <span class=\"theme-toggle__indicator\"></span>\n <button\n class=\"theme-toggle__button ${state.theme === \"system\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"system\")}\n aria-pressed=${state.theme === \"system\"}\n aria-label=\"System theme\"\n title=\"System\"\n >\n ${renderMonitorIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"light\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"light\")}\n aria-pressed=${state.theme === \"light\"}\n aria-label=\"Light theme\"\n title=\"Light\"\n >\n ${renderSunIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"dark\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"dark\")}\n aria-pressed=${state.theme === \"dark\"}\n aria-label=\"Dark theme\"\n title=\"Dark\"\n >\n ${renderMoonIcon()}\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderSunIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\n <path d=\"M12 2v2\"></path>\n <path d=\"M12 20v2\"></path>\n <path d=\"m4.93 4.93 1.41 1.41\"></path>\n <path d=\"m17.66 17.66 1.41 1.41\"></path>\n <path d=\"M2 12h2\"></path>\n <path d=\"M20 12h2\"></path>\n <path d=\"m6.34 17.66-1.41 1.41\"></path>\n <path d=\"m19.07 4.93-1.41 1.41\"></path>\n </svg>\n `;\n}\n\nfunction renderMoonIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\n ></path>\n </svg>\n `;\n}\n\nfunction renderMonitorIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"></rect>\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"></line>\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"></line>\n </svg>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport type { AppViewState } from \"./app-view-state\";\nimport { parseAgentSessionKey } from \"../../../src/routing/session-key.js\";\nimport {\n TAB_GROUPS,\n iconForTab,\n pathForTab,\n subtitleForTab,\n titleForTab,\n type Tab,\n} from \"./navigation\";\nimport { icons } from \"./icons\";\nimport type { UiSettings } from \"./storage\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n LogEntry,\n LogLevel,\n PresenceEntry,\n ChannelsStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport type { ChatQueueItem, CronFormState } from \"./ui-types\";\nimport { refreshChatAvatar } from \"./app-chat\";\nimport { renderChat } from \"./views/chat\";\nimport { renderConfig } from \"./views/config\";\nimport { renderChannels } from \"./views/channels\";\nimport { renderCron } from \"./views/cron\";\nimport { renderDebug } from \"./views/debug\";\nimport { renderInstances } from \"./views/instances\";\nimport { renderLogs } from \"./views/logs\";\nimport { renderNodes } from \"./views/nodes\";\nimport { renderOverview } from \"./views/overview\";\nimport { renderSessions } from \"./views/sessions\";\nimport { renderExecApprovalPrompt } from \"./views/exec-approval\";\nimport {\n approveDevicePairing,\n loadDevices,\n rejectDevicePairing,\n revokeDeviceToken,\n rotateDeviceToken,\n} from \"./controllers/devices\";\nimport { renderSkills } from \"./views/skills\";\nimport { renderChatControls, renderTab, renderThemeToggle } from \"./app-render.helpers\";\nimport { loadChannels } from \"./controllers/channels\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { deleteSession, loadSessions, patchSession } from \"./controllers/sessions\";\nimport {\n installSkill,\n loadSkills,\n saveSkillApiKey,\n updateSkillEdit,\n updateSkillEnabled,\n type SkillMessage,\n} from \"./controllers/skills\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport {\n applyConfig,\n loadConfig,\n runUpdate,\n saveConfig,\n updateConfigFormValue,\n removeConfigFormValue,\n} from \"./controllers/config\";\nimport {\n loadExecApprovals,\n removeExecApprovalsFormValue,\n saveExecApprovals,\n updateExecApprovalsFormValue,\n} from \"./controllers/exec-approvals\";\nimport { loadCronRuns, toggleCronJob, runCronJob, removeCronJob, addCronJob } from \"./controllers/cron\";\nimport { loadDebug, callDebugMethod } from \"./controllers/debug\";\nimport { loadLogs } from \"./controllers/logs\";\n\nconst AVATAR_DATA_RE = /^data:/i;\nconst AVATAR_HTTP_RE = /^https?:\\/\\//i;\n\nfunction resolveAssistantAvatarUrl(state: AppViewState): string | undefined {\n const list = state.agentsList?.agents ?? [];\n const parsed = parseAgentSessionKey(state.sessionKey);\n const agentId =\n parsed?.agentId ??\n state.agentsList?.defaultId ??\n \"main\";\n const agent = list.find((entry) => entry.id === agentId);\n const identity = agent?.identity;\n const candidate = identity?.avatarUrl ?? identity?.avatar;\n if (!candidate) return undefined;\n if (AVATAR_DATA_RE.test(candidate) || AVATAR_HTTP_RE.test(candidate)) return candidate;\n return identity?.avatarUrl;\n}\n\nexport function renderApp(state: AppViewState) {\n const presenceCount = state.presenceEntries.length;\n const sessionsCount = state.sessionsResult?.count ?? null;\n const cronNext = state.cronStatus?.nextWakeAtMs ?? null;\n const chatDisabledReason = state.connected ? null : \"Disconnected from gateway.\";\n const isChat = state.tab === \"chat\";\n const chatFocus = isChat && (state.settings.chatFocusMode || state.onboarding);\n const showThinking = state.onboarding ? false : state.settings.chatShowThinking;\n const assistantAvatarUrl = resolveAssistantAvatarUrl(state);\n const chatAvatarUrl = state.chatAvatarUrl ?? assistantAvatarUrl ?? null;\n\n return html`\n <div class=\"shell ${isChat ? \"shell--chat\" : \"\"} ${chatFocus ? \"shell--chat-focus\" : \"\"} ${state.settings.navCollapsed ? \"shell--nav-collapsed\" : \"\"} ${state.onboarding ? \"shell--onboarding\" : \"\"}\">\n <header class=\"topbar\">\n <div class=\"topbar-left\">\n <button\n class=\"nav-collapse-toggle\"\n @click=${() =>\n state.applySettings({\n ...state.settings,\n navCollapsed: !state.settings.navCollapsed,\n })}\n title=\"${state.settings.navCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\"\n aria-label=\"${state.settings.navCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\"\n >\n <span class=\"nav-collapse-toggle__icon\">${icons.menu}</span>\n </button>\n <div class=\"brand\">\n <div class=\"brand-logo\">\n <img src=\"/pixel-lobster.svg\" alt=\"Poolbot\" />\n </div>\n <div class=\"brand-text\">\n <div class=\"brand-title\">POOLBOT</div>\n <div class=\"brand-sub\">Gateway Dashboard</div>\n </div>\n </div>\n </div>\n <div class=\"topbar-status\">\n <div class=\"pill\">\n <span class=\"statusDot ${state.connected ? \"ok\" : \"\"}\"></span>\n <span>Health</span>\n <span class=\"mono\">${state.connected ? \"OK\" : \"Offline\"}</span>\n </div>\n ${renderThemeToggle(state)}\n </div>\n </header>\n <aside class=\"nav ${state.settings.navCollapsed ? \"nav--collapsed\" : \"\"}\">\n ${TAB_GROUPS.map((group) => {\n const isGroupCollapsed = state.settings.navGroupsCollapsed[group.label] ?? false;\n const hasActiveTab = group.tabs.some((tab) => tab === state.tab);\n return html`\n <div class=\"nav-group ${isGroupCollapsed && !hasActiveTab ? \"nav-group--collapsed\" : \"\"}\">\n <button\n class=\"nav-label\"\n @click=${() => {\n const next = { ...state.settings.navGroupsCollapsed };\n next[group.label] = !isGroupCollapsed;\n state.applySettings({\n ...state.settings,\n navGroupsCollapsed: next,\n });\n }}\n aria-expanded=${!isGroupCollapsed}\n >\n <span class=\"nav-label__text\">${group.label}</span>\n <span class=\"nav-label__chevron\">${isGroupCollapsed ? \"+\" : \"−\"}</span>\n </button>\n <div class=\"nav-group__items\">\n ${group.tabs.map((tab) => renderTab(state, tab))}\n </div>\n </div>\n `;\n })}\n <div class=\"nav-group nav-group--links\">\n <div class=\"nav-label nav-label--static\">\n <span class=\"nav-label__text\">Resources</span>\n </div>\n <div class=\"nav-group__items\">\n <a\n class=\"nav-item nav-item--external\"\n href=\"https://docs.molt.bot\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Docs (opens in new tab)\"\n >\n <span class=\"nav-item__icon\" aria-hidden=\"true\">${icons.book}</span>\n <span class=\"nav-item__text\">Docs</span>\n </a>\n </div>\n </div>\n </aside>\n <main class=\"content ${isChat ? \"content--chat\" : \"\"}\">\n <section class=\"content-header\">\n <div>\n <div class=\"page-title\">${titleForTab(state.tab)}</div>\n <div class=\"page-sub\">${subtitleForTab(state.tab)}</div>\n </div>\n <div class=\"page-meta\">\n ${state.lastError\n ? html`<div class=\"pill danger\">${state.lastError}</div>`\n : nothing}\n ${isChat ? renderChatControls(state) : nothing}\n </div>\n </section>\n\n ${state.tab === \"overview\"\n ? renderOverview({\n connected: state.connected,\n hello: state.hello,\n settings: state.settings,\n password: state.password,\n lastError: state.lastError,\n presenceCount,\n sessionsCount,\n cronEnabled: state.cronStatus?.enabled ?? null,\n cronNext,\n lastChannelsRefresh: state.channelsLastSuccess,\n onSettingsChange: (next) => state.applySettings(next),\n onPasswordChange: (next) => (state.password = next),\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.resetToolStream();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n },\n onConnect: () => state.connect(),\n onRefresh: () => state.loadOverview(),\n })\n : nothing}\n\n ${state.tab === \"channels\"\n ? renderChannels({\n connected: state.connected,\n loading: state.channelsLoading,\n snapshot: state.channelsSnapshot,\n lastError: state.channelsError,\n lastSuccessAt: state.channelsLastSuccess,\n whatsappMessage: state.whatsappLoginMessage,\n whatsappQrDataUrl: state.whatsappLoginQrDataUrl,\n whatsappConnected: state.whatsappLoginConnected,\n whatsappBusy: state.whatsappBusy,\n configSchema: state.configSchema,\n configSchemaLoading: state.configSchemaLoading,\n configForm: state.configForm,\n configUiHints: state.configUiHints,\n configSaving: state.configSaving,\n configFormDirty: state.configFormDirty,\n nostrProfileFormState: state.nostrProfileFormState,\n nostrProfileAccountId: state.nostrProfileAccountId,\n onRefresh: (probe) => loadChannels(state, probe),\n onWhatsAppStart: (force) => state.handleWhatsAppStart(force),\n onWhatsAppWait: () => state.handleWhatsAppWait(),\n onWhatsAppLogout: () => state.handleWhatsAppLogout(),\n onConfigPatch: (path, value) => updateConfigFormValue(state, path, value),\n onConfigSave: () => state.handleChannelConfigSave(),\n onConfigReload: () => state.handleChannelConfigReload(),\n onNostrProfileEdit: (accountId, profile) =>\n state.handleNostrProfileEdit(accountId, profile),\n onNostrProfileCancel: () => state.handleNostrProfileCancel(),\n onNostrProfileFieldChange: (field, value) =>\n state.handleNostrProfileFieldChange(field, value),\n onNostrProfileSave: () => state.handleNostrProfileSave(),\n onNostrProfileImport: () => state.handleNostrProfileImport(),\n onNostrProfileToggleAdvanced: () => state.handleNostrProfileToggleAdvanced(),\n })\n : nothing}\n\n ${state.tab === \"instances\"\n ? renderInstances({\n loading: state.presenceLoading,\n entries: state.presenceEntries,\n lastError: state.presenceError,\n statusMessage: state.presenceStatus,\n onRefresh: () => loadPresence(state),\n })\n : nothing}\n\n ${state.tab === \"sessions\"\n ? renderSessions({\n loading: state.sessionsLoading,\n result: state.sessionsResult,\n error: state.sessionsError,\n activeMinutes: state.sessionsFilterActive,\n limit: state.sessionsFilterLimit,\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n basePath: state.basePath,\n onFiltersChange: (next) => {\n state.sessionsFilterActive = next.activeMinutes;\n state.sessionsFilterLimit = next.limit;\n state.sessionsIncludeGlobal = next.includeGlobal;\n state.sessionsIncludeUnknown = next.includeUnknown;\n\t },\n\t onRefresh: () => loadSessions(state),\n\t onPatch: (key, patch) => patchSession(state, key, patch),\n\t onDelete: (key) => deleteSession(state, key),\n\t })\n\t : nothing}\n\n ${state.tab === \"cron\"\n ? renderCron({\n loading: state.cronLoading,\n status: state.cronStatus,\n jobs: state.cronJobs,\n error: state.cronError,\n busy: state.cronBusy,\n form: state.cronForm,\n channels: state.channelsSnapshot?.channelMeta?.length\n ? state.channelsSnapshot.channelMeta.map((entry) => entry.id)\n : state.channelsSnapshot?.channelOrder ?? [],\n channelLabels: state.channelsSnapshot?.channelLabels ?? {},\n channelMeta: state.channelsSnapshot?.channelMeta ?? [],\n runsJobId: state.cronRunsJobId,\n runs: state.cronRuns,\n onFormChange: (patch) => (state.cronForm = { ...state.cronForm, ...patch }),\n onRefresh: () => state.loadCron(),\n onAdd: () => addCronJob(state),\n onToggle: (job, enabled) => toggleCronJob(state, job, enabled),\n onRun: (job) => runCronJob(state, job),\n onRemove: (job) => removeCronJob(state, job),\n onLoadRuns: (jobId) => loadCronRuns(state, jobId),\n })\n : nothing}\n\n ${state.tab === \"skills\"\n ? renderSkills({\n loading: state.skillsLoading,\n report: state.skillsReport,\n error: state.skillsError,\n filter: state.skillsFilter,\n edits: state.skillEdits,\n messages: state.skillMessages,\n busyKey: state.skillsBusyKey,\n onFilterChange: (next) => (state.skillsFilter = next),\n onRefresh: () => loadSkills(state, { clearMessages: true }),\n onToggle: (key, enabled) => updateSkillEnabled(state, key, enabled),\n onEdit: (key, value) => updateSkillEdit(state, key, value),\n onSaveKey: (key) => saveSkillApiKey(state, key),\n onInstall: (skillKey, name, installId) =>\n installSkill(state, skillKey, name, installId),\n })\n : nothing}\n\n ${state.tab === \"nodes\"\n ? renderNodes({\n loading: state.nodesLoading,\n nodes: state.nodes,\n devicesLoading: state.devicesLoading,\n devicesError: state.devicesError,\n devicesList: state.devicesList,\n configForm: state.configForm ?? (state.configSnapshot?.config as Record<string, unknown> | null),\n configLoading: state.configLoading,\n configSaving: state.configSaving,\n configDirty: state.configFormDirty,\n configFormMode: state.configFormMode,\n execApprovalsLoading: state.execApprovalsLoading,\n execApprovalsSaving: state.execApprovalsSaving,\n execApprovalsDirty: state.execApprovalsDirty,\n execApprovalsSnapshot: state.execApprovalsSnapshot,\n execApprovalsForm: state.execApprovalsForm,\n execApprovalsSelectedAgent: state.execApprovalsSelectedAgent,\n execApprovalsTarget: state.execApprovalsTarget,\n execApprovalsTargetNodeId: state.execApprovalsTargetNodeId,\n onRefresh: () => loadNodes(state),\n onDevicesRefresh: () => loadDevices(state),\n onDeviceApprove: (requestId) => approveDevicePairing(state, requestId),\n onDeviceReject: (requestId) => rejectDevicePairing(state, requestId),\n onDeviceRotate: (deviceId, role, scopes) =>\n rotateDeviceToken(state, { deviceId, role, scopes }),\n onDeviceRevoke: (deviceId, role) =>\n revokeDeviceToken(state, { deviceId, role }),\n onLoadConfig: () => loadConfig(state),\n onLoadExecApprovals: () => {\n const target =\n state.execApprovalsTarget === \"node\" && state.execApprovalsTargetNodeId\n ? { kind: \"node\" as const, nodeId: state.execApprovalsTargetNodeId }\n : { kind: \"gateway\" as const };\n return loadExecApprovals(state, target);\n },\n onBindDefault: (nodeId) => {\n if (nodeId) {\n updateConfigFormValue(state, [\"tools\", \"exec\", \"node\"], nodeId);\n } else {\n removeConfigFormValue(state, [\"tools\", \"exec\", \"node\"]);\n }\n },\n onBindAgent: (agentIndex, nodeId) => {\n const basePath = [\"agents\", \"list\", agentIndex, \"tools\", \"exec\", \"node\"];\n if (nodeId) {\n updateConfigFormValue(state, basePath, nodeId);\n } else {\n removeConfigFormValue(state, basePath);\n }\n },\n onSaveBindings: () => saveConfig(state),\n onExecApprovalsTargetChange: (kind, nodeId) => {\n state.execApprovalsTarget = kind;\n state.execApprovalsTargetNodeId = nodeId;\n state.execApprovalsSnapshot = null;\n state.execApprovalsForm = null;\n state.execApprovalsDirty = false;\n state.execApprovalsSelectedAgent = null;\n },\n onExecApprovalsSelectAgent: (agentId) => {\n state.execApprovalsSelectedAgent = agentId;\n },\n onExecApprovalsPatch: (path, value) =>\n updateExecApprovalsFormValue(state, path, value),\n onExecApprovalsRemove: (path) =>\n removeExecApprovalsFormValue(state, path),\n onSaveExecApprovals: () => {\n const target =\n state.execApprovalsTarget === \"node\" && state.execApprovalsTargetNodeId\n ? { kind: \"node\" as const, nodeId: state.execApprovalsTargetNodeId }\n : { kind: \"gateway\" as const };\n return saveExecApprovals(state, target);\n },\n })\n : nothing}\n\n ${state.tab === \"chat\"\n ? renderChat({\n sessionKey: state.sessionKey,\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatAttachments = [];\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.chatRunId = null;\n state.chatQueue = [];\n state.resetToolStream();\n state.resetChatScroll();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n void loadChatHistory(state);\n void refreshChatAvatar(state);\n },\n thinkingLevel: state.chatThinkingLevel,\n showThinking,\n loading: state.chatLoading,\n sending: state.chatSending,\n compactionStatus: state.compactionStatus,\n assistantAvatarUrl: chatAvatarUrl,\n messages: state.chatMessages,\n toolMessages: state.chatToolMessages,\n stream: state.chatStream,\n streamStartedAt: state.chatStreamStartedAt,\n draft: state.chatMessage,\n queue: state.chatQueue,\n connected: state.connected,\n canSend: state.connected,\n disabledReason: chatDisabledReason,\n error: state.lastError,\n sessions: state.sessionsResult,\n focusMode: chatFocus,\n onRefresh: () => {\n state.resetToolStream();\n return Promise.all([loadChatHistory(state), refreshChatAvatar(state)]);\n },\n onToggleFocusMode: () => {\n if (state.onboarding) return;\n state.applySettings({\n ...state.settings,\n chatFocusMode: !state.settings.chatFocusMode,\n });\n },\n onChatScroll: (event) => state.handleChatScroll(event),\n onDraftChange: (next) => (state.chatMessage = next),\n attachments: state.chatAttachments,\n onAttachmentsChange: (next) => (state.chatAttachments = next),\n onSend: () => state.handleSendChat(),\n canAbort: Boolean(state.chatRunId),\n onAbort: () => void state.handleAbortChat(),\n onQueueRemove: (id) => state.removeQueuedMessage(id),\n onNewSession: () =>\n state.handleSendChat(\"/new\", { restoreDraft: true }),\n // Sidebar props for tool output viewing\n sidebarOpen: state.sidebarOpen,\n sidebarContent: state.sidebarContent,\n sidebarError: state.sidebarError,\n splitRatio: state.splitRatio,\n onOpenSidebar: (content: string) => state.handleOpenSidebar(content),\n onCloseSidebar: () => state.handleCloseSidebar(),\n onSplitRatioChange: (ratio: number) => state.handleSplitRatioChange(ratio),\n assistantName: state.assistantName,\n assistantAvatar: state.assistantAvatar,\n })\n : nothing}\n\n ${state.tab === \"config\"\n ? renderConfig({\n raw: state.configRaw,\n originalRaw: state.configRawOriginal,\n valid: state.configValid,\n issues: state.configIssues,\n loading: state.configLoading,\n saving: state.configSaving,\n applying: state.configApplying,\n updating: state.updateRunning,\n connected: state.connected,\n schema: state.configSchema,\n schemaLoading: state.configSchemaLoading,\n uiHints: state.configUiHints,\n formMode: state.configFormMode,\n formValue: state.configForm,\n originalValue: state.configFormOriginal,\n searchQuery: state.configSearchQuery,\n activeSection: state.configActiveSection,\n activeSubsection: state.configActiveSubsection,\n onRawChange: (next) => {\n state.configRaw = next;\n },\n onFormModeChange: (mode) => (state.configFormMode = mode),\n onFormPatch: (path, value) => updateConfigFormValue(state, path, value),\n onSearchChange: (query) => (state.configSearchQuery = query),\n onSectionChange: (section) => {\n state.configActiveSection = section;\n state.configActiveSubsection = null;\n },\n onSubsectionChange: (section) => (state.configActiveSubsection = section),\n onReload: () => loadConfig(state),\n onSave: () => saveConfig(state),\n onApply: () => applyConfig(state),\n onUpdate: () => runUpdate(state),\n })\n : nothing}\n\n ${state.tab === \"debug\"\n ? renderDebug({\n loading: state.debugLoading,\n status: state.debugStatus,\n health: state.debugHealth,\n models: state.debugModels,\n heartbeat: state.debugHeartbeat,\n eventLog: state.eventLog,\n callMethod: state.debugCallMethod,\n callParams: state.debugCallParams,\n callResult: state.debugCallResult,\n callError: state.debugCallError,\n onCallMethodChange: (next) => (state.debugCallMethod = next),\n onCallParamsChange: (next) => (state.debugCallParams = next),\n onRefresh: () => loadDebug(state),\n onCall: () => callDebugMethod(state),\n })\n : nothing}\n\n ${state.tab === \"logs\"\n ? renderLogs({\n loading: state.logsLoading,\n error: state.logsError,\n file: state.logsFile,\n entries: state.logsEntries,\n filterText: state.logsFilterText,\n levelFilters: state.logsLevelFilters,\n autoFollow: state.logsAutoFollow,\n truncated: state.logsTruncated,\n onFilterTextChange: (next) => (state.logsFilterText = next),\n onLevelToggle: (level, enabled) => {\n state.logsLevelFilters = { ...state.logsLevelFilters, [level]: enabled };\n },\n onToggleAutoFollow: (next) => (state.logsAutoFollow = next),\n onRefresh: () => loadLogs(state, { reset: true }),\n onExport: (lines, label) => state.exportLogs(lines, label),\n onScroll: (event) => state.handleLogsScroll(event),\n })\n : nothing}\n </main>\n ${renderExecApprovalPrompt(state)}\n </div>\n `;\n}\n","import type { LogLevel } from \"./types\";\nimport type { CronFormState } from \"./ui-types\";\n\nexport const DEFAULT_LOG_LEVEL_FILTERS: Record<LogLevel, boolean> = {\n trace: true,\n debug: true,\n info: true,\n warn: true,\n error: true,\n fatal: true,\n};\n\nexport const DEFAULT_CRON_FORM: CronFormState = {\n name: \"\",\n description: \"\",\n agentId: \"\",\n enabled: true,\n scheduleKind: \"every\",\n scheduleAt: \"\",\n everyAmount: \"30\",\n everyUnit: \"minutes\",\n cronExpr: \"0 7 * * *\",\n cronTz: \"\",\n sessionTarget: \"main\",\n wakeMode: \"next-heartbeat\",\n payloadKind: \"systemEvent\",\n payloadText: \"\",\n deliver: false,\n channel: \"last\",\n to: \"\",\n timeoutSeconds: \"\",\n postToMainPrefix: \"\",\n};\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { AgentsListResult } from \"../types\";\n\nexport type AgentsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n agentsLoading: boolean;\n agentsError: string | null;\n agentsList: AgentsListResult | null;\n};\n\nexport async function loadAgents(state: AgentsState) {\n if (!state.client || !state.connected) return;\n if (state.agentsLoading) return;\n state.agentsLoading = true;\n state.agentsError = null;\n try {\n const res = (await state.client.request(\"agents.list\", {})) as AgentsListResult | undefined;\n if (res) state.agentsList = res;\n } catch (err) {\n state.agentsError = String(err);\n } finally {\n state.agentsLoading = false;\n }\n}\n","export const GATEWAY_CLIENT_IDS = {\n WEBCHAT_UI: \"webchat-ui\",\n CONTROL_UI: \"poolbot-control-ui\",\n WEBCHAT: \"webchat\",\n CLI: \"cli\",\n GATEWAY_CLIENT: \"gateway-client\",\n MACOS_APP: \"poolbot-macos\",\n IOS_APP: \"poolbot-ios\",\n ANDROID_APP: \"poolbot-android\",\n NODE_HOST: \"node-host\",\n TEST: \"test\",\n FINGERPRINT: \"fingerprint\",\n PROBE: \"poolbot-probe\",\n} as const;\n\nexport type GatewayClientId = (typeof GATEWAY_CLIENT_IDS)[keyof typeof GATEWAY_CLIENT_IDS];\n\n// Back-compat naming (internal): these values are IDs, not display names.\nexport const GATEWAY_CLIENT_NAMES = GATEWAY_CLIENT_IDS;\nexport type GatewayClientName = GatewayClientId;\n\nexport const GATEWAY_CLIENT_MODES = {\n WEBCHAT: \"webchat\",\n CLI: \"cli\",\n UI: \"ui\",\n BACKEND: \"backend\",\n NODE: \"node\",\n PROBE: \"probe\",\n TEST: \"test\",\n} as const;\n\nexport type GatewayClientMode = (typeof GATEWAY_CLIENT_MODES)[keyof typeof GATEWAY_CLIENT_MODES];\n\nexport type GatewayClientInfo = {\n id: GatewayClientId;\n displayName?: string;\n version: string;\n platform: string;\n deviceFamily?: string;\n modelIdentifier?: string;\n mode: GatewayClientMode;\n instanceId?: string;\n};\n\nexport const GATEWAY_CLIENT_CAPS = {\n TOOL_EVENTS: \"tool-events\",\n} as const;\n\nexport type GatewayClientCap = (typeof GATEWAY_CLIENT_CAPS)[keyof typeof GATEWAY_CLIENT_CAPS];\n\nconst GATEWAY_CLIENT_ID_SET = new Set<GatewayClientId>(Object.values(GATEWAY_CLIENT_IDS));\nconst GATEWAY_CLIENT_MODE_SET = new Set<GatewayClientMode>(Object.values(GATEWAY_CLIENT_MODES));\n\nexport function normalizeGatewayClientId(raw?: string | null): GatewayClientId | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) return undefined;\n return GATEWAY_CLIENT_ID_SET.has(normalized as GatewayClientId)\n ? (normalized as GatewayClientId)\n : undefined;\n}\n\nexport function normalizeGatewayClientName(raw?: string | null): GatewayClientName | undefined {\n return normalizeGatewayClientId(raw);\n}\n\nexport function normalizeGatewayClientMode(raw?: string | null): GatewayClientMode | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) return undefined;\n return GATEWAY_CLIENT_MODE_SET.has(normalized as GatewayClientMode)\n ? (normalized as GatewayClientMode)\n : undefined;\n}\n\nexport function hasGatewayClientCap(\n caps: string[] | null | undefined,\n cap: GatewayClientCap,\n): boolean {\n if (!Array.isArray(caps)) {\n return false;\n }\n return caps.includes(cap);\n}\n","export type DeviceAuthPayloadParams = {\n deviceId: string;\n clientId: string;\n clientMode: string;\n role: string;\n scopes: string[];\n signedAtMs: number;\n token?: string | null;\n nonce?: string | null;\n version?: \"v1\" | \"v2\";\n};\n\nexport function buildDeviceAuthPayload(params: DeviceAuthPayloadParams): string {\n const version = params.version ?? (params.nonce ? \"v2\" : \"v1\");\n const scopes = params.scopes.join(\",\");\n const token = params.token ?? \"\";\n const base = [\n version,\n params.deviceId,\n params.clientId,\n params.clientMode,\n params.role,\n scopes,\n String(params.signedAtMs),\n token,\n ];\n if (version === \"v2\") {\n base.push(params.nonce ?? \"\");\n }\n return base.join(\"|\");\n}\n","import { generateUUID } from \"./uuid\";\nimport {\n GATEWAY_CLIENT_MODES,\n GATEWAY_CLIENT_NAMES,\n type GatewayClientMode,\n type GatewayClientName,\n} from \"../../../src/gateway/protocol/client-info.js\";\nimport { buildDeviceAuthPayload } from \"../../../src/gateway/device-auth.js\";\nimport { loadOrCreateDeviceIdentity, signDevicePayload } from \"./device-identity\";\nimport { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from \"./device-auth\";\n\nexport type GatewayEventFrame = {\n type: \"event\";\n event: string;\n payload?: unknown;\n seq?: number;\n stateVersion?: { presence: number; health: number };\n};\n\nexport type GatewayResponseFrame = {\n type: \"res\";\n id: string;\n ok: boolean;\n payload?: unknown;\n error?: { code: string; message: string; details?: unknown };\n};\n\nexport type GatewayHelloOk = {\n type: \"hello-ok\";\n protocol: number;\n features?: { methods?: string[]; events?: string[] };\n snapshot?: unknown;\n auth?: {\n deviceToken?: string;\n role?: string;\n scopes?: string[];\n issuedAtMs?: number;\n };\n policy?: { tickIntervalMs?: number };\n};\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n};\n\nexport type GatewayBrowserClientOptions = {\n url: string;\n token?: string;\n password?: string;\n clientName?: GatewayClientName;\n clientVersion?: string;\n platform?: string;\n mode?: GatewayClientMode;\n instanceId?: string;\n onHello?: (hello: GatewayHelloOk) => void;\n onEvent?: (evt: GatewayEventFrame) => void;\n onClose?: (info: { code: number; reason: string }) => void;\n onGap?: (info: { expected: number; received: number }) => void;\n};\n\n// 4008 = application-defined code (browser rejects 1008 \"Policy Violation\")\nconst CONNECT_FAILED_CLOSE_CODE = 4008;\n\nexport class GatewayBrowserClient {\n private ws: WebSocket | null = null;\n private pending = new Map<string, Pending>();\n private closed = false;\n private lastSeq: number | null = null;\n private connectNonce: string | null = null;\n private connectSent = false;\n private connectTimer: number | null = null;\n private backoffMs = 800;\n\n constructor(private opts: GatewayBrowserClientOptions) {}\n\n start() {\n this.closed = false;\n this.connect();\n }\n\n stop() {\n this.closed = true;\n this.ws?.close();\n this.ws = null;\n this.flushPending(new Error(\"gateway client stopped\"));\n }\n\n get connected() {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private connect() {\n if (this.closed) return;\n this.ws = new WebSocket(this.opts.url);\n this.ws.onopen = () => this.queueConnect();\n this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? \"\"));\n this.ws.onclose = (ev) => {\n const reason = String(ev.reason ?? \"\");\n this.ws = null;\n this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));\n this.opts.onClose?.({ code: ev.code, reason });\n this.scheduleReconnect();\n };\n this.ws.onerror = () => {\n // ignored; close handler will fire\n };\n }\n\n private scheduleReconnect() {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);\n window.setTimeout(() => this.connect(), delay);\n }\n\n private flushPending(err: Error) {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n private async sendConnect() {\n if (this.connectSent) return;\n this.connectSent = true;\n if (this.connectTimer !== null) {\n window.clearTimeout(this.connectTimer);\n this.connectTimer = null;\n }\n\n // crypto.subtle is only available in secure contexts (HTTPS, localhost).\n // Over plain HTTP, we skip device identity and fall back to token-only auth.\n // Gateways may reject this unless gateway.controlUi.allowInsecureAuth is enabled.\n const isSecureContext = typeof crypto !== \"undefined\" && !!crypto.subtle;\n\n const scopes = [\"operator.admin\", \"operator.approvals\", \"operator.pairing\"];\n const role = \"operator\";\n let deviceIdentity: Awaited<ReturnType<typeof loadOrCreateDeviceIdentity>> | null = null;\n let canFallbackToShared = false;\n let authToken = this.opts.token;\n\n if (isSecureContext) {\n deviceIdentity = await loadOrCreateDeviceIdentity();\n const storedToken = loadDeviceAuthToken({\n deviceId: deviceIdentity.deviceId,\n role,\n })?.token;\n authToken = storedToken ?? this.opts.token;\n canFallbackToShared = Boolean(storedToken && this.opts.token);\n }\n const auth =\n authToken || this.opts.password\n ? {\n token: authToken,\n password: this.opts.password,\n }\n : undefined;\n\n let device:\n | {\n id: string;\n publicKey: string;\n signature: string;\n signedAt: number;\n nonce: string | undefined;\n }\n | undefined;\n\n if (isSecureContext && deviceIdentity) {\n const signedAtMs = Date.now();\n const nonce = this.connectNonce ?? undefined;\n const payload = buildDeviceAuthPayload({\n deviceId: deviceIdentity.deviceId,\n clientId: this.opts.clientName ?? GATEWAY_CLIENT_NAMES.CONTROL_UI,\n clientMode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,\n role,\n scopes,\n signedAtMs,\n token: authToken ?? null,\n nonce,\n });\n const signature = await signDevicePayload(deviceIdentity.privateKey, payload);\n device = {\n id: deviceIdentity.deviceId,\n publicKey: deviceIdentity.publicKey,\n signature,\n signedAt: signedAtMs,\n nonce,\n };\n }\n const params = {\n minProtocol: 3,\n maxProtocol: 3,\n client: {\n id: this.opts.clientName ?? GATEWAY_CLIENT_NAMES.CONTROL_UI,\n version: this.opts.clientVersion ?? \"dev\",\n platform: this.opts.platform ?? navigator.platform ?? \"web\",\n mode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,\n instanceId: this.opts.instanceId,\n },\n role,\n scopes,\n device,\n caps: [],\n auth,\n userAgent: navigator.userAgent,\n locale: navigator.language,\n };\n\n void this.request<GatewayHelloOk>(\"connect\", params)\n .then((hello) => {\n if (hello?.auth?.deviceToken && deviceIdentity) {\n storeDeviceAuthToken({\n deviceId: deviceIdentity.deviceId,\n role: hello.auth.role ?? role,\n token: hello.auth.deviceToken,\n scopes: hello.auth.scopes ?? [],\n });\n }\n this.backoffMs = 800;\n this.opts.onHello?.(hello);\n })\n .catch(() => {\n if (canFallbackToShared && deviceIdentity) {\n clearDeviceAuthToken({ deviceId: deviceIdentity.deviceId, role });\n }\n this.ws?.close(CONNECT_FAILED_CLOSE_CODE, \"connect failed\");\n });\n }\n\n private handleMessage(raw: string) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n\n const frame = parsed as { type?: unknown };\n if (frame.type === \"event\") {\n const evt = parsed as GatewayEventFrame;\n if (evt.event === \"connect.challenge\") {\n const payload = evt.payload as { nonce?: unknown } | undefined;\n const nonce = payload && typeof payload.nonce === \"string\" ? payload.nonce : null;\n if (nonce) {\n this.connectNonce = nonce;\n void this.sendConnect();\n }\n return;\n }\n const seq = typeof evt.seq === \"number\" ? evt.seq : null;\n if (seq !== null) {\n if (this.lastSeq !== null && seq > this.lastSeq + 1) {\n this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });\n }\n this.lastSeq = seq;\n }\n try {\n this.opts.onEvent?.(evt);\n } catch (err) {\n console.error(\"[gateway] event handler error:\", err);\n }\n return;\n }\n\n if (frame.type === \"res\") {\n const res = parsed as GatewayResponseFrame;\n const pending = this.pending.get(res.id);\n if (!pending) return;\n this.pending.delete(res.id);\n if (res.ok) pending.resolve(res.payload);\n else pending.reject(new Error(res.error?.message ?? \"request failed\"));\n return;\n }\n }\n\n request<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error(\"gateway not connected\"));\n }\n const id = generateUUID();\n const frame = { type: \"req\", id, method, params };\n const p = new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.ws.send(JSON.stringify(frame));\n return p;\n }\n\n private queueConnect() {\n this.connectNonce = null;\n this.connectSent = false;\n if (this.connectTimer !== null) window.clearTimeout(this.connectTimer);\n this.connectTimer = window.setTimeout(() => {\n void this.sendConnect();\n }, 750);\n }\n}\n","export type ExecApprovalRequestPayload = {\n command: string;\n cwd?: string | null;\n host?: string | null;\n security?: string | null;\n ask?: string | null;\n agentId?: string | null;\n resolvedPath?: string | null;\n sessionKey?: string | null;\n};\n\nexport type ExecApprovalRequest = {\n id: string;\n request: ExecApprovalRequestPayload;\n createdAtMs: number;\n expiresAtMs: number;\n};\n\nexport type ExecApprovalResolved = {\n id: string;\n decision?: string | null;\n resolvedBy?: string | null;\n ts?: number | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function parseExecApprovalRequested(payload: unknown): ExecApprovalRequest | null {\n if (!isRecord(payload)) return null;\n const id = typeof payload.id === \"string\" ? payload.id.trim() : \"\";\n const request = payload.request;\n if (!id || !isRecord(request)) return null;\n const command = typeof request.command === \"string\" ? request.command.trim() : \"\";\n if (!command) return null;\n const createdAtMs = typeof payload.createdAtMs === \"number\" ? payload.createdAtMs : 0;\n const expiresAtMs = typeof payload.expiresAtMs === \"number\" ? payload.expiresAtMs : 0;\n if (!createdAtMs || !expiresAtMs) return null;\n return {\n id,\n request: {\n command,\n cwd: typeof request.cwd === \"string\" ? request.cwd : null,\n host: typeof request.host === \"string\" ? request.host : null,\n security: typeof request.security === \"string\" ? request.security : null,\n ask: typeof request.ask === \"string\" ? request.ask : null,\n agentId: typeof request.agentId === \"string\" ? request.agentId : null,\n resolvedPath: typeof request.resolvedPath === \"string\" ? request.resolvedPath : null,\n sessionKey: typeof request.sessionKey === \"string\" ? request.sessionKey : null,\n },\n createdAtMs,\n expiresAtMs,\n };\n}\n\nexport function parseExecApprovalResolved(payload: unknown): ExecApprovalResolved | null {\n if (!isRecord(payload)) return null;\n const id = typeof payload.id === \"string\" ? payload.id.trim() : \"\";\n if (!id) return null;\n return {\n id,\n decision: typeof payload.decision === \"string\" ? payload.decision : null,\n resolvedBy: typeof payload.resolvedBy === \"string\" ? payload.resolvedBy : null,\n ts: typeof payload.ts === \"number\" ? payload.ts : null,\n };\n}\n\nexport function pruneExecApprovalQueue(queue: ExecApprovalRequest[]): ExecApprovalRequest[] {\n const now = Date.now();\n return queue.filter((entry) => entry.expiresAtMs > now);\n}\n\nexport function addExecApproval(\n queue: ExecApprovalRequest[],\n entry: ExecApprovalRequest,\n): ExecApprovalRequest[] {\n const next = pruneExecApprovalQueue(queue).filter((item) => item.id !== entry.id);\n next.push(entry);\n return next;\n}\n\nexport function removeExecApproval(queue: ExecApprovalRequest[], id: string): ExecApprovalRequest[] {\n return pruneExecApprovalQueue(queue).filter((entry) => entry.id !== id);\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport {\n normalizeAssistantIdentity,\n type AssistantIdentity,\n} from \"../assistant-identity\";\n\nexport type AssistantIdentityState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n assistantName: string;\n assistantAvatar: string | null;\n assistantAgentId: string | null;\n};\n\nexport async function loadAssistantIdentity(\n state: AssistantIdentityState,\n opts?: { sessionKey?: string },\n) {\n if (!state.client || !state.connected) return;\n const sessionKey = opts?.sessionKey?.trim() || state.sessionKey.trim();\n const params = sessionKey ? { sessionKey } : {};\n try {\n const res = (await state.client.request(\"agent.identity.get\", params)) as\n | Partial<AssistantIdentity>\n | undefined;\n if (!res) return;\n const normalized = normalizeAssistantIdentity(res);\n state.assistantName = normalized.name;\n state.assistantAvatar = normalized.avatar;\n state.assistantAgentId = normalized.agentId ?? null;\n } catch {\n // Ignore errors; keep last known identity.\n }\n}\n","import { loadChatHistory } from \"./controllers/chat\";\nimport { loadDevices } from \"./controllers/devices\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadAgents } from \"./controllers/agents\";\nimport type { GatewayEventFrame, GatewayHelloOk } from \"./gateway\";\nimport { GatewayBrowserClient } from \"./gateway\";\nimport type { EventLogEntry } from \"./app-events\";\nimport type { AgentsListResult, PresenceEntry, HealthSnapshot, StatusSummary } from \"./types\";\nimport type { Tab } from \"./navigation\";\nimport type { UiSettings } from \"./storage\";\nimport { handleAgentEvent, resetToolStream, type AgentEventPayload } from \"./app-tool-stream\";\nimport { flushChatQueueForEvent } from \"./app-chat\";\nimport {\n applySettings,\n loadCron,\n refreshActiveTab,\n setLastActiveSessionKey,\n} from \"./app-settings\";\nimport { handleChatEvent, type ChatEventPayload } from \"./controllers/chat\";\nimport {\n addExecApproval,\n parseExecApprovalRequested,\n parseExecApprovalResolved,\n removeExecApproval,\n} from \"./controllers/exec-approval\";\nimport type { PoolbotApp } from \"./app\";\nimport type { ExecApprovalRequest } from \"./controllers/exec-approval\";\nimport { loadAssistantIdentity } from \"./controllers/assistant-identity\";\n\ntype GatewayHost = {\n settings: UiSettings;\n password: string;\n client: GatewayBrowserClient | null;\n connected: boolean;\n hello: GatewayHelloOk | null;\n lastError: string | null;\n onboarding?: boolean;\n eventLogBuffer: EventLogEntry[];\n eventLog: EventLogEntry[];\n tab: Tab;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: StatusSummary | null;\n agentsLoading: boolean;\n agentsList: AgentsListResult | null;\n agentsError: string | null;\n debugHealth: HealthSnapshot | null;\n assistantName: string;\n assistantAvatar: string | null;\n assistantAgentId: string | null;\n sessionKey: string;\n chatRunId: string | null;\n execApprovalQueue: ExecApprovalRequest[];\n execApprovalError: string | null;\n};\n\ntype SessionDefaultsSnapshot = {\n defaultAgentId?: string;\n mainKey?: string;\n mainSessionKey?: string;\n scope?: string;\n};\n\nfunction normalizeSessionKeyForDefaults(\n value: string | undefined,\n defaults: SessionDefaultsSnapshot,\n): string {\n const raw = (value ?? \"\").trim();\n const mainSessionKey = defaults.mainSessionKey?.trim();\n if (!mainSessionKey) return raw;\n if (!raw) return mainSessionKey;\n const mainKey = defaults.mainKey?.trim() || \"main\";\n const defaultAgentId = defaults.defaultAgentId?.trim();\n const isAlias =\n raw === \"main\" ||\n raw === mainKey ||\n (defaultAgentId &&\n (raw === `agent:${defaultAgentId}:main` ||\n raw === `agent:${defaultAgentId}:${mainKey}`));\n return isAlias ? mainSessionKey : raw;\n}\n\nfunction applySessionDefaults(host: GatewayHost, defaults?: SessionDefaultsSnapshot) {\n if (!defaults?.mainSessionKey) return;\n const resolvedSessionKey = normalizeSessionKeyForDefaults(host.sessionKey, defaults);\n const resolvedSettingsSessionKey = normalizeSessionKeyForDefaults(\n host.settings.sessionKey,\n defaults,\n );\n const resolvedLastActiveSessionKey = normalizeSessionKeyForDefaults(\n host.settings.lastActiveSessionKey,\n defaults,\n );\n const nextSessionKey = resolvedSessionKey || resolvedSettingsSessionKey || host.sessionKey;\n const nextSettings = {\n ...host.settings,\n sessionKey: resolvedSettingsSessionKey || nextSessionKey,\n lastActiveSessionKey: resolvedLastActiveSessionKey || nextSessionKey,\n };\n const shouldUpdateSettings =\n nextSettings.sessionKey !== host.settings.sessionKey ||\n nextSettings.lastActiveSessionKey !== host.settings.lastActiveSessionKey;\n if (nextSessionKey !== host.sessionKey) {\n host.sessionKey = nextSessionKey;\n }\n if (shouldUpdateSettings) {\n applySettings(host as unknown as Parameters<typeof applySettings>[0], nextSettings);\n }\n}\n\nexport function connectGateway(host: GatewayHost) {\n host.lastError = null;\n host.hello = null;\n host.connected = false;\n host.execApprovalQueue = [];\n host.execApprovalError = null;\n\n host.client?.stop();\n host.client = new GatewayBrowserClient({\n url: host.settings.gatewayUrl,\n token: host.settings.token.trim() ? host.settings.token : undefined,\n password: host.password.trim() ? host.password : undefined,\n clientName: \"poolbot-control-ui\",\n mode: \"webchat\",\n onHello: (hello) => {\n host.connected = true;\n host.lastError = null;\n host.hello = hello;\n applySnapshot(host, hello);\n // Reset orphaned chat run state from before disconnect.\n // Any in-flight run's final event was lost during the disconnect window.\n host.chatRunId = null;\n (host as unknown as { chatStream: string | null }).chatStream = null;\n (host as unknown as { chatStreamStartedAt: number | null }).chatStreamStartedAt = null;\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n void loadAssistantIdentity(host as unknown as PoolbotApp);\n void loadAgents(host as unknown as PoolbotApp);\n void loadNodes(host as unknown as PoolbotApp, { quiet: true });\n void loadDevices(host as unknown as PoolbotApp, { quiet: true });\n void refreshActiveTab(host as unknown as Parameters<typeof refreshActiveTab>[0]);\n },\n onClose: ({ code, reason }) => {\n host.connected = false;\n // Code 1012 = Service Restart (expected during config saves, don't show as error)\n if (code !== 1012) {\n host.lastError = `disconnected (${code}): ${reason || \"no reason\"}`;\n }\n },\n onEvent: (evt) => handleGatewayEvent(host, evt),\n onGap: ({ expected, received }) => {\n host.lastError = `event gap detected (expected seq ${expected}, got ${received}); refresh recommended`;\n },\n });\n host.client.start();\n}\n\nexport function handleGatewayEvent(host: GatewayHost, evt: GatewayEventFrame) {\n try {\n handleGatewayEventUnsafe(host, evt);\n } catch (err) {\n console.error(\"[gateway] handleGatewayEvent error:\", evt.event, err);\n }\n}\n\nfunction handleGatewayEventUnsafe(host: GatewayHost, evt: GatewayEventFrame) {\n host.eventLogBuffer = [\n { ts: Date.now(), event: evt.event, payload: evt.payload },\n ...host.eventLogBuffer,\n ].slice(0, 250);\n if (host.tab === \"debug\") {\n host.eventLog = host.eventLogBuffer;\n }\n\n if (evt.event === \"agent\") {\n if (host.onboarding) return;\n handleAgentEvent(\n host as unknown as Parameters<typeof handleAgentEvent>[0],\n evt.payload as AgentEventPayload | undefined,\n );\n return;\n }\n\n if (evt.event === \"chat\") {\n const payload = evt.payload as ChatEventPayload | undefined;\n if (payload?.sessionKey) {\n setLastActiveSessionKey(\n host as unknown as Parameters<typeof setLastActiveSessionKey>[0],\n payload.sessionKey,\n );\n }\n const state = handleChatEvent(host as unknown as PoolbotApp, payload);\n if (state === \"final\" || state === \"error\" || state === \"aborted\") {\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n void flushChatQueueForEvent(\n host as unknown as Parameters<typeof flushChatQueueForEvent>[0],\n );\n }\n if (state === \"final\") void loadChatHistory(host as unknown as PoolbotApp);\n return;\n }\n\n if (evt.event === \"presence\") {\n const payload = evt.payload as { presence?: PresenceEntry[] } | undefined;\n if (payload?.presence && Array.isArray(payload.presence)) {\n host.presenceEntries = payload.presence;\n host.presenceError = null;\n host.presenceStatus = null;\n }\n return;\n }\n\n if (evt.event === \"cron\" && host.tab === \"cron\") {\n void loadCron(host as unknown as Parameters<typeof loadCron>[0]);\n }\n\n if (evt.event === \"device.pair.requested\" || evt.event === \"device.pair.resolved\") {\n void loadDevices(host as unknown as PoolbotApp, { quiet: true });\n }\n\n if (evt.event === \"exec.approval.requested\") {\n const entry = parseExecApprovalRequested(evt.payload);\n if (entry) {\n host.execApprovalQueue = addExecApproval(host.execApprovalQueue, entry);\n host.execApprovalError = null;\n const delay = Math.max(0, entry.expiresAtMs - Date.now() + 500);\n window.setTimeout(() => {\n host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, entry.id);\n }, delay);\n }\n return;\n }\n\n if (evt.event === \"exec.approval.resolved\") {\n const resolved = parseExecApprovalResolved(evt.payload);\n if (resolved) {\n host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, resolved.id);\n }\n }\n}\n\nexport function applySnapshot(host: GatewayHost, hello: GatewayHelloOk) {\n const snapshot = hello.snapshot as\n | {\n presence?: PresenceEntry[];\n health?: HealthSnapshot;\n sessionDefaults?: SessionDefaultsSnapshot;\n }\n | undefined;\n if (snapshot?.presence && Array.isArray(snapshot.presence)) {\n host.presenceEntries = snapshot.presence;\n }\n if (snapshot?.health) {\n host.debugHealth = snapshot.health;\n }\n if (snapshot?.sessionDefaults) {\n applySessionDefaults(host, snapshot.sessionDefaults);\n }\n}\n","import type { Tab } from \"./navigation\";\nimport { connectGateway } from \"./app-gateway\";\nimport {\n applySettingsFromUrl,\n attachThemeListener,\n detachThemeListener,\n inferBasePath,\n syncTabWithLocation,\n syncThemeWithSettings,\n} from \"./app-settings\";\nimport { observeTopbar, scheduleChatScroll, scheduleLogsScroll } from \"./app-scroll\";\nimport {\n startLogsPolling,\n startNodesPolling,\n stopLogsPolling,\n stopNodesPolling,\n startDebugPolling,\n stopDebugPolling,\n} from \"./app-polling\";\n\ntype LifecycleHost = {\n basePath: string;\n tab: Tab;\n chatHasAutoScrolled: boolean;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatToolMessages: unknown[];\n chatStream: string;\n logsAutoFollow: boolean;\n logsAtBottom: boolean;\n logsEntries: unknown[];\n popStateHandler: () => void;\n topbarObserver: ResizeObserver | null;\n};\n\nexport function handleConnected(host: LifecycleHost) {\n host.basePath = inferBasePath();\n syncTabWithLocation(\n host as unknown as Parameters<typeof syncTabWithLocation>[0],\n true,\n );\n syncThemeWithSettings(\n host as unknown as Parameters<typeof syncThemeWithSettings>[0],\n );\n attachThemeListener(\n host as unknown as Parameters<typeof attachThemeListener>[0],\n );\n window.addEventListener(\"popstate\", host.popStateHandler);\n applySettingsFromUrl(\n host as unknown as Parameters<typeof applySettingsFromUrl>[0],\n );\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n startNodesPolling(host as unknown as Parameters<typeof startNodesPolling>[0]);\n if (host.tab === \"logs\") {\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n }\n if (host.tab === \"debug\") {\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n }\n}\n\nexport function handleFirstUpdated(host: LifecycleHost) {\n observeTopbar(host as unknown as Parameters<typeof observeTopbar>[0]);\n}\n\nexport function handleDisconnected(host: LifecycleHost) {\n window.removeEventListener(\"popstate\", host.popStateHandler);\n stopNodesPolling(host as unknown as Parameters<typeof stopNodesPolling>[0]);\n stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n detachThemeListener(\n host as unknown as Parameters<typeof detachThemeListener>[0],\n );\n host.topbarObserver?.disconnect();\n host.topbarObserver = null;\n}\n\nexport function handleUpdated(\n host: LifecycleHost,\n changed: Map<PropertyKey, unknown>,\n) {\n if (\n host.tab === \"chat\" &&\n (changed.has(\"chatMessages\") ||\n changed.has(\"chatToolMessages\") ||\n changed.has(\"chatStream\") ||\n changed.has(\"chatLoading\") ||\n changed.has(\"tab\"))\n ) {\n const forcedByTab = changed.has(\"tab\");\n const forcedByLoad =\n changed.has(\"chatLoading\") &&\n changed.get(\"chatLoading\") === true &&\n host.chatLoading === false;\n scheduleChatScroll(\n host as unknown as Parameters<typeof scheduleChatScroll>[0],\n forcedByTab || forcedByLoad || !host.chatHasAutoScrolled,\n );\n }\n if (\n host.tab === \"logs\" &&\n (changed.has(\"logsEntries\") || changed.has(\"logsAutoFollow\") || changed.has(\"tab\"))\n ) {\n if (host.logsAutoFollow && host.logsAtBottom) {\n scheduleLogsScroll(\n host as unknown as Parameters<typeof scheduleLogsScroll>[0],\n changed.has(\"tab\") || changed.has(\"logsAutoFollow\"),\n );\n }\n }\n}\n","import {\n loadChannels,\n logoutWhatsApp,\n startWhatsAppLogin,\n waitWhatsAppLogin,\n} from \"./controllers/channels\";\nimport { loadConfig, saveConfig } from \"./controllers/config\";\nimport type { PoolbotApp } from \"./app\";\nimport type { NostrProfile } from \"./types\";\nimport { createNostrProfileFormState } from \"./views/channels.nostr-profile-form\";\n\nexport async function handleWhatsAppStart(host: PoolbotApp, force: boolean) {\n await startWhatsAppLogin(host, force);\n await loadChannels(host, true);\n}\n\nexport async function handleWhatsAppWait(host: PoolbotApp) {\n await waitWhatsAppLogin(host);\n await loadChannels(host, true);\n}\n\nexport async function handleWhatsAppLogout(host: PoolbotApp) {\n await logoutWhatsApp(host);\n await loadChannels(host, true);\n}\n\nexport async function handleChannelConfigSave(host: PoolbotApp) {\n await saveConfig(host);\n await loadConfig(host);\n await loadChannels(host, true);\n}\n\nexport async function handleChannelConfigReload(host: PoolbotApp) {\n await loadConfig(host);\n await loadChannels(host, true);\n}\n\nfunction parseValidationErrors(details: unknown): Record<string, string> {\n if (!Array.isArray(details)) return {};\n const errors: Record<string, string> = {};\n for (const entry of details) {\n if (typeof entry !== \"string\") continue;\n const [rawField, ...rest] = entry.split(\":\");\n if (!rawField || rest.length === 0) continue;\n const field = rawField.trim();\n const message = rest.join(\":\").trim();\n if (field && message) errors[field] = message;\n }\n return errors;\n}\n\nfunction resolveNostrAccountId(host: PoolbotApp): string {\n const accounts = host.channelsSnapshot?.channelAccounts?.nostr ?? [];\n return accounts[0]?.accountId ?? host.nostrProfileAccountId ?? \"default\";\n}\n\nfunction buildNostrProfileUrl(accountId: string, suffix = \"\"): string {\n return `/api/channels/nostr/${encodeURIComponent(accountId)}/profile${suffix}`;\n}\n\nexport function handleNostrProfileEdit(\n host: PoolbotApp,\n accountId: string,\n profile: NostrProfile | null,\n) {\n host.nostrProfileAccountId = accountId;\n host.nostrProfileFormState = createNostrProfileFormState(profile ?? undefined);\n}\n\nexport function handleNostrProfileCancel(host: PoolbotApp) {\n host.nostrProfileFormState = null;\n host.nostrProfileAccountId = null;\n}\n\nexport function handleNostrProfileFieldChange(\n host: PoolbotApp,\n field: keyof NostrProfile,\n value: string,\n) {\n const state = host.nostrProfileFormState;\n if (!state) return;\n host.nostrProfileFormState = {\n ...state,\n values: {\n ...state.values,\n [field]: value,\n },\n fieldErrors: {\n ...state.fieldErrors,\n [field]: \"\",\n },\n };\n}\n\nexport function handleNostrProfileToggleAdvanced(host: PoolbotApp) {\n const state = host.nostrProfileFormState;\n if (!state) return;\n host.nostrProfileFormState = {\n ...state,\n showAdvanced: !state.showAdvanced,\n };\n}\n\nexport async function handleNostrProfileSave(host: PoolbotApp) {\n const state = host.nostrProfileFormState;\n if (!state || state.saving) return;\n const accountId = resolveNostrAccountId(host);\n\n host.nostrProfileFormState = {\n ...state,\n saving: true,\n error: null,\n success: null,\n fieldErrors: {},\n };\n\n try {\n const response = await fetch(buildNostrProfileUrl(accountId), {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(state.values),\n });\n const data = (await response.json().catch(() => null)) as\n | { ok?: boolean; error?: string; details?: unknown; persisted?: boolean }\n | null;\n\n if (!response.ok || data?.ok === false || !data) {\n const errorMessage = data?.error ?? `Profile update failed (${response.status})`;\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: errorMessage,\n success: null,\n fieldErrors: parseValidationErrors(data?.details),\n };\n return;\n }\n\n if (!data.persisted) {\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: \"Profile publish failed on all relays.\",\n success: null,\n };\n return;\n }\n\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: null,\n success: \"Profile published to relays.\",\n fieldErrors: {},\n original: { ...state.values },\n };\n await loadChannels(host, true);\n } catch (err) {\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: `Profile update failed: ${String(err)}`,\n success: null,\n };\n }\n}\n\nexport async function handleNostrProfileImport(host: PoolbotApp) {\n const state = host.nostrProfileFormState;\n if (!state || state.importing) return;\n const accountId = resolveNostrAccountId(host);\n\n host.nostrProfileFormState = {\n ...state,\n importing: true,\n error: null,\n success: null,\n };\n\n try {\n const response = await fetch(buildNostrProfileUrl(accountId, \"/import\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ autoMerge: true }),\n });\n const data = (await response.json().catch(() => null)) as\n | { ok?: boolean; error?: string; imported?: NostrProfile; merged?: NostrProfile; saved?: boolean }\n | null;\n\n if (!response.ok || data?.ok === false || !data) {\n const errorMessage = data?.error ?? `Profile import failed (${response.status})`;\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n error: errorMessage,\n success: null,\n };\n return;\n }\n\n const merged = data.merged ?? data.imported ?? null;\n const nextValues = merged ? { ...state.values, ...merged } : state.values;\n const showAdvanced = Boolean(\n nextValues.banner || nextValues.website || nextValues.nip05 || nextValues.lud16,\n );\n\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n values: nextValues,\n error: null,\n success: data.saved\n ? \"Profile imported from relays. Review and publish.\"\n : \"Profile imported. Review and publish.\",\n showAdvanced,\n };\n\n if (data.saved) {\n await loadChannels(host, true);\n }\n } catch (err) {\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n error: `Profile import failed: ${String(err)}`,\n success: null,\n };\n }\n}\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport { resolveInjectedAssistantIdentity } from \"./assistant-identity\";\nimport { loadSettings, type UiSettings } from \"./storage\";\nimport { renderApp } from \"./app-render\";\nimport type { Tab } from \"./navigation\";\nimport type { ResolvedTheme, ThemeMode } from \"./theme\";\nimport type {\n AgentsListResult,\n ConfigSnapshot,\n ConfigUiHints,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n LogEntry,\n LogLevel,\n PresenceEntry,\n ChannelsStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n NostrProfile,\n} from \"./types\";\nimport { type ChatAttachment, type ChatQueueItem, type CronFormState } from \"./ui-types\";\nimport type { EventLogEntry } from \"./app-events\";\nimport { DEFAULT_CRON_FORM, DEFAULT_LOG_LEVEL_FILTERS } from \"./app-defaults\";\nimport type {\n ExecApprovalsFile,\n ExecApprovalsSnapshot,\n} from \"./controllers/exec-approvals\";\nimport type { DevicePairingList } from \"./controllers/devices\";\nimport type { ExecApprovalRequest } from \"./controllers/exec-approval\";\nimport {\n resetToolStream as resetToolStreamInternal,\n type ToolStreamEntry,\n} from \"./app-tool-stream\";\nimport {\n exportLogs as exportLogsInternal,\n handleChatScroll as handleChatScrollInternal,\n handleLogsScroll as handleLogsScrollInternal,\n resetChatScroll as resetChatScrollInternal,\n} from \"./app-scroll\";\nimport { connectGateway as connectGatewayInternal } from \"./app-gateway\";\nimport {\n handleConnected,\n handleDisconnected,\n handleFirstUpdated,\n handleUpdated,\n} from \"./app-lifecycle\";\nimport {\n applySettings as applySettingsInternal,\n loadCron as loadCronInternal,\n loadOverview as loadOverviewInternal,\n setTab as setTabInternal,\n setTheme as setThemeInternal,\n onPopState as onPopStateInternal,\n} from \"./app-settings\";\nimport {\n handleAbortChat as handleAbortChatInternal,\n handleSendChat as handleSendChatInternal,\n removeQueuedMessage as removeQueuedMessageInternal,\n} from \"./app-chat\";\nimport {\n handleChannelConfigReload as handleChannelConfigReloadInternal,\n handleChannelConfigSave as handleChannelConfigSaveInternal,\n handleNostrProfileCancel as handleNostrProfileCancelInternal,\n handleNostrProfileEdit as handleNostrProfileEditInternal,\n handleNostrProfileFieldChange as handleNostrProfileFieldChangeInternal,\n handleNostrProfileImport as handleNostrProfileImportInternal,\n handleNostrProfileSave as handleNostrProfileSaveInternal,\n handleNostrProfileToggleAdvanced as handleNostrProfileToggleAdvancedInternal,\n handleWhatsAppLogout as handleWhatsAppLogoutInternal,\n handleWhatsAppStart as handleWhatsAppStartInternal,\n handleWhatsAppWait as handleWhatsAppWaitInternal,\n} from \"./app-channels\";\nimport type { NostrProfileFormState } from \"./views/channels.nostr-profile-form\";\nimport { loadAssistantIdentity as loadAssistantIdentityInternal } from \"./controllers/assistant-identity\";\n\ndeclare global {\n interface Window {\n __CLAWDBOT_CONTROL_UI_BASE_PATH__?: string;\n }\n}\n\nconst injectedAssistantIdentity = resolveInjectedAssistantIdentity();\n\nfunction resolveOnboardingMode(): boolean {\n if (!window.location.search) return false;\n const params = new URLSearchParams(window.location.search);\n const raw = params.get(\"onboarding\");\n if (!raw) return false;\n const normalized = raw.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\n@customElement(\"poolbot-app\")\nexport class PoolbotApp extends LitElement {\n @state() settings: UiSettings = loadSettings();\n @state() password = \"\";\n @state() tab: Tab = \"chat\";\n @state() onboarding = resolveOnboardingMode();\n @state() connected = false;\n @state() theme: ThemeMode = this.settings.theme ?? \"system\";\n @state() themeResolved: ResolvedTheme = \"dark\";\n @state() hello: GatewayHelloOk | null = null;\n @state() lastError: string | null = null;\n @state() eventLog: EventLogEntry[] = [];\n private eventLogBuffer: EventLogEntry[] = [];\n private toolStreamSyncTimer: number | null = null;\n private sidebarCloseTimer: number | null = null;\n\n @state() assistantName = injectedAssistantIdentity.name;\n @state() assistantAvatar = injectedAssistantIdentity.avatar;\n @state() assistantAgentId = injectedAssistantIdentity.agentId ?? null;\n\n @state() sessionKey = this.settings.sessionKey;\n @state() chatLoading = false;\n @state() chatSending = false;\n @state() chatMessage = \"\";\n @state() chatMessages: unknown[] = [];\n @state() chatToolMessages: unknown[] = [];\n @state() chatStream: string | null = null;\n @state() chatStreamStartedAt: number | null = null;\n @state() chatRunId: string | null = null;\n @state() compactionStatus: import(\"./app-tool-stream\").CompactionStatus | null = null;\n @state() chatAvatarUrl: string | null = null;\n @state() chatThinkingLevel: string | null = null;\n @state() chatQueue: ChatQueueItem[] = [];\n @state() chatAttachments: ChatAttachment[] = [];\n // Sidebar state for tool output viewing\n @state() sidebarOpen = false;\n @state() sidebarContent: string | null = null;\n @state() sidebarError: string | null = null;\n @state() splitRatio = this.settings.splitRatio;\n\n @state() nodesLoading = false;\n @state() nodes: Array<Record<string, unknown>> = [];\n @state() devicesLoading = false;\n @state() devicesError: string | null = null;\n @state() devicesList: DevicePairingList | null = null;\n @state() execApprovalsLoading = false;\n @state() execApprovalsSaving = false;\n @state() execApprovalsDirty = false;\n @state() execApprovalsSnapshot: ExecApprovalsSnapshot | null = null;\n @state() execApprovalsForm: ExecApprovalsFile | null = null;\n @state() execApprovalsSelectedAgent: string | null = null;\n @state() execApprovalsTarget: \"gateway\" | \"node\" = \"gateway\";\n @state() execApprovalsTargetNodeId: string | null = null;\n @state() execApprovalQueue: ExecApprovalRequest[] = [];\n @state() execApprovalBusy = false;\n @state() execApprovalError: string | null = null;\n\n @state() configLoading = false;\n @state() configRaw = \"{\\n}\\n\";\n @state() configRawOriginal = \"\";\n @state() configValid: boolean | null = null;\n @state() configIssues: unknown[] = [];\n @state() configSaving = false;\n @state() configApplying = false;\n @state() updateRunning = false;\n @state() applySessionKey = this.settings.lastActiveSessionKey;\n @state() configSnapshot: ConfigSnapshot | null = null;\n @state() configSchema: unknown | null = null;\n @state() configSchemaVersion: string | null = null;\n @state() configSchemaLoading = false;\n @state() configUiHints: ConfigUiHints = {};\n @state() configForm: Record<string, unknown> | null = null;\n @state() configFormOriginal: Record<string, unknown> | null = null;\n @state() configFormDirty = false;\n @state() configFormMode: \"form\" | \"raw\" = \"form\";\n @state() configSearchQuery = \"\";\n @state() configActiveSection: string | null = null;\n @state() configActiveSubsection: string | null = null;\n\n @state() channelsLoading = false;\n @state() channelsSnapshot: ChannelsStatusSnapshot | null = null;\n @state() channelsError: string | null = null;\n @state() channelsLastSuccess: number | null = null;\n @state() whatsappLoginMessage: string | null = null;\n @state() whatsappLoginQrDataUrl: string | null = null;\n @state() whatsappLoginConnected: boolean | null = null;\n @state() whatsappBusy = false;\n @state() nostrProfileFormState: NostrProfileFormState | null = null;\n @state() nostrProfileAccountId: string | null = null;\n\n @state() presenceLoading = false;\n @state() presenceEntries: PresenceEntry[] = [];\n @state() presenceError: string | null = null;\n @state() presenceStatus: string | null = null;\n\n @state() agentsLoading = false;\n @state() agentsList: AgentsListResult | null = null;\n @state() agentsError: string | null = null;\n\n @state() sessionsLoading = false;\n @state() sessionsResult: SessionsListResult | null = null;\n @state() sessionsError: string | null = null;\n @state() sessionsFilterActive = \"\";\n @state() sessionsFilterLimit = \"120\";\n @state() sessionsIncludeGlobal = true;\n @state() sessionsIncludeUnknown = false;\n\n @state() cronLoading = false;\n @state() cronJobs: CronJob[] = [];\n @state() cronStatus: CronStatus | null = null;\n @state() cronError: string | null = null;\n @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };\n @state() cronRunsJobId: string | null = null;\n @state() cronRuns: CronRunLogEntry[] = [];\n @state() cronBusy = false;\n\n @state() skillsLoading = false;\n @state() skillsReport: SkillStatusReport | null = null;\n @state() skillsError: string | null = null;\n @state() skillsFilter = \"\";\n @state() skillEdits: Record<string, string> = {};\n @state() skillsBusyKey: string | null = null;\n @state() skillMessages: Record<string, SkillMessage> = {};\n\n @state() debugLoading = false;\n @state() debugStatus: StatusSummary | null = null;\n @state() debugHealth: HealthSnapshot | null = null;\n @state() debugModels: unknown[] = [];\n @state() debugHeartbeat: unknown | null = null;\n @state() debugCallMethod = \"\";\n @state() debugCallParams = \"{}\";\n @state() debugCallResult: string | null = null;\n @state() debugCallError: string | null = null;\n\n @state() logsLoading = false;\n @state() logsError: string | null = null;\n @state() logsFile: string | null = null;\n @state() logsEntries: LogEntry[] = [];\n @state() logsFilterText = \"\";\n @state() logsLevelFilters: Record<LogLevel, boolean> = {\n ...DEFAULT_LOG_LEVEL_FILTERS,\n };\n @state() logsAutoFollow = true;\n @state() logsTruncated = false;\n @state() logsCursor: number | null = null;\n @state() logsLastFetchAt: number | null = null;\n @state() logsLimit = 500;\n @state() logsMaxBytes = 250_000;\n @state() logsAtBottom = true;\n\n client: GatewayBrowserClient | null = null;\n private chatScrollFrame: number | null = null;\n private chatScrollTimeout: number | null = null;\n private chatHasAutoScrolled = false;\n private chatUserNearBottom = true;\n private nodesPollInterval: number | null = null;\n private logsPollInterval: number | null = null;\n private debugPollInterval: number | null = null;\n private logsScrollFrame: number | null = null;\n private toolStreamById = new Map<string, ToolStreamEntry>();\n private toolStreamOrder: string[] = [];\n basePath = \"\";\n private popStateHandler = () =>\n onPopStateInternal(\n this as unknown as Parameters<typeof onPopStateInternal>[0],\n );\n private themeMedia: MediaQueryList | null = null;\n private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;\n private topbarObserver: ResizeObserver | null = null;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n handleConnected(this as unknown as Parameters<typeof handleConnected>[0]);\n }\n\n protected firstUpdated() {\n handleFirstUpdated(this as unknown as Parameters<typeof handleFirstUpdated>[0]);\n }\n\n disconnectedCallback() {\n handleDisconnected(this as unknown as Parameters<typeof handleDisconnected>[0]);\n super.disconnectedCallback();\n }\n\n protected updated(changed: Map<PropertyKey, unknown>) {\n handleUpdated(\n this as unknown as Parameters<typeof handleUpdated>[0],\n changed,\n );\n }\n\n connect() {\n connectGatewayInternal(\n this as unknown as Parameters<typeof connectGatewayInternal>[0],\n );\n }\n\n handleChatScroll(event: Event) {\n handleChatScrollInternal(\n this as unknown as Parameters<typeof handleChatScrollInternal>[0],\n event,\n );\n }\n\n handleLogsScroll(event: Event) {\n handleLogsScrollInternal(\n this as unknown as Parameters<typeof handleLogsScrollInternal>[0],\n event,\n );\n }\n\n exportLogs(lines: string[], label: string) {\n exportLogsInternal(lines, label);\n }\n\n resetToolStream() {\n resetToolStreamInternal(\n this as unknown as Parameters<typeof resetToolStreamInternal>[0],\n );\n }\n\n resetChatScroll() {\n resetChatScrollInternal(\n this as unknown as Parameters<typeof resetChatScrollInternal>[0],\n );\n }\n\n async loadAssistantIdentity() {\n await loadAssistantIdentityInternal(this);\n }\n\n applySettings(next: UiSettings) {\n applySettingsInternal(\n this as unknown as Parameters<typeof applySettingsInternal>[0],\n next,\n );\n }\n\n setTab(next: Tab) {\n setTabInternal(this as unknown as Parameters<typeof setTabInternal>[0], next);\n }\n\n setTheme(next: ThemeMode, context?: Parameters<typeof setThemeInternal>[2]) {\n setThemeInternal(\n this as unknown as Parameters<typeof setThemeInternal>[0],\n next,\n context,\n );\n }\n\n async loadOverview() {\n await loadOverviewInternal(\n this as unknown as Parameters<typeof loadOverviewInternal>[0],\n );\n }\n\n async loadCron() {\n await loadCronInternal(\n this as unknown as Parameters<typeof loadCronInternal>[0],\n );\n }\n\n async handleAbortChat() {\n await handleAbortChatInternal(\n this as unknown as Parameters<typeof handleAbortChatInternal>[0],\n );\n }\n\n removeQueuedMessage(id: string) {\n removeQueuedMessageInternal(\n this as unknown as Parameters<typeof removeQueuedMessageInternal>[0],\n id,\n );\n }\n\n async handleSendChat(\n messageOverride?: string,\n opts?: Parameters<typeof handleSendChatInternal>[2],\n ) {\n await handleSendChatInternal(\n this as unknown as Parameters<typeof handleSendChatInternal>[0],\n messageOverride,\n opts,\n );\n }\n\n async handleWhatsAppStart(force: boolean) {\n await handleWhatsAppStartInternal(this, force);\n }\n\n async handleWhatsAppWait() {\n await handleWhatsAppWaitInternal(this);\n }\n\n async handleWhatsAppLogout() {\n await handleWhatsAppLogoutInternal(this);\n }\n\n async handleChannelConfigSave() {\n await handleChannelConfigSaveInternal(this);\n }\n\n async handleChannelConfigReload() {\n await handleChannelConfigReloadInternal(this);\n }\n\n handleNostrProfileEdit(accountId: string, profile: NostrProfile | null) {\n handleNostrProfileEditInternal(this, accountId, profile);\n }\n\n handleNostrProfileCancel() {\n handleNostrProfileCancelInternal(this);\n }\n\n handleNostrProfileFieldChange(field: keyof NostrProfile, value: string) {\n handleNostrProfileFieldChangeInternal(this, field, value);\n }\n\n async handleNostrProfileSave() {\n await handleNostrProfileSaveInternal(this);\n }\n\n async handleNostrProfileImport() {\n await handleNostrProfileImportInternal(this);\n }\n\n handleNostrProfileToggleAdvanced() {\n handleNostrProfileToggleAdvancedInternal(this);\n }\n\n async handleExecApprovalDecision(decision: \"allow-once\" | \"allow-always\" | \"deny\") {\n const active = this.execApprovalQueue[0];\n if (!active || !this.client || this.execApprovalBusy) return;\n this.execApprovalBusy = true;\n this.execApprovalError = null;\n try {\n await this.client.request(\"exec.approval.resolve\", {\n id: active.id,\n decision,\n });\n this.execApprovalQueue = this.execApprovalQueue.filter((entry) => entry.id !== active.id);\n } catch (err) {\n this.execApprovalError = `Exec approval failed: ${String(err)}`;\n } finally {\n this.execApprovalBusy = false;\n }\n }\n\n // Sidebar handlers for tool output viewing\n handleOpenSidebar(content: string) {\n if (this.sidebarCloseTimer != null) {\n window.clearTimeout(this.sidebarCloseTimer);\n this.sidebarCloseTimer = null;\n }\n this.sidebarContent = content;\n this.sidebarError = null;\n this.sidebarOpen = true;\n }\n\n handleCloseSidebar() {\n this.sidebarOpen = false;\n // Clear content after transition\n if (this.sidebarCloseTimer != null) {\n window.clearTimeout(this.sidebarCloseTimer);\n }\n this.sidebarCloseTimer = window.setTimeout(() => {\n if (this.sidebarOpen) return;\n this.sidebarContent = null;\n this.sidebarError = null;\n this.sidebarCloseTimer = null;\n }, 200);\n }\n\n handleSplitRatioChange(ratio: number) {\n const newRatio = Math.max(0.4, Math.min(0.7, ratio));\n this.splitRatio = newRatio;\n this.applySettings({ ...this.settings, splitRatio: newRatio });\n }\n\n render() {\n return renderApp(this);\n }\n}\n"],"names":["NODE_MODE","global","supportsAdoptingStyleSheets","constructionToken","cssTagCache","CSSResult","cssText","strings","safeToken","styleSheet","cacheable","textFromCSSResult","value","unsafeCSS","css","values","acc","v","idx","adoptStyles","renderRoot","styles","s","style","nonce","cssResultFromStyleSheet","sheet","rule","getCompatibleStyle","is","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","issueWarning","trustedTypes","emptyStringForBooleanAttribute","polyfillSupport","code","warning","debugLogEvent","event","JSCompiler_renameProperty","prop","_obj","defaultConverter","type","fromValue","notEqual","old","defaultPropertyDeclaration","ReactiveElement","initializer","name","options","key","descriptor","get","set","oldValue","superCtor","props","propKeys","p","metadata","properties","attr","elementStyles","attribute","res","i","controller","instanceProperties","elementProperties","c","_requestedUpdate","_old","attrValue","ctor","propName","converter","convertedValue","useNewValue","newValue","useDefault","reflect","wrapped","initializeValue","e","result","shadowedProperties","shouldUpdate","changedProperties","_changedProperties","ensureOwnWarnings","debugLogRenderId","wrap","node","policy","identityFunction","noopSanitizer","_node","_name","_type","setSanitizer","newSanitizer","sanitizerFactoryInternal","_testOnlyClearSanitizerFactoryDoNotCallOrElse","createSanitizer","boundAttributeSuffix","marker","markerMatch","nodeMarker","d","createMarker","isPrimitive","isArray","isIterable","SPACE_CHAR","ATTR_VALUE_CHAR","NAME_CHAR","textEndRegex","COMMENT_START","TAG_NAME","DYNAMIC_TAG_NAME","commentEndRegex","comment2EndRegex","tagEndRegex","ENTIRE_MATCH","ATTRIBUTE_NAME","SPACES_AND_EQUALS","QUOTE_CHAR","singleQuoteAttrEndRegex","doubleQuoteAttrEndRegex","rawTextElement","HTML_RESULT","SVG_RESULT","MATHML_RESULT","ATTRIBUTE_PART","CHILD_PART","PROPERTY_PART","BOOLEAN_ATTRIBUTE_PART","EVENT_PART","ELEMENT_PART","COMMENT_PART","tag","val","html","noChange","nothing","templateCache","walker","trustFromTemplateString","tsa","stringFromTSA","message","getTemplateHtml","l","attrNames","rawTextEndRegex","regex","attrNameEndIndex","attrName","lastIndex","match","end","htmlResult","Template","nodeIndex","attrNameIndex","partCount","parts","wrapper","m","realName","statics","PropertyPart","BooleanAttributePart","EventPart","AttributePart","_options","el","resolveDirective","part","parent","attributeIndex","currentDirective","nextDirectiveConstructor","TemplateInstance","template","content","fragment","partIndex","templatePart","ChildPart","ElementPart","ChildPart$1","startNode","endNode","parentNode","directiveParent","parentNodeName","textNode","instance","itemParts","itemPart","item","start","from","n","isConnected","element","valueIndex","noCommit","change","newListener","oldListener","shouldRemoveListener","shouldAddListener","_$LH","render","container","renderId","partOwnerNode","LitElement","customElement","tagName","classOrTarget","context","legacyProperty","proto","hasOwnProperty","standardProperty","target","kind","property","protoOrTarget","nameOrContext","state","MAX_ASSISTANT_NAME","MAX_ASSISTANT_AVATAR","DEFAULT_ASSISTANT_NAME","coerceIdentityValue","maxLength","trimmed","normalizeAssistantIdentity","input","avatar","resolveInjectedAssistantIdentity","KEY","loadSettings","defaults","raw","parsed","saveSettings","next","parseAgentSessionKey","sessionKey","agentId","rest","TAB_GROUPS","TAB_PATHS","PATH_TO_TAB","tab","path","normalizeBasePath","basePath","base","normalizePath","normalized","pathForTab","tabFromPath","pathname","inferBasePathFromPathname","segments","candidate","prefix","iconForTab","titleForTab","subtitleForTab","icons","QUICK_TAG_RE","FINAL_TAG_RE","THINKING_TAG_RE","findCodeRegions","text","regions","fencedRe","inlineRe","r","a","b","isInsideCode","pos","applyTrim","mode","stripReasoningTagsFromText","cleaned","finalMatches","preCodeRegions","codeRegions","inThinking","isClose","formatMs","ms","formatAgo","diff","sec","min","hr","formatRelativeTimestamp","formatDurationMs","formatList","clampText","max","truncateText","toNumber","fallback","stripThinkingTags","ENVELOPE_PREFIX","ENVELOPE_CHANNELS","textCache","thinkingCache","looksLikeEnvelopeHeader","header","label","stripEnvelope","extractText","role","joined","extractTextCached","obj","extractThinking","rawText","extractRawText","extracted","extractThinkingCached","formatReasoningMarkdown","lines","line","warnedWeakCrypto","uuidFromBytes","bytes","hex","weakRandomBytes","now","warnWeakCryptoOnce","generateUUID","cryptoLike","loadChatHistory","err","dataUrlToBase64","dataUrl","sendChatMessage","attachments","msg","hasAttachments","contentBlocks","att","runId","apiAttachments","error","abortChatRun","handleChatEvent","payload","current","loadSessions","params","activeMinutes","limit","patchSession","patch","deleteSession","TOOL_STREAM_LIMIT","TOOL_STREAM_THROTTLE_MS","TOOL_OUTPUT_CHAR_LIMIT","extractToolOutputText","record","entry","formatToolOutput","contentText","truncated","buildToolStreamMessage","trimToolStream","host","overflow","removed","id","syncToolStreamMessages","flushToolStreamSync","scheduleToolStreamSync","force","resetToolStream","COMPACTION_TOAST_DURATION_MS","handleCompactionEvent","data","phase","handleAgentEvent","toolCallId","args","output","scheduleChatScroll","pickScrollTarget","overflowY","distanceFromBottom","retryDelay","latest","latestDistanceFromBottom","scheduleLogsScroll","handleChatScroll","handleLogsScroll","resetChatScroll","exportLogs","blob","url","anchor","stamp","observeTopbar","topbar","update","height","cloneConfigObject","serializeConfigForm","form","setPathValue","nextKey","lastKey","removePathValue","loadConfig","applyConfigSnapshot","loadConfigSchema","applyConfigSchema","snapshot","rawFromSnapshot","saveConfig","baseHash","applyConfig","runUpdate","updateConfigFormValue","removeConfigFormValue","loadCronStatus","loadCronJobs","buildCronSchedule","amount","unit","expr","buildCronPayload","timeoutSeconds","addCronJob","schedule","job","toggleCronJob","enabled","runCronJob","loadCronRuns","removeCronJob","jobId","loadChannels","probe","startWhatsAppLogin","waitWhatsAppLogin","logoutWhatsApp","loadDebug","status","health","models","heartbeat","modelPayload","callDebugMethod","LOG_BUFFER_LIMIT","LEVELS","parseMaybeJsonString","normalizeLevel","lowered","parseLogLine","meta","time","level","contextCandidate","contextObj","subsystem","loadLogs","opts","entries","shouldReset","ed25519_CURVE","P","N","Gx","Gy","_a","_d","h","L","L2","captureTrace","isBig","isStr","isBytes","abytes","length","title","len","needsLen","ofLen","got","u8n","u8fr","buf","padh","pad","bytesToHex","C","_ch","ch","hexToBytes","hl","al","array","ai","hi","n1","n2","cr","subtle","concatBytes","arrs","sum","randomBytes","big","assertRange","M","modN","invert","num","md","x","u","q","callHash","fn","hashes","apoint","Point","B256","X","Y","Z","T","zip215","normed","lastByte","y","bytesToNumLE","y2","isValid","uvRatio","isXOdd","isLastByteOdd","X2","Y2","Z2","Z4","aX2","left","right","XY","ZT","other","X1","Y1","Z1","X1Z2","X2Z1","Y1Z2","Y2Z1","I","A","B","D","x1y1","E","G","F","H","X3","Y3","T3","Z3","T1","T2","safe","wNAF","f","scalar","iz","numTo32bLE","pow2","power","pow_2_252_3","b2","b4","b5","b10","b20","b40","b80","b160","b240","b250","RM1","v3","v7","pow","vx2","root1","root2","useRoot1","useRoot2","noRoot","modL_LE","hash","sha512a","sha512s","hash2extK","hashed","head","point","pointBytes","getExtendedPublicKeyAsync","secretKey","getExtendedPublicKey","getPublicKeyAsync","hashFinishA","_sign","rBytes","R","S","signAsync","randomSecretKey","seed","utils","W","scalarBits","pwindows","pwindowSize","precompute","points","w","Gpows","ctneg","cnd","comp","pow_2_w","maxNum","mask","shiftBy","wbits","off","offF","offP","isEven","isNeg","STORAGE_KEY","base64UrlEncode","binary","byte","base64UrlDecode","padded","out","fingerprintPublicKey","publicKey","generateIdentity","privateKey","loadOrCreateDeviceIdentity","derivedId","updated","identity","stored","signDevicePayload","privateKeyBase64Url","sig","normalizeRole","normalizeScopes","scopes","scope","readStore","writeStore","store","loadDeviceAuthToken","storeDeviceAuthToken","existing","clearDeviceAuthToken","loadDevices","approveDevicePairing","requestId","rejectDevicePairing","rotateDeviceToken","revokeDeviceToken","loadNodes","resolveExecApprovalsRpc","nodeId","resolveExecApprovalsSaveRpc","loadExecApprovals","rpc","applyExecApprovalsSnapshot","saveExecApprovals","file","updateExecApprovalsFormValue","removeExecApprovalsFormValue","loadPresence","setSkillMessage","getErrorMessage","loadSkills","updateSkillEdit","skillKey","updateSkillEnabled","saveSkillApiKey","apiKey","installSkill","installId","getSystemTheme","resolveTheme","clamp01","hasReducedMotionPreference","cleanupThemeTransition","root","startThemeTransition","nextTheme","applyTheme","currentTheme","documentReference","document_","prefersReducedMotion","xPercent","yPercent","rect","transition","startNodesPolling","stopNodesPolling","startLogsPolling","stopLogsPolling","startDebugPolling","stopDebugPolling","applySettings","applyResolvedTheme","setLastActiveSessionKey","applySettingsFromUrl","tokenRaw","passwordRaw","sessionRaw","gatewayUrlRaw","shouldCleanUrl","token","password","session","gatewayUrl","setTab","refreshActiveTab","syncUrlWithTab","setTheme","loadOverview","loadChannelsTab","loadCron","refreshChat","inferBasePath","configured","syncThemeWithSettings","resolved","attachThemeListener","detachThemeListener","syncTabWithLocation","replace","setTabFromRoute","onPopState","targetPath","currentPath","syncUrlWithSessionKey","isChatBusy","isChatStopCommand","handleAbortChat","enqueueChatMessage","sendChatMessageNow","ok","flushChatQueue","removeQueuedMessage","handleSendChat","messageOverride","previousDraft","attachmentsToSend","refreshChatAvatar","flushChatQueueForEvent","resolveAgentIdForSession","buildAvatarMetaUrl","encoded","avatarUrl","PartType","directive","Directive","_partInfo","_part","insertPart","containerPart","refPart","refNode","oldParent","parentChanged","newConnectionState","setChildPartValue","RESET_VALUE","setCommittedValue","getCommittedValue","removePart","generateMap","list","map","RepeatDirective","partInfo","items","keyFnOrTemplate","keyFn","keys","index","oldParts","newValues","newKeys","oldKeys","newParts","newKeyToIndexMap","oldKeyToIndexMap","oldHead","oldTail","newHead","newTail","oldIndex","oldPart","newPart","repeat","normalizeMessage","hasToolId","contentRaw","contentItems","hasToolContent","t","hasToolName","timestamp","normalizeRoleForGrouping","lower","isToolResultMessage","UnsafeHTMLDirective","unsafeHTML","setPrototypeOf","isFrozen","freeze","seal","create","apply","construct","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","transformCaseFunc","lcElement","cleanArray","clone","object","newObject","lookupGetter","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parentTagName","_forceRemove","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","hook","_sanitizeElements","_isBasicCustomElement","childNodes","childCount","childClone","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","namespaceURI","initValue","_sanitizeShadowDOM","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","entryPoint","hookFunction","purify","k","me","xe","be","Re","Te","re","se","Oe","Q","we","ye","Pe","j","Se","ie","$e","U","te","_e","Le","Me","ze","oe","Ae","K","ae","Ce","le","Ie","Ee","Be","ue","qe","ve","pe","De","He","Ze","Ge","Ne","Qe","Fe","je","ce","he","Ue","ne","Ke","We","Xe","ke","J","o","z","de","ge","Je","g","O","V","ee","fe","$","_","marked","allowedTags","allowedAttrs","hooksInstalled","MARKDOWN_CHAR_LIMIT","MARKDOWN_PARSE_LIMIT","MARKDOWN_CACHE_LIMIT","MARKDOWN_CACHE_MAX_CHARS","markdownCache","getCachedMarkdown","cached","setCachedMarkdown","oldest","installHooks","toSanitizedMarkdownHtml","markdown","escapeHtml","sanitized","rendered","COPIED_FOR_MS","ERROR_FOR_MS","COPY_LABEL","COPIED_LABEL","ERROR_LABEL","copyTextToClipboard","setButtonLabel","button","createCopyButton","idleLabel","btn","copied","renderCopyAsMarkdownButton","TOOL_DISPLAY_CONFIG","rawConfig","FALLBACK","TOOL_MAP","normalizeToolName","defaultTitle","normalizeVerb","coerceDisplayValue","firstLine","preview","lookupValueByPath","segment","resolveDetailFromKeys","display","resolveReadDetail","offset","resolveWriteDetail","resolveActionSpec","spec","action","resolveToolDisplay","icon","emoji","actionRaw","actionSpec","verb","detail","detailKeys","shortenHomeInString","formatToolDetail","TOOL_INLINE_THRESHOLD","PREVIEW_MAX_LINES","PREVIEW_MAX_CHARS","formatToolOutputForSidebar","getTruncatedPreview","allLines","renderActivityFeedItem","card","statusClass","durationText","renderActivityFeed","cards","maxVisible","collapsed","feed","extractToolCards","normalizeContent","coerceArgs","extractToolText","renderToolCardSidebar","onOpenSidebar","hasText","canClick","handleClick","info","isShort","showCollapsed","showInline","isEmpty","THINKING_VERBS","thinkingVerbIndex","getNextThinkingVerb","extractImages","images","block","source","mediaType","imageUrl","renderReadingIndicatorGroup","assistant","renderAvatar","renderStreamingGroup","startedAt","renderGroupedMessage","renderMessageGroup","group","normalizedRole","assistantName","who","roleClass","assistantAvatar","initial","className","isAvatarUrl","renderMessageImages","img","isToolResult","toolCards","hasToolCards","hasImages","extractedText","extractedThinking","markdownBase","reasoningMarkdown","canCopyMarkdown","bubbleClasses","renderMarkdownSidebar","ResizableDivider","containerWidth","deltaRatio","newRatio","__decorateClass","renderCompactionIndicator","generateAttachmentId","handlePaste","imageItems","reader","newAttachment","renderAttachmentPreview","renderChat","canCompose","isBusy","canAbort","reasoningLevel","row","showReasoning","assistantIdentity","composePlaceholder","splitRatio","sidebarOpen","thread","buildChatItems","CHAT_HISTORY_RENDER_LIMIT","groupMessages","currentGroup","history","tools","historyStart","messageKey","messageId","schemaType","schema","defaultValue","pathKey","hintForPath","hints","direct","hintKey","hint","hintSegments","humanize","isSensitivePath","META_KEYS","isAnySchema","jsonValue","renderNode","unsupported","disabled","onPatch","showLabel","help","nonNull","extractLiteral","literals","allLiterals","resolvedValue","lit","renderSelect","primitiveTypes","variant","normalizedTypes","hasString","hasNumber","renderTextInput","opt","renderObject","renderArray","displayValue","renderNumberInput","inputType","isSensitive","placeholder","numValue","currentIndex","unset","sorted","orderA","orderB","reserved","additional","allowExtra","propKey","renderMapField","itemsSchema","arr","reservedKeys","anySchema","entryValue","valuePath","sectionIcons","SECTION_META","getSectionIcon","matchesSearch","query","schemaMatches","propSchema","unions","renderConfigForm","searchQuery","activeSection","activeSubsection","filteredEntries","subsectionContext","sectionSchema","sectionKey","subsectionKey","description","sectionValue","scopedValue","normalizeEnum","filtered","nullable","enumValues","analyzeConfigSchema","normalizeSchemaNode","pathLabel","union","normalizeUnion","enumNullable","normalizedProps","remaining","unique","sidebarIcons","SECTIONS","ALL_SUBSECTION","resolveSectionMeta","resolveSubsections","uiHints","subKey","order","computeDiff","original","changes","compare","orig","curr","origObj","currObj","allKeys","truncateValue","maxLen","str","renderConfig","validity","analysis","formUnsafe","schemaProps","availableSections","knownKeys","extraSections","allSections","activeSectionSchema","activeSectionMeta","subsections","allowSubnav","isAllSubsection","effectiveSubsection","hasRawChanges","hasChanges","canSaveForm","canSave","canApply","canUpdate","section","formatDuration","channelEnabled","channels","channelStatus","running","connected","accountActive","account","getChannelAccountCount","channelAccounts","renderChannelAccountCount","count","resolveSchemaNode","resolveChannelValue","config","channelId","fromChannels","renderChannelConfigForm","configValue","renderChannelConfigSection","renderDiscordCard","discord","accountCountLabel","renderGoogleChatCard","googleChat","renderIMessageCard","imessage","isFormDirty","renderNostrProfileForm","callbacks","accountId","isDirty","renderField","field","inputId","renderPicturePreview","picture","createNostrProfileFormState","profile","truncatePubkey","pubkey","renderNostrCard","nostr","nostrAccounts","profileFormState","profileFormCallbacks","onEditProfile","primaryAccount","summaryConfigured","summaryRunning","summaryPublicKey","summaryLastStartAt","summaryLastError","hasMultipleAccounts","showingForm","renderAccountCard","displayName","renderProfileSection","about","nip05","hasAnyProfileData","renderSignalCard","signal","renderSlackCard","slack","renderTelegramCard","telegram","telegramAccounts","botUsername","renderWhatsAppCard","whatsapp","renderChannels","orderedChannels","resolveChannelOrder","channel","renderChannel","showForm","renderGenericChannelCard","resolveChannelLabel","lastError","accounts","renderGenericAccount","resolveChannelMetaMap","RECENT_ACTIVITY_THRESHOLD_MS","hasRecentActivity","deriveRunningStatus","deriveConnectedStatus","runningStatus","connectedStatus","formatPresenceSummary","ip","version","formatPresenceAge","ts","formatNextRun","formatSessionTokens","total","ctx","formatEventPayload","formatCronSchedule","buildChannelOptions","seen","renderCron","channelOptions","selectedRunTitle","orderedRuns","renderScheduleFields","renderJob","renderRun","itemClass","renderJobPayload","renderJobState","delivery","deliveryTarget","formatStateRelative","nextRunAtMs","lastRunAtMs","chatUrl","renderDebug","securitySummary","critical","warn","securityTone","securityLabel","evt","renderInstances","renderEntry","lastInput","roles","scopesLabel","formatTime","date","matchesFilter","needle","renderLogs","levelFiltered","exportLabel","resolveConfigAgents","agentsNode","agents","isDefault","resolveNodeTargets","nodes","requiredCommands","required","cmd","EXEC_APPROVALS_DEFAULT_SCOPE","SECURITY_OPTIONS","ASK_OPTIONS","normalizeSecurity","normalizeAsk","resolveExecApprovalsDefaults","resolveSharedConfigAgents","resolveExecApprovalsAgents","configAgents","approvalsAgents","merged","agent","aLabel","bLabel","resolveExecApprovalsScope","selected","resolveExecApprovalsState","ready","targetNodes","resolveExecApprovalsNodes","targetNodeId","selectedScope","selectedAgent","allowlist","renderExecApprovals","targetReady","renderExecApprovalsTarget","renderExecApprovalsTabs","renderExecApprovalsPolicy","renderExecApprovalsAllowlist","hasNodes","nodeValue","first","isDefaults","agentSecurity","agentAsk","agentAskFallback","securityValue","askValue","askFallbackValue","autoOverride","autoEffective","autoIsDefault","option","allowlistPath","renderAllowlistEntry","lastUsed","lastCommand","lastPath","renderNodes","bindingState","resolveBindingsState","approvalsState","renderBindings","renderDevices","pending","paired","req","renderPendingDevice","device","renderPairedDevice","age","repair","tokens","renderTokenRow","deviceId","when","resolveExecNodes","defaultBinding","resolveAgentBindings","supportsBinding","renderAgentBinding","bindingValue","fallbackAgent","exec","execEntry","binding","caps","commands","buildAlerts","alerts","renderAlertBanner","alert","cls","renderHealthCard","renderOverview","uptimeMs","uptime","tick","gatewayStatus","cronStatus","channelsStatus","authHint","hasToken","hasPassword","THINK_LEVELS","BINARY_THINK_LEVELS","VERBOSE_LEVELS","REASONING_LEVELS","normalizeProviderId","provider","isBinaryThinkingProvider","resolveThinkLevelOptions","resolveThinkLevelDisplay","isBinary","resolveThinkLevelPatchValue","renderSessions","rows","renderRow","onDelete","rawThinking","isBinaryThinking","thinking","thinkLevels","verbose","reasoning","canLink","formatRemaining","totalSeconds","minutes","renderMetaRow","renderExecApprovalPrompt","active","request","remainingMs","queueCount","renderSkills","skills","filter","skill","renderSkill","busy","canInstall","missing","reasons","renderTab","href","renderChatControls","sessionOptions","resolveSessionOptions","disableThinkingToggle","disableFocusToggle","showThinking","focusActive","refreshIcon","focusIcon","sessions","resolvedCurrent","THEME_ORDER","renderThemeToggle","renderMonitorIcon","renderSunIcon","renderMoonIcon","AVATAR_DATA_RE","AVATAR_HTTP_RE","resolveAssistantAvatarUrl","renderApp","presenceCount","sessionsCount","cronNext","chatDisabledReason","isChat","chatFocus","assistantAvatarUrl","chatAvatarUrl","isGroupCollapsed","hasActiveTab","agentIndex","ratio","DEFAULT_LOG_LEVEL_FILTERS","DEFAULT_CRON_FORM","loadAgents","GATEWAY_CLIENT_IDS","GATEWAY_CLIENT_NAMES","GATEWAY_CLIENT_MODES","buildDeviceAuthPayload","CONNECT_FAILED_CLOSE_CODE","GatewayBrowserClient","ev","reason","delay","isSecureContext","deviceIdentity","canFallbackToShared","authToken","storedToken","auth","signedAtMs","signature","hello","frame","seq","method","resolve","reject","isRecord","parseExecApprovalRequested","command","createdAtMs","expiresAtMs","parseExecApprovalResolved","pruneExecApprovalQueue","queue","addExecApproval","removeExecApproval","loadAssistantIdentity","normalizeSessionKeyForDefaults","mainSessionKey","mainKey","defaultAgentId","applySessionDefaults","resolvedSessionKey","resolvedSettingsSessionKey","resolvedLastActiveSessionKey","nextSessionKey","nextSettings","shouldUpdateSettings","connectGateway","applySnapshot","handleGatewayEvent","expected","received","handleGatewayEventUnsafe","handleConnected","handleFirstUpdated","handleDisconnected","handleUpdated","changed","forcedByTab","forcedByLoad","handleWhatsAppStart","handleWhatsAppWait","handleWhatsAppLogout","handleChannelConfigSave","handleChannelConfigReload","parseValidationErrors","details","errors","rawField","resolveNostrAccountId","buildNostrProfileUrl","handleNostrProfileEdit","handleNostrProfileCancel","handleNostrProfileFieldChange","handleNostrProfileToggleAdvanced","handleNostrProfileSave","response","errorMessage","handleNostrProfileImport","nextValues","showAdvanced","injectedAssistantIdentity","resolveOnboardingMode","PoolbotApp","onPopStateInternal","connectGatewayInternal","handleChatScrollInternal","handleLogsScrollInternal","exportLogsInternal","resetToolStreamInternal","resetChatScrollInternal","loadAssistantIdentityInternal","applySettingsInternal","setTabInternal","setThemeInternal","loadOverviewInternal","loadCronInternal","handleAbortChatInternal","removeQueuedMessageInternal","handleSendChatInternal","handleWhatsAppStartInternal","handleWhatsAppWaitInternal","handleWhatsAppLogoutInternal","handleChannelConfigSaveInternal","handleChannelConfigReloadInternal","handleNostrProfileEditInternal","handleNostrProfileCancelInternal","handleNostrProfileFieldChangeInternal","handleNostrProfileSaveInternal","handleNostrProfileImportInternal","handleNostrProfileToggleAdvancedInternal","decision"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,27,40,41,42,44,45,46]}