@things-factory/ai-assistant 10.1.213 → 10.1.215
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/components/assistant-dock.ts +6 -3
- package/client/components/assistant-selection-bar.test.ts +42 -0
- package/client/components/assistant-selection-bar.ts +129 -0
- package/client/components/assistant-session-manager.ts +263 -12
- package/client/index.ts +2 -0
- package/client/utils/assistant-selection.test.ts +25 -1
- package/client/utils/assistant-selection.ts +27 -0
- package/client/utils/assistant-session-actions.ts +12 -0
- package/client/utils/assistant-session-admin.ts +70 -5
- package/dist-client/components/assistant-dock.js +6 -3
- package/dist-client/components/assistant-dock.js.map +1 -1
- package/dist-client/components/assistant-selection-bar.d.ts +44 -0
- package/dist-client/components/assistant-selection-bar.js +149 -0
- package/dist-client/components/assistant-selection-bar.js.map +1 -0
- package/dist-client/components/assistant-selection-bar.test.d.ts +1 -0
- package/dist-client/components/assistant-selection-bar.test.js +38 -0
- package/dist-client/components/assistant-selection-bar.test.js.map +1 -0
- package/dist-client/components/assistant-session-manager.d.ts +37 -0
- package/dist-client/components/assistant-session-manager.js +281 -13
- package/dist-client/components/assistant-session-manager.js.map +1 -1
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/utils/assistant-selection.d.ts +24 -0
- package/dist-client/utils/assistant-selection.js +24 -0
- package/dist-client/utils/assistant-selection.js.map +1 -1
- package/dist-client/utils/assistant-selection.test.js +21 -1
- package/dist-client/utils/assistant-selection.test.js.map +1 -1
- package/dist-client/utils/assistant-session-actions.d.ts +15 -0
- package/dist-client/utils/assistant-session-actions.js +11 -0
- package/dist-client/utils/assistant-session-actions.js.map +1 -1
- package/dist-client/utils/assistant-session-admin.d.ts +32 -1
- package/dist-client/utils/assistant-session-admin.js +36 -5
- package/dist-client/utils/assistant-session-admin.js.map +1 -1
- package/dist-server/service/assistant-chat-resolver.js +6 -4
- package/dist-server/service/assistant-chat-resolver.js.map +1 -1
- package/dist-server/service/assistant-mode/index.d.ts +1 -1
- package/dist-server/service/assistant-mode/index.js +2 -1
- package/dist-server/service/assistant-mode/index.js.map +1 -1
- package/dist-server/service/assistant-mode/mode-categories.d.ts +30 -0
- package/dist-server/service/assistant-mode/mode-categories.js +35 -2
- package/dist-server/service/assistant-mode/mode-categories.js.map +1 -1
- package/dist-server/service/chat-session/session-cleanup.d.ts +28 -0
- package/dist-server/service/chat-session/session-cleanup.js +69 -0
- package/dist-server/service/chat-session/session-cleanup.js.map +1 -0
- package/dist-server/service/chat-session/session-inbox.d.ts +15 -0
- package/dist-server/service/chat-session/session-inbox.js +11 -0
- package/dist-server/service/chat-session/session-inbox.js.map +1 -1
- package/dist-server/service/chat-session/session-purge.d.ts +4 -0
- package/dist-server/service/chat-session/session-purge.js +45 -11
- package/dist-server/service/chat-session/session-purge.js.map +1 -1
- package/dist-server/service/chat-session-resolver.d.ts +24 -2
- package/dist-server/service/chat-session-resolver.js +193 -13
- package/dist-server/service/chat-session-resolver.js.map +1 -1
- package/dist-server/service/data-read/list-read.d.ts +3 -1
- package/dist-server/service/data-read/list-read.js +27 -2
- package/dist-server/service/data-read/list-read.js.map +1 -1
- package/dist-server/service/data-read/read-target.d.ts +16 -0
- package/dist-server/service/data-read/read-target.js +18 -1
- package/dist-server/service/data-read/read-target.js.map +1 -1
- package/dist-server/service/data-read/read-tools.js +3 -1
- package/dist-server/service/data-read/read-tools.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/server/service/assistant-chat-resolver.ts +7 -5
- package/server/service/assistant-mode/conversation-category.test.ts +15 -2
- package/server/service/assistant-mode/index.ts +1 -1
- package/server/service/assistant-mode/mode-categories.ts +48 -2
- package/server/service/assistant-mode/mode-front.test.ts +27 -1
- package/server/service/assistant-mode/open-subject-door.test.ts +3 -1
- package/server/service/chat-session/session-cleanup.test.ts +83 -0
- package/server/service/chat-session/session-cleanup.ts +69 -0
- package/server/service/chat-session/session-inbox.ts +13 -0
- package/server/service/chat-session/session-purge.ts +46 -10
- package/server/service/chat-session-resolver.ts +150 -14
- package/server/service/data-read/list-read.ts +30 -3
- package/server/service/data-read/list-status.test.ts +46 -0
- package/server/service/data-read/read-target.ts +32 -1
- package/server/service/data-read/read-tools.ts +2 -1
- package/test/assistant-dock.test.ts +12 -1
- package/test/assistant-session-manager.test.ts +53 -1
- package/test/open-doors.test.ts +3 -1
- package/translations/en.json +45 -2
- package/translations/es.json +45 -2
- package/translations/ja.json +45 -2
- package/translations/ko.json +45 -2
- package/translations/ms.json +45 -2
- package/translations/zh.json +45 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-session-manager.js","sourceRoot":"","sources":["../../client/components/assistant-session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing, type PropertyValues, type TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup'\nimport '@operato/popup/ox-popup-menu.js'\nimport { OxPopupMenu } from '@operato/popup/ox-popup-menu.js'\n\nimport {\n assistantSessionAdmin,\n sessionActions,\n type AssistantSessionAdmin,\n type AssistantSessionEntry,\n type AssistantSessionFilters,\n type SessionVisibility\n} from '../utils/assistant-session-admin.js'\n\nconst PAGE = 30\n\n\nconst t = (key: string, defaultValue: string, options: Record<string, unknown> = {}) =>\n i18next.t(`ai-assistant.session.${key}`, { defaultValue, ...options })\n\n/**\n * The conversations on one anchor, managed - `<ox-assistant-session-manager>`.\n *\n * Search, a filter (all / mine / including hidden), paging, and on each row: open, rename, hide or\n * unhide, private ⇄ public, delete. Taken from operato-twin's dock, where it was written first, so every\n * dock gets it by placing this element (typically behind the toolbar's \"All History\").\n *\n * ── What is the host's ──────────────────────────────────────────────────────────\n * Opening and starting a conversation belong to the dock's session controller, so this element asks\n * with the toolbar's own events and does not open anything itself:\n * assistant-session-select { sessionId } open that conversation\n * assistant-session-reset start a new one\n * assistant-session-changed { sessionId, change: 'renamed' | 'hidden' | 'unhidden' | 'removed' | 'visibility' | 'left' }\n * a row changed - the host refreshes its tabs; if the open\n * conversation was removed or hidden, it moves off it\n *\n * ── What is the server's ────────────────────────────────────────────────────────\n * Who may do what (`sessionActions`): rename any participant, hide anyone for their own list, delete\n * the creator, visibility the owner. The buttons follow those hints; the doors decide again.\n *\n * ── Asking before what cannot be undone ─────────────────────────────────────────\n * Delete, and opening a private conversation to the domain, ask on the row itself - [Cancel][OK].\n * Making it private, hiding and renaming do not: each can be undone from the same row.\n */\n@customElement('ox-assistant-session-manager')\nexport class AssistantSessionManager extends LitElement {\n static styles = css`\n /* One scale for the list: name 13, preview 12, meta 11 - the rest of the dock's sizes. */\n .open-row { display: block; flex: 1; min-width: 0; text-align: start; border: 0; background: transparent; color: inherit; font: inherit; padding: 0; cursor: pointer; }\n .meta { display: block; margin-top: 2px; font-size: 11px; color: var(--md-sys-color-on-surface-variant); }\n /* Open and private must part at a glance - an open row is read by everyone in the domain (2026-09-30). */\n .audience { display: inline-flex; align-items: center; gap: 3px; vertical-align: middle; }\n .audience md-icon { --md-icon-size: 14px; }\n /* The dock's warning colour, fixed across applications - see assistant-dock.ts. */\n :host { --assistant-open-edge: #c47f00; --assistant-open-surface: #f2b01e; --assistant-open-ink: #2e2100; }\n .audience.open { padding: 0 5px 0 3px; border-radius: 4px; background: var(--assistant-open-surface); color: var(--assistant-open-ink); font-weight: 600; }\n .audience md-icon { --md-icon-size: 12px; }\n .row.open-audience { box-shadow: inset 4px 0 0 var(--assistant-open-edge); }\n .more-menu { flex: none; border: 0; border-radius: 4px; padding: 2px 6px; background: none; color: var(--md-sys-color-on-surface-variant); font-size: 14px; line-height: 1; cursor: pointer; }\n .more-menu:hover { background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface); }\n button:focus-visible { outline: 2px solid var(--md-sys-color-primary); outline-offset: 2px; }\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n font-size: 13px;\n color: var(--md-sys-color-on-surface);\n }\n\n .bar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 10px 6px;\n }\n\n .bar input,\n .bar select {\n min-width: 0;\n height: 26px;\n font-size: 12px;\n box-sizing: border-box;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n font: inherit;\n padding: 0 8px;\n }\n\n .bar input {\n flex: 1;\n }\n\n .new {\n flex: none;\n border: 0;\n border-radius: 6px;\n padding: 4px 8px;\n background: transparent;\n color: var(--md-sys-color-primary);\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n }\n\n /* Always open, one quiet line under the search - the same small size as the search. */\n .filters {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n padding: 0 10px 8px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .filters select {\n height: 22px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 4px;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n font: inherit;\n padding: 0 4px;\n }\n\n .filters label {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n cursor: pointer;\n }\n\n .filters input[type='checkbox'] {\n margin: 0;\n }\n\n .filters .clear {\n margin-left: auto;\n border: 0;\n background: none;\n padding: 0;\n color: var(--md-sys-color-primary);\n font: inherit;\n cursor: pointer;\n }\n\n .list {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n\n .row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n cursor: pointer;\n }\n\n .row:hover,\n .row.current {\n background: var(--md-sys-color-surface-container);\n }\n\n .row.hidden {\n opacity: 0.6;\n }\n\n .dot {\n flex: none;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n\n .row.unread .dot {\n background: var(--md-sys-color-primary);\n }\n\n .row md-icon {\n --md-icon-size: 16px;\n flex: none;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .body {\n flex: 1;\n min-width: 0;\n }\n\n .title,\n .prev {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .row.unread .title {\n font-weight: 700;\n }\n\n .prev {\n margin-top: 1px;\n color: var(--md-sys-color-on-surface-variant);\n font-size: 12px;\n }\n\n .rename {\n flex: 1;\n min-width: 0;\n height: 26px;\n border: 1px solid var(--md-sys-color-primary);\n border-radius: 6px;\n padding: 0 6px;\n font: inherit;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n }\n\n .ask {\n display: grid;\n gap: 6px;\n padding: 10px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n background: var(--md-sys-color-surface-container);\n }\n\n .ask .buttons {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .ask button {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n padding: 4px 10px;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n\n .ask button.ok {\n border-color: var(--md-sys-color-primary);\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n }\n\n .ask button.ok.danger {\n border-color: var(--md-sys-color-error);\n background: var(--md-sys-color-error);\n color: var(--md-sys-color-on-error);\n }\n\n .note,\n .empty {\n padding: 14px 12px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n [role='alert'] {\n color: var(--md-sys-color-error);\n }\n\n .more,\n .hiddenfilter {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n width: 100%;\n padding: 8px;\n border: 0;\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: none;\n color: var(--md-sys-color-on-surface-variant);\n font: inherit;\n cursor: pointer;\n }\n\n .hiddenfilter md-icon {\n --md-icon-size: 16px;\n }\n `\n\n /** The anchor whose conversations are listed - the same one the dock's session controller opened. */\n @property({ type: String }) anchorType = ''\n @property({ type: String }) anchorId = ''\n /** The conversation the dock has open - marked in the list. */\n @property({ type: String }) sessionId = ''\n /** The doors. Replaceable for tests; a host normally leaves it. */\n @property({ attribute: false }) admin: AssistantSessionAdmin = assistantSessionAdmin\n /** The conversation kind (mode) open in the dock - the list's default scope (§2-6). */\n @property({ type: String }) kind = ''\n\n @state() private entries: AssistantSessionEntry[] = []\n @state() private total = 0\n @state() private hiddenCount = 0\n @state() private search = ''\n @state() private whose: NonNullable<AssistantSessionFilters['whose']> = 'all'\n @state() private visibility: NonNullable<AssistantSessionFilters['visibility']> = 'all'\n @state() private includeHidden = false\n @state() private unreadOnly = false\n @state() private pageSize = PAGE\n @state() private loading = false\n @state() private error = ''\n @state() private renamingId = ''\n\n /*\n * The search and the filters stand open together, always (2026-10-12) - a filter behind a \"Filters\" button is one\n * more thing to find before finding the conversation. The list is this screen's conversations, so there is no kind\n * to choose.\n */\n private get filtering() {\n return !!this.search.trim() || this.whose !== 'all' || this.visibility !== 'all' || this.includeHidden || this.unreadOnly\n }\n\n private clearFilters() {\n clearTimeout(this.searchTimer)\n this.refilter(() => {\n this.search = ''\n this.whose = 'all'\n this.visibility = 'all'\n this.includeHidden = this.unreadOnly = false\n })\n }\n\n private generation = 0\n private searchTimer?: ReturnType<typeof setTimeout>\n\n /** Read the list again - the host calls this after it opened or started a conversation. */\n async reload(): Promise<void> {\n const generation = ++this.generation\n if (!this.anchorType || !this.anchorId) {\n this.entries = []\n this.total = this.hiddenCount = 0\n return\n }\n\n this.loading = true\n this.error = ''\n try {\n /*\n * Paging reads again from the start rather than appending - live activity reorders the list, and\n * appending a later page to an earlier order duplicates and drops rows.\n */\n const page = await this.admin.inbox({\n anchorType: this.anchorType,\n anchorId: this.anchorId,\n search: this.search,\n filters: {\n kind: this.kind,\n whose: this.whose,\n visibility: this.visibility,\n includeHidden: this.includeHidden,\n unreadOnly: this.unreadOnly\n },\n limit: this.pageSize,\n offset: 0\n })\n if (generation !== this.generation) return\n this.entries = page.entries\n this.total = page.total\n this.hiddenCount = page.hiddenCount\n } catch (error) {\n if (generation !== this.generation) return\n this.entries = []\n this.total = this.hiddenCount = 0\n this.error = (error as Error).message || t('failed', 'could not load the conversation list.')\n } finally {\n if (generation === this.generation) this.loading = false\n }\n }\n\n protected updated(changed: PropertyValues) {\n if (changed.has('anchorType') || changed.has('anchorId') || changed.has('admin') || changed.has('kind')) void this.reload()\n\n /*\n * The rename box takes the keys the moment it opens, with the name selected. `autofocus` works once\n * per document, so the second rename opened a box that ignored the typing (2026-09-24, operato-ecs).\n */\n if (changed.has('renamingId') && this.renamingId) {\n const input = this.renderRoot.querySelector('input.rename') as HTMLInputElement | null\n input?.focus()\n input?.select()\n }\n }\n\n disconnectedCallback() {\n this.generation++\n clearTimeout(this.searchTimer)\n super.disconnectedCallback()\n }\n\n private emit(name: string, detail?: unknown) {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }))\n }\n\n /* ── what the person does ────────────────────────────────────────────────────────── */\n\n private onSearch(value: string) {\n this.search = value\n clearTimeout(this.searchTimer)\n /* Not on every keystroke. A new search starts from the first page. */\n this.searchTimer = setTimeout(() => {\n this.pageSize = PAGE\n void this.reload()\n }, 200)\n }\n\n /** A filter changed - the list starts from its first page again. */\n private refilter(change: () => void) {\n change()\n this.pageSize = PAGE\n void this.reload()\n }\n\n private loadMore() {\n this.pageSize += PAGE\n void this.reload()\n }\n\n /** Runs one door, then reads the list again - on success and on failure alike, so the row shows the truth. */\n private async act(entry: AssistantSessionEntry, change: string, run: () => Promise<boolean>, refused: string) {\n this.renamingId = ''\n try {\n if (!(await run())) this.error = refused\n else this.emit('assistant-session-changed', { sessionId: entry.id, change })\n } catch (error) {\n /* Never pass a failure silently - a person must not believe a conversation was deleted when it was not. */\n this.error = (error as Error).message\n }\n const error = this.error\n await this.reload()\n if (error && !this.error) this.error = error\n }\n\n private rename(entry: AssistantSessionEntry, name: string) {\n const trimmed = name.trim()\n this.renamingId = ''\n if (!trimmed || trimmed === entry.name) return\n void this.act(entry, 'renamed', () => this.admin.rename(entry.id, trimmed), t('rename-refused', 'this conversation could not be renamed.'))\n }\n\n private setHidden(entry: AssistantSessionEntry, hidden: boolean) {\n void this.act(entry, hidden ? 'hidden' : 'unhidden', () => this.admin.hide(entry.id, hidden), t('hide-refused', 'this conversation could not be hidden.'))\n }\n\n private setVisibility(entry: AssistantSessionEntry, visibility: SessionVisibility) {\n void this.act(\n entry,\n 'visibility',\n () => this.admin.setVisibility(entry.id, visibility),\n t('visibility-refused', 'only the owner of this conversation can change who reads it.')\n )\n }\n\n private _removeSession(entry: AssistantSessionEntry) {\n void this.act(entry, 'removed', () => this.admin.remove(entry.id), t('remove-refused', 'this conversation could not be deleted.'))\n }\n\n /* ── drawing ─────────────────────────────────────────────────────────────────────── */\n\n render(): TemplateResult {\n const shown = this.entries.length\n\n return html`\n <div class=\"bar\">\n <input\n .value=${this.search}\n placeholder=${t('search', 'Search conversations')}\n aria-label=${t('search', 'Search conversations')}\n @input=${(e: Event) => this.onSearch((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Escape' && this.search) { e.stopPropagation(); this.onSearch('') } }}\n />\n <button class=\"new\" @click=${() => this.emit('assistant-session-reset')}>+ ${t('new', 'New conversation')}</button>\n </div>\n <div class=\"filters\">\n <select aria-label=${t('filter-whose', 'Whose')} .value=${this.whose}\n @change=${(e: Event) => this.refilter(() => (this.whose = (e.target as HTMLSelectElement).value as any))}>\n <option value=\"all\">${t('filter-all', 'All')}</option>\n <option value=\"mine\">${t('filter-mine', 'Started by me')}</option>\n <option value=\"participant\">${t('filter-participant', \"I'm in\")}</option>\n </select>\n <select aria-label=${t('filter-visibility', 'Visibility')} .value=${this.visibility}\n @change=${(e: Event) => this.refilter(() => (this.visibility = (e.target as HTMLSelectElement).value as any))}>\n <option value=\"all\">${t('filter-any-visibility', 'Anyone')}</option>\n <option value=\"open\">${t('filter-open', 'Public')}</option>\n <option value=\"group\">${t('filter-group', 'Group')}</option>\n <option value=\"private\">${t('filter-private', 'Private')}</option>\n </select>\n <label><input type=\"checkbox\" .checked=${this.unreadOnly}\n @change=${(e: Event) => this.refilter(() => (this.unreadOnly = (e.target as HTMLInputElement).checked))} />${t('filter-unread', 'Unread')}</label>\n <label><input type=\"checkbox\" .checked=${this.includeHidden}\n @change=${(e: Event) => this.refilter(() => (this.includeHidden = (e.target as HTMLInputElement).checked))} />${t('filter-hidden', 'Including hidden')}</label>\n ${this.filtering ? html`<button class=\"clear\" @click=${() => this.clearFilters()}>${t('reset-filters', 'Clear search and filters')}</button>` : nothing}\n </div>\n <div class=\"list\">\n ${this.error ? html`<div class=\"note\" role=\"alert\">${this.error}</div>` : nothing}\n ${this.loading ? html`<div class=\"note\" role=\"status\">${t('loading', 'Loading conversations…')}</div>` : nothing}\n ${shown === 0 && !this.loading && !this.error\n ? html`<div class=\"empty\" role=\"status\">${this.filtering ? t('filtered-empty', 'No conversations match these filters here.') : t('scope-empty', 'No conversations yet.')}</div>`\n : this.entries.map(entry => this.renderRow(entry))}\n ${shown < this.total\n ? html`<button class=\"more\" @click=${() => this.loadMore()}>${t('load-more', 'Show more ({rest})', { rest: this.total - shown })}</button>`\n : nothing}\n </div>\n <!-- A hidden conversation must not be forgotten: say how many, and one press shows them. -->\n ${this.hiddenCount > 0 && !this.includeHidden\n ? html`<button class=\"hiddenfilter\" @click=${() => this.refilter(() => (this.includeHidden = true))}>\n <md-icon>visibility_off</md-icon>${t('hidden-count', '{count} hidden', { count: this.hiddenCount })}\n </button>`\n : nothing}\n `\n }\n\n private renderRow(entry: AssistantSessionEntry): TemplateResult {\n const name = entry.name || t('untitled', 'Untitled conversation')\n const actions = sessionActions(entry)\n const isOpen = !entry.visibility || entry.visibility === 'open'\n\n if (this.renamingId === entry.id) {\n return html`<div class=\"row\">\n <span class=\"dot\"></span>\n <input\n class=\"rename\"\n .value=${entry.name || ''}\n aria-label=${t('rename', 'Rename')}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter') this.rename(entry, (e.target as HTMLInputElement).value)\n if (e.key === 'Escape') { e.stopPropagation(); this.renamingId = '' }\n }}\n @blur=${(e: Event) => this.rename(entry, (e.target as HTMLInputElement).value)}\n />\n </div>`\n }\n\n return html`<div\n class=\"row ${entry.unread ? 'unread' : ''} ${entry.hidden ? 'hidden' : ''} ${entry.id === this.sessionId ? 'current' : ''} ${isOpen ? 'open-audience' : ''}\"\n >\n <span class=\"dot\"></span>\n <button class=\"open-row\" aria-current=${entry.id === this.sessionId ? 'true' : 'false'} @click=${() => this.emit('assistant-session-select', { sessionId: entry.id, kind: entry.kind })}>\n <div class=\"title\">${name}</div>\n <div class=\"prev\">${entry.lastMessagePreview || ''}</div>\n <span class=\"meta\">${this.renderAudience(entry.visibility)}${entry.lastMessageAt && Number.isFinite(Date.parse(entry.lastMessageAt)) ? html` · <time datetime=${entry.lastMessageAt}>${new Intl.DateTimeFormat(i18next.language || 'en', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(entry.lastMessageAt))}</time>` : nothing}${entry.mine ? html` · ${t('filter-mine', 'Started by me')}` : nothing}</span>\n </button>\n <button\n class=\"more-menu\"\n aria-label=${t('manage', 'Manage conversation')}\n title=${t('manage', 'Manage conversation')}\n @click=${(e: MouseEvent) => this.openRowMenu(e, entry, name)}>⋯</button>\n </div>`\n }\n\n /**\n * A row's actions in the platform's popup menu - one open at a time, closed by a press outside or Escape, placed\n * inside the window. The hand-made menu it replaces stayed open and stacked over the next rows.\n */\n private openRowMenu(event: MouseEvent, entry: AssistantSessionEntry, name: string) {\n event.stopPropagation()\n const actions = sessionActions(entry)\n const current = entry.visibility || 'open'\n const at = (event.currentTarget as HTMLElement).getBoundingClientRect()\n OxPopupMenu.open({\n template: html`\n ${actions.rename ? html`<ox-popup-menuitem label=${t('rename', 'Rename')} @select=${() => (this.renamingId = entry.id)}></ox-popup-menuitem>` : nothing}\n ${actions.setVisibility && current !== 'open'\n ? html`<ox-popup-menuitem label=${t('make-open', 'Make public')} @select=${() => this.askOpen(entry, name)}></ox-popup-menuitem>`\n : nothing}\n ${actions.setVisibility && current !== 'group'\n ? html`<ox-popup-menuitem label=${t('make-group', 'Make it a group')} @select=${() => this.setVisibility(entry, 'group')}></ox-popup-menuitem>`\n : nothing}\n ${actions.setVisibility && current !== 'private'\n ? html`<ox-popup-menuitem label=${t('make-private', 'Make private')} @select=${() => this.askPrivate(entry, name)}></ox-popup-menuitem>`\n : nothing}\n ${actions.leave ? html`<ox-popup-menuitem label=${t('leave', 'Leave')} @select=${() => this.askLeave(entry, name)}></ox-popup-menuitem>` : nothing}\n <ox-popup-menuitem\n label=${actions.unhide ? t('unhide', 'Show in my list') : t('hide', 'Hide from my list')}\n @select=${() => this.setHidden(entry, !entry.hidden)}></ox-popup-menuitem>\n ${actions.remove ? html`<ox-popup-menuitem label=${t('remove', 'Delete')} @select=${() => this.askRemove(entry, name)}></ox-popup-menuitem>` : nothing}\n `,\n top: at.bottom,\n right: window.innerWidth - at.right,\n parent: document.body\n })\n }\n\n /** Before what cannot be taken back - the platform's confirm, [Cancel][OK] (decided 2026-09-25, §7-3). */\n private async ask(title: string, text: string, confirmText: string): Promise<boolean> {\n return !!(await OxPrompt.open({\n type: 'warning',\n title,\n text,\n confirmButton: { text: confirmText },\n cancelButton: { text: t('cancel', 'Cancel') }\n }))\n }\n\n private async askRemove(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('remove', 'Delete'),\n t('confirm-remove', 'Delete \"{name}\"? It disappears for every participant and cannot be brought back.', { name }),\n t('remove', 'Delete')\n )\n if (ok) this._removeSession(entry)\n }\n\n private async askOpen(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('make-open', 'Make public'),\n t('confirm-open', 'Make \"{name}\" public? Everyone in this domain will be able to read what is already written.', { name }),\n t('make-open', 'Make public')\n )\n if (ok) this.setVisibility(entry, 'open')\n }\n\n /* Private is the owner's alone - the people in it leave, and coming back is being invited again. */\n private async askPrivate(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('make-private', 'Make private'),\n t('confirm-private', 'Make \"{name}\" private? Only you will read it, and everyone else in it leaves.', { name }),\n t('make-private', 'Make private')\n )\n if (ok) this.setVisibility(entry, 'private')\n }\n\n private async askLeave(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('leave', 'Leave'),\n entry.visibility === 'open'\n ? t('confirm-leave-open', 'Leave \"{name}\"? It stops coming to your list.', { name })\n : t('confirm-leave', 'Leave \"{name}\"? You will not read it again unless its owner brings you back.', { name }),\n t('leave', 'Leave')\n )\n if (ok) void this.act(entry, 'left', () => this.admin.leave(entry.id), t('leave-refused', 'you could not leave this conversation.'))\n }\n\n /** Who reads a conversation, on its row: the same three words wherever a conversation is listed. */\n private renderAudience(visibility?: string) {\n const v = visibility || 'open'\n const icon = v === 'open' ? 'public' : v === 'group' ? 'group' : 'lock'\n const label =\n v === 'open'\n ? t('audience-open', 'Everyone in this domain')\n : v === 'group'\n ? t('audience-group', 'Invited people')\n : t('audience-private', 'Only me')\n return html`<span class=\"audience ${v}\"><md-icon aria-hidden=\"true\">${icon}</md-icon>${label}</span>`\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"assistant-session-manager.js","sourceRoot":"","sources":["../../client/components/assistant-session-manager.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AAEnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAA4C,MAAM,KAAK,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,iCAAiC,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAE7D,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,cAAc,EAOf,MAAM,qCAAqC,CAAA;AAE5C,MAAM,IAAI,GAAG,EAAE,CAAA;AASf,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,YAAoB,EAAE,UAAmC,EAAE,EAAE,EAAE,CACrF,OAAO,CAAC,CAAC,CAAC,wBAAwB,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,UAAU;IAAhD;;QAyRL,qGAAqG;QACzE,eAAU,GAAG,EAAE,CAAA;QACf,aAAQ,GAAG,EAAE,CAAA;QACzC,+DAA+D;QACnC,cAAS,GAAG,EAAE,CAAA;QAC1C,mEAAmE;QACnC,UAAK,GAA0B,qBAAqB,CAAA;QACpF,uFAAuF;QAC3D,SAAI,GAAG,EAAE,CAAA;QAEpB,YAAO,GAA4B,EAAE,CAAA;QACrC,UAAK,GAAG,CAAC,CAAA;QACT,gBAAW,GAAG,CAAC,CAAA;QACf,WAAM,GAAG,EAAE,CAAA;QACX,UAAK,GAAkD,KAAK,CAAA;QAC5D,eAAU,GAAuD,KAAK,CAAA;QACtE,kBAAa,GAAG,KAAK,CAAA;QACrB,eAAU,GAAG,KAAK,CAAA;QAClB,aAAQ,GAAG,IAAI,CAAA;QACf,YAAO,GAAG,KAAK,CAAA;QACf,UAAK,GAAG,EAAE,CAAA;QACV,eAAU,GAAG,EAAE,CAAA;QACf,SAAI,GAAgB,MAAM,CAAA;QAC1B,kBAAa,GAAG,CAAC,CAAA;QACjB,iBAAY,GAAG,CAAC,CAAA;QAChB,YAAO,GAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;QAClE,YAAO,GAA0B,EAAE,CAAA;QACpD,+FAA+F;QAC9E,WAAM,GAAa,EAAE,CAAA;QACrB,SAAI,GAAG,KAAK,CAAA;QAC7B,+FAA+F;QAC9E,WAAM,GAAyE,IAAI,CAAA;QACpG,gGAAgG;QACxF,kBAAa,GAAG,KAAK,CAAA;QAsBrB,eAAU,GAAG,CAAC,CAAA;IAmgBxB,CAAC;aAl1BQ,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsRlB,AAtRY,CAsRZ;IAqCD;;;;OAIG;IACH,IAAY,SAAS;QACnB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAA;IACnJ,CAAC;IAEO,YAAY;QAClB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;YAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;YAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;YACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;YAC5C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAA;QACpB,CAAC,CAAC,CAAA;IACJ,CAAC;IAKD,2FAA2F;IAC3F,KAAK,CAAC,MAAM;QACV,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,UAAU,CAAA;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;YACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;YACjC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;QACf,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,6FAA6F;gBAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;gBAC7C,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;gBAChJ,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;oBAAE,OAAM;gBAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;gBACtB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;gBACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAA;gBAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC3C,OAAM;YACR,CAAC;YACD;;;eAGG;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAClC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE;oBACP,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,eAAe,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU;oBACzC,WAAW,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS;iBACrC;gBACD,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC;aACV,CAAC,CAAA;YACF,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAM;YAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;YACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;YACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAM;YAC1C,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;YACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;YACjC,IAAI,CAAC,KAAK,GAAI,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAA;QAC/F,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QAC1D,CAAC;IACH,CAAC;IAED,gHAAgH;IACxG,UAAU,CAAC,MAAgB;QACjC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;YAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACtB,CAAC;;YAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IACpE,CAAC;IAEO,OAAO,CAAC,IAAiB;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAClB,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,SAAS,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,UAAU,CAAC,EAAU,EAAE,EAAW;QACxC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAA;IAC/F,CAAC;IAES,OAAO,CAAC,OAAuB;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,KAAK,IAAI,CAAC,MAAM,EAAE,CAAA;QAE3H;;;WAGG;QACH,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAA4B,CAAA;YACtF,KAAK,EAAE,KAAK,EAAE,CAAA;YACd,KAAK,EAAE,MAAM,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9B,KAAK,CAAC,oBAAoB,EAAE,CAAA;IAC9B,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,MAAgB;QACzC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACtF,CAAC;IAED,wFAAwF;IAEhF,QAAQ,CAAC,KAAa;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9B,sEAAsE;QACtE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;YACpB,KAAK,IAAI,CAAC,MAAM,EAAE,CAAA;QACpB,CAAC,EAAE,GAAG,CAAC,CAAA;IACT,CAAC;IAED,oEAAoE;IAC5D,QAAQ,CAAC,MAAkB;QACjC,MAAM,EAAE,CAAA;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,KAAK,IAAI,CAAC,MAAM,EAAE,CAAA;IACpB,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAA;QACrB,KAAK,IAAI,CAAC,MAAM,EAAE,CAAA;IACpB,CAAC;IAED,8GAA8G;IACtG,KAAK,CAAC,GAAG,CAAC,KAA4B,EAAE,MAAc,EAAE,GAA2B,EAAE,OAAe;QAC1G,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;;gBACnC,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2GAA2G;YAC3G,IAAI,CAAC,KAAK,GAAI,KAAe,CAAC,OAAO,CAAA;QACvC,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACnB,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAC9C,CAAC;IAEO,MAAM,CAAC,KAA4B,EAAE,IAAY;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI;YAAE,OAAM;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC,CAAA;IAC7I,CAAC;IAEO,SAAS,CAAC,KAA4B,EAAE,MAAe;QAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,wCAAwC,CAAC,CAAC,CAAA;IAC5J,CAAC;IAEO,aAAa,CAAC,KAA4B,EAAE,UAA6B;QAC/E,KAAK,IAAI,CAAC,GAAG,CACX,KAAK,EACL,YAAY,EACZ,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,EACpD,CAAC,CAAC,oBAAoB,EAAE,8DAA8D,CAAC,CACxF,CAAA;IACH,CAAC;IAEO,cAAc,CAAC,KAA4B;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC,CAAA;IACpI,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,OAAO,CAAC,GAAa,EAAE,MAAc,EAAE,GAAqC,EAAE,IAA+B;QACzH,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI;YAAE,OAAM;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAU,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAU,CAAC,CAAC,CAAC,CAAA;QAC/I,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClB,KAAK,EAAE,CAAA;oBACP,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;gBACnE,CAAC;;oBAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC,CAAA;YAC9E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,uBAAuB,CAAC,KAAM,KAAe,CAAC,OAAO,GAAG,CAAC,CAAA;YAC1G,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;QACjB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,+BAA+B,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5I,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACnB,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;QAC9C,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAC/B,CAAC;IAED,qHAAqH;IAC7G,OAAO;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;YAC7B,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,qDAAqD,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC1G,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAA;IACtD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAa;QACvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACrB,GAAG,CAAC,CAAC,qBAAqB,EAAE,qEAAqE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,EAC7I,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACtB,CAAA;QACD,IAAI,EAAE;YAAE,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACnI,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAa;QACtC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EACnB,CAAC,CAAC,oBAAoB,EAAE,2IAA2I,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAC3L,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CACpB,CAAA;QACD,IAAI,EAAE;YAAE,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACzH,CAAC;IAEO,QAAQ,CAAC,GAAa;QAC5B,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,gCAAgC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAC3I,CAAC;IAEO,WAAW,CAAC,GAAa;QAC/B,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACnI,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAwB;QAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;QAC/D,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1H,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;IAChG,CAAC;IAED,wFAAwF;IAExF,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;QAEjC,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,MAAM;wBACN,CAAC,CAAC,QAAQ,EAAE,sBAAsB,CAAC;uBACpC,CAAC,CAAC,QAAQ,EAAE,sBAAsB,CAAC;mBACvC,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC;qBAC/D,CAAC,CAAgB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,CAAC,CAAC,eAAe,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAAC,CAAC,CAAC,CAAC;;qCAE3F,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC;;;UAGvG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA,sBAAsB,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,KAAK;oBACnG,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAI,CAAC,CAAC,MAA4B,CAAC,KAAY,CAAC,CAAC;gCAClF,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC;iCACrB,CAAC,CAAC,aAAa,EAAE,eAAe,CAAC;wCAC1B,CAAC,CAAC,oBAAoB,EAAE,QAAQ,CAAC;;6BAE5C,CAAC,CAAC,mBAAmB,EAAE,YAAY,CAAC,WAAW,IAAI,CAAC,UAAU;oBACvE,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAI,CAAC,CAAC,MAA4B,CAAC,KAAY,CAAC,CAAC;gCACvF,CAAC,CAAC,uBAAuB,EAAE,QAAQ,CAAC;iCACnC,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC;kCACzB,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC;oCACxB,CAAC,CAAC,gBAAgB,EAAE,SAAS,CAAC;kBAChD;6BACW,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC,IAAI;oBACrD,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC,CAAC,MAA4B,CAAC,KAAoB,CAAC;iCACnE,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC;qCACpB,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAC;oCACzC,CAAC,CAAC,cAAc,EAAE,oBAAoB,CAAC;oCACvC,CAAC,CAAC,cAAc,EAAE,SAAS,CAAC;;UAEtD,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA,0CAA0C,IAAI,CAAC,UAAU;oBACvF,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,QAAQ,CAAC;iDAClG,IAAI,CAAC,aAAa;oBAC/C,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,kBAAkB,CAAC,UAAU;UAChK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA,gCAAgC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,eAAe,EAAE,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;;QAEvJ,IAAI,CAAC,aAAa,EAAE;;UAElB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,kCAAkC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO;UAC/E,IAAI,CAAC,MAAM;YACX,CAAC,CAAC,IAAI,CAAA,mCAAmC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;gBACxE,CAAC,CAAC,IAAI,CAAA,qCAAqC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW;gBACzI,CAAC,CAAC,OAAO,QAAQ;YACrB,CAAC,CAAC,OAAO;UACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA,mCAAmC,CAAC,CAAC,SAAS,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;UAC9G,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACpE,CAAC,CAAC,IAAI,CAAA,kCAAkC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,iDAAiD,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW;YACzL,CAAC,CAAC,OAAO;UACT,IAAI,CAAC,IAAI,KAAK,SAAS;YACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;gBACzD,CAAC,CAAC,IAAI,CAAA,oCAAoC,CAAC,CAAC,eAAe,EAAE,mCAAmC,CAAC,QAAQ;gBACzG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvD,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;gBAC3C,CAAC,CAAC,IAAI,CAAA,oCAAoC,IAAI,CAAC,IAAI,KAAK,SAAS;oBAC7D,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,iCAAiC,CAAC;oBACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,4CAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,uBAAuB,CAAC,QAAQ;gBAC5I,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;UACpD,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;YAC7C,CAAC,CAAC,IAAI,CAAA,+BAA+B,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,WAAW;YAC3I,CAAC,CAAC,OAAO;;;QAGX,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;YACjG,CAAC,CAAC,IAAI,CAAA,uCAAuC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;+CAC5D,CAAC,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC3F;YACZ,CAAC,CAAC,OAAO;QACT,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAC9C,CAAC,CAAC,IAAI,CAAA,uCAAuC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;4CACvC,CAAC,CAAC,gBAAgB,EAAE,gDAAgD,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;oBAClK;YACZ,CAAC,CAAC,OAAO;KACZ,CAAA;IACH,CAAC;IAED,gGAAgG;IACxF,aAAa;QACnB,MAAM,IAAI,GAAqB,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QACpF,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAA;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACjC,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,CAAA;QAClC,MAAM,SAAS,GAAG,CAAC,EAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACpF,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;QACnG,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;iDACgC,GAAG,mBAAmB,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAQ,EAAE,EAAE,CAAC,SAAS,CAAE,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,MAAM,KAAK;UACrK,MAAM;gBACN,CAAC,CAAC,IAAI,CAAA,iCAAiC,IAAI,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;kDACpH,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,WAAW;gBAC5G,CAAC,CAAC,OAAO;aACN,CAAA;QACT,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrF,OAAO,IAAI,CAAA;+CACgC,GAAG,mBAAmB,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAQ,EAAE,EAAE,CAAC,SAAS,CAAE,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,MAAM,KAAK;QACrK,MAAM;YACN,CAAC,CAAC,IAAI,CAAA,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM;gBACpB,CAAC,CAAC,IAAI,CAAA,wCAAwC,IAAI,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,WAAW;gBACrL,CAAC,CAAC,OAAO;cACT,GAAG,CAAC,KAAK,CAAC,MAAM;gBAChB,CAAC,CAAC,IAAI,CAAA,iCAAiC,IAAI,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW;gBACzK,CAAC,CAAC,OAAO;cACT,GAAG,CAAC,IAAI,CAAC,MAAM;gBACf,CAAC,CAAC,IAAI,CAAA,iCAAiC,IAAI,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW;gBACjK,CAAC,CAAC,OAAO;gDACyB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,WAAW;YAC5G,CAAC,CAAC,OAAO;WACN,CAAA;IACT,CAAC;IAEO,gBAAgB,CAAC,GAAwB;QAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAG,CAAC,EAAW,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACtL,OAAO,IAAI,CAAA;gFACiE,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;kBACzI,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;;6BAElE,IAAI;6BACJ,CAAC,CAAC,YAAY,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,MAAM,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;;0CAEvJ,IAAI,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC;WAC3G,CAAA;IACT,CAAC;IAED,qEAAqE;IAC7D,WAAW,CAAC,KAA4B;QAC9C,IAAI,KAAK,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO,IAAI,CAAA,MAAM,CAAC,CAAC,cAAc,EAAE,sBAAsB,CAAC,EAAE,CAAA;QACjG,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA,MAAM,CAAC,CAAC,iBAAiB,EAAE,6BAA6B,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,EAAE,CAAA;QAC9I,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,MAAM,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IACzE,CAAC;IAEO,SAAS,CAAC,KAA4B;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,CAAA;QAE/D,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YACjC,OAAO,IAAI,CAAA;;;;mBAIE,KAAK,CAAC,IAAI,IAAI,EAAE;uBACZ,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC;qBACvB,CAAC,CAAgB,EAAE,EAAE;gBAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;oBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAA;gBAC/E,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAAC,CAAC,CAAC,eAAe,EAAE,CAAC;oBAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;gBAAC,CAAC;YACvE,CAAC;kBACO,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC;;aAE3E,CAAA;QACT,CAAC;QAED,OAAO,IAAI,CAAA;mBACI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;;gFAEhF,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;kBAC3I,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;;8CAEnD,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;6BAChK,IAAI;4BACL,KAAK,CAAC,kBAAkB,IAAI,EAAE;6BAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,qBAAqB,KAAK,CAAC,aAAa,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,MAAM,CAAC,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;;;qBAI7b,CAAC,CAAC,QAAQ,EAAE,qBAAqB,CAAC;gBACvC,CAAC,CAAC,QAAQ,EAAE,qBAAqB,CAAC;iBACjC,CAAC,CAAa,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;WACzD,CAAA;IACT,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,KAAiB,EAAE,KAA4B,EAAE,IAAY;QAC/E,KAAK,CAAC,eAAe,EAAE,CAAA;QACvB,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,IAAI,MAAM,CAAA;QAC1C,MAAM,EAAE,GAAI,KAAK,CAAC,aAA6B,CAAC,qBAAqB,EAAE,CAAA;QACvE,WAAW,CAAC,IAAI,CAAC;YACf,QAAQ,EAAE,IAAI,CAAA;UACV,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO;UACrJ,OAAO,CAAC,aAAa,IAAI,OAAO,KAAK,MAAM;gBAC3C,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB;gBACjI,CAAC,CAAC,OAAO;UACT,OAAO,CAAC,aAAa,IAAI,OAAO,KAAK,OAAO;gBAC5C,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,YAAY,EAAE,iBAAiB,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,uBAAuB;gBAC/I,CAAC,CAAC,OAAO;UACT,OAAO,CAAC,aAAa,IAAI,OAAO,KAAK,SAAS;gBAC9C,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB;gBACxI,CAAC,CAAC,OAAO;UACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO;;kBAExI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,mBAAmB,CAAC;oBAC9E,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;UACpD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO;OACvJ;YACD,GAAG,EAAE,EAAE,CAAC,MAAM;YACd,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,KAAK;YACnC,MAAM,EAAE,QAAQ,CAAC,IAAI;SACtB,CAAC,CAAA;IACJ,CAAC;IAED,0GAA0G;IAClG,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;QAChE,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC;YAC5B,IAAI,EAAE,SAAS;YACf,KAAK;YACL,IAAI;YACJ,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YACpC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;SAC9C,CAAC,CAAC,CAAA;IACL,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAA4B,EAAE,IAAY;QAChE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACrB,GAAG,CAAC,CAAC,gBAAgB,EAAE,uDAAuD,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,EAC7G,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACtB,CAAA;QACD,IAAI,EAAE;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAA4B,EAAE,IAAY;QAC9D,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,EAC7B,CAAC,CAAC,cAAc,EAAE,6FAA6F,EAAE,EAAE,IAAI,EAAE,CAAC,EAC1H,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAC9B,CAAA;QACD,IAAI,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED,oGAAoG;IAC5F,KAAK,CAAC,UAAU,CAAC,KAA4B,EAAE,IAAY;QACjE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,EACjC,CAAC,CAAC,iBAAiB,EAAE,+EAA+E,EAAE,EAAE,IAAI,EAAE,CAAC,EAC/G,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAClC,CAAA;QACD,IAAI,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAC9C,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAA4B,EAAE,IAAY;QAC/D,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EACnB,KAAK,CAAC,UAAU,KAAK,MAAM;YACzB,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,+CAA+C,EAAE,EAAE,IAAI,EAAE,CAAC;YACpF,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,8EAA8E,EAAE,EAAE,IAAI,EAAE,CAAC,EAChH,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CACpB,CAAA;QACD,IAAI,EAAE;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,wCAAwC,CAAC,CAAC,CAAA;IACtI,CAAC;IAED,oGAAoG;IAC5F,cAAc,CAAC,UAAmB;QACxC,MAAM,CAAC,GAAG,UAAU,IAAI,MAAM,CAAA;QAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;QACvE,MAAM,KAAK,GACT,CAAC,KAAK,MAAM;YACV,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,yBAAyB,CAAC;YAC/C,CAAC,CAAC,CAAC,KAAK,OAAO;gBACb,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;gBACvC,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;QACxC,OAAO,IAAI,CAAA,yBAAyB,CAAC,iCAAiC,IAAI,aAAa,KAAK,SAAS,CAAA;IACvG,CAAC;;AAxjB2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2DAAgB;AACf;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDAAc;AAEb;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DAAe;AAEV;IAA/B,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;sDAAqD;AAExD;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDAAU;AAEpB;IAAhB,KAAK,EAAE;;wDAA8C;AACrC;IAAhB,KAAK,EAAE;;sDAAkB;AACT;IAAhB,KAAK,EAAE;;4DAAwB;AACf;IAAhB,KAAK,EAAE;;uDAAoB;AACX;IAAhB,KAAK,EAAE;;sDAAqE;AAC5D;IAAhB,KAAK,EAAE;;2DAA+E;AACtE;IAAhB,KAAK,EAAE;;8DAA8B;AACrB;IAAhB,KAAK,EAAE;;2DAA2B;AAClB;IAAhB,KAAK,EAAE;;yDAAwB;AACf;IAAhB,KAAK,EAAE;;wDAAwB;AACf;IAAhB,KAAK,EAAE;;sDAAmB;AACV;IAAhB,KAAK,EAAE;;2DAAwB;AACf;IAAhB,KAAK,EAAE;;qDAAmC;AAC1B;IAAhB,KAAK,EAAE;;8DAA0B;AACjB;IAAhB,KAAK,EAAE;;6DAAyB;AAChB;IAAhB,KAAK,EAAE;;wDAA2E;AAClE;IAAhB,KAAK,EAAE;;wDAA4C;AAEnC;IAAhB,KAAK,EAAE;;uDAA8B;AACrB;IAAhB,KAAK,EAAE;;qDAAqB;AAEZ;IAAhB,KAAK,EAAE;;uDAA4F;AAxTzF,uBAAuB;IADnC,aAAa,CAAC,8BAA8B,CAAC;GACjC,uBAAuB,CAm1BnC","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing, type PropertyValues, type TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup'\nimport '@operato/popup/ox-popup-menu.js'\nimport { OxPopupMenu } from '@operato/popup/ox-popup-menu.js'\n\nimport {\n assistantSessionAdmin,\n bulkActions,\n sessionActions,\n type AssistantSessionAdmin,\n type AssistantSessionEntry,\n type AssistantSessionFilters,\n type DeletedSessionEntry,\n type SessionKeeping,\n type SessionVisibility\n} from '../utils/assistant-session-admin.js'\n\nconst PAGE = 30\n\n/**\n * What the list shows (shared-dock.md §2-7): the live ones, the live and the archived, the ones of mine it suggests\n * clearing (picked already, so one press clears them), or the ones I deleted that can still come back.\n */\ntype SessionView = 'list' | 'archived' | 'cleanup' | 'deleted'\n\n\nconst t = (key: string, defaultValue: string, options: Record<string, unknown> = {}) =>\n i18next.t(`ai-assistant.session.${key}`, { defaultValue, ...options })\n\n/**\n * The conversations on one anchor, managed - `<ox-assistant-session-manager>`.\n *\n * Search, a filter (all / mine / including hidden), paging, and on each row: open, rename, hide or\n * unhide, private ⇄ public, delete. Taken from operato-twin's dock, where it was written first, so every\n * dock gets it by placing this element (typically behind the toolbar's \"All History\").\n *\n * ── What is the host's ──────────────────────────────────────────────────────────\n * Opening and starting a conversation belong to the dock's session controller, so this element asks\n * with the toolbar's own events and does not open anything itself:\n * assistant-session-select { sessionId } open that conversation\n * assistant-session-reset start a new one\n * assistant-session-changed { sessionId, change: 'renamed' | 'hidden' | 'unhidden' | 'removed' | 'visibility' | 'left' }\n * a row changed - the host refreshes its tabs; if the open\n * conversation was removed or hidden, it moves off it\n *\n * ── What is the server's ────────────────────────────────────────────────────────\n * Who may do what (`sessionActions`): rename any participant, hide anyone for their own list, delete\n * the creator, visibility the owner. The buttons follow those hints; the doors decide again.\n *\n * ── Asking before what cannot be undone ─────────────────────────────────────────\n * Delete, and opening a private conversation to the domain, ask on the row itself - [Cancel][OK].\n * Making it private, hiding and renaming do not: each can be undone from the same row.\n *\n * ── Many at once (2026-10-25, the user: 「멀티셀렉트로 한번에 지울 수 있게」) ──────────\n * Each row has a box; the picked ones are deleted, left or hidden together, each by its own row's hints\n * (`bulkActions`), with one question. A deleted one is kept for `deletedDays` and comes back from 「Deleted」.\n */\n@customElement('ox-assistant-session-manager')\nexport class AssistantSessionManager extends LitElement {\n static styles = css`\n /* One scale for the list: name 13, preview 12, meta 11 - the rest of the dock's sizes. */\n .open-row { display: block; flex: 1; min-width: 0; text-align: start; border: 0; background: transparent; color: inherit; font: inherit; padding: 0; cursor: pointer; }\n .meta { display: block; margin-top: 2px; font-size: 11px; color: var(--md-sys-color-on-surface-variant); }\n /* Open and private must part at a glance - an open row is read by everyone in the domain (2026-09-30). */\n .audience { display: inline-flex; align-items: center; gap: 3px; vertical-align: middle; }\n .audience md-icon { --md-icon-size: 14px; }\n /* The dock's warning colour, fixed across applications - see assistant-dock.ts. */\n :host { --assistant-open-edge: #c47f00; --assistant-open-surface: #f2b01e; --assistant-open-ink: #2e2100; }\n .audience.open { padding: 0 5px 0 3px; border-radius: 4px; background: var(--assistant-open-surface); color: var(--assistant-open-ink); font-weight: 600; }\n .audience md-icon { --md-icon-size: 12px; }\n .row.open-audience { box-shadow: inset 4px 0 0 var(--assistant-open-edge); }\n .more-menu { flex: none; border: 0; border-radius: 4px; padding: 2px 6px; background: none; color: var(--md-sys-color-on-surface-variant); font-size: 14px; line-height: 1; cursor: pointer; }\n .more-menu:hover { background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface); }\n button:focus-visible { outline: 2px solid var(--md-sys-color-primary); outline-offset: 2px; }\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n font-size: 13px;\n color: var(--md-sys-color-on-surface);\n }\n\n .bar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 10px 6px;\n }\n\n .bar input,\n .bar select {\n min-width: 0;\n height: 26px;\n font-size: 12px;\n box-sizing: border-box;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n font: inherit;\n padding: 0 8px;\n }\n\n .bar input {\n flex: 1;\n }\n\n .new {\n flex: none;\n border: 0;\n border-radius: 6px;\n padding: 4px 8px;\n background: transparent;\n color: var(--md-sys-color-primary);\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n }\n\n /* Always open, one quiet line under the search - the same small size as the search. */\n .filters {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n padding: 0 10px 8px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .filters select {\n height: 22px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 4px;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n font: inherit;\n padding: 0 4px;\n }\n\n .filters label {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n cursor: pointer;\n }\n\n .filters input[type='checkbox'] {\n margin: 0;\n }\n\n .filters .clear {\n margin-left: auto;\n border: 0;\n background: none;\n padding: 0;\n color: var(--md-sys-color-primary);\n font: inherit;\n cursor: pointer;\n }\n\n .list {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n\n .row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n cursor: pointer;\n }\n\n .row:hover,\n .row.current {\n background: var(--md-sys-color-surface-container);\n }\n\n .row.hidden {\n opacity: 0.6;\n }\n\n .dot {\n flex: none;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n\n .row.unread .dot {\n background: var(--md-sys-color-primary);\n }\n\n .row md-icon {\n --md-icon-size: 16px;\n flex: none;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .body {\n flex: 1;\n min-width: 0;\n }\n\n .title,\n .prev {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .row.unread .title {\n font-weight: 700;\n }\n\n .prev {\n margin-top: 1px;\n color: var(--md-sys-color-on-surface-variant);\n font-size: 12px;\n }\n\n .rename {\n flex: 1;\n min-width: 0;\n height: 26px;\n border: 1px solid var(--md-sys-color-primary);\n border-radius: 6px;\n padding: 0 6px;\n font: inherit;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n }\n\n .ask {\n display: grid;\n gap: 6px;\n padding: 10px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n background: var(--md-sys-color-surface-container);\n }\n\n .ask .buttons {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .ask button {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n padding: 4px 10px;\n background: var(--md-sys-color-surface-container-lowest);\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n\n .ask button.ok {\n border-color: var(--md-sys-color-primary);\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n }\n\n .ask button.ok.danger {\n border-color: var(--md-sys-color-error);\n background: var(--md-sys-color-error);\n color: var(--md-sys-color-on-error);\n }\n\n .note,\n .empty {\n padding: 14px 12px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n [role='alert'] {\n color: var(--md-sys-color-error);\n }\n\n .more,\n .hiddenfilter {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n width: 100%;\n padding: 8px;\n border: 0;\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: none;\n color: var(--md-sys-color-on-surface-variant);\n font: inherit;\n cursor: pointer;\n }\n\n .hiddenfilter md-icon {\n --md-icon-size: 16px;\n }\n\n .pick { margin: 0; cursor: pointer; }\n /* The box is small; the space around it picks too - a press beside it must not open the conversation. */\n .pick-area { flex: none; display: inline-flex; align-items: center; align-self: stretch; padding: 0 8px; margin: -7px -8px -7px -10px; padding-left: 10px; cursor: pointer; }\n .pickbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n padding: 6px 10px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant);\n }\n .pickbar label { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; }\n .pickbar .act,\n .suggest,\n .note .open-link,\n .restore {\n border: 0;\n background: none;\n padding: 0;\n color: var(--md-sys-color-primary);\n font: inherit;\n cursor: pointer;\n }\n .pickbar .act:disabled { color: var(--md-sys-color-on-surface-variant); cursor: default; }\n .pickbar .act.danger { color: var(--md-sys-color-error); }\n .pickbar .unpick { margin-left: auto; }\n .suggest { display: block; width: 100%; padding: 8px 10px; text-align: start; font-size: 12px; border-bottom: 1px solid var(--md-sys-color-outline-variant); }\n .restore { flex: none; font-size: 12px; }\n .row.deleted { cursor: default; }\n `\n\n /** The anchor whose conversations are listed - the same one the dock's session controller opened. */\n @property({ type: String }) anchorType = ''\n @property({ type: String }) anchorId = ''\n /** The conversation the dock has open - marked in the list. */\n @property({ type: String }) sessionId = ''\n /** The doors. Replaceable for tests; a host normally leaves it. */\n @property({ attribute: false }) admin: AssistantSessionAdmin = assistantSessionAdmin\n /** The conversation kind (mode) open in the dock - the list's default scope (§2-6). */\n @property({ type: String }) kind = ''\n\n @state() private entries: AssistantSessionEntry[] = []\n @state() private total = 0\n @state() private hiddenCount = 0\n @state() private search = ''\n @state() private whose: NonNullable<AssistantSessionFilters['whose']> = 'all'\n @state() private visibility: NonNullable<AssistantSessionFilters['visibility']> = 'all'\n @state() private includeHidden = false\n @state() private unreadOnly = false\n @state() private pageSize = PAGE\n @state() private loading = false\n @state() private error = ''\n @state() private renamingId = ''\n @state() private view: SessionView = 'list'\n @state() private archivedCount = 0\n @state() private cleanupCount = 0\n @state() private keeping: SessionKeeping = { deletedDays: null, archiveDays: null }\n @state() private deleted: DeletedSessionEntry[] = []\n /** The rows picked for doing at once - ids, kept across a reload for the rows still listed. */\n @state() private picked: string[] = []\n @state() private busy = false\n /** What was just done, said once - and the conversation brought back, to open it from here. */\n @state() private notice: { text: string; open?: { sessionId: string; kind?: string } } | null = null\n /** The suggestions arrive picked - set when the view turns to them, spent by the first read. */\n private pickAllOnRead = false\n\n /*\n * The search and the filters stand open together, always (2026-10-12) - a filter behind a \"Filters\" button is one\n * more thing to find before finding the conversation. The list is this screen's conversations, so there is no kind\n * to choose.\n */\n private get filtering() {\n return !!this.search.trim() || this.whose !== 'all' || this.visibility !== 'all' || this.includeHidden || this.unreadOnly || this.view !== 'list'\n }\n\n private clearFilters() {\n clearTimeout(this.searchTimer)\n this.refilter(() => {\n this.search = ''\n this.whose = 'all'\n this.visibility = 'all'\n this.includeHidden = this.unreadOnly = false\n this.view = 'list'\n })\n }\n\n private generation = 0\n private searchTimer?: ReturnType<typeof setTimeout>\n\n /** Read the list again - the host calls this after it opened or started a conversation. */\n async reload(): Promise<void> {\n const generation = ++this.generation\n if (!this.anchorType || !this.anchorId) {\n this.entries = []\n this.total = this.hiddenCount = 0\n return\n }\n\n this.loading = true\n this.error = ''\n try {\n if (this.view === 'deleted') {\n /* The deleted ones are few (kept for deletedDays) - the search narrows them by name here. */\n const word = this.search.trim().toLowerCase()\n const deleted = (await this.admin.deleted(this.anchorType, this.anchorId)).filter(one => !word || (one.name ?? '').toLowerCase().includes(word))\n if (generation !== this.generation) return\n this.deleted = deleted\n this.entries = []\n this.total = deleted.length\n this.keepPicked(deleted.map(one => one.id))\n return\n }\n /*\n * Paging reads again from the start rather than appending - live activity reorders the list, and\n * appending a later page to an earlier order duplicates and drops rows.\n */\n const page = await this.admin.inbox({\n anchorType: this.anchorType,\n anchorId: this.anchorId,\n search: this.search,\n filters: {\n kind: this.kind,\n whose: this.whose,\n visibility: this.visibility,\n includeHidden: this.includeHidden,\n unreadOnly: this.unreadOnly,\n includeArchived: this.view === 'archived',\n cleanupOnly: this.view === 'cleanup'\n },\n limit: this.pageSize,\n offset: 0\n })\n if (generation !== this.generation) return\n this.entries = page.entries\n this.total = page.total\n this.hiddenCount = page.hiddenCount\n this.archivedCount = page.archivedCount\n this.cleanupCount = page.cleanupCount\n this.keeping = page.keeping\n this.keepPicked(page.entries.map(entry => entry.id))\n } catch (error) {\n if (generation !== this.generation) return\n this.entries = []\n this.total = this.hiddenCount = 0\n this.error = (error as Error).message || t('failed', 'could not load the conversation list.')\n } finally {\n if (generation === this.generation) this.loading = false\n }\n }\n\n /** After a read: the suggestions arrive all picked; otherwise only the picked rows still listed stay picked. */\n private keepPicked(listed: string[]) {\n if (this.pickAllOnRead) {\n this.pickAllOnRead = false\n this.picked = listed\n } else this.picked = this.picked.filter(id => listed.includes(id))\n }\n\n private setView(view: SessionView) {\n this.refilter(() => {\n this.view = view\n this.picked = []\n this.notice = null\n this.pickAllOnRead = view === 'cleanup'\n })\n }\n\n private togglePick(id: string, on: boolean) {\n this.picked = on ? [...new Set([...this.picked, id])] : this.picked.filter(one => one !== id)\n }\n\n protected updated(changed: PropertyValues) {\n if (changed.has('anchorType') || changed.has('anchorId') || changed.has('admin') || changed.has('kind')) void this.reload()\n\n /*\n * The rename box takes the keys the moment it opens, with the name selected. `autofocus` works once\n * per document, so the second rename opened a box that ignored the typing (2026-09-24, operato-ecs).\n */\n if (changed.has('renamingId') && this.renamingId) {\n const input = this.renderRoot.querySelector('input.rename') as HTMLInputElement | null\n input?.focus()\n input?.select()\n }\n }\n\n disconnectedCallback() {\n this.generation++\n clearTimeout(this.searchTimer)\n super.disconnectedCallback()\n }\n\n private emit(name: string, detail?: unknown) {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }))\n }\n\n /* ── what the person does ────────────────────────────────────────────────────────── */\n\n private onSearch(value: string) {\n this.search = value\n clearTimeout(this.searchTimer)\n /* Not on every keystroke. A new search starts from the first page. */\n this.searchTimer = setTimeout(() => {\n this.pageSize = PAGE\n void this.reload()\n }, 200)\n }\n\n /** A filter changed - the list starts from its first page again. */\n private refilter(change: () => void) {\n change()\n this.pageSize = PAGE\n void this.reload()\n }\n\n private loadMore() {\n this.pageSize += PAGE\n void this.reload()\n }\n\n /** Runs one door, then reads the list again - on success and on failure alike, so the row shows the truth. */\n private async act(entry: AssistantSessionEntry, change: string, run: () => Promise<boolean>, refused: string) {\n this.renamingId = ''\n this.notice = null\n try {\n if (!(await run())) this.error = refused\n else this.emit('assistant-session-changed', { sessionId: entry.id, change })\n } catch (error) {\n /* Never pass a failure silently - a person must not believe a conversation was deleted when it was not. */\n this.error = (error as Error).message\n }\n const error = this.error\n await this.reload()\n if (error && !this.error) this.error = error\n }\n\n private rename(entry: AssistantSessionEntry, name: string) {\n const trimmed = name.trim()\n this.renamingId = ''\n if (!trimmed || trimmed === entry.name) return\n void this.act(entry, 'renamed', () => this.admin.rename(entry.id, trimmed), t('rename-refused', 'this conversation could not be renamed.'))\n }\n\n private setHidden(entry: AssistantSessionEntry, hidden: boolean) {\n void this.act(entry, hidden ? 'hidden' : 'unhidden', () => this.admin.hide(entry.id, hidden), t('hide-refused', 'this conversation could not be hidden.'))\n }\n\n private setVisibility(entry: AssistantSessionEntry, visibility: SessionVisibility) {\n void this.act(\n entry,\n 'visibility',\n () => this.admin.setVisibility(entry.id, visibility),\n t('visibility-refused', 'only the owner of this conversation can change who reads it.')\n )\n }\n\n private _removeSession(entry: AssistantSessionEntry) {\n void this.act(entry, 'removed', () => this.admin.remove(entry.id), t('remove-refused', 'this conversation could not be deleted.'))\n }\n\n /**\n * Runs one door for each picked row, then reads the list again. Every success is told to the host like a row's own\n * change, so it moves off an open conversation that went; every refusal is said by name.\n */\n private async runMany(ids: string[], change: string, run: (id: string) => Promise<boolean>, done: (count: number) => string) {\n if (!ids.length || this.busy) return\n this.busy = true\n this.error = ''\n this.notice = null\n const names = new Map([...this.entries.map(entry => [entry.id, entry.name] as const), ...this.deleted.map(one => [one.id, one.name] as const)])\n const refused: string[] = []\n let count = 0\n for (const id of ids) {\n try {\n if (await run(id)) {\n count++\n this.emit('assistant-session-changed', { sessionId: id, change })\n } else refused.push(names.get(id) || t('untitled', 'Untitled conversation'))\n } catch (error) {\n refused.push(`${names.get(id) || t('untitled', 'Untitled conversation')} (${(error as Error).message})`)\n }\n }\n this.picked = []\n this.busy = false\n const error = refused.length ? t('some-refused', 'Not done for {count}: {names}', { count: refused.length, names: refused.join(', ') }) : ''\n await this.reload()\n if (count) this.notice = { text: done(count) }\n if (error) this.error = error\n }\n\n /** The sentence that says a deleted conversation can still come back - from 「Deleted」, for as long as it is kept. */\n private keptFor(): string {\n return this.keeping.deletedDays\n ? t('kept-for', 'You can bring it back from Deleted for {days} days.', { days: this.keeping.deletedDays })\n : t('kept', 'You can bring it back from Deleted.')\n }\n\n private async askRemoveMany(ids: string[]) {\n const ok = await this.ask(\n t('remove', 'Delete'),\n `${t('confirm-remove-many', 'Delete {count} conversations? They disappear for every participant.', { count: ids.length })} ${this.keptFor()}`,\n t('remove', 'Delete')\n )\n if (ok) void this.runMany(ids, 'removed', id => this.admin.remove(id), count => t('removed-many', '{count} deleted.', { count }))\n }\n\n private async askLeaveMany(ids: string[]) {\n const ok = await this.ask(\n t('leave', 'Leave'),\n t('confirm-leave-many', 'Leave {count} conversations? They stop coming to your list, and a group or private one is read again only when its owner brings you back.', { count: ids.length }),\n t('leave', 'Leave')\n )\n if (ok) void this.runMany(ids, 'left', id => this.admin.leave(id), count => t('left-many', 'Left {count}.', { count }))\n }\n\n private hideMany(ids: string[]) {\n void this.runMany(ids, 'hidden', id => this.admin.hide(id, true), count => t('hidden-many', '{count} hidden from your list.', { count }))\n }\n\n private restoreMany(ids: string[]) {\n void this.runMany(ids, 'restored', id => this.admin.restore(id), count => t('restored-many', '{count} brought back.', { count }))\n }\n\n private async restoreOne(one: DeletedSessionEntry) {\n const name = one.name || t('untitled', 'Untitled conversation')\n await this.runMany([one.id], 'restored', id => this.admin.restore(id), () => t('restored', '\"{name}\" is back.', { name }))\n if (this.notice) this.notice = { ...this.notice, open: { sessionId: one.id, kind: one.kind } }\n }\n\n /* ── drawing ─────────────────────────────────────────────────────────────────────── */\n\n render(): TemplateResult {\n const shown = this.entries.length\n\n return html`\n <div class=\"bar\">\n <input\n .value=${this.search}\n placeholder=${t('search', 'Search conversations')}\n aria-label=${t('search', 'Search conversations')}\n @input=${(e: Event) => this.onSearch((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Escape' && this.search) { e.stopPropagation(); this.onSearch('') } }}\n />\n <button class=\"new\" @click=${() => this.emit('assistant-session-reset')}>+ ${t('new', 'New conversation')}</button>\n </div>\n <div class=\"filters\">\n ${this.view === 'deleted' ? nothing : html`<select aria-label=${t('filter-whose', 'Whose')} .value=${this.whose}\n @change=${(e: Event) => this.refilter(() => (this.whose = (e.target as HTMLSelectElement).value as any))}>\n <option value=\"all\">${t('filter-all', 'All')}</option>\n <option value=\"mine\">${t('filter-mine', 'Started by me')}</option>\n <option value=\"participant\">${t('filter-participant', \"I'm in\")}</option>\n </select>\n <select aria-label=${t('filter-visibility', 'Visibility')} .value=${this.visibility}\n @change=${(e: Event) => this.refilter(() => (this.visibility = (e.target as HTMLSelectElement).value as any))}>\n <option value=\"all\">${t('filter-any-visibility', 'Anyone')}</option>\n <option value=\"open\">${t('filter-open', 'Public')}</option>\n <option value=\"group\">${t('filter-group', 'Group')}</option>\n <option value=\"private\">${t('filter-private', 'Private')}</option>\n </select>`}\n <select aria-label=${t('filter-view', 'Show')} .value=${this.view}\n @change=${(e: Event) => this.setView((e.target as HTMLSelectElement).value as SessionView)}>\n <option value=\"list\">${t('view-list', 'Active')}</option>\n <option value=\"archived\">${t('view-archived', 'Including archived')}</option>\n <option value=\"cleanup\">${t('view-cleanup', 'Suggested to clear')}</option>\n <option value=\"deleted\">${t('view-deleted', 'Deleted')}</option>\n </select>\n ${this.view === 'deleted' ? nothing : html`<label><input type=\"checkbox\" .checked=${this.unreadOnly}\n @change=${(e: Event) => this.refilter(() => (this.unreadOnly = (e.target as HTMLInputElement).checked))} />${t('filter-unread', 'Unread')}</label>\n <label><input type=\"checkbox\" .checked=${this.includeHidden}\n @change=${(e: Event) => this.refilter(() => (this.includeHidden = (e.target as HTMLInputElement).checked))} />${t('filter-hidden', 'Including hidden')}</label>`}\n ${this.filtering ? html`<button class=\"clear\" @click=${() => this.clearFilters()}>${t('reset-filters', 'Clear search and filters')}</button>` : nothing}\n </div>\n ${this.renderPickBar()}\n <div class=\"list\">\n ${this.error ? html`<div class=\"note\" role=\"alert\">${this.error}</div>` : nothing}\n ${this.notice\n ? html`<div class=\"note\" role=\"status\">${this.notice.text}${this.notice.open\n ? html` <button class=\"open-link\" @click=${() => this.emit('assistant-session-select', this.notice!.open)}>${t('open', 'Open')}</button>`\n : nothing}</div>`\n : nothing}\n ${this.loading ? html`<div class=\"note\" role=\"status\">${t('loading', 'Loading conversations…')}</div>` : nothing}\n ${this.view === 'list' && this.cleanupCount > 0 && !this.search.trim()\n ? html`<button class=\"suggest\" @click=${() => this.setView('cleanup')}>${t('cleanup-suggest', '{count} of yours look ready to clear - see them', { count: this.cleanupCount })}</button>`\n : nothing}\n ${this.view === 'deleted'\n ? this.deleted.length === 0 && !this.loading && !this.error\n ? html`<div class=\"empty\" role=\"status\">${t('deleted-empty', 'Nothing you deleted here is kept.')}</div>`\n : this.deleted.map(one => this.renderDeletedRow(one))\n : shown === 0 && !this.loading && !this.error\n ? html`<div class=\"empty\" role=\"status\">${this.view === 'cleanup'\n ? t('cleanup-empty', 'Nothing of yours to clear here.')\n : this.filtering ? t('filtered-empty', 'No conversations match these filters here.') : t('scope-empty', 'No conversations yet.')}</div>`\n : this.entries.map(entry => this.renderRow(entry))}\n ${this.view !== 'deleted' && shown < this.total\n ? html`<button class=\"more\" @click=${() => this.loadMore()}>${t('load-more', 'Show more ({rest})', { rest: this.total - shown })}</button>`\n : nothing}\n </div>\n <!-- A hidden conversation must not be forgotten: say how many, and one press shows them. -->\n ${this.hiddenCount > 0 && !this.includeHidden && (this.view === 'list' || this.view === 'archived')\n ? html`<button class=\"hiddenfilter\" @click=${() => this.refilter(() => (this.includeHidden = true))}>\n <md-icon>visibility_off</md-icon>${t('hidden-count', '{count} hidden', { count: this.hiddenCount })}\n </button>`\n : nothing}\n ${this.archivedCount > 0 && this.view === 'list'\n ? html`<button class=\"hiddenfilter\" @click=${() => this.setView('archived')}>\n <md-icon>inventory_2</md-icon>${t('archived-count', '{count} archived - no activity for {days} days', { count: this.archivedCount, days: this.keeping.archiveDays ?? '' })}\n </button>`\n : nothing}\n `\n }\n\n /** The box over the list: pick all, and what the picked ones can have done to them together. */\n private renderPickBar() {\n const rows: { id: string }[] = this.view === 'deleted' ? this.deleted : this.entries\n if (!rows.length) return nothing\n const picked = this.picked.length\n const all = picked === rows.length\n const toggleAll = (on: boolean) => (this.picked = on ? rows.map(row => row.id) : [])\n const label = picked ? t('picked', '{count} picked', { count: picked }) : t('pick-all', 'Pick all')\n if (this.view === 'deleted') {\n return html`<div class=\"pickbar\">\n <label><input type=\"checkbox\" .checked=${all} .indeterminate=${picked > 0 && !all} @change=${(e: Event) => toggleAll((e.target as HTMLInputElement).checked)} />${label}</label>\n ${picked\n ? html`<button class=\"act\" ?disabled=${this.busy} @click=${() => this.restoreMany(this.picked)}>${t('restore-many', 'Bring back {count}', { count: picked })}</button>\n <button class=\"act unpick\" @click=${() => (this.picked = [])}>${t('unpick', 'Clear the pick')}</button>`\n : nothing}\n </div>`\n }\n const can = bulkActions(this.entries.filter(entry => this.picked.includes(entry.id)))\n return html`<div class=\"pickbar\">\n <label><input type=\"checkbox\" .checked=${all} .indeterminate=${picked > 0 && !all} @change=${(e: Event) => toggleAll((e.target as HTMLInputElement).checked)} />${label}</label>\n ${picked\n ? html`${can.remove.length\n ? html`<button class=\"act danger\" ?disabled=${this.busy} @click=${() => this.askRemoveMany(can.remove)}>${t('remove-many', 'Delete {count}', { count: can.remove.length })}</button>`\n : nothing}\n ${can.leave.length\n ? html`<button class=\"act\" ?disabled=${this.busy} @click=${() => this.askLeaveMany(can.leave)}>${t('leave-many', 'Leave {count}', { count: can.leave.length })}</button>`\n : nothing}\n ${can.hide.length\n ? html`<button class=\"act\" ?disabled=${this.busy} @click=${() => this.hideMany(can.hide)}>${t('hide-many', 'Hide {count}', { count: can.hide.length })}</button>`\n : nothing}\n <button class=\"act unpick\" @click=${() => (this.picked = [])}>${t('unpick', 'Clear the pick')}</button>`\n : nothing}\n </div>`\n }\n\n private renderDeletedRow(one: DeletedSessionEntry): TemplateResult {\n const name = one.name || t('untitled', 'Untitled conversation')\n const day = (at?: string) => (at && Number.isFinite(Date.parse(at)) ? new Intl.DateTimeFormat(i18next.language || 'en', { month: 'short', day: 'numeric' }).format(new Date(at)) : '')\n return html`<div class=\"row deleted\">\n <label class=\"pick-area\"><input type=\"checkbox\" class=\"pick\" aria-label=${t('pick', 'Pick {name}', { name })} .checked=${this.picked.includes(one.id)}\n @change=${(e: Event) => this.togglePick(one.id, (e.target as HTMLInputElement).checked)} /></label>\n <div class=\"open-row\">\n <div class=\"title\">${name}</div>\n <span class=\"meta\">${t('deleted-on', 'Deleted {date}', { date: day(one.deletedAt) })}${one.purgesAt ? html` · ${t('purges-on', 'emptied {date}', { date: day(one.purgesAt) })}` : nothing}</span>\n </div>\n <button class=\"restore\" ?disabled=${this.busy} @click=${() => this.restoreOne(one)}>${t('restore', 'Bring back')}</button>\n </div>`\n }\n\n /** Why a row is where it is: archived, or suggested for clearing. */\n private renderState(entry: AssistantSessionEntry) {\n if (entry.cleanupReason === 'empty') return html` · ${t('reason-empty', 'Never asked anything')}`\n if (entry.cleanupReason === 'inactive') return html` · ${t('reason-inactive', 'No activity for {days} days', { days: entry.idleDays ?? '' })}`\n return entry.archived ? html` · ${t('archived', 'Archived')}` : nothing\n }\n\n private renderRow(entry: AssistantSessionEntry): TemplateResult {\n const name = entry.name || t('untitled', 'Untitled conversation')\n const actions = sessionActions(entry)\n const isOpen = !entry.visibility || entry.visibility === 'open'\n\n if (this.renamingId === entry.id) {\n return html`<div class=\"row\">\n <span class=\"dot\"></span>\n <input\n class=\"rename\"\n .value=${entry.name || ''}\n aria-label=${t('rename', 'Rename')}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter') this.rename(entry, (e.target as HTMLInputElement).value)\n if (e.key === 'Escape') { e.stopPropagation(); this.renamingId = '' }\n }}\n @blur=${(e: Event) => this.rename(entry, (e.target as HTMLInputElement).value)}\n />\n </div>`\n }\n\n return html`<div\n class=\"row ${entry.unread ? 'unread' : ''} ${entry.hidden ? 'hidden' : ''} ${entry.id === this.sessionId ? 'current' : ''} ${isOpen ? 'open-audience' : ''}\"\n >\n <label class=\"pick-area\"><input type=\"checkbox\" class=\"pick\" aria-label=${t('pick', 'Pick {name}', { name })} .checked=${this.picked.includes(entry.id)}\n @change=${(e: Event) => this.togglePick(entry.id, (e.target as HTMLInputElement).checked)} /></label>\n <span class=\"dot\"></span>\n <button class=\"open-row\" aria-current=${entry.id === this.sessionId ? 'true' : 'false'} @click=${() => this.emit('assistant-session-select', { sessionId: entry.id, kind: entry.kind })}>\n <div class=\"title\">${name}</div>\n <div class=\"prev\">${entry.lastMessagePreview || ''}</div>\n <span class=\"meta\">${this.renderAudience(entry.visibility)}${entry.lastMessageAt && Number.isFinite(Date.parse(entry.lastMessageAt)) ? html` · <time datetime=${entry.lastMessageAt}>${new Intl.DateTimeFormat(i18next.language || 'en', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(entry.lastMessageAt))}</time>` : nothing}${entry.mine ? html` · ${t('filter-mine', 'Started by me')}` : nothing}${this.renderState(entry)}</span>\n </button>\n <button\n class=\"more-menu\"\n aria-label=${t('manage', 'Manage conversation')}\n title=${t('manage', 'Manage conversation')}\n @click=${(e: MouseEvent) => this.openRowMenu(e, entry, name)}>⋯</button>\n </div>`\n }\n\n /**\n * A row's actions in the platform's popup menu - one open at a time, closed by a press outside or Escape, placed\n * inside the window. The hand-made menu it replaces stayed open and stacked over the next rows.\n */\n private openRowMenu(event: MouseEvent, entry: AssistantSessionEntry, name: string) {\n event.stopPropagation()\n const actions = sessionActions(entry)\n const current = entry.visibility || 'open'\n const at = (event.currentTarget as HTMLElement).getBoundingClientRect()\n OxPopupMenu.open({\n template: html`\n ${actions.rename ? html`<ox-popup-menuitem label=${t('rename', 'Rename')} @select=${() => (this.renamingId = entry.id)}></ox-popup-menuitem>` : nothing}\n ${actions.setVisibility && current !== 'open'\n ? html`<ox-popup-menuitem label=${t('make-open', 'Make public')} @select=${() => this.askOpen(entry, name)}></ox-popup-menuitem>`\n : nothing}\n ${actions.setVisibility && current !== 'group'\n ? html`<ox-popup-menuitem label=${t('make-group', 'Make it a group')} @select=${() => this.setVisibility(entry, 'group')}></ox-popup-menuitem>`\n : nothing}\n ${actions.setVisibility && current !== 'private'\n ? html`<ox-popup-menuitem label=${t('make-private', 'Make private')} @select=${() => this.askPrivate(entry, name)}></ox-popup-menuitem>`\n : nothing}\n ${actions.leave ? html`<ox-popup-menuitem label=${t('leave', 'Leave')} @select=${() => this.askLeave(entry, name)}></ox-popup-menuitem>` : nothing}\n <ox-popup-menuitem\n label=${actions.unhide ? t('unhide', 'Show in my list') : t('hide', 'Hide from my list')}\n @select=${() => this.setHidden(entry, !entry.hidden)}></ox-popup-menuitem>\n ${actions.remove ? html`<ox-popup-menuitem label=${t('remove', 'Delete')} @select=${() => this.askRemove(entry, name)}></ox-popup-menuitem>` : nothing}\n `,\n top: at.bottom,\n right: window.innerWidth - at.right,\n parent: document.body\n })\n }\n\n /** Before what cannot be taken back - the platform's confirm, [Cancel][OK] (decided 2026-09-25, §7-3). */\n private async ask(title: string, text: string, confirmText: string): Promise<boolean> {\n return !!(await OxPrompt.open({\n type: 'warning',\n title,\n text,\n confirmButton: { text: confirmText },\n cancelButton: { text: t('cancel', 'Cancel') }\n }))\n }\n\n private async askRemove(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('remove', 'Delete'),\n `${t('confirm-remove', 'Delete \"{name}\"? It disappears for every participant.', { name })} ${this.keptFor()}`,\n t('remove', 'Delete')\n )\n if (ok) this._removeSession(entry)\n }\n\n private async askOpen(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('make-open', 'Make public'),\n t('confirm-open', 'Make \"{name}\" public? Everyone in this domain will be able to read what is already written.', { name }),\n t('make-open', 'Make public')\n )\n if (ok) this.setVisibility(entry, 'open')\n }\n\n /* Private is the owner's alone - the people in it leave, and coming back is being invited again. */\n private async askPrivate(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('make-private', 'Make private'),\n t('confirm-private', 'Make \"{name}\" private? Only you will read it, and everyone else in it leaves.', { name }),\n t('make-private', 'Make private')\n )\n if (ok) this.setVisibility(entry, 'private')\n }\n\n private async askLeave(entry: AssistantSessionEntry, name: string) {\n const ok = await this.ask(\n t('leave', 'Leave'),\n entry.visibility === 'open'\n ? t('confirm-leave-open', 'Leave \"{name}\"? It stops coming to your list.', { name })\n : t('confirm-leave', 'Leave \"{name}\"? You will not read it again unless its owner brings you back.', { name }),\n t('leave', 'Leave')\n )\n if (ok) void this.act(entry, 'left', () => this.admin.leave(entry.id), t('leave-refused', 'you could not leave this conversation.'))\n }\n\n /** Who reads a conversation, on its row: the same three words wherever a conversation is listed. */\n private renderAudience(visibility?: string) {\n const v = visibility || 'open'\n const icon = v === 'open' ? 'public' : v === 'group' ? 'group' : 'lock'\n const label =\n v === 'open'\n ? t('audience-open', 'Everyone in this domain')\n : v === 'group'\n ? t('audience-group', 'Invited people')\n : t('audience-private', 'Only me')\n return html`<span class=\"audience ${v}\"><md-icon aria-hidden=\"true\">${icon}</md-icon>${label}</span>`\n }\n}\n"]}
|
package/dist-client/index.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export * from './utils/assistant-proposals.js';
|
|
|
23
23
|
export * from './components/workspace-view.js';
|
|
24
24
|
export * from './utils/assistant-ask.js';
|
|
25
25
|
export * from './utils/assistant-selection.js';
|
|
26
|
+
export * from './components/assistant-selection-bar.js';
|
|
26
27
|
export * from './utils/assistant-activity.js';
|
|
27
28
|
export * from './utils/assistant-request-context.js';
|
|
28
29
|
export * from './utils/assistant-capability.js';
|
package/dist-client/index.js
CHANGED
|
@@ -24,6 +24,8 @@ export * from './utils/assistant-proposals.js';
|
|
|
24
24
|
export * from './components/workspace-view.js';
|
|
25
25
|
export * from './utils/assistant-ask.js';
|
|
26
26
|
export * from './utils/assistant-selection.js';
|
|
27
|
+
/* 「AI와 작업」 over a list - every application's lists hand their picked rows by it (shared-dock §2-11-1). */
|
|
28
|
+
export * from './components/assistant-selection-bar.js';
|
|
27
29
|
export * from './utils/assistant-activity.js';
|
|
28
30
|
export * from './utils/assistant-request-context.js';
|
|
29
31
|
export * from './utils/assistant-capability.js';
|
package/dist-client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oCAAoC,CAAA;AAClD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uCAAuC,CAAA;AACrD,cAAc,yCAAyC,CAAA;AACvD,cAAc,wCAAwC,CAAA;AACtD,cAAc,2CAA2C,CAAA;AACzD,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AACzD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,iFAAiF;AACjF,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,sCAAsC,CAAA;AACpD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA","sourcesContent":["/**\n * `@things-factory/ai-assistant` — 대화면.\n *\n * 표준 컴포넌트는 `<ox-assistant-chat>` 이다.\n */\nexport * from './components/assistant-chat.js'\nexport * from './components/chat-defaults.js'\nexport * from './components/assistant-mode.js'\nexport * from './components/markdown.js'\nexport * from './components/chat-echo-dedup.js'\nexport * from './components/chat-input-builder.js'\nexport * from './components/mention-popup.js'\nexport * from './components/mention-popup-helpers.js'\nexport * from './utils/assistant-session-controller.js'\nexport * from './utils/assistant-session-transport.js'\nexport * from './components/assistant-session-toolbar.js'\nexport * from './utils/assistant-session-admin.js'\nexport * from './components/assistant-session-manager.js'\nexport * from './components/assistant-dock.js'\nexport * from './setup-assistant-dock.js'\nexport * from './utils/assistant-surface.js'\nexport * from './utils/assistant-proposals.js'\n/* The AI 작업판's blocks, drawn - also a dashboard card's (ADR-0160 decision 5). */\nexport * from './components/workspace-view.js'\nexport * from './utils/assistant-ask.js'\nexport * from './utils/assistant-selection.js'\nexport * from './utils/assistant-activity.js'\nexport * from './utils/assistant-request-context.js'\nexport * from './utils/assistant-capability.js'\nexport * from './utils/assistant-capability-read.js'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oCAAoC,CAAA;AAClD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uCAAuC,CAAA;AACrD,cAAc,yCAAyC,CAAA;AACvD,cAAc,wCAAwC,CAAA;AACtD,cAAc,2CAA2C,CAAA;AACzD,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AACzD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,iFAAiF;AACjF,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,0GAA0G;AAC1G,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,sCAAsC,CAAA;AACpD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA","sourcesContent":["/**\n * `@things-factory/ai-assistant` — 대화면.\n *\n * 표준 컴포넌트는 `<ox-assistant-chat>` 이다.\n */\nexport * from './components/assistant-chat.js'\nexport * from './components/chat-defaults.js'\nexport * from './components/assistant-mode.js'\nexport * from './components/markdown.js'\nexport * from './components/chat-echo-dedup.js'\nexport * from './components/chat-input-builder.js'\nexport * from './components/mention-popup.js'\nexport * from './components/mention-popup-helpers.js'\nexport * from './utils/assistant-session-controller.js'\nexport * from './utils/assistant-session-transport.js'\nexport * from './components/assistant-session-toolbar.js'\nexport * from './utils/assistant-session-admin.js'\nexport * from './components/assistant-session-manager.js'\nexport * from './components/assistant-dock.js'\nexport * from './setup-assistant-dock.js'\nexport * from './utils/assistant-surface.js'\nexport * from './utils/assistant-proposals.js'\n/* The AI 작업판's blocks, drawn - also a dashboard card's (ADR-0160 decision 5). */\nexport * from './components/workspace-view.js'\nexport * from './utils/assistant-ask.js'\nexport * from './utils/assistant-selection.js'\n/* 「AI와 작업」 over a list - every application's lists hand their picked rows by it (shared-dock §2-11-1). */\nexport * from './components/assistant-selection-bar.js'\nexport * from './utils/assistant-activity.js'\nexport * from './utils/assistant-request-context.js'\nexport * from './utils/assistant-capability.js'\nexport * from './utils/assistant-capability-read.js'\n"]}
|