@threadplane/chat 0.0.51 → 0.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"threadplane-chat.mjs","sources":["../../../../libs/chat/src/lib/agent/agent-error.ts","../../../../libs/chat/src/lib/agent/to-agent-error.ts","../../../../libs/chat/src/lib/agent/message.ts","../../../../libs/chat/src/lib/agent/agent-ref.ts","../../../../libs/chat/src/lib/primitives/chat-message-list/message-template.directive.ts","../../../../libs/chat/src/lib/styles/chat-tokens.ts","../../../../libs/chat/src/lib/styles/chat-message-list.styles.ts","../../../../libs/chat/src/lib/primitives/chat-message-list/chat-message-list.component.ts","../../../../libs/chat/src/lib/styles/chat-message.styles.ts","../../../../libs/chat/src/lib/primitives/chat-citations/chat-citations-card.component.ts","../../../../libs/chat/src/lib/markdown/citations-resolver.service.ts","../../../../libs/chat/src/lib/primitives/chat-citations/chat-citations.component.ts","../../../../libs/chat/src/lib/primitives/chat-message/chat-message.component.ts","../../../../libs/chat/src/lib/styles/chat-message-actions.styles.ts","../../../../libs/chat/src/lib/primitives/chat-message-actions/chat-message-actions.component.ts","../../../../libs/chat/src/lib/styles/chat-window.styles.ts","../../../../libs/chat/src/lib/primitives/chat-window/chat-window.component.ts","../../../../libs/chat/src/lib/styles/chat-trace.styles.ts","../../../../libs/chat/src/lib/primitives/chat-trace/chat-trace.component.ts","../../../../libs/chat/src/lib/styles/chat-reasoning.styles.ts","../../../../libs/chat/src/lib/styles/chat-markdown.styles.ts","../../../../libs/chat/src/lib/markdown/markdown-view-registry.ts","../../../../libs/chat/src/lib/markdown/markdown-children.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-document.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-paragraph.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-heading.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-blockquote.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-list.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-list-item.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-code-block.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-thematic-break.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-text.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-emphasis.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-strong.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-strikethrough.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-inline-code.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-link.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-autolink.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-image.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-soft-break.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-hard-break.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-citation-reference.component.ts","../../../../libs/chat/src/lib/markdown/markdown-table-row.token.ts","../../../../libs/chat/src/lib/markdown/views/markdown-table-row.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-table.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts","../../../../libs/chat/src/lib/markdown/cacheplane-markdown-views.ts","../../../../libs/chat/src/lib/streaming/streaming-markdown.component.ts","../../../../libs/chat/src/lib/utils/format-duration.ts","../../../../libs/chat/src/lib/primitives/chat-reasoning/chat-reasoning.component.ts","../../../../libs/chat/src/lib/styles/chat-launcher-button.styles.ts","../../../../libs/chat/src/lib/primitives/chat-launcher-button/chat-launcher-button.component.ts","../../../../libs/chat/src/lib/styles/chat-suggestions.styles.ts","../../../../libs/chat/src/lib/primitives/chat-suggestions/chat-suggestions.component.ts","../../../../libs/chat/src/lib/styles/chat-input.styles.ts","../../../../libs/chat/src/lib/primitives/chat-input/chat-input.component.ts","../../../../libs/chat/src/lib/styles/chat-typing-indicator.styles.ts","../../../../libs/chat/src/lib/primitives/chat-typing-indicator/chat-typing-indicator.component.ts","../../../../libs/chat/src/lib/styles/chat-history-search-palette.styles.ts","../../../../libs/chat/src/lib/primitives/chat-history-search-palette/chat-history-search-palette.component.ts","../../../../libs/chat/src/lib/styles/chat-overflow-menu.styles.ts","../../../../libs/chat/src/lib/primitives/chat-overflow-menu/chat-overflow-menu.component.ts","../../../../libs/chat/src/lib/styles/chat-confirm-dialog.styles.ts","../../../../libs/chat/src/lib/primitives/chat-confirm-dialog/chat-confirm-dialog.component.ts","../../../../libs/chat/src/lib/styles/chat-scroll-bubble.styles.ts","../../../../libs/chat/src/lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component.ts","../../../../libs/chat/src/lib/styles/chat-error.styles.ts","../../../../libs/chat/src/lib/primitives/chat-error/chat-error.component.ts","../../../../libs/chat/src/lib/styles/chat-interrupt.styles.ts","../../../../libs/chat/src/lib/primitives/chat-interrupt/chat-interrupt.component.ts","../../../../libs/chat/src/lib/compositions/chat-tool-call-card/chat-tool-call-card.component.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-call-template.directive.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/group-summary.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/resolve-message-tool-calls.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-calls.component.ts","../../../../libs/chat/src/lib/styles/chat-generative-ui.styles.ts","../../../../libs/chat/src/lib/primitives/chat-generative-ui/normalize-json-render-spec.ts","../../../../libs/chat/src/lib/primitives/chat-generative-ui/chat-generative-ui.component.ts","../../../../libs/chat/src/lib/primitives/chat-tool-views/chat-tool-views.component.ts","../../../../libs/chat/src/lib/compositions/chat-subagent-card/chat-subagent-card.component.ts","../../../../libs/chat/src/lib/primitives/chat-subagents/chat-subagents.component.ts","../../../../libs/chat/src/lib/styles/chat-thread-list.styles.ts","../../../../libs/chat/src/lib/primitives/chat-thread-list/chat-thread-list.component.ts","../../../../libs/chat/src/lib/styles/chat-project-list.styles.ts","../../../../libs/chat/src/lib/primitives/chat-project-list/chat-project-list.component.ts","../../../../libs/chat/src/lib/primitives/chat-genui-skeleton/chat-genui-skeleton.component.ts","../../../../libs/chat/src/lib/primitives/chat-timeline/chat-timeline.component.ts","../../../../libs/chat/src/lib/styles/chat-welcome.styles.ts","../../../../libs/chat/src/lib/primitives/chat-welcome/chat-welcome.component.ts","../../../../libs/chat/src/lib/primitives/chat-welcome/chat-welcome-suggestion.component.ts","../../../../libs/chat/src/lib/styles/chat-select.styles.ts","../../../../libs/chat/src/lib/primitives/chat-select/chat-select.component.ts","../../../../libs/chat/src/lib/provide-chat.ts","../../../../libs/chat/src/lib/routing/thread-routing.ts","../../../../libs/chat/src/lib/lifecycle.ts","../../../../libs/chat/src/lib/client-tools/to-json-schema.ts","../../../../libs/chat/src/lib/client-tools/execute.ts","../../../../libs/chat/src/lib/client-tools/client-tool-executor.ts","../../../../libs/chat/src/lib/client-tools/client-tools-coordinator.ts","../../../../libs/chat/src/lib/a2ui/surface-to-spec.ts","../../../../libs/chat/src/lib/a2ui/build-action-message.ts","../../../../libs/chat/src/lib/a2ui/a2ui-default-fallback.component.ts","../../../../libs/chat/src/lib/a2ui/surface.component.ts","../../../../libs/chat/src/lib/streaming/parse-tree-store.ts","../../../../libs/chat/src/lib/a2ui/extract-bindings.ts","../../../../libs/chat/src/lib/a2ui/surface-store.ts","../../../../libs/chat/src/lib/streaming/trace.ts","../../../../libs/chat/src/lib/streaming/content-classifier.ts","../../../../libs/chat/src/lib/a2ui/envelope-normalizer.ts","../../../../libs/chat/src/lib/a2ui/partial-args-bridge.ts","../../../../libs/chat/src/lib/a2ui/action-label.ts","../../../../libs/chat/src/lib/compositions/shared/message-utils.ts","../../../../libs/chat/src/lib/compositions/chat/chat.component.ts","../../../../libs/chat/src/lib/compositions/chat-popup/chat-popup.component.ts","../../../../libs/chat/src/lib/compositions/chat-sidebar/chat-sidebar.component.ts","../../../../libs/chat/src/lib/compositions/chat-timeline-slider/chat-timeline-slider.component.ts","../../../../libs/chat/src/lib/styles/chat-sidenav.styles.ts","../../../../libs/chat/src/lib/compositions/chat-sidenav/chat-debug-gate.ts","../../../../libs/chat/src/lib/compositions/chat-sidenav/chat-sidenav.component.ts","../../../../libs/chat/src/lib/primitives/chat-sidenav-scrim/chat-sidenav-scrim.component.ts","../../../../libs/chat/src/lib/compositions/chat-interrupt-panel/chat-interrupt-panel.component.ts","../../../../libs/chat/src/lib/compositions/chat-approval-card/chat-approval-card.component.ts","../../../../libs/chat/src/lib/streaming/markdown-render.ts","../../../../libs/chat/src/lib/styles/chat-icons.ts","../../../../libs/chat/src/lib/a2ui/views.ts","../../../../libs/chat/src/lib/a2ui/catalog/audio-player.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/button.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/card.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/emit-binding.ts","../../../../libs/chat/src/lib/a2ui/catalog/check-box.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/column.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/date-time-input.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/divider.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/icon.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/image.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/list.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/modal.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/multiple-choice.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/row.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/slider.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/tabs.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/text.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/text-field.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/video.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/index.ts","../../../../libs/chat/src/lib/client-tools/tools.ts","../../../../libs/chat/src/lib/testing/mock-agent.ts","../../../../libs/chat/src/public-api.ts","../../../../libs/chat/src/threadplane-chat.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n\n/**\n * The failure class of an {@link AgentError}, used to drive UI and retry logic:\n *\n * - `connection` — offline / DNS / connection refused / `fetch` failed. Retryable.\n * - `auth` — `401` / `403`; credentials or API key are wrong. Not retryable.\n * - `server` — a `5xx` (retryable) or a non-auth `4xx` like `400`/`404`/`429` (not retryable).\n * - `interrupted` — the stream closed mid-response after a run had started. Retryable.\n * - `aborted` — the user pressed stop; treated as a graceful idle, not surfaced as an error.\n */\nexport type AgentErrorKind = 'connection' | 'auth' | 'server' | 'interrupted' | 'aborted';\n\n/**\n * Structured, classified failure surfaced on `Agent.error`. Extends `Error`, so\n * existing `.message` / `instanceof Error` reads keep working — but adds a\n * machine-readable {@link AgentErrorKind}, a `retryable` flag, an optional HTTP\n * `status`, and the original `cause`.\n *\n * You rarely construct one yourself; adapters normalize raw failures via\n * {@link toAgentError}. Read it off the agent to render legible, cause-specific UI:\n *\n * @example\n * ```ts\n * const err = agent.error(); // AgentError | undefined\n * if (err) {\n * console.warn(err.message); // legible, per-kind copy\n * if (err.kind === 'auth') showApiKeyHelp();\n * if (err.retryable) showRetryButton(); // → agent.retry()\n * }\n * ```\n */\nexport class AgentError extends Error {\n /** The classified failure type. See {@link AgentErrorKind}. */\n readonly kind: AgentErrorKind;\n /** Whether retrying the same request could plausibly succeed:\n * `connection` | `server` (5xx) | `interrupted` → true; `auth` | `aborted` | non-auth `4xx` → false. */\n readonly retryable: boolean;\n /** The HTTP status code when the failure came from an HTTP response. */\n readonly status?: number;\n /** The original raw error this was classified from, preserved for debugging/telemetry. */\n override readonly cause: unknown;\n\n constructor(init: { kind: AgentErrorKind; message: string; retryable: boolean; status?: number; cause?: unknown }) {\n super(init.message);\n this.name = 'AgentError';\n this.kind = init.kind;\n this.retryable = init.retryable;\n this.status = init.status;\n this.cause = init.cause;\n }\n}\n\n/**\n * Default, human-facing copy per {@link AgentErrorKind}. Used as the message when\n * a classified error has no better text. Override by mapping `error.kind` to your\n * own strings in a custom error component.\n */\nexport const AGENT_ERROR_MESSAGES: Record<AgentErrorKind, string> = {\n connection: \"Can't reach the server. Check your connection and try again.\",\n auth: 'Authentication failed. Check your API key or credentials.',\n server: 'The server ran into an error. You can try again.',\n interrupted: 'The response was interrupted. Try again.',\n aborted: 'Stopped.',\n};\n","// SPDX-License-Identifier: MIT\nimport { AgentError, AGENT_ERROR_MESSAGES, type AgentErrorKind } from './agent-error';\n\n/**\n * Whether `raw` represents an abort (a `DOMException`/`Error` named `AbortError`,\n * or an abort-ish message). Shared by the runtime adapters and {@link toAgentError}\n * so a user-requested stop settles to idle instead of surfacing as an error.\n *\n * @param raw Any thrown/rejected value.\n * @returns `true` if it looks like an abort.\n */\nexport function isAbortError(raw: unknown): boolean {\n return raw instanceof Error && (raw.name === 'AbortError' || /\\babort/i.test(raw.message));\n}\n\n/**\n * Reads a numeric status from `raw.status` or `raw.cause.status` only.\n * No text parsing — structured fields only.\n */\nfunction structuredStatus(raw: unknown): number | undefined {\n const obj = raw as { status?: unknown; cause?: { status?: unknown } } | null;\n const direct = typeof obj?.status === 'number' ? obj.status : undefined;\n const viaCause = typeof obj?.cause?.status === 'number' ? obj!.cause!.status : undefined;\n if (direct !== undefined) return direct;\n if (viaCause !== undefined) return viaCause;\n return undefined;\n}\n\nfunction isConnectionError(raw: unknown): boolean {\n if (!(raw instanceof Error)) return false;\n return /failed to fetch|networkerror|econnrefused|enotfound|network request failed|load failed/i.test(\n `${raw.name} ${raw.message}`,\n );\n}\n\n/**\n * Extracts an HTTP status code from a message string, but ONLY when the token\n * is unambiguously HTTP-shaped:\n * - `HTTP/502`, `HTTP 404`, `HTTP404`\n * - `status: 503`, `status=503`, `code: 404`\n *\n * Bare 3-digit numbers (e.g. model version strings like \"gpt-500\") are NOT matched.\n */\nfunction httpStatusFromMessage(raw: unknown): number | undefined {\n const msg =\n raw instanceof Error ? raw.message : typeof raw === 'string' ? raw : '';\n if (!msg) return undefined;\n\n // \"HTTP 500\", \"HTTP/500\", \"HTTP500\"\n const httpToken = /\\bHTTP[ /]?(\\d{3})\\b/i.exec(msg);\n if (httpToken) return Number(httpToken[1]);\n\n // \"status: 503\", \"status=503\", \"status 503\" (up to 4 non-digit chars between keyword and digits)\n // Also matches \"code: 404\", \"code=404\", etc.\n const prefixed = /\\b(?:status|code)\\b\\D{0,4}(\\d{3})\\b/i.exec(msg);\n if (prefixed) return Number(prefixed[1]);\n\n return undefined;\n}\n\nfunction make(kind: AgentErrorKind, retryable: boolean, raw: unknown, status?: number, message?: string): AgentError {\n return new AgentError({ kind, retryable, status, cause: raw, message: message ?? AGENT_ERROR_MESSAGES[kind] });\n}\n\nfunction classifyByStatus(status: number, raw: unknown): AgentError {\n if (status === 401 || status === 403) return make('auth', false, raw, status);\n if (status >= 500) return make('server', true, raw, status);\n if (status >= 400) return make('server', false, raw, status, `The request was rejected (HTTP ${status}).`);\n // Stray 2xx/3xx from a status field — treat as unknown transient failure, no status.\n return make('server', true, raw, undefined, 'Something went wrong. You can try again.');\n}\n\n/**\n * Classify any raw error into a structured {@link AgentError}.\n *\n * Resolution order (first match wins): an existing `AgentError` is returned\n * unchanged (idempotent) → a user abort → a structured `status`/`cause.status`\n * → network/connection markers → an HTTP-shaped status in the message → a\n * `server` + retryable fallback. The original error is always preserved on\n * `cause`. Runtime adapters call this before setting `Agent.error`; custom\n * backends can call it too (or throw an `AgentError` directly).\n *\n * @param raw Any thrown/rejected value — an `Error`, a `{ status }` object, a string, etc.\n * @returns The classified {@link AgentError} (kind, retryable, status?, cause).\n * @example\n * ```ts\n * const e = toAgentError(new Error('HTTP 500: Internal Server Error'));\n * e.kind; // 'server'\n * e.retryable; // true\n * e.status; // 500\n * ```\n */\nexport function toAgentError(raw: unknown): AgentError {\n if (raw instanceof AgentError) return raw;\n if (isAbortError(raw)) return make('aborted', false, raw);\n\n // 1. Structured status (authoritative): raw.status or raw.cause.status.\n const structured = structuredStatus(raw);\n if (structured !== undefined) return classifyByStatus(structured, raw);\n\n // 2. Network/connection markers are definitive — before any loose text parsing.\n if (isConnectionError(raw)) return make('connection', true, raw);\n\n // 3. Best-effort: only an HTTP-shaped status token in the message counts.\n const httpStatus = httpStatusFromMessage(raw);\n if (httpStatus !== undefined) return classifyByStatus(httpStatus, raw);\n\n // 4. Fallback: unknown failure, assume transient.\n const msg = raw instanceof Error && raw.message ? raw.message : 'Something went wrong. You can try again.';\n return make('server', true, raw, undefined, msg);\n}\n","// SPDX-License-Identifier: MIT\nimport type { ContentBlock } from './content-block';\nimport type { Citation } from './citation';\n\nexport type Role = 'user' | 'assistant' | 'system' | 'tool';\n\nexport interface Message {\n id: string;\n role: Role;\n /** Plain text, or a list of structured content blocks. */\n content: string | ContentBlock[];\n /** Present when role === 'tool'. */\n toolCallId?: string;\n /** Optional display/author name. */\n name?: string;\n /**\n * Reasoning text emitted by the model before/alongside the visible\n * response. Populated by adapters from {type:'reasoning'} or\n * {type:'thinking'} content blocks (LangGraph) or REASONING_MESSAGE_*\n * events (AG-UI). Always a plain string — provider-specific shape\n * (encrypted blocks, multi-step summaries) is absorbed by the adapter\n * and not surfaced here.\n */\n reasoning?: string;\n /**\n * Wall-clock duration of the reasoning phase in milliseconds.\n * Populated by the adapter when both start (first reasoning chunk) and\n * end (first response-text chunk, or final canonical message) are\n * known. Undefined when reasoning timing isn't available.\n */\n reasoningDurationMs?: number;\n /** Runtime-specific extras; do not rely on shape in portable code. */\n extra?: Record<string, unknown>;\n /** Provider-agnostic citation list. Populated by adapters. */\n citations?: Citation[];\n /**\n * IDs of tool calls emitted BY this assistant message. Populated by\n * adapters from provider-native fields (LangGraph: `tool_calls[].id`;\n * Anthropic: `tool_use` content blocks). Used by `<chat-tool-calls>` to\n * scope its rendering to a single message — otherwise it falls back to\n * the agent's global toolCalls list, which renders duplicates across\n * every AI message in a thread.\n */\n toolCallIds?: string[];\n}\n\nexport function isUserMessage(m: Message): m is Message & { role: 'user' } {\n return m.role === 'user';\n}\n\nexport function isAssistantMessage(m: Message): m is Message & { role: 'assistant' } {\n return m.role === 'assistant';\n}\n\nexport function isToolMessage(m: Message): m is Message & { role: 'tool' } {\n return m.role === 'tool';\n}\n\nexport function isSystemMessage(m: Message): m is Message & { role: 'system' } {\n return m.role === 'system';\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken } from '@angular/core';\nimport type { Agent } from './agent';\n\n/** A typed handle that threads a state shape through Angular DI from\n * `provideAgent(ref, …)` to `injectAgent(ref)` without per-call-site\n * restatement of the generic. */\nexport interface AgentRef<TState> {\n readonly token: InjectionToken<Agent<TState>>;\n}\n\n/**\n * Create a typed agent handle.\n *\n * @param debugName Optional name shown in Angular DI error messages.\n * @returns An {@link AgentRef} carrying a state-typed `InjectionToken`.\n * @example\n * ```ts\n * interface TripState { day: number; places: string[]; }\n * export const TRIP = createAgentRef<TripState>('trip');\n * // app.config.ts: provideAgent(TRIP, { assistantId: 'trip' })\n * // component: const agent = injectAgent(TRIP); // LangGraphAgent<TripState>\n * ```\n */\nexport function createAgentRef<TState>(debugName?: string): AgentRef<TState> {\n return { token: new InjectionToken<Agent<TState>>(debugName ?? 'ThreadplaneAgent') };\n}\n","// SPDX-License-Identifier: MIT\nimport { Directive, input, TemplateRef, inject } from '@angular/core';\nimport type { MessageTemplateType } from '../../chat.types';\n\n@Directive({\n selector: 'ng-template[chatMessageTemplate]',\n standalone: true,\n})\nexport class MessageTemplateDirective {\n readonly chatMessageTemplate = input.required<MessageTemplateType>();\n readonly templateRef = inject(TemplateRef);\n}\n","// libs/chat/src/lib/styles/chat-tokens.ts\n// SPDX-License-Identifier: MIT\n\nconst LIGHT_TOKENS = `\n --ngaf-chat-bg: rgb(255, 255, 255);\n --ngaf-chat-surface: rgb(255, 255, 255);\n --ngaf-chat-surface-alt: rgb(251, 251, 251);\n --ngaf-chat-primary: rgb(28, 28, 28);\n --ngaf-chat-on-primary: rgb(255, 255, 255);\n --ngaf-chat-text: rgb(28, 28, 28);\n --ngaf-chat-text-muted: rgb(115, 115, 115);\n --ngaf-chat-separator: rgb(229, 229, 229);\n --ngaf-chat-muted: rgb(200, 200, 200);\n --ngaf-chat-error-bg: #fef2f2;\n --ngaf-chat-error-border: #fecaca;\n --ngaf-chat-error-text: #dc2626;\n --ngaf-chat-destructive: #dc2626;\n --ngaf-chat-warning-bg: #fffbeb;\n --ngaf-chat-warning-text: #b45309;\n --ngaf-chat-success: #16a34a;\n --ngaf-chat-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\n --ngaf-chat-shadow-md: 0 4px 6px -1px rgba(0,0,0,.10), 0 2px 4px -1px rgba(0,0,0,.06);\n --ngaf-chat-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.10), 0 4px 6px -2px rgba(0,0,0,.05);\n\n /* --a2ui-* light variant */\n --a2ui-primary: #4f8df5;\n --a2ui-on-primary: #ffffff;\n --a2ui-primary-hover: #3a78e0;\n --a2ui-secondary: #5f6470;\n --a2ui-on-secondary: #ffffff;\n --a2ui-surface: #ffffff;\n --a2ui-on-surface: #1a1d23;\n --a2ui-surface-variant: rgba(0, 0, 0, 0.04);\n --a2ui-on-surface-variant: rgba(0, 0, 0, 0.6);\n --a2ui-outline: rgba(0, 0, 0, 0.12);\n --a2ui-outline-variant: rgba(0, 0, 0, 0.06);\n --a2ui-error: #dc2626;\n --a2ui-on-error: #ffffff;\n --a2ui-scrim: rgba(0, 0, 0, 0.4);\n --a2ui-elevation-0: none;\n --a2ui-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.06);\n --a2ui-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.08);\n --a2ui-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.10);\n --a2ui-elevation-4: 0 8px 16px rgba(0, 0, 0, 0.14);\n --a2ui-elevation-5: 0 16px 32px rgba(0, 0, 0, 0.18);\n`;\n\nconst DARK_TOKENS = `\n --ngaf-chat-bg: rgb(17, 17, 17);\n --ngaf-chat-surface: rgb(28, 28, 28);\n --ngaf-chat-surface-alt: rgb(44, 44, 44);\n --ngaf-chat-primary: rgb(255, 255, 255);\n --ngaf-chat-on-primary: rgb(28, 28, 28);\n --ngaf-chat-text: rgb(245, 245, 245);\n --ngaf-chat-text-muted: rgb(160, 160, 160);\n --ngaf-chat-separator: rgb(45, 45, 45);\n --ngaf-chat-muted: rgb(60, 60, 60);\n --ngaf-chat-error-bg: rgb(45, 21, 21);\n --ngaf-chat-error-border: #dc2626;\n --ngaf-chat-error-text: #fca5a5;\n --ngaf-chat-destructive: #ef4444;\n --ngaf-chat-warning-bg: rgb(45, 35, 21);\n --ngaf-chat-warning-text: #fbbf24;\n --ngaf-chat-success: #4ade80;\n\n /* --a2ui-* dark variant (preserves current chat.css values) */\n --a2ui-primary: #4f8df5;\n --a2ui-on-primary: #ffffff;\n --a2ui-primary-hover: #6699f7;\n --a2ui-secondary: #8a92a3;\n --a2ui-on-secondary: #ffffff;\n --a2ui-surface: #1a1d23;\n --a2ui-on-surface: #ffffff;\n --a2ui-surface-variant: rgba(255, 255, 255, 0.05);\n --a2ui-on-surface-variant: rgba(255, 255, 255, 0.7);\n --a2ui-outline: rgba(255, 255, 255, 0.1);\n --a2ui-outline-variant: rgba(255, 255, 255, 0.05);\n --a2ui-error: #f5524f;\n --a2ui-on-error: #ffffff;\n --a2ui-scrim: rgba(0, 0, 0, 0.6);\n --a2ui-elevation-0: none;\n --a2ui-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.3);\n --a2ui-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.35);\n --a2ui-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.4);\n --a2ui-elevation-4: 0 8px 16px rgba(0, 0, 0, 0.45);\n --a2ui-elevation-5: 0 16px 32px rgba(0, 0, 0, 0.5);\n`;\n\nconst GEOMETRY_TOKENS = `\n --ngaf-chat-radius-bubble: 15px;\n --ngaf-chat-radius-input: 20px;\n --ngaf-chat-radius-card: 8px;\n --ngaf-chat-radius-button: 8px;\n --ngaf-chat-radius-launcher: 9999px;\n --ngaf-chat-max-width: 48rem;\n`;\n\nconst TYPOGRAPHY_TOKENS = `\n --ngaf-chat-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --ngaf-chat-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --ngaf-chat-font-size: 1rem;\n --ngaf-chat-font-size-sm: 0.875rem;\n --ngaf-chat-font-size-xs: 0.75rem;\n --ngaf-chat-line-height: 1.6;\n --ngaf-chat-line-height-tight: 1.5;\n`;\n\nconst SPACING_TOKENS = `\n --ngaf-chat-space-1: 4px;\n --ngaf-chat-space-2: 8px;\n --ngaf-chat-space-3: 12px;\n --ngaf-chat-space-4: 16px;\n --ngaf-chat-space-5: 20px;\n --ngaf-chat-space-6: 24px;\n --ngaf-chat-space-8: 32px;\n --ngaf-chat-edge-pad: 16px;\n --ngaf-chat-input-gap: 0.75rem;\n --ngaf-chat-sidenav-width-expanded: 280px;\n --ngaf-chat-sidenav-width-collapsed: 56px;\n --ngaf-chat-sidenav-width-drawer: 280px;\n`;\n\nconst LAYER_TOKENS = `\n /* Z-index layers — documented for consumers + future primitives.\n * Default values listed; overridable per-app via :root or :host.\n * Modal layers sit above drawer so palettes/dialogs stay reachable\n * when the drawer is open. */\n --ngaf-chat-z-overlay-content: 30; /* chat-sidebar panel, chat-popup window */\n --ngaf-chat-z-drawer-scrim: 1000; /* chat-sidenav-scrim backdrop */\n --ngaf-chat-z-drawer: 1001; /* chat-sidenav drawer mode host */\n --ngaf-chat-z-modal-scrim: 1100; /* chat-history-search-palette backdrop */\n --ngaf-chat-z-modal: 1101; /* chat-history-search-palette dialog */\n`;\n\nconst EDGE_CLAIM_TOKENS = `\n /* Edge-claim primitive — peer-aware panel coexistence.\n Each docked panel publishes the edge it occupies via a\n data-threadplane-chat-* attribute on <html>; other panels read these\n custom properties to leave room. Defaults to 0px so consumers\n not using chat-sidebar/chat-debug see zero overhead.\n\n TWO LAYERS:\n 1. Per-component claim vars (--ngaf-chat-<component>-claim-<edge>)\n are read by PEERS only — never by the component that wrote\n them. This eliminates self-feedback (where a right-docked\n panel would offset itself by reading its own claim).\n 2. Aggregate occupy-* vars are convenience reads for external\n consumers and for cases where any-panel-on-edge matters. */\n --ngaf-chat-occupy-top: 0px;\n --ngaf-chat-occupy-right: 0px;\n --ngaf-chat-occupy-bottom: 0px;\n --ngaf-chat-occupy-left: 0px;\n\n /* Per-component claims (peer-only reads). */\n --ngaf-chat-sidebar-claim-right: 0px;\n --ngaf-chat-debug-claim-top: 0px;\n --ngaf-chat-debug-claim-right: 0px;\n --ngaf-chat-debug-claim-bottom: 0px;\n --ngaf-chat-debug-claim-left: 0px;\n\n /* Sizes the chat-debug dock contributes when it claims an edge.\n Split by orientation so consumers can override independently. */\n --ngaf-chat-debug-panel-size-h: 40vh;\n --ngaf-chat-debug-panel-size-w: 420px;\n`;\n\nconst KEYFRAMES = `\n @keyframes ngaf-chat-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes ngaf-chat-typing-dot {\n 0%, 80%, 100% { transform: scale(0.5); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes ngaf-chat-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n @keyframes ngaf-chat-caret-blink {\n 0%, 50% { opacity: 1; }\n 50.01%, 100% { opacity: 0; }\n }\n @keyframes ngaf-chat-caret-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes ngaf-chat-welcome-mount {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n`;\n\n/**\n * Component-scoped styles. Imported into every chat component's `styles`\n * array. Carries only:\n * - `:host` font-family + color (so the component inherits text styling)\n * - keyframes the components use\n *\n * Token *defaults* are NOT set on `:host` — they're set on `:root` via the\n * shared style element below (`ensureChatRootStyles()`). That shift is what\n * makes the documented `:root { --ngaf-chat-*: ... }` consumer override\n * actually work, because direct-on-host token settings would shadow\n * inheritance regardless of CSS specificity.\n */\nexport const CHAT_HOST_TOKENS = `\n :host {\n font-family: var(--ngaf-chat-font-family);\n color: var(--ngaf-chat-text);\n }\n`;\n// Note: @keyframes are NOT placed in CHAT_HOST_TOKENS. Angular's emulated\n// view encapsulation scopes @keyframes names per-component, which can\n// desynchronise from animation property references when styles are\n// concatenated across helper strings. They're injected globally via\n// ROOT_TOKEN_STYLES below so the names match what `animation: ngaf-chat-*`\n// references in component styles (which Angular leaves untouched).\n\n/**\n * WCAG 2.3.3 — honor the OS-level \"Reduce Motion\" preference. Collapses\n * every transition/animation in the chat lib (and the a2ui catalog,\n * which renders in the same document) to instant. The `!important`\n * flag intentionally overrides any inline `style=\"transition: ...\"`\n * applied by future code — accessibility wins.\n *\n * Infinite-loop indicators (spinner, typing dots, caret, etc.) need\n * explicit `animation: none` because `iteration-count: 1` alone would\n * freeze them mid-loop, which reads as a bug.\n */\nconst REDUCED_MOTION_STYLES = `\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n\n .tcc__pill[data-status=\"running\"] svg,\n .ngaf-chat-typing-dot,\n .ngaf-chat-caret,\n .ngaf-chat-welcome__pulse,\n .chat-genui-skeleton,\n .chat-debug__pill--active {\n animation: none !important;\n opacity: 1 !important;\n }\n\n .tcc__pill[data-status=\"running\"] svg {\n transform: none !important;\n }\n}\n`;\n\n/**\n * Token defaults written to `<head>` once on first chat-component\n * construction. Wrapped in `@layer ngaf-chat` so the consumer's unlayered\n * `:root { --ngaf-chat-*: ... }` rule beats the lib's defaults regardless\n * of source order — the standard CSS pattern for framework defaults.\n *\n * Theme switching:\n * - `prefers-color-scheme: dark` → dark by default.\n * - `[data-theme=\"dark\"]` on `<html>` / `<body>` / any wrapper\n * forces dark.\n * - `[data-theme=\"light\"]` forces light.\n */\nconst A2UI_INVARIANT_TOKENS = `\n /* --a2ui-* theme-invariant tokens (spacing, typography, shape, motion, focus, aliases) */\n\n /* Spacing scale (4px base) */\n --a2ui-spacing-1: 4px;\n --a2ui-spacing-2: 8px;\n --a2ui-spacing-3: 12px;\n --a2ui-spacing-4: 16px;\n --a2ui-spacing-5: 24px;\n --a2ui-spacing-6: 32px;\n --a2ui-spacing-7: 40px;\n\n /* Typography (per Text usageHint) */\n --a2ui-typography-h1-size: 32px;\n --a2ui-typography-h1-weight: 700;\n --a2ui-typography-h1-line-height: 1.2;\n --a2ui-typography-h2-size: 24px;\n --a2ui-typography-h2-weight: 600;\n --a2ui-typography-h2-line-height: 1.3;\n --a2ui-typography-h3-size: 20px;\n --a2ui-typography-h3-weight: 600;\n --a2ui-typography-h3-line-height: 1.3;\n --a2ui-typography-h4-size: 18px;\n --a2ui-typography-h4-weight: 500;\n --a2ui-typography-h4-line-height: 1.4;\n --a2ui-typography-h5-size: 16px;\n --a2ui-typography-h5-weight: 500;\n --a2ui-typography-h5-line-height: 1.4;\n --a2ui-typography-body-size: 14px;\n --a2ui-typography-body-weight: 400;\n --a2ui-typography-body-line-height: 1.5;\n --a2ui-typography-caption-size: 12px;\n --a2ui-typography-caption-weight: 400;\n --a2ui-typography-caption-line-height: 1.4;\n --a2ui-typography-label-size: 12px;\n --a2ui-typography-label-weight: 500;\n\n /* Shape radius */\n --a2ui-shape-extra-small: 4px;\n --a2ui-shape-small: 8px;\n --a2ui-shape-medium: 12px;\n --a2ui-shape-large: 16px;\n --a2ui-shape-extra-large: 28px;\n\n /* Focus ring */\n --a2ui-focus-ring-color: var(--a2ui-primary);\n --a2ui-focus-ring-width: 2px;\n\n /* Motion */\n --a2ui-motion-duration-short: 100ms;\n --a2ui-motion-duration-medium: 200ms;\n --a2ui-motion-duration-long: 300ms;\n --a2ui-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);\n --a2ui-motion-easing-emphasized: cubic-bezier(0.2, 0, 0, 1.4);\n\n /* Aliases (kept for back-compat) */\n --a2ui-card-bg: var(--a2ui-surface);\n --a2ui-input-bg: var(--a2ui-surface-variant);\n --a2ui-input-text: var(--a2ui-on-surface);\n --a2ui-label: var(--a2ui-on-surface-variant);\n --a2ui-caption: var(--a2ui-on-surface-variant);\n --a2ui-border: var(--a2ui-outline);\n`;\n\nexport const ROOT_TOKEN_STYLES = `\n@layer ngaf-chat {\n :root {\n ${LIGHT_TOKENS}\n ${GEOMETRY_TOKENS}\n ${TYPOGRAPHY_TOKENS}\n ${SPACING_TOKENS}\n ${LAYER_TOKENS}\n ${EDGE_CLAIM_TOKENS}\n ${A2UI_INVARIANT_TOKENS}\n }\n @media (prefers-color-scheme: dark) {\n :root { ${DARK_TOKENS} }\n }\n :root[data-theme=\"light\"],\n [data-theme=\"light\"],\n :root[data-threadplane-chat-theme=\"light\"],\n [data-threadplane-chat-theme=\"light\"] { ${LIGHT_TOKENS} }\n :root[data-theme=\"dark\"],\n [data-theme=\"dark\"],\n :root[data-threadplane-chat-theme=\"dark\"],\n [data-threadplane-chat-theme=\"dark\"] { ${DARK_TOKENS} }\n\n /* Edge-claim attribute mappings.\n chat-sidebar sets data-threadplane-chat-sidebar=\"open\" while its panel is open.\n chat-debug sets data-threadplane-chat-debug to its current dock while open. */\n :root[data-threadplane-chat-sidebar=\"open\"] {\n --ngaf-chat-sidebar-claim-right: var(--ngaf-chat-sidebar-width-drawer, 28rem);\n --ngaf-chat-occupy-right: var(--ngaf-chat-sidebar-width-drawer, 28rem);\n }\n :root[data-threadplane-chat-debug=\"bottom\"] {\n --ngaf-chat-debug-claim-bottom: var(--ngaf-chat-debug-panel-size-h, 40vh);\n --ngaf-chat-occupy-bottom: var(--ngaf-chat-debug-panel-size-h, 40vh);\n }\n :root[data-threadplane-chat-debug=\"right\"] {\n --ngaf-chat-debug-claim-right: var(--ngaf-chat-debug-panel-size-w, 420px);\n --ngaf-chat-occupy-right: var(--ngaf-chat-debug-panel-size-w, 420px);\n }\n :root[data-threadplane-chat-debug=\"left\"] {\n --ngaf-chat-debug-claim-left: var(--ngaf-chat-debug-panel-size-w, 420px);\n --ngaf-chat-occupy-left: var(--ngaf-chat-debug-panel-size-w, 420px);\n }\n}\n${KEYFRAMES}\n${REDUCED_MOTION_STYLES}\n`;\n\nconst STYLE_ELEMENT_ID = 'ngaf-chat-root-tokens';\n\n/**\n * Idempotent: appends a `<style id=\"ngaf-chat-root-tokens\">` to `<head>`\n * the first time it's called. Subsequent calls are no-ops.\n *\n * No-op outside the browser (server-side rendering).\n */\nexport function ensureChatRootStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ELEMENT_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ELEMENT_ID;\n style.textContent = ROOT_TOKEN_STYLES;\n document.head.appendChild(style);\n}\n\n// Auto-inject on module evaluation. Every chat component imports\n// `CHAT_HOST_TOKENS` from this file, so the first chat component to load\n// triggers this once. Safe to evaluate eagerly: idempotent + SSR-guarded.\n//\n// Note: this side-effect call is the \"fast path\" — it normally fires\n// during the first chat-component import on the client. But production\n// bundlers with aggressive tree-shaking can drop it if they treat the\n// published artifact as side-effect-free (the published `sideEffects`\n// field doesn't match the bundled fesm filename, and TS-path consumers\n// route through the source where it does match). The top-level chat\n// compositions (`ChatComponent`, `ChatPopupComponent`,\n// `ChatSidebarComponent`, `ChatDebugComponent`) also call this from\n// their constructors so the injection is guaranteed even when the\n// module-eval call gets stripped. Both paths are idempotent.\nensureChatRootStyles();\n","// libs/chat/src/lib/styles/chat-message-list.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_MESSAGE_LIST_STYLES = `\n :host {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: var(--ngaf-chat-space-4) var(--ngaf-chat-space-6);\n max-width: var(--ngaf-chat-max-width);\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n }\n`;\n","// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n contentChildren,\n input,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent, Message } from '../../agent';\nimport { MessageTemplateDirective } from './message-template.directive';\nimport type { MessageTemplateType } from '../../chat.types';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_MESSAGE_LIST_STYLES } from '../../styles/chat-message-list.styles';\n\n/**\n * Maps a {@link Message} to a {@link MessageTemplateType}.\n * Exported as a standalone function so it can be unit-tested without DOM rendering.\n */\nexport function getMessageType(message: Message): MessageTemplateType {\n switch (message.role) {\n case 'user':\n return 'human';\n case 'assistant':\n return 'ai';\n case 'tool':\n return 'tool';\n case 'system':\n return 'system';\n default:\n return 'ai';\n }\n}\n\n@Component({\n selector: 'chat-message-list',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_MESSAGE_LIST_STYLES],\n template: `\n @for (message of messages(); track message.id) {\n @let template = findTemplate(getMessageType(message));\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: message, index: $index }\"\n />\n }\n }\n `,\n})\nexport class ChatMessageListComponent {\n readonly agent = input.required<Agent>();\n\n readonly messageTemplates = contentChildren(MessageTemplateDirective);\n\n readonly messages = computed(() => this.agent().messages());\n\n readonly getMessageType = getMessageType;\n\n findTemplate(type: MessageTemplateType): MessageTemplateDirective | undefined {\n return this.messageTemplates().find(t => t.chatMessageTemplate() === type);\n }\n}\n","// libs/chat/src/lib/styles/chat-message.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_MESSAGE_STYLES = `\n :host { display: block; }\n :host([data-role=\"user\"]) {\n display: block;\n margin-top: 0.5rem;\n }\n :host([data-role=\"user\"][data-prev-role=\"assistant\"]) { margin-top: 1.5rem; }\n :host([data-role=\"user\"]) .chat-message__bubble {\n /* Right-align the user bubble. */\n margin-left: auto;\n max-width: 80%;\n }\n /*\n * Assistant bubbles get the 80% cap on the bubble itself.\n */\n :host([data-role=\"assistant\"]) .chat-message__bubble {\n max-width: 80%;\n }\n :host([data-role=\"assistant\"]) {\n display: block;\n position: relative;\n margin-top: 1.5rem;\n color: var(--ngaf-chat-text);\n line-height: 1.55;\n font-size: var(--ngaf-chat-font-size);\n max-width: 100%;\n }\n :host([data-role=\"assistant\"]):first-child { margin-top: 0; }\n\n .chat-message__bubble {\n width: fit-content;\n padding: 8px 12px;\n border-radius: var(--ngaf-chat-radius-bubble);\n background: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-on-primary);\n white-space: pre-wrap;\n line-height: var(--ngaf-chat-line-height-tight);\n font-size: var(--ngaf-chat-font-size);\n overflow-wrap: break-word;\n }\n\n .chat-message__assistant-body {\n padding: 0 12px 0 4px;\n overflow-wrap: break-word;\n }\n\n .chat-message__caret {\n display: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n vertical-align: middle;\n margin-left: 4px;\n margin-bottom: 2px;\n background: radial-gradient(circle at 30% 30%,\n var(--ngaf-chat-text) 0%,\n var(--ngaf-chat-text-muted) 70%,\n transparent 100%);\n box-shadow: 0 0 6px var(--ngaf-chat-text-muted);\n animation: ngaf-chat-caret-fade-in 200ms ease-out 300ms forwards,\n ngaf-chat-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) 500ms infinite;\n opacity: 0;\n }\n :host([data-role=\"assistant\"][data-current=\"true\"][data-streaming=\"true\"]) .chat-message__caret {\n display: inline-block;\n }\n\n .chat-message__plain { /* system / tool fallback */ }\n\n .chat-message__controls {\n display: none;\n gap: 1rem;\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: none;\n }\n :host([data-role=\"assistant\"]) .chat-message__controls {\n display: flex;\n }\n :host([data-role=\"assistant\"]:hover) .chat-message__controls,\n :host([data-role=\"assistant\"]:focus-within) .chat-message__controls,\n :host([data-current=\"true\"]) .chat-message__controls {\n opacity: 1;\n pointer-events: auto;\n }\n @media (max-width: 768px) {\n :host([data-role=\"assistant\"]) .chat-message__controls { opacity: 1; pointer-events: auto; }\n }\n .chat-message__control-btn {\n width: 20px;\n height: 20px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-primary);\n cursor: pointer;\n padding: 0;\n transition: transform 200ms ease;\n }\n .chat-message__control-btn:hover { transform: scale(1.05); }\n .chat-message__control-btn:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n border-radius: 4px;\n }\n .chat-message__control-btn svg { width: 16px; height: 16px; pointer-events: none; }\n`;\n","// libs/chat/src/lib/primitives/chat-citations/chat-citations-card.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { Citation } from '../../agent/citation';\n\n@Component({\n selector: 'chat-citations-card',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"chat-citations-card\">\n <div class=\"chat-citations-card__index\">{{ citation().index }}</div>\n <div class=\"chat-citations-card__body\">\n @if (citation().url; as url) {\n <a class=\"chat-citations-card__title\" [href]=\"url\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ citation().title ?? url }}\n </a>\n } @else if (citation().title) {\n <span class=\"chat-citations-card__title\">{{ citation().title }}</span>\n }\n @if (citation().snippet; as s) {\n <p class=\"chat-citations-card__snippet\">{{ s }}</p>\n }\n </div>\n </div>\n `,\n})\nexport class ChatCitationsCardComponent {\n readonly citation = input.required<Citation>();\n}\n","// libs/chat/src/lib/markdown/citations-resolver.service.ts\n// SPDX-License-Identifier: MIT\nimport { Injectable, computed, signal, type Signal } from '@angular/core';\nimport type { CitationDefinition } from '@cacheplane/partial-markdown';\nimport type { Message } from '../agent/message';\nimport type { Citation } from '../agent/citation';\n\nexport interface ResolvedCitation {\n source: 'message' | 'markdown';\n citation: Citation;\n}\n\n@Injectable()\nexport class CitationsResolverService {\n readonly message = signal<Message | null>(null);\n readonly markdownDefs = signal<Map<string, CitationDefinition>>(new Map());\n\n lookup(refId: string): Signal<ResolvedCitation | null> {\n return computed(() => {\n const fromMessage = this.message()?.citations?.find(c => c.id === refId);\n if (fromMessage) return { source: 'message', citation: fromMessage };\n const fromMd = this.markdownDefs().get(refId);\n if (fromMd) return { source: 'markdown', citation: mdDefToCitation(fromMd) };\n return null;\n });\n }\n}\n\nexport function mdDefToCitation(def: CitationDefinition): Citation {\n let url: string | undefined;\n const titleParts: string[] = [];\n const snippetParts: string[] = [];\n let phase: 'before' | 'after' = 'before';\n for (const child of def.children) {\n if ((child.type === 'link' || child.type === 'autolink') && url === undefined) {\n url = (child as { url?: string }).url;\n phase = 'after';\n continue;\n }\n const t = inlineToText(child);\n (phase === 'before' ? titleParts : snippetParts).push(t);\n }\n const title = titleParts.join('').trim() || undefined;\n const snippet = snippetParts.join('').trim() || undefined;\n return { id: def.id, index: def.index, title, url, snippet };\n}\n\nfunction inlineToText(node: unknown): string {\n const n = node as { type: string; text?: string; children?: unknown[]; url?: string };\n if (typeof n.text === 'string') return n.text;\n if (n.type === 'autolink' && typeof n.url === 'string') return n.url;\n if (Array.isArray(n.children)) return n.children.map(inlineToText).join('');\n return '';\n}\n","// libs/chat/src/lib/primitives/chat-citations/chat-citations.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n ChangeDetectionStrategy, Component, ContentChild, Directive, TemplateRef,\n computed, inject, input,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Message } from '../../agent/message';\nimport type { Citation } from '../../agent/citation';\nimport { ChatCitationsCardComponent } from './chat-citations-card.component';\nimport { CitationsResolverService, mdDefToCitation } from '../../markdown/citations-resolver.service';\n\n/**\n * ContentChild template directive for custom citation card rendering.\n * Usage: <ng-template chatCitationCard let-citation>...</ng-template>\n */\n@Directive({ selector: 'ng-template[chatCitationCard]', standalone: true })\nexport class ChatCitationCardTemplateDirective {\n readonly tpl = inject<TemplateRef<{ $implicit: Citation }>>(TemplateRef);\n}\n\n@Component({\n selector: 'chat-citations',\n standalone: true,\n imports: [NgTemplateOutlet, ChatCitationsCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (citations().length > 0) {\n <section class=\"chat-citations\">\n <h4 class=\"chat-citations__heading\">{{ heading() }}</h4>\n <ul class=\"chat-citations__list\">\n @for (c of citations(); track c.id) {\n <li class=\"chat-citations__item\">\n @if (cardTpl) {\n <ng-container *ngTemplateOutlet=\"cardTpl.tpl; context: { $implicit: c }\" />\n } @else {\n <chat-citations-card [citation]=\"c\" />\n }\n </li>\n }\n </ul>\n </section>\n }\n `,\n})\nexport class ChatCitationsComponent {\n readonly message = input.required<Message>();\n readonly heading = input<string>('Sources');\n\n @ContentChild(ChatCitationCardTemplateDirective) cardTpl: ChatCitationCardTemplateDirective | null = null;\n\n /**\n * Optional resolver — present when chat-citations is rendered inside a\n * chat-message that provides CitationsResolverService (the standard\n * placement). When absent, the panel reads only Message.citations.\n */\n private readonly resolver = inject(CitationsResolverService, { optional: true });\n\n /**\n * Combined citation list:\n * 1. Message.citations (provider-populated, takes precedence by id)\n * 2. Markdown sidecar defs (Pandoc-formatted [^id]: lines), merged in\n * for any id not already present.\n *\n * Sorted by index ascending. This guarantees the sources panel surfaces\n * citations whether they come from message metadata, content syntax, or\n * both — matching the same precedence as inline-marker resolution.\n */\n protected readonly citations = computed<Citation[]>(() => {\n const fromMessage = this.message().citations ?? [];\n const seenIds = new Set(fromMessage.map(c => c.id));\n const fromMarkdown: Citation[] = [];\n const mdDefs = this.resolver?.markdownDefs();\n if (mdDefs) {\n for (const def of mdDefs.values()) {\n if (!seenIds.has(def.id)) fromMarkdown.push(mdDefToCitation(def));\n }\n }\n return [...fromMessage, ...fromMarkdown].sort((a, b) => a.index - b.index);\n });\n}\n","// libs/chat/src/lib/primitives/chat-message/chat-message.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed, effect, inject } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_MESSAGE_STYLES } from '../../styles/chat-message.styles';\nimport { ChatCitationsComponent } from '../chat-citations/chat-citations.component';\nimport { CitationsResolverService } from '../../markdown/citations-resolver.service';\nimport type { Message } from '../../agent/message';\n\nexport type ChatMessageRole = 'user' | 'assistant' | 'system' | 'tool';\n\n@Component({\n selector: 'chat-message',\n standalone: true,\n imports: [ChatCitationsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_MESSAGE_STYLES],\n providers: [CitationsResolverService],\n host: {\n '[attr.data-role]': 'role()',\n '[attr.data-current]': 'currentStr()',\n '[attr.data-streaming]': 'streamingStr()',\n '[attr.data-prev-role]': 'prevRole() ?? null',\n },\n template: `\n <div [class]=\"bodyClass()\">\n <ng-content />\n <span class=\"chat-message__caret\" aria-hidden=\"true\"></span>\n </div>\n @if (message()?.role === 'assistant' && message(); as msg) {\n <chat-citations [message]=\"msg\" />\n }\n <div class=\"chat-message__controls\">\n <ng-content select=\"[chatMessageControls]\" />\n </div>\n `,\n})\nexport class ChatMessageComponent {\n readonly role = input.required<ChatMessageRole>();\n readonly current = input(false);\n readonly streaming = input(false);\n readonly prevRole = input<ChatMessageRole | undefined>(undefined);\n readonly message = input<Message | undefined>(undefined);\n\n private readonly resolver = inject(CitationsResolverService);\n\n constructor() {\n effect(() => {\n this.resolver.message.set(this.message() ?? null);\n });\n }\n\n readonly currentStr = computed(() => String(this.current()));\n readonly streamingStr = computed(() => String(this.streaming()));\n\n readonly bodyClass = computed(() => {\n switch (this.role()) {\n case 'user': return 'chat-message__bubble';\n case 'assistant': return 'chat-message__assistant-body';\n default: return 'chat-message__plain';\n }\n });\n}\n","// libs/chat/src/lib/styles/chat-message-actions.styles.ts\n// SPDX-License-Identifier: MIT\n//\n// Action-button row underneath assistant messages. Hidden by default, fades\n// in on hover/focus of the parent chat-message, always visible on mobile.\nexport const CHAT_MESSAGE_ACTIONS_STYLES = `\n :host {\n display: flex;\n gap: 0.5rem;\n padding: 16px 0 12px 0;\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: none;\n }\n :host-context(chat-message[data-role=\"assistant\"]:hover),\n :host-context(chat-message[data-role=\"assistant\"]:focus-within),\n :host-context(chat-message[data-role=\"assistant\"][data-current=\"true\"]) {\n opacity: 1;\n pointer-events: auto;\n }\n :host-context(chat-message[data-streaming=\"true\"]) {\n /* Hide while the message is actively streaming. */\n opacity: 0 !important;\n pointer-events: none !important;\n }\n @media (max-width: 768px) {\n :host-context(chat-message[data-role=\"assistant\"]) {\n opacity: 1;\n pointer-events: auto;\n }\n }\n .chat-message-actions__btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0;\n padding: 0;\n margin: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n transition: color 150ms ease, transform 150ms ease, background 150ms ease;\n }\n .chat-message-actions__btn:hover {\n color: var(--ngaf-chat-text);\n transform: scale(1.05);\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-message-actions__btn:focus-visible {\n outline: 2px solid var(--ngaf-chat-text-muted);\n outline-offset: 2px;\n }\n .chat-message-actions__btn.is-active {\n color: var(--ngaf-chat-text);\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-message-actions__btn svg {\n width: 16px;\n height: 16px;\n pointer-events: none;\n }\n .chat-message-actions__check {\n font-size: 14px;\n font-weight: 700;\n line-height: 1;\n color: var(--ngaf-chat-success);\n }\n`;\n","// libs/chat/src/lib/primitives/chat-message-actions/chat-message-actions.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, output, signal, inject, DOCUMENT } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_MESSAGE_ACTIONS_STYLES } from '../../styles/chat-message-actions.styles';\n\n/**\n * Default action buttons that appear under each assistant message:\n * regenerate, copy-to-clipboard, thumbs up, thumbs down.\n *\n * Hidden by default, fades in on `:hover`/`:focus-within` of the parent\n * `chat-message`, and stays visible on the current/last assistant message\n * and on mobile.\n */\n@Component({\n selector: 'chat-message-actions',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_MESSAGE_ACTIONS_STYLES],\n host: {\n 'role': 'toolbar',\n '[attr.aria-label]': '\"Message actions\"',\n },\n template: `\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n aria-label=\"Regenerate response\"\n title=\"Regenerate\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() || null\"\n (click)=\"regenerate.emit()\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 12a9 9 0 0 1 15.5-6.36L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-15.5 6.36L3 16\" />\n <path d=\"M3 21v-5h5\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n [class.is-active]=\"copied()\"\n [attr.aria-label]=\"copied() ? 'Copied' : 'Copy to clipboard'\"\n [title]=\"copied() ? 'Copied' : 'Copy'\"\n (click)=\"onCopy()\"\n >\n @if (copied()) {\n <span class=\"chat-message-actions__check\" aria-hidden=\"true\">✓</span>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </svg>\n }\n </button>\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n [class.is-active]=\"rating() === 'up'\"\n [attr.aria-pressed]=\"rating() === 'up'\"\n aria-label=\"Thumbs up\"\n title=\"Good response\"\n (click)=\"onRate('up')\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M7 11V20a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V12a1 1 0 0 1 1-1h3z\" />\n <path d=\"M7 11l4-7a2 2 0 0 1 2-2h0a2 2 0 0 1 2 2v4h5a2 2 0 0 1 2 2l-2 7a2 2 0 0 1-2 1.5H7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n [class.is-active]=\"rating() === 'down'\"\n [attr.aria-pressed]=\"rating() === 'down'\"\n aria-label=\"Thumbs down\"\n title=\"Poor response\"\n (click)=\"onRate('down')\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 13V4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-3z\" />\n <path d=\"M17 13l-4 7a2 2 0 0 1-2 2h0a2 2 0 0 1-2-2v-4H4a2 2 0 0 1-2-2l2-7A2 2 0 0 1 6 5h11\" />\n </svg>\n </button>\n `,\n})\nexport class ChatMessageActionsComponent {\n /** Plain text content to copy. Required for the copy button to function. */\n readonly content = input<string>('');\n /** When true, the regenerate button is disabled (e.g. while the agent is streaming). */\n readonly disabled = input<boolean>(false);\n\n /** Emitted when the user clicks regenerate. Wire this to `agent.regenerate(index)`. */\n readonly regenerate = output<void>();\n /** Emitted with 'up' or 'down' when the user rates the response. */\n readonly rate = output<'up' | 'down'>();\n /** Emitted with the copied content after a successful clipboard write. */\n readonly contentCopied = output<string>();\n\n protected readonly copied = signal(false);\n protected readonly rating = signal<'up' | 'down' | null>(null);\n private readonly document = inject(DOCUMENT);\n\n protected async onCopy(): Promise<void> {\n const text = this.content();\n if (!text) return;\n let succeeded = false;\n const win = this.document.defaultView;\n // Prefer Async Clipboard API; fall back to execCommand if it rejects\n // (e.g. permissions, non-secure context, document-not-focused). The\n // prior impl gated the fallback only on API absence, so a rejecting\n // API silently failed with no user feedback.\n if (win?.navigator?.clipboard?.writeText) {\n try {\n await win.navigator.clipboard.writeText(text);\n succeeded = true;\n } catch {\n // Async API failed — fall through to legacy path below.\n }\n }\n if (!succeeded) {\n try {\n const ta = this.document.createElement('textarea');\n ta.value = text;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n this.document.body.appendChild(ta);\n ta.select();\n succeeded = !!this.document.execCommand?.('copy');\n ta.remove();\n } catch {\n // Both paths failed — leave copied state unchanged.\n }\n }\n if (succeeded) {\n this.copied.set(true);\n this.contentCopied.emit(text);\n setTimeout(() => this.copied.set(false), 2000);\n }\n }\n\n protected onRate(value: 'up' | 'down'): void {\n // Toggle off when clicking the same rating.\n this.rating.set(this.rating() === value ? null : value);\n this.rate.emit(value);\n }\n}\n","// libs/chat/src/lib/styles/chat-window.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_WINDOW_STYLES = `\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n }\n .chat-window__header {\n height: 56px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 var(--ngaf-chat-space-6);\n border-bottom: 1px solid var(--ngaf-chat-separator);\n font-weight: 500;\n color: var(--ngaf-chat-primary);\n }\n .chat-window__header:empty { display: none; }\n /* When the consumer doesn't project a header, balance the chat content\n * with breathing room at the top equivalent to the input gap at the bottom. */\n .chat-window__header:empty + .chat-window__body {\n padding-top: var(--ngaf-chat-input-gap);\n }\n .chat-window__body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .chat-window__footer {\n position: relative;\n flex-shrink: 0;\n margin-top: var(--ngaf-chat-input-gap);\n }\n .chat-window__footer:empty { display: none; }\n .chat-window__scroll-fade {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 100%;\n height: 32px;\n background: linear-gradient(180deg, transparent 0%, var(--ngaf-chat-bg) 100%);\n pointer-events: none;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-window/chat-window.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_WINDOW_STYLES } from '../../styles/chat-window.styles';\n\n@Component({\n selector: 'chat-window',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_WINDOW_STYLES],\n template: `\n <div class=\"chat-window__header\"><ng-content select=\"[chatHeader]\" /></div>\n <div class=\"chat-window__body\"><ng-content select=\"[chatBody]\" /></div>\n <div class=\"chat-window__footer\">\n <div class=\"chat-window__scroll-fade\" aria-hidden=\"true\"></div>\n <ng-content select=\"[chatFooter]\" />\n </div>\n `,\n})\nexport class ChatWindowComponent {}\n","// libs/chat/src/lib/styles/chat-trace.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_TRACE_STYLES = `\n :host { display: block; font-size: var(--ngaf-chat-font-size-sm); }\n .chat-trace__header {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n cursor: pointer;\n user-select: none;\n color: var(--ngaf-chat-text-muted);\n background: transparent;\n border: 0;\n padding: 0;\n width: 100%;\n text-align: left;\n font: inherit;\n }\n .chat-trace__chevron {\n width: 12px;\n height: 12px;\n transition: transform 200ms ease;\n flex-shrink: 0;\n }\n :host([data-expanded=\"true\"]) .chat-trace__chevron { transform: rotate(90deg); }\n .chat-trace__label { display: flex; align-items: center; gap: 0.5rem; flex: 1; min-width: 0; }\n :host([data-state=\"running\"]) .chat-trace__label { animation: ngaf-chat-pulse 1.5s ease-in-out infinite; }\n :host([data-state=\"error\"]) .chat-trace__label { color: var(--ngaf-chat-error-text); }\n .chat-trace__content {\n padding-left: 1rem;\n padding-top: 0.375rem;\n margin-left: 0.375rem;\n border-left: 1px solid var(--ngaf-chat-separator);\n max-height: 250px;\n overflow: auto;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-trace/chat-trace.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, signal, effect, computed } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_TRACE_STYLES } from '../../styles/chat-trace.styles';\n\nexport type TraceState = 'pending' | 'running' | 'done' | 'error';\n\n@Component({\n selector: 'chat-trace',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_TRACE_STYLES],\n host: {\n '[attr.data-state]': 'state()',\n '[attr.data-expanded]': 'expandedStr()',\n },\n template: `\n <button\n type=\"button\"\n class=\"chat-trace__header\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggle()\"\n >\n <svg class=\"chat-trace__chevron\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 2l4 4-4 4\"/>\n </svg>\n <span class=\"chat-trace__label\">\n <ng-content select=\"[traceIcon]\" />\n <ng-content select=\"[traceLabel]\" />\n </span>\n <ng-content select=\"[traceMeta]\" />\n </button>\n @if (expanded()) {\n <div class=\"chat-trace__content\"><ng-content /></div>\n }\n `,\n})\nexport class ChatTraceComponent {\n readonly state = input<TraceState>('pending');\n /** When state is not 'running' or 'error', honors this input as the default expansion. */\n readonly defaultExpanded = input<boolean>(false);\n\n /** null = follow auto state-driven logic; non-null = manual override (user click). */\n private readonly _expandedOverride = signal<boolean | null>(null);\n\n readonly expanded = computed(() => {\n const override = this._expandedOverride();\n if (override !== null) return override;\n const s = this.state();\n if (s === 'running' || s === 'error') return true;\n return this.defaultExpanded();\n });\n\n readonly expandedStr = computed(() => String(this.expanded()));\n\n constructor() {\n let prevState: TraceState | undefined;\n effect(() => {\n const s = this.state();\n // Re-entering running/error from a terminal state: clear manual override\n // so auto-expand kicks in. (Not on done → done, not on user-toggled state.)\n if ((s === 'running' || s === 'error') && prevState && prevState !== s) {\n this._expandedOverride.set(null);\n }\n prevState = s;\n });\n }\n\n toggle(): void {\n this._expandedOverride.set(!this.expanded());\n }\n}\n","// libs/chat/src/lib/styles/chat-reasoning.styles.ts\n// SPDX-License-Identifier: MIT\n//\n// Style block for the chat-reasoning primitive. Pill-shaped header with\n// a chevron + label; expanded body sits below the header with a thin\n// left border (matches the blockquote pattern in chat-markdown.styles).\n// Muted text colors throughout so reasoning content recedes visually\n// next to the response.\nexport const CHAT_REASONING_STYLES = `\n :host { display: block; margin: 0 0 0.5rem; }\n :host([data-has-content=\"false\"]) { display: none; }\n\n .chat-reasoning__header {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 4px 10px;\n background: var(--ngaf-chat-surface-alt);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 9999px;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-xs);\n font-family: inherit;\n cursor: pointer;\n line-height: 1.2;\n }\n .chat-reasoning__header:hover { color: var(--ngaf-chat-text); }\n\n .chat-reasoning__chevron {\n width: 10px;\n height: 10px;\n transition: transform 120ms ease;\n }\n :host([data-expanded=\"true\"]) .chat-reasoning__chevron { transform: rotate(90deg); }\n\n .chat-reasoning__pulse {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--ngaf-chat-text-muted);\n animation: chat-reasoning-pulse 1.2s ease-in-out infinite;\n }\n @keyframes chat-reasoning-pulse {\n 0%, 100% { opacity: 0.3; }\n 50% { opacity: 1; }\n }\n\n .chat-reasoning__body {\n margin-top: 0.5rem;\n padding-left: 12px;\n border-left: 2px solid var(--ngaf-chat-separator);\n color: var(--ngaf-chat-text-muted);\n }\n .chat-reasoning__body chat-streaming-md { font-size: 0.95em; }\n`;\n","// libs/chat/src/lib/styles/chat-markdown.styles.ts\n// SPDX-License-Identifier: MIT\n//\n// Scoped to the `chat-streaming-md` element selector (not `:host`) because\n// the component renders markdown via innerHTML and uses\n// `ViewEncapsulation.None` — emulated encapsulation would skip these rules\n// since innerHTML-injected nodes don't carry `_ngcontent-xxx` attributes.\n// Keeping selectors prefixed with the element name preserves locality so\n// these rules don't leak to other markup on the page.\n//\n// Covers the CommonMark + GFM surface: headings, paragraphs, links, lists\n// (bullet/ordered/task), code (inline + fenced), blockquotes, horizontal\n// rules, tables, images, bold (`strong`), italic (`em`), strikethrough\n// (`del`/`s`).\nexport const CHAT_MARKDOWN_STYLES = `\n chat-streaming-md { display: block; color: var(--ngaf-chat-text); line-height: var(--ngaf-chat-line-height); }\n\n /* Headings */\n chat-streaming-md h1, chat-streaming-md h2, chat-streaming-md h3, chat-streaming-md h4, chat-streaming-md h5, chat-streaming-md h6 {\n font-weight: 600;\n line-height: 1.25;\n margin: 1.25rem 0 0.75rem;\n }\n chat-streaming-md h1:first-child, chat-streaming-md h2:first-child, chat-streaming-md h3:first-child,\n chat-streaming-md h4:first-child, chat-streaming-md h5:first-child, chat-streaming-md h6:first-child { margin-top: 0; }\n chat-streaming-md h1 { font-size: 1.5em; font-weight: 700; }\n chat-streaming-md h2 { font-size: 1.25em; }\n chat-streaming-md h3 { font-size: 1.1em; }\n chat-streaming-md h4 { font-size: 1em; }\n chat-streaming-md h5, chat-streaming-md h6 { font-size: 0.95em; color: var(--ngaf-chat-text-muted); }\n\n /* Paragraphs and inline emphasis */\n chat-streaming-md p { margin: 0 0 0.75rem; line-height: 1.6; font-size: var(--ngaf-chat-font-size); }\n chat-streaming-md p:last-child { margin-bottom: 0; }\n chat-streaming-md strong, chat-streaming-md b { font-weight: 700; }\n chat-streaming-md em, chat-streaming-md i { font-style: italic; }\n chat-streaming-md del, chat-streaming-md s { text-decoration: line-through; color: var(--ngaf-chat-text-muted); }\n chat-streaming-md mark { background: var(--ngaf-chat-surface-alt); padding: 0 2px; border-radius: 2px; }\n chat-streaming-md sub { font-size: 0.75em; vertical-align: sub; }\n chat-streaming-md sup { font-size: 0.75em; vertical-align: super; }\n\n /* Links */\n chat-streaming-md a { color: var(--ngaf-chat-primary); text-decoration: underline; text-underline-offset: 2px; }\n chat-streaming-md a:hover { text-decoration-thickness: 2px; }\n\n /* Lists (CommonMark + GFM task lists) */\n chat-streaming-md ul, chat-streaming-md ol { margin: 0 0 0.75rem; padding-left: 1.5rem; }\n chat-streaming-md ul { list-style: disc outside; }\n chat-streaming-md ol { list-style: decimal outside; }\n chat-streaming-md ul ul { list-style: circle outside; }\n chat-streaming-md ul ul ul { list-style: square outside; }\n chat-streaming-md li { margin: 0.2rem 0; }\n chat-streaming-md li::marker { color: var(--ngaf-chat-text-muted); }\n chat-streaming-md li > p { margin: 0 0 0.25rem; }\n chat-streaming-md li > ul, chat-streaming-md li > ol { margin: 0.25rem 0 0; }\n /* GFM task lists: marked emits <li><input type=\"checkbox\" disabled> ... */\n chat-streaming-md li:has(> input[type=\"checkbox\"]) { list-style: none; margin-left: -1.25rem; }\n chat-streaming-md li > input[type=\"checkbox\"] { margin-right: 0.5rem; vertical-align: middle; }\n\n /* Code (inline + fenced) */\n chat-streaming-md code {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n padding: 1px 5px;\n border-radius: 4px;\n font-family: var(--ngaf-chat-font-mono);\n font-size: 0.9em;\n }\n chat-streaming-md pre {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n padding: 12px 14px;\n border-radius: var(--ngaf-chat-radius-card);\n overflow-x: auto;\n font-family: var(--ngaf-chat-font-mono);\n font-size: var(--ngaf-chat-font-size-sm);\n line-height: 1.5;\n margin: 0 0 0.75rem;\n }\n chat-streaming-md pre code { background: transparent; padding: 0; border-radius: 0; font-size: inherit; }\n\n /* Blockquote */\n chat-streaming-md blockquote {\n border-left: 3px solid var(--ngaf-chat-separator);\n padding: 0.25rem 0 0.25rem 12px;\n margin: 0 0 0.75rem;\n color: var(--ngaf-chat-text-muted);\n }\n chat-streaming-md blockquote > :last-child { margin-bottom: 0; }\n\n /* Horizontal rule */\n chat-streaming-md hr {\n border: none;\n border-top: 1px solid var(--ngaf-chat-separator);\n margin: 1rem 0;\n }\n\n /* Tables (GFM) */\n chat-streaming-md table {\n border-collapse: collapse;\n margin: 0 0 0.75rem;\n width: 100%;\n font-size: 0.95em;\n }\n chat-streaming-md thead { background: var(--ngaf-chat-surface-alt); }\n chat-streaming-md th, chat-streaming-md td {\n border: 1px solid var(--ngaf-chat-separator);\n padding: 6px 10px;\n text-align: left;\n vertical-align: top;\n }\n chat-streaming-md th { font-weight: 600; }\n /* Component-rendered table: chat-md-table becomes a horizontally-scrollable\n wrapper for the inner <table>; row/cell elements stay layout-transparent\n so the browser's table layout takes over. Without this overflow wrapper,\n wide tables push their parent container past the viewport horizontally. */\n chat-streaming-md chat-md-table {\n display: block;\n overflow-x: auto;\n max-width: 100%;\n margin: 0 0 0.75rem;\n }\n chat-streaming-md chat-md-table-row { display: contents; }\n chat-streaming-md chat-md-table-cell { display: contents; }\n chat-streaming-md chat-md-table > table { margin: 0; }\n /* Task-list items: checkbox + first paragraph render inline; subsequent\n blocks (sub-lists, multi-paragraph items) flow normally below. */\n chat-streaming-md li.chat-md-list-item--task {\n list-style: none;\n margin-left: -1.25rem;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 0.5rem;\n }\n chat-streaming-md li.chat-md-list-item--task > input[type=\"checkbox\"] {\n margin: 0;\n flex: 0 0 auto;\n transform: translateY(2px);\n }\n /* The chat-md-children wrapper around list-item content takes remaining width */\n chat-streaming-md li.chat-md-list-item--task > chat-md-children {\n flex: 1 1 auto;\n min-width: 0;\n }\n /* Tight task items: only the FIRST paragraph aligns inline with the\n checkbox (margin collapsed). Subsequent paragraphs/blocks keep their\n normal vertical spacing so multi-block items render readably. */\n chat-streaming-md li.chat-md-list-item--task > chat-md-children > chat-md-paragraph:first-child > p {\n margin: 0;\n }\n\n /* Media */\n chat-streaming-md img { max-width: 100%; height: auto; border-radius: 6px; }\n /* Broken-image fallback: muted pill showing alt text + icon. Triggered\n when <img> fires (error). Caught by live browser smoke — prior impl\n showed only the browser's broken-image icon with no readable alt. */\n chat-streaming-md .chat-md-image--broken {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.25rem 0.5rem;\n background: var(--ngaf-chat-surface-alt);\n border: 1px dashed var(--ngaf-chat-separator);\n border-radius: 6px;\n font-size: 0.9em;\n color: var(--ngaf-chat-text-muted, currentColor);\n opacity: 0.85;\n }\n chat-streaming-md .chat-md-image__icon { font-size: 1em; line-height: 1; }\n chat-streaming-md .chat-md-image__alt { font-style: italic; }\n`;\n","// libs/chat/src/lib/markdown/markdown-view-registry.ts\n// SPDX-License-Identifier: MIT\nimport { InjectionToken } from '@angular/core';\nimport type { ViewRegistry } from '@threadplane/render';\n\n/**\n * DI token for the markdown view registry consumed by <chat-streaming-md>\n * and <md-children>. Maps MarkdownNode.type strings (e.g. \"paragraph\",\n * \"heading\") to Angular components that render that node type.\n *\n * `<chat-streaming-md>` provides the runtime registry on its component-level\n * injector — either the consumer-supplied [viewRegistry] input, or\n * `cacheplaneMarkdownViews` (the default) — so descendant <md-children>\n * components resolve the right components for each node.\n */\nexport const MARKDOWN_VIEW_REGISTRY = new InjectionToken<ViewRegistry>(\n 'MARKDOWN_VIEW_REGISTRY',\n);\n","// libs/chat/src/lib/markdown/markdown-children.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n inject,\n input,\n computed,\n Type,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport type { ViewRegistry } from '@threadplane/render';\nimport type { MarkdownNode } from '@cacheplane/partial-markdown';\nimport { MARKDOWN_VIEW_REGISTRY } from './markdown-view-registry';\n\n/**\n * Recursively dispatches a parent node's children through the markdown view\n * registry. Each child's `type` is looked up in the registry; the resolved\n * component is rendered with `[node]` bound to that child.\n *\n * Position-stable: `track $index` avoids NG0956 re-creation warnings that\n * occur when the markdown pipeline re-parses content on every stream delta,\n * producing new child object references even for unchanged nodes.\n */\n@Component({\n selector: 'chat-md-children',\n standalone: true,\n imports: [NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (child of children(); track $index) {\n @let comp = resolve(child);\n @if (comp) {\n <ng-container *ngComponentOutlet=\"comp; inputs: { node: child }\" />\n }\n }\n `,\n})\nexport class MarkdownChildrenComponent {\n readonly parent = input.required<MarkdownNode>();\n private readonly registry = inject<ViewRegistry>(MARKDOWN_VIEW_REGISTRY);\n\n protected readonly children = computed<readonly MarkdownNode[]>(() => {\n const p = this.parent();\n return 'children' in p && Array.isArray((p as { children?: MarkdownNode[] }).children)\n ? ((p as { children: MarkdownNode[] }).children as readonly MarkdownNode[])\n : [];\n });\n\n protected resolve(child: MarkdownNode): Type<unknown> | null {\n const entry = this.registry[child.type];\n if (!entry) return null;\n // ViewRegistry entries are either a bare Type or { component, fallback? }.\n return typeof entry === 'function' ? entry : entry.component;\n }\n}\n","// libs/chat/src/lib/markdown/views/markdown-document.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownDocumentNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-document',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<chat-md-children [parent]=\"node()\" />`,\n})\nexport class MarkdownDocumentComponent {\n readonly node = input.required<MarkdownDocumentNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-paragraph.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownParagraphNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-paragraph',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<p><chat-md-children [parent]=\"node()\" /></p>`,\n})\nexport class MarkdownParagraphComponent {\n readonly node = input.required<MarkdownParagraphNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-heading.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownHeadingNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-heading',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @switch (node().level) {\n @case (1) { <h1><chat-md-children [parent]=\"node()\" /></h1> }\n @case (2) { <h2><chat-md-children [parent]=\"node()\" /></h2> }\n @case (3) { <h3><chat-md-children [parent]=\"node()\" /></h3> }\n @case (4) { <h4><chat-md-children [parent]=\"node()\" /></h4> }\n @case (5) { <h5><chat-md-children [parent]=\"node()\" /></h5> }\n @case (6) { <h6><chat-md-children [parent]=\"node()\" /></h6> }\n }\n `,\n})\nexport class MarkdownHeadingComponent {\n readonly node = input.required<MarkdownHeadingNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-blockquote.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownBlockquoteNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-blockquote',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<blockquote><chat-md-children [parent]=\"node()\" /></blockquote>`,\n})\nexport class MarkdownBlockquoteComponent {\n readonly node = input.required<MarkdownBlockquoteNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-list.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownListNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-list',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (node().ordered) {\n <ol [attr.start]=\"node().start ?? null\"><chat-md-children [parent]=\"node()\" /></ol>\n } @else {\n <ul><chat-md-children [parent]=\"node()\" /></ul>\n }\n `,\n})\nexport class MarkdownListComponent {\n readonly node = input.required<MarkdownListNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-list-item.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownListItemNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-list-item',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <li [class.chat-md-list-item--task]=\"node().task !== undefined\">\n @if (node().task !== undefined) {\n <input type=\"checkbox\" disabled [checked]=\"node().task!.checked\" />\n }\n <chat-md-children [parent]=\"node()\" />\n </li>\n `,\n})\nexport class MarkdownListItemComponent {\n readonly node = input.required<MarkdownListItemNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-code-block.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport type { MarkdownCodeBlockNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-code-block',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<pre><code [class]=\"languageClass()\">{{ node().text }}</code></pre>`,\n})\nexport class MarkdownCodeBlockComponent {\n readonly node = input.required<MarkdownCodeBlockNode>();\n protected readonly languageClass = computed(() => {\n const lang = this.node().language;\n return lang ? `language-${lang}` : '';\n });\n}\n","// libs/chat/src/lib/markdown/views/markdown-thematic-break.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownThematicBreakNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-thematic-break',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<hr>`,\n})\nexport class MarkdownThematicBreakComponent {\n readonly node = input.required<MarkdownThematicBreakNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-text.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownTextNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-text',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `{{ node().text }}`,\n})\nexport class MarkdownTextComponent {\n readonly node = input.required<MarkdownTextNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-emphasis.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownEmphasisNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-emphasis',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<em><chat-md-children [parent]=\"node()\" /></em>`,\n})\nexport class MarkdownEmphasisComponent {\n readonly node = input.required<MarkdownEmphasisNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-strong.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownStrongNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-strong',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<strong><chat-md-children [parent]=\"node()\" /></strong>`,\n})\nexport class MarkdownStrongComponent {\n readonly node = input.required<MarkdownStrongNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-strikethrough.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownStrikethroughNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-strikethrough',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<del><chat-md-children [parent]=\"node()\" /></del>`,\n})\nexport class MarkdownStrikethroughComponent {\n readonly node = input.required<MarkdownStrikethroughNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-inline-code.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownInlineCodeNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-inline-code',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<code>{{ node().text }}</code>`,\n})\nexport class MarkdownInlineCodeComponent {\n readonly node = input.required<MarkdownInlineCodeNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-link.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownLinkNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-link',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<a [href]=\"node().url\" [attr.title]=\"node().title || null\"><chat-md-children [parent]=\"node()\" /></a>`,\n})\nexport class MarkdownLinkComponent {\n readonly node = input.required<MarkdownLinkNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-autolink.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownAutolinkNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-autolink',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<a [href]=\"node().url\">{{ node().url }}</a>`,\n})\nexport class MarkdownAutolinkComponent {\n readonly node = input.required<MarkdownAutolinkNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-image.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport type { MarkdownImageNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-image',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (failed()) {\n <span class=\"chat-md-image chat-md-image--broken\"\n role=\"img\"\n [attr.aria-label]=\"node().alt || node().url\"\n [attr.title]=\"node().title || node().url || null\">\n <span class=\"chat-md-image__icon\" aria-hidden=\"true\">🖼️</span>\n @if (node().alt) {\n <span class=\"chat-md-image__alt\">{{ node().alt }}</span>\n } @else {\n <span class=\"chat-md-image__alt\">image unavailable</span>\n }\n </span>\n } @else {\n <img\n [src]=\"node().url\"\n [alt]=\"node().alt\"\n [attr.title]=\"node().title || null\"\n (error)=\"failed.set(true)\"\n />\n }\n `,\n})\nexport class MarkdownImageComponent {\n readonly node = input.required<MarkdownImageNode>();\n protected readonly failed = signal(false);\n}\n","// libs/chat/src/lib/markdown/views/markdown-soft-break.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownSoftBreakNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-soft-break',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<br>`,\n})\nexport class MarkdownSoftBreakComponent {\n readonly node = input.required<MarkdownSoftBreakNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-hard-break.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownHardBreakNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-hard-break',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<br>`,\n})\nexport class MarkdownHardBreakComponent {\n readonly node = input.required<MarkdownHardBreakNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-citation-reference.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport type { MarkdownCitationReferenceNode } from '@cacheplane/partial-markdown';\nimport { CitationsResolverService } from '../citations-resolver.service';\n\n@Component({\n selector: 'chat-md-citation-reference',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (resolved(); as r) {\n @if (r.citation.url; as href) {\n <a class=\"chat-citation-marker\"\n [attr.href]=\"href\"\n [attr.title]=\"r.citation.snippet ?? href\"\n target=\"_blank\" rel=\"noopener noreferrer\">\n <sup>[{{ node().index }}]</sup>\n </a>\n } @else {\n <span class=\"chat-citation-marker chat-citation-marker--no-url\"\n [attr.title]=\"r.citation.snippet ?? r.citation.title ?? null\">\n <sup>[{{ node().index }}]</sup>\n </span>\n }\n } @else {\n <span class=\"chat-citation-marker chat-citation-marker--unresolved\"\n [attr.title]=\"'No source available'\">\n <sup>[{{ node().index }}]</sup>\n </span>\n }\n `,\n})\nexport class MarkdownCitationReferenceComponent {\n readonly node = input.required<MarkdownCitationReferenceNode>();\n private readonly resolver = inject(CitationsResolverService);\n protected readonly resolved = computed(() => {\n const lookup = this.resolver.lookup(this.node().refId);\n return lookup();\n });\n}\n","// libs/chat/src/lib/markdown/markdown-table-row.token.ts\n// SPDX-License-Identifier: MIT\nimport { InjectionToken, Signal, signal } from '@angular/core';\n\n/**\n * Provided by MarkdownTableRowComponent for header rows so that\n * MarkdownTableCellComponent can render <th> instead of <td>.\n * The value is a Signal<boolean> so that it tracks the row's isHeader reactively.\n */\nexport const IS_HEADER_ROW = new InjectionToken<Signal<boolean>>('IS_HEADER_ROW', {\n providedIn: null,\n factory: () => signal(false),\n});\n","// libs/chat/src/lib/markdown/views/markdown-table-row.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed, inject } from '@angular/core';\nimport type { MarkdownTableRowNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\nimport { IS_HEADER_ROW } from '../markdown-table-row.token';\n\n@Component({\n selector: 'chat-md-table-row',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <tr class=\"chat-md-table-row\" [class.chat-md-table-row--header]=\"node().isHeader\">\n <chat-md-children [parent]=\"node()\" />\n </tr>\n `,\n providers: [\n {\n provide: IS_HEADER_ROW,\n useFactory: () => {\n const comp = inject(MarkdownTableRowComponent);\n return computed(() => comp.node().isHeader);\n },\n },\n ],\n})\nexport class MarkdownTableRowComponent {\n readonly node = input.required<MarkdownTableRowNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-table.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport type { MarkdownTableNode, MarkdownTableRowNode } from '@cacheplane/partial-markdown';\nimport { MarkdownTableRowComponent } from './markdown-table-row.component';\n\n@Component({\n selector: 'chat-md-table',\n standalone: true,\n imports: [MarkdownTableRowComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <table class=\"chat-md-table\">\n <thead>\n @if (headerRow(); as row) {\n <chat-md-table-row [node]=\"row\" />\n }\n </thead>\n <tbody>\n @for (row of bodyRows(); track $index) {\n <chat-md-table-row [node]=\"row\" />\n }\n </tbody>\n </table>\n `,\n})\nexport class MarkdownTableComponent {\n readonly node = input.required<MarkdownTableNode>();\n\n protected readonly headerRow = computed<MarkdownTableRowNode | null>(() => {\n const rows = this.node().children;\n return rows.length > 0 && rows[0].isHeader ? rows[0] : null;\n });\n\n protected readonly bodyRows = computed<MarkdownTableRowNode[]>(() => {\n const rows = this.node().children;\n return rows[0]?.isHeader ? rows.slice(1) : rows;\n });\n}\n","// libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, inject, computed } from '@angular/core';\nimport type { MarkdownTableCellNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\nimport { IS_HEADER_ROW } from '../markdown-table-row.token';\n\n@Component({\n selector: 'chat-md-table-cell',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (isHeader()) {\n <th class=\"chat-md-table-cell\" [style.text-align]=\"alignment() ?? null\">\n <chat-md-children [parent]=\"node()\" />\n </th>\n } @else {\n <td class=\"chat-md-table-cell\" [style.text-align]=\"alignment() ?? null\">\n <chat-md-children [parent]=\"node()\" />\n </td>\n }\n `,\n})\nexport class MarkdownTableCellComponent {\n readonly node = input.required<MarkdownTableCellNode>();\n\n private readonly isHeaderRowToken = inject(IS_HEADER_ROW, { optional: true });\n protected readonly isHeader = computed(() => this.isHeaderRowToken ? this.isHeaderRowToken() : false);\n protected readonly alignment = computed(() => this.node().alignment);\n}\n","// libs/chat/src/lib/markdown/cacheplane-markdown-views.ts\n// SPDX-License-Identifier: MIT\nimport { views, type ViewRegistry } from '@threadplane/render';\nimport { MarkdownDocumentComponent } from './views/markdown-document.component';\nimport { MarkdownParagraphComponent } from './views/markdown-paragraph.component';\nimport { MarkdownHeadingComponent } from './views/markdown-heading.component';\nimport { MarkdownBlockquoteComponent } from './views/markdown-blockquote.component';\nimport { MarkdownListComponent } from './views/markdown-list.component';\nimport { MarkdownListItemComponent } from './views/markdown-list-item.component';\nimport { MarkdownCodeBlockComponent } from './views/markdown-code-block.component';\nimport { MarkdownThematicBreakComponent } from './views/markdown-thematic-break.component';\nimport { MarkdownTextComponent } from './views/markdown-text.component';\nimport { MarkdownEmphasisComponent } from './views/markdown-emphasis.component';\nimport { MarkdownStrongComponent } from './views/markdown-strong.component';\nimport { MarkdownStrikethroughComponent } from './views/markdown-strikethrough.component';\nimport { MarkdownInlineCodeComponent } from './views/markdown-inline-code.component';\nimport { MarkdownLinkComponent } from './views/markdown-link.component';\nimport { MarkdownAutolinkComponent } from './views/markdown-autolink.component';\nimport { MarkdownImageComponent } from './views/markdown-image.component';\nimport { MarkdownSoftBreakComponent } from './views/markdown-soft-break.component';\nimport { MarkdownHardBreakComponent } from './views/markdown-hard-break.component';\nimport { MarkdownCitationReferenceComponent } from './views/markdown-citation-reference.component';\nimport { MarkdownTableComponent } from './views/markdown-table.component';\nimport { MarkdownTableRowComponent } from './views/markdown-table-row.component';\nimport { MarkdownTableCellComponent } from './views/markdown-table-cell.component';\n\n/**\n * Default view registry consumed by <chat-streaming-md>. Maps every\n * MarkdownNode.type emitted by @cacheplane/partial-markdown@0.2 to its\n * corresponding Angular component.\n *\n * Override per-node-type via `withViews(cacheplaneMarkdownViews, { … })`.\n */\nexport const cacheplaneMarkdownViews: ViewRegistry = views({\n 'document': MarkdownDocumentComponent,\n 'paragraph': MarkdownParagraphComponent,\n 'heading': MarkdownHeadingComponent,\n 'blockquote': MarkdownBlockquoteComponent,\n 'list': MarkdownListComponent,\n 'list-item': MarkdownListItemComponent,\n 'code-block': MarkdownCodeBlockComponent,\n 'thematic-break': MarkdownThematicBreakComponent,\n 'text': MarkdownTextComponent,\n 'emphasis': MarkdownEmphasisComponent,\n 'strong': MarkdownStrongComponent,\n 'strikethrough': MarkdownStrikethroughComponent,\n 'inline-code': MarkdownInlineCodeComponent,\n 'link': MarkdownLinkComponent,\n 'autolink': MarkdownAutolinkComponent,\n 'image': MarkdownImageComponent,\n 'soft-break': MarkdownSoftBreakComponent,\n 'hard-break': MarkdownHardBreakComponent,\n 'citation-reference': MarkdownCitationReferenceComponent,\n 'table': MarkdownTableComponent,\n 'table-row': MarkdownTableRowComponent,\n 'table-cell': MarkdownTableCellComponent,\n});\n","// libs/chat/src/lib/streaming/streaming-markdown.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport {\n createPartialMarkdownParser,\n materialize,\n type MarkdownDocumentNode,\n type PartialMarkdownParser,\n} from '@cacheplane/partial-markdown';\nimport type { ViewRegistry } from '@threadplane/render';\nimport { CHAT_MARKDOWN_STYLES } from '../styles/chat-markdown.styles';\nimport { MARKDOWN_VIEW_REGISTRY } from '../markdown/markdown-view-registry';\nimport { MarkdownChildrenComponent } from '../markdown/markdown-children.component';\nimport { cacheplaneMarkdownViews } from '../markdown/cacheplane-markdown-views';\nimport { CitationsResolverService } from '../markdown/citations-resolver.service';\n\n/**\n * Renders streaming markdown by walking a @cacheplane/partial-markdown AST\n * through @threadplane/render's view registry.\n *\n * Reactivity model: the live `parser.root` keeps a stable JS reference\n * across pushes (partial-markdown's identity guarantee). To make Angular\n * signals propagate downstream when the underlying tree changes, we surface\n * a materialized snapshot via `materialize()`. The snapshot shares\n * structurally — unchanged subtrees keep the SAME reference, and any\n * descendant change yields a NEW root reference. This lets Angular's\n * `Object.is` equality check both detect changes (root reference differs)\n * and short-circuit unchanged subtrees (per-node references stable).\n *\n * Override per-node-type renderers via the `[viewRegistry]` input or by\n * supplying a different `MARKDOWN_VIEW_REGISTRY` provider in the injector\n * tree.\n */\n@Component({\n selector: 'chat-streaming-md',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: CHAT_MARKDOWN_STYLES,\n template: `\n @if (root(); as r) {\n <chat-md-children [parent]=\"r\" />\n }\n `,\n providers: [\n {\n provide: MARKDOWN_VIEW_REGISTRY,\n useFactory: (host: ChatStreamingMdComponent) => host.resolvedRegistry(),\n deps: [ChatStreamingMdComponent],\n },\n ],\n})\nexport class ChatStreamingMdComponent {\n readonly content = input<string>('');\n readonly streaming = input<boolean>(false);\n readonly viewRegistry = input<ViewRegistry | undefined>(undefined);\n\n readonly resolvedRegistry = computed(\n () => this.viewRegistry() ?? cacheplaneMarkdownViews,\n );\n\n private readonly resolver = inject(CitationsResolverService, { optional: true });\n\n constructor() {\n effect(() => {\n const r = this.root();\n if (this.resolver && r) {\n this.resolver.markdownDefs.set(r.citations ?? new Map());\n }\n });\n }\n\n // Parser instance is rebuilt only when content diverges from the prior\n // prefix (rare). For the common streaming case where content extends the\n // prior content, we push the delta and reuse the existing parser tree.\n private parser: PartialMarkdownParser = createPartialMarkdownParser();\n private prior = '';\n private finished = false;\n\n readonly root = computed<MarkdownDocumentNode | null>(() => {\n const c = this.content();\n const isStreaming = this.streaming();\n if (c !== this.prior) {\n if (c.startsWith(this.prior)) {\n this.parser.push(c.slice(this.prior.length));\n } else {\n // Content shrank or diverged — reset.\n this.parser = createPartialMarkdownParser();\n this.finished = false;\n if (c.length > 0) this.parser.push(c);\n }\n if (!isStreaming && !this.finished) {\n // @cacheplane/partial-markdown@0.3 does not flush trailing text on\n // finish() unless the buffer ends with a newline. Plain LLM\n // responses often omit the trailing newline, which causes the\n // parser to emit a document with zero children — i.e. the message\n // renders empty. Push a sentinel newline first to force the open\n // paragraph closed before we finalize.\n if (!c.endsWith('\\n')) this.parser.push('\\n');\n this.parser.finish();\n this.finished = true;\n }\n this.prior = c;\n } else if (!isStreaming && !this.finished) {\n // Streaming flipped to false without new content; ensure parser is finalized.\n if (!this.prior.endsWith('\\n')) this.parser.push('\\n');\n this.parser.finish();\n this.finished = true;\n }\n // Materialize for Angular reactivity: produces a NEW root reference when\n // any descendant subtree changed; same reference when nothing changed\n // (structural sharing). This is what makes signal-based CD propagate\n // downstream changes despite the parser preserving identity.\n return materialize(this.parser.root) as MarkdownDocumentNode | null;\n });\n}\n","// SPDX-License-Identifier: MIT\n\n/**\n * Render a millisecond duration as a human-readable label suitable for\n * the chat-reasoning \"Thought for Ns\" pill.\n *\n * - <1 s → \"<1s\"\n * - 1–59 s → \"Ns\" (e.g. \"4s\")\n * - ≥60 s → \"Nm Ms\" (e.g. \"1m 12s\", \"60m 0s\")\n *\n * Negative or non-finite inputs collapse to \"<1s\" so a corrupted timing\n * map never produces noisy output.\n */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 1000) return '<1s';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds - minutes * 60;\n return `${minutes}m ${seconds}s`;\n}\n","// libs/chat/src/lib/primitives/chat-reasoning/chat-reasoning.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, ChangeDetectionStrategy,\n computed, effect, input, signal,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_REASONING_STYLES } from '../../styles/chat-reasoning.styles';\nimport { ChatStreamingMdComponent } from '../../streaming/streaming-markdown.component';\nimport { formatDuration } from '../../utils/format-duration';\n\n/**\n * Renders an assistant's reasoning content as a compact pill that\n * expands to reveal the underlying text. Three visual states:\n *\n * - Streaming: pill shows \"Thinking…\" with a pulsing dot; auto-expanded\n * so the user sees reasoning stream in real time.\n * - Idle, with durationMs known: pill shows \"Thought for {duration}\";\n * collapsed by default, expand on click.\n * - Idle, no duration: pill shows \"Show reasoning\"; collapsed by default.\n *\n * The body re-uses chat-streaming-md so reasoning content gets the same\n * markdown rendering pipeline as the visible response (lists, code,\n * step labels often appear in reasoning output).\n *\n * Internal state: a tristate \"expanded\" — null means follow auto state-\n * driven logic (force-expand on isStreaming, otherwise honor\n * defaultExpanded), boolean is a manual user choice that wins for the\n * lifetime of the instance.\n */\n@Component({\n selector: 'chat-reasoning',\n standalone: true,\n imports: [ChatStreamingMdComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_REASONING_STYLES],\n host: {\n '[attr.data-has-content]': 'hasContent()',\n '[attr.data-expanded]': 'expandedStr()',\n '[attr.data-streaming]': 'isStreaming()',\n },\n template: `\n <button\n type=\"button\"\n class=\"chat-reasoning__header\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggle()\"\n >\n <svg class=\"chat-reasoning__chevron\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 2l4 4-4 4\"/>\n </svg>\n @if (isStreaming()) {\n <span class=\"chat-reasoning__pulse\" aria-hidden=\"true\"></span>\n }\n <span class=\"chat-reasoning__label\">{{ resolvedLabel() }}</span>\n </button>\n @if (expanded()) {\n <div class=\"chat-reasoning__body\">\n <chat-streaming-md [content]=\"content()\" [streaming]=\"isStreaming()\" />\n </div>\n }\n `,\n})\nexport class ChatReasoningComponent {\n readonly content = input<string>('');\n readonly isStreaming = input<boolean>(false);\n readonly durationMs = input<number | undefined>(undefined);\n readonly label = input<string | undefined>(undefined);\n readonly defaultExpanded = input<boolean>(false);\n\n readonly hasContent = computed(() => (this.content() ?? '').length > 0);\n\n /** null = follow auto logic (streaming → expanded, else defaultExpanded). */\n private readonly _expandedOverride = signal<boolean | null>(null);\n\n readonly expanded = computed(() => {\n const override = this._expandedOverride();\n if (override !== null) return override;\n if (this.isStreaming()) return true;\n return this.defaultExpanded();\n });\n\n readonly expandedStr = computed(() => String(this.expanded()));\n\n readonly resolvedLabel = computed(() => {\n const explicit = this.label();\n if (explicit) return explicit;\n if (this.isStreaming()) return 'Thinking…';\n const ms = this.durationMs();\n if (typeof ms === 'number') return `Thought for ${formatDuration(ms)}`;\n return 'Show reasoning';\n });\n\n constructor() {\n // Reset the manual override when streaming re-engages from idle (e.g.\n // follow-up turn that re-uses this instance) so the auto force-expand\n // logic takes over again. Spec §3.3 bullet 3.\n let prevStreaming = false;\n effect(() => {\n const streaming = this.isStreaming();\n if (!prevStreaming && streaming) {\n this._expandedOverride.set(null);\n }\n prevStreaming = streaming;\n });\n }\n\n toggle(): void {\n this._expandedOverride.set(!this.expanded());\n }\n}\n","// libs/chat/src/lib/styles/chat-launcher-button.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_LAUNCHER_BUTTON_STYLES = `\n :host { display: inline-block; }\n .chat-launcher-button {\n width: 56px;\n height: 56px;\n border-radius: var(--ngaf-chat-radius-launcher);\n background: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-on-primary);\n border: 0;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--ngaf-chat-shadow-md);\n transition: transform 200ms ease;\n }\n .chat-launcher-button:hover { transform: scale(1.05); }\n .chat-launcher-button svg { width: 24px; height: 24px; }\n`;\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, output } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_LAUNCHER_BUTTON_STYLES } from '../../styles/chat-launcher-button.styles';\n\n@Component({\n selector: 'chat-launcher-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_LAUNCHER_BUTTON_STYLES],\n template: `\n <button type=\"button\" class=\"chat-launcher-button\" aria-label=\"Open chat\" (click)=\"clicked.emit()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>\n </svg>\n </button>\n `,\n})\nexport class ChatLauncherButtonComponent {\n /** Fires when the inner <button> receives a click. Prefer this over\n * binding `(click)` on the host element — explicit output gives\n * consumers (and Playwright) an unambiguous click target that won't\n * be intercepted by sibling overlays in higher stacking contexts.\n * Native `(click)` on the host still works for back-compat: the\n * click event bubbles through unchanged. */\n readonly clicked = output<void>();\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_SUGGESTIONS_STYLES = `\n :host { display: block; }\n .chat-suggestions { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; }\n .chat-suggestion {\n padding: 6px 10px;\n font-size: var(--ngaf-chat-font-size-xs);\n border-radius: var(--ngaf-chat-radius-bubble);\n border: 1px solid var(--ngaf-chat-muted);\n background: transparent;\n color: var(--ngaf-chat-text);\n cursor: pointer;\n transition: transform 200ms ease;\n }\n .chat-suggestion:hover { transform: scale(1.03); }\n .chat-suggestion:disabled { cursor: wait; opacity: 0.6; }\n`;\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SUGGESTIONS_STYLES } from '../../styles/chat-suggestions.styles';\n\n@Component({\n selector: 'chat-suggestions',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_SUGGESTIONS_STYLES],\n template: `\n <div class=\"chat-suggestions\">\n @for (s of suggestions(); track s) {\n <button type=\"button\" class=\"chat-suggestion\" (click)=\"selected.emit(s)\">{{ s }}</button>\n }\n </div>\n `,\n})\nexport class ChatSuggestionsComponent {\n readonly suggestions = input<string[]>([]);\n readonly selected = output<string>();\n}\n","// libs/chat/src/lib/styles/chat-input.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_INPUT_STYLES = `\n:host {\n display: block;\n width: 100%;\n padding: 0 var(--ngaf-chat-edge-pad);\n box-sizing: border-box;\n}\n\n.chat-input__container {\n width: 100%;\n max-width: var(--ngaf-chat-max-width);\n margin: 0 auto;\n}\n\n.chat-input__pill {\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 9999px;\n padding: 8px 8px 8px 16px;\n min-height: 56px;\n box-sizing: border-box;\n}\n\n.chat-input__textarea {\n flex: 1 1 auto;\n border: 0;\n outline: none;\n resize: none;\n background: transparent;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: 1rem;\n line-height: 1.5;\n padding: 0;\n field-sizing: content;\n overflow-y: auto;\n}\n.chat-input__textarea::placeholder { color: var(--ngaf-chat-text-muted); }\n.chat-input__textarea::-webkit-scrollbar { width: 4px; }\n.chat-input__textarea::-webkit-scrollbar-thumb { background: var(--ngaf-chat-separator); border-radius: 4px; }\n\n.chat-input__controls {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: none;\n}\n\n.chat-input__send,\n.chat-input__send--stop {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: opacity 150ms ease, transform 150ms ease, background 150ms ease;\n padding: 0;\n}\n.chat-input__send {\n background: var(--ngaf-chat-text);\n color: var(--ngaf-chat-bg);\n}\n.chat-input__send:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n background: var(--ngaf-chat-text-muted);\n}\n.chat-input__send:not(:disabled):hover { transform: scale(1.05); }\n.chat-input__send svg { width: 16px; height: 16px; }\n\n.chat-input__send--stop {\n background: var(--ngaf-chat-text-muted);\n color: var(--ngaf-chat-bg);\n}\n.chat-input__send--stop:hover { transform: scale(1.05); }\n.chat-input__send--stop svg { width: 14px; height: 14px; }\n`;\n","// libs/chat/src/lib/primitives/chat-input/chat-input.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n ElementRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_INPUT_STYLES } from '../../styles/chat-input.styles';\n\n/**\n * Submits a trimmed message to the agent.\n * Returns the trimmed string on success, or `null` if the input was empty.\n */\nexport function submitMessage(\n agent: Agent,\n text: string,\n): string | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n void agent.submit({ message: trimmed });\n return trimmed;\n}\n\n@Component({\n selector: 'chat-input',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_INPUT_STYLES],\n template: `\n <div class=\"chat-input__container\">\n <ng-content select=\"[chatInputBanner]\" />\n <ng-content select=\"[chatInputAttachments]\" />\n <div class=\"chat-input__pill\">\n <ng-content select=\"[chatInputLeading]\" />\n <textarea\n #textareaEl\n class=\"chat-input__textarea\"\n [value]=\"messageText()\"\n (input)=\"onInput($event)\"\n [placeholder]=\"placeholder()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (compositionstart)=\"composing.set(true)\"\n (compositionend)=\"composing.set(false)\"\n (focus)=\"focused.set(true)\"\n (blur)=\"focused.set(false)\"\n name=\"messageText\"\n rows=\"1\"\n aria-label=\"Type a message\"\n ></textarea>\n <div class=\"chat-input__controls\">\n <ng-content select=\"[chatInputModelSelect]\" />\n <ng-content select=\"[chatInputTrailing]\" />\n @if (isLoading() && canStop()) {\n <button\n type=\"button\"\n class=\"chat-input__send chat-input__send--stop\"\n (click)=\"onStop()\"\n aria-label=\"Stop generating\"\n title=\"Stop generating\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/>\n </svg>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"chat-input__send\"\n [disabled]=\"!canSubmit()\"\n (click)=\"onSubmit()\"\n aria-label=\"Send message\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\"/>\n <polyline points=\"5 12 12 5 19 12\"/>\n </svg>\n </button>\n }\n </div>\n </div>\n <ng-content select=\"[chatInputFooter]\" />\n </div>\n `,\n})\nexport class ChatInputComponent {\n readonly agent = input.required<Agent>();\n readonly submitOnEnter = input<boolean>(true);\n readonly placeholder = input<string>('');\n /** When true (default), shows a stop button while the agent is streaming. */\n readonly showStopButton = input<boolean>(true);\n readonly submitted = output<string>();\n readonly stopped = output<void>();\n readonly messageText = signal<string>('');\n readonly isLoading = computed(() => this.agent().isLoading());\n /** True while an IME composition (CJK input, accent, autocorrect) is active. */\n protected readonly composing = signal(false);\n readonly focused = signal(false);\n\n /** Submit is allowed only when not loading and there's non-whitespace text. */\n readonly canSubmit = computed(() => {\n if (this.isLoading()) return false;\n return this.messageText().trim().length > 0;\n });\n\n /** The stop button only appears when the consumer opted in AND we're loading. */\n readonly canStop = computed(() => this.showStopButton());\n\n private readonly textareaEl = viewChild<ElementRef<HTMLTextAreaElement>>('textareaEl');\n\n /**\n * Auto-resize the textarea to fit its content as the user types or pastes\n * multi-line text. Caps at min(40vh, 320px); beyond that the textarea\n * scrolls. Without this, multi-line input is hidden behind the rows=\"1\"\n * fixed height (caught by live browser smoke).\n */\n constructor() {\n effect(() => {\n const text = this.messageText();\n const el = this.textareaEl()?.nativeElement;\n if (!el) return;\n // Cap: min(40vh, 320px). Recomputed on each input so viewport resizes\n // between keystrokes are picked up without a dedicated resize listener.\n const viewportH = typeof window === 'undefined' ? 600 : window.innerHeight;\n const cap = Math.min(viewportH * 0.4, 320);\n el.style.height = 'auto';\n const next = Math.min(el.scrollHeight, cap);\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > cap ? 'auto' : 'hidden';\n void text;\n });\n }\n\n focusTextarea(): void {\n this.textareaEl()?.nativeElement.focus();\n }\n\n onSubmit(): void {\n const submitted = submitMessage(this.agent(), this.messageText());\n if (submitted !== null) {\n this.submitted.emit(submitted);\n this.messageText.set('');\n const el = this.textareaEl()?.nativeElement;\n if (el) el.value = '';\n requestAnimationFrame(() => this.textareaEl()?.nativeElement.focus());\n }\n }\n\n /** Sync the textarea's value into the signal on user input. A direct\n * [value]/(input) pair is used instead of ngModel: NgModel does not\n * reliably write a programmatic clear back to the view under zoneless\n * + OnPush, leaving sent text visible in the composer (audit F1). */\n protected onInput(event: Event): void {\n this.messageText.set((event.target as HTMLTextAreaElement).value);\n }\n\n /** Abort the current streaming response (if the adapter supports it). */\n onStop(): void {\n const a = this.agent() as unknown as { stop?: () => void | Promise<void> };\n if (typeof a.stop === 'function') {\n void a.stop();\n }\n this.stopped.emit();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (!this.submitOnEnter() || event.shiftKey) return;\n // Don't submit while an IME composition is in progress (CJK input,\n // dead-key accents, autocorrect popups). The composition's terminating\n // Enter must reach the textarea so the candidate is committed; submitting\n // here would discard the user's in-progress character.\n if (this.composing() || event.isComposing || event.keyCode === 229) return;\n event.preventDefault();\n this.onSubmit();\n }\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_TYPING_INDICATOR_STYLES = `\n /* Sit in the same centered column as chat-message-list so the dots\n don't flash at the scroll container's left edge before the assistant\n message renders. */\n :host {\n display: block;\n padding: 0 var(--ngaf-chat-space-6) var(--ngaf-chat-space-3);\n max-width: var(--ngaf-chat-max-width);\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n }\n .chat-typing__dots { display: inline-flex; gap: 4px; align-items: center; }\n .chat-typing__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--ngaf-chat-text-muted);\n animation: ngaf-chat-typing-dot 1.4s ease-in-out infinite both;\n }\n .chat-typing__dot:nth-child(2) { animation-delay: 0.2s; }\n .chat-typing__dot:nth-child(3) { animation-delay: 0.4s; }\n`;\n","// libs/chat/src/lib/primitives/chat-typing-indicator/chat-typing-indicator.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_TYPING_INDICATOR_STYLES } from '../../styles/chat-typing-indicator.styles';\n\nexport function isTyping(agent: Agent): boolean {\n if (!agent.isLoading()) return false;\n const msgs = agent.messages();\n if (msgs.length === 0) return true;\n const last = msgs[msgs.length - 1];\n if (last.role === 'user') return true;\n if (last.role === 'assistant') {\n return typeof last.content === 'string'\n ? !last.content\n : last.content.length === 0;\n }\n return false;\n}\n\n@Component({\n selector: 'chat-typing-indicator',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_TYPING_INDICATOR_STYLES],\n template: `\n @if (visible()) {\n <div class=\"chat-typing__dots\" role=\"status\" aria-label=\"Assistant is typing\">\n <span class=\"chat-typing__dot\"></span>\n <span class=\"chat-typing__dot\"></span>\n <span class=\"chat-typing__dot\"></span>\n </div>\n }\n `,\n})\nexport class ChatTypingIndicatorComponent {\n readonly agent = input.required<Agent>();\n readonly visible = computed(() => isTyping(this.agent()));\n}\n","// libs/chat/src/lib/styles/chat-history-search-palette.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_HISTORY_SEARCH_PALETTE_STYLES = `\n :host { display: contents; }\n .chat-history-search-palette__scrim {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: var(--ngaf-chat-z-modal-scrim, 1100);\n border: 0;\n padding: 0;\n cursor: pointer;\n }\n .chat-history-search-palette {\n position: fixed;\n top: 15vh;\n left: 50%;\n transform: translateX(-50%);\n width: min(560px, 90vw);\n max-height: 70vh;\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.25);\n z-index: var(--ngaf-chat-z-modal, 1101);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .chat-history-search-palette__input-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--ngaf-chat-separator);\n }\n .chat-history-search-palette__icon {\n width: 18px;\n height: 18px;\n color: var(--ngaf-chat-text-muted);\n flex-shrink: 0;\n }\n .chat-history-search-palette__input {\n flex: 1 1 auto;\n border: 0;\n outline: none;\n background: transparent;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: 1rem;\n }\n .chat-history-search-palette__input::placeholder {\n color: var(--ngaf-chat-text-muted);\n }\n .chat-history-search-palette__close {\n background: transparent;\n border: 0;\n padding: 4px;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n .chat-history-search-palette__close:hover { color: var(--ngaf-chat-text); }\n .chat-history-search-palette__list {\n flex: 1 1 auto;\n overflow-y: auto;\n padding: 4px;\n margin: 0;\n list-style: none;\n }\n .chat-history-search-palette__row {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n }\n .chat-history-search-palette__row[aria-selected=\"true\"] {\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-history-search-palette__row-title {\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size);\n }\n .chat-history-search-palette__row-subtitle {\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n margin-top: 2px;\n }\n .chat-history-search-palette__empty,\n .chat-history-search-palette__hint {\n padding: 24px 16px;\n color: var(--ngaf-chat-text-muted);\n text-align: center;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-history-search-palette__skeleton {\n padding: 8px 4px;\n }\n .chat-history-search-palette__skeleton-row {\n height: 36px;\n margin: 4px 0;\n background: var(--ngaf-chat-surface-alt);\n border-radius: 8px;\n animation: ngaf-chat-pulse 1.4s ease-in-out infinite;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-history-search-palette/chat-history-search-palette.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n effect,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_HISTORY_SEARCH_PALETTE_STYLES } from '../../styles/chat-history-search-palette.styles';\n\nexport interface ThreadMatch {\n id: string;\n title: string;\n /** Optional secondary line, rendered muted under the title. */\n subtitle?: string;\n}\n\nlet paletteInstanceCounter = 0;\n\n@Component({\n selector: 'chat-history-search-palette',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_HISTORY_SEARCH_PALETTE_STYLES],\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-history-search-palette__scrim\"\n aria-label=\"Close search\"\n (click)=\"closed.emit()\"\n ></button>\n <div\n class=\"chat-history-search-palette\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Search conversations\"\n >\n <div class=\"chat-history-search-palette__input-row\">\n <svg class=\"chat-history-search-palette__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"/>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n </svg>\n <input\n #inputEl\n class=\"chat-history-search-palette__input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeRowId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n <button\n type=\"button\"\n class=\"chat-history-search-palette__close\"\n aria-label=\"Close\"\n (click)=\"closed.emit()\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n @if (loading() && results().length === 0) {\n <div class=\"chat-history-search-palette__skeleton\" aria-hidden=\"true\">\n <div class=\"chat-history-search-palette__skeleton-row\"></div>\n <div class=\"chat-history-search-palette__skeleton-row\"></div>\n <div class=\"chat-history-search-palette__skeleton-row\"></div>\n </div>\n } @else if (results().length === 0 && query().length === 0) {\n <div class=\"chat-history-search-palette__hint\">Type to search your conversations.</div>\n } @else if (results().length === 0) {\n <div class=\"chat-history-search-palette__empty\">No conversations match.</div>\n } @else {\n <ul class=\"chat-history-search-palette__list\" role=\"listbox\" [id]=\"listId\">\n @for (row of results(); let i = $index; track row.id) {\n <li\n class=\"chat-history-search-palette__row\"\n role=\"option\"\n tabindex=\"-1\"\n [id]=\"rowId(i)\"\n [attr.aria-selected]=\"i === activeIndex() ? 'true' : 'false'\"\n (click)=\"onRowClick(row.id)\"\n (keydown.enter)=\"onRowClick(row.id)\"\n (keydown.space)=\"onRowClick(row.id)\"\n >\n <span class=\"chat-history-search-palette__row-title\">{{ row.title }}</span>\n @if (row.subtitle) {\n <span class=\"chat-history-search-palette__row-subtitle\">{{ row.subtitle }}</span>\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n `,\n})\nexport class ChatHistorySearchPaletteComponent {\n readonly open = model<boolean>(false);\n readonly query = model<string>('');\n readonly results = input<ThreadMatch[]>([]);\n readonly loading = input<boolean>(false);\n readonly placeholder = input<string>('Search conversations');\n\n readonly threadSelected = output<string>();\n readonly closed = output<void>();\n\n protected readonly activeIndex = signal<number>(0);\n protected readonly listId = `chat-history-search-palette__results-${++paletteInstanceCounter}`;\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.activeIndex.set(0);\n queueMicrotask(() => this.inputEl()?.nativeElement.focus());\n }\n });\n effect(() => {\n const max = this.results().length - 1;\n if (max >= 0 && this.activeIndex() > max) {\n this.activeIndex.set(max);\n }\n });\n }\n\n protected rowId(index: number): string {\n return `${this.listId}__row-${index}`;\n }\n\n protected activeRowId(): string | null {\n return this.results().length > 0 ? this.rowId(this.activeIndex()) : null;\n }\n\n protected onInput(e: Event): void {\n const value = (e.target as HTMLInputElement).value;\n this.query.set(value);\n }\n\n protected onInputKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.closed.emit();\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const max = this.results().length - 1;\n if (max < 0) return;\n this.activeIndex.set(Math.min(this.activeIndex() + 1, max));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.activeIndex.set(Math.max(this.activeIndex() - 1, 0));\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const rows = this.results();\n if (rows.length === 0) return;\n const row = rows[this.activeIndex()];\n this.threadSelected.emit(row.id);\n return;\n }\n }\n\n protected onRowClick(id: string): void {\n this.threadSelected.emit(id);\n }\n}\n","// libs/chat/src/lib/styles/chat-overflow-menu.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_OVERFLOW_MENU_STYLES = `\n :host { display: contents; }\n .chat-overflow-menu__scrim {\n position: fixed;\n inset: 0;\n background: transparent;\n z-index: 59;\n border: 0;\n padding: 0;\n cursor: default;\n }\n .chat-overflow-menu {\n position: fixed;\n z-index: 60;\n min-width: 160px;\n padding: 4px;\n margin: 0;\n list-style: none;\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);\n }\n .chat-overflow-menu__item {\n display: block;\n padding: 8px 12px;\n border-radius: 4px;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n user-select: none;\n }\n .chat-overflow-menu__item:hover {\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-overflow-menu__item:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: -2px;\n }\n .chat-overflow-menu__item--destructive {\n color: var(--ngaf-chat-error-text);\n }\n .chat-overflow-menu__item--disabled {\n color: var(--ngaf-chat-text-muted);\n cursor: not-allowed;\n pointer-events: none;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-overflow-menu/chat-overflow-menu.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n computed,\n effect,\n input,\n output,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_OVERFLOW_MENU_STYLES } from '../../styles/chat-overflow-menu.styles';\n\nexport interface OverflowMenuItem {\n /** Stable id emitted via (itemSelected). */\n id: string;\n label: string;\n /** 'destructive' renders the label in red. Default 'normal'. */\n tone?: 'normal' | 'destructive';\n /** Disabled items render muted and ignore clicks/keypresses. */\n disabled?: boolean;\n}\n\n@Component({\n selector: 'chat-overflow-menu',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_OVERFLOW_MENU_STYLES],\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-overflow-menu__scrim\"\n aria-label=\"Close menu\"\n (click)=\"closed.emit()\"\n ></button>\n <ul\n class=\"chat-overflow-menu\"\n role=\"menu\"\n tabindex=\"-1\"\n [style.top.px]=\"position().top\"\n [style.left.px]=\"position().left\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (item of items(); track item.id) {\n <li\n role=\"menuitem\"\n tabindex=\"0\"\n class=\"chat-overflow-menu__item\"\n [class.chat-overflow-menu__item--destructive]=\"item.tone === 'destructive'\"\n [class.chat-overflow-menu__item--disabled]=\"item.disabled\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.tabindex]=\"item.disabled ? -1 : 0\"\n (click)=\"onItemClick(item)\"\n (keydown.enter)=\"onItemClick(item)\"\n (keydown.space)=\"onItemClick(item)\"\n >\n {{ item.label }}\n </li>\n }\n </ul>\n }\n `,\n})\nexport class ChatOverflowMenuComponent {\n readonly open = input<boolean>(false);\n readonly items = input<OverflowMenuItem[]>([]);\n /** Element the menu anchors against (positions just below its bottom-right corner). */\n readonly anchor = input<HTMLElement | null>(null);\n /** Alternative anchor: explicit viewport coordinates (e.g. cursor position\n * from a right-click). Takes precedence over `anchor` when set. */\n readonly anchorPos = input<{ x: number; y: number } | null>(null);\n readonly itemSelected = output<string>();\n readonly closed = output<void>();\n\n protected readonly position = computed<{ top: number; left: number }>(() => {\n if (!this.open()) return { top: 0, left: 0 };\n const pos = this.anchorPos();\n if (pos) {\n return { top: pos.y + 4, left: Math.max(pos.x, 8) };\n }\n const el = this.anchor();\n if (!el) {\n const vw = typeof window === 'undefined' ? 0 : window.innerWidth;\n const vh = typeof window === 'undefined' ? 0 : window.innerHeight;\n return { top: Math.max(vh / 3, 0), left: Math.max(vw / 2 - 80, 0) };\n }\n const rect = el.getBoundingClientRect();\n return { top: rect.bottom + 4, left: Math.max(rect.right - 160, 8) };\n });\n\n constructor() {\n effect(() => {\n if (!this.open()) return;\n queueMicrotask(() => {\n const root = document.querySelector('.chat-overflow-menu');\n const first = root?.querySelector<HTMLElement>('.chat-overflow-menu__item:not(.chat-overflow-menu__item--disabled)');\n first?.focus();\n });\n });\n }\n\n protected onItemClick(item: OverflowMenuItem): void {\n if (item.disabled) return;\n this.itemSelected.emit(item.id);\n this.closed.emit();\n }\n\n protected onMenuKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.closed.emit();\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const root = (e.currentTarget as HTMLElement);\n const items = Array.from(root.querySelectorAll<HTMLElement>('.chat-overflow-menu__item:not(.chat-overflow-menu__item--disabled)'));\n if (items.length === 0) return;\n const current = document.activeElement as HTMLElement | null;\n const idx = current ? items.indexOf(current) : -1;\n const next = e.key === 'ArrowDown'\n ? Math.min((idx < 0 ? 0 : idx + 1), items.length - 1)\n : Math.max(idx - 1, 0);\n items[next]?.focus();\n }\n }\n}\n","// libs/chat/src/lib/styles/chat-confirm-dialog.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_CONFIRM_DIALOG_STYLES = `\n :host { display: contents; }\n .chat-confirm-dialog__scrim {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 70;\n border: 0;\n padding: 0;\n cursor: pointer;\n }\n .chat-confirm-dialog {\n position: fixed;\n top: 30vh;\n left: 50%;\n transform: translateX(-50%);\n width: min(420px, 90vw);\n z-index: 71;\n padding: 20px;\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.25);\n }\n .chat-confirm-dialog__title {\n margin: 0 0 8px 0;\n color: var(--ngaf-chat-text);\n font-size: 1.125rem;\n font-weight: 600;\n }\n .chat-confirm-dialog__body {\n margin: 0 0 16px 0;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n line-height: 1.5;\n }\n .chat-confirm-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n .chat-confirm-dialog__cancel,\n .chat-confirm-dialog__confirm {\n padding: 8px 16px;\n border-radius: 6px;\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n border: 1px solid var(--ngaf-chat-separator);\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n }\n .chat-confirm-dialog__cancel:hover { background: var(--ngaf-chat-surface-alt); }\n .chat-confirm-dialog__confirm {\n background: var(--ngaf-chat-text);\n color: var(--ngaf-chat-bg);\n border-color: transparent;\n }\n .chat-confirm-dialog__confirm--destructive {\n background: var(--ngaf-chat-destructive);\n color: #fff;\n border-color: transparent;\n }\n .chat-confirm-dialog__confirm--destructive:hover {\n filter: brightness(1.1);\n }\n .chat-confirm-dialog__cancel:focus-visible,\n .chat-confirm-dialog__confirm:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-confirm-dialog/chat-confirm-dialog.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n effect,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_CONFIRM_DIALOG_STYLES } from '../../styles/chat-confirm-dialog.styles';\n\nlet confirmDialogInstanceCounter = 0;\n\n@Component({\n selector: 'chat-confirm-dialog',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_CONFIRM_DIALOG_STYLES],\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-confirm-dialog__scrim\"\n aria-label=\"Cancel\"\n (click)=\"cancelled.emit()\"\n ></button>\n <div\n class=\"chat-confirm-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"body() ? bodyId : null\"\n (keydown)=\"onDialogKeydown($event)\"\n >\n <h2 [id]=\"titleId\" class=\"chat-confirm-dialog__title\">{{ title() }}</h2>\n @if (body()) {\n <p [id]=\"bodyId\" class=\"chat-confirm-dialog__body\">{{ body() }}</p>\n }\n <div class=\"chat-confirm-dialog__actions\">\n <button\n #cancelBtn\n type=\"button\"\n class=\"chat-confirm-dialog__cancel\"\n (click)=\"cancelled.emit()\"\n >{{ cancelLabel() }}</button>\n <button\n type=\"button\"\n class=\"chat-confirm-dialog__confirm\"\n [class.chat-confirm-dialog__confirm--destructive]=\"tone() === 'destructive'\"\n (click)=\"confirmed.emit()\"\n >{{ confirmLabel() }}</button>\n </div>\n </div>\n }\n `,\n})\nexport class ChatConfirmDialogComponent {\n readonly open = input<boolean>(false);\n readonly title = input<string>('Are you sure?');\n readonly body = input<string>('');\n readonly confirmLabel = input<string>('Confirm');\n readonly cancelLabel = input<string>('Cancel');\n readonly tone = input<'destructive' | 'normal'>('normal');\n\n readonly confirmed = output<void>();\n readonly cancelled = output<void>();\n\n private readonly instanceId = ++confirmDialogInstanceCounter;\n protected readonly titleId = `chat-confirm-dialog__title-${this.instanceId}`;\n protected readonly bodyId = `chat-confirm-dialog__body-${this.instanceId}`;\n\n private readonly cancelBtn = viewChild<ElementRef<HTMLButtonElement>>('cancelBtn');\n\n constructor() {\n effect(() => {\n if (!this.open()) return;\n queueMicrotask(() => this.cancelBtn()?.nativeElement.focus());\n });\n }\n\n protected onDialogKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.cancelled.emit();\n }\n }\n}\n","// libs/chat/src/lib/styles/chat-scroll-bubble.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_SCROLL_BUBBLE_STYLES = `\n :host {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-bottom: 8px;\n z-index: 2;\n pointer-events: none;\n }\n .chat-scroll-bubble {\n pointer-events: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 36px;\n height: 36px;\n padding: 0 12px;\n border-radius: 9999px;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n color: var(--ngaf-chat-text);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n cursor: pointer;\n transition: transform 150ms ease, box-shadow 150ms ease;\n }\n .chat-scroll-bubble:hover { transform: scale(1.05); }\n .chat-scroll-bubble__dots { display: inline-flex; gap: 4px; align-items: center; }\n .chat-scroll-bubble__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--ngaf-chat-text-muted);\n animation: ngaf-chat-typing-dot 1.4s ease-in-out infinite both;\n }\n .chat-scroll-bubble__dot:nth-child(2) { animation-delay: 0.2s; }\n .chat-scroll-bubble__dot:nth-child(3) { animation-delay: 0.4s; }\n .chat-scroll-bubble__arrow {\n width: 16px;\n height: 16px;\n display: block;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, output, computed } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SCROLL_BUBBLE_STYLES } from '../../styles/chat-scroll-bubble.styles';\n\nexport type ChatScrollBubbleMode = 'streaming' | 'idle';\n\n@Component({\n selector: 'chat-scroll-bubble',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_SCROLL_BUBBLE_STYLES],\n template: `\n <button\n type=\"button\"\n class=\"chat-scroll-bubble\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"clicked.emit()\"\n >\n @if (mode() === 'streaming') {\n <span class=\"chat-scroll-bubble__dots\" aria-hidden=\"true\">\n <span class=\"chat-scroll-bubble__dot\"></span>\n <span class=\"chat-scroll-bubble__dot\"></span>\n <span class=\"chat-scroll-bubble__dot\"></span>\n </span>\n } @else {\n <svg class=\"chat-scroll-bubble__arrow\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <polyline points=\"19 12 12 19 5 12\"/>\n </svg>\n }\n </button>\n `,\n})\nexport class ChatScrollBubbleComponent {\n readonly mode = input.required<ChatScrollBubbleMode>();\n readonly clicked = output<void>();\n protected readonly ariaLabel = computed(() =>\n this.mode() === 'streaming' ? 'Latest activity' : 'Scroll to latest',\n );\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_ERROR_STYLES = `\n :host { display: block; }\n .chat-error {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n background: var(--ngaf-chat-error-bg);\n border: 1px solid var(--ngaf-chat-error-border);\n color: var(--ngaf-chat-error-text);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 8px 12px;\n font-size: var(--ngaf-chat-font-size-sm);\n margin: 0 var(--ngaf-chat-space-6) var(--ngaf-chat-space-2);\n }\n .chat-error__icon { flex-shrink: 0; width: 16px; height: 16px; margin-top: 2px; }\n .chat-error__msg { flex: 1; min-width: 0; word-break: break-word; }\n .chat-error__retry {\n flex-shrink: 0;\n background: transparent;\n color: var(--ngaf-chat-error-text);\n border: 1px solid var(--ngaf-chat-error-border);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 2px 10px;\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n transition: background 150ms ease, color 150ms ease;\n white-space: nowrap;\n }\n .chat-error__retry:hover {\n background: var(--ngaf-chat-error-border);\n color: var(--ngaf-chat-error-text);\n }\n .chat-error__retry:focus-visible {\n outline: 2px solid var(--ngaf-chat-error-border);\n outline-offset: 2px;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-error/chat-error.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_ERROR_STYLES } from '../../styles/chat-error.styles';\n\nexport function extractErrorMessage(error: unknown): string | null {\n if (!error) return null;\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n return String(error);\n}\n\n@Component({\n selector: 'chat-error',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_ERROR_STYLES],\n template: `\n @if (agent().error(); as err) {\n <div class=\"chat-error\" role=\"alert\">\n <svg class=\"chat-error__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n <span class=\"chat-error__msg\">{{ err.message }}</span>\n @if (err.retryable) {\n <button type=\"button\" class=\"chat-error__retry\" (click)=\"agent().retry()\">Retry</button>\n }\n </div>\n }\n `,\n})\nexport class ChatErrorComponent {\n readonly agent = input.required<Agent>();\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_INTERRUPT_STYLES = `\n :host { display: block; }\n .chat-interrupt {\n background: var(--ngaf-chat-warning-bg);\n color: var(--ngaf-chat-warning-text);\n border-left: 3px solid var(--ngaf-chat-warning-text);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 12px 16px;\n margin: 0 var(--ngaf-chat-space-6) var(--ngaf-chat-space-2);\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-interrupt__title { font-weight: 600; margin: 0 0 4px; display: flex; align-items: center; gap: 6px; }\n .chat-interrupt__body { margin: 0 0 8px; opacity: 0.95; }\n .chat-interrupt__actions { display: flex; gap: 8px; flex-wrap: wrap; }\n`;\n","// libs/chat/src/lib/primitives/chat-interrupt/chat-interrupt.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent } from '../../agent';\nimport type { AgentInterrupt } from '../../agent/agent-interrupt';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_INTERRUPT_STYLES } from '../../styles/chat-interrupt.styles';\n\nexport function getInterrupt(agent: Agent): AgentInterrupt | undefined {\n return agent.interrupt?.();\n}\n\n@Component({\n selector: 'chat-interrupt',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_INTERRUPT_STYLES],\n template: `\n @if (interrupt(); as currentInterrupt) {\n <div class=\"chat-interrupt\" role=\"status\">\n <div class=\"chat-interrupt__title\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/>\n </svg>\n Agent paused\n </div>\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"{ $implicit: currentInterrupt }\"\n />\n } @else {\n <p class=\"chat-interrupt__body\">{{ defaultText(currentInterrupt) }}</p>\n }\n </div>\n }\n `,\n})\nexport class ChatInterruptComponent {\n readonly agent = input.required<Agent>();\n readonly templateRef = contentChild(TemplateRef);\n readonly interrupt = computed(() => getInterrupt(this.agent()));\n\n defaultText(i: AgentInterrupt): string {\n const v = (i as { value?: unknown }).value;\n return typeof v === 'string' ? v : JSON.stringify(v);\n }\n}\n","// libs/chat/src/lib/compositions/chat-tool-call-card/chat-tool-call-card.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { ChatTraceComponent, type TraceState } from '../../primitives/chat-trace/chat-trace.component';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport type { ToolCallStatus } from '../../agent';\n\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: unknown;\n result?: unknown;\n /** Optional — present when the parent provides it. Drives the pill + default-collapsed logic. */\n status?: ToolCallStatus;\n}\n\n@Component({\n selector: 'chat-tool-call-card',\n standalone: true,\n imports: [ChatTraceComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; }\n .tcc__name {\n font-family: var(--ngaf-chat-font-mono);\n font-size: var(--ngaf-chat-font-size-sm, 13px);\n color: var(--ngaf-chat-text-muted);\n font-weight: 400;\n padding-left: 2px;\n }\n .tcc__pill {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 9999px;\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text-muted);\n font-size: 10px;\n font-weight: 500;\n margin-left: 6px;\n line-height: 1.4;\n }\n .tcc__pill svg { width: 10px; height: 10px; }\n .tcc__pill[data-status=\"running\"] svg { animation: tcc-spin 0.8s linear infinite; }\n @keyframes tcc-spin { to { transform: rotate(360deg); } }\n .tcc__section { padding: 8px 0; }\n .tcc__section + .tcc__section { border-top: 1px solid var(--ngaf-chat-separator); }\n .tcc__section-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--ngaf-chat-text-muted);\n margin: 0 0 4px;\n }\n .tcc__section-body {\n font-family: var(--ngaf-chat-font-mono);\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text);\n white-space: pre-wrap;\n overflow-x: auto;\n margin: 0;\n }\n `],\n template: `\n <chat-trace [state]=\"state()\" [defaultExpanded]=\"autoExpanded()\">\n <span traceLabel>\n <span class=\"tcc__name\">{{ toolCall().name }}</span>\n <span class=\"tcc__pill\" [attr.data-status]=\"status()\" [attr.aria-label]=\"ariaLabel()\">\n @switch (status()) {\n @case ('running') {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"M8 2 a6 6 0 0 1 6 6\" stroke-linecap=\"round\"/>\n </svg>\n }\n @case ('complete') {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m3 8 4 4 6-8\"/>\n </svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M8 4v5\"/>\n <circle cx=\"8\" cy=\"12\" r=\"0.5\" fill=\"currentColor\"/>\n </svg>\n }\n }\n </span>\n </span>\n <div class=\"tcc__section\">\n <p class=\"tcc__section-label\">Inputs</p>\n <pre class=\"tcc__section-body\">{{ formatJson(toolCall().args) }}</pre>\n </div>\n @if (toolCall().result !== undefined) {\n <div class=\"tcc__section\">\n <p class=\"tcc__section-label\">Output</p>\n <pre class=\"tcc__section-body\">{{ formatJson(toolCall().result) }}</pre>\n </div>\n }\n </chat-trace>\n `,\n})\nexport class ChatToolCallCardComponent {\n readonly toolCall = input.required<ToolCallInfo>();\n readonly defaultCollapsed = input<boolean>(true);\n\n readonly status = computed<ToolCallStatus>(() => {\n const tc = this.toolCall();\n if (tc.status) return tc.status;\n return tc.result !== undefined ? 'complete' : 'running';\n });\n\n readonly state = computed<TraceState>(() => {\n switch (this.status()) {\n case 'complete': return 'done';\n case 'error': return 'error';\n case 'running': return 'running';\n default: return 'pending';\n }\n });\n\n readonly autoExpanded = computed<boolean>(() => {\n const s = this.status();\n if (s === 'running' || s === 'error') return true;\n return !this.defaultCollapsed();\n });\n\n readonly ariaLabel = computed<string>(() => {\n switch (this.status()) {\n case 'running': return 'Running';\n case 'complete': return 'Completed';\n case 'error': return 'Failed';\n default: return '';\n }\n });\n\n formatJson(value: unknown): string {\n if (typeof value === 'string') return value;\n try { return JSON.stringify(value, null, 2); } catch { return String(value); }\n }\n}\n","// libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-call-template.directive.ts\n// SPDX-License-Identifier: MIT\nimport { Directive, TemplateRef, inject, input } from '@angular/core';\nimport type { ToolCall, ToolCallStatus } from '../../agent';\n\n/**\n * Template-context surface available to a per-tool template. The first\n * argument is the ToolCall itself (let-call); status is exposed as a\n * named context property (let-status=\"status\").\n */\nexport interface ChatToolCallTemplateContext {\n $implicit: ToolCall;\n status: ToolCallStatus;\n}\n\n/**\n * Registers a per-tool-name template inside <chat-tool-calls>. The\n * primitive collects all directive instances via contentChildren() and\n * dispatches incoming calls by their `name` field. A literal \"*\" name\n * registers a wildcard catch-all that handles any tool name without a\n * specific template registered.\n *\n * Usage:\n *\n * <chat-tool-calls [agent]=\"agent\" [message]=\"msg\">\n * <ng-template chatToolCallTemplate=\"search_web\" let-call let-status=\"status\">\n * <my-search-result-card [query]=\"call.args.query\" [status]=\"status\"/>\n * </ng-template>\n * <ng-template chatToolCallTemplate=\"*\" let-call>\n * <chat-tool-call-card [toolCall]=\"call\"/>\n * </ng-template>\n * </chat-tool-calls>\n */\n@Directive({\n selector: '[chatToolCallTemplate]',\n standalone: true,\n})\nexport class ChatToolCallTemplateDirective {\n /** The tool name this template handles, or \"*\" for the wildcard catch-all. */\n readonly name = input.required<string>({ alias: 'chatToolCallTemplate' });\n readonly templateRef = inject(TemplateRef<ChatToolCallTemplateContext>);\n}\n","// libs/chat/src/lib/primitives/chat-tool-calls/group-summary.ts\n// SPDX-License-Identifier: MIT\n\n/**\n * Default summary text for a group of N consecutive same-name tool calls.\n * Recognizes a small set of common tool-name prefixes; falls back to a\n * generic \"Called {name} N times\" otherwise.\n *\n * Consumers can override the registry per-instance via the\n * `[groupSummary]` input on <chat-tool-calls>.\n */\nexport function summarizeGroup(name: string, count: number): string {\n const noun = nounForPrefix(name);\n if (noun) return `${noun.verb} ${count} ${pluralize(noun.singular, count)}`;\n return `Called ${name} ${count} ${count === 1 ? 'time' : 'times'}`;\n}\n\ninterface NounEntry { verb: string; singular: string }\n\nfunction nounForPrefix(name: string): NounEntry | null {\n if (name.startsWith('search_')) return { verb: 'Searched', singular: 'site' };\n if (name.startsWith('generate_')) return { verb: 'Generated', singular: 'item' };\n if (name.startsWith('read_')) return { verb: 'Read', singular: 'file' };\n if (name.startsWith('write_')) return { verb: 'Wrote', singular: 'file' };\n if (name.startsWith('list_')) return { verb: 'Listed', singular: 'item' };\n return null;\n}\n\nfunction pluralize(word: string, count: number): string {\n return count === 1 ? word : `${word}s`;\n}\n","// SPDX-License-Identifier: MIT\nimport type { Agent, Message, ToolCall } from '../../agent';\n\n/**\n * Resolves the tool calls that belong to a specific message, mirroring the\n * per-message scoping the chat lib uses to avoid every assistant bubble\n * re-rendering the whole thread's tool-call list.\n *\n * - No message context → the agent's global tool-call list.\n * - Assistant message with `toolCallIds` (LangGraph) → those ids, in order.\n * - Assistant message with `tool_use` content blocks (Anthropic) → those ids.\n * - Assistant message with no linkage → [] (this message emitted no calls).\n * - Any non-assistant message → the global list (callers filter as needed).\n *\n * MUST be called inside a reactive context (computed/effect) so the\n * `agent.toolCalls()` signal read registers a dependency.\n */\nexport function resolveMessageToolCalls(agent: Agent, message: Message | undefined): ToolCall[] {\n const all = agent.toolCalls();\n if (message && message.role === 'assistant') {\n if (message.toolCallIds && message.toolCallIds.length > 0) {\n return message.toolCallIds\n .map((id) => all.find((tc) => tc.id === id))\n .filter((x): x is ToolCall => !!x);\n }\n if (Array.isArray(message.content)) {\n const blocks = message.content.filter((b) => b.type === 'tool_use');\n return blocks\n .map((b) => all.find((tc) => tc.id === b.id))\n .filter((x): x is ToolCall => !!x);\n }\n return [];\n }\n return all;\n}\n","// libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-calls.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, ChangeDetectionStrategy,\n computed, contentChildren, input, signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent, Message, ToolCall } from '../../agent';\nimport { ChatToolCallCardComponent, type ToolCallInfo } from '../../compositions/chat-tool-call-card/chat-tool-call-card.component';\nimport { ChatToolCallTemplateDirective } from './chat-tool-call-template.directive';\nimport { summarizeGroup as defaultSummarizeGroup } from './group-summary';\nimport { resolveMessageToolCalls } from './resolve-message-tool-calls';\n\ninterface Group {\n name: string;\n calls: ToolCall[];\n templateRef?: ChatToolCallTemplateDirective;\n}\n\n@Component({\n selector: 'chat-tool-calls',\n standalone: true,\n imports: [NgTemplateOutlet, ChatToolCallCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n :host { display: block; margin-bottom: 20px; }\n .ctc__group {\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: var(--ngaf-chat-radius-card);\n margin: 0 0 4px;\n }\n .ctc__group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: 0;\n font: inherit;\n color: var(--ngaf-chat-text);\n cursor: pointer;\n text-align: left;\n }\n .ctc__group-chevron {\n width: 10px; height: 10px;\n transition: transform 120ms ease;\n }\n .ctc__group[data-expanded=\"true\"] .ctc__group-chevron { transform: rotate(90deg); }\n .ctc__group-body {\n padding: 0 12px 8px;\n border-top: 1px solid var(--ngaf-chat-separator);\n }\n `],\n template: `\n @for (group of groups(); track $index) {\n @if (group.calls.length > 1 && !group.templateRef) {\n <!-- Default grouped strip -->\n @let expanded = expandedGroups().has($index);\n <div class=\"ctc__group\" [attr.data-group]=\"true\" [attr.data-expanded]=\"expanded\">\n <button type=\"button\" class=\"ctc__group-header\" (click)=\"toggleGroup($index)\">\n <svg class=\"ctc__group-chevron\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 2l4 4-4 4\"/>\n </svg>\n <span>{{ summarize(group.name, group.calls.length) }}</span>\n </button>\n @if (expanded) {\n <div class=\"ctc__group-body\">\n @for (tc of group.calls; track tc.id) {\n <chat-tool-call-card [toolCall]=\"toToolCallInfo(tc)\" />\n }\n </div>\n }\n </div>\n } @else if (group.templateRef) {\n @for (tc of group.calls; track tc.id) {\n <ng-container\n [ngTemplateOutlet]=\"group.templateRef.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: tc, status: tc.status }\"\n />\n }\n } @else {\n @for (tc of group.calls; track tc.id) {\n <chat-tool-call-card [toolCall]=\"toToolCallInfo(tc)\" />\n }\n }\n }\n `,\n})\nexport class ChatToolCallsComponent {\n readonly agent = input.required<Agent>();\n readonly message = input<Message | undefined>(undefined);\n readonly grouping = input<'auto' | 'none'>('auto');\n readonly groupSummary = input<((name: string, count: number) => string) | undefined>(undefined);\n\n /**\n * Tool names whose groups should be hidden. Used by chat compositions\n * to filter out internal/orchestration tools (e.g. GenUI dispatchers)\n * whose args streaming is not meaningful to surface in the chat.\n * Default empty — preserves prior behavior for non-filtering consumers.\n */\n readonly excludeToolNames = input<readonly string[]>([]);\n\n /** Per-tool-name + wildcard templates registered as content children. */\n readonly templates = contentChildren(ChatToolCallTemplateDirective);\n\n private readonly templateRegistry = computed(() => {\n const map = new Map<string, ChatToolCallTemplateDirective>();\n for (const t of this.templates()) {\n map.set(t.name(), t);\n }\n return map;\n });\n\n readonly toolCalls = computed((): ToolCall[] =>\n resolveMessageToolCalls(this.agent(), this.message()),\n );\n\n readonly groups = computed((): Group[] => {\n const excludeSet = new Set(this.excludeToolNames());\n const calls = this.toolCalls().filter(tc => !excludeSet.has(tc.name));\n const groupingMode = this.grouping();\n const registry = this.templateRegistry();\n const wildcard = registry.get('*');\n const out: Group[] = [];\n for (const tc of calls) {\n const tpl = registry.get(tc.name) ?? wildcard;\n const last = out[out.length - 1];\n const sameName = last && last.name === tc.name;\n const canGroup = groupingMode === 'auto' && sameName;\n if (canGroup) {\n last.calls.push(tc);\n if (!last.templateRef && tpl) last.templateRef = tpl;\n } else {\n out.push({ name: tc.name, calls: [tc], templateRef: tpl });\n }\n }\n return out;\n });\n\n private readonly _expandedGroups = signal(new Set<number>());\n readonly expandedGroups = this._expandedGroups.asReadonly();\n\n toggleGroup(index: number): void {\n this._expandedGroups.update((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index); else next.add(index);\n return next;\n });\n }\n\n protected summarize(name: string, count: number): string {\n return (this.groupSummary() ?? defaultSummarizeGroup)(name, count);\n }\n\n protected toToolCallInfo(tc: ToolCall): ToolCallInfo {\n return { id: tc.id, name: tc.name, args: tc.args, result: tc.result, status: tc.status };\n }\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_GENERATIVE_UI_STYLES = `\n :host {\n display: block;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size);\n line-height: var(--ngaf-chat-line-height);\n }\n .chat-generative-ui__error {\n color: var(--ngaf-chat-error-text);\n background: var(--ngaf-chat-error-bg);\n border: 1px solid var(--ngaf-chat-error-border);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 8px 12px;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n`;\n","// SPDX-License-Identifier: MIT\nimport type { Spec, UIElement } from '@json-render/core';\n\n/**\n * The json-render schema prompt shipped with the example backends documents\n * state-bound props as `{ statePath: \"/path\" }` (the A2UI binding dialect —\n * see `examples/<example>/python/src/schemas/json_render.py`). The\n * @json-render/core\n * prop resolver only understands `$state`/`$bindState` expressions, so a raw\n * `{ statePath }` object would fall through to the view component unresolved\n * and interpolate as the literal string \"[object Object]\".\n *\n * `normalizeJsonRenderSpec` rewrites each top-level `{ statePath: p }` prop\n * to the engine-native `{ $bindState: p }` AND records it in the element's\n * `_bindings` map (prop name → path) so the a2ui catalog components can\n * write user input back to the state store — mirroring exactly what\n * `surfaceToSpec` does for A2UI path refs.\n */\ninterface StatePathRef {\n statePath: string;\n}\n\nfunction isStatePathRef(value: unknown): value is StatePathRef {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n typeof (value as Record<string, unknown>)['statePath'] === 'string' &&\n Object.keys(value).length === 1\n );\n}\n\n/** Rewrites schema-documented `{ statePath }` prop refs to `$bindState` +\n * `_bindings`. Returns the input reference unchanged when no rewriting is\n * needed (keeps downstream memoization intact). */\nexport function normalizeJsonRenderSpec(spec: Spec): Spec {\n const sourceElements = (spec.elements ?? {}) as Record<string, UIElement>;\n let specChanged = false;\n const elements: Record<string, UIElement> = {};\n\n for (const [id, el] of Object.entries(sourceElements)) {\n const rawProps = el?.props as Record<string, unknown> | undefined;\n if (!rawProps) {\n elements[id] = el;\n continue;\n }\n\n let elementChanged = false;\n const props: Record<string, unknown> = {};\n const bindings: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(rawProps)) {\n if (isStatePathRef(value)) {\n props[key] = { $bindState: value.statePath };\n bindings[key] = value.statePath;\n elementChanged = true;\n } else {\n props[key] = value;\n }\n }\n\n if (elementChanged) {\n // Merge with any model-emitted `_bindings` (never observed, but cheap\n // to preserve) — rewritten paths win.\n const existing = (rawProps['_bindings'] ?? {}) as Record<string, string>;\n props['_bindings'] = { ...existing, ...bindings };\n elements[id] = { ...el, props } as UIElement;\n specChanged = true;\n } else {\n elements[id] = el;\n }\n }\n\n return specChanged ? ({ ...spec, elements } as Spec) : spec;\n}\n","// libs/chat/src/lib/primitives/chat-generative-ui/chat-generative-ui.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n effect,\n input,\n output,\n untracked,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { Spec, StateStore } from '@json-render/core';\nimport type { AngularRegistry, RenderEvent } from '@threadplane/render';\nimport { RenderSpecComponent } from '@threadplane/render';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_GENERATIVE_UI_STYLES } from '../../styles/chat-generative-ui.styles';\nimport { normalizeJsonRenderSpec } from './normalize-json-render-spec';\n\n@Component({\n selector: 'chat-generative-ui',\n standalone: true,\n imports: [RenderSpecComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_GENERATIVE_UI_STYLES],\n template: `\n @if (normalizedSpec()) {\n <render-spec\n [spec]=\"normalizedSpec()\"\n [registry]=\"registry()\"\n [store]=\"store()\"\n [handlers]=\"handlers()\"\n [loading]=\"loading()\"\n (events)=\"events.emit($event)\"\n />\n }\n `,\n})\nexport class ChatGenerativeUiComponent {\n readonly spec = input<Spec | null>(null);\n readonly registry = input<AngularRegistry | undefined>(undefined);\n readonly store = input<StateStore | undefined>(undefined);\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>> | undefined>(undefined);\n readonly loading = input<boolean>(false);\n readonly events = output<RenderEvent>();\n\n /** The bound spec with schema-documented `{ statePath }` prop refs\n * rewritten to engine-native `{ $bindState }` + `_bindings` so values\n * resolve against the state store instead of interpolating as\n * \"[object Object]\" (F4). */\n protected readonly normalizedSpec = computed(() => {\n const s = this.spec();\n return s ? normalizeJsonRenderSpec(s) : null;\n });\n\n /** Last value this component seeded per state path. Lets the seeding\n * effect distinguish \"still the value we wrote (possibly a partial\n * chunk from streaming — safe to overwrite with the newer one)\" from\n * \"user edited it via a bound control — leave it alone\". */\n private readonly seeded = new Map<string, unknown>();\n\n constructor() {\n // Seed `spec.state` (the schema's \"initial state model\") into an\n // EXPLICIT consumer-provided store, which is typically EMPTY at first —\n // without this, statePath/$bindState props would resolve to undefined.\n // A consumer-provided store intentionally has shared/live semantics\n // across surfaces: every surface bound to it reads (and writes) the same\n // state, so the first surface to seed a path wins. When NO store input\n // is given, this effect is a no-op and render-spec self-seeds its own\n // per-instance internal store from spec.state, keeping surfaces with\n // overlapping state keys isolated from each other (a2ui parity).\n effect(() => {\n const s = this.spec();\n const store = this.store();\n const state = s?.state as Record<string, unknown> | undefined;\n if (!state || !store) return;\n // Untracked: store reads/writes must not become dependencies — the\n // effect re-runs on spec/store-identity changes only, not on every\n // write to the (possibly shared) store.\n untracked(() => {\n for (const [key, value] of Object.entries(state)) {\n const path = key.startsWith('/') ? key : `/${key}`;\n const current = store.get(path);\n const untouched =\n current === undefined ||\n (this.seeded.has(path) && current === this.seeded.get(path));\n if (untouched) {\n if (current !== value) store.set(path, value);\n this.seeded.set(path, value);\n }\n }\n });\n });\n }\n}\n","// libs/chat/src/lib/primitives/chat-tool-views/chat-tool-views.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { Spec, StateStore } from '@json-render/core';\nimport type { RenderEvent, ViewRegistry } from '@threadplane/render';\nimport { toRenderRegistry } from '@threadplane/render';\nimport type { Agent, Message, ToolCall } from '../../agent';\nimport { resolveMessageToolCalls } from '../chat-tool-calls/resolve-message-tool-calls';\nimport { ChatGenerativeUiComponent } from '../chat-generative-ui/chat-generative-ui.component';\n\n/**\n * Renders a frontend component for a tool call by reusing the chat\n * composition's `views` registry. A tool call whose `name` matches a\n * registry key is bridged into a synthetic one-element render spec\n * (`{ root: name, elements: { [name]: { type: name, props } } }`) and\n * rendered through the existing render-spec pipeline.\n *\n * Props merge the live `args` (present while the call streams) with the\n * `result` (on completion) and always include `status`, so a view\n * component can show its own loading/empty/error states. `RenderElement`\n * filters props down to the component's declared inputs, so extra keys\n * (and a `status` a component chooses not to declare) are harmless.\n */\n@Component({\n selector: 'chat-tool-views',\n standalone: true,\n imports: [ChatGenerativeUiComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (view of toolViews(); track view.id) {\n <chat-generative-ui\n [spec]=\"view.spec\"\n [registry]=\"registry()\"\n [store]=\"store()\"\n [handlers]=\"handlers()\"\n [loading]=\"view.loading\"\n (events)=\"events.emit($event)\"\n />\n }\n `,\n})\nexport class ChatToolViewsComponent {\n readonly agent = input.required<Agent>();\n readonly events = output<RenderEvent>();\n readonly message = input<Message | undefined>(undefined);\n readonly views = input<ViewRegistry | undefined>(undefined);\n readonly store = input<StateStore | undefined>(undefined);\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>({});\n\n readonly registry = computed(() => {\n const v = this.views();\n return v ? toRenderRegistry(v) : undefined;\n });\n\n readonly toolViews = computed(() => {\n const v = this.views();\n if (!v) return [];\n const names = new Set(Object.keys(v));\n return resolveMessageToolCalls(this.agent(), this.message())\n .filter((tc) => names.has(tc.name))\n .map((tc) => ({ id: tc.id, loading: tc.status === 'running', spec: toToolViewSpec(tc) }));\n });\n}\n\n/** Wraps a tool call into a synthetic single-element render spec. */\nfunction toToolViewSpec(tc: ToolCall): Spec {\n const args = isRecord(tc.args) ? tc.args : {};\n const result = isRecord(tc.result) ? tc.result : {};\n return {\n root: tc.name,\n elements: {\n [tc.name]: {\n type: tc.name,\n props: { ...args, ...result, status: tc.status },\n },\n },\n };\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// libs/chat/src/lib/compositions/chat-subagent-card/chat-subagent-card.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { ChatTraceComponent, type TraceState } from '../../primitives/chat-trace/chat-trace.component';\nimport { ChatToolCallCardComponent, type ToolCallInfo } from '../chat-tool-call-card/chat-tool-call-card.component';\nimport { ChatStreamingMdComponent } from '../../streaming/streaming-markdown.component';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport type { Subagent, SubagentStatus } from '../../agent/subagent';\nimport type { Message, ToolCall } from '../../agent';\n\n/**\n * Returns a CSS style string for a subagent's status badge.\n * Kept exported for backward compatibility with existing consumers; the\n * preferred way to style status visually is via the `data-status` attribute\n * + CSS selectors (see component styles below).\n */\nexport function statusColor(status: SubagentStatus): string {\n switch (status) {\n case 'pending': return 'background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text-muted);';\n case 'running': return 'background: var(--ngaf-chat-warning-bg); color: var(--ngaf-chat-warning-text);';\n case 'complete': return 'color: var(--ngaf-chat-success);';\n case 'error': return 'background: var(--ngaf-chat-error-bg); color: var(--ngaf-chat-error-text);';\n }\n}\n\nfunction statusToTraceState(s: SubagentStatus): TraceState {\n switch (s) {\n case 'pending': return 'pending';\n case 'running': return 'running';\n case 'complete': return 'done';\n case 'error': return 'error';\n }\n}\n\n@Component({\n selector: 'chat-subagent-card',\n standalone: true,\n imports: [ChatTraceComponent, ChatToolCallCardComponent, ChatStreamingMdComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; }\n .sac__name { color: var(--ngaf-chat-text); font-weight: 500; font-size: var(--ngaf-chat-font-size-sm); }\n .sac__id { font-family: var(--ngaf-chat-font-mono); font-size: var(--ngaf-chat-font-size-xs); color: var(--ngaf-chat-text-muted); margin-left: 4px; }\n .sac__pill {\n padding: 1px 8px;\n border-radius: 9999px;\n font-size: 11px;\n font-weight: 500;\n margin-left: 4px;\n }\n .sac__pill[data-status=\"pending\"] { background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text-muted); }\n .sac__pill[data-status=\"running\"] { background: var(--ngaf-chat-warning-bg); color: var(--ngaf-chat-warning-text); }\n .sac__pill[data-status=\"complete\"] { color: var(--ngaf-chat-success); }\n .sac__pill[data-status=\"error\"] { background: var(--ngaf-chat-error-bg); color: var(--ngaf-chat-error-text); }\n .sac__count { font-size: var(--ngaf-chat-font-size-xs); color: var(--ngaf-chat-text-muted); }\n .sac__msg { padding: 6px 0; }\n .sac__msg + .sac__msg { border-top: 1px solid var(--ngaf-chat-separator); }\n .sac__reasoning {\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text-muted);\n font-style: italic;\n margin-bottom: 4px;\n }\n `],\n template: `\n <chat-trace [state]=\"state()\">\n <span traceLabel>\n <span class=\"sac__name\">{{ subagent().name ?? 'Subagent' }}</span>\n <span class=\"sac__id\">{{ subagent().toolCallId }}</span>\n <span class=\"sac__pill\" [attr.data-status]=\"subagent().status()\">{{ subagent().status() }}</span>\n </span>\n <div class=\"sac__count\">{{ subagent().messages().length }} message(s)</div>\n @for (m of subagent().messages(); track m.id) {\n <div class=\"sac__msg\" [attr.data-role]=\"m.role\">\n @if (m.reasoning) {\n <div class=\"sac__reasoning\">{{ m.reasoning }}</div>\n }\n @if (textOf(m); as t) {\n <chat-streaming-md [content]=\"t\" />\n }\n @for (tc of toolCallsFor(m); track tc.id) {\n <chat-tool-call-card [toolCall]=\"toToolCallInfo(tc)\" />\n }\n </div>\n }\n </chat-trace>\n `,\n})\nexport class ChatSubagentCardComponent {\n readonly subagent = input.required<Subagent>();\n readonly state = computed<TraceState>(() => statusToTraceState(this.subagent().status()));\n\n protected textOf(m: Message): string {\n const c = m.content;\n return typeof c === 'string' ? c : '';\n }\n\n protected toolCallsFor(m: Message): ToolCall[] {\n const ids = m.toolCallIds ?? [];\n if (ids.length === 0) return [];\n const all = this.subagent().toolCalls?.() ?? [];\n return ids.map((id) => all.find((tc) => tc.id === id)).filter((tc): tc is ToolCall => !!tc);\n }\n\n protected toToolCallInfo(tc: ToolCall): ToolCallInfo {\n return { id: tc.id, name: tc.name, args: tc.args, result: tc.result, status: tc.status };\n }\n}\n","// libs/chat/src/lib/primitives/chat-subagents/chat-subagents.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent } from '../../agent';\nimport type { Subagent } from '../../agent/subagent';\nimport { ChatSubagentCardComponent } from '../../compositions/chat-subagent-card/chat-subagent-card.component';\n\nexport function activeSubagentsFromAgent(agent: Agent): Subagent[] {\n const map = agent.subagents?.();\n if (!map) return [];\n const out: Subagent[] = [];\n map.forEach((sa) => {\n const s = sa.status();\n if (s !== 'complete' && s !== 'error') out.push(sa);\n });\n return out;\n}\n\n@Component({\n selector: 'chat-subagents',\n standalone: true,\n imports: [NgTemplateOutlet, ChatSubagentCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (subagent of activeSubagents(); track subagent.toolCallId) {\n @if (templateRef()) {\n <ng-container [ngTemplateOutlet]=\"templateRef()!\" [ngTemplateOutletContext]=\"{ $implicit: subagent }\" />\n } @else {\n <chat-subagent-card [subagent]=\"subagent\" />\n }\n }\n `,\n})\nexport class ChatSubagentsComponent {\n readonly agent = input.required<Agent>();\n readonly templateRef = contentChild(TemplateRef);\n readonly activeSubagents = computed(() => activeSubagentsFromAgent(this.agent()));\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_THREAD_LIST_STYLES = `\n :host { display: block; padding: var(--ngaf-chat-space-2); }\n .chat-thread-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 2px; }\n .chat-thread-list__item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: var(--ngaf-chat-radius-button);\n cursor: pointer;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size-sm);\n background: transparent;\n border: 0;\n text-align: left;\n width: 100%;\n box-sizing: border-box;\n transition: background-color 150ms ease;\n }\n .chat-thread-list__item:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 5%, transparent); }\n .chat-thread-list__item[data-active=\"true\"] {\n background: var(--ngaf-chat-surface-alt);\n font-weight: 500;\n }\n .chat-thread-list__item-title {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n }\n .chat-thread-list__item-time {\n font-size: 11px;\n color: var(--ngaf-chat-text-muted);\n display: block;\n }\n .chat-thread-list__new {\n display: block;\n width: 100%;\n height: 36px;\n margin-bottom: var(--ngaf-chat-space-2);\n border: 1px dashed var(--ngaf-chat-separator);\n border-radius: var(--ngaf-chat-radius-button);\n background: transparent;\n color: var(--ngaf-chat-primary);\n cursor: pointer;\n font-size: var(--ngaf-chat-font-size-sm);\n box-sizing: border-box;\n transition: background 150ms ease;\n }\n .chat-thread-list__new:hover { background: var(--ngaf-chat-surface-alt); }\n .chat-thread-list__item-wrap {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .chat-thread-list__item-wrap .chat-thread-list__item {\n flex: 1 1 auto;\n min-width: 0;\n }\n .chat-thread-list__kebab {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n transition: opacity 100ms ease;\n padding: 0;\n line-height: 1;\n font-size: 18px;\n }\n .chat-thread-list__item-wrap:hover .chat-thread-list__kebab,\n .chat-thread-list__item-wrap:focus-within .chat-thread-list__kebab {\n opacity: 1;\n }\n .chat-thread-list__kebab:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-thread-list__kebab:focus-visible {\n opacity: 1;\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-thread-list__initial {\n display: none;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n align-items: center;\n justify-content: center;\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n font-weight: 500;\n font-size: 13px;\n flex-shrink: 0;\n }\n .chat-thread-list__item-pin {\n width: 11px;\n height: 11px;\n margin-right: 4px;\n color: var(--ngaf-chat-text-muted);\n vertical-align: -1px;\n display: inline-block;\n }\n .chat-thread-list__edit {\n flex: 1 1 auto;\n border: 1px solid var(--ngaf-chat-primary);\n border-radius: var(--ngaf-chat-radius-button);\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n padding: 6px 10px;\n min-height: 36px;\n outline: none;\n box-sizing: border-box;\n }\n .chat-thread-list__pin-slot {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 13px;\n height: 13px;\n margin-right: 4px;\n flex-shrink: 0;\n vertical-align: -1px;\n }\n .chat-thread-list__pin-slot .chat-thread-list__item-pin {\n position: absolute;\n inset: 0;\n width: 13px;\n height: 13px;\n opacity: 1;\n transition: opacity 100ms ease;\n }\n .chat-thread-list__pin-slot .chat-thread-list__grip {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--ngaf-chat-text-muted);\n font-size: 11px;\n line-height: 1;\n letter-spacing: -1px;\n opacity: 0;\n transition: opacity 100ms ease;\n user-select: none;\n pointer-events: none;\n }\n .chat-thread-list__item-wrap:hover .chat-thread-list__pin-slot .chat-thread-list__item-pin,\n .chat-thread-list__item-wrap:focus-within .chat-thread-list__pin-slot .chat-thread-list__item-pin {\n opacity: 0;\n }\n .chat-thread-list__item-wrap:hover .chat-thread-list__pin-slot .chat-thread-list__grip,\n .chat-thread-list__item-wrap:focus-within .chat-thread-list__pin-slot .chat-thread-list__grip {\n opacity: 1;\n }\n .chat-thread-list__item-wrap[draggable=\"true\"] { cursor: grab; }\n .chat-thread-list__item-wrap[draggable=\"true\"]:active { cursor: grabbing; }\n\n .chat-thread-list__item-wrap[data-dragging=\"true\"] {\n opacity: 0.4;\n }\n\n .chat-thread-list__item-wrap[data-drop-position=\"before\"]::before,\n .chat-thread-list__item-wrap[data-drop-position=\"after\"]::after {\n content: '';\n position: absolute;\n left: 4px;\n right: 4px;\n height: 2px;\n background: var(--ngaf-chat-primary);\n border-radius: 1px;\n pointer-events: none;\n }\n .chat-thread-list__item-wrap[data-drop-position=\"before\"]::before { top: -1px; }\n .chat-thread-list__item-wrap[data-drop-position=\"after\"]::after { bottom: -1px; }\n`;\n","// libs/chat/src/lib/primitives/chat-thread-list/chat-thread-list.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n computed,\n contentChild,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_THREAD_LIST_STYLES } from '../../styles/chat-thread-list.styles';\nimport {\n ChatOverflowMenuComponent,\n type OverflowMenuItem,\n} from '../chat-overflow-menu/chat-overflow-menu.component';\nimport { ChatConfirmDialogComponent } from '../chat-confirm-dialog/chat-confirm-dialog.component';\nimport type { Project } from '../chat-project-list/chat-project-list.component';\n\nexport type Thread = {\n id: string;\n /** Optional human-friendly label. Falls back to a slice of the id. */\n title?: string;\n /** Optional epoch-ms timestamp used by the default item template to\n * render a relative-time line (\"just now\" / \"5 min ago\"). When absent\n * the default template omits the second line. */\n updatedAt?: number;\n /** Optional lifecycle status. Undefined treated as 'active'. The framework\n * does NOT auto-filter by this field — consumers pre-filter into separate\n * `threads` and `archivedThreads` inputs on chat-sidenav. The field is\n * typed documentation of intent. */\n status?: 'active' | 'archived';\n /** Optional flag indicating the thread is pinned (sticky-top). The framework\n * renders a pin icon when true but does NOT sort — the consumer pre-sorts\n * pinned threads to the top of the `threads` input. */\n pinned?: boolean;\n /** Optional project association. Consumers pre-filter threads by project\n * before passing to the sidenav. Null/undefined means no project. */\n projectId?: string | null;\n [key: string]: unknown;\n};\n\n/**\n * Per-thread row-action adapter. Consumer-provided. The framework calls\n * these methods after user confirmation (delete) or commit (rename) and\n * manages optimistic UI + rollback on rejection.\n *\n * Consumers MUST refresh their `threads` signal on success — the framework\n * clears optimistic overrides in a `finally` block, so a successful adapter\n * call that leaves the input list unchanged would re-render the row.\n */\nexport interface ThreadActionAdapter {\n delete?(threadId: string): Promise<void>;\n rename?(threadId: string, newTitle: string): Promise<void>;\n /** Archive a thread (reversible). No confirmation dialog — framework calls\n * this immediately on click. */\n archive?(threadId: string): Promise<void>;\n /** Restore an archived thread to the active list. */\n unarchive?(threadId: string): Promise<void>;\n /** Mark the thread as pinned. */\n pin?(threadId: string): Promise<void>;\n /** Unpin a previously pinned thread. */\n unpin?(threadId: string): Promise<void>;\n /** Move thread to a project (or pass null to remove from any project).\n * Optimistically hides the row from the current project's visible list;\n * consumer is expected to refresh the threads input. */\n moveToProject?(threadId: string, projectId: string | null): Promise<void>;\n /** Reorder a pinned thread. `beforeId` is the id of the pinned thread it\n * should be placed before, or null to move to the end of the pinned list.\n * Framework optimistically reorders the visible list and awaits this\n * method; rejection rolls back. */\n reorderPinned?(threadId: string, beforeId: string | null): Promise<void>;\n}\n\n@Component({\n selector: 'chat-thread-list',\n standalone: true,\n imports: [NgTemplateOutlet, ChatOverflowMenuComponent, ChatConfirmDialogComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_THREAD_LIST_STYLES],\n template: `\n @if (showNewThreadButton()) {\n <button type=\"button\" class=\"chat-thread-list__new\" (click)=\"newThreadRequested.emit()\">+ New thread</button>\n }\n <ul class=\"chat-thread-list\">\n @for (thread of visibleThreads(); track thread.id) {\n <li\n class=\"chat-thread-list__item-wrap\"\n [attr.draggable]=\"thread.pinned && actions()?.reorderPinned ? 'true' : null\"\n [attr.data-dragging]=\"draggingThreadId() === thread.id ? 'true' : null\"\n [attr.data-drop-position]=\"dropPositionFor(thread.id)\"\n (dragstart)=\"onDragStart($event, thread.id)\"\n (dragover)=\"onDragOver($event, thread.id)\"\n (dragleave)=\"onDragLeave($event, thread.id)\"\n (drop)=\"onDrop($event, thread.id)\"\n (dragend)=\"onDragEnd()\"\n (contextmenu)=\"onRowContextMenu(thread.id, $event)\"\n >\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"{ $implicit: thread, isActive: thread.id === activeThreadId() }\"\n />\n } @else if (editingThreadId() === thread.id) {\n <input\n #editInput\n class=\"chat-thread-list__edit\"\n type=\"text\"\n [value]=\"editingValue()\"\n (input)=\"onEditInput($event)\"\n (keydown.enter)=\"commitRename(thread.id)\"\n (keydown.escape)=\"cancelRename()\"\n (blur)=\"cancelRename()\"\n aria-label=\"Rename conversation\"\n />\n } @else {\n <button\n type=\"button\"\n class=\"chat-thread-list__item\"\n [attr.title]=\"threadLabel(thread)\"\n [attr.data-active]=\"thread.id === activeThreadId() ? 'true' : null\"\n [attr.aria-current]=\"thread.id === activeThreadId() ? 'true' : null\"\n (click)=\"selectThread(thread.id)\"\n >\n <span class=\"chat-thread-list__initial\" aria-hidden=\"true\">{{ initialOf(threadLabel(thread)) }}</span>\n <span class=\"chat-thread-list__item-title\">\n @if (thread.pinned) {\n <span class=\"chat-thread-list__pin-slot\" aria-hidden=\"true\">\n <svg class=\"chat-thread-list__item-pin\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/>\n </svg>\n @if (actions()?.reorderPinned) {\n <span class=\"chat-thread-list__grip\">⋮⋮</span>\n }\n </span>\n }\n {{ threadLabel(thread) }}\n </span>\n @if (thread.updatedAt !== undefined) {\n <span class=\"chat-thread-list__item-time\">{{ relativeTime(thread.updatedAt) }}</span>\n }\n </button>\n\n @if (showKebab()) {\n <button\n #kebab\n type=\"button\"\n class=\"chat-thread-list__kebab\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"menuOpenForId() === thread.id ? 'true' : 'false'\"\n (click)=\"openMenu(thread.id, kebab)\"\n >⋯</button>\n }\n }\n </li>\n }\n </ul>\n\n <chat-overflow-menu\n [open]=\"menuOpenForId() !== null\"\n [items]=\"currentMenuItems()\"\n [anchor]=\"menuAnchor()\"\n [anchorPos]=\"menuAnchorPos()\"\n (itemSelected)=\"onMenuAction($event)\"\n (closed)=\"menuOpenForId.set(null)\"\n />\n\n <chat-overflow-menu\n [open]=\"moveMenuOpenForId() !== null\"\n [items]=\"moveMenuItems()\"\n [anchor]=\"menuAnchor()\"\n [anchorPos]=\"menuAnchorPos()\"\n (itemSelected)=\"onMoveMenuAction($event)\"\n (closed)=\"moveMenuOpenForId.set(null)\"\n />\n\n <chat-confirm-dialog\n [open]=\"confirmDeleteId() !== null\"\n title=\"Delete conversation?\"\n body=\"This conversation will be permanently deleted.\"\n confirmLabel=\"Delete\"\n tone=\"destructive\"\n (confirmed)=\"performDelete()\"\n (cancelled)=\"confirmDeleteId.set(null)\"\n />\n `,\n})\nexport class ChatThreadListComponent {\n readonly threads = input.required<Thread[]>();\n readonly activeThreadId = input<string>('');\n readonly showNewThreadButton = input<boolean>(false);\n readonly actions = input<ThreadActionAdapter | null>(null);\n readonly mode = input<'active' | 'archived'>('active');\n readonly projects = input<Project[] | null>(null);\n\n readonly threadSelected = output<string>();\n readonly newThreadRequested = output<void>();\n\n readonly templateRef = contentChild(TemplateRef);\n\n protected readonly editingThreadId = signal<string | null>(null);\n protected readonly editingValue = signal<string>('');\n protected readonly menuOpenForId = signal<string | null>(null);\n protected readonly menuAnchor = signal<HTMLElement | null>(null);\n /** Cursor-anchored position when the menu was opened via right-click.\n * Mutually exclusive with `menuAnchor` — set one, null the other. */\n protected readonly menuAnchorPos = signal<{ x: number; y: number } | null>(null);\n protected readonly confirmDeleteId = signal<string | null>(null);\n\n protected readonly moveMenuOpenForId = signal<string | null>(null);\n\n protected readonly moveMenuItems = computed<OverflowMenuItem[]>(() => {\n if (!this.moveMenuOpenForId()) return [];\n const list: OverflowMenuItem[] = [{ id: '__none__', label: 'No project' }];\n for (const p of this.projects() ?? []) {\n list.push({ id: p.id, label: p.name });\n }\n return list;\n });\n\n /** Ids hidden from the rendered list during pending delete, archive, or\n * unarchive. The framework doesn't distinguish — all three actions hide\n * the row from the current list until the adapter promise settles. */\n private readonly pendingHidden = signal<ReadonlySet<string>>(new Set());\n private readonly pendingRenames = signal<ReadonlyMap<string, string>>(new Map());\n\n /** Pending reorder overrides for pinned threads. Each entry: \"move this id\n * to before that id (or to end if null)\". Cleared in `finally` after the\n * adapter call settles. */\n private readonly pendingOrder = signal<ReadonlyMap<string, string | null>>(new Map());\n\n /** Id of the thread currently being dragged via HTML5 drag-and-drop. */\n protected readonly draggingThreadId = signal<string | null>(null);\n\n /** Drop target during a drag: which row, and whether the indicator shows\n * on the top edge ('before') or bottom edge ('after'). */\n protected readonly dropTarget = signal<{ threadId: string; position: 'before' | 'after' } | null>(null);\n\n protected readonly visibleThreads = computed<Thread[]>(() => {\n const hidden = this.pendingHidden();\n const renames = this.pendingRenames();\n const pending = this.pendingOrder();\n\n let result = this.threads()\n .filter((t) => !hidden.has(t.id))\n .map((t) => (renames.has(t.id) ? ({ ...t, title: renames.get(t.id) }) : t));\n\n if (pending.size > 0) {\n const pinned = result.filter((t) => t.pinned === true);\n const unpinned = result.filter((t) => t.pinned !== true);\n for (const [threadId, beforeId] of pending) {\n const idx = pinned.findIndex((t) => t.id === threadId);\n if (idx < 0) continue;\n const [moved] = pinned.splice(idx, 1);\n if (beforeId === null) {\n pinned.push(moved);\n } else {\n const beforeIdx = pinned.findIndex((t) => t.id === beforeId);\n if (beforeIdx < 0) pinned.push(moved);\n else pinned.splice(beforeIdx, 0, moved);\n }\n }\n result = [...pinned, ...unpinned];\n }\n return result;\n });\n\n protected readonly currentMenuItems = computed<OverflowMenuItem[]>(() => {\n const id = this.menuOpenForId();\n if (!id) return [];\n const a = this.actions();\n if (!a) return [];\n const items: OverflowMenuItem[] = [];\n if (this.mode() === 'active') {\n const thread = this.threads().find((t) => t.id === id);\n const isPinned = thread?.pinned === true;\n if (a.rename) items.push({ id: 'rename', label: 'Rename' });\n if (a.pin && !isPinned) items.push({ id: 'pin', label: 'Pin' });\n if (a.unpin && isPinned) items.push({ id: 'unpin', label: 'Unpin' });\n\n if (isPinned && a.reorderPinned) {\n const pinned = this.threads().filter((t) => t.pinned === true);\n const pinnedIdx = pinned.findIndex((t) => t.id === id);\n if (pinnedIdx > 0) items.push({ id: 'move-up', label: 'Move up' });\n if (pinnedIdx >= 0 && pinnedIdx < pinned.length - 1) items.push({ id: 'move-down', label: 'Move down' });\n }\n\n if (a.moveToProject && this.projects() !== null) {\n items.push({ id: 'move', label: 'Move to project' });\n }\n if (a.archive) items.push({ id: 'archive', label: 'Archive' });\n if (a.delete) items.push({ id: 'delete', label: 'Delete', tone: 'destructive' });\n } else {\n if (a.unarchive) items.push({ id: 'unarchive', label: 'Unarchive' });\n if (a.delete) items.push({ id: 'delete', label: 'Delete', tone: 'destructive' });\n }\n return items;\n });\n\n private readonly editInput = viewChild<ElementRef<HTMLInputElement>>('editInput');\n\n selectThread(threadId: string): void {\n this.threadSelected.emit(threadId);\n }\n\n protected threadLabel(thread: Thread): string {\n const title = thread['title'];\n if (typeof title === 'string' && title.length > 0) return title;\n return thread.id;\n }\n\n protected relativeTime(epochMs: number): string {\n const delta = Date.now() - epochMs;\n if (delta < 60_000) return 'just now';\n if (delta < 3_600_000) return `${Math.floor(delta / 60_000)} min ago`;\n if (delta < 86_400_000) return `${Math.floor(delta / 3_600_000)} hr ago`;\n return `${Math.floor(delta / 86_400_000)} day ago`;\n }\n\n protected showKebab(): boolean {\n const a = this.actions();\n if (!a) return false;\n if (this.mode() === 'active') {\n return Boolean(\n a.rename || a.pin || a.unpin || a.archive || a.delete ||\n a.reorderPinned ||\n (a.moveToProject && this.projects() !== null)\n );\n }\n return Boolean(a.unarchive || a.delete);\n }\n\n protected openMenu(threadId: string, anchor: HTMLElement): void {\n this.menuAnchor.set(anchor);\n this.menuAnchorPos.set(null);\n this.menuOpenForId.set(threadId);\n }\n\n /** Right-click on a row opens the same overflow menu anchored at the\n * cursor. Always prevents the native context menu — including when the\n * adapter exposes no row actions (in which case we open nothing rather\n * than confusing the user with the OS menu on what looks like a custom\n * list). */\n protected onRowContextMenu(threadId: string, event: MouseEvent): void {\n event.preventDefault();\n if (!this.showKebab()) return;\n if (this.editingThreadId() !== null) return;\n this.menuAnchor.set(null);\n this.menuAnchorPos.set({ x: event.clientX, y: event.clientY });\n this.menuOpenForId.set(threadId);\n }\n\n /** First grapheme of a title rendered as an uppercase initial for the\n * collapsed sidenav. Falls back to \"?\" for empty/whitespace titles. */\n protected initialOf(title: string): string {\n const trimmed = (title ?? '').trim();\n if (!trimmed) return '?';\n const first = Array.from(trimmed)[0];\n return first.toUpperCase ? first.toUpperCase() : first;\n }\n\n protected onMenuAction(id: string): void {\n const threadId = this.menuOpenForId();\n this.menuOpenForId.set(null);\n if (!threadId) return;\n\n if (id === 'rename') {\n const t = this.threads().find((x) => x.id === threadId);\n this.editingValue.set(typeof t?.title === 'string' ? t.title : '');\n this.editingThreadId.set(threadId);\n queueMicrotask(() => this.editInput()?.nativeElement.focus());\n } else if (id === 'delete') {\n this.confirmDeleteId.set(threadId);\n } else if (id === 'archive') {\n void this.performArchive(threadId);\n } else if (id === 'unarchive') {\n void this.performUnarchive(threadId);\n } else if (id === 'pin') {\n void this.performPin(threadId);\n } else if (id === 'unpin') {\n void this.performUnpin(threadId);\n } else if (id === 'move') {\n this.moveMenuOpenForId.set(threadId);\n } else if (id === 'move-up') {\n void this.performMoveUp(threadId);\n } else if (id === 'move-down') {\n void this.performMoveDown(threadId);\n }\n }\n\n protected async performPin(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.pin) return;\n try { await a.pin(threadId); } catch { /* visual state remains until next successful refresh */ }\n }\n\n protected async performUnpin(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.unpin) return;\n try { await a.unpin(threadId); } catch { /* visual state remains until next successful refresh */ }\n }\n\n protected onEditInput(e: Event): void {\n this.editingValue.set((e.target as HTMLInputElement).value);\n }\n\n protected cancelRename(): void {\n this.editingThreadId.set(null);\n }\n\n protected async commitRename(threadId: string): Promise<void> {\n const newTitle = this.editingValue().trim();\n this.editingThreadId.set(null);\n if (!newTitle) return;\n const a = this.actions();\n if (!a?.rename) return;\n\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.set(threadId, newTitle);\n return n;\n });\n try {\n await a.rename(threadId, newTitle);\n } catch {\n // Rollback happens via the finally clear below.\n } finally {\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performDelete(): Promise<void> {\n const threadId = this.confirmDeleteId();\n this.confirmDeleteId.set(null);\n if (!threadId) return;\n const a = this.actions();\n if (!a?.delete) return;\n\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.delete(threadId);\n } catch {\n // Rollback: clear override below so the row reappears.\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performArchive(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.archive) return;\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.archive(threadId);\n } catch {\n // Rollback: clear override below so the row reappears.\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected onMoveMenuAction(itemId: string): void {\n const threadId = this.moveMenuOpenForId();\n this.moveMenuOpenForId.set(null);\n if (!threadId) return;\n const projectId = itemId === '__none__' ? null : itemId;\n void this.performMoveToProject(threadId, projectId);\n }\n\n protected async performMoveToProject(threadId: string, projectId: string | null): Promise<void> {\n const a = this.actions();\n if (!a?.moveToProject) return;\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.moveToProject(threadId, projectId);\n } catch {\n /* rollback via finally */\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performReorderPinned(threadId: string, beforeId: string | null): Promise<void> {\n const a = this.actions();\n if (!a?.reorderPinned) return;\n this.pendingOrder.update((m) => {\n const n = new Map(m);\n n.set(threadId, beforeId);\n return n;\n });\n try {\n await a.reorderPinned(threadId, beforeId);\n } catch {\n /* rollback via finally */\n } finally {\n this.pendingOrder.update((m) => {\n const n = new Map(m);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performMoveUp(threadId: string): Promise<void> {\n const pinned = this.threads().filter((t) => t.pinned === true);\n const idx = pinned.findIndex((t) => t.id === threadId);\n if (idx <= 0) return;\n const beforeId = pinned[idx - 1].id;\n await this.performReorderPinned(threadId, beforeId);\n }\n\n protected async performMoveDown(threadId: string): Promise<void> {\n const pinned = this.threads().filter((t) => t.pinned === true);\n const idx = pinned.findIndex((t) => t.id === threadId);\n if (idx < 0 || idx >= pinned.length - 1) return;\n const beforeId = idx + 2 < pinned.length ? pinned[idx + 2].id : null;\n await this.performReorderPinned(threadId, beforeId);\n }\n\n protected onDragStart(e: DragEvent, threadId: string): void {\n const dt = e.dataTransfer;\n if (!dt) return;\n dt.setData('text/plain', threadId);\n dt.effectAllowed = 'move';\n this.draggingThreadId.set(threadId);\n }\n\n protected onDragOver(e: DragEvent, threadId: string): void {\n const dragging = this.draggingThreadId();\n if (!dragging || dragging === threadId) return;\n const target = this.threads().find((t) => t.id === threadId);\n if (target?.pinned !== true) return;\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const offsetY = e.clientY - rect.top;\n const position: 'before' | 'after' = offsetY < rect.height / 2 ? 'before' : 'after';\n const cur = this.dropTarget();\n if (!cur || cur.threadId !== threadId || cur.position !== position) {\n this.dropTarget.set({ threadId, position });\n }\n }\n\n protected onDragLeave(_e: DragEvent, threadId: string): void {\n if (this.dropTarget()?.threadId === threadId) {\n this.dropTarget.set(null);\n }\n }\n\n protected onDrop(e: DragEvent, targetThreadId: string): void {\n e.preventDefault();\n const dragId = e.dataTransfer?.getData('text/plain') ?? this.draggingThreadId();\n const target = this.dropTarget();\n this.draggingThreadId.set(null);\n this.dropTarget.set(null);\n if (!dragId || dragId === targetThreadId || !target) return;\n\n const pinned = this.threads().filter((t) => t.pinned === true);\n const targetIdx = pinned.findIndex((t) => t.id === targetThreadId);\n if (targetIdx < 0) return;\n let beforeId: string | null;\n if (target.position === 'before') {\n beforeId = targetThreadId;\n } else {\n const filteredPinned = pinned.filter((t) => t.id !== dragId);\n const filteredTargetIdx = filteredPinned.findIndex((t) => t.id === targetThreadId);\n beforeId = filteredTargetIdx + 1 < filteredPinned.length\n ? filteredPinned[filteredTargetIdx + 1].id\n : null;\n }\n void this.performReorderPinned(dragId, beforeId);\n }\n\n protected onDragEnd(): void {\n this.draggingThreadId.set(null);\n this.dropTarget.set(null);\n }\n\n protected dropPositionFor(threadId: string): 'before' | 'after' | null {\n const t = this.dropTarget();\n return t?.threadId === threadId ? t.position : null;\n }\n\n protected async performUnarchive(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.unarchive) return;\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.unarchive(threadId);\n } catch {\n // Rollback: clear override below so the row reappears.\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n}\n","// libs/chat/src/lib/styles/chat-project-list.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_PROJECT_LIST_STYLES = `\n :host { display: block; padding: var(--ngaf-chat-space-2); }\n .chat-project-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 2px; }\n .chat-project-list__item-wrap {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .chat-project-list__item {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 32px;\n padding: 6px 12px;\n border-radius: var(--ngaf-chat-radius-button);\n cursor: pointer;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size-sm);\n background: transparent;\n border: 0;\n text-align: left;\n box-sizing: border-box;\n transition: background-color 150ms ease;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .chat-project-list__item:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 5%, transparent); }\n .chat-project-list__item[data-active=\"true\"] {\n background: var(--ngaf-chat-surface-alt);\n font-weight: 500;\n }\n .chat-project-list__kebab {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n transition: opacity 100ms ease;\n padding: 0;\n line-height: 1;\n font-size: 18px;\n }\n .chat-project-list__item-wrap:hover .chat-project-list__kebab,\n .chat-project-list__item-wrap:focus-within .chat-project-list__kebab {\n opacity: 1;\n }\n .chat-project-list__kebab:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-project-list__kebab:focus-visible {\n opacity: 1;\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-project-list__edit {\n flex: 1 1 auto;\n border: 1px solid var(--ngaf-chat-primary);\n border-radius: var(--ngaf-chat-radius-button);\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n padding: 6px 10px;\n min-height: 32px;\n outline: none;\n box-sizing: border-box;\n }\n .chat-project-list__new {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n border: 0;\n padding: 10px 16px;\n border-radius: 8px;\n font-family: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n font-weight: 400;\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n width: 100%;\n }\n .chat-project-list__new:hover {\n background: color-mix(in srgb, var(--ngaf-chat-text) 8%, var(--ngaf-chat-surface-alt));\n color: var(--ngaf-chat-text);\n }\n`;\n","// libs/chat/src/lib/primitives/chat-project-list/chat-project-list.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_PROJECT_LIST_STYLES } from '../../styles/chat-project-list.styles';\nimport {\n ChatOverflowMenuComponent,\n type OverflowMenuItem,\n} from '../chat-overflow-menu/chat-overflow-menu.component';\nimport { ChatConfirmDialogComponent } from '../chat-confirm-dialog/chat-confirm-dialog.component';\n\nexport type Project = {\n id: string;\n name: string;\n /** Open shape — consumers may add icon, color, createdAt, etc. */\n [key: string]: unknown;\n};\n\n/**\n * Consumer-provided adapter for project lifecycle actions. The framework calls\n * these methods after user confirmation (delete) or commit (create/rename) and\n * manages optimistic UI + rollback on rejection.\n */\nexport interface ProjectActionAdapter {\n /** Create a new project. Returns the new project id; consumer is expected\n * to also refresh its projects signal. */\n create?(name: string): Promise<{ id: string }>;\n rename?(projectId: string, newName: string): Promise<void>;\n /** Permanently delete the project. The framework calls this AFTER user\n * confirms via the confirm dialog. */\n delete?(projectId: string): Promise<void>;\n}\n\n@Component({\n selector: 'chat-project-list',\n standalone: true,\n imports: [ChatOverflowMenuComponent, ChatConfirmDialogComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_PROJECT_LIST_STYLES],\n template: `\n @if (showNewProjectButton()) {\n <button type=\"button\" class=\"chat-project-list__new\" (click)=\"onNewProjectClicked()\">+ New project</button>\n }\n <ul class=\"chat-project-list\">\n @if (creatingProject()) {\n <li class=\"chat-project-list__item-wrap\">\n <input\n #createInput\n class=\"chat-project-list__edit\"\n type=\"text\"\n placeholder=\"New project name\"\n [value]=\"creatingValue()\"\n (input)=\"onCreateInput($event)\"\n (keydown.enter)=\"commitCreate()\"\n (keydown.escape)=\"cancelCreate()\"\n (blur)=\"cancelCreate()\"\n aria-label=\"New project name\"\n />\n </li>\n }\n @for (project of visibleProjects(); track project.id) {\n <li class=\"chat-project-list__item-wrap\">\n @if (editingProjectId() === project.id) {\n <input\n #editInput\n class=\"chat-project-list__edit\"\n type=\"text\"\n [value]=\"editingValue()\"\n (input)=\"onEditInput($event)\"\n (keydown.enter)=\"commitRename(project.id)\"\n (keydown.escape)=\"cancelRename()\"\n (blur)=\"cancelRename()\"\n aria-label=\"Rename project\"\n />\n } @else {\n <button\n type=\"button\"\n class=\"chat-project-list__item\"\n [attr.data-active]=\"project.id === activeProjectId() ? 'true' : null\"\n [attr.aria-current]=\"project.id === activeProjectId() ? 'true' : null\"\n (click)=\"selectProject(project.id)\"\n >{{ project.name }}</button>\n\n @if (showKebab()) {\n <button\n #kebab\n type=\"button\"\n class=\"chat-project-list__kebab\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"menuOpenForId() === project.id ? 'true' : 'false'\"\n (click)=\"openMenu(project.id, kebab)\"\n >⋯</button>\n }\n }\n </li>\n }\n </ul>\n\n <chat-overflow-menu\n [open]=\"menuOpenForId() !== null\"\n [items]=\"currentMenuItems()\"\n [anchor]=\"menuAnchor()\"\n (itemSelected)=\"onMenuAction($event)\"\n (closed)=\"menuOpenForId.set(null)\"\n />\n\n <chat-confirm-dialog\n [open]=\"confirmDeleteId() !== null\"\n title=\"Delete project?\"\n body=\"The project will be deleted. Threads in this project will remain but become unassigned.\"\n confirmLabel=\"Delete\"\n tone=\"destructive\"\n (confirmed)=\"performDelete()\"\n (cancelled)=\"confirmDeleteId.set(null)\"\n />\n `,\n})\nexport class ChatProjectListComponent {\n readonly projects = input.required<Project[]>();\n readonly activeProjectId = input<string | null>(null);\n readonly showNewProjectButton = input<boolean>(false);\n readonly actions = input<ProjectActionAdapter | null>(null);\n\n readonly projectSelected = output<string>();\n readonly newProjectRequested = output<void>();\n\n protected readonly creatingProject = signal<boolean>(false);\n protected readonly creatingValue = signal<string>('');\n protected readonly editingProjectId = signal<string | null>(null);\n protected readonly editingValue = signal<string>('');\n protected readonly menuOpenForId = signal<string | null>(null);\n protected readonly menuAnchor = signal<HTMLElement | null>(null);\n protected readonly confirmDeleteId = signal<string | null>(null);\n\n private readonly pendingHidden = signal<ReadonlySet<string>>(new Set());\n private readonly pendingRenames = signal<ReadonlyMap<string, string>>(new Map());\n\n protected readonly visibleProjects = computed<Project[]>(() => {\n const hidden = this.pendingHidden();\n const renames = this.pendingRenames();\n return this.projects()\n .filter((p) => !hidden.has(p.id))\n .map((p) => (renames.has(p.id) ? ({ ...p, name: renames.get(p.id)! }) : p));\n });\n\n protected readonly currentMenuItems = computed<OverflowMenuItem[]>(() => {\n const id = this.menuOpenForId();\n if (!id) return [];\n const a = this.actions();\n if (!a) return [];\n const items: OverflowMenuItem[] = [];\n if (a.rename) items.push({ id: 'rename', label: 'Rename' });\n if (a.delete) items.push({ id: 'delete', label: 'Delete', tone: 'destructive' });\n return items;\n });\n\n private readonly createInput = viewChild<ElementRef<HTMLInputElement>>('createInput');\n private readonly editInput = viewChild<ElementRef<HTMLInputElement>>('editInput');\n\n constructor() {\n effect(() => {\n if (this.creatingProject()) {\n queueMicrotask(() => this.createInput()?.nativeElement.focus());\n }\n });\n }\n\n protected selectProject(projectId: string): void {\n this.projectSelected.emit(projectId);\n }\n\n protected showKebab(): boolean {\n const a = this.actions();\n if (!a) return false;\n return Boolean(a.rename || a.delete);\n }\n\n protected openMenu(projectId: string, anchor: HTMLElement): void {\n this.menuAnchor.set(anchor);\n this.menuOpenForId.set(projectId);\n }\n\n protected onMenuAction(id: string): void {\n const projectId = this.menuOpenForId();\n this.menuOpenForId.set(null);\n if (!projectId) return;\n\n if (id === 'rename') {\n const p = this.projects().find((x) => x.id === projectId);\n this.editingValue.set(p?.name ?? '');\n this.editingProjectId.set(projectId);\n queueMicrotask(() => this.editInput()?.nativeElement.focus());\n } else if (id === 'delete') {\n this.confirmDeleteId.set(projectId);\n }\n }\n\n protected onNewProjectClicked(): void {\n this.creatingValue.set('');\n this.creatingProject.set(true);\n this.newProjectRequested.emit();\n }\n\n protected onCreateInput(e: Event): void {\n this.creatingValue.set((e.target as HTMLInputElement).value);\n }\n\n protected cancelCreate(): void {\n this.creatingProject.set(false);\n this.creatingValue.set('');\n }\n\n protected async commitCreate(): Promise<void> {\n const name = this.creatingValue().trim();\n this.creatingProject.set(false);\n this.creatingValue.set('');\n if (!name) return;\n const a = this.actions();\n if (!a?.create) return;\n try { await a.create(name); } catch { /* consumer's refresh won't show the row */ }\n }\n\n protected onEditInput(e: Event): void {\n this.editingValue.set((e.target as HTMLInputElement).value);\n }\n\n protected cancelRename(): void {\n this.editingProjectId.set(null);\n }\n\n protected async commitRename(projectId: string): Promise<void> {\n const newName = this.editingValue().trim();\n this.editingProjectId.set(null);\n if (!newName) return;\n const a = this.actions();\n if (!a?.rename) return;\n\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.set(projectId, newName);\n return n;\n });\n try {\n await a.rename(projectId, newName);\n } catch {\n /* rollback via finally */\n } finally {\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.delete(projectId);\n return n;\n });\n }\n }\n\n protected async performDelete(): Promise<void> {\n const projectId = this.confirmDeleteId();\n this.confirmDeleteId.set(null);\n if (!projectId) return;\n const a = this.actions();\n if (!a?.delete) return;\n\n this.pendingHidden.update((s) => new Set([...s, projectId]));\n try {\n await a.delete(projectId);\n } catch {\n /* rollback */\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(projectId);\n return n;\n });\n }\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-genui-skeleton',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; width: 100%; }\n .chat-genui-skeleton {\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 10px;\n padding: 14px;\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-genui-skeleton__label {\n font-size: 12px;\n color: var(--ngaf-chat-text-muted);\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .chat-genui-skeleton__rows {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .chat-genui-skeleton__row {\n height: 10px;\n border-radius: 5px;\n background: linear-gradient(\n 90deg,\n var(--ngaf-chat-separator) 0%,\n color-mix(in srgb, var(--ngaf-chat-separator) 70%, transparent) 50%,\n var(--ngaf-chat-separator) 100%\n );\n background-size: 200% 100%;\n animation: chat-genui-skeleton-shimmer 1.4s ease-in-out infinite;\n }\n .chat-genui-skeleton__row:nth-child(1) { width: 70%; }\n .chat-genui-skeleton__row:nth-child(2) { width: 90%; }\n .chat-genui-skeleton__row:nth-child(3) { width: 50%; }\n @keyframes chat-genui-skeleton-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `],\n template: `\n <div class=\"chat-genui-skeleton\" role=\"status\" aria-live=\"polite\">\n <div class=\"chat-genui-skeleton__label\">\n <span aria-hidden=\"true\">✨</span>\n <span>Building UI…</span>\n </div>\n <div class=\"chat-genui-skeleton__rows\">\n <div class=\"chat-genui-skeleton__row\"></div>\n <div class=\"chat-genui-skeleton__row\"></div>\n <div class=\"chat-genui-skeleton__row\"></div>\n </div>\n </div>\n `,\n})\nexport class ChatGenuiSkeletonComponent {}\n","// SPDX-License-Identifier: MIT\nimport {\n Component, computed, contentChild, input, output,\n TemplateRef, ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { AgentWithHistory, AgentCheckpoint } from '../../agent';\n\n@Component({\n selector: 'chat-timeline',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (cp of history(); track $index) {\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"{ $implicit: cp, index: $index }\"\n />\n }\n }\n `,\n})\nexport class ChatTimelineComponent {\n readonly agent = input.required<AgentWithHistory>();\n\n readonly checkpointSelected = output<AgentCheckpoint>();\n\n readonly templateRef = contentChild(TemplateRef);\n\n readonly history = computed<AgentCheckpoint[]>(() => this.agent().history());\n\n selectCheckpoint(cp: AgentCheckpoint): void {\n this.checkpointSelected.emit(cp);\n }\n}\n","// libs/chat/src/lib/styles/chat-welcome.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_WELCOME_STYLES = `\n :host {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 0;\n padding: var(--ngaf-chat-welcome-padding, 24px);\n box-sizing: border-box;\n animation: ngaf-chat-welcome-mount 200ms ease-out both;\n }\n .chat-welcome__inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ngaf-chat-welcome-gap, 1.25rem);\n width: 100%;\n max-width: var(--ngaf-chat-welcome-max-width, 36rem);\n text-align: center;\n }\n .chat-welcome__beacon {\n display: inline-block;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: radial-gradient(circle at 30% 30%,\n var(--ngaf-chat-text) 0%,\n var(--ngaf-chat-text-muted) 70%,\n transparent 100%);\n animation: ngaf-chat-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n margin-bottom: 8px;\n }\n .chat-welcome__title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 500;\n color: var(--ngaf-chat-text);\n line-height: 1.3;\n }\n @media (min-width: 768px) {\n .chat-welcome__title { font-size: 1.5rem; }\n }\n .chat-welcome__input {\n width: 100%;\n margin-top: 0.5rem;\n }\n .chat-welcome__suggestions {\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n }\n /* Consumers commonly project chips wrapped in a single <div\n chatWelcomeSuggestions> element. In that case the slot's flex gap\n applies between divs (one of them) — not between the chips inside.\n Apply the same flex layout one level down so the chips actually\n get spacing. Safe no-op when chips are projected directly. */\n .chat-welcome__suggestions > div {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 8px;\n }\n .chat-welcome__suggestions:empty { display: none; }\n`;\n\nexport const CHAT_WELCOME_SUGGESTION_STYLES = `\n :host { display: inline-block; }\n .chat-welcome-suggestion {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 10px 16px;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 9999px;\n color: var(--ngaf-chat-text);\n font-family: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n text-align: center;\n cursor: pointer;\n transition: background 150ms ease, border-color 150ms ease, transform 120ms ease;\n }\n .chat-welcome-suggestion:hover {\n background: var(--ngaf-chat-surface-alt);\n border-color: var(--ngaf-chat-text-muted);\n }\n .chat-welcome-suggestion:active { transform: scale(0.98); }\n .chat-welcome-suggestion:focus-visible {\n outline: 2px solid var(--ngaf-chat-text-muted);\n outline-offset: 2px;\n }\n .chat-welcome-suggestion__label { white-space: nowrap; }\n .chat-welcome-suggestion__chevron { display: none; }\n`;\n","// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_WELCOME_STYLES } from '../../styles/chat-welcome.styles';\n\n/**\n * Empty-state owner. Renders a centered greeting + slot-projected input +\n * optional vertical suggestion rows. Mounted only when the parent chat has\n * no messages and welcome is not disabled.\n *\n * Slots:\n * [chatWelcomeTitle] — replaces the default <h1> \"How can I help?\"\n * [chatWelcomeInput] — projects the chat input into the center column\n * [chatWelcomeSuggestions] — projects suggestion rows below the input\n *\n * Host CSS variables (override on :host or any ancestor):\n * --ngaf-chat-welcome-max-width default 36rem\n * --ngaf-chat-welcome-gap default 1.25rem\n * --ngaf-chat-welcome-padding default 24px\n */\n@Component({\n selector: 'chat-welcome',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_WELCOME_STYLES],\n template: `\n <div class=\"chat-welcome__inner\">\n <span class=\"chat-welcome__beacon\" aria-hidden=\"true\"></span>\n <ng-content select=\"[chatWelcomeTitle]\">\n <h1 class=\"chat-welcome__title\">How can I help?</h1>\n </ng-content>\n <div class=\"chat-welcome__input\"><ng-content select=\"[chatWelcomeInput]\" /></div>\n <div class=\"chat-welcome__suggestions\">\n <ng-content select=\"[chatWelcomeSuggestions]\" />\n </div>\n </div>\n `,\n})\nexport class ChatWelcomeComponent {}\n","// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_WELCOME_SUGGESTION_STYLES } from '../../styles/chat-welcome.styles';\n\n@Component({\n selector: 'chat-welcome-suggestion',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_WELCOME_SUGGESTION_STYLES],\n template: `\n <button\n type=\"button\"\n class=\"chat-welcome-suggestion\"\n [attr.title]=\"description() || null\"\n [attr.aria-description]=\"description() || null\"\n (click)=\"selected.emit(value())\"\n >\n <ng-content select=\"[chatWelcomeSuggestionIcon]\" />\n <span class=\"chat-welcome-suggestion__label\">{{ label() }}</span>\n <span class=\"chat-welcome-suggestion__chevron\" aria-hidden=\"true\">›</span>\n </button>\n `,\n})\nexport class ChatWelcomeSuggestionComponent {\n readonly label = input.required<string>();\n readonly value = input.required<string>();\n /** Optional short description, surfaced as a hover/focus tooltip on the chip. */\n readonly description = input<string>();\n readonly selected = output<string>();\n}\n","// libs/chat/src/lib/styles/chat-select.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_SELECT_STYLES = `\n :host {\n display: inline-block;\n position: relative;\n }\n .chat-select__trigger {\n height: 32px;\n padding: 0 10px;\n border: 0;\n border-radius: 9999px;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease;\n }\n .chat-select__trigger:hover:not(:disabled) {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-select__trigger:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .chat-select__chevron {\n width: 12px;\n height: 12px;\n transition: transform 120ms ease;\n flex: none;\n }\n .chat-select__trigger.is-open .chat-select__chevron {\n transform: rotate(180deg);\n }\n .chat-select__menu {\n position: absolute;\n bottom: calc(100% + 8px);\n right: 0;\n min-width: 180px;\n max-height: 320px;\n overflow-y: auto;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 12px;\n box-shadow: var(--ngaf-chat-shadow-lg);\n padding: 4px;\n z-index: 10;\n }\n .chat-select__option {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n text-align: left;\n border: 0;\n background: transparent;\n padding: 8px 10px;\n border-radius: 8px;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n }\n .chat-select__option-desc {\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text-muted);\n line-height: 1.3;\n white-space: normal;\n }\n .chat-select__option:hover:not(:disabled),\n .chat-select__option:focus-visible {\n background: var(--ngaf-chat-surface-alt);\n outline: none;\n }\n .chat-select__option.is-active {\n background: var(--ngaf-chat-surface-alt);\n font-weight: 500;\n }\n .chat-select__option:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-select/chat-select.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SELECT_STYLES } from '../../styles/chat-select.styles';\n\nexport interface ChatSelectOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\n/**\n * Generic single-select dropdown. Designed to slot into the chat input pill\n * (via [chatInputModelSelect]) but usable anywhere.\n *\n * Inputs:\n * options — array of { value, label, disabled? }; required\n * value — currently selected value (two-way via model())\n * placeholder — trigger label when no option matches; default 'Select'\n * disabled — disables the trigger; default false\n * menuLabel — aria-label for the popover; defaults to placeholder\n */\n@Component({\n selector: 'chat-select',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_SELECT_STYLES],\n template: `\n <button\n type=\"button\"\n class=\"chat-select__trigger\"\n [class.is-open]=\"open()\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"chat-select__label\">{{ currentLabel() }}</span>\n <svg class=\"chat-select__chevron\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n @if (open()) {\n <div\n class=\"chat-select__menu\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.aria-label]=\"menuLabel() ?? placeholder()\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (opt of options(); track opt.value) {\n <button\n type=\"button\"\n class=\"chat-select__option\"\n [class.is-active]=\"opt.value === value()\"\n [disabled]=\"opt.disabled === true\"\n role=\"option\"\n [attr.aria-selected]=\"opt.value === value()\"\n (click)=\"selectOption(opt)\"\n >\n <span class=\"chat-select__option-label\">{{ opt.label }}</span>\n @if (opt.description) {\n <span class=\"chat-select__option-desc\">{{ opt.description }}</span>\n }\n </button>\n }\n </div>\n }\n `,\n})\nexport class ChatSelectComponent {\n readonly options = input.required<readonly ChatSelectOption[]>();\n readonly value = model<string>('');\n readonly placeholder = input<string>('Select');\n readonly disabled = input<boolean>(false);\n readonly menuLabel = input<string | undefined>(undefined);\n\n protected readonly open = signal(false);\n\n protected readonly currentLabel = computed(() => {\n const v = this.value();\n const match = this.options().find((o) => o.value === v);\n return match?.label ?? this.placeholder();\n });\n\n private readonly hostEl = inject(ElementRef).nativeElement as HTMLElement;\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n let onDocClick: ((e: Event) => void) | null = null;\n effect(() => {\n const isOpen = this.open();\n const win = this.document.defaultView;\n if (!win) return;\n if (isOpen && !onDocClick) {\n onDocClick = (e) => {\n const path = (e as Event & { composedPath?: () => EventTarget[] }).composedPath?.() ?? [];\n if (!path.includes(this.hostEl as EventTarget)) {\n this.open.set(false);\n }\n };\n win.addEventListener('mousedown', onDocClick, true);\n } else if (!isOpen && onDocClick) {\n win.removeEventListener('mousedown', onDocClick, true);\n onDocClick = null;\n }\n });\n this.destroyRef.onDestroy(() => {\n if (onDocClick) {\n const win = this.document.defaultView;\n win?.removeEventListener('mousedown', onDocClick, true);\n onDocClick = null;\n }\n });\n }\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.open.update((v) => !v);\n }\n\n protected selectOption(opt: ChatSelectOption): void {\n if (opt.disabled) return;\n this.value.set(opt.value);\n this.open.set(false);\n }\n\n protected onTriggerKeydown(e: KeyboardEvent): void {\n if (this.disabled()) return;\n // Escape closes an open menu when focus is still on the trigger\n // (e.g. user clicked to open, then pressed Escape without arrowing\n // into the menu). Caught by live browser smoke — without this, click\n // + Escape leaves the menu open until the user clicks outside.\n if (e.key === 'Escape' && this.open()) {\n e.preventDefault();\n this.open.set(false);\n return;\n }\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault();\n this.open.set(true);\n requestAnimationFrame(() => this.focusOption(0));\n }\n }\n\n protected onMenuKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.open.set(false);\n this.focusTrigger();\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n this.moveFocus(e.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n if (e.key === 'Enter' || e.key === ' ') {\n const t = e.target as HTMLElement;\n if (t.classList.contains('chat-select__option')) {\n e.preventDefault();\n (t as HTMLButtonElement).click();\n }\n }\n }\n\n private focusOption(index: number): void {\n const opts = this.queryOptions();\n opts[index]?.focus();\n }\n\n private focusTrigger(): void {\n this.queryTrigger()?.focus();\n }\n\n private moveFocus(dir: 1 | -1): void {\n const opts = this.queryOptions().filter((b) => !b.disabled);\n if (!opts.length) return;\n const active = this.document.activeElement as HTMLElement | null;\n const idx = active ? opts.indexOf(active as HTMLButtonElement) : -1;\n const next = (idx + dir + opts.length) % opts.length;\n opts[next]?.focus();\n }\n\n private queryOptions(): HTMLButtonElement[] {\n return Array.from(this.hostEl.querySelectorAll<HTMLButtonElement>('.chat-select__option'));\n }\n\n private queryTrigger(): HTMLButtonElement | null {\n return this.hostEl.querySelector<HTMLButtonElement>('.chat-select__trigger');\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport {\n runLicenseCheck,\n LICENSE_PUBLIC_KEY,\n inferNoncommercial,\n} from '@threadplane/licensing';\nimport type { AngularRegistry } from '@threadplane/render';\n\nconst PACKAGE_NAME = '@threadplane/chat';\n\nexport interface ChatConfig {\n /** Shared render registry for consumers that read CHAT_CONFIG. */\n renderRegistry?: AngularRegistry;\n /** Shared AI avatar label for consumers that read CHAT_CONFIG (default: \"A\"). */\n avatarLabel?: string;\n /** Shared assistant display name for consumers that read CHAT_CONFIG (default: \"Assistant\"). */\n assistantName?: string;\n /** Signed license token from threadplane.ai. Optional; omitted in dev. */\n license?: string;\n /**\n * @internal\n * Test-only env hint override. Not part of the stable API.\n */\n __licenseEnvHint?: { isNoncommercial: boolean };\n /**\n * @internal\n * Test-only public-key override. Defaults to the compile-time embedded\n * `LICENSE_PUBLIC_KEY`. Not part of the stable API.\n */\n __licensePublicKey?: Uint8Array;\n}\n\nexport const CHAT_CONFIG = new InjectionToken<ChatConfig>('CHAT_CONFIG');\n\n/**\n * Bootstrap `@threadplane/chat` in an Angular application or standalone\n * component tree.\n *\n * Call this once inside `bootstrapApplication` (or the `providers` array of a\n * root `ApplicationConfig`). It registers the shared {@link ChatConfig} token\n * so every chat component in the tree can read the render registry, avatar\n * label, and assistant display name without explicit prop threading.\n *\n * A license check is fired asynchronously on every call (it never throws; a\n * watermark is shown in non-commercial builds when no valid token is supplied).\n *\n * @param config Options bag that controls the chat feature set:\n * - `renderRegistry` — shared {@link AngularRegistry} wiring tool-view\n * components to their names; pass the value returned by\n * `defineAngularRegistry` from `\\@threadplane/render`.\n * - `avatarLabel` — short label shown in the AI avatar bubble (default `\"A\"`).\n * - `assistantName` — display name shown above assistant messages\n * (default `\"Assistant\"`).\n * - `license` — signed token from threadplane.ai; omit in development.\n * @returns An `EnvironmentProviders` value suitable for the `providers` array\n * of `bootstrapApplication` or `ApplicationConfig`.\n * @example\n * ```ts\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideChat } from '@threadplane/chat';\n * import { defineAngularRegistry, provideRender } from '@threadplane/render';\n * import { DayCardComponent } from './day-card.component';\n *\n * const registry = defineAngularRegistry({ day_card: DayCardComponent });\n *\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideChat({ renderRegistry: registry, avatarLabel: 'AI' }),\n * provideRender({ registry }),\n * ],\n * });\n * ```\n */\nexport function provideChat(config: ChatConfig) {\n void runLicenseCheck({\n package: PACKAGE_NAME,\n token: config.license,\n publicKey: config.__licensePublicKey ?? LICENSE_PUBLIC_KEY,\n isNoncommercial:\n config.__licenseEnvHint?.isNoncommercial ?? inferNoncommercial(),\n });\n\n return makeEnvironmentProviders([\n { provide: CHAT_CONFIG, useValue: config },\n ]);\n}\n","// SPDX-License-Identifier: MIT\nimport { effect, inject, untracked, type WritableSignal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router, NavigationEnd, type NavigationExtras } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\nexport interface ThreadRoutingConfig {\n /** The app-owned source-of-truth signal for the active thread id. */\n threadId: WritableSignal<string | null>;\n /** Router commands for a thread id (or the bare/welcome path when null).\n * Default: `(id) => (id ? ['/', id] : ['/'])`. */\n toCommands?: (id: string | null) => unknown[];\n /** Extract the thread id from a URL (null = bare). Default: last non-empty path segment. */\n threadIdFromUrl?: (url: string) => string | null;\n /** Optional async validity check; on `false` the helper redirects to the bare path\n * (`replaceUrl: true`). LangGraph apps pass `id => threads.getThread(id).then(Boolean)`. */\n validate?: (id: string) => Promise<boolean>;\n /** Extras merged into every navigate (default `{ queryParamsHandling: 'preserve' }`). */\n navigationExtras?: NavigationExtras;\n}\n\nconst defaultFromUrl = (url: string): string | null => {\n const seg = url.split('?')[0].split('#')[0].split('/').filter(Boolean);\n return seg.length ? seg[seg.length - 1] : null;\n};\nconst defaultToCommands = (id: string | null): unknown[] => (id ? ['/', id] : ['/']);\n\n/**\n * Bind an app-owned `activeThreadId` signal to the URL — restore on load, stamp on change,\n * validate-or-redirect, with a bare URL meaning \"no thread\" (welcome). URL is the source of\n * truth; nothing is written to localStorage. Must be called in an injection context.\n *\n * @example\n * ```ts\n * export const ACTIVE_THREAD = signal<string | null>(null);\n * // providers: provideAgent({ threadId: ACTIVE_THREAD, onThreadId: id => ACTIVE_THREAD.set(id) })\n * const threads = inject(LangGraphThreadsAdapter);\n * injectThreadRouting({ threadId: ACTIVE_THREAD, validate: id => threads.getThread(id).then(Boolean) });\n * ```\n */\nexport function injectThreadRouting(config: ThreadRoutingConfig): void {\n const router = inject(Router);\n const fromUrl = config.threadIdFromUrl ?? defaultFromUrl;\n const toCommands = config.toCommands ?? defaultToCommands;\n const extras: NavigationExtras = config.navigationExtras ?? { queryParamsHandling: 'preserve' };\n\n const urlThreadId = toSignal(\n router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map((e) => fromUrl(e.urlAfterRedirects)),\n startWith(fromUrl(router.url)),\n ),\n { initialValue: fromUrl(router.url) },\n );\n\n // Seed the signal from the URL once.\n config.threadId.set(urlThreadId());\n\n // URL → signal.\n effect(() => {\n const urlId = urlThreadId();\n if (urlId !== untracked(() => config.threadId())) config.threadId.set(urlId);\n });\n\n // signal → URL.\n effect(() => {\n const id = config.threadId();\n const urlId = untracked(() => urlThreadId());\n if (id !== urlId) void router.navigate(toCommands(id), extras);\n });\n\n // validate stale ids → redirect to bare. Memoize the last id checked so\n // re-visiting the same thread (A → B → A) doesn't re-hit the backend.\n if (config.validate) {\n const validate = config.validate;\n let lastValidated: string | null = null;\n effect(() => {\n const id = urlThreadId();\n if (!id || id === lastValidated) return;\n lastValidated = id;\n void validate(id).then((ok) => {\n if (!ok && untracked(() => urlThreadId()) === id) {\n void router.navigate(toCommands(null), { ...extras, replaceUrl: true });\n }\n });\n });\n }\n}\n","// SPDX-License-Identifier: MIT\n\nimport { InjectionToken, Signal } from '@angular/core';\n\nexport interface ChatLifecycle {\n /** True after `<chat>` initializes with a non-null agent binding. */\n readonly componentReady: Signal<boolean>;\n /** True after the first user submit. Sticky for the life of the chat instance — does NOT reset on clearThread. */\n readonly firstMessageSent: Signal<boolean>;\n /** Count of user submits. Resets on clearThread. */\n readonly messageCount: Signal<number>;\n /** Epoch ms of the most recent user submit. Resets on clearThread. */\n readonly inputSubmittedAt: Signal<number | null>;\n}\n\nexport const CHAT_LIFECYCLE = new InjectionToken<ChatLifecycle>('CHAT_LIFECYCLE');\n","// SPDX-License-Identifier: MIT\nimport { toJSONSchema } from 'zod/v4';\nimport type { StandardSchemaV1 } from '@threadplane/render';\n\n/** A client tool spec as shipped to the model / AG-UI RunAgentInput.tools. */\nexport interface ClientToolSpec {\n readonly name: string;\n readonly description: string;\n readonly parameters: Record<string, unknown>;\n}\n\n/**\n * Convert a Standard Schema to a JSON Schema for the model's `parameters`.\n * Uses Zod's converter; throws a clear error for non-Zod validators (callers\n * should supply a Zod schema — see the client-tools docs).\n */\nexport function deriveJsonSchema(toolName: string, schema: StandardSchemaV1): Record<string, unknown> {\n try {\n return toJSONSchema(schema as never) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `client tool \"${toolName}\": could not derive a JSON Schema from its schema. ` +\n `Use a Zod schema (recommended) or an already-JSON-Schema-compatible validator. ` +\n `Underlying error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n","// SPDX-License-Identifier: MIT\nimport type { StandardSchemaV1 } from '@threadplane/render';\nimport type { AnyFunctionToolDef } from './tool-def';\nimport type { ClientToolResult } from './client-tools-capability';\n\n/** Validate raw model args against a Standard Schema. */\nexport async function validateArgs(\n schema: StandardSchemaV1,\n args: unknown,\n): Promise<{ ok: true; value: unknown } | { ok: false; error: string }> {\n const res = await schema['~standard'].validate(args);\n if (res.issues) {\n return { ok: false, error: res.issues.map((i) => i.message).join('; ') };\n }\n // Cast rather than rely on discriminant narrowing: the cockpit example apps\n // compile this source with `strictNullChecks: false`, where the\n // `issues?: undefined` discriminant doesn't narrow `res` to the success type.\n return { ok: true, value: (res as { value: unknown }).value };\n}\n\n/** Validate args, run the handler, and normalize the outcome to a ClientToolResult. */\nexport async function executeFunctionTool(\n def: AnyFunctionToolDef,\n rawArgs: unknown,\n): Promise<ClientToolResult> {\n const v = await validateArgs(def.schema, rawArgs);\n if (!v.ok) return { ok: false, error: `invalid arguments: ${(v as { error: string }).error}` };\n try {\n const value = await def.handler((v as { value: unknown }).value as never);\n return { ok: true, value };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { effect } from '@angular/core';\nimport type { Agent } from '../agent';\nimport type { ClientToolRegistry } from './tool-def';\nimport { executeFunctionTool } from './execute';\n\n/**\n * Watches the agent's pending client tool calls and auto-runs FUNCTION tools,\n * resolving each with its result. View/ask (component) tools are handled by the\n * rendering layer, not here. No-op if the agent lacks the clientTools\n * capability. MUST be called in an injection context (sets up an effect).\n */\nexport function startClientToolExecutor(agent: Agent, registry: ClientToolRegistry): void {\n const cap = agent.clientTools;\n if (!cap) return;\n const inFlight = new Set<string>();\n effect(() => {\n for (const tc of cap.pending()) {\n const def = registry[tc.name];\n if (!def || def.kind !== 'function') continue; // non-function handled elsewhere\n // NB: do NOT skip on `tc.status === 'complete'`. A client tool call is\n // marked 'complete' once its args finish streaming, yet it still has no\n // result and needs the browser to execute it. `pending` already excludes\n // calls that have a result or were resolved; `inFlight` prevents a\n // double-dispatch within a render cycle.\n if (inFlight.has(tc.id)) continue;\n inFlight.add(tc.id);\n void executeFunctionTool(def, tc.args).then((result) => {\n cap.resolve(tc.id, result);\n inFlight.delete(tc.id);\n });\n }\n });\n}\n","// SPDX-License-Identifier: MIT\nimport { effect } from '@angular/core';\nimport { views, type ViewRegistry } from '@threadplane/render';\nimport type { RenderEvent, RenderViewEntry } from '@threadplane/render';\nimport type { Agent, ToolCall } from '../agent';\nimport type { ClientToolRegistry, ClientToolDef } from './tool-def';\nimport type { ClientToolSpec } from './to-json-schema';\nimport { deriveJsonSchema } from './to-json-schema';\nimport { startClientToolExecutor } from './client-tool-executor';\n\nexport interface ClientToolsCoordinator {\n /** Components for `view`/`ask` tools, keyed by tool name — merge into the chat `views`. */\n readonly viewRegistry: ViewRegistry;\n /** Wire the coordinator to an agent: ship the catalog, run function tools, auto-ack view tools.\n * MUST be called inside an injection context (sets up effects). Safe no-op if the agent lacks\n * the clientTools capability. */\n connect(agent: Agent): void;\n /** Handle a render event bubbled up from a mounted view/ask component (resolves `ask` results). */\n handleRenderEvent(agent: Agent, event: RenderEvent): void;\n}\n\n/** Build the catalog spec list shipped to the model. */\nexport function toClientToolSpecs(registry: ClientToolRegistry): ClientToolSpec[] {\n return Object.entries(registry).map(([name, def]) => ({\n name,\n description: def.description,\n parameters: deriveJsonSchema(name, def.schema),\n }));\n}\n\n/** Map each view/ask tool to a RenderViewEntry that carries its schema, so the\n * render lib can gate the real component's mount on schema-readiness (showing\n * the fallback skeleton while a streaming tool call's args are still\n * incomplete) instead of mounting a required-input component too early. */\nfunction viewComponents(registry: ClientToolRegistry): Record<string, RenderViewEntry> {\n const out: Record<string, RenderViewEntry> = {};\n for (const [name, def] of Object.entries(registry)) {\n if (def.kind === 'view' || def.kind === 'ask') {\n out[name] = { component: def.component, schema: def.schema };\n }\n }\n return out;\n}\n\nexport function createClientToolsCoordinator(registry: ClientToolRegistry): ClientToolsCoordinator {\n const viewRegistry = views(viewComponents(registry));\n const ackedViews = new Set<string>();\n\n return {\n viewRegistry,\n connect(agent: Agent): void {\n const cap = agent.clientTools;\n if (!cap) return;\n cap.setCatalog(toClientToolSpecs(registry));\n startClientToolExecutor(agent, registry); // function tools\n // Auto-ack `view` tools: they render but produce no user value.\n effect(() => {\n for (const tc of cap.pending()) {\n const def: ClientToolDef | undefined = registry[tc.name];\n if (!def || def.kind !== 'view') continue;\n if (ackedViews.has(tc.id)) continue;\n ackedViews.add(tc.id);\n cap.resolve(tc.id, { ok: true, value: { shown: true } });\n }\n });\n },\n handleRenderEvent(agent: Agent, event: RenderEvent): void {\n if (event.type !== 'result') return;\n const cap = agent.clientTools;\n if (!cap) return;\n // elementKey is the tool NAME in the tool-view spec; resolve the pending `ask`\n // call for that name with the component's emitted value.\n const name = event.elementKey;\n const pending = cap.pending().find(\n (tc: ToolCall) => tc.name === name && registry[tc.name]?.kind === 'ask',\n );\n if (pending) cap.resolve(pending.id, { ok: true, value: event.value });\n },\n };\n}\n","// SPDX-License-Identifier: MIT\nimport type { Spec, UIElement } from '@json-render/core';\nimport type {\n A2uiSurface, A2uiComponent, A2uiAction, A2uiChildren,\n A2uiActionContextEntry,\n} from '@threadplane/a2ui';\nimport { resolveDynamic, getByPointer, isPathRef } from '@threadplane/a2ui';\n\nconst RESERVED_PROP_KEYS = new Set(['child', 'children', 'action', 'tabItems', 'entryPointChild', 'contentChild']);\n\ntype RenderedAction = Record<string, { action: string; params: Record<string, unknown> }>;\n\n/** Pull the (single) component-type key + its props from a v1 ComponentDef wrapper. */\nfunction unwrapComponentDef(def: A2uiComponent['component']): { type: string; props: Record<string, unknown> } {\n const entries = Object.entries(def as Record<string, unknown>);\n if (entries.length !== 1) {\n return { type: 'Text', props: {} };\n }\n const [type, props] = entries[0];\n return { type, props: (props ?? {}) as Record<string, unknown> };\n}\n\nfunction resolveAction(\n action: A2uiAction | undefined,\n surface: A2uiSurface,\n sourceComponentId: string,\n): RenderedAction | undefined {\n if (!action) return undefined;\n const resolvedContext: Record<string, unknown> = {};\n if (Array.isArray(action.context)) {\n for (const entry of action.context as A2uiActionContextEntry[]) {\n resolvedContext[entry.key] = resolveDynamic(entry.value, surface.dataModel);\n }\n }\n return {\n click: {\n action: 'a2ui:event',\n params: {\n surfaceId: surface.surfaceId,\n sourceComponentId,\n name: action.name,\n context: resolvedContext,\n },\n },\n } as RenderedAction;\n}\n\nfunction childrenToList(\n children: A2uiChildren | undefined,\n surface: A2uiSurface,\n): { ids: string[]; templateExpand?: { componentId: string; arrPath: string; arr: unknown[] } } | undefined {\n if (!children) return undefined;\n if ('explicitList' in children) {\n return { ids: children.explicitList };\n }\n if ('template' in children) {\n const t = children.template;\n const arr = getByPointer(surface.dataModel, t.dataBinding);\n if (!Array.isArray(arr)) return { ids: [] };\n const ids = arr.map((_, i) => `${t.componentId}__${i}`);\n return { ids, templateExpand: { componentId: t.componentId, arrPath: t.dataBinding, arr } };\n }\n return undefined;\n}\n\nexport function surfaceToSpec(surface: A2uiSurface): Spec | null {\n if (surface.components.size === 0) return null;\n\n const elements: Record<string, UIElement> = {};\n\n for (const [id, comp] of surface.components) {\n const { type, props: rawProps } = unwrapComponentDef(comp.component);\n\n const resolvedProps: Record<string, unknown> = {};\n const bindings: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(rawProps)) {\n if (RESERVED_PROP_KEYS.has(key)) continue;\n if (isPathRef(value)) {\n // Leave path refs as json-render two-way binding markers so the\n // render lib resolves them against its state store on every\n // render. Without this, the catalog component receives a static\n // snapshot taken at conversion time and never reflects user\n // input writes back into the store. The `_bindings` map below\n // tells the catalog component which prop names map to which\n // paths so its injectRenderHost().set(path, value) call can\n // write the typed value back to the render state store.\n const path = (value as { path: string }).path;\n bindings[key] = path;\n resolvedProps[key] = { $bindState: path };\n } else {\n resolvedProps[key] = resolveDynamic(value, surface.dataModel);\n }\n }\n if (Object.keys(bindings).length > 0) {\n resolvedProps['_bindings'] = bindings;\n }\n\n const action = (rawProps as { action?: A2uiAction }).action;\n const on = resolveAction(action, surface, id);\n\n // Map children — handle Card single child / Button single child / Modal entryPointChild+contentChild / Tabs tabItems\n let children: string[] | undefined;\n if (type === 'Card' && typeof (rawProps as { child?: unknown }).child === 'string') {\n children = [(rawProps as { child: string }).child];\n } else if (type === 'Button' && typeof (rawProps as { child?: unknown }).child === 'string') {\n children = [(rawProps as { child: string }).child];\n } else if (type === 'Modal') {\n const m = rawProps as { entryPointChild?: string; contentChild?: string };\n const ids: string[] = [];\n if (m.entryPointChild) ids.push(m.entryPointChild);\n if (m.contentChild) ids.push(m.contentChild);\n children = ids;\n } else if (type === 'Tabs') {\n const items = (rawProps as { tabItems?: { title?: unknown; child: string }[] }).tabItems ?? [];\n children = items.map(t => t.child);\n // Resolve tab titles and pass them as a plain string array for the Tabs component's tab bar.\n resolvedProps['tabTitles'] = items.map(t =>\n t.title !== undefined ? String(resolveDynamic(t.title, surface.dataModel)) : '',\n );\n } else if (type === 'MultipleChoice') {\n // Resolve options[*].label (DynamicString) so the component receives plain strings.\n const opts = (rawProps as { options?: { label?: unknown; value: string }[] }).options ?? [];\n resolvedProps['options'] = opts.map(o => ({\n label: o.label !== undefined ? String(resolveDynamic(o.label, surface.dataModel)) : '',\n value: o.value,\n }));\n } else {\n const childInfo = childrenToList((rawProps as { children?: A2uiChildren }).children, surface);\n if (childInfo) {\n children = childInfo.ids;\n if (childInfo.templateExpand) {\n const t = childInfo.templateExpand;\n const templateComp = surface.components.get(t.componentId);\n if (templateComp) {\n const { type: tType, props: tRaw } = unwrapComponentDef(templateComp.component);\n for (let i = 0; i < t.arr.length; i++) {\n const scope = { basePath: `${t.arrPath}/${i}`, item: t.arr[i] };\n const itemProps: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tRaw)) {\n if (RESERVED_PROP_KEYS.has(k)) continue;\n itemProps[k] = resolveDynamic(v, surface.dataModel, scope);\n }\n elements[`${t.componentId}__${i}`] = { type: tType, props: itemProps };\n }\n }\n }\n }\n }\n\n elements[id] = {\n type,\n props: resolvedProps,\n ...(children ? { children } : {}),\n ...(on ? { on } : {}),\n };\n }\n\n // Use `root` if present in the components map; otherwise prefer first id.\n const root = surface.components.has('root')\n ? 'root'\n : (surface.components.keys().next().value as string);\n\n return { root, elements, state: surface.dataModel } as Spec;\n}\n","// SPDX-License-Identifier: MIT\nimport type { A2uiSurface, A2uiActionMessage } from '@threadplane/a2ui';\n\nfunction toDynamicValue(v: unknown): unknown {\n if (typeof v === 'string') return { literalString: v };\n if (typeof v === 'number') return { literalNumber: v };\n if (typeof v === 'boolean') return { literalBoolean: v };\n return { literalString: String(v) };\n}\n\n/**\n * Derive a human-readable label for an outgoing action by walking from\n * the source component to its authored visible text. Today supported:\n * Button → child Text → literalString. Returns null for other component\n * types or when the linkage isn't well-formed; callers fall back to a\n * camelCase humanization of `action.name`.\n *\n * Why: the chat-lib used to ship a hardcoded `KNOWN_LABELS` map\n * (bookingSubmit → 'Search flights') that embedded app-specific\n * knowledge in the primitive. The LLM that authors a surface already\n * writes the Button's visible text — reuse it as the action label.\n * See spec 2026-05-19-llm-generated-labels-design.md.\n */\nfunction deriveActionLabel(surface: A2uiSurface, sourceId: string): string | null {\n const source = surface.components.get(sourceId);\n if (!source) return null;\n const buttonProps = (source.component as { Button?: { child?: string } }).Button;\n if (!buttonProps?.child) return null;\n const labelText = surface.components.get(buttonProps.child);\n if (!labelText) return null;\n const textProps = (labelText.component as { Text?: { text?: unknown } }).Text;\n if (!textProps) return null;\n // `text` may be either a raw string (LLM-author ergonomic shorthand) or\n // a wrapped DynamicString `{ literalString: \"...\" }` (canonical v1 shape).\n // Accept both so the label survives whichever form the LLM happens to emit.\n const text = textProps.text;\n if (typeof text === 'string') {\n return text.length > 0 ? text : null;\n }\n if (text && typeof text === 'object' && typeof (text as { literalString?: unknown }).literalString === 'string') {\n const literal = (text as { literalString: string }).literalString;\n return literal.length > 0 ? literal : null;\n }\n return null;\n}\n\n/** Builds an A2uiActionMessage from handler params and the current surface.\n * The action.context is serialized as v1 DynamicValue-wrapped entries.\n * Sets action.label when the source component is a Button with a Text\n * child whose literalString is non-empty. */\nexport function buildA2uiActionMessage(\n params: Record<string, unknown>,\n surface: A2uiSurface,\n): A2uiActionMessage {\n const rawContext = (params['context'] as Record<string, unknown>) ?? {};\n const wrappedContext: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rawContext)) {\n wrappedContext[k] = toDynamicValue(v);\n }\n\n const sourceComponentId = params['sourceComponentId'] as string;\n\n const message: A2uiActionMessage = {\n version: 'v1',\n action: {\n name: params['name'] as string,\n surfaceId: surface.surfaceId,\n sourceComponentId,\n timestamp: new Date().toISOString(),\n context: wrappedContext,\n },\n };\n\n const label = deriveActionLabel(surface, sourceComponentId);\n if (label) message.action.label = label;\n\n if (surface.sendDataModel) {\n message.metadata = {\n a2uiClientDataModel: {\n version: 'v1',\n surfaces: { [surface.surfaceId]: surface.dataModel },\n },\n };\n }\n return message;\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../styles/chat-tokens';\n\n@Component({\n selector: 'a2ui-default-fallback',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; width: 100%; }\n .a2ui-default-fallback {\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 10px;\n padding: 14px;\n background: var(--ngaf-chat-surface-alt);\n }\n .a2ui-default-fallback__label {\n font-size: 12px;\n color: var(--ngaf-chat-text-muted);\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .a2ui-default-fallback__rows {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .a2ui-default-fallback__row {\n height: 10px;\n border-radius: 5px;\n background: linear-gradient(\n 90deg,\n var(--ngaf-chat-separator) 0%,\n color-mix(in srgb, var(--ngaf-chat-separator) 70%, transparent) 50%,\n var(--ngaf-chat-separator) 100%\n );\n background-size: 200% 100%;\n animation: a2ui-default-fallback-shimmer 1.4s ease-in-out infinite;\n }\n .a2ui-default-fallback__row:nth-child(1) { width: 70%; }\n .a2ui-default-fallback__row:nth-child(2) { width: 90%; }\n .a2ui-default-fallback__row:nth-child(3) { width: 50%; }\n @keyframes a2ui-default-fallback-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `],\n template: `\n <div class=\"a2ui-default-fallback\" role=\"status\" aria-live=\"polite\">\n <div class=\"a2ui-default-fallback__label\">\n <span aria-hidden=\"true\">&#10024;</span>\n <span>Building UI&hellip;</span>\n </div>\n <div class=\"a2ui-default-fallback__rows\">\n <div class=\"a2ui-default-fallback__row\"></div>\n <div class=\"a2ui-default-fallback__row\"></div>\n <div class=\"a2ui-default-fallback__row\"></div>\n </div>\n </div>\n `,\n})\nexport class A2uiDefaultFallbackComponent {}\n","// SPDX-License-Identifier: MIT\nimport {\n Component, computed, input, output, ChangeDetectionStrategy, Type,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport type { A2uiSurface, A2uiActionMessage } from '@threadplane/a2ui';\nimport { RenderSpecComponent, toRenderRegistry } from '@threadplane/render';\nimport type { ViewRegistry, RenderEvent } from '@threadplane/render';\nimport { surfaceToSpec } from './surface-to-spec';\nimport { buildA2uiActionMessage } from './build-action-message';\nimport { A2uiDefaultFallbackComponent } from './a2ui-default-fallback.component';\nimport type { A2uiSurfaceState } from './surface-store';\nimport type { A2uiViews } from './views';\n\n@Component({\n selector: 'a2ui-surface',\n standalone: true,\n imports: [\n RenderSpecComponent,\n A2uiDefaultFallbackComponent,\n NgComponentOutlet,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n // The host applies the agent-set v1 styles (`beginRendering.styles`)\n // as inline CSS custom properties + font-family. Catalog components\n // consume `--a2ui-primary` for accents (buttons, sliders, focus,\n // etc.); `font-family` cascades naturally from the host.\n host: {\n '[style.--a2ui-primary]': 'primaryColor()',\n '[style.font-family]': 'fontFamily()',\n },\n template: `\n @if (spec(); as s) {\n <render-spec\n [spec]=\"s\"\n [registry]=\"registry()\"\n [handlers]=\"internalHandlers()\"\n (events)=\"onRenderEvent($event)\"\n />\n } @else if (state(); as st) {\n @if (surfaceFallback(); as fb) {\n <ng-container *ngComponentOutlet=\"fb\" />\n } @else {\n <a2ui-default-fallback />\n }\n }\n `,\n})\n/**\n * Renders an A2UI surface. Supports two input shapes:\n * - `state` (preferred): chat-side `A2uiSurfaceState` driving progressive\n * per-component rendering via `a2uiSlot` + readiness gates.\n * - `surface` (legacy): wire-format `A2uiSurface` fed into `<render-spec>`;\n * kept for backwards compatibility.\n *\n * When both inputs are set, `state` takes priority for rendering AND for\n * action-message construction; `surface` is only consulted when `state`\n * is unset.\n */\nexport class A2uiSurfaceComponent {\n /** Wire-format surface (legacy path — kept for backwards compat). */\n readonly surface = input<A2uiSurface>();\n /** Chat-side surface state with per-component readiness. When set,\n * this takes priority and the progressive renderer is used. */\n readonly state = input<A2uiSurfaceState>();\n readonly catalog = input.required<A2uiViews | ViewRegistry>();\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>({});\n /** Optional top-level placeholder when the surface has no components\n * yet. Defaults to A2uiDefaultFallbackComponent. */\n readonly surfaceFallback = input<Type<unknown> | undefined>(undefined);\n readonly events = output<RenderEvent>();\n readonly action = output<A2uiActionMessage>();\n\n /** Agent-set primary color from `beginRendering.styles.primaryColor`.\n * Returns null when unset so the host binding doesn't override the\n * consumer's `:root`-level `--a2ui-primary` default. */\n readonly primaryColor = computed<string | null>(() =>\n (this.state()?.surface ?? this.surface())?.styles?.primaryColor ?? null\n );\n\n /** Agent-set font family from `beginRendering.styles.font`. Returns\n * null when unset so the host doesn't override consumer fonts. */\n readonly fontFamily = computed<string | null>(() =>\n (this.state()?.surface ?? this.surface())?.styles?.font ?? null\n );\n\n /** Roots from the surface state — components whose ids appear as\n * children of no other component. The wire spec includes\n * `beginRendering.root` as the single root; that path stays usable\n * but we keep the renderer permissive in case future surfaces emit\n * multiple top-level components.\n *\n * Conservative: returns only the first key from componentViews\n * insertion order. The wire format's beginRendering.root carries the\n * true root id; plumbing it through A2uiSurfaceState is a follow-up. */\n readonly rootIds = computed<string[]>(() => {\n const st = this.state();\n if (!st) return [];\n return [...st.componentViews.keys()].slice(0, 1);\n });\n\n /** Convert the A2UI surface to a json-render Spec for rendering.\n * Prefers `state().surface` (the progressively-built wire surface)\n * over the legacy `surface` input. surfaceToSpec handles\n * children.explicitList → spec.children translation + reserved-key\n * filtering + path-ref → $bindState rewriting; the rendered tree\n * then uses render-element's standard input-mapping\n * (`childKeys: el.children`) so catalog components receive the\n * inputs they actually declare.\n *\n * This supersedes the earlier slot-based progressive renderer,\n * which mounted root components but never populated their\n * childKeys input — leaving Columns/Rows/etc. with no children. */\n readonly spec = computed(() => {\n const surf = this.state()?.surface ?? this.surface();\n return surf && surf.components.size > 0 ? surfaceToSpec(surf) : null;\n });\n\n /** Convert ViewRegistry to AngularRegistry for RenderSpecComponent. */\n readonly registry = computed(() => toRenderRegistry(this.catalog() as ViewRegistry));\n\n /** Merge built-in A2UI handlers with consumer-provided handlers. */\n readonly internalHandlers = computed(() => {\n const consumerHandlers = this.handlers();\n return {\n 'a2ui:event': (params: Record<string, unknown>) => {\n // Prefer state.surface so action messages reference the surface\n // we actually rendered, even if a legacy `[surface]` input with\n // a mismatched id is also bound.\n const surf = this.state()?.surface ?? this.surface();\n if (!surf) return undefined;\n const message = buildA2uiActionMessage(params, surf);\n this.action.emit(message);\n return message;\n },\n 'a2ui:localAction': (params: Record<string, unknown>) => {\n const call = params['call'] as string;\n const args = (params['args'] as Record<string, unknown>) ?? {};\n\n // Consumer handler takes priority\n if (consumerHandlers[call]) {\n return consumerHandlers[call](args);\n }\n\n // Built-in fallback\n if (call === 'openUrl' && typeof globalThis.window !== 'undefined') {\n globalThis.window.open(String(args['url'] ?? ''), '_blank');\n }\n return undefined;\n },\n };\n });\n\n onRenderEvent(event: RenderEvent): void {\n this.events.emit(event);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, type Signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport type { PartialJsonParser, JsonObjectNode } from '@cacheplane/partial-json';\nimport { materialize } from '@cacheplane/partial-json';\n\nexport interface ElementAccumulationState {\n hasType: boolean;\n hasProps: boolean;\n hasChildren: boolean;\n streaming: boolean;\n}\n\nexport interface ParseTreeStore {\n push(chunk: string): void;\n readonly spec: Signal<Spec | null>;\n readonly elementStates: Signal<Map<string, ElementAccumulationState>>;\n}\n\nexport function createParseTreeStore(parser: PartialJsonParser): ParseTreeStore {\n const specSignal = signal<Spec | null>(null);\n const elementStatesSignal = signal<Map<string, ElementAccumulationState>>(new Map());\n\n function computeElementStates(materialized: any): Map<string, ElementAccumulationState> {\n const states = new Map<string, ElementAccumulationState>();\n if (!materialized || typeof materialized !== 'object' || !materialized.elements) {\n return states;\n }\n\n const elements = materialized.elements as Record<string, any>;\n // We also need the parse tree to know if the element object node is still streaming\n const elementsNode = parser.getByPath('/elements') as JsonObjectNode | null;\n\n for (const [key, el] of Object.entries(elements)) {\n if (!el || typeof el !== 'object') continue;\n\n let streaming = true;\n if (elementsNode) {\n const elNode = elementsNode.children.get(key);\n if (elNode && elNode.status === 'complete') {\n streaming = false;\n }\n }\n\n states.set(key, {\n hasType: 'type' in el && el.type !== undefined,\n hasProps: 'props' in el && el.props !== undefined,\n hasChildren: 'children' in el && el.children !== undefined,\n streaming,\n });\n }\n\n return states;\n }\n\n function push(chunk: string): void {\n parser.push(chunk);\n if (parser.root) {\n const materialized = materialize(parser.root);\n specSignal.set(materialized as Spec);\n elementStatesSignal.set(computeElementStates(materialized));\n }\n }\n\n return {\n push,\n spec: specSignal.asReadonly(),\n elementStates: elementStatesSignal.asReadonly(),\n };\n}\n","// SPDX-License-Identifier: MIT\nimport type { A2uiComponentDef } from '@threadplane/a2ui';\n\nconst REF_PATTERN = /\\{(\\$\\.[^}]+)\\}/g;\n\nfunction walk(value: unknown, into: Set<string>): void {\n if (typeof value === 'string') {\n let m: RegExpExecArray | null;\n REF_PATTERN.lastIndex = 0;\n while ((m = REF_PATTERN.exec(value)) !== null) into.add(m[1]);\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) walk(v, into);\n return;\n }\n if (value && typeof value === 'object') {\n for (const v of Object.values(value as Record<string, unknown>)) walk(v, into);\n }\n}\n\n/** Extracts the set of data-model paths (e.g. `$.form.name`) referenced\n * by `{$.path}` expressions inside a component's prop bag. Result is\n * deduplicated and sorted for stable signal identity. */\nexport function extractBindings(def: A2uiComponentDef): readonly string[] {\n const out = new Set<string>();\n walk(def, out);\n return [...out].sort();\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal, type Signal } from '@angular/core';\nimport type {\n A2uiMessage, A2uiSurface, A2uiComponent,\n A2uiSurfaceUpdate, A2uiDataModelUpdate, A2uiBeginRendering, A2uiDeleteSurface,\n A2uiDataModelEntry,\n} from '@threadplane/a2ui';\nimport { setByPointer } from '@threadplane/a2ui';\nimport type { A2uiComponentView } from './component-view';\nimport { extractBindings } from './extract-bindings';\n\ninterface SurfaceBuffer {\n /** Pending component map (replaces on next beginRendering). */\n components?: Map<string, A2uiComponent>;\n /** Pending per-component views (replaces on next beginRendering). */\n componentViews?: Map<string, A2uiComponentView>;\n /** Pending data model deltas accumulated since last beginRendering. */\n dataModelDeltas: { path?: string; contents: A2uiDataModelEntry[] }[];\n}\n\n/** Chat-side state for a surface — wraps the wire-format `A2uiSurface`\n * with the per-component projection the progressive renderer consumes.\n * Both maps are kept in sync; the wire shape preserves existing\n * `surfaceToSpec` semantics, the view shape carries readiness. */\nexport interface A2uiSurfaceState {\n readonly surface: A2uiSurface;\n readonly componentViews: ReadonlyMap<string, A2uiComponentView>;\n}\n\nexport interface A2uiSurfaceStore {\n apply(message: A2uiMessage): void;\n /**\n * Live-stream entry point. Iterates envelopes and feeds each through\n * `apply()`. Records the tool_call_id so the wrapped-content classifier\n * can short-circuit duplicate dispatch when the final AIMessage arrives.\n */\n applyPartialArgs(toolCallId: string, envelopes: readonly A2uiMessage[]): void;\n /** True if a tool_call_id has produced live envelopes via applyPartialArgs. */\n isPartialLive(toolCallId: string): boolean;\n /** Wire-format surfaces, for downstream consumers (e.g. surfaceToSpec). */\n readonly surfaces: Signal<Map<string, A2uiSurface>>;\n surface(surfaceId: string): Signal<A2uiSurface | undefined>;\n /** Chat-side projections with per-component readiness. */\n readonly surfaceStates: Signal<Map<string, A2uiSurfaceState>>;\n surfaceState(surfaceId: string): Signal<A2uiSurfaceState | undefined>;\n}\n\nfunction entriesToObject(entries: A2uiDataModelEntry[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const e of entries) {\n if ('valueString' in e && e.valueString !== undefined) out[e.key] = e.valueString;\n else if ('valueNumber' in e && e.valueNumber !== undefined) out[e.key] = e.valueNumber;\n else if ('valueBoolean' in e && e.valueBoolean !== undefined) out[e.key] = e.valueBoolean;\n else if ('valueMap' in e && Array.isArray(e.valueMap)) out[e.key] = entriesToObject(e.valueMap);\n }\n return out;\n}\n\n/** Returns true if `path` (in `$.a.b.c` form) resolves to a defined,\n * non-null value inside `dataModel`. Used to decide per-component\n * readiness. */\nfunction isResolved(dataModel: Record<string, unknown>, path: string): boolean {\n const segments = path.startsWith('$.') ? path.slice(2).split('.') : path.split('.');\n let cur: unknown = dataModel;\n for (const seg of segments) {\n if (cur == null || typeof cur !== 'object') return false;\n cur = (cur as Record<string, unknown>)[seg];\n }\n return cur !== undefined && cur !== null;\n}\n\n/** Resolve `{$.path}` references in a value against the data model.\n * Strings that look like a single full reference are replaced with\n * the resolved value; partial-reference strings get string-substituted;\n * nested objects/arrays are recursed. */\nfunction resolveProps(value: unknown, dataModel: Record<string, unknown>): unknown {\n if (typeof value === 'string') {\n const full = value.match(/^\\{(\\$\\.[^}]+)\\}$/);\n if (full) {\n const segs = full[1].slice(2).split('.');\n let cur: unknown = dataModel;\n for (const s of segs) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[s];\n }\n return cur;\n }\n return value.replace(/\\{(\\$\\.[^}]+)\\}/g, (_, path: string) => {\n const segs = path.slice(2).split('.');\n let cur: unknown = dataModel;\n for (const s of segs) {\n if (cur == null || typeof cur !== 'object') return '';\n cur = (cur as Record<string, unknown>)[s];\n }\n return cur == null ? '' : String(cur);\n });\n }\n if (Array.isArray(value)) return value.map((v) => resolveProps(v, dataModel));\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = resolveProps(v, dataModel);\n }\n return out;\n }\n return value;\n}\n\nexport function createA2uiSurfaceStore(): A2uiSurfaceStore {\n const surfacesSignal = signal<Map<string, A2uiSurface>>(new Map());\n const surfaceStatesSignal = signal<Map<string, A2uiSurfaceState>>(new Map());\n const buffers = new Map<string, SurfaceBuffer>();\n\n function bufferOf(surfaceId: string): SurfaceBuffer {\n let b = buffers.get(surfaceId);\n if (!b) { b = { dataModelDeltas: [] }; buffers.set(surfaceId, b); }\n return b;\n }\n\n function apply(message: A2uiMessage): void {\n if ('surfaceUpdate' in message) {\n const upd = message.surfaceUpdate as A2uiSurfaceUpdate;\n const b = bufferOf(upd.surfaceId);\n const map = new Map<string, A2uiComponent>();\n for (const c of upd.components) map.set(c.id, c);\n b.components = map;\n // Project per-component views with bindings extracted from prop\n // expressions. ready starts false; props starts empty.\n const views = new Map<string, A2uiComponentView>();\n for (const c of upd.components) {\n const def = c.component;\n const typeKey = (def && typeof def === 'object')\n ? (Object.keys(def)[0] ?? 'Unknown')\n : 'Unknown';\n views.set(c.id, {\n id: c.id,\n type: typeKey,\n bindings: extractBindings(def),\n ready: false,\n props: {},\n def,\n });\n }\n b.componentViews = views;\n return;\n }\n if ('dataModelUpdate' in message) {\n const upd = message.dataModelUpdate as A2uiDataModelUpdate;\n const surface = surfacesSignal().get(upd.surfaceId);\n if (surface) {\n // Already-rendered surface: apply incrementally.\n let dataModel = surface.dataModel;\n const obj = entriesToObject(upd.contents);\n if (upd.path && upd.path !== '/') {\n for (const [k, v] of Object.entries(obj)) {\n dataModel = setByPointer(dataModel, `${upd.path}/${k}`, v);\n }\n } else {\n dataModel = { ...dataModel, ...obj };\n }\n const next = new Map(surfacesSignal());\n const nextSurface = { ...surface, dataModel };\n next.set(upd.surfaceId, nextSurface);\n surfacesSignal.set(next);\n\n // Recompute per-component readiness with the monotonic rule.\n const prevState = surfaceStatesSignal().get(upd.surfaceId);\n if (prevState) {\n const nextViews = new Map<string, A2uiComponentView>();\n for (const [id, v] of prevState.componentViews) {\n const allResolved = v.bindings.every((p) => isResolved(dataModel, p));\n // Monotonic: once ready=true, stays true even if a later\n // update clears a referenced path.\n const nextReady = v.ready || allResolved;\n nextViews.set(id, {\n ...v,\n ready: nextReady,\n props: nextReady\n ? (resolveProps(v.def, dataModel) as Record<string, unknown>)\n : v.props,\n });\n }\n const nextStatesMap = new Map(surfaceStatesSignal());\n nextStatesMap.set(upd.surfaceId, { surface: nextSurface, componentViews: nextViews });\n surfaceStatesSignal.set(nextStatesMap);\n }\n } else {\n // Pre-render: buffer the delta.\n const b = bufferOf(upd.surfaceId);\n b.dataModelDeltas.push({ path: upd.path, contents: upd.contents });\n }\n return;\n }\n if ('beginRendering' in message) {\n const begin = message.beginRendering as A2uiBeginRendering;\n const b = buffers.get(begin.surfaceId);\n if (!b || !b.components) return; // no surfaceUpdate yet — no-op\n // Build initial data model from buffered deltas.\n let dataModel: Record<string, unknown> = {};\n for (const d of b.dataModelDeltas) {\n const obj = entriesToObject(d.contents);\n if (d.path && d.path !== '/') {\n for (const [k, v] of Object.entries(obj)) {\n dataModel = setByPointer(dataModel, `${d.path}/${k}`, v);\n }\n } else {\n dataModel = { ...dataModel, ...obj };\n }\n }\n // Merge with any existing surface's dataModel if this is a re-render.\n const existing = surfacesSignal().get(begin.surfaceId);\n if (existing) {\n dataModel = { ...existing.dataModel, ...dataModel };\n }\n // Capture v1 styles (font, primaryColor) from beginRendering. A\n // re-render keeps any prior styles unless the new beginRendering\n // explicitly overrides them — this matches the agent's likely\n // intent (\"change the data, keep the look\").\n const nextStyles = begin.styles\n ?? existing?.styles;\n const surface: A2uiSurface = {\n surfaceId: begin.surfaceId,\n catalogId: 'basic',\n components: b.components,\n dataModel,\n ...(nextStyles ? { styles: nextStyles } : {}),\n };\n const next = new Map(surfacesSignal());\n next.set(begin.surfaceId, surface);\n surfacesSignal.set(next);\n\n // Project per-component views with initial readiness based on the\n // accumulated data model.\n const baseViews = b.componentViews ?? new Map<string, A2uiComponentView>();\n const initialViews = new Map<string, A2uiComponentView>();\n for (const [id, v] of baseViews) {\n const allResolved = v.bindings.every((p) => isResolved(dataModel, p));\n initialViews.set(id, {\n ...v,\n ready: allResolved,\n props: allResolved\n ? (resolveProps(v.def, dataModel) as Record<string, unknown>)\n : {},\n });\n }\n const nextStates = new Map(surfaceStatesSignal());\n nextStates.set(begin.surfaceId, { surface, componentViews: initialViews });\n surfaceStatesSignal.set(nextStates);\n\n // Reset buffer so subsequent surfaceUpdate is the next round.\n buffers.set(begin.surfaceId, { dataModelDeltas: [] });\n return;\n }\n if ('deleteSurface' in message) {\n const del = message.deleteSurface as A2uiDeleteSurface;\n buffers.delete(del.surfaceId);\n const next = new Map(surfacesSignal());\n next.delete(del.surfaceId);\n surfacesSignal.set(next);\n const nextStates = new Map(surfaceStatesSignal());\n nextStates.delete(del.surfaceId);\n surfaceStatesSignal.set(nextStates);\n return;\n }\n }\n\n function surface(surfaceId: string): Signal<A2uiSurface | undefined> {\n return computed(() => surfacesSignal().get(surfaceId));\n }\n\n function surfaceState(surfaceId: string): Signal<A2uiSurfaceState | undefined> {\n return computed(() => surfaceStatesSignal().get(surfaceId));\n }\n\n const liveTools = new Set<string>();\n\n function applyPartialArgs(\n toolCallId: string,\n envelopes: readonly A2uiMessage[],\n ): void {\n liveTools.add(toolCallId);\n for (const env of envelopes) {\n apply(env);\n }\n }\n\n function isPartialLive(toolCallId: string): boolean {\n return liveTools.has(toolCallId);\n }\n\n return {\n apply,\n applyPartialArgs,\n isPartialLive,\n surfaces: surfacesSignal.asReadonly(),\n surface,\n surfaceStates: surfaceStatesSignal.asReadonly(),\n surfaceState,\n };\n}\n","// libs/chat/src/lib/streaming/trace.ts\n// SPDX-License-Identifier: MIT\n//\n// localStorage / window-flag-gated debug tracer for @threadplane/chat streaming.\n// Off by default. Enable via:\n// window.__threadplaneChatTrace = true\n// localStorage.THREADPLANE_CHAT_STREAM_TRACE = '1'\n//\n// All call sites should be guarded with `if (isTraceEnabled())` so the\n// argument-collection cost is paid only when tracing is on.\n\nexport function isTraceEnabled(): boolean {\n if (typeof globalThis === 'undefined') return false;\n const win = (globalThis as { window?: { __threadplaneChatTrace?: boolean; localStorage?: Storage } }).window;\n if (!win) return false;\n if (win.__threadplaneChatTrace === true) return true;\n try {\n return win.localStorage?.getItem('THREADPLANE_CHAT_STREAM_TRACE') === '1';\n } catch {\n return false;\n }\n}\n\nexport function trace(...args: unknown[]): void {\n if (isTraceEnabled()) {\n // eslint-disable-next-line no-console\n console.debug('[ngaf-chat-stream]', ...args);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, untracked, type Signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { createPartialJsonParser } from '@cacheplane/partial-json';\nimport { createParseTreeStore, type ElementAccumulationState, type ParseTreeStore } from './parse-tree-store';\nimport { createA2uiMessageParser, type A2uiMessageParser } from '@threadplane/a2ui';\nimport type { A2uiSurface } from '@threadplane/a2ui';\nimport { createA2uiSurfaceStore, type A2uiSurfaceStore, type A2uiSurfaceState } from '../a2ui/surface-store';\nimport { isTraceEnabled, trace } from './trace';\n\nexport type ContentType = 'pending' | 'markdown' | 'json-render' | 'a2ui' | 'mixed';\n\nconst A2UI_PREFIX = '---a2ui_JSON---';\n\nexport interface ContentClassifier {\n update(content: string): void;\n readonly type: Signal<ContentType>;\n readonly markdown: Signal<string>;\n readonly spec: Signal<Spec | null>;\n readonly elementStates: Signal<Map<string, ElementAccumulationState>>;\n readonly a2uiSurfaces: Signal<Map<string, A2uiSurface>>;\n readonly a2uiSurfaceStates: Signal<Map<string, A2uiSurfaceState>>;\n readonly streaming: Signal<boolean>;\n readonly errors: Signal<string[]>;\n dispose(): void;\n}\n\nexport function createContentClassifier(): ContentClassifier {\n const typeSignal = signal<ContentType>('pending');\n const markdownSignal = signal<string>('');\n const specSignal = signal<Spec | null>(null);\n const elementStatesSignal = signal<Map<string, ElementAccumulationState>>(new Map());\n const streamingSignal = signal<boolean>(false);\n const errorsSignal = signal<string[]>([]);\n\n let processedLength = 0;\n let store: ParseTreeStore | null = null;\n let jsonStartIndex = 0;\n\n let a2uiParser: A2uiMessageParser | null = null;\n let a2uiStore: A2uiSurfaceStore | null = null;\n const a2uiSurfacesSignal = signal<Map<string, A2uiSurface>>(new Map());\n const a2uiSurfaceStatesSignal = signal<Map<string, A2uiSurfaceState>>(new Map());\n\n /**\n * Decide the content type from the first non-whitespace character.\n * Returns 'pending' when:\n * - content is empty or all whitespace, OR\n * - the first non-whitespace char is '-' AND content is too short to\n * confirm or disprove the full A2UI_PREFIX (the \"patience\" case).\n * Once we have at least A2UI_PREFIX.length non-prefix chars after the\n * first '-', we commit to either 'a2ui' (full match) or 'markdown'\n * (definitively not the prefix).\n */\n function detectType(content: string): ContentType {\n for (let i = 0; i < content.length; i++) {\n const ch = content[i];\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') continue;\n\n if (ch === '{') {\n return 'json-render';\n }\n\n if (ch === '-') {\n if (content.startsWith(A2UI_PREFIX, i)) {\n return 'a2ui';\n }\n const remaining = content.length - i;\n if (remaining < A2UI_PREFIX.length) {\n const candidate = content.slice(i);\n if (A2UI_PREFIX.startsWith(candidate)) {\n return 'pending';\n }\n return 'markdown';\n }\n return 'markdown';\n }\n\n return 'markdown';\n }\n return 'pending';\n }\n\n function initJsonStore(jsonContent: string): void {\n const parser = createPartialJsonParser();\n store = createParseTreeStore(parser);\n if (jsonContent.length > 0) {\n store.push(jsonContent);\n }\n syncJsonSignals();\n }\n\n function syncJsonSignals(): void {\n if (!store) return;\n specSignal.set(store.spec());\n elementStatesSignal.set(store.elementStates());\n\n const spec = store.spec();\n if (spec) {\n streamingSignal.set(isStillStreaming());\n } else {\n streamingSignal.set(true);\n }\n }\n\n function isStillStreaming(): boolean {\n if (!store) return false;\n const states = store.elementStates();\n for (const state of states.values()) {\n if (state.streaming) return true;\n }\n const spec = store.spec();\n if (!spec || !spec.root || !spec.elements) return true;\n return false;\n }\n\n function resetState(): void {\n typeSignal.set('pending');\n markdownSignal.set('');\n specSignal.set(null);\n elementStatesSignal.set(new Map());\n streamingSignal.set(false);\n errorsSignal.set([]);\n processedLength = 0;\n store = null;\n jsonStartIndex = 0;\n a2uiParser = null;\n a2uiStore = null;\n a2uiSurfacesSignal.set(new Map());\n a2uiSurfaceStatesSignal.set(new Map());\n }\n\n function update(content: string): void {\n // Wrap in untracked() because this is called during template rendering\n // (via classifyMessage in ChatComponent's AI message template). Angular's\n // NG0600 forbids writing signals during change detection; untracked()\n // opts out of the reactive graph for this imperative push-based update.\n untracked(() => {\n // If content shrunk vs. last seen length, the underlying message was\n // replaced (e.g. via langgraph RemoveMessage / id-match content\n // replacement followed by force-refresh-from-server). Reset state so\n // the new content is classified fresh — otherwise the classifier\n // keeps the streamed (pre-mutation) markdown/json type and the UI\n // never updates.\n if (content.length < processedLength) {\n resetState();\n }\n const currentType = typeSignal();\n\n if (currentType === 'pending') {\n const detected = detectType(content);\n if (detected === 'pending') return;\n\n typeSignal.set(detected);\n\n if (detected === 'markdown') {\n markdownSignal.set(content);\n processedLength = content.length;\n } else if (detected === 'json-render') {\n streamingSignal.set(true);\n jsonStartIndex = 0;\n for (let i = 0; i < content.length; i++) {\n if (content[i] !== ' ' && content[i] !== '\\t' && content[i] !== '\\n' && content[i] !== '\\r') {\n jsonStartIndex = i;\n break;\n }\n }\n const jsonContent = content.slice(jsonStartIndex);\n try {\n initJsonStore(jsonContent);\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n processedLength = content.length;\n } else if (detected === 'a2ui') {\n streamingSignal.set(true);\n a2uiParser = createA2uiMessageParser();\n a2uiStore = createA2uiSurfaceStore();\n jsonStartIndex = content.indexOf(A2UI_PREFIX) + A2UI_PREFIX.length;\n const a2uiContent = content.slice(jsonStartIndex);\n if (a2uiContent.length > 0) {\n try {\n const msgs = a2uiParser.push(a2uiContent);\n for (const msg of msgs) a2uiStore.apply(msg);\n a2uiSurfacesSignal.set(a2uiStore.surfaces());\n a2uiSurfaceStatesSignal.set(a2uiStore.surfaceStates());\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n }\n processedLength = content.length;\n }\n return;\n }\n\n // Compute delta\n const delta = content.slice(processedLength);\n processedLength = content.length;\n\n if (delta.length === 0) return;\n\n if (currentType === 'markdown' || currentType === 'mixed') {\n markdownSignal.set(content);\n } else if (currentType === 'json-render') {\n if (store) {\n try {\n store.push(delta);\n syncJsonSignals();\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n }\n } else if (currentType === 'a2ui') {\n if (a2uiParser && a2uiStore) {\n try {\n const msgs = a2uiParser.push(delta);\n for (const msg of msgs) a2uiStore.apply(msg);\n a2uiSurfacesSignal.set(a2uiStore.surfaces());\n a2uiSurfaceStatesSignal.set(a2uiStore.surfaceStates());\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n }\n }\n\n if (isTraceEnabled()) {\n trace('classifier.update', { contentLength: content.length, type: typeSignal() });\n }\n });\n }\n\n function dispose(): void {\n store = null;\n a2uiParser = null;\n a2uiStore = null;\n }\n\n return {\n update,\n type: typeSignal.asReadonly(),\n markdown: markdownSignal.asReadonly(),\n spec: specSignal.asReadonly(),\n elementStates: elementStatesSignal.asReadonly(),\n a2uiSurfaces: a2uiSurfacesSignal.asReadonly(),\n a2uiSurfaceStates: a2uiSurfaceStatesSignal.asReadonly(),\n streaming: streamingSignal.asReadonly(),\n errors: errorsSignal.asReadonly(),\n dispose,\n };\n}\n","// libs/chat/src/lib/a2ui/envelope-normalizer.ts\n// SPDX-License-Identifier: MIT\n\nconst ENVELOPE_KEYS = ['surfaceUpdate', 'beginRendering', 'dataModelUpdate', 'deleteSurface'] as const;\n\n/**\n * The parent LLM may emit envelope-tool arguments in four shapes (observed in\n * the spike across gpt-5-mini and gpt-5): the canonical {envelopes: [...]},\n * a singular typo {envelope: [...]}, positional keys {0: env, 1: env, ...}\n * when the model treats the args as the array, or a flat single envelope.\n * This pure function maps all four into a canonical envelope list.\n *\n * Strict-mode tool binding (OpenAI) should eliminate the non-canonical\n * shapes in production, but the normalizer is the safety net.\n */\nexport function normalizeEnvelopeArgs(\n args: Record<string, unknown> | null | undefined,\n): unknown[] | null {\n if (!args || typeof args !== 'object' || Array.isArray(args)) return null;\n\n // (a) canonical: { envelopes: [...] }\n if (Array.isArray((args as { envelopes?: unknown }).envelopes)) {\n return (args as { envelopes: unknown[] }).envelopes;\n }\n // (b) singular typo: { envelope: [...] }\n if (Array.isArray((args as { envelope?: unknown }).envelope)) {\n return (args as { envelope: unknown[] }).envelope;\n }\n const keys = Object.keys(args);\n if (keys.length === 0) return null;\n // (c) positional keys: { 0: env, 1: env, ... }\n if (keys.every((k) => /^\\d+$/.test(k))) {\n return keys\n .map((k) => Number(k))\n .sort((a, b) => a - b)\n .map((k) => (args as Record<string, unknown>)[String(k)]);\n }\n // (d) flat single envelope: { surfaceUpdate: {...} } | { beginRendering: ... } | etc\n if (ENVELOPE_KEYS.some((k) => k in args)) {\n return [args];\n }\n return null;\n}\n","// libs/chat/src/lib/a2ui/partial-args-bridge.ts\n// SPDX-License-Identifier: MIT\nimport { createPartialJsonParser, materialize } from '@cacheplane/partial-json';\nimport type { A2uiMessage, A2uiSurfaceUpdate } from '@threadplane/a2ui';\nimport type { A2uiSurfaceStore } from './surface-store';\nimport { normalizeEnvelopeArgs } from './envelope-normalizer';\n\nexport interface PartialArgsBridge {\n /**\n * Replace the cumulative argument-string buffer for `toolCallId` with\n * `argsSoFar` and re-extract any newly-complete envelopes. The args\n * string is expected to grow monotonically.\n */\n push(toolCallId: string, argsSoFar: string): void;\n /** True if a tool_call_id has been poisoned by malformed input. */\n isPoisoned(toolCallId: string): boolean;\n}\n\ninterface BridgeState {\n parser: ReturnType<typeof createPartialJsonParser>;\n /** Number of envelopes already dispatched to the store. */\n dispatchedCount: number;\n /**\n * Have we dispatched the initial surfaceUpdate + synthesised beginRendering\n * pair for this turn yet? Until true, dispatch is deferred — we wait for\n * the first surfaceUpdate to have at least one component with an `id` so\n * `pickRoot` can target a real root and the surface actually mounts.\n */\n surfacePairDispatched: boolean;\n /** surfaceId the synthesised beginRendering targets (to avoid double-mounting). */\n synthesisedSurfaceId: string | null;\n /** Once true, all subsequent pushes are ignored. */\n poisoned: boolean;\n}\n\n/**\n * Validate that `s` is a syntactically plausible JSON prefix. We can't\n * `JSON.parse` an incomplete string, so we run a lightweight scanner that\n * follows the grammar and tolerates only truncation at the right edge.\n * Returns false if any character violates JSON syntax mid-stream.\n *\n * The partial-json parser silently halts on bad input (setting an internal\n * error flag that is not exposed through its public API), so we use this\n * pre-check to detect poisoned streams.\n */\nfunction isValidJsonPrefix(s: string): boolean {\n // Stack of expected closers: '}' for objects, ']' for arrays,\n // 'k' (object key expected), 'v' (value expected), ',' or ':'.\n // We model JSON with a small state machine. Returns true if the input\n // is consumable as a prefix of some valid JSON document.\n let i = 0;\n const len = s.length;\n // Outer state: 'value' (expecting any value), 'object-key' (after `{`\n // or `,`), 'after-key' (after a key string, expect `:`), 'after-value'\n // (after a value, expect `,` or matching close).\n type Frame = { container: 'object' | 'array' };\n const stack: Frame[] = [];\n let state: 'value' | 'object-key' | 'after-key' | 'after-value' = 'value';\n\n function skipWs(): void {\n while (i < len) {\n const c = s.charCodeAt(i);\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d) i++;\n else break;\n }\n }\n\n function scanString(): boolean {\n // Already at opening quote\n if (s[i] !== '\"') return false;\n i++;\n while (i < len) {\n const c = s[i];\n if (c === '\\\\') {\n i++;\n if (i >= len) return true; // truncated escape\n i++;\n continue;\n }\n if (c === '\"') { i++; return true; }\n i++;\n }\n // Truncated mid-string is OK for a prefix.\n return true;\n }\n\n function scanLiteral(lit: string): boolean {\n // Match as much of `lit` as remains in input. Truncation OK.\n let j = 0;\n while (i < len && j < lit.length) {\n if (s[i] !== lit[j]) return false;\n i++; j++;\n }\n return true;\n }\n\n function scanNumber(): boolean {\n // Lenient: consume digits, '.', 'e', 'E', '+', '-' starting from current\n if (s[i] === '-') i++;\n while (i < len) {\n const c = s[i];\n if ((c >= '0' && c <= '9') || c === '.' || c === 'e' || c === 'E' || c === '+' || c === '-') i++;\n else break;\n }\n return true;\n }\n\n while (i < len) {\n skipWs();\n if (i >= len) break;\n const c = s[i];\n\n if (state === 'value') {\n if (c === '{') {\n i++; stack.push({ container: 'object' }); state = 'object-key';\n } else if (c === '[') {\n i++; stack.push({ container: 'array' }); state = 'value';\n } else if (c === '\"') {\n if (!scanString()) return false;\n state = 'after-value';\n } else if (c === 't') { if (!scanLiteral('true')) return false; state = 'after-value'; }\n else if (c === 'f') { if (!scanLiteral('false')) return false; state = 'after-value'; }\n else if (c === 'n') { if (!scanLiteral('null')) return false; state = 'after-value'; }\n else if (c === '-' || (c >= '0' && c <= '9')) { if (!scanNumber()) return false; state = 'after-value'; }\n else if (c === ']' && stack.length > 0 && stack[stack.length - 1].container === 'array') {\n // empty array close\n i++; stack.pop(); state = 'after-value';\n } else {\n return false;\n }\n } else if (state === 'object-key') {\n if (c === '\"') {\n if (!scanString()) return false;\n state = 'after-key';\n } else if (c === '}' && stack.length > 0 && stack[stack.length - 1].container === 'object') {\n i++; stack.pop(); state = 'after-value';\n } else {\n return false;\n }\n } else if (state === 'after-key') {\n if (c === ':') { i++; state = 'value'; }\n else return false;\n } else if (state === 'after-value') {\n if (stack.length === 0) {\n // Trailing content after top-level value is invalid.\n return false;\n }\n const top = stack[stack.length - 1];\n if (c === ',') {\n i++;\n state = top.container === 'object' ? 'object-key' : 'value';\n } else if (c === '}' && top.container === 'object') {\n i++; stack.pop(); state = 'after-value';\n } else if (c === ']' && top.container === 'array') {\n i++; stack.pop(); state = 'after-value';\n } else {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Subscribes to LangGraph custom events of name 'a2ui-partial' and feeds\n * the surface store envelope-by-envelope as the parent LLM streams its\n * tool_call.arguments JSON. Uses @cacheplane/partial-json to extract\n * structurally-complete envelope objects from the growing args string.\n *\n * Synthesis safety net: if the first complete surfaceUpdate arrives and\n * no beginRendering has been extracted yet, the bridge synthesises one\n * targeted at the surfaceUpdate's first component (preferring id='root'\n * if present). This makes the surface mount IMMEDIATELY after the first\n * surfaceUpdate parses — without waiting for the LLM to emit beginRendering\n * at the end of its envelope list — so the render-element fallback gate\n * (PR #252) actually fires while dataModelUpdates flow in.\n *\n * The store's apply() already treats repeated beginRendering for the same\n * surfaceId as idempotent (just re-applies styles), so the LLM's eventual\n * beginRendering (if any) is a no-op rather than a conflict.\n */\nexport function createPartialArgsBridge(store: A2uiSurfaceStore): PartialArgsBridge {\n const states = new Map<string, BridgeState>();\n\n function stateOf(toolCallId: string): BridgeState {\n let s = states.get(toolCallId);\n if (!s) {\n s = {\n parser: createPartialJsonParser(),\n dispatchedCount: 0,\n surfacePairDispatched: false,\n synthesisedSurfaceId: null,\n poisoned: false,\n };\n states.set(toolCallId, s);\n }\n return s;\n }\n\n function pickRoot(components: readonly { id: string }[]): string | null {\n if (components.length === 0) return null;\n const explicitRoot = components.find((c) => c.id === 'root');\n return explicitRoot ? explicitRoot.id : components[0].id;\n }\n\n function push(toolCallId: string, argsSoFar: string): void {\n const state = stateOf(toolCallId);\n if (state.poisoned) return;\n // Pre-check: poison if the args string isn't a valid JSON prefix.\n if (!isValidJsonPrefix(argsSoFar)) {\n state.poisoned = true;\n return;\n }\n try {\n // Reset the parser to a fresh state and feed the entire cumulative\n // string. The parser is monotonic — same input always yields the\n // same tree — so re-parsing is safe and avoids delta-tracking bugs.\n state.parser = createPartialJsonParser();\n state.parser.push(argsSoFar);\n } catch {\n state.poisoned = true;\n return;\n }\n const rootNode = state.parser.getByPath('/');\n if (!rootNode) return;\n const materialised = materialize(rootNode) as Record<string, unknown> | null;\n if (!materialised || typeof materialised !== 'object') return;\n const envelopes = normalizeEnvelopeArgs(materialised);\n if (!envelopes) return;\n\n // Phase 1: defer initial dispatch until the first envelope is a complete\n // surfaceUpdate whose components include at least one entry with an `id`\n // — otherwise pickRoot returns null and synthesis silently no-ops, leaving\n // the surface unmounted forever. Once we have a pickable root, dispatch\n // the surfaceUpdate AND a synthesised beginRendering as an atomic pair.\n if (!state.surfacePairDispatched) {\n const firstEnv = envelopes[0] as A2uiMessage | undefined;\n if (!firstEnv || !('surfaceUpdate' in firstEnv)) return;\n if (!isStructurallyComplete(firstEnv)) return;\n const upd = (firstEnv as { surfaceUpdate: A2uiSurfaceUpdate }).surfaceUpdate;\n if (upd.components.length === 0) return;\n const root = pickRoot(upd.components);\n if (!root) return;\n state.surfacePairDispatched = true;\n state.dispatchedCount = 1; // index 0 = the surfaceUpdate we just sent\n state.synthesisedSurfaceId = upd.surfaceId;\n store.applyPartialArgs(toolCallId, [\n firstEnv,\n { beginRendering: { surfaceId: upd.surfaceId, root } },\n ]);\n }\n\n // Phase 2: dispatch any newly-complete envelopes beyond the initial pair.\n const newEnvelopes: A2uiMessage[] = [];\n for (let i = state.dispatchedCount; i < envelopes.length; i++) {\n const env = envelopes[i] as A2uiMessage;\n if (!isStructurallyComplete(env)) {\n // Stop at the first not-yet-complete envelope; later siblings can't\n // exist before earlier ones complete (envelopes are an ordered list).\n break;\n }\n // Skip a \"real\" beginRendering for the synthesised surface — the store\n // already treats it as idempotent (just re-applies styles), but we\n // advance past it so dispatchedCount stays in sync with the index.\n if (\n 'beginRendering' in env &&\n (env as { beginRendering: { surfaceId?: string } }).beginRendering.surfaceId ===\n state.synthesisedSurfaceId\n ) {\n state.dispatchedCount = i + 1;\n continue;\n }\n newEnvelopes.push(env);\n state.dispatchedCount = i + 1;\n }\n if (newEnvelopes.length > 0) {\n store.applyPartialArgs(toolCallId, newEnvelopes);\n }\n }\n\n function isPoisoned(toolCallId: string): boolean {\n return stateOf(toolCallId).poisoned;\n }\n\n return { push, isPoisoned };\n}\n\n/** True if the envelope has a recognised discriminator key with an object value. */\nfunction isStructurallyComplete(env: unknown): env is A2uiMessage {\n if (!env || typeof env !== 'object' || Array.isArray(env)) return false;\n const obj = env as Record<string, unknown>;\n for (const k of ['surfaceUpdate', 'beginRendering', 'dataModelUpdate', 'deleteSurface']) {\n if (k in obj && typeof obj[k] === 'object' && obj[k] !== null) {\n // For surfaceUpdate, also require non-undefined surfaceId + components.\n if (k === 'surfaceUpdate') {\n const su = obj[k] as { surfaceId?: unknown; components?: unknown };\n return typeof su.surfaceId === 'string' && Array.isArray(su.components);\n }\n return true;\n }\n }\n return false;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Synthesize a short human-readable label for a serialized A2UI action\n * message, so the chat composition can render \"Search flights\" instead\n * of a raw `{\"version\":\"v1\",\"action\":...}` JSON dump as a user bubble.\n *\n * Per the A2UI spec, action messages flow on the client → agent\n * return channel and are framed as typed events (closer to tool calls\n * than user utterances). The spec is silent on chat-bubble rendering;\n * Google's \"A2UI in Practice\" article and the Stream Chat reference\n * both warn against modeling actions as chat-history user turns.\n *\n * Label source priority:\n * 1. `action.label` if present — populated by `buildA2uiActionMessage`\n * from the source component's authored visible text (e.g. a\n * Button's child Text literalString). This is the LLM-authored\n * label and the preferred source.\n * 2. CamelCase humanization of `action.name` (`bookingSubmit` →\n * \"Booking submit\"). Used when no label was stamped — typically\n * because the source component isn't a Button-with-Text-child.\n *\n * Returns null for any content that isn't a v1 A2UI action message;\n * callers should fall back to the original content in that case.\n *\n * Design context: a previous iteration shipped a hardcoded\n * `KNOWN_LABELS` map (bookingSubmit → 'Search flights') that embedded\n * app-specific knowledge in the chat-lib primitive. That map was\n * removed in favor of derivation from the authored UI; see spec\n * 2026-05-19-llm-generated-labels-design.md.\n *\n * Sources:\n * - https://a2ui.org/specification/v0.9-a2ui/\n * - https://medium.com/google-cloud/a2ui-in-practice-patterns-pitfalls-and-the-messages-that-hold-it-together-658720b83789\n * - https://getstream.io/blog/a2ui-chat-integration/\n */\n\nexport function a2uiActionLabel(content: string): string | null {\n if (typeof content !== 'string' || content.length === 0) return null;\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('{')) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return null;\n }\n if (!isRecord(parsed)) return null;\n if (parsed['version'] !== 'v1') return null;\n const action = parsed['action'];\n if (!isRecord(action)) return null;\n const name = action['name'];\n if (typeof name !== 'string' || name.length === 0) return null;\n\n // Preferred: label stamped at emit time by buildA2uiActionMessage from\n // the source component's authored visible text.\n const authoredLabel = action['label'];\n if (typeof authoredLabel === 'string' && authoredLabel.length > 0) {\n return authoredLabel;\n }\n\n // Fallback: humanize the camelCase action name.\n return humanizeCamelCase(name);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** \"bookingSubmit\" → \"Booking submit\". \"addToCart\" → \"Add to cart\". */\nfunction humanizeCamelCase(name: string): string {\n const spaced = name.replace(/([a-z])([A-Z])/g, '$1 $2');\n const lower = spaced.toLowerCase();\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n}\n","// SPDX-License-Identifier: MIT\nimport type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Extracts a human-readable string from a message's content.\n *\n * `BaseMessage.content` is `string | MessageContentComplex[]`. Reasoning-\n * capable models (OpenAI gpt-5/o-series, Anthropic) emit complex arrays of\n * typed blocks: `{type:'text',text}`, `{type:'reasoning',...}`, tool-use\n * blocks, etc. We render only the visible text portions and skip anything\n * else. Stringifying the whole array would dump raw JSON like\n * `[{\"type\":\"text\",...}]` into the chat bubble.\n */\nexport function messageContent(message: BaseMessage): string {\n return extractText(message.content);\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') {\n out += block;\n continue;\n }\n if (!isRecord(block)) continue;\n const t = block['type'];\n if (t === 'text' || t === 'output_text' || t === undefined) {\n const text = block['text'];\n if (typeof text === 'string') out += text;\n }\n // Skip reasoning, tool_use, image, etc. — not chat-bubble content.\n }\n return out;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// libs/chat/src/lib/compositions/chat/chat.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, ChangeDetectionStrategy, input, model, output, computed, effect, signal, untracked, viewChild, ElementRef,\n DestroyRef, inject, Injector, runInInjectionContext,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KeyValuePipe } from '@angular/common';\nimport type { Agent, Message } from '../../agent';\nimport { ChatReasoningComponent } from '../../primitives/chat-reasoning/chat-reasoning.component';\nimport type { ViewRegistry, RenderEvent } from '@threadplane/render';\nimport type { A2uiActionMessage } from '@threadplane/a2ui';\nimport type { StateStore } from '@json-render/core';\nimport { toRenderRegistry, signalStateStore, withViews } from '@threadplane/render';\nimport type { ClientToolRegistry } from '../../client-tools/tool-def';\nimport { createClientToolsCoordinator } from '../../client-tools/client-tools-coordinator';\nimport { ChatWindowComponent } from '../../primitives/chat-window/chat-window.component';\nimport { ChatMessageListComponent } from '../../primitives/chat-message-list/chat-message-list.component';\nimport { MessageTemplateDirective } from '../../primitives/chat-message-list/message-template.directive';\nimport { ChatMessageComponent, type ChatMessageRole } from '../../primitives/chat-message/chat-message.component';\nimport { ChatInputComponent } from '../../primitives/chat-input/chat-input.component';\nimport { ChatTypingIndicatorComponent } from '../../primitives/chat-typing-indicator/chat-typing-indicator.component';\nimport { ChatErrorComponent } from '../../primitives/chat-error/chat-error.component';\nimport { ChatThreadListComponent, type Thread } from '../../primitives/chat-thread-list/chat-thread-list.component';\nimport { ChatGenerativeUiComponent } from '../../primitives/chat-generative-ui/chat-generative-ui.component';\nimport { ChatToolViewsComponent } from '../../primitives/chat-tool-views/chat-tool-views.component';\nimport { ChatStreamingMdComponent } from '../../streaming/streaming-markdown.component';\nimport { ChatToolCallsComponent } from '../../primitives/chat-tool-calls/chat-tool-calls.component';\nimport { ChatSubagentsComponent } from '../../primitives/chat-subagents/chat-subagents.component';\nimport { ChatMessageActionsComponent } from '../../primitives/chat-message-actions/chat-message-actions.component';\nimport { ChatWelcomeComponent } from '../../primitives/chat-welcome/chat-welcome.component';\nimport { ChatSelectComponent, type ChatSelectOption } from '../../primitives/chat-select/chat-select.component';\nimport { A2uiSurfaceComponent } from '../../a2ui/surface.component';\nimport { ChatScrollBubbleComponent } from '../../primitives/chat-scroll-bubble/chat-scroll-bubble.component';\nimport { createContentClassifier, type ContentClassifier } from '../../streaming/content-classifier';\nimport { createPartialArgsBridge, type PartialArgsBridge } from '../../a2ui/partial-args-bridge';\nimport { createA2uiSurfaceStore, type A2uiSurfaceStore } from '../../a2ui/surface-store';\nimport { a2uiActionLabel } from '../../a2ui/action-label';\nimport { messageContent } from '../shared/message-utils';\nimport { CHAT_HOST_TOKENS, ensureChatRootStyles } from '../../styles/chat-tokens';\nimport type { ChatRenderEvent } from './chat-render-event';\nimport { CHAT_LIFECYCLE, type ChatLifecycle } from '../../lifecycle';\n\n/**\n * Internal helper: WritableSignals backing the readonly ChatLifecycle surface\n * exposed via CHAT_LIFECYCLE. ChatComponent populates these as the user\n * interacts; consumers (e.g. cockpit-telemetry) only see the readonly view.\n */\ninterface ChatLifecycleInternal extends ChatLifecycle {\n _internal: {\n componentReady: ReturnType<typeof signal<boolean>>;\n firstMessageSent: ReturnType<typeof signal<boolean>>;\n messageCount: ReturnType<typeof signal<number>>;\n inputSubmittedAt: ReturnType<typeof signal<number | null>>;\n };\n}\n\nfunction createChatLifecycle(): ChatLifecycleInternal {\n const componentReady = signal(false);\n const firstMessageSent = signal(false);\n const messageCount = signal(0);\n const inputSubmittedAt = signal<number | null>(null);\n return {\n componentReady: componentReady.asReadonly(),\n firstMessageSent: firstMessageSent.asReadonly(),\n messageCount: messageCount.asReadonly(),\n inputSubmittedAt: inputSubmittedAt.asReadonly(),\n _internal: { componentReady, firstMessageSent, messageCount, inputSubmittedAt },\n };\n}\n\n/**\n * Returns true when the scroll position is within `tolerance` px of the bottom.\n * Pure helper extracted for unit testing.\n */\nexport function isPinned(\n scrollHeight: number,\n scrollTop: number,\n clientHeight: number,\n tolerance = 150,\n): boolean {\n return scrollHeight - scrollTop - clientHeight < tolerance;\n}\n\n@Component({\n selector: 'chat',\n standalone: true,\n imports: [\n KeyValuePipe,\n ChatWindowComponent, ChatMessageListComponent, MessageTemplateDirective, ChatMessageComponent,\n ChatInputComponent, ChatTypingIndicatorComponent, ChatErrorComponent,\n ChatThreadListComponent, ChatGenerativeUiComponent,\n ChatStreamingMdComponent, ChatToolCallsComponent, ChatToolViewsComponent, ChatSubagentsComponent, A2uiSurfaceComponent,\n ChatMessageActionsComponent, ChatWelcomeComponent, ChatSelectComponent, ChatReasoningComponent,\n ChatScrollBubbleComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: CHAT_LIFECYCLE, useFactory: createChatLifecycle },\n ],\n styles: [CHAT_HOST_TOKENS, `\n :host {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n height: 100%;\n min-height: 0;\n max-height: 100%;\n overflow: hidden;\n background: var(--ngaf-chat-bg);\n }\n :host > chat-welcome {\n display: flex;\n flex: 1 1 auto;\n width: 100%;\n }\n .chat-shell { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .chat-shell__sidebar {\n width: 240px;\n flex-shrink: 0;\n border-right: 1px solid var(--ngaf-chat-separator);\n background: var(--ngaf-chat-surface-alt);\n overflow-y: auto;\n display: none;\n }\n @media (min-width: 768px) { .chat-shell__sidebar { display: block; } }\n .chat-shell__main { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; }\n .chat-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 60px 20px;\n color: var(--ngaf-chat-text-muted);\n text-align: center;\n flex: 1;\n min-height: 0;\n }\n .chat-empty[hidden] { display: none; }\n .chat-empty__title { font-size: 1.125rem; font-weight: 500; color: var(--ngaf-chat-text); margin: 0; }\n .chat-empty__sub { margin: 0; font-size: var(--ngaf-chat-font-size-sm); }\n .chat-empty__title { font-size: 1.125rem; font-weight: 500; color: var(--ngaf-chat-text); margin: 0; }\n .chat-empty__sub { margin: 0; font-size: var(--ngaf-chat-font-size-sm); }\n .chat-scroll { flex: 1; min-height: 0; overflow-y: auto; padding-top: var(--ngaf-chat-edge-pad); }\n .chat-scroll::-webkit-scrollbar { width: 6px; }\n .chat-scroll::-webkit-scrollbar-thumb { background: var(--ngaf-chat-separator); border-radius: 10px; }\n [chatFooter] {\n padding-bottom: var(--ngaf-chat-edge-pad);\n }\n .chat-footer-wrap { position: relative; }\n `],\n template: `\n @if (showWelcome()) {\n <chat-welcome>\n <chat-input chatWelcomeInput [agent]=\"agent()\" [submitOnEnter]=\"true\" placeholder=\"Type a message...\">\n @if (showModelPicker() && modelOptions().length > 0) {\n <chat-select\n chatInputModelSelect\n [options]=\"modelOptions()\"\n [(value)]=\"selectedModel\"\n [placeholder]=\"modelPickerPlaceholder()\"\n />\n }\n </chat-input>\n <ng-container ngProjectAs=\"[chatWelcomeSuggestions]\">\n <ng-content select=\"[chatWelcomeSuggestions]\" />\n </ng-container>\n </chat-welcome>\n } @else {\n <div class=\"chat-shell\">\n @if (threads().length > 0) {\n <aside class=\"chat-shell__sidebar\">\n <chat-thread-list\n [threads]=\"threads()\"\n [activeThreadId]=\"activeThreadId()\"\n (threadSelected)=\"threadSelected.emit($event)\"\n />\n </aside>\n }\n <div class=\"chat-shell__main\">\n <chat-window>\n <ng-content select=\"[chatHeader]\" chatHeader />\n <div chatBody class=\"chat-scroll\" #scrollContainer (scroll)=\"onScroll()\">\n <chat-message-list [agent]=\"agent()\">\n <ng-template chatMessageTemplate=\"human\" let-message let-i=\"index\">\n <chat-message [role]=\"'user'\" [prevRole]=\"prevRole(i)\">{{ humanContent(message) }}</chat-message>\n </ng-template>\n\n <ng-template chatMessageTemplate=\"ai\" let-message let-i=\"index\">\n @let content = messageContent(message);\n @let classified = classifyMessage(content, message);\n @let pending = classified.type() === 'pending';\n <chat-message\n [role]=\"'assistant'\"\n [message]=\"message\"\n [prevRole]=\"prevRole(i)\"\n [streaming]=\"agent().isLoading() && i === agent().messages().length - 1\"\n [current]=\"i === agent().messages().length - 1\"\n >\n @if (message.reasoning) {\n <chat-reasoning\n [content]=\"message.reasoning\"\n [isStreaming]=\"isReasoningStreaming(message, i)\"\n [durationMs]=\"message.reasoningDurationMs\"\n />\n }\n <chat-tool-calls [agent]=\"agent()\" [message]=\"message\" [excludeToolNames]=\"excludedToolNames()\">\n <ng-container ngProjectAs=\"[chatToolCallTemplate]\">\n <ng-content select=\"[chatToolCallTemplate]\" />\n </ng-container>\n </chat-tool-calls>\n <chat-tool-views\n [agent]=\"agent()\"\n [message]=\"message\"\n [views]=\"effectiveViews()\"\n [store]=\"resolvedStore()\"\n [handlers]=\"handlers()\"\n (events)=\"onClientToolEvent($event)\"\n />\n <chat-subagents [agent]=\"agent()\" />\n @if (classified.markdown(); as md) {\n <chat-streaming-md [content]=\"md\" [streaming]=\"agent().isLoading() && i === agent().messages().length - 1\" />\n }\n @if (classified.spec(); as spec) {\n <!-- Pass ONLY the explicit consumer store (may be\n undefined) — never the conversation-wide internal\n fallback. Without a consumer store, render-spec\n self-seeds a per-instance store from spec.state so\n same-key dashboards across messages stay isolated\n (a2ui parity). -->\n <chat-generative-ui\n [spec]=\"spec\"\n [registry]=\"renderRegistry()\"\n [store]=\"store()\"\n [handlers]=\"handlers()\"\n [loading]=\"agent().isLoading()\"\n (events)=\"onSpecEvent($event, i)\"\n />\n }\n @if (classified.type() === 'a2ui' && views(); as catalog) {\n @for (entry of classified.a2uiSurfaces() | keyvalue; track entry.key) {\n <a2ui-surface\n [surface]=\"entry.value\"\n [state]=\"classified.a2uiSurfaceStates().get(entry.key)\"\n [catalog]=\"catalog\"\n [handlers]=\"handlers()\"\n (action)=\"onA2uiAction($event)\"\n (events)=\"onA2uiEvent($event, i, entry.key)\"\n />\n }\n }\n <chat-message-actions\n chatMessageControls\n [content]=\"content\"\n [disabled]=\"agent().isLoading()\"\n (regenerate)=\"onRegenerate(i)\"\n (rate)=\"onRate(message, $event)\"\n (contentCopied)=\"onCopy(message, $event)\"\n />\n </chat-message>\n </ng-template>\n\n <ng-template chatMessageTemplate=\"tool\" let-message>\n <!-- Tool messages route through chat-trace; hidden from main flow. -->\n </ng-template>\n\n <ng-template chatMessageTemplate=\"system\" let-message>\n <chat-message [role]=\"'system'\">{{ messageContent(message) }}</chat-message>\n </ng-template>\n </chat-message-list>\n\n <!-- Suppress the floor typing-indicator while the current\n assistant bubble is streaming: its own caret is already\n the loading affordance. Showing both reads as visual\n noise rather than richer feedback. See\n currentAssistantStreaming() on the component class. -->\n @if (pinned() && !currentAssistantStreaming()) {\n <chat-typing-indicator [agent]=\"agent()\" />\n }\n </div>\n <div chatFooter class=\"chat-footer-wrap\">\n @if (!pinned()) {\n <chat-scroll-bubble\n [mode]=\"agent().isLoading() ? 'streaming' : 'idle'\"\n (clicked)=\"onScrollBubbleClick()\"\n />\n }\n <chat-error [agent]=\"agent()\" />\n <chat-input [agent]=\"agent()\" [submitOnEnter]=\"true\" placeholder=\"Type a message...\" (submitted)=\"onUserSubmitted()\">\n @if (showModelPicker() && modelOptions().length > 0) {\n <chat-select\n chatInputModelSelect\n [options]=\"modelOptions()\"\n [(value)]=\"selectedModel\"\n [placeholder]=\"modelPickerPlaceholder()\"\n />\n } @else {\n <ng-container ngProjectAs=\"[chatInputModelSelect]\">\n <ng-content select=\"[chatInputModelSelect]\" />\n </ng-container>\n }\n </chat-input>\n </div>\n </chat-window>\n </div>\n </div>\n }\n `,\n})\nexport class ChatComponent {\n readonly agent = input.required<Agent>();\n readonly views = input<ViewRegistry | undefined>(undefined);\n /**\n * Client-declared tools (`view`/`ask`/`function`) the model may call. When\n * provided, a coordinator ships their catalog to the agent, runs `function`\n * tools in the browser, and renders/resolves `view`/`ask` tools through the\n * same tool-views pipeline as `views`. Additive — leave undefined for the\n * classic server-tools-only experience.\n */\n readonly clientTools = input<ClientToolRegistry | undefined>(undefined);\n readonly store = input<StateStore | undefined>(undefined);\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>({});\n readonly threads = input<Thread[]>([]);\n readonly activeThreadId = input<string>('');\n readonly welcomeDisabled = input<boolean>(false);\n\n /**\n * High-level model-picker API. When `modelOptions` is non-empty, the chat\n * composition renders a `<chat-select>` inside the input pill (in BOTH\n * welcome and conversation modes), wired to the two-way `selectedModel`\n * model. Consumers who want full control should leave `modelOptions`\n * empty and project a `<chat-select chatInputModelSelect>` themselves.\n */\n readonly modelOptions = input<readonly ChatSelectOption[]>([]);\n /**\n * When `false`, hide the auto-rendered model picker even when\n * `modelOptions` is non-empty. Useful in cramped surfaces (popup,\n * sidebar) where the picker crowds the input. Defaults to `true`.\n * Has no effect when consumers project their own\n * `<chat-select chatInputModelSelect>` via content projection.\n */\n readonly showModelPicker = input<boolean>(true);\n readonly selectedModel = model<string>('');\n readonly modelPickerPlaceholder = input<string>('Choose a model');\n\n /**\n * Tool names whose calls produce a rendered GenUI surface rather than\n * visible text. Used to (a) filter <chat-tool-calls> so internal\n * dispatchers don't render args JSON as cards, and (b) detect\n * \"this is a GenUI turn\" for the building-UI skeleton.\n * Default covers the canonical A2UI + json-render schema tools.\n */\n readonly genuiToolNames = input<readonly string[]>([\n 'generate_a2ui_schema',\n 'generate_json_render_spec',\n 'render_spec',\n ]);\n\n readonly showWelcome = computed(() => {\n if (this.welcomeDisabled()) return false;\n const a = this.agent() as unknown as { isThreadLoading?: () => boolean };\n if (a.isThreadLoading?.()) return false;\n return this.agent().messages().length === 0;\n });\n readonly threadSelected = output<string>();\n readonly renderEvent = output<ChatRenderEvent>();\n /** Emitted when the user clicks the regenerate button on an assistant message. */\n readonly regenerate = output<void>();\n /** Emitted when the user rates an assistant message. */\n readonly rate = output<{ messageIndex: number; rating: 'up' | 'down' }>();\n /** Emitted when the user copies an assistant message. */\n readonly messageCopy = output<{ messageIndex: number; content: string }>();\n private readonly _internalStore = signalStateStore({});\n readonly resolvedStore = computed(() => {\n const explicit = this.store();\n if (explicit) return explicit;\n // A render store is needed whenever there's any view registry to render\n // through — user-supplied `views()` OR client-tool view/ask components.\n if (this.effectiveViews()) return this._internalStore;\n return undefined;\n });\n\n /**\n * Lazily-built client-tools coordinator, memoized on the `clientTools`\n * registry input. Undefined when no client tools are declared. The\n * coordinator owns the catalog/executor wiring and the view/ask render\n * registry; the composition merges and connects it below.\n */\n private readonly coordinator = computed(() => {\n const reg = this.clientTools();\n return reg ? createClientToolsCoordinator(reg) : undefined;\n });\n\n /**\n * The view registry actually used for rendering tool-views and for\n * excluding view-backed tool names from default tool-call cards. Merges\n * the coordinator's `view`/`ask` components (keyed by tool name) into the\n * user-supplied `views()` so client-declared component tools render through\n * the same pipeline. Falls back to `views()` when no client tools exist.\n */\n protected readonly effectiveViews = computed(() => {\n const base = this.views();\n const coord = this.coordinator();\n if (!coord) return base;\n return base ? withViews(base, coord.viewRegistry) : coord.viewRegistry;\n });\n\n readonly renderRegistry = computed(() => {\n const v = this.views();\n return v ? toRenderRegistry(v) : undefined;\n });\n\n /** Tool names that have a registered view (keys of the effective view\n * registry, including client-declared view/ask tools). These render as\n * inline tool-views and are excluded from the default tool-call card so\n * they don't render twice. */\n readonly viewToolNames = computed<readonly string[]>(() => Object.keys(this.effectiveViews() ?? {}));\n\n /** Union of GenUI dispatcher tool names and registered view tool names. */\n readonly excludedToolNames = computed<readonly string[]>(() => [\n ...this.genuiToolNames(),\n ...this.viewToolNames(),\n ]);\n\n readonly messageContent = messageContent;\n\n /**\n * Renderable content for a human-role message bubble. Most human\n * messages are typed prompts and pass through `messageContent`\n * unchanged. A2UI action messages (e.g. form submits, button clicks\n * on a rendered surface) flow through the same submit channel and\n * land in the message stream as a HumanMessage whose content is a\n * JSON-serialized `A2uiActionMessage`. Showing the raw JSON as if\n * the user typed it leaks the protocol; per the A2UI spec\n * those events resemble tool calls more than user utterances.\n *\n * `a2uiActionLabel` returns a short human-readable label for\n * recognized action shapes (\"Search flights\", \"Selected flight UA123\",\n * etc.) — or null for any non-action content, in which case we fall\n * back to the original text.\n */\n protected humanContent(message: unknown): string {\n // Cast: `messageContent` is typed against LangChain's BaseMessage, but\n // templates iterate the chat-lib's looser `Message` shape. Either type\n // is fine at runtime (`extractText` only reads `.content`).\n const raw = messageContent(message as Parameters<typeof messageContent>[0]);\n return a2uiActionLabel(raw) ?? raw;\n }\n\n /**\n * True while a message's reasoning is mid-stream — i.e. it's the latest\n * message, the agent is loading, the message has reasoning content, and\n * no response text has arrived yet. Once the response text begins, the\n * reasoning pill collapses (per its internal logic).\n */\n protected isReasoningStreaming(message: Message, index: number): boolean {\n const agent = this.agent();\n const isTail = index === agent.messages().length - 1;\n if (!isTail || !agent.isLoading()) return false;\n if (!message.reasoning || message.reasoning.length === 0) return false;\n const text = typeof message.content === 'string' ? message.content : '';\n return text.length === 0;\n }\n\n private readonly classifiers = new Map<string, ContentClassifier>();\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n // Resolved against the component's own `providers` in normal use. The fallback\n // is for tests that construct ChatComponent via `new` inside a bare injection\n // context (no element injector, so component-level providers are skipped).\n private readonly lifecycle = (inject(CHAT_LIFECYCLE, { optional: true }) ?? createChatLifecycle()) as ChatLifecycleInternal;\n private eventsSubscribed = false;\n\n /**\n * Shared A2UI surface store fed by the live partial-args bridge. The\n * content-classifier path will share this store via tool_call_id\n * short-circuit (skipping re-dispatch for live tool_call_ids).\n */\n protected readonly liveSurfaceStore: A2uiSurfaceStore = createA2uiSurfaceStore();\n private readonly partialBridge: PartialArgsBridge = createPartialArgsBridge(this.liveSurfaceStore);\n private partialEventsLastIndex = 0;\n\n private readonly scrollContainer = viewChild<ElementRef<HTMLElement>>('scrollContainer');\n private readonly messageCount = computed(() => this.agent().messages().length);\n private prevMessageCount = 0;\n private wasLoading = false;\n protected readonly pinned = signal<boolean>(true);\n private programmaticScrollCount = 0;\n private static readonly PIN_TOLERANCE_PX = 150;\n\n /**\n * True iff there's a current (last-index) assistant message that's\n * still streaming. The bubble's own caret already signals loading;\n * we suppress the floor typing-indicator in that case so the user\n * doesn't see two loading affordances at once.\n *\n * Matches the same `streaming + current` condition the bubble uses\n * to enable `.chat-message__caret`:\n * `agent().isLoading() && i === agent().messages().length - 1`\n * `i === agent().messages().length - 1`\n *\n * Restricted to assistant role because the caret only renders on\n * assistant bubbles (`:host([data-role=\"assistant\"][data-current=...\n * ][data-streaming=...])`).\n */\n protected readonly currentAssistantStreaming = computed(() => {\n if (!this.agent().isLoading()) return false;\n const msgs = this.agent().messages();\n if (msgs.length === 0) return false;\n const last = msgs[msgs.length - 1];\n return last?.role === 'assistant';\n });\n\n constructor() {\n // Inject the chat lib's root CSS custom properties (--ngaf-chat-bg,\n // --ngaf-chat-surface, --ngaf-chat-radius-input, etc.) the first\n // time any chat composition is constructed. The module-eval side\n // effect that previously handled this is unreliable under\n // aggressive production tree-shaking — bundlers that don't see\n // the source `chat-tokens.ts` path in the published artifact's\n // `sideEffects` glob drop the call entirely, leaving consumers\n // with zero token defaults (sidenav has no width, input has no\n // border, chips have no chrome — everything renders as plain\n // text on the page background). Calling from a constructor that\n // is unconditionally reachable from user code defeats that\n // tree-shaking and is idempotent. */\n ensureChatRootStyles();\n effect(() => {\n if (this.eventsSubscribed) return;\n let agent: ReturnType<typeof this.agent>;\n try { agent = this.agent(); } catch { return; }\n this.eventsSubscribed = true;\n this.lifecycle._internal.componentReady.set(true);\n agent.events$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n if (event.type !== 'state_update') return;\n const store = this.resolvedStore();\n if (!store) return;\n store.update(event.data);\n });\n });\n\n // Sync the agent STATE signal into the render store. AG-UI delivers\n // backend data as agent shared state (STATE_SNAPSHOT/STATE_DELTA); other\n // adapters expose graph state via the same `state()` signal. The render\n // store keys are JSON pointers, so map each top-level state key `k` to\n // `/k`. Exclude `messages` (carried in the snapshot but irrelevant to the\n // render store and large). Fires for any adapter whose `state()` carries\n // non-message keys; no-op when no render store is active. Coexists with\n // the events$ `state_update` path above (both merge into the same store).\n effect(() => {\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n const stateFn = (agentRef as unknown as { state?: () => unknown }).state;\n if (typeof stateFn !== 'function') return;\n const state = stateFn.call(agentRef);\n const store = this.resolvedStore();\n if (!store || state == null || typeof state !== 'object' || Array.isArray(state)) return;\n const updates: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(state as Record<string, unknown>)) {\n if (k === 'messages') continue;\n updates['/' + k] = v;\n }\n if (Object.keys(updates).length > 0) store.update(updates);\n });\n\n // Spec 4: flip CHAT_LIFECYCLE.firstMessageSent when the agent's stream\n // starts, regardless of submit path (input-bound, programmatic, suggestion-\n // click). Sticky — guarded so we never re-set a flag that's already true.\n // `lifecycle` is not on the base Agent contract; adapters like @threadplane/langgraph\n // attach it. Duck-type the read so non-lifecycle agents are a no-op.\n effect(() => {\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n const lc = (agentRef as unknown as { lifecycle?: { streamStartedAt?: () => number | null } }).lifecycle;\n const streamStartedAt = lc?.streamStartedAt?.();\n if (streamStartedAt != null && !this.lifecycle._internal.firstMessageSent()) {\n this.lifecycle._internal.firstMessageSent.set(true);\n }\n });\n\n // Auto-scroll-to-bottom. Fires on every signal update during streaming\n // (each token mutates the last message's content), so this MUST be cheap\n // and idempotent. Earlier this used scrollTo({ behavior: 'smooth' }) per\n // token, which queues overlapping smooth-scroll animations (~12/sec)\n // and produces visibly jerky scroll. Direct `scrollTop = scrollHeight`\n // is instant, free, and only repaints when the value actually changes.\n effect(() => {\n let count: number;\n let msgs: ReturnType<ReturnType<typeof this.agent>['messages']>;\n try { count = this.messageCount(); msgs = this.agent().messages(); } catch { return; }\n const lastContent = msgs.length > 0 ? (msgs[msgs.length - 1] as unknown as Record<string, unknown>)['content'] : undefined;\n void lastContent;\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n const isNewMessage = count !== this.prevMessageCount;\n this.prevMessageCount = count;\n if (isNewMessage || this.pinned()) {\n this.programmaticScrollCount++;\n el.scrollTop = el.scrollHeight;\n requestAnimationFrame(() => { this.programmaticScrollCount--; });\n if (isNewMessage) untracked(() => this.pinned.set(true));\n }\n });\n\n // Final scroll when streaming completes. The content-mutation effect above\n // fires on every token but stops when streaming ends; action buttons\n // (reload, copy) render on idle and can land below the fold without this.\n effect(() => {\n let loading: boolean;\n try { loading = this.agent().isLoading(); } catch { return; }\n if (loading) {\n this.wasLoading = true;\n return;\n }\n if (!this.wasLoading) return;\n this.wasLoading = false;\n if (this.pinned()) {\n // Defer one frame so message-actions have rendered.\n requestAnimationFrame(() => {\n const el2 = this.scrollContainer()?.nativeElement;\n if (!el2) return;\n this.programmaticScrollCount++;\n el2.scrollTop = el2.scrollHeight;\n requestAnimationFrame(() => { this.programmaticScrollCount--; });\n });\n }\n });\n\n // Subscribe to a2ui-partial custom events from the LangGraph backend.\n // Each event delivers a cumulative args string keyed by tool_call_id;\n // bridge.push() re-parses and dispatches new envelopes incrementally.\n // The runtime-neutral Agent contract does not require a customEvents\n // signal, so we feature-detect: adapters that expose it (e.g.\n // LangGraphAgent's customEvents signal) light up live streaming;\n // others continue to use the wrapped final-message classifier path.\n effect(() => {\n let agent: ReturnType<typeof this.agent>;\n try { agent = this.agent(); } catch { return; }\n const customSig = (agent as unknown as {\n customEvents?: () => readonly { name: string; data: unknown }[];\n }).customEvents;\n if (typeof customSig !== 'function') return;\n const events = customSig();\n for (let i = this.partialEventsLastIndex; i < events.length; i++) {\n const e = events[i];\n if (e.name !== 'a2ui-partial') continue;\n const d = e.data as { tool_call_id?: string; args_so_far?: string } | null;\n if (!d || typeof d.tool_call_id !== 'string' || typeof d.args_so_far !== 'string') continue;\n this.partialBridge.push(d.tool_call_id, d.args_so_far);\n }\n this.partialEventsLastIndex = events.length;\n });\n\n // Connect the client-tools coordinator to the agent. connect() ships the\n // tool catalog, starts the function-tool executor, and installs the view\n // auto-ack effect. Those installs create effect()s of their own, which\n // Angular forbids from *within* a running effect (NG0602). So this effect\n // only detects readiness (both coordinator + agent present) and defers the\n // actual connect() to a microtask that runs OUTSIDE the reactive context,\n // re-entering the component's injection context so the coordinator's\n // effects bind to this component's lifecycle. `connected` guards against\n // re-running per coordinator identity (a new clientTools registry yields a\n // new coordinator and re-connects; the old one's effects are abandoned).\n let connected: unknown;\n effect(() => {\n const coord = this.coordinator();\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n if (!coord || !agentRef) return;\n if (connected === coord) return;\n connected = coord;\n queueMicrotask(() => {\n runInInjectionContext(this.injector, () => coord.connect(agentRef));\n });\n });\n\n effect(() => {\n // janitor: drop classifiers for messages no longer in the agent's list\n let liveIds: Set<string>;\n try {\n liveIds = new Set<string>();\n for (const m of this.agent().messages()) {\n const id = (m as unknown as { id?: string }).id;\n if (id) liveIds.add(id);\n }\n } catch { return; }\n for (const key of [...this.classifiers.keys()]) {\n if (!liveIds.has(key)) {\n this.classifiers.get(key)?.dispose();\n this.classifiers.delete(key);\n }\n }\n });\n }\n\n prevRole(index: number): ChatMessageRole | undefined {\n if (index === 0) return undefined;\n const prev = this.agent().messages()[index - 1];\n if (!prev) return undefined;\n const role = (prev as unknown as { role?: string }).role;\n if (role === 'user') return 'user';\n if (role === 'assistant') return 'assistant';\n if (role === 'system') return 'system';\n if (role === 'tool') return 'tool';\n return undefined;\n }\n\n protected onScroll(): void {\n if (this.programmaticScrollCount > 0) return;\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n const nextPinned = isPinned(el.scrollHeight, el.scrollTop, el.clientHeight, ChatComponent.PIN_TOLERANCE_PX);\n if (nextPinned !== this.pinned()) this.pinned.set(nextPinned);\n }\n\n protected onScrollBubbleClick(): void {\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n this.programmaticScrollCount++;\n el.scrollTop = el.scrollHeight;\n requestAnimationFrame(() => { this.programmaticScrollCount--; });\n this.pinned.set(true);\n }\n\n protected onUserSubmitted(): void {\n this.pinned.set(true);\n this.recordSubmit();\n }\n\n /**\n * Programmatic submit. Calls `agent.submit({ message: text })` and updates\n * the CHAT_LIFECYCLE signals. Trimmed-empty text is a no-op.\n */\n submitMessage(text: string): void {\n const trimmed = text.trim();\n if (!trimmed) return;\n void this.agent().submit({ message: trimmed });\n this.recordSubmit();\n }\n\n /**\n * Clears local view state (classifiers, surface store, lifecycle counters)\n * for a new thread.\n *\n * Resets messageCount to 0 and inputSubmittedAt to null. componentReady and\n * firstMessageSent are NOT reset (sticky for the chat instance lifetime).\n */\n clearThread(): void {\n this.clearClassifiers();\n this.lifecycle._internal.messageCount.set(0);\n this.lifecycle._internal.inputSubmittedAt.set(null);\n }\n\n private recordSubmit(): void {\n if (!this.lifecycle._internal.firstMessageSent()) {\n this.lifecycle._internal.firstMessageSent.set(true);\n }\n this.lifecycle._internal.messageCount.update((c) => c + 1);\n this.lifecycle._internal.inputSubmittedAt.set(Date.now());\n }\n\n /**\n * Look up the previous message in the agent's messages list.\n * Returns undefined for the first message.\n */\n protected prevMessage(index: number): unknown {\n if (index === 0) return undefined;\n return this.agent().messages()[index - 1];\n }\n\n /**\n * True when this assistant message is part of a GenUI render turn.\n * Walks backward through messages from `index` until it finds either\n * an assistant message with `tool_calls` referencing a GenUI tool\n * (→ this turn produces a surface) or a human message (→ the\n * preceding turn ended; this assistant message stands on its own).\n *\n * Also checks the message itself for:\n * - `extra.tool_calls[].name` matching a GenUI tool (post-streaming\n * state of the tool-call AI message), OR\n * - `extra.content[].type === 'function_call' && .name` matching\n * (live during the OpenAI Responses-API streaming chunks before\n * `tool_calls` populates).\n *\n * The walk-back approach is robust to LangGraph's in-place\n * replacement of the ToolMessage (which strips the `name` field),\n * unlike a single prev-message check.\n */\n protected isGenuiTurn(message: unknown, _prevMsg: unknown, index?: number): boolean {\n const names = new Set(this.genuiToolNames());\n const m = message as { extra?: Record<string, unknown> } | null | undefined;\n if (!m) return false;\n\n // Direct check on the message itself (covers the tool-call AI message).\n const calls = (m.extra?.['tool_calls'] as Array<{ name?: string }> | undefined) ?? [];\n if (calls.some(c => c.name != null && names.has(c.name))) return true;\n\n const rawContent = m.extra?.['content'];\n if (Array.isArray(rawContent)) {\n for (const block of rawContent) {\n if (block != null\n && typeof block === 'object'\n && (block as { type?: unknown }).type === 'function_call'\n && typeof (block as { name?: unknown }).name === 'string'\n && names.has((block as { name: string }).name)) {\n return true;\n }\n }\n }\n\n // Content-shape detector: during streaming, LangGraph projects the\n // sub-LLM's tool_call.arguments as the assistant message's content\n // string (NOT as a structured array). The structured array form\n // only materialises after streaming completes. So during streaming,\n // we see the JSON envelopes flowing in as text — neither tool_calls\n // nor content[].function_call are populated. Detect via stable\n // A2UI/json-render markers in the content string.\n const projectedContent = (m as { content?: unknown }).content;\n if (typeof projectedContent === 'string' && projectedContent.length > 0) {\n // A2UI v1 envelope keys (canonical Google shape).\n if (projectedContent.includes('\"surfaceUpdate\"')\n || projectedContent.includes('\"beginRendering\"')\n || projectedContent.includes('\"dataModelUpdate\"')) {\n return true;\n }\n // json-render spec shape — looks like `{ \"root\": \"...\", \"elements\": ... }`.\n if (projectedContent.includes('\"root\"') && projectedContent.includes('\"elements\"')) {\n return true;\n }\n }\n\n // Direct prev-message check (fast path for the well-formed case\n // where the immediately-preceding tool message still has its name).\n const p = _prevMsg as { role?: string; name?: string; extra?: Record<string, unknown> } | null | undefined;\n if (p && p.role === 'tool') {\n const toolName = (p.extra?.['name'] as string | undefined) ?? p.name;\n if (typeof toolName === 'string' && names.has(toolName)) return true;\n }\n\n // Walk backward through messages for the emit-phase assistant\n // message whose own structure has no GenUI hint. Bounded by the\n // most recent human message (= start of the current turn).\n if (typeof index === 'number' && index > 0) {\n const msgs = this.agent().messages();\n for (let i = index - 1; i >= 0; i--) {\n const prev = msgs[i] as { role?: string; extra?: Record<string, unknown> };\n if (!prev) break;\n if (prev.role === 'user') break; // crossed the turn boundary\n\n const prevCalls = (prev.extra?.['tool_calls'] as Array<{ name?: string }> | undefined) ?? [];\n if (prevCalls.some(c => c.name != null && names.has(c.name))) return true;\n\n const prevRaw = prev.extra?.['content'];\n if (Array.isArray(prevRaw)) {\n for (const block of prevRaw) {\n if (block != null\n && typeof block === 'object'\n && (block as { type?: unknown }).type === 'function_call'\n && typeof (block as { name?: unknown }).name === 'string'\n && names.has((block as { name: string }).name)) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n }\n\n classifyMessage(content: string, message: { id?: string }): ContentClassifier {\n const id = message.id ?? '';\n let c = this.classifiers.get(id);\n if (!c) {\n c = createContentClassifier();\n this.classifiers.set(id, c);\n }\n c.update(content);\n return c;\n }\n\n clearClassifiers(): void {\n for (const [, c] of this.classifiers) {\n c.dispose();\n }\n this.classifiers.clear();\n }\n\n onSpecEvent(event: RenderEvent, messageIndex: number): void {\n this.renderEvent.emit({ messageIndex, event });\n }\n\n /**\n * Forwards a render event bubbled up from a `<chat-tool-views>` component\n * (a client-declared `view`/`ask` tool's rendered UI) to the client-tools\n * coordinator. The coordinator resolves the matching pending `ask` tool call\n * when the event is a `result`. No-op when no client tools are wired.\n */\n protected onClientToolEvent(event: RenderEvent): void {\n const coord = this.coordinator();\n if (!coord) return;\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n coord.handleRenderEvent(agentRef, event);\n }\n\n onA2uiAction(message: A2uiActionMessage): void {\n void this.agent().submit({ message: JSON.stringify(message) });\n }\n\n onA2uiEvent(event: RenderEvent, messageIndex: number, surfaceId: string): void {\n this.renderEvent.emit({ messageIndex, surfaceId, event });\n }\n\n /** Regenerate the assistant response at the given message index. */\n onRegenerate(messageIndex: number): void {\n void this.agent().regenerate(messageIndex);\n this.regenerate.emit();\n }\n\n onRate(message: unknown, value: 'up' | 'down'): void {\n const idx = this.agent().messages().indexOf(message as never);\n this.rate.emit({ messageIndex: idx, rating: value });\n }\n\n onCopy(message: unknown, content: string): void {\n const idx = this.agent().messages().indexOf(message as never);\n this.messageCopy.emit({ messageIndex: idx, content });\n }\n\n}\n","// libs/chat/src/lib/compositions/chat-popup/chat-popup.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, model, DestroyRef, inject, DOCUMENT, effect } from '@angular/core';\nimport type { Agent } from '../../agent';\nimport type { ViewRegistry } from '@threadplane/render';\nimport type { ClientToolRegistry } from '../../client-tools/tool-def';\nimport { ChatComponent } from '../chat/chat.component';\nimport type { ChatSelectOption } from '../../primitives/chat-select/chat-select.component';\nimport { ChatLauncherButtonComponent } from '../../primitives/chat-launcher-button/chat-launcher-button.component';\nimport { CHAT_HOST_TOKENS, ensureChatRootStyles } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-popup',\n standalone: true,\n imports: [ChatComponent, ChatLauncherButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { position: fixed; bottom: 1rem; right: 1rem; z-index: var(--ngaf-chat-z-overlay-content, 30); }\n .chat-popup__launcher { position: relative; }\n .chat-popup__window {\n position: fixed;\n bottom: 5rem;\n right: 1rem;\n width: 24rem;\n height: 600px;\n max-height: calc(100vh - 6rem);\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 0.75rem;\n box-shadow: 0 5px 40px rgba(0,0,0,.16);\n transform-origin: bottom right;\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n pointer-events: none;\n transition: transform 200ms ease-out, opacity 100ms ease-out;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .chat-popup__window[data-open=\"true\"] {\n transform: scale(1) translateY(0);\n opacity: 1;\n pointer-events: auto;\n }\n @media (max-width: 640px) {\n .chat-popup__window { inset: 0; width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; bottom: auto; right: auto; }\n }\n .chat-popup__close {\n position: absolute; top: 8px; right: 8px;\n width: 32px; height: 32px;\n background: transparent; border: 0; cursor: pointer;\n color: var(--ngaf-chat-text-muted);\n border-radius: 50%;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .chat-popup__close:hover { background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text); }\n `],\n template: `\n <div class=\"chat-popup__launcher\">\n <chat-launcher-button (clicked)=\"toggle()\" />\n </div>\n <div class=\"chat-popup__window\" [attr.data-open]=\"open() ? 'true' : 'false'\" role=\"dialog\" aria-modal=\"false\">\n <button type=\"button\" class=\"chat-popup__close\" (click)=\"closeWindow()\" aria-label=\"Close chat\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n <chat\n [agent]=\"agent()\"\n [views]=\"views()\"\n [clientTools]=\"clientTools()\"\n [modelOptions]=\"modelOptions()\"\n [showModelPicker]=\"showModelPicker()\"\n [selectedModel]=\"selectedModel()\"\n (selectedModelChange)=\"selectedModel.set($event)\"\n >\n <ng-content select=\"[chatHeader]\" chatHeader />\n <ng-content select=\"[chatWelcomeSuggestions]\" chatWelcomeSuggestions />\n </chat>\n </div>\n `,\n})\nexport class ChatPopupComponent {\n readonly agent = input.required<Agent>();\n /** A2UI component catalog forwarded to the inner <chat>. Without it,\n * messages classified as A2UI parse correctly but never mount a\n * surface. Pass `a2uiBasicCatalog()` from `@threadplane/chat`. */\n readonly views = input<ViewRegistry | undefined>(undefined);\n /** Frontend-declared client tools forwarded to the inner `<chat>`. */\n readonly clientTools = input<ClientToolRegistry | undefined>(undefined);\n /** Forwarded to the inner <chat>. When non-empty, a model picker pill\n * renders in the chat-input chrome. */\n readonly modelOptions = input<readonly ChatSelectOption[]>([]);\n /**\n * Forwarded to the inner `<chat>`. When `false`, hides the\n * auto-rendered model picker even with non-empty `modelOptions`.\n * Use this in narrow surfaces (the chat-sidebar panel is 28rem\n * wide; chat-popup is 24rem) where the picker crowds the input.\n * Defaults to `true`.\n */\n readonly showModelPicker = input<boolean>(true);\n /** Two-way bound current model value. */\n readonly selectedModel = model<string>('');\n readonly open = model(false);\n /**\n * Keyboard shortcut (single key) that toggles the popup with cmd (mac)\n * or ctrl (other). Set to `null` to disable. Default: 'k' — matches the\n * widely-used cmd/ctrl+K convention.\n */\n readonly shortcut = input<string | null>('k');\n /** Close the popup on Escape (default true). */\n readonly closeOnEscape = input<boolean>(true);\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n\n constructor() {\n // Inject chat lib root CSS custom properties — see ChatComponent\n // for the full rationale. Idempotent + lifecycle-guaranteed.\n ensureChatRootStyles();\n effect(() => {\n // Re-bind whenever shortcut/closeOnEscape change.\n const shortcut = this.shortcut();\n const closeOnEscape = this.closeOnEscape();\n const win = this.document.defaultView;\n if (!win) return;\n const isMac = /Mac|iPhone|iPad/i.test(win.navigator.platform || win.navigator.userAgent);\n const handler = (e: KeyboardEvent): void => {\n if (shortcut && e.key.toLowerCase() === shortcut.toLowerCase() && (isMac ? e.metaKey : e.ctrlKey)) {\n e.preventDefault();\n this.toggle();\n return;\n }\n if (closeOnEscape && this.open() && e.key === 'Escape') {\n this.closeWindow();\n }\n };\n win.addEventListener('keydown', handler);\n this.destroyRef.onDestroy(() => win.removeEventListener('keydown', handler));\n });\n }\n\n toggle(): void { this.open.update((v) => !v); }\n openWindow(): void { this.open.set(true); }\n closeWindow(): void { this.open.set(false); }\n}\n","// libs/chat/src/lib/compositions/chat-sidebar/chat-sidebar.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n DOCUMENT,\n effect,\n inject,\n input,\n model,\n} from '@angular/core';\nimport type { Agent } from '../../agent';\nimport type { ViewRegistry } from '@threadplane/render';\nimport type { ClientToolRegistry } from '../../client-tools/tool-def';\nimport { ChatComponent } from '../chat/chat.component';\nimport { ChatLauncherButtonComponent } from '../../primitives/chat-launcher-button/chat-launcher-button.component';\nimport type { ChatSelectOption } from '../../primitives/chat-select/chat-select.component';\nimport { CHAT_HOST_TOKENS, ensureChatRootStyles } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-sidebar',\n standalone: true,\n imports: [ChatComponent, ChatLauncherButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-push]': 'pushContent() ? \"true\" : \"false\"',\n '[attr.data-open]': 'open() ? \"true\" : \"false\"',\n },\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; }\n .chat-sidebar__content { transition: margin-right 300ms ease; min-height: 100vh; }\n :host([data-push=\"true\"][data-open=\"true\"]) .chat-sidebar__content { margin-right: 28rem; }\n @media (max-width: 640px) {\n :host([data-push=\"true\"][data-open=\"true\"]) .chat-sidebar__content { margin-right: 0; }\n }\n .chat-sidebar__panel {\n position: fixed;\n top: 0; right: 0;\n bottom: var(--ngaf-chat-debug-claim-bottom, 0);\n width: 28rem;\n background: var(--ngaf-chat-bg);\n border-left: 1px solid var(--ngaf-chat-separator);\n box-shadow: -8px 0 32px rgba(0,0,0,.08);\n transform: translateX(100%);\n transition: transform 200ms ease-out, bottom 200ms ease-out;\n z-index: var(--ngaf-chat-z-overlay-content, 30);\n display: flex;\n flex-direction: column;\n }\n .chat-sidebar__panel[data-open=\"true\"] { transform: translateX(0); }\n @media (max-width: 640px) {\n .chat-sidebar__panel { width: 100vw; }\n }\n .chat-sidebar__panel-header {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--ngaf-chat-separator);\n min-height: 48px;\n }\n .chat-sidebar__panel-title {\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--ngaf-chat-text);\n font-weight: 500;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-sidebar__close {\n flex: 0 0 auto;\n width: 32px; height: 32px;\n background: transparent; border: 0; cursor: pointer;\n color: var(--ngaf-chat-text-muted);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .chat-sidebar__close:hover { background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text); }\n .chat-sidebar__launcher {\n position: fixed;\n bottom: calc(1rem + var(--ngaf-chat-debug-claim-bottom, 0));\n right: 1rem;\n z-index: var(--ngaf-chat-z-overlay-content, 30);\n transition: bottom 200ms ease-out;\n }\n /* Hide the launcher when the sidebar is open — the close button on the\n panel handles dismissal, and the panel covers the launcher anyway. */\n :host([data-open=\"true\"]) .chat-sidebar__launcher { display: none; }\n `],\n template: `\n <div class=\"chat-sidebar__content\"><ng-content /></div>\n <div class=\"chat-sidebar__launcher\">\n <chat-launcher-button (clicked)=\"toggle()\" />\n </div>\n <aside class=\"chat-sidebar__panel\" [attr.data-open]=\"open() ? 'true' : 'false'\" role=\"complementary\" [attr.aria-hidden]=\"open() ? 'false' : 'true'\">\n <div class=\"chat-sidebar__panel-header\">\n <div class=\"chat-sidebar__panel-title\">\n <ng-content select=\"[chatSidebarPanelTitle]\" />\n </div>\n <button type=\"button\" class=\"chat-sidebar__close\" (click)=\"closeWindow()\" aria-label=\"Close chat\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n <chat\n [agent]=\"agent()\"\n [views]=\"views()\"\n [clientTools]=\"clientTools()\"\n [modelOptions]=\"modelOptions()\"\n [showModelPicker]=\"showModelPicker()\"\n [selectedModel]=\"selectedModel()\"\n (selectedModelChange)=\"selectedModel.set($event)\"\n >\n <ng-content select=\"[chatHeader]\" chatHeader />\n <ng-content select=\"[chatWelcomeSuggestions]\" chatWelcomeSuggestions />\n </chat>\n </aside>\n `,\n})\nexport class ChatSidebarComponent {\n readonly agent = input.required<Agent>();\n /** A2UI component catalog forwarded to the inner <chat>. Without it,\n * messages classified as A2UI parse correctly but never mount a\n * surface. Pass `a2uiBasicCatalog()` from `@threadplane/chat`. */\n readonly views = input<ViewRegistry | undefined>(undefined);\n /** Frontend-declared client tools forwarded to the inner `<chat>`. */\n readonly clientTools = input<ClientToolRegistry | undefined>(undefined);\n /** Forwarded to the inner <chat>. When non-empty, a model picker pill\n * renders in the chat-input chrome. */\n readonly modelOptions = input<readonly ChatSelectOption[]>([]);\n /**\n * Forwarded to the inner `<chat>`. When `false`, hides the\n * auto-rendered model picker even with non-empty `modelOptions`.\n * Use this in narrow surfaces (the chat-sidebar panel is 28rem\n * wide; chat-popup is 24rem) where the picker crowds the input.\n * Defaults to `true`.\n */\n readonly showModelPicker = input<boolean>(true);\n /** Two-way bound current model value. */\n readonly selectedModel = model<string>('');\n readonly open = model(false);\n /** Close the sidebar on Escape (default true). */\n readonly closeOnEscape = input<boolean>(true);\n readonly pushContent = input<boolean>(false);\n\n private readonly document = inject(DOCUMENT);\n\n constructor() {\n // Inject chat lib root CSS custom properties — see ChatComponent\n // for the full rationale. Idempotent + lifecycle-guaranteed.\n ensureChatRootStyles();\n // Publish the right-edge claim while the panel is open. Peer panels\n // (e.g. chat-debug) read --ngaf-chat-occupy-right to leave room.\n effect(() => {\n if (typeof document === 'undefined') return;\n const html = document.documentElement;\n if (this.open()) {\n html.dataset['threadplaneChatSidebar'] = 'open';\n } else {\n delete html.dataset['threadplaneChatSidebar'];\n }\n });\n effect((onCleanup) => {\n const closeOnEscape = this.closeOnEscape();\n const win = this.document.defaultView;\n if (!win) return;\n const handler = (e: KeyboardEvent): void => {\n if (closeOnEscape && this.open() && e.key === 'Escape') {\n this.closeWindow();\n }\n };\n win.addEventListener('keydown', handler);\n onCleanup(() => win.removeEventListener('keydown', handler));\n });\n }\n\n toggle(): void { this.open.update((v) => !v); }\n openWindow(): void { this.open.set(true); }\n closeWindow(): void { this.open.set(false); }\n}\n","// libs/chat/src/lib/compositions/chat-timeline-slider/chat-timeline-slider.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, computed, input, output, signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { AgentWithHistory, AgentCheckpoint } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-timeline-slider',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; padding: var(--ngaf-chat-space-2); }\n .timeline-slider__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 var(--ngaf-chat-space-1) var(--ngaf-chat-space-2);\n }\n .timeline-slider__title {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--ngaf-chat-text-muted);\n margin: 0;\n }\n .timeline-slider__count {\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text-muted);\n }\n .timeline-slider__empty {\n text-align: center;\n padding: var(--ngaf-chat-space-4);\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-xs);\n }\n .timeline-slider__list {\n list-style: none;\n padding-left: 12px;\n margin: 0;\n border-left: 1px solid var(--ngaf-chat-separator);\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .timeline-slider__entry {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n margin-left: -1px;\n border-left: 2px solid transparent;\n border-radius: var(--ngaf-chat-radius-button);\n cursor: default;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n transition: background 150ms ease;\n }\n .timeline-slider__entry:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 5%, transparent); }\n .timeline-slider__entry[data-active=\"true\"] {\n border-left-color: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-text);\n }\n .timeline-slider__index {\n width: 22px;\n height: 22px;\n border-radius: 9999px;\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text-muted);\n font-size: 11px;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .timeline-slider__entry[data-active=\"true\"] .timeline-slider__index {\n background: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-on-primary);\n }\n .timeline-slider__body { flex: 1; min-width: 0; }\n .timeline-slider__label {\n font-weight: 500;\n color: var(--ngaf-chat-text);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .timeline-slider__id {\n font-family: var(--ngaf-chat-font-mono);\n font-size: 11px;\n color: var(--ngaf-chat-text-muted);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .timeline-slider__actions { display: flex; gap: 4px; flex-shrink: 0; }\n .timeline-slider__btn {\n padding: 2px 8px;\n font-size: var(--ngaf-chat-font-size-xs);\n border-radius: var(--ngaf-chat-radius-button);\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n border: 0;\n cursor: pointer;\n transition: background 150ms ease;\n }\n .timeline-slider__btn:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 8%, transparent); }\n `],\n template: `\n <div class=\"timeline-slider__header\">\n <h3 class=\"timeline-slider__title\">Timeline</h3>\n <span class=\"timeline-slider__count\">{{ history().length }} checkpoint(s)</span>\n </div>\n\n @if (history().length === 0) {\n <p class=\"timeline-slider__empty\">No checkpoints yet.</p>\n } @else {\n <ul class=\"timeline-slider__list\">\n @for (cp of history(); track $index; let i = $index) {\n <li\n class=\"timeline-slider__entry\"\n [attr.data-active]=\"i === selectedIndex() ? 'true' : null\"\n >\n <span class=\"timeline-slider__index\">{{ i + 1 }}</span>\n <div class=\"timeline-slider__body\">\n <p class=\"timeline-slider__label\">{{ cp.label ?? 'Step ' + (i + 1) }}</p>\n @if (cp.id) {\n <p class=\"timeline-slider__id\">{{ cp.id }}</p>\n }\n </div>\n <div class=\"timeline-slider__actions\">\n <button type=\"button\" class=\"timeline-slider__btn\" title=\"Replay from this checkpoint\" (click)=\"replay(cp)\">Replay</button>\n <button type=\"button\" class=\"timeline-slider__btn\" title=\"Fork from this checkpoint\" (click)=\"fork(cp, i)\">Fork</button>\n </div>\n </li>\n }\n </ul>\n }\n `,\n})\nexport class ChatTimelineSliderComponent {\n readonly agent = input.required<AgentWithHistory>();\n\n readonly selectedIndex = signal<number>(-1);\n\n readonly history = computed<AgentCheckpoint[]>(() => this.agent().history());\n\n readonly replayRequested = output<string>();\n readonly forkRequested = output<string>();\n\n replay(cp: AgentCheckpoint): void {\n if (cp.id) this.replayRequested.emit(cp.id);\n }\n\n fork(cp: AgentCheckpoint, index: number): void {\n this.selectedIndex.set(index);\n if (cp.id) this.forkRequested.emit(cp.id);\n }\n}\n","// libs/chat/src/lib/styles/chat-sidenav.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_SIDENAV_STYLES = `\n /*\n * In expanded / collapsed modes the sidenav is \"always visible\" beside the\n * main content — the consumer reserves space with padding-left on the\n * layout container. The host must be position: fixed so it doesn't\n * participate in document flow; otherwise its display: block stretches\n * to the parent's full width and pushes siblings below the viewport.\n */\n :host {\n display: block;\n height: 100%;\n }\n :host([data-mode=\"expanded\"]),\n :host([data-mode=\"collapsed\"]) {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 100;\n }\n :host([data-mode=\"expanded\"]) {\n width: var(--ngaf-chat-sidenav-width-expanded);\n }\n :host([data-mode=\"collapsed\"]) {\n width: var(--ngaf-chat-sidenav-width-collapsed);\n }\n :host([data-mode=\"expanded\"]) .chat-sidenav {\n width: 100%;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav {\n width: 100%;\n }\n :host([data-mode=\"drawer\"]) {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: var(--ngaf-chat-sidenav-width-drawer);\n z-index: var(--ngaf-chat-z-drawer, 1001);\n }\n :host([data-mode=\"drawer\"][data-open=\"true\"]) {\n box-shadow: 8px 0 32px rgba(0, 0, 0, 0.18);\n }\n .chat-sidenav {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--ngaf-chat-bg);\n border-right: 1px solid var(--ngaf-chat-separator);\n box-sizing: border-box;\n overflow: hidden;\n }\n :host([data-mode=\"drawer\"]) .chat-sidenav {\n width: 100%;\n height: 100%;\n transition: transform 200ms ease;\n transform: translateX(-100%);\n }\n :host([data-mode=\"drawer\"][data-open=\"true\"]) .chat-sidenav {\n transform: translateX(0);\n }\n .chat-sidenav__header {\n flex-shrink: 0;\n padding: var(--ngaf-chat-space-3);\n }\n /* Collapse the header slot when the consumer doesn't project content\n * — matches the chat-window pattern. Avoids 24px of dead space above\n * the New chat button. */\n .chat-sidenav__header:empty { display: none; }\n .chat-sidenav__topbar {\n flex-shrink: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n padding: var(--ngaf-chat-space-2) var(--ngaf-chat-space-3);\n border-bottom: 1px solid var(--ngaf-chat-separator);\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__topbar {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: var(--ngaf-chat-space-2) 0;\n }\n .chat-sidenav__topbar .chat-sidenav__action--close {\n width: 36px;\n height: 36px;\n padding: 0;\n justify-content: center;\n flex: 0 0 auto;\n }\n .chat-sidenav__topbar .chat-sidenav__action--close .chat-sidenav__action-label {\n display: none;\n }\n .chat-sidenav__action--new {\n /* Geometry only — fill/color set by the late-cascade\n .chat-sidenav__action.chat-sidenav__action--new block. */\n border: 0;\n padding: 12px 18px;\n border-radius: 8px;\n font-size: var(--ngaf-chat-font-size-sm);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n width: 100%;\n }\n .chat-sidenav__action--new:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n /* Collapsed mode: shrink to 32×32 icon-only square. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--new {\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 10px;\n justify-content: center;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--new .chat-sidenav__action-label {\n display: none;\n }\n .chat-sidenav__actions {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: var(--ngaf-chat-space-3);\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__actions {\n align-items: center;\n padding: var(--ngaf-chat-space-2);\n }\n .chat-sidenav__action {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text);\n border-radius: 8px;\n cursor: pointer;\n font-family: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n font-weight: 400;\n text-align: left;\n }\n .chat-sidenav__action:hover { background: var(--ngaf-chat-surface-alt); }\n .chat-sidenav__action:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action {\n width: 36px;\n height: 36px;\n padding: 0;\n justify-content: center;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action-label {\n display: none;\n }\n /* Primary CTA pill — defined AFTER the generic .chat-sidenav__action\n rule so its background/padding/radius win the cascade with equal\n specificity. The earlier --new block above is kept for the\n collapsed-mode overrides (which are :host-prefixed, higher\n specificity, so they still apply). */\n .chat-sidenav__action.chat-sidenav__action--new {\n background: var(--ngaf-chat-text);\n color: var(--ngaf-chat-bg);\n border-radius: 8px;\n padding: 12px 18px;\n font-weight: 600;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-sidenav__action.chat-sidenav__action--new:hover {\n background: var(--ngaf-chat-text);\n filter: brightness(0.92);\n }\n .chat-sidenav__action-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n .chat-sidenav__primary,\n .chat-sidenav__sections {\n flex-shrink: 0;\n }\n .chat-sidenav__threads {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n .chat-sidenav__threads-heading {\n padding: 8px 12px 4px;\n font-size: 11px;\n color: var(--ngaf-chat-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__threads-heading {\n display: none;\n }\n .chat-sidenav__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-top: 1px solid var(--ngaf-chat-separator);\n gap: 8px;\n flex-shrink: 0;\n }\n .chat-sidenav__footer-left {\n display: flex;\n align-items: center;\n gap: 4px;\n min-height: 28px;\n }\n .chat-sidenav__debug {\n height: 28px;\n min-width: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n padding: 0 9px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 500;\n }\n .chat-sidenav__debug:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-sidenav__debug:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-sidenav__debug-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #22c55e;\n box-shadow: 0 0 8px color-mix(in srgb, #22c55e 60%, transparent);\n flex: 0 0 auto;\n }\n .chat-sidenav__debug-dot--streaming {\n animation: chat-sidenav-debug-pulse 1.2s ease-in-out infinite;\n }\n @keyframes chat-sidenav-debug-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.6; transform: scale(0.85); }\n }\n .chat-sidenav__footer-right {\n display: flex;\n align-items: center;\n gap: 4px;\n /* Push to the right edge even when the left container is empty. */\n margin-left: auto;\n }\n .chat-sidenav__toggle {\n width: 28px;\n height: 28px;\n border-radius: 8px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .chat-sidenav__toggle:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n /* Collapsed mode: footer becomes a vertical stack; debug stays visible. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer {\n flex-direction: column;\n align-items: center;\n padding: 10px 4px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer-left {\n display: flex;\n flex-direction: column;\n align-items: center;\n min-height: 28px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__debug {\n width: 28px;\n padding: 0;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__debug-label,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer-left > :not(.chat-sidenav__debug) {\n display: none;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer-right {\n flex-direction: column;\n }\n /* Legacy [sidenavAccount] slot: kept renderable but visually folded into\n the new footer. Existing consumers' content still projects; the slot\n just renders in the footer-right area visually. */\n .chat-sidenav__account {\n display: none;\n }\n .chat-sidenav__account:has(> *) {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .chat-sidenav__archived { flex-shrink: 0; }\n .chat-sidenav__archived-heading {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n text-align: left;\n cursor: pointer;\n }\n .chat-sidenav__archived-heading:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-sidenav__archived-heading:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-sidenav__archived-chevron {\n width: 12px;\n height: 12px;\n transition: transform 150ms ease;\n flex-shrink: 0;\n }\n .chat-sidenav__archived[data-open=\"true\"] .chat-sidenav__archived-chevron {\n transform: rotate(90deg);\n }\n .chat-sidenav__archived-empty {\n padding: 8px 12px;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__archived { display: none; }\n .chat-sidenav__projects { flex-shrink: 0; }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__projects { display: none; }\n\n /* Collapsed-mode thread row presentation: hide labels, kebab and grip;\n * surface the per-thread initial circle so the strip reads as a list of\n * threads rather than an empty column. */\n :host([data-mode=\"collapsed\"]) .chat-thread-list__initial {\n display: inline-flex;\n }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item-title { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item-time { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__kebab { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__grip { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item-wrap {\n justify-content: center;\n }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item {\n padding: 6px;\n justify-content: center;\n align-items: center;\n flex-direction: row;\n }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__new { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--search {\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 10px;\n justify-content: center;\n background: transparent;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--search .chat-sidenav__action-label {\n display: none;\n }\n /* Collapsed: thread list, project list, archived block, sections — all hidden. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__threads,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__projects,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__archived,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__sections,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__primary {\n display: none;\n }\n /* Collapsed: reduce horizontal padding so 32×32 buttons sit centered. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__topbar,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__actions {\n padding: 8px 4px;\n align-items: center;\n justify-content: center;\n }\n`;\n","// SPDX-License-Identifier: MIT\ndeclare const THREADPLANE_CHAT_DEBUG: boolean;\ndeclare const ngDevMode: boolean;\n\nexport const CHAT_DEBUG_INCLUDED =\n ngDevMode ||\n (typeof THREADPLANE_CHAT_DEBUG !== 'undefined' && THREADPLANE_CHAT_DEBUG === true);\n","// libs/chat/src/lib/compositions/chat-sidenav/chat-sidenav.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ComponentRef,\n DestroyRef,\n effect,\n Injector,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewContainerRef,\n type OutputRefSubscription,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SIDENAV_STYLES } from '../../styles/chat-sidenav.styles';\nimport {\n ChatThreadListComponent,\n type Thread,\n type ThreadActionAdapter,\n} from '../../primitives/chat-thread-list/chat-thread-list.component';\nimport {\n ChatProjectListComponent,\n type Project,\n type ProjectActionAdapter,\n} from '../../primitives/chat-project-list/chat-project-list.component';\nimport type { Agent, AgentWithHistory } from '../../agent';\nimport { CHAT_DEBUG_INCLUDED } from './chat-debug-gate';\n\nexport type ChatSidenavMode = 'expanded' | 'collapsed' | 'drawer';\ntype ChatDebugDock = 'right' | 'bottom' | 'left';\n\ninterface ChatDebugInstance {\n setOpen(value: boolean): void;\n setDock?(dock: ChatDebugDock): void;\n openChange?: {\n subscribe(callback: (open: boolean) => void): OutputRefSubscription;\n };\n dockChange?: {\n subscribe(callback: (dock: ChatDebugDock) => void): OutputRefSubscription;\n };\n}\n\n@Component({\n selector: 'chat-sidenav',\n standalone: true,\n imports: [ChatThreadListComponent, ChatProjectListComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-mode]': 'mode()',\n '[attr.data-open]': 'open() ? \"true\" : \"false\"',\n },\n styles: [CHAT_HOST_TOKENS, CHAT_SIDENAV_STYLES],\n template: `\n <nav\n class=\"chat-sidenav\"\n aria-label=\"Sidebar navigation\"\n tabindex=\"-1\"\n (keydown.escape)=\"onEscape()\"\n >\n <div class=\"chat-sidenav__header\">\n <ng-content select=\"[sidenavHeader]\" />\n </div>\n\n <div class=\"chat-sidenav__topbar\">\n <button\n type=\"button\"\n class=\"chat-sidenav__action chat-sidenav__action--new\"\n (click)=\"newChat.emit()\"\n aria-label=\"New chat\"\n title=\"New chat\"\n >\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n <span class=\"chat-sidenav__action-label\">New chat</span>\n </button>\n @if (mode() === 'drawer') {\n <button\n type=\"button\"\n class=\"chat-sidenav__action chat-sidenav__action--close\"\n (click)=\"openChange.emit(false)\"\n aria-label=\"Close conversations\"\n title=\"Close conversations\"\n >\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n <span class=\"chat-sidenav__action-label\">Close</span>\n </button>\n }\n </div>\n\n <div class=\"chat-sidenav__actions\">\n <button\n type=\"button\"\n class=\"chat-sidenav__action chat-sidenav__action--search\"\n (click)=\"searchOpened.emit()\"\n aria-label=\"Search conversations\"\n title=\"Search conversations (⌘K)\"\n >\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n <span class=\"chat-sidenav__action-label\">Search</span>\n </button>\n </div>\n\n <div class=\"chat-sidenav__primary\">\n <ng-content select=\"[sidenavPrimary]\" />\n </div>\n\n @if (projects() !== null) {\n <div class=\"chat-sidenav__projects\">\n <div class=\"chat-sidenav__threads-heading\">Projects</div>\n <chat-project-list\n [projects]=\"projects()!\"\n [activeProjectId]=\"selectedProjectId()\"\n [showNewProjectButton]=\"!!projectActions()?.create\"\n [actions]=\"projectActions()\"\n (projectSelected)=\"projectSelected.emit($event)\"\n (newProjectRequested)=\"newProjectRequested.emit()\"\n />\n </div>\n } @if (threads() !== null) {\n <div class=\"chat-sidenav__threads\">\n <div class=\"chat-sidenav__threads-heading\">Recent</div>\n <chat-thread-list\n [threads]=\"threads()!\"\n [activeThreadId]=\"activeThreadId() ?? ''\"\n [actions]=\"actions()\"\n [projects]=\"projects()\"\n (threadSelected)=\"threadSelected.emit($event)\"\n />\n </div>\n } @if (archivedThreads() !== null) {\n <div\n class=\"chat-sidenav__archived\"\n [attr.data-open]=\"archivedOpen() ? 'true' : 'false'\"\n >\n <button\n type=\"button\"\n class=\"chat-sidenav__archived-heading\"\n [attr.aria-expanded]=\"archivedOpen() ? 'true' : 'false'\"\n aria-controls=\"chat-sidenav__archived-list\"\n (click)=\"archivedOpen.set(!archivedOpen())\"\n >\n <svg\n class=\"chat-sidenav__archived-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n <span>Archived</span>\n </button>\n @if (archivedOpen()) {\n <div id=\"chat-sidenav__archived-list\">\n @if (archivedThreads()!.length === 0) {\n <div class=\"chat-sidenav__archived-empty\">\n No archived conversations.\n </div>\n } @else {\n <chat-thread-list\n mode=\"archived\"\n [threads]=\"archivedThreads()!\"\n [activeThreadId]=\"activeThreadId() ?? ''\"\n [actions]=\"actions()\"\n [projects]=\"projects()\"\n (threadSelected)=\"threadSelected.emit($event)\"\n />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"chat-sidenav__sections\">\n <ng-content select=\"[sidenavSections]\" />\n </div>\n\n <div class=\"chat-sidenav__footer\">\n <div class=\"chat-sidenav__footer-left\">\n @if (showDebugButton()) {\n <button\n type=\"button\"\n class=\"chat-sidenav__debug\"\n aria-label=\"Open chat devtools\"\n title=\"Open chat devtools\"\n (click)=\"openDebug($event)\"\n >\n <span\n class=\"chat-sidenav__debug-dot\"\n [class.chat-sidenav__debug-dot--streaming]=\"isDebugStreaming()\"\n aria-hidden=\"true\"\n ></span>\n @if (mode() !== 'collapsed') {\n <span class=\"chat-sidenav__debug-label\">Devtools</span>\n }\n </button>\n }\n <ng-content select=\"[sidenavFooterLeft]\" />\n </div>\n <div class=\"chat-sidenav__footer-right\">\n <ng-content select=\"[sidenavFooterRight]\" />\n @if (mode() !== 'drawer') {\n <button\n type=\"button\"\n class=\"chat-sidenav__toggle\"\n (click)=\"onCollapseToggle()\"\n [attr.aria-label]=\"\n mode() === 'collapsed' ? 'Expand sidenav' : 'Collapse sidenav'\n \"\n [attr.title]=\"\n (mode() === 'collapsed' ? 'Expand sidenav' : 'Collapse sidenav') +\n ' (⌘B)'\n \"\n >\n @if (mode() === 'collapsed') {\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n } @else {\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 6 9 12 15 18\" />\n </svg>\n }\n </button>\n }\n </div>\n <!-- Legacy slot kept for back-compat — see chat-sidenav.styles.ts for visibility rules -->\n <div class=\"chat-sidenav__account\">\n <ng-content select=\"[sidenavAccount]\" />\n </div>\n </div>\n </nav>\n <ng-container #debugHost />\n `,\n})\nexport class ChatSidenavComponent {\n readonly mode = input<ChatSidenavMode>('expanded');\n readonly open = input<boolean>(false);\n readonly threads = input<Thread[] | null>(null);\n readonly activeThreadId = input<string | null>(null);\n readonly actions = input<ThreadActionAdapter | null>(null);\n readonly archivedThreads = input<Thread[] | null>(null);\n readonly projects = input<Project[] | null>(null);\n readonly selectedProjectId = input<string | null>(null);\n readonly projectActions = input<ProjectActionAdapter | null>(null);\n readonly agent = input<Agent | AgentWithHistory | null>(null);\n readonly debug = input<boolean>(true);\n\n readonly newChat = output<void>();\n readonly threadSelected = output<string>();\n readonly searchOpened = output<void>();\n readonly openChange = output<boolean>();\n readonly modeChange = output<ChatSidenavMode>();\n readonly projectSelected = output<string>();\n readonly newProjectRequested = output<void>();\n\n protected readonly archivedOpen = signal<boolean>(false);\n protected readonly showDebugButton = computed(\n () => CHAT_DEBUG_INCLUDED && this.debug() && this.agent() !== null\n );\n protected readonly isDebugStreaming = computed(\n () => this.agent()?.status?.() === 'running'\n );\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly debugHost = viewChild('debugHost', {\n read: ViewContainerRef,\n });\n private debugRef: ComponentRef<ChatDebugInstance> | null = null;\n private debugOutputSubscriptions: OutputRefSubscription[] = [];\n private currentDebugDock: ChatDebugDock = 'right';\n\n constructor() {\n this.destroyRef.onDestroy(() => this.destroyDebug());\n\n effect(() => {\n const showDebug = this.showDebugButton();\n const agent = this.agent();\n if (!showDebug || !agent) {\n this.destroyDebug();\n return;\n }\n this.debugRef?.setInput('agent', agent);\n });\n\n fromEvent<KeyboardEvent>(window, 'keydown')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((e) => {\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key !== 'k' && key !== 'b') return;\n const t = e.target as HTMLElement | null;\n if (t) {\n const tag = t.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || t.isContentEditable)\n return;\n }\n if (key === 'k') {\n e.preventDefault();\n this.searchOpened.emit();\n return;\n }\n // Cmd/Ctrl+B: toggle expanded ↔ collapsed (no-op in drawer mode).\n if (this.mode() === 'drawer') return;\n e.preventDefault();\n this.modeChange.emit(\n this.mode() === 'collapsed' ? 'expanded' : 'collapsed'\n );\n });\n }\n\n protected openDebug(event: MouseEvent): void {\n event.stopPropagation();\n void this.ensureDebugPanel();\n }\n\n protected onEscape(): void {\n if (this.mode() === 'drawer' && this.open()) {\n this.openChange.emit(false);\n }\n }\n\n protected onCollapseToggle(): void {\n const m = this.mode();\n if (m === 'drawer') return;\n this.modeChange.emit(m === 'collapsed' ? 'expanded' : 'collapsed');\n }\n\n private async ensureDebugPanel(): Promise<void> {\n if (!CHAT_DEBUG_INCLUDED) {\n return;\n }\n if (!this.showDebugButton()) {\n this.destroyDebug();\n return;\n }\n const host = this.debugHost();\n const agent = this.agent();\n if (!host || !agent) return;\n\n if (!this.debugRef) {\n const { ChatDebugComponent } = await import('@threadplane/chat/debug');\n if (!this.showDebugButton()) return;\n this.debugRef = host.createComponent(ChatDebugComponent, {\n injector: this.injector,\n });\n this.debugRef.setInput('launcher', 'none');\n this.debugRef.setInput('storageKey', 'chat-sidenav-debug');\n const initialDock = this.defaultDebugDock();\n this.debugRef.setInput('dock', initialDock);\n const openSub = this.debugRef.instance.openChange?.subscribe((open) => {\n if (open) {\n this.setDebugEdgeClaim(this.currentDebugDock);\n } else {\n this.clearDebugEdgeClaim();\n }\n });\n const dockSub = this.debugRef.instance.dockChange?.subscribe((dock) => {\n this.currentDebugDock = dock;\n this.setDebugEdgeClaim(dock);\n });\n this.debugOutputSubscriptions = [\n openSub,\n dockSub,\n ].filter((sub): sub is OutputRefSubscription => !!sub);\n this.currentDebugDock = initialDock;\n this.setDebugEdgeClaim(initialDock);\n }\n\n this.debugRef.setInput('agent', agent);\n this.debugRef.instance.setOpen(true);\n this.debugRef.changeDetectorRef.detectChanges();\n if (this.currentDebugDock === 'bottom') {\n this.debugRef.instance.setDock?.('bottom');\n this.debugRef.changeDetectorRef.detectChanges();\n }\n this.setDebugEdgeClaim(this.currentDebugDock);\n }\n\n private destroyDebug(): void {\n for (const subscription of this.debugOutputSubscriptions) {\n subscription.unsubscribe();\n }\n this.debugOutputSubscriptions = [];\n this.debugRef?.destroy();\n this.debugRef = null;\n this.clearDebugEdgeClaim();\n }\n\n private defaultDebugDock(): ChatDebugDock {\n if (typeof document === 'undefined') return 'right';\n return document.querySelector('chat-sidebar') ? 'bottom' : 'right';\n }\n\n private setDebugEdgeClaim(dock: ChatDebugDock): void {\n if (typeof document === 'undefined') return;\n document.documentElement.dataset['threadplaneChatDebug'] = dock;\n }\n\n private clearDebugEdgeClaim(): void {\n if (typeof document === 'undefined') return;\n delete document.documentElement.dataset['threadplaneChatDebug'];\n }\n}\n","// libs/chat/src/lib/primitives/chat-sidenav-scrim/chat-sidenav-scrim.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n/**\n * Backdrop scrim for chat-sidenav's drawer mode, rendered as a sibling of\n * <chat-sidenav> so its z-index sits cleanly between the page content\n * and the drawer host (escapes the drawer host's stacking context).\n *\n * Usage:\n * <chat-sidenav-scrim [open]=\"drawerOpen()\" (dismiss)=\"drawerOpen.set(false)\" />\n * <chat-sidenav [(open)]=\"drawerOpen\" ...></chat-sidenav>\n */\n@Component({\n selector: 'chat-sidenav-scrim',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-sidenav-scrim__button\"\n aria-label=\"Close conversations\"\n (click)=\"dismiss.emit()\"\n ></button>\n }\n `,\n styles: [\n `\n :host { display: contents; }\n .chat-sidenav-scrim__button {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: var(--ngaf-chat-z-drawer-scrim, 1000);\n border: 0;\n padding: 0;\n cursor: pointer;\n }\n `,\n ],\n})\nexport class ChatSidenavScrimComponent {\n /** When true, render the backdrop button covering the viewport. */\n readonly open = input<boolean>(false);\n /** Fires when the user clicks the backdrop. */\n readonly dismiss = output<void>();\n}\n","// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { Agent } from '../../agent';\nimport type { AgentInterrupt } from '../../agent/agent-interrupt';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\nexport type InterruptAction = 'accept' | 'edit' | 'respond' | 'ignore';\n\n/**\n * Retrieves the current interrupt value from an Agent, or undefined when\n * the runtime does not expose interrupts.\n * Exported for unit testing without DOM rendering.\n */\nexport function getInterruptFromAgent(agent: Agent): AgentInterrupt | undefined {\n return agent.interrupt?.();\n}\n\n/**\n * Extracts a human-readable reason from an interrupt value. When the value\n * is an object with a string `reason` field, returns that directly. Falls\n * back to a JSON dump so consumers always see something rather than nothing.\n * Exported for unit testing.\n */\nexport function interruptReasonText(interrupt: AgentInterrupt | undefined): string {\n if (!interrupt) return '';\n const v = interrupt.value as { reason?: unknown } | undefined;\n if (v && typeof v === 'object' && typeof (v as { reason?: unknown }).reason === 'string') {\n return (v as { reason: string }).reason;\n }\n if (typeof v === 'string') return v;\n return JSON.stringify(v ?? '', null, 2);\n}\n\n@Component({\n selector: 'chat-interrupt-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n CHAT_HOST_TOKENS,\n `\n .chat-interrupt-panel {\n background: var(--ngaf-chat-surface);\n color: var(--ngaf-chat-text);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 14px 16px;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-interrupt-panel__eyebrow {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.12em;\n color: var(--ngaf-chat-warning-text);\n margin: 0 0 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .chat-interrupt-panel__dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--ngaf-chat-warning-text);\n flex: 0 0 6px;\n }\n .chat-interrupt-panel__body {\n margin: 0 0 12px;\n color: var(--ngaf-chat-text);\n white-space: pre-wrap;\n }\n .chat-interrupt-panel__actions {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n align-items: center;\n }\n .btn {\n border: 0;\n padding: 6px 14px;\n border-radius: var(--ngaf-chat-radius-button);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: transform 200ms ease, opacity 200ms ease;\n }\n .btn:hover { transform: scale(1.03); }\n .btn-primary { background: var(--ngaf-chat-primary); color: var(--ngaf-chat-on-primary); }\n .btn-secondary { background: transparent; color: var(--ngaf-chat-text); border: 1px solid var(--ngaf-chat-separator); }\n .btn-text {\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n padding: 6px 10px;\n }\n .btn-text:hover { color: var(--ngaf-chat-text); }\n `,\n ],\n template: `\n @if (interrupt()) {\n <div role=\"alert\" class=\"chat-interrupt-panel\">\n <p class=\"chat-interrupt-panel__eyebrow\">\n <span class=\"chat-interrupt-panel__dot\" aria-hidden=\"true\"></span>\n Agent paused — review needed\n </p>\n <p class=\"chat-interrupt-panel__body\">{{ interruptReason() }}</p>\n <div class=\"chat-interrupt-panel__actions\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"action.emit('accept')\">Accept</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"action.emit('edit')\">Edit</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"action.emit('respond')\">Respond</button>\n <button type=\"button\" class=\"btn btn-text\" (click)=\"action.emit('ignore')\">Ignore</button>\n </div>\n </div>\n }\n `,\n})\nexport class ChatInterruptPanelComponent {\n readonly agent = input.required<Agent>();\n\n readonly action = output<InterruptAction>();\n\n readonly interrupt = computed(() => getInterruptFromAgent(this.agent()));\n\n readonly interruptReason = computed(() => interruptReasonText(this.interrupt()));\n}\n","// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n TemplateRef,\n computed,\n contentChild,\n effect,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\nexport type ChatApprovalAction = 'approve' | 'edit' | 'cancel';\n\n@Component({\n selector: 'chat-approval-card',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n CHAT_HOST_TOKENS,\n `\n :host { display: contents; }\n dialog.chat-approval-card {\n width: 440px;\n max-width: calc(100vw - 32px);\n /* Center in the viewport. The UA stylesheet sets margin:auto on open\n modal dialogs, but our reset properties below shadow it. Re-assert. */\n margin: auto;\n padding: 0;\n border: 0;\n border-radius: 12px;\n background: var(--ngaf-chat-surface);\n color: var(--ngaf-chat-text);\n box-shadow: 0 20px 50px rgba(0,0,0,0.18);\n }\n dialog.chat-approval-card::backdrop {\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n }\n .chat-approval-card__header {\n padding: 14px 16px 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n border-bottom: 1px solid var(--ngaf-chat-separator);\n }\n .chat-approval-card__header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--ngaf-chat-text);\n }\n .chat-approval-card__header svg {\n color: var(--ngaf-chat-warning-text);\n width: 16px;\n height: 16px;\n flex: 0 0 16px;\n }\n .chat-approval-card__body {\n padding: 14px 16px;\n font-size: var(--ngaf-chat-font-size-sm, 13px);\n color: var(--ngaf-chat-text);\n }\n .chat-approval-card__actions {\n padding: 8px 16px 14px;\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n align-items: center;\n }\n .btn {\n border: 0;\n padding: 6px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: transform 200ms ease, opacity 200ms ease;\n }\n .btn:hover { transform: scale(1.03); }\n .btn-primary { background: var(--ngaf-chat-primary); color: var(--ngaf-chat-on-primary); }\n .btn-secondary { background: transparent; color: var(--ngaf-chat-text); border: 1px solid var(--ngaf-chat-separator); }\n .btn-text {\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n padding: 6px 10px;\n }\n .btn-text:hover { color: var(--ngaf-chat-text); }\n `,\n ],\n template: `\n <dialog #dialogEl class=\"chat-approval-card\" (close)=\"onDialogClose()\" (cancel)=\"onCancelEvent($event)\">\n <div class=\"chat-approval-card__header\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>\n <h4>{{ title() }}</h4>\n </div>\n <div class=\"chat-approval-card__body\">\n @if (bodyTemplate(); as tpl) {\n @if (payload(); as p) {\n <ng-container *ngTemplateOutlet=\"tpl; context: { $implicit: p }\"></ng-container>\n }\n }\n </div>\n <div class=\"chat-approval-card__actions\">\n <button type=\"button\" class=\"btn btn-text\" (click)=\"emit('cancel')\">Cancel</button>\n @if (showEdit()) {\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"emit('edit')\">Edit</button>\n }\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"emit('approve')\">Approve</button>\n </div>\n </dialog>\n `,\n})\nexport class ChatApprovalCardComponent {\n readonly agent = input.required<Agent>();\n readonly matchKind = input<string | undefined>(undefined);\n readonly title = input<string>('Approval required');\n readonly showEdit = input<boolean>(false);\n\n readonly action = output<ChatApprovalAction>();\n\n protected readonly bodyTemplate = contentChild<TemplateRef<unknown>>('body');\n private readonly dialogRef = viewChild<ElementRef<HTMLDialogElement>>('dialogEl');\n\n private readonly interrupt = computed(() => this.agent().interrupt?.());\n\n protected readonly payload = computed(() => {\n const i = this.interrupt();\n if (!i) return undefined;\n const v = i.value as { kind?: unknown } | undefined;\n const want = this.matchKind();\n if (want !== undefined) {\n if (!v || typeof v !== 'object' || (v as { kind?: unknown }).kind !== want) {\n return undefined;\n }\n }\n return v;\n });\n\n constructor() {\n effect(() => {\n const p = this.payload();\n const dialog = this.dialogRef()?.nativeElement;\n if (!dialog) return;\n if (p && !dialog.open) {\n dialog.showModal();\n } else if (!p && dialog.open) {\n dialog.close();\n }\n });\n }\n\n protected emit(action: ChatApprovalAction): void {\n this.action.emit(action);\n // 'approve' and 'cancel' are terminal — they resolve the interrupt, so the\n // dialog closes. 'edit' is non-terminal: the caller reveals an inline\n // editor in the body slot and submits the resume itself, so we leave the\n // dialog open.\n if (action !== 'edit') {\n this.closeDialog();\n }\n }\n\n protected onCancelEvent(ev: Event): void {\n // Native dialog's cancel event fires on Escape. Treat as cancel.\n ev.preventDefault();\n this.action.emit('cancel');\n this.closeDialog();\n }\n\n private closeDialog(): void {\n const dialog = this.dialogRef()?.nativeElement;\n if (!dialog) return;\n if (dialog.open) dialog.close();\n }\n\n protected onDialogClose(): void {\n // Native close — no-op; emit happens in emit() / onCancelEvent.\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { SecurityContext } from '@angular/core';\nimport type { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nlet markedParse: ((src: string) => string) | null = null;\nlet markedLoadAttempted = false;\nfunction ensureMarkedLoaded(): void {\n if (markedLoadAttempted) return;\n markedLoadAttempted = true;\n // Eagerly kick off the dynamic import so it's ready for subsequent calls\n void import('marked')\n .then((m) => {\n // GFM: enables tables, strikethrough, autolinks, task lists.\n // breaks: single \\n becomes <br>. LLM chat output frequently uses\n // soft line breaks for visual structure where stricter markdown\n // would treat them as continuation. Matching common chat UX.\n const opts = { async: false, gfm: true, breaks: true } as const;\n markedParse = (src: string) => (m as any).marked.parse(src, opts) as string;\n })\n .catch(() => {\n markedParse = null;\n });\n}\n\n// Kick off the import at module load time so it resolves before first render\nensureMarkedLoaded();\n\n/**\n * Escape and convert plain text to basic HTML (fallback when marked is unavailable).\n */\nfunction plainTextToHtml(content: string): string {\n return content\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\n/g, '<br>');\n}\n\n/**\n * Renders markdown content to sanitized HTML.\n * Falls back to plain text with newline->br conversion if `marked` is not installed.\n */\nexport function renderMarkdown(content: string, sanitizer: DomSanitizer): SafeHtml {\n if (markedParse) {\n const html = markedParse(content);\n return sanitizer.bypassSecurityTrustHtml(\n sanitizer.sanitize(SecurityContext.HTML, html) ?? ''\n );\n }\n // Fallback: escape HTML and convert newlines to <br>\n return sanitizer.bypassSecurityTrustHtml(plainTextToHtml(content));\n}\n\n/**\n * Renders markdown to a sanitized HTML string (not SafeHtml).\n * Used by the streaming markdown component for direct innerHTML assignment.\n */\nexport function renderMarkdownToString(content: string, sanitizer: DomSanitizer): string {\n if (markedParse) {\n const html = markedParse(content);\n return sanitizer.sanitize(SecurityContext.HTML, html) ?? '';\n }\n return plainTextToHtml(content);\n}\n","// SPDX-License-Identifier: MIT\n\n/** Chevron down (▼ replacement). 12x12, stroke-based. */\nexport const ICON_CHEVRON_DOWN = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 4.5L6 7.5L9 4.5\"/></svg>`;\n\n/** Chevron up (▲ replacement). 12x12, stroke-based. */\nexport const ICON_CHEVRON_UP = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7.5L6 4.5L9 7.5\"/></svg>`;\n\n/** Gear icon (⚙ replacement). 14x14. */\nexport const ICON_TOOL = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"/></svg>`;\n\n/** Warning triangle (⚠ replacement). 18x18. */\nexport const ICON_WARNING = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>`;\n\n/** Robot/agent icon (replacement). 14x14. */\nexport const ICON_AGENT = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\"/><circle cx=\"12\" cy=\"5\" r=\"2\"/><path d=\"M12 7v4\"/><line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"16\"/><line x1=\"16\" y1=\"16\" x2=\"16\" y2=\"16\"/></svg>`;\n\n/** Check mark replacement. 12x12. */\nexport const ICON_CHECK = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2.5 6L5 8.5L9.5 3.5\"/></svg>`;\n\n/** Send arrow (for chat input). 16x16. */\nexport const ICON_SEND = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 12V4M8 4L4 8M8 4L12 8\"/></svg>`;\n","// SPDX-License-Identifier: MIT\nimport type { Type } from '@angular/core';\nimport type { RenderViewEntry } from '@threadplane/render';\n\n/** Catalog entry for the A2UI surface renderer.\n *\n * `component` is mounted once all of the component's bindings (data\n * model paths referenced in its prop expressions) have resolved. While\n * any binding is unpopulated, the `fallback` is mounted instead. If\n * `fallback` is omitted, the lib's default fallback\n * (`A2uiDefaultFallbackComponent`) is mounted.\n *\n * This is a chat-side alias for the shared `RenderViewEntry` shape so\n * consumers of `@threadplane/chat` don't have to import from `@threadplane/render`. */\nexport type A2uiViewEntry = RenderViewEntry;\n\n/** Catalog shape accepted by `<a2ui-surface>`. Each entry is either a\n * bare `Type<unknown>` (legacy shape — no per-component fallback) or\n * an `A2uiViewEntry`. */\nexport type A2uiViews = Readonly<Record<string, Type<unknown> | A2uiViewEntry>>;\n\n/** Normalize a catalog entry to the `A2uiViewEntry` shape. Bare\n * `Type<unknown>` entries are wrapped as `{ component }`; entries\n * already in the discriminated shape are returned unchanged. */\nexport function normalizeViewEntry(\n entry: Type<unknown> | A2uiViewEntry,\n): A2uiViewEntry {\n if (typeof entry === 'function') return { component: entry };\n return entry;\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-audio-player',\n standalone: true,\n template: `\n <div class=\"a2ui-audio-wrap\">\n @if (description()) {\n <span class=\"a2ui-audio-description\">{{ description() }}</span>\n }\n <audio\n class=\"a2ui-audio\"\n [src]=\"url()\"\n [autoplay]=\"autoPlay()\"\n [controls]=\"controls()\"\n ></audio>\n </div>\n `,\n styles: [`\n .a2ui-audio-wrap {\n display: flex;\n flex-direction: column;\n gap: var(--a2ui-spacing-1);\n }\n .a2ui-audio-description {\n font-size: var(--a2ui-typography-caption-size);\n color: var(--a2ui-on-surface-variant);\n }\n .a2ui-audio {\n display: block;\n width: 100%;\n }\n `],\n})\nexport class A2uiAudioPlayerComponent {\n readonly url = input<string>('');\n /** v1 canonical prop: short description / title rendered above the player. */\n readonly description = input<string>('');\n /** v1 prop name: autoPlay (camelCase). */\n readonly autoPlay = input<boolean>(false);\n readonly controls = input<boolean>(true);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-button',\n standalone: true,\n imports: [RenderElementComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n [class]=\"primary() ? 'a2ui-btn a2ui-btn--primary' : 'a2ui-btn a2ui-btn--secondary'\"\n [disabled]=\"disabled()\"\n (click)=\"handleClick()\"\n >\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </button>\n `,\n styles: [`\n .a2ui-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-4);\n border-radius: var(--a2ui-shape-small);\n font-size: var(--a2ui-typography-body-size);\n font-weight: 500;\n cursor: pointer;\n transition: background var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard),\n opacity var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n border: none;\n }\n .a2ui-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .a2ui-btn--primary {\n background: var(--a2ui-primary);\n color: var(--a2ui-on-primary);\n }\n .a2ui-btn--primary:hover:not(:disabled) { background: var(--a2ui-primary-hover); }\n .a2ui-btn--secondary {\n background: var(--a2ui-surface-variant);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n }\n .a2ui-btn--secondary:hover:not(:disabled) { background: var(--a2ui-outline); }\n `],\n})\nexport class A2uiButtonComponent {\n /** v1: child Text component is rendered inside the button via childKeys. */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly primary = input<boolean>(true);\n readonly disabled = input<boolean>(false);\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n\n handleClick(): void {\n this.emit()('click');\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-card',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div class=\"a2ui-card\">\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-card {\n display: flex;\n flex-direction: column;\n gap: var(--a2ui-spacing-2);\n border-radius: var(--a2ui-shape-medium);\n border: 1px solid var(--a2ui-outline);\n background: var(--a2ui-surface);\n padding: var(--a2ui-spacing-4);\n box-shadow: var(--a2ui-elevation-1);\n }\n `],\n})\nexport class A2uiCardComponent {\n /** v1: a single child key, delivered via childKeys[0] from the render framework. */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n}\n","// SPDX-License-Identifier: MIT\nimport type { RenderHost } from '@threadplane/render';\n\n/** Writes a typed value to the render state store if the prop has a binding path. */\nexport function emitBinding(\n host: RenderHost,\n bindings: Record<string, string> | undefined,\n prop: string,\n value: unknown,\n): void {\n const path = bindings?.[prop];\n if (path) {\n host.set(path, value);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n@Component({\n selector: 'a2ui-check-box',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label class=\"a2ui-cb\">\n <input type=\"checkbox\" [checked]=\"effectiveValue()\" (change)=\"onChange($event)\" class=\"a2ui-cb__input\" />\n {{ label() }}\n </label>\n `,\n styles: [`\n .a2ui-cb {\n display: flex;\n align-items: center;\n gap: var(--a2ui-spacing-2);\n font-size: var(--a2ui-typography-body-size);\n cursor: pointer;\n }\n .a2ui-cb__input {\n width: 16px;\n height: 16px;\n border-radius: var(--a2ui-shape-extra-small);\n cursor: pointer;\n accent-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiCheckBoxComponent {\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 canonical prop: boolean checked state. */\n readonly value = input<boolean | undefined>(undefined);\n /** Pre-v1 alias retained for back-compat. */\n readonly checked = input<boolean>(false);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly effectiveValue = computed(() => this.value() ?? this.checked());\n\n onChange(event: Event): void {\n const val = (event.target as HTMLInputElement).checked;\n // Emit on whichever binding the surface declared. v1 surfaces use\n // `value`; pre-v1 used `checked`.\n const bound = this._bindings();\n if (bound['value']) {\n emitBinding(this.host, bound, 'value', val);\n } else {\n emitBinding(this.host, bound, 'checked', val);\n }\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\ntype ColumnAlignment = 'start' | 'center' | 'end' | 'stretch';\n\nconst ALIGN_MAP: Record<ColumnAlignment, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', stretch: 'stretch',\n};\n\n@Component({\n selector: 'a2ui-column',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div class=\"a2ui-col\" [style.align-items]=\"alignItems()\" [style.gap.px]=\"gapPx()\">\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-col {\n display: flex;\n flex-direction: column;\n }\n `],\n})\nexport class A2uiColumnComponent {\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly gap = input<number>(3);\n readonly alignment = input<ColumnAlignment>('start');\n readonly distribution = input<'start' | 'center' | 'end' | 'spaceBetween' | 'spaceAround' | 'spaceEvenly'>('start');\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly alignItems = computed(() => ALIGN_MAP[this.alignment()] ?? 'flex-start');\n /** Convert the Tailwind gap unit (multiples of 4px) to pixels. */\n protected readonly gapPx = computed(() => this.gap() * 4);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n@Component({\n selector: 'a2ui-date-time-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-dti\">\n @if (label()) {\n <label [htmlFor]=\"_inputId\" class=\"a2ui-dti__label\">{{ label() }}</label>\n }\n <input\n [id]=\"_inputId\"\n [type]=\"htmlInputType()\"\n [value]=\"value()\"\n class=\"a2ui-dti__input\"\n (change)=\"onChange($event)\"\n />\n </div>\n `,\n styles: [`\n .a2ui-dti { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-dti__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-dti__input {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-3);\n font-size: var(--a2ui-typography-body-size);\n border-radius: var(--a2ui-shape-small);\n background: var(--a2ui-input-bg);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n outline: none;\n transition: border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n }\n .a2ui-dti__input:focus {\n outline: var(--a2ui-focus-ring-width) solid var(--a2ui-focus-ring-color);\n outline-offset: 2px;\n border-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiDateTimeInputComponent {\n private static _idCounter = 0;\n protected readonly _inputId = `a2ui-date-time-input-${++A2uiDateTimeInputComponent._idCounter}`;\n\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 prop: value (resolved DynamicString). */\n readonly value = input<string>('');\n /** v1 prop: enableDate — include date portion. */\n readonly enableDate = input<boolean>(true);\n /** v1 prop: enableTime — include time portion. */\n readonly enableTime = input<boolean>(false);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n /** Derives HTML input type from enableDate + enableTime. */\n protected readonly htmlInputType = computed<string>(() => {\n const d = this.enableDate();\n const t = this.enableTime();\n if (d && t) return 'datetime-local';\n if (t) return 'time';\n return 'date';\n });\n\n onChange(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n emitBinding(this.host, this._bindings(), 'value', val);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-divider',\n standalone: true,\n template: `\n @if (orientation() === 'vertical') {\n <div class=\"a2ui-divider a2ui-divider--vertical\"></div>\n } @else {\n <hr class=\"a2ui-divider a2ui-divider--horizontal\" />\n }\n `,\n styles: [`\n .a2ui-divider--horizontal {\n display: block;\n width: 100%;\n border: none;\n border-top: 1px solid var(--a2ui-outline);\n margin: var(--a2ui-spacing-2) 0;\n }\n .a2ui-divider--vertical {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n background: var(--a2ui-outline);\n margin: 0 var(--a2ui-spacing-2);\n }\n `],\n})\nexport class A2uiDividerComponent {\n /** Canonical v1 spec name. The LLM emits this. */\n readonly axis = input<'horizontal' | 'vertical' | undefined>(undefined);\n /** Older alias retained for json-render usage and back-compat. */\n readonly direction = input<'horizontal' | 'vertical'>('horizontal');\n /** Effective axis — `axis` wins if provided, otherwise fall back to `direction`. */\n protected readonly orientation = computed<'horizontal' | 'vertical'>(() =>\n this.axis() ?? this.direction()\n );\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-icon',\n standalone: true,\n template: `\n <span\n class=\"a2ui-icon\"\n [style.font-size]=\"size() ? size() + 'px' : '1.125rem'\"\n [attr.aria-label]=\"effectiveName()\"\n >{{ effectiveName() }}</span>\n `,\n styles: [`\n .a2ui-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n user-select: none;\n }\n `],\n})\nexport class A2uiIconComponent {\n /** v1 canonical prop. */\n readonly name = input<string | undefined>(undefined);\n /** Pre-v1 alias retained for back-compat. */\n readonly icon = input<string>('');\n readonly size = input<number | null>(null);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly effectiveName = computed(() => this.name() ?? this.icon());\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n/** v1 fit values mapped 1:1 to CSS object-fit. */\ntype ImageFit = 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';\n\n/** v1 usageHint maps to a sizing preset. The component renders fluid by\n * default; usageHint sets a max-width / aspect-ratio to match common\n * intents. */\ntype ImageUsageHint = 'icon' | 'avatar' | 'smallFeature' | 'mediumFeature' | 'largeFeature' | 'header';\n\nconst USAGE_HINT_STYLE: Record<ImageUsageHint, { maxWidth: string; aspectRatio?: string; borderRadius?: string }> = {\n icon: { maxWidth: '24px', aspectRatio: '1 / 1' },\n avatar: { maxWidth: '48px', aspectRatio: '1 / 1', borderRadius: '50%' },\n smallFeature: { maxWidth: '160px' },\n mediumFeature: { maxWidth: '320px' },\n largeFeature: { maxWidth: '480px' },\n header: { maxWidth: '100%', aspectRatio: '16 / 5' },\n};\n\n@Component({\n selector: 'a2ui-image',\n standalone: true,\n template: `\n <img\n class=\"a2ui-img\"\n [src]=\"url()\"\n [alt]=\"alt()\"\n [style.width]=\"explicitWidth()\"\n [style.height]=\"explicitHeight()\"\n [style.object-fit]=\"fit()\"\n [style.max-width]=\"hintStyle()?.maxWidth\"\n [style.aspect-ratio]=\"hintStyle()?.aspectRatio || null\"\n [style.border-radius]=\"hintStyle()?.borderRadius || null\"\n />\n `,\n styles: [`\n .a2ui-img {\n display: block;\n max-width: 100%;\n border-radius: var(--a2ui-shape-extra-small);\n }\n `],\n})\nexport class A2uiImageComponent {\n readonly url = input<string>('');\n readonly alt = input<string>('');\n readonly width = input<number | null>(null);\n readonly height = input<number | null>(null);\n /** v1 prop: CSS object-fit equivalent. */\n readonly fit = input<ImageFit | undefined>(undefined);\n /** v1 prop: sizing preset. */\n readonly usageHint = input<ImageUsageHint | undefined>(undefined);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected explicitWidth(): string | null {\n return this.width() != null ? this.width() + 'px' : null;\n }\n protected explicitHeight(): string | null {\n return this.height() != null ? this.height() + 'px' : null;\n }\n protected hintStyle(): { maxWidth: string; aspectRatio?: string; borderRadius?: string } | null {\n const h = this.usageHint();\n return h ? USAGE_HINT_STYLE[h] : null;\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-list',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div [class]=\"listClass()\" [style.align-items]=\"alignmentCss()\">\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-list--vertical {\n display: flex;\n flex-direction: column;\n gap: var(--a2ui-spacing-1);\n overflow-y: auto;\n max-height: 384px;\n }\n .a2ui-list--horizontal {\n display: flex;\n flex-direction: row;\n gap: var(--a2ui-spacing-1);\n overflow-x: auto;\n }\n `],\n})\nexport class A2uiListComponent {\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly direction = input<'vertical' | 'horizontal'>('vertical');\n /** v1 canonical prop: cross-axis alignment. */\n readonly alignment = input<'start' | 'center' | 'end' | 'stretch' | undefined>(undefined);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly listClass = computed(() => {\n return this.direction() === 'horizontal'\n ? 'a2ui-list--horizontal'\n : 'a2ui-list--vertical';\n });\n\n protected readonly alignmentCss = computed<string | null>(() => {\n const a = this.alignment();\n if (!a) return null;\n return a === 'start' ? 'flex-start'\n : a === 'end' ? 'flex-end'\n : a; // center / stretch are valid CSS values as-is\n });\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-modal',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <!-- Entry point (trigger): always rendered inline, e.g. a button. -->\n @if (entryPointKey(); as epKey) {\n <div\n class=\"a2ui-modal__trigger\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"Open modal\"\n (click)=\"open.set(true)\"\n (keydown.enter)=\"open.set(true)\"\n (keydown.space)=\"open.set(true)\"\n >\n <render-element [elementKey]=\"epKey\" [spec]=\"spec()\" />\n </div>\n }\n\n <!-- Modal overlay: shown when open. -->\n @if (open()) {\n <div\n class=\"a2ui-modal__overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n class=\"a2ui-modal__backdrop\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"Dismiss dialog\"\n (click)=\"open.set(false)\"\n (keydown.enter)=\"open.set(false)\"\n (keydown.space)=\"open.set(false)\"\n ></div>\n <div class=\"a2ui-modal__panel\">\n @if (title()) {\n <h2 class=\"a2ui-modal__title\">{{ title() }}</h2>\n }\n @if (contentKey(); as cKey) {\n <render-element [elementKey]=\"cKey\" [spec]=\"spec()\" />\n }\n </div>\n </div>\n }\n `,\n styles: [`\n .a2ui-modal__trigger {\n display: contents;\n }\n .a2ui-modal__overlay {\n position: fixed;\n inset: 0;\n z-index: 50;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .a2ui-modal__backdrop {\n position: absolute;\n inset: 0;\n background: var(--a2ui-scrim);\n backdrop-filter: blur(4px);\n }\n .a2ui-modal__panel {\n position: relative;\n background: var(--a2ui-surface);\n border: 1px solid var(--a2ui-outline);\n border-radius: var(--a2ui-shape-medium);\n padding: var(--a2ui-spacing-5);\n max-width: 512px;\n width: 100%;\n margin: 0 var(--a2ui-spacing-4);\n box-shadow: var(--a2ui-elevation-4);\n }\n .a2ui-modal__title {\n font-size: var(--a2ui-typography-h4-size);\n font-weight: var(--a2ui-typography-h4-weight);\n margin: 0 0 var(--a2ui-spacing-4);\n }\n `],\n})\nexport class A2uiModalComponent {\n /**\n * v1: childKeys[0] = entryPointChild (inline trigger),\n * childKeys[1] = contentChild (modal body).\n */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n /** Resolved title string (from optional title DynamicString). */\n readonly title = input<string>('');\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly open = signal(false);\n\n protected readonly entryPointKey = computed(() => this.childKeys()[0] ?? null);\n protected readonly contentKey = computed(() => this.childKeys()[1] ?? null);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n/** Resolved option shape — label and value are plain strings after surface-to-spec resolves them. */\ninterface ResolvedOption {\n label: string;\n value: string;\n}\n\n@Component({\n selector: 'a2ui-multiple-choice',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-mc\">\n @if (label()) {\n <span class=\"a2ui-mc__label\">{{ label() }}</span>\n }\n\n @if (isSingleSelect()) {\n <!-- Single-select: HTML <select> -->\n <select class=\"a2ui-mc__select\" (change)=\"onSelectChange($event)\">\n @for (opt of options(); track opt.value) {\n <option [value]=\"opt.value\" [selected]=\"isSelected(opt.value)\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <!-- Multi-select: checkbox list -->\n <div class=\"a2ui-mc__checks\">\n @for (opt of options(); track opt.value) {\n <label class=\"a2ui-mc__check-row\">\n <input\n type=\"checkbox\"\n class=\"a2ui-mc__checkbox\"\n [checked]=\"isSelected(opt.value)\"\n (change)=\"onCheckChange(opt.value, $event)\"\n />\n {{ opt.label }}\n </label>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .a2ui-mc { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-mc__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-mc__select {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-3);\n font-size: var(--a2ui-typography-body-size);\n border-radius: var(--a2ui-shape-small);\n background: var(--a2ui-input-bg);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n outline: none;\n transition: border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n }\n .a2ui-mc__select:focus {\n outline: var(--a2ui-focus-ring-width) solid var(--a2ui-focus-ring-color);\n outline-offset: 2px;\n border-color: var(--a2ui-primary);\n }\n .a2ui-mc__checks { display: flex; flex-direction: column; gap: var(--a2ui-spacing-2); }\n .a2ui-mc__check-row {\n display: flex;\n align-items: center;\n gap: var(--a2ui-spacing-2);\n font-size: var(--a2ui-typography-body-size);\n cursor: pointer;\n }\n .a2ui-mc__checkbox {\n width: 16px;\n height: 16px;\n border-radius: var(--a2ui-shape-extra-small);\n cursor: pointer;\n accent-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiMultipleChoiceComponent {\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** Resolved current selections from surface-to-spec. Normalized in\n * `selectionsArray` because LLMs sometimes seed the data model with a\n * scalar (e.g. `\"5\"`) instead of an array (`[\"5\"]`); we coerce so\n * .includes() works either way. */\n readonly selections = input<string | string[] | undefined>(undefined);\n\n protected readonly selectionsArray = computed<string[]>(() => {\n const v = this.selections();\n if (Array.isArray(v)) return v;\n if (v == null || v === '') return [];\n return [String(v)];\n });\n /** Resolved options with plain string labels (surface-to-spec resolves DynamicString). */\n readonly options = input<ResolvedOption[]>([]);\n /** When ≤ 1 — render as single-select <select>; otherwise multi-select checkboxes. */\n readonly maxAllowedSelections = input<number>(1);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly isSingleSelect = computed(() => this.maxAllowedSelections() <= 1);\n\n protected isSelected(value: string): boolean {\n return this.selectionsArray().includes(value);\n }\n\n onSelectChange(event: Event): void {\n const val = (event.target as HTMLSelectElement).value;\n emitBinding(this.host, this._bindings(), 'selections', val);\n }\n\n onCheckChange(value: string, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n const current = [...this.selectionsArray()];\n const idx = current.indexOf(value);\n if (checked && idx === -1) {\n current.push(value);\n } else if (!checked && idx !== -1) {\n current.splice(idx, 1);\n }\n // Pass the updated selections array directly (typed value, no JSON stringification needed).\n emitBinding(this.host, this._bindings(), 'selections', current);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\ntype RowAlignment = 'start' | 'center' | 'end' | 'stretch';\ntype RowDistribution = 'start' | 'center' | 'end' | 'space-between' | 'space-around';\n\nconst ROW_ALIGN_MAP: Record<RowAlignment, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', stretch: 'stretch',\n};\n\nconst ROW_JUSTIFY_MAP: Record<RowDistribution, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end',\n 'space-between': 'space-between', 'space-around': 'space-around',\n};\n\n@Component({\n selector: 'a2ui-row',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div\n class=\"a2ui-row\"\n [style.align-items]=\"alignItems()\"\n [style.justify-content]=\"justifyContent()\"\n [style.gap.px]=\"gapPx()\"\n >\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-row {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n }\n `],\n})\nexport class A2uiRowComponent {\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly gap = input<number>(3);\n readonly alignment = input<RowAlignment>('start');\n readonly distribution = input<RowDistribution>('start');\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly alignItems = computed(() => ROW_ALIGN_MAP[this.alignment()] ?? 'flex-start');\n protected readonly justifyContent = computed(() => ROW_JUSTIFY_MAP[this.distribution()] ?? 'flex-start');\n /** Convert the gap unit (multiples of 4px) to pixels. */\n protected readonly gapPx = computed(() => this.gap() * 4);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n@Component({\n selector: 'a2ui-slider',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-slider\">\n @if (label()) {\n <label [htmlFor]=\"_inputId\" class=\"a2ui-slider__label\">{{ label() }}: {{ value() }}</label>\n }\n <input\n [id]=\"_inputId\"\n type=\"range\"\n class=\"a2ui-slider__input\"\n [min]=\"minValue()\"\n [max]=\"maxValue()\"\n [step]=\"step()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n />\n </div>\n `,\n styles: [`\n .a2ui-slider { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-slider__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-slider__input {\n width: 100%;\n cursor: pointer;\n accent-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiSliderComponent {\n private static _idCounter = 0;\n protected readonly _inputId = `a2ui-slider-${++A2uiSliderComponent._idCounter}`;\n\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 prop: value (resolved DynamicNumber). */\n readonly value = input<number>(0);\n /** v1 prop: minValue. */\n readonly minValue = input<number>(0);\n /** v1 prop: maxValue. */\n readonly maxValue = input<number>(100);\n readonly step = input<number>(1);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n onInput(event: Event): void {\n const val = Number((event.target as HTMLInputElement).value);\n emitBinding(this.host, this._bindings(), 'value', val);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, effect, input, signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-tabs',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div class=\"a2ui-tabs\">\n <div class=\"a2ui-tabs__tablist\" role=\"tablist\">\n @for (title of tabTitles(); track $index) {\n <button\n role=\"tab\"\n [class]=\"$index === activeIndex() ? 'a2ui-tabs__tab a2ui-tabs__tab--active' : 'a2ui-tabs__tab'\"\n [attr.aria-selected]=\"$index === activeIndex()\"\n (click)=\"selectTab($index)\"\n >{{ title }}</button>\n }\n </div>\n <div class=\"a2ui-tabs__panel\" role=\"tabpanel\">\n @if (activeChildKey(); as key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n </div>\n `,\n styles: [`\n .a2ui-tabs { display: flex; flex-direction: column; }\n .a2ui-tabs__tablist {\n display: flex;\n border-bottom: 1px solid var(--a2ui-outline);\n }\n .a2ui-tabs__tab {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-4);\n font-size: var(--a2ui-typography-body-size);\n font-weight: 500;\n cursor: pointer;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--a2ui-label);\n transition: color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard),\n border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n margin-bottom: -1px;\n }\n .a2ui-tabs__tab:hover { color: var(--a2ui-on-surface); }\n .a2ui-tabs__tab--active {\n border-bottom-color: var(--a2ui-primary);\n color: var(--a2ui-on-surface);\n }\n .a2ui-tabs__panel { padding-top: var(--a2ui-spacing-3); }\n `],\n})\nexport class A2uiTabsComponent {\n /** Resolved tab titles from tabItems[*].title — produced by surface-to-spec. */\n readonly tabTitles = input<string[]>([]);\n /** v1: each child key corresponds to a tab's contentChild (childKeys[i] ↔ tabTitles[i]). */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly activeIndex = signal(0);\n\n constructor() {\n // Reset active tab when the surface changes entirely.\n effect(() => {\n const len = this.childKeys().length;\n if (this.activeIndex() >= len && len > 0) this.activeIndex.set(0);\n });\n }\n\n protected readonly activeChildKey = computed(() => {\n const idx = this.activeIndex();\n const keys = this.childKeys();\n return idx >= 0 && idx < keys.length ? keys[idx] : null;\n });\n\n selectTab(index: number): void {\n this.activeIndex.set(index);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\ntype UsageHint = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'caption' | 'body';\n\n@Component({\n selector: 'a2ui-text',\n standalone: true,\n template: `<span [class]=\"cssClass()\">{{ text() }}</span>`,\n styles: [`\n .a2ui-text-h1 {\n display: block;\n font-size: var(--a2ui-typography-h1-size);\n font-weight: var(--a2ui-typography-h1-weight);\n line-height: var(--a2ui-typography-h1-line-height);\n margin: 0;\n }\n .a2ui-text-h2 {\n display: block;\n font-size: var(--a2ui-typography-h2-size);\n font-weight: var(--a2ui-typography-h2-weight);\n line-height: var(--a2ui-typography-h2-line-height);\n margin: 0;\n }\n .a2ui-text-h3 {\n display: block;\n font-size: var(--a2ui-typography-h3-size);\n font-weight: var(--a2ui-typography-h3-weight);\n line-height: var(--a2ui-typography-h3-line-height);\n margin: 0;\n }\n .a2ui-text-h4 {\n display: block;\n font-size: var(--a2ui-typography-h4-size);\n font-weight: var(--a2ui-typography-h4-weight);\n line-height: var(--a2ui-typography-h4-line-height);\n margin: 0;\n }\n .a2ui-text-h5 {\n display: block;\n font-size: var(--a2ui-typography-h5-size);\n font-weight: var(--a2ui-typography-h5-weight);\n line-height: var(--a2ui-typography-h5-line-height);\n margin: 0;\n }\n .a2ui-text-caption {\n display: block;\n font-size: var(--a2ui-typography-caption-size);\n font-weight: var(--a2ui-typography-caption-weight);\n color: var(--a2ui-caption);\n line-height: var(--a2ui-typography-caption-line-height);\n }\n .a2ui-text-body {\n display: block;\n font-size: var(--a2ui-typography-body-size);\n font-weight: var(--a2ui-typography-body-weight);\n line-height: var(--a2ui-typography-body-line-height);\n }\n `],\n})\nexport class A2uiTextComponent {\n readonly text = input<string>('');\n readonly usageHint = input<UsageHint>('body');\n // Framework-mandated inputs the render harness passes to every element.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected cssClass(): string {\n return `a2ui-text-${this.usageHint()}`;\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n/** v1 textFieldType values from A2uiTextField. */\ntype TextFieldType = 'date' | 'longText' | 'number' | 'shortText' | 'obscured';\n\n/** Maps v1 textFieldType to HTML input[type] or textarea. */\nconst TYPE_MAP: Record<TextFieldType, string> = {\n shortText: 'text',\n longText: 'text', // handled by textarea below\n number: 'number',\n obscured: 'password',\n date: 'date',\n};\n\n@Component({\n selector: 'a2ui-text-field',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-tf\">\n @if (label()) {\n <label [htmlFor]=\"_inputId\" class=\"a2ui-tf__label\">{{ label() }}</label>\n }\n @if (textFieldType() === 'longText') {\n <textarea\n [id]=\"_inputId\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n rows=\"4\"\n class=\"a2ui-tf__input\"\n (input)=\"onInput($event)\"\n ></textarea>\n } @else {\n <input\n [id]=\"_inputId\"\n [type]=\"htmlInputType()\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [pattern]=\"validationRegexp() || ''\"\n class=\"a2ui-tf__input\"\n (input)=\"onInput($event)\"\n />\n }\n </div>\n `,\n styles: [`\n .a2ui-tf { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-tf__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-tf__input {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-3);\n font-size: var(--a2ui-typography-body-size);\n border-radius: var(--a2ui-shape-small);\n background: var(--a2ui-input-bg);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n outline: none;\n transition: border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n resize: vertical;\n }\n .a2ui-tf__input:focus {\n outline: var(--a2ui-focus-ring-width) solid var(--a2ui-focus-ring-color);\n outline-offset: 2px;\n border-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiTextFieldComponent {\n private static _idCounter = 0;\n protected readonly _inputId = `a2ui-text-field-${++A2uiTextFieldComponent._idCounter}`;\n\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 prop: text (resolved string value). */\n readonly text = input<string>('');\n /** Back-compat alias: value. surface-to-spec resolves DynamicString → plain string. */\n readonly value = computed(() => this.text() ?? '');\n readonly placeholder = input<string>('');\n readonly textFieldType = input<TextFieldType>('shortText');\n readonly validationRegexp = input<string>('');\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly htmlInputType = computed(() =>\n TYPE_MAP[this.textFieldType()] ?? 'text',\n );\n\n onInput(event: Event): void {\n const val = (event.target as HTMLInputElement | HTMLTextAreaElement).value;\n // Emit on 'text' binding (v1 prop name); also try 'value' for compat.\n const bound = this._bindings();\n if (bound['text']) {\n emitBinding(this.host, bound, 'text', val);\n } else {\n emitBinding(this.host, bound, 'value', val);\n }\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-video',\n standalone: true,\n template: `\n <video\n class=\"a2ui-video\"\n [src]=\"url()\"\n [autoplay]=\"autoPlay()\"\n [controls]=\"controls()\"\n ></video>\n `,\n styles: [`\n .a2ui-video {\n display: block;\n width: 100%;\n border-radius: var(--a2ui-shape-small);\n }\n `],\n})\nexport class A2uiVideoComponent {\n readonly url = input<string>('');\n /** v1 prop name: autoPlay (camelCase). */\n readonly autoPlay = input<boolean>(false);\n readonly controls = input<boolean>(true);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n}\n","// SPDX-License-Identifier: MIT\nimport { views, type ViewRegistry } from '@threadplane/render';\nimport { A2uiAudioPlayerComponent } from './audio-player.component';\nimport { A2uiButtonComponent } from './button.component';\nimport { A2uiCardComponent } from './card.component';\nimport { A2uiCheckBoxComponent } from './check-box.component';\nimport { A2uiColumnComponent } from './column.component';\nimport { A2uiDateTimeInputComponent } from './date-time-input.component';\nimport { A2uiDividerComponent } from './divider.component';\nimport { A2uiIconComponent } from './icon.component';\nimport { A2uiImageComponent } from './image.component';\nimport { A2uiListComponent } from './list.component';\nimport { A2uiModalComponent } from './modal.component';\nimport { A2uiMultipleChoiceComponent } from './multiple-choice.component';\nimport { A2uiRowComponent } from './row.component';\nimport { A2uiSliderComponent } from './slider.component';\nimport { A2uiTabsComponent } from './tabs.component';\nimport { A2uiTextComponent } from './text.component';\nimport { A2uiTextFieldComponent } from './text-field.component';\nimport { A2uiVideoComponent } from './video.component';\n\nexport function a2uiBasicCatalog(): ViewRegistry {\n return views({\n AudioPlayer: A2uiAudioPlayerComponent,\n Button: A2uiButtonComponent,\n Card: A2uiCardComponent,\n CheckBox: A2uiCheckBoxComponent,\n Column: A2uiColumnComponent,\n DateTimeInput: A2uiDateTimeInputComponent,\n Divider: A2uiDividerComponent,\n Icon: A2uiIconComponent,\n Image: A2uiImageComponent,\n List: A2uiListComponent,\n Modal: A2uiModalComponent,\n MultipleChoice: A2uiMultipleChoiceComponent,\n Row: A2uiRowComponent,\n Slider: A2uiSliderComponent,\n Tabs: A2uiTabsComponent,\n Text: A2uiTextComponent,\n TextField: A2uiTextFieldComponent,\n Video: A2uiVideoComponent,\n });\n}\n","// SPDX-License-Identifier: MIT\nimport type { Type } from '@angular/core';\nimport type { StandardSchemaV1, StandardSchemaInferOutput } from '@threadplane/render';\nimport type { ClientToolDef, FunctionToolDef, ViewToolDef, AskToolDef } from './tool-def';\nimport type { AcceptComponent } from './component-inputs';\nexport type { ViewProps } from './component-inputs';\n\n/**\n * Declare an async function tool the model can call; its resolved return value\n * becomes the tool result shipped back to the model.\n *\n * @param description Natural-language description the model sees.\n * @param schema Standard Schema (e.g. a Zod object) for the arguments; the\n * handler's argument type is inferred from it.\n * @param handler Runs in the browser when the model calls the tool; its return\n * type `R` is carried on the resulting {@link FunctionToolDef}.\n * @returns A {@link FunctionToolDef} for inclusion in {@link tools}.\n * @example\n * ```ts\n * const move = action('Move a stop', z.object({ fromDay: z.number() }), (a) => a.fromDay);\n * const registry = tools({ move_stop: move });\n * ```\n */\nexport function action<S extends StandardSchemaV1, R>(\n description: string,\n schema: S,\n handler: (args: StandardSchemaInferOutput<S>) => R | Promise<R>,\n): FunctionToolDef<S, R> {\n return { kind: 'function', description, schema, handler };\n}\n\n/**\n * Render-only component tool — the model fills the component's props from the\n * schema's output; the tool call is auto-acknowledged once the component mounts.\n *\n * The component's signal inputs are checked against the schema output type\n * (strict-but-flexible: every schema key must be a declared input with an\n * assignable type; the component may declare extra inputs the schema doesn't fill).\n * Author the component with `ViewProps<typeof schema>` as the input type set to\n * guarantee the shapes stay aligned.\n *\n * @param description Natural-language description the model sees.\n * @param schema Standard Schema defining the props the model must supply.\n * @param component Angular component whose signal inputs must be compatible with\n * the schema output. A type-level error is reported here when they diverge.\n * @returns A {@link ViewToolDef} for inclusion in {@link tools}.\n * @example\n * ```ts\n * const schema = z.object({ label: z.string(), day: z.number() });\n * type Inputs = ViewProps<typeof schema>; // { label: string; day: number }\n *\n * \\@Component({ ... })\n * class DayCardComponent {\n * label = input.required<string>();\n * day = input.required<number>();\n * }\n *\n * const dayCard = view('Show a day card', schema, DayCardComponent);\n * const registry = tools({ day_card: dayCard });\n * ```\n */\nexport function view<S extends StandardSchemaV1, C>(\n description: string,\n schema: S,\n component: AcceptComponent<S, C>,\n): ViewToolDef<S, C> {\n return { kind: 'view', description, schema, component: component as Type<C> };\n}\n\n/**\n * Interactive (human-in-the-loop) component tool — the model fills the\n * component's props from the schema's output; the value the component emits\n * back to the framework becomes the tool result sent to the model.\n *\n * The component's signal inputs are checked against the schema output type\n * (strict-but-flexible: every schema key must be a declared input with an\n * assignable type; the component may declare extra inputs the schema doesn't\n * fill). Author the component with `ViewProps<typeof schema>` to derive input\n * prop types directly from the schema.\n *\n * @param description Natural-language description the model sees.\n * @param schema Standard Schema defining the props the model must supply.\n * @param component Angular component whose signal inputs must be compatible with\n * the schema output. A type-level error is reported here when they diverge.\n * @returns An {@link AskToolDef} for inclusion in {@link tools}.\n * @example\n * ```ts\n * const schema = z.object({ question: z.string(), options: z.array(z.string()) });\n * type Inputs = ViewProps<typeof schema>;\n *\n * \\@Component({ ... })\n * class ChoiceCardComponent {\n * question = input.required<string>();\n * options = input.required<string[]>();\n * // Emits the chosen option back to the model.\n * }\n *\n * const choice = ask('Ask the user to choose', schema, ChoiceCardComponent);\n * const registry = tools({ pick_option: choice });\n * ```\n */\nexport function ask<S extends StandardSchemaV1, C>(\n description: string,\n schema: S,\n component: AcceptComponent<S, C>,\n): AskToolDef<S, C> {\n return { kind: 'ask', description, schema, component: component as Type<C> };\n}\n\n/**\n * Collect named client tools into a frozen, name-keyed registry.\n *\n * The overload is generic over the entire map (`const M`) so that each tool's\n * precise type ({@link FunctionToolDef}`<S,R>`, {@link ViewToolDef}`<S,C>`, or\n * {@link AskToolDef}`<S,C>`) and every literal key are preserved in the\n * {@link ClientToolRegistry} passed to `provideChat`. This lets downstream\n * consumers look up individual tools without losing generic information.\n *\n * @param map An object literal mapping tool names to tool definitions created\n * by {@link action}, {@link view}, or {@link ask}.\n * @returns A frozen `Readonly<M>` where `M` is the exact inferred map shape.\n * @example\n * ```ts\n * const move = action('Move a stop', z.object({ fromDay: z.number() }), (a) => a.fromDay);\n * const dayCard = view('Show a day card', z.object({ label: z.string() }), DayCardComponent);\n *\n * const registry = tools({ move_stop: move, day_card: dayCard });\n * // registry.move_stop is FunctionToolDef<...>\n * // registry.day_card is ViewToolDef<...>\n * ```\n */\nexport function tools<const M extends Record<string, ClientToolDef>>(map: M): Readonly<M> {\n return Object.freeze({ ...map });\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, Signal, WritableSignal } from '@angular/core';\nimport { EMPTY, type Observable } from 'rxjs';\nimport type {\n Agent,\n Message,\n AgentStatus,\n ToolCall,\n AgentInterrupt,\n Subagent,\n AgentSubmitInput,\n AgentSubmitOptions,\n AgentEvent,\n AgentCheckpoint,\n} from '../agent';\nimport type { AgentError } from '../agent/agent-error';\n\nexport interface MockAgent extends Agent {\n messages: WritableSignal<Message[]>;\n status: WritableSignal<AgentStatus>;\n isLoading: WritableSignal<boolean>;\n error: WritableSignal<AgentError | undefined>;\n toolCalls: WritableSignal<ToolCall[]>;\n state: WritableSignal<Record<string, unknown>>;\n interrupt?: WritableSignal<AgentInterrupt | undefined>;\n subagents?: WritableSignal<Map<string, Subagent>>;\n history?: WritableSignal<AgentCheckpoint[]>;\n events$: Observable<AgentEvent>;\n /**\n * Minimal lifecycle stub the chat lib's effects subscribe to. We only\n * model the signals the chat composition currently reads; richer adapter\n * lifecycles (langgraph, ag-ui) extend this contract on their own mocks.\n * The public `lifecycle` view is a readonly signal; tests drive the\n * value via `_internal.streamStartedAt.set(...)` below.\n */\n lifecycle: {\n streamStartedAt: Signal<number | null>;\n };\n /**\n * Test-only escape hatch for driving lifecycle signals from a spec. Mirrors\n * the `_internal` pattern used by CHAT_LIFECYCLE so tests can flip the\n * underlying writable without going through a full submit/stream cycle.\n */\n _internal: {\n streamStartedAt: WritableSignal<number | null>;\n };\n /** Captured calls to submit() in order. */\n submitCalls: Array<{ input: AgentSubmitInput; opts?: AgentSubmitOptions }>;\n /** Count of stop() invocations. */\n stopCount: number;\n}\n\nexport interface MockAgentOptions {\n messages?: Message[];\n status?: AgentStatus;\n isLoading?: boolean;\n error?: AgentError;\n toolCalls?: ToolCall[];\n state?: Record<string, unknown>;\n withInterrupt?: boolean;\n withSubagents?: boolean;\n history?: AgentCheckpoint[];\n events$?: Observable<AgentEvent>;\n}\n\nexport function mockAgent(opts: MockAgentOptions = {}): MockAgent {\n const messages = signal<Message[]>(opts.messages ?? []);\n const status = signal<AgentStatus>(opts.status ?? 'idle');\n const isLoading = signal<boolean>(opts.isLoading ?? false);\n const error = signal<AgentError | undefined>(opts.error ?? undefined);\n const toolCalls = signal<ToolCall[]>(opts.toolCalls ?? []);\n const state = signal<Record<string, unknown>>(opts.state ?? {});\n\n const interrupt = opts.withInterrupt\n ? signal<AgentInterrupt | undefined>(undefined)\n : undefined;\n const subagents = opts.withSubagents\n ? signal<Map<string, Subagent>>(new Map())\n : undefined;\n const history = opts.history\n ? signal<AgentCheckpoint[]>(opts.history)\n : undefined;\n\n const submitCalls: MockAgent['submitCalls'] = [];\n let stopCount = 0;\n\n const streamStartedAt = signal<number | null>(null);\n\n const agent: MockAgent = {\n messages, status, isLoading, error, toolCalls, state,\n ...(interrupt ? { interrupt } : {}),\n ...(subagents ? { subagents } : {}),\n ...(history ? { history } : {}),\n lifecycle: { streamStartedAt: streamStartedAt.asReadonly() },\n _internal: { streamStartedAt },\n events$: opts.events$ ?? EMPTY,\n submit: async (input, submitOpts) => { submitCalls.push({ input, opts: submitOpts }); },\n stop: async () => { stopCount++; },\n retry: async () => { return; },\n regenerate: async (assistantMessageIndex: number) => {\n // Truncate messages [N..end] and record the call as a synthetic submit so\n // tests can assert regenerate behavior via the same submitCalls log.\n const current = messages();\n messages.set(current.slice(0, assistantMessageIndex));\n submitCalls.push({ input: { regenerate: { assistantMessageIndex } } as never, opts: undefined });\n },\n submitCalls,\n get stopCount() { return stopCount; },\n };\n\n return agent;\n}\n","// SPDX-License-Identifier: MIT\n\n// Shared types\nexport type { ChatConfig } from './lib/provide-chat';\nexport type { MessageTemplateType } from './lib/chat.types';\n\n// Agent contract (runtime-neutral)\nexport type {\n Agent,\n AgentWithHistory,\n Citation,\n Message,\n Role,\n ContentBlock,\n ToolCall,\n ToolCallStatus,\n AgentStatus,\n AgentInterrupt,\n Subagent,\n SubagentStatus,\n AgentSubmitInput,\n AgentSubmitOptions,\n AgentEvent,\n AgentStateUpdateEvent,\n AgentCustomEvent,\n AgentCheckpoint,\n AgentRuntimeTelemetryEvent,\n AgentRuntimeTelemetryPayload,\n AgentRuntimeTelemetryProperties,\n AgentRuntimeTelemetrySink,\n} from './lib/agent';\nexport {\n isUserMessage,\n isAssistantMessage,\n isToolMessage,\n isSystemMessage,\n createAgentRef,\n AgentError,\n AGENT_ERROR_MESSAGES,\n toAgentError,\n isAbortError,\n} from './lib/agent';\nexport type { AgentRef } from './lib/agent';\nexport type { AgentErrorKind } from './lib/agent';\n\n// Primitives\nexport { ChatMessageListComponent, getMessageType } from './lib/primitives/chat-message-list/chat-message-list.component';\nexport { MessageTemplateDirective } from './lib/primitives/chat-message-list/message-template.directive';\nexport { ChatMessageComponent } from './lib/primitives/chat-message/chat-message.component';\nexport type { ChatMessageRole } from './lib/primitives/chat-message/chat-message.component';\nexport { ChatMessageActionsComponent } from './lib/primitives/chat-message-actions/chat-message-actions.component';\nexport { ChatWindowComponent } from './lib/primitives/chat-window/chat-window.component';\nexport { ChatTraceComponent } from './lib/primitives/chat-trace/chat-trace.component';\nexport type { TraceState } from './lib/primitives/chat-trace/chat-trace.component';\nexport { ChatReasoningComponent } from './lib/primitives/chat-reasoning/chat-reasoning.component';\nexport { ChatLauncherButtonComponent } from './lib/primitives/chat-launcher-button/chat-launcher-button.component';\nexport { ChatSuggestionsComponent } from './lib/primitives/chat-suggestions/chat-suggestions.component';\nexport { ChatInputComponent, submitMessage } from './lib/primitives/chat-input/chat-input.component';\nexport { ChatTypingIndicatorComponent, isTyping } from './lib/primitives/chat-typing-indicator/chat-typing-indicator.component';\nexport { ChatHistorySearchPaletteComponent } from './lib/primitives/chat-history-search-palette/chat-history-search-palette.component';\nexport { ChatOverflowMenuComponent } from './lib/primitives/chat-overflow-menu/chat-overflow-menu.component';\nexport type { OverflowMenuItem } from './lib/primitives/chat-overflow-menu/chat-overflow-menu.component';\nexport { ChatConfirmDialogComponent } from './lib/primitives/chat-confirm-dialog/chat-confirm-dialog.component';\nexport type { ThreadMatch } from './lib/primitives/chat-history-search-palette/chat-history-search-palette.component';\nexport { ChatScrollBubbleComponent } from './lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component';\nexport type { ChatScrollBubbleMode } from './lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component';\nexport { ChatErrorComponent, extractErrorMessage } from './lib/primitives/chat-error/chat-error.component';\nexport { ChatInterruptComponent, getInterrupt } from './lib/primitives/chat-interrupt/chat-interrupt.component';\nexport { ChatToolCallsComponent } from './lib/primitives/chat-tool-calls/chat-tool-calls.component';\nexport { ChatToolViewsComponent } from './lib/primitives/chat-tool-views/chat-tool-views.component';\nexport { ChatToolCallTemplateDirective } from './lib/primitives/chat-tool-calls/chat-tool-call-template.directive';\nexport type { ChatToolCallTemplateContext } from './lib/primitives/chat-tool-calls/chat-tool-call-template.directive';\nexport { ChatSubagentsComponent } from './lib/primitives/chat-subagents/chat-subagents.component';\nexport { ChatThreadListComponent } from './lib/primitives/chat-thread-list/chat-thread-list.component';\nexport type { Thread, ThreadActionAdapter } from './lib/primitives/chat-thread-list/chat-thread-list.component';\nexport { ChatProjectListComponent } from './lib/primitives/chat-project-list/chat-project-list.component';\nexport type { Project, ProjectActionAdapter } from './lib/primitives/chat-project-list/chat-project-list.component';\nexport { ChatGenuiSkeletonComponent } from './lib/primitives/chat-genui-skeleton/chat-genui-skeleton.component';\nexport { ChatTimelineComponent } from './lib/primitives/chat-timeline/chat-timeline.component';\nexport { ChatGenerativeUiComponent } from './lib/primitives/chat-generative-ui/chat-generative-ui.component';\nexport { ChatWelcomeComponent } from './lib/primitives/chat-welcome/chat-welcome.component';\nexport { ChatWelcomeSuggestionComponent } from './lib/primitives/chat-welcome/chat-welcome-suggestion.component';\nexport { ChatSelectComponent } from './lib/primitives/chat-select/chat-select.component';\nexport type { ChatSelectOption } from './lib/primitives/chat-select/chat-select.component';\nexport { ChatCitationsComponent, ChatCitationCardTemplateDirective } from './lib/primitives/chat-citations/chat-citations.component';\nexport { ChatCitationsCardComponent } from './lib/primitives/chat-citations/chat-citations-card.component';\n\n// DI provider\nexport { provideChat, CHAT_CONFIG } from './lib/provide-chat';\n\n// Routing utilities\nexport { injectThreadRouting } from './lib/routing/thread-routing';\nexport type { ThreadRoutingConfig } from './lib/routing/thread-routing';\n\n// Lifecycle\nexport { CHAT_LIFECYCLE } from './lib/lifecycle';\nexport type { ChatLifecycle } from './lib/lifecycle';\n\n// Compositions\nexport { ChatComponent } from './lib/compositions/chat/chat.component';\nexport type { ChatRenderEvent } from './lib/compositions/chat/chat-render-event';\nexport { ChatPopupComponent } from './lib/compositions/chat-popup/chat-popup.component';\nexport { ChatSidebarComponent } from './lib/compositions/chat-sidebar/chat-sidebar.component';\nexport { ChatTimelineSliderComponent } from './lib/compositions/chat-timeline-slider/chat-timeline-slider.component';\nexport { ChatSidenavComponent } from './lib/compositions/chat-sidenav/chat-sidenav.component';\nexport { ChatSidenavScrimComponent } from './lib/primitives/chat-sidenav-scrim/chat-sidenav-scrim.component';\nexport type { ChatSidenavMode } from './lib/compositions/chat-sidenav/chat-sidenav.component';\nexport { ChatInterruptPanelComponent } from './lib/compositions/chat-interrupt-panel/chat-interrupt-panel.component';\nexport type { InterruptAction } from './lib/compositions/chat-interrupt-panel/chat-interrupt-panel.component';\nexport { ChatApprovalCardComponent } from './lib/compositions/chat-approval-card/chat-approval-card.component';\nexport type { ChatApprovalAction } from './lib/compositions/chat-approval-card/chat-approval-card.component';\nexport { ChatToolCallCardComponent } from './lib/compositions/chat-tool-call-card/chat-tool-call-card.component';\nexport type { ToolCallInfo } from './lib/compositions/chat-tool-call-card/chat-tool-call-card.component';\nexport { ChatSubagentCardComponent, statusColor } from './lib/compositions/chat-subagent-card/chat-subagent-card.component';\n\n// Citations resolver\nexport { CitationsResolverService } from './lib/markdown/citations-resolver.service';\nexport type { ResolvedCitation } from './lib/markdown/citations-resolver.service';\n\n// Streaming\nexport { ChatStreamingMdComponent } from './lib/streaming/streaming-markdown.component';\n\n// Markdown rendering primitives + registry\nexport { MARKDOWN_VIEW_REGISTRY } from './lib/markdown/markdown-view-registry';\nexport { MarkdownChildrenComponent } from './lib/markdown/markdown-children.component';\nexport { cacheplaneMarkdownViews } from './lib/markdown/cacheplane-markdown-views';\n\n// Per-node-type markdown view components (consumers use these to override\n// individual nodes via withViews(cacheplaneMarkdownViews, { … })).\nexport { MarkdownDocumentComponent } from './lib/markdown/views/markdown-document.component';\nexport { MarkdownParagraphComponent } from './lib/markdown/views/markdown-paragraph.component';\nexport { MarkdownHeadingComponent } from './lib/markdown/views/markdown-heading.component';\nexport { MarkdownBlockquoteComponent } from './lib/markdown/views/markdown-blockquote.component';\nexport { MarkdownListComponent } from './lib/markdown/views/markdown-list.component';\nexport { MarkdownListItemComponent } from './lib/markdown/views/markdown-list-item.component';\nexport { MarkdownCodeBlockComponent } from './lib/markdown/views/markdown-code-block.component';\nexport { MarkdownThematicBreakComponent } from './lib/markdown/views/markdown-thematic-break.component';\nexport { MarkdownTextComponent } from './lib/markdown/views/markdown-text.component';\nexport { MarkdownEmphasisComponent } from './lib/markdown/views/markdown-emphasis.component';\nexport { MarkdownStrongComponent } from './lib/markdown/views/markdown-strong.component';\nexport { MarkdownStrikethroughComponent } from './lib/markdown/views/markdown-strikethrough.component';\nexport { MarkdownInlineCodeComponent } from './lib/markdown/views/markdown-inline-code.component';\nexport { MarkdownLinkComponent } from './lib/markdown/views/markdown-link.component';\nexport { MarkdownAutolinkComponent } from './lib/markdown/views/markdown-autolink.component';\nexport { MarkdownImageComponent } from './lib/markdown/views/markdown-image.component';\nexport { MarkdownSoftBreakComponent } from './lib/markdown/views/markdown-soft-break.component';\nexport { MarkdownHardBreakComponent } from './lib/markdown/views/markdown-hard-break.component';\nexport { MarkdownCitationReferenceComponent } from './lib/markdown/views/markdown-citation-reference.component';\nexport { MarkdownTableComponent } from './lib/markdown/views/markdown-table.component';\nexport { MarkdownTableRowComponent } from './lib/markdown/views/markdown-table-row.component';\nexport { MarkdownTableCellComponent } from './lib/markdown/views/markdown-table-cell.component';\nexport { IS_HEADER_ROW } from './lib/markdown/markdown-table-row.token';\n\n// Shared styles & utilities\nexport { CHAT_MARKDOWN_STYLES } from './lib/styles/chat-markdown.styles';\nexport { renderMarkdown } from './lib/streaming/markdown-render';\nexport { messageContent } from './lib/compositions/shared/message-utils';\nexport { formatDuration } from './lib/utils/format-duration';\nexport {\n ICON_CHEVRON_DOWN, ICON_CHEVRON_UP, ICON_TOOL,\n ICON_WARNING, ICON_AGENT, ICON_CHECK, ICON_SEND,\n} from './lib/styles/chat-icons';\n\n// Views (re-exported from @threadplane/render for convenience)\nexport { views, withViews, withoutViews, toRenderRegistry } from '@threadplane/render';\nexport type { ViewRegistry } from '@threadplane/render';\n\n// Streaming / Generative UI\nexport { createContentClassifier } from './lib/streaming/content-classifier';\nexport type { ContentClassifier, ContentType } from './lib/streaming/content-classifier';\nexport { createParseTreeStore } from './lib/streaming/parse-tree-store';\nexport type { ParseTreeStore, ElementAccumulationState } from './lib/streaming/parse-tree-store';\n\n// A2UI\nexport { createA2uiSurfaceStore } from './lib/a2ui/surface-store';\nexport type { A2uiSurfaceStore, A2uiSurfaceState } from './lib/a2ui/surface-store';\nexport { normalizeViewEntry } from './lib/a2ui/views';\nexport type { A2uiViewEntry, A2uiViews } from './lib/a2ui/views';\nexport type { A2uiComponentView } from './lib/a2ui/component-view';\nexport { createPartialArgsBridge } from './lib/a2ui/partial-args-bridge';\nexport type { PartialArgsBridge } from './lib/a2ui/partial-args-bridge';\nexport { normalizeEnvelopeArgs } from './lib/a2ui/envelope-normalizer';\nexport { A2uiSurfaceComponent } from './lib/a2ui/surface.component';\nexport { surfaceToSpec } from './lib/a2ui/surface-to-spec';\nexport { buildA2uiActionMessage } from './lib/a2ui/build-action-message';\nexport { a2uiBasicCatalog } from './lib/a2ui/catalog/index';\nexport { emitBinding } from './lib/a2ui/catalog/emit-binding';\n\n// A2UI catalog components (for custom catalog composition via withViews)\nexport { A2uiTextFieldComponent } from './lib/a2ui/catalog/text-field.component';\nexport { A2uiCheckBoxComponent } from './lib/a2ui/catalog/check-box.component';\nexport { A2uiButtonComponent } from './lib/a2ui/catalog/button.component';\nexport { A2uiMultipleChoiceComponent } from './lib/a2ui/catalog/multiple-choice.component';\nexport { A2uiSliderComponent } from './lib/a2ui/catalog/slider.component';\nexport { A2uiDateTimeInputComponent } from './lib/a2ui/catalog/date-time-input.component';\nexport { A2uiTextComponent } from './lib/a2ui/catalog/text.component';\nexport { A2uiIconComponent } from './lib/a2ui/catalog/icon.component';\nexport { A2uiImageComponent } from './lib/a2ui/catalog/image.component';\nexport { A2uiColumnComponent } from './lib/a2ui/catalog/column.component';\nexport { A2uiRowComponent } from './lib/a2ui/catalog/row.component';\nexport { A2uiCardComponent } from './lib/a2ui/catalog/card.component';\nexport { A2uiDividerComponent } from './lib/a2ui/catalog/divider.component';\nexport { A2uiListComponent } from './lib/a2ui/catalog/list.component';\nexport { A2uiModalComponent } from './lib/a2ui/catalog/modal.component';\nexport { A2uiTabsComponent } from './lib/a2ui/catalog/tabs.component';\nexport { A2uiAudioPlayerComponent } from './lib/a2ui/catalog/audio-player.component';\nexport { A2uiVideoComponent } from './lib/a2ui/catalog/video.component';\n\n// A2UI types (re-exported from @threadplane/a2ui for convenience)\nexport type {\n A2uiActionMessage, A2uiClientDataModel,\n A2uiSurface, A2uiComponent, A2uiTheme,\n DynamicString, DynamicNumber, DynamicBoolean,\n A2uiChildren, A2uiAction, A2uiActionContextEntry,\n A2uiComponentDef,\n} from '@threadplane/a2ui';\nexport { isPathRef, isLiteralString, isLiteralNumber, isLiteralBoolean } from '@threadplane/a2ui';\n\n// Client tools (declaration API — tools/action/view/ask + JSON-schema derivation)\nexport { tools, action, view, ask } from './lib/client-tools/tools';\nexport { deriveJsonSchema } from './lib/client-tools/to-json-schema';\nexport type { ClientToolDef, AnyFunctionToolDef, FunctionToolDef, ViewToolDef, AskToolDef, ClientToolRegistry, StandardSchemaV1, StandardSchemaInferInput, StandardSchemaInferOutput } from './lib/client-tools/tool-def';\nexport type { ViewProps } from './lib/client-tools/component-inputs';\n/** Inferred argument type for a schema (alias of StandardSchemaInferOutput). */\nexport type ToolArgs<S extends import('./lib/client-tools/tool-def').StandardSchemaV1> = import('./lib/client-tools/tool-def').StandardSchemaInferOutput<S>;\nexport type { ClientToolSpec } from './lib/client-tools/to-json-schema';\nexport type { ClientToolsCapability, ClientToolResult } from './lib/client-tools/client-tools-capability';\nexport { validateArgs, executeFunctionTool } from './lib/client-tools/execute';\nexport { startClientToolExecutor } from './lib/client-tools/client-tool-executor';\nexport { createClientToolsCoordinator, toClientToolSpecs } from './lib/client-tools/client-tools-coordinator';\nexport type { ClientToolsCoordinator } from './lib/client-tools/client-tools-coordinator';\n\n// Test utilities (no vitest dep — safe to ship in the main runtime bundle)\nexport { mockAgent } from './lib/testing/mock-agent';\nexport type { MockAgent, MockAgentOptions } from './lib/testing/mock-agent';\n\n// Conformance helpers ship from the secondary entry point @threadplane/chat/testing\n// (they import vitest at module level; keeping them out of the main bundle).\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["defaultSummarizeGroup","isRecord","materialize"],"mappings":"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"}
1
+ {"version":3,"file":"threadplane-chat.mjs","sources":["../../../../libs/chat/src/lib/agent/agent-error.ts","../../../../libs/chat/src/lib/agent/to-agent-error.ts","../../../../libs/chat/src/lib/agent/message.ts","../../../../libs/chat/src/lib/agent/agent-ref.ts","../../../../libs/chat/src/lib/primitives/chat-message-list/message-template.directive.ts","../../../../libs/chat/src/lib/styles/chat-tokens.ts","../../../../libs/chat/src/lib/styles/chat-message-list.styles.ts","../../../../libs/chat/src/lib/primitives/chat-message-list/chat-message-list.component.ts","../../../../libs/chat/src/lib/styles/chat-message.styles.ts","../../../../libs/chat/src/lib/primitives/chat-citations/chat-citations-card.component.ts","../../../../libs/chat/src/lib/markdown/citations-resolver.service.ts","../../../../libs/chat/src/lib/primitives/chat-citations/chat-citations.component.ts","../../../../libs/chat/src/lib/primitives/chat-message/chat-message.component.ts","../../../../libs/chat/src/lib/styles/chat-message-actions.styles.ts","../../../../libs/chat/src/lib/primitives/chat-message-actions/chat-message-actions.component.ts","../../../../libs/chat/src/lib/styles/chat-window.styles.ts","../../../../libs/chat/src/lib/primitives/chat-window/chat-window.component.ts","../../../../libs/chat/src/lib/styles/chat-trace.styles.ts","../../../../libs/chat/src/lib/primitives/chat-trace/chat-trace.component.ts","../../../../libs/chat/src/lib/styles/chat-reasoning.styles.ts","../../../../libs/chat/src/lib/styles/chat-markdown.styles.ts","../../../../libs/chat/src/lib/markdown/markdown-view-registry.ts","../../../../libs/chat/src/lib/markdown/markdown-children.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-document.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-paragraph.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-heading.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-blockquote.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-list.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-list-item.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-code-block.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-thematic-break.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-text.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-emphasis.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-strong.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-strikethrough.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-inline-code.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-link.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-autolink.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-image.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-soft-break.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-hard-break.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-citation-reference.component.ts","../../../../libs/chat/src/lib/markdown/markdown-table-row.token.ts","../../../../libs/chat/src/lib/markdown/views/markdown-table-row.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-table.component.ts","../../../../libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts","../../../../libs/chat/src/lib/markdown/cacheplane-markdown-views.ts","../../../../libs/chat/src/lib/streaming/streaming-markdown.component.ts","../../../../libs/chat/src/lib/utils/format-duration.ts","../../../../libs/chat/src/lib/primitives/chat-reasoning/chat-reasoning.component.ts","../../../../libs/chat/src/lib/styles/chat-launcher-button.styles.ts","../../../../libs/chat/src/lib/primitives/chat-launcher-button/chat-launcher-button.component.ts","../../../../libs/chat/src/lib/styles/chat-suggestions.styles.ts","../../../../libs/chat/src/lib/primitives/chat-suggestions/chat-suggestions.component.ts","../../../../libs/chat/src/lib/styles/chat-input.styles.ts","../../../../libs/chat/src/lib/primitives/chat-input/chat-input.component.ts","../../../../libs/chat/src/lib/styles/chat-typing-indicator.styles.ts","../../../../libs/chat/src/lib/primitives/chat-typing-indicator/chat-typing-indicator.component.ts","../../../../libs/chat/src/lib/styles/chat-history-search-palette.styles.ts","../../../../libs/chat/src/lib/primitives/chat-history-search-palette/chat-history-search-palette.component.ts","../../../../libs/chat/src/lib/styles/chat-overflow-menu.styles.ts","../../../../libs/chat/src/lib/primitives/chat-overflow-menu/chat-overflow-menu.component.ts","../../../../libs/chat/src/lib/styles/chat-confirm-dialog.styles.ts","../../../../libs/chat/src/lib/primitives/chat-confirm-dialog/chat-confirm-dialog.component.ts","../../../../libs/chat/src/lib/styles/chat-scroll-bubble.styles.ts","../../../../libs/chat/src/lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component.ts","../../../../libs/chat/src/lib/styles/chat-error.styles.ts","../../../../libs/chat/src/lib/primitives/chat-error/chat-error.component.ts","../../../../libs/chat/src/lib/styles/chat-interrupt.styles.ts","../../../../libs/chat/src/lib/primitives/chat-interrupt/chat-interrupt.component.ts","../../../../libs/chat/src/lib/compositions/chat-tool-call-card/chat-tool-call-card.component.ts","../../../../libs/chat/src/lib/compositions/chat-subagent-card/chat-subagent-card.component.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-call-template.directive.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/group-summary.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/resolve-message-tool-calls.ts","../../../../libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-calls.component.ts","../../../../libs/chat/src/lib/styles/chat-generative-ui.styles.ts","../../../../libs/chat/src/lib/primitives/chat-generative-ui/normalize-json-render-spec.ts","../../../../libs/chat/src/lib/primitives/chat-generative-ui/chat-generative-ui.component.ts","../../../../libs/chat/src/lib/primitives/chat-tool-views/chat-tool-views.component.ts","../../../../libs/chat/src/lib/primitives/chat-subagents/chat-subagents.component.ts","../../../../libs/chat/src/lib/styles/chat-thread-list.styles.ts","../../../../libs/chat/src/lib/primitives/chat-thread-list/chat-thread-list.component.ts","../../../../libs/chat/src/lib/styles/chat-project-list.styles.ts","../../../../libs/chat/src/lib/primitives/chat-project-list/chat-project-list.component.ts","../../../../libs/chat/src/lib/primitives/chat-genui-skeleton/chat-genui-skeleton.component.ts","../../../../libs/chat/src/lib/primitives/chat-timeline/chat-timeline.component.ts","../../../../libs/chat/src/lib/styles/chat-welcome.styles.ts","../../../../libs/chat/src/lib/primitives/chat-welcome/chat-welcome.component.ts","../../../../libs/chat/src/lib/primitives/chat-welcome/chat-welcome-suggestion.component.ts","../../../../libs/chat/src/lib/styles/chat-select.styles.ts","../../../../libs/chat/src/lib/primitives/chat-select/chat-select.component.ts","../../../../libs/chat/src/lib/provide-chat.ts","../../../../libs/chat/src/lib/routing/thread-routing.ts","../../../../libs/chat/src/lib/lifecycle.ts","../../../../libs/chat/src/lib/client-tools/to-json-schema.ts","../../../../libs/chat/src/lib/client-tools/execute.ts","../../../../libs/chat/src/lib/client-tools/client-tool-executor.ts","../../../../libs/chat/src/lib/client-tools/client-tools-coordinator.ts","../../../../libs/chat/src/lib/a2ui/surface-to-spec.ts","../../../../libs/chat/src/lib/a2ui/build-action-message.ts","../../../../libs/chat/src/lib/a2ui/a2ui-default-fallback.component.ts","../../../../libs/chat/src/lib/a2ui/surface.component.ts","../../../../libs/chat/src/lib/streaming/parse-tree-store.ts","../../../../libs/chat/src/lib/a2ui/extract-bindings.ts","../../../../libs/chat/src/lib/a2ui/surface-store.ts","../../../../libs/chat/src/lib/streaming/trace.ts","../../../../libs/chat/src/lib/streaming/content-classifier.ts","../../../../libs/chat/src/lib/a2ui/envelope-normalizer.ts","../../../../libs/chat/src/lib/a2ui/partial-args-bridge.ts","../../../../libs/chat/src/lib/a2ui/action-label.ts","../../../../libs/chat/src/lib/compositions/shared/message-utils.ts","../../../../libs/chat/src/lib/compositions/chat/chat.component.ts","../../../../libs/chat/src/lib/compositions/chat-popup/chat-popup.component.ts","../../../../libs/chat/src/lib/compositions/chat-sidebar/chat-sidebar.component.ts","../../../../libs/chat/src/lib/compositions/chat-timeline-slider/chat-timeline-slider.component.ts","../../../../libs/chat/src/lib/styles/chat-sidenav.styles.ts","../../../../libs/chat/src/lib/compositions/chat-sidenav/chat-debug-gate.ts","../../../../libs/chat/src/lib/compositions/chat-sidenav/chat-sidenav.component.ts","../../../../libs/chat/src/lib/primitives/chat-sidenav-scrim/chat-sidenav-scrim.component.ts","../../../../libs/chat/src/lib/compositions/chat-interrupt-panel/chat-interrupt-panel.component.ts","../../../../libs/chat/src/lib/compositions/chat-approval-card/chat-approval-card.component.ts","../../../../libs/chat/src/lib/streaming/markdown-render.ts","../../../../libs/chat/src/lib/a2ui/views.ts","../../../../libs/chat/src/lib/a2ui/catalog/audio-player.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/button.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/card.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/emit-binding.ts","../../../../libs/chat/src/lib/a2ui/catalog/check-box.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/column.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/date-time-input.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/divider.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/icon.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/image.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/list.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/modal.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/multiple-choice.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/row.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/slider.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/tabs.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/text.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/text-field.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/video.component.ts","../../../../libs/chat/src/lib/a2ui/catalog/index.ts","../../../../libs/chat/src/lib/client-tools/tools.ts","../../../../libs/chat/src/lib/testing/mock-agent.ts","../../../../libs/chat/src/public-api.ts","../../../../libs/chat/src/threadplane-chat.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n\n/**\n * The failure class of an {@link AgentError}, used to drive UI and retry logic:\n *\n * - `connection` — offline / DNS / connection refused / `fetch` failed. Retryable.\n * - `auth` — `401` / `403`; credentials or API key are wrong. Not retryable.\n * - `server` — a `5xx` (retryable) or a non-auth `4xx` like `400`/`404`/`429` (not retryable).\n * - `interrupted` — the stream closed mid-response after a run had started. Retryable.\n * - `aborted` — the user pressed stop; treated as a graceful idle, not surfaced as an error.\n */\nexport type AgentErrorKind = 'connection' | 'auth' | 'server' | 'interrupted' | 'aborted';\n\n/**\n * Structured, classified failure surfaced on `Agent.error`. Extends `Error`, so\n * existing `.message` / `instanceof Error` reads keep working — but adds a\n * machine-readable {@link AgentErrorKind}, a `retryable` flag, an optional HTTP\n * `status`, and the original `cause`.\n *\n * You rarely construct one yourself; adapters normalize raw failures via\n * {@link toAgentError}. Read it off the agent to render legible, cause-specific UI:\n *\n * @example\n * ```ts\n * const err = agent.error(); // AgentError | undefined\n * if (err) {\n * console.warn(err.message); // legible, per-kind copy\n * if (err.kind === 'auth') showApiKeyHelp();\n * if (err.retryable) showRetryButton(); // → agent.retry()\n * }\n * ```\n */\nexport class AgentError extends Error {\n /** The classified failure type. See {@link AgentErrorKind}. */\n readonly kind: AgentErrorKind;\n /** Whether retrying the same request could plausibly succeed:\n * `connection` | `server` (5xx) | `interrupted` → true; `auth` | `aborted` | non-auth `4xx` → false. */\n readonly retryable: boolean;\n /** The HTTP status code when the failure came from an HTTP response. */\n readonly status?: number;\n /** The original raw error this was classified from, preserved for debugging/telemetry. */\n override readonly cause: unknown;\n\n constructor(init: { kind: AgentErrorKind; message: string; retryable: boolean; status?: number; cause?: unknown }) {\n super(init.message);\n this.name = 'AgentError';\n this.kind = init.kind;\n this.retryable = init.retryable;\n this.status = init.status;\n this.cause = init.cause;\n }\n}\n\n/**\n * Default, human-facing copy per {@link AgentErrorKind}. Used as the message when\n * a classified error has no better text. Override by mapping `error.kind` to your\n * own strings in a custom error component.\n */\nexport const AGENT_ERROR_MESSAGES: Record<AgentErrorKind, string> = {\n connection: \"Can't reach the server. Check your connection and try again.\",\n auth: 'Authentication failed. Check your API key or credentials.',\n server: 'The server ran into an error. You can try again.',\n interrupted: 'The response was interrupted. Try again.',\n aborted: 'Stopped.',\n};\n","// SPDX-License-Identifier: MIT\nimport { AgentError, AGENT_ERROR_MESSAGES, type AgentErrorKind } from './agent-error';\n\n/**\n * Whether `raw` represents an abort (a `DOMException`/`Error` named `AbortError`,\n * or an abort-ish message). Shared by the runtime adapters and {@link toAgentError}\n * so a user-requested stop settles to idle instead of surfacing as an error.\n *\n * @param raw Any thrown/rejected value.\n * @returns `true` if it looks like an abort.\n */\nexport function isAbortError(raw: unknown): boolean {\n return raw instanceof Error && (raw.name === 'AbortError' || /\\babort/i.test(raw.message));\n}\n\n/**\n * Reads a numeric status from `raw.status` or `raw.cause.status` only.\n * No text parsing — structured fields only.\n */\nfunction structuredStatus(raw: unknown): number | undefined {\n const obj = raw as { status?: unknown; cause?: { status?: unknown } } | null;\n const direct = typeof obj?.status === 'number' ? obj.status : undefined;\n const viaCause = typeof obj?.cause?.status === 'number' ? obj!.cause!.status : undefined;\n if (direct !== undefined) return direct;\n if (viaCause !== undefined) return viaCause;\n return undefined;\n}\n\nfunction isConnectionError(raw: unknown): boolean {\n if (!(raw instanceof Error)) return false;\n return /failed to fetch|networkerror|econnrefused|enotfound|network request failed|load failed/i.test(\n `${raw.name} ${raw.message}`,\n );\n}\n\n/**\n * Extracts an HTTP status code from a message string, but ONLY when the token\n * is unambiguously HTTP-shaped:\n * - `HTTP/502`, `HTTP 404`, `HTTP404`\n * - `status: 503`, `status=503`, `code: 404`\n *\n * Bare 3-digit numbers (e.g. model version strings like \"gpt-500\") are NOT matched.\n */\nfunction httpStatusFromMessage(raw: unknown): number | undefined {\n const msg =\n raw instanceof Error ? raw.message : typeof raw === 'string' ? raw : '';\n if (!msg) return undefined;\n\n // \"HTTP 500\", \"HTTP/500\", \"HTTP500\"\n const httpToken = /\\bHTTP[ /]?(\\d{3})\\b/i.exec(msg);\n if (httpToken) return Number(httpToken[1]);\n\n // \"status: 503\", \"status=503\", \"status 503\" (up to 4 non-digit chars between keyword and digits)\n // Also matches \"code: 404\", \"code=404\", etc.\n const prefixed = /\\b(?:status|code)\\b\\D{0,4}(\\d{3})\\b/i.exec(msg);\n if (prefixed) return Number(prefixed[1]);\n\n return undefined;\n}\n\nfunction make(kind: AgentErrorKind, retryable: boolean, raw: unknown, status?: number, message?: string): AgentError {\n return new AgentError({ kind, retryable, status, cause: raw, message: message ?? AGENT_ERROR_MESSAGES[kind] });\n}\n\nfunction classifyByStatus(status: number, raw: unknown): AgentError {\n if (status === 401 || status === 403) return make('auth', false, raw, status);\n if (status >= 500) return make('server', true, raw, status);\n if (status >= 400) return make('server', false, raw, status, `The request was rejected (HTTP ${status}).`);\n // Stray 2xx/3xx from a status field — treat as unknown transient failure, no status.\n return make('server', true, raw, undefined, 'Something went wrong. You can try again.');\n}\n\n/**\n * Classify any raw error into a structured {@link AgentError}.\n *\n * Resolution order (first match wins): an existing `AgentError` is returned\n * unchanged (idempotent) → a user abort → a structured `status`/`cause.status`\n * → network/connection markers → an HTTP-shaped status in the message → a\n * `server` + retryable fallback. The original error is always preserved on\n * `cause`. Runtime adapters call this before setting `Agent.error`; custom\n * backends can call it too (or throw an `AgentError` directly).\n *\n * @param raw Any thrown/rejected value — an `Error`, a `{ status }` object, a string, etc.\n * @returns The classified {@link AgentError} (kind, retryable, status?, cause).\n * @example\n * ```ts\n * const e = toAgentError(new Error('HTTP 500: Internal Server Error'));\n * e.kind; // 'server'\n * e.retryable; // true\n * e.status; // 500\n * ```\n */\nexport function toAgentError(raw: unknown): AgentError {\n if (raw instanceof AgentError) return raw;\n if (isAbortError(raw)) return make('aborted', false, raw);\n\n // 1. Structured status (authoritative): raw.status or raw.cause.status.\n const structured = structuredStatus(raw);\n if (structured !== undefined) return classifyByStatus(structured, raw);\n\n // 2. Network/connection markers are definitive — before any loose text parsing.\n if (isConnectionError(raw)) return make('connection', true, raw);\n\n // 3. Best-effort: only an HTTP-shaped status token in the message counts.\n const httpStatus = httpStatusFromMessage(raw);\n if (httpStatus !== undefined) return classifyByStatus(httpStatus, raw);\n\n // 4. Fallback: unknown failure, assume transient.\n const msg = raw instanceof Error && raw.message ? raw.message : 'Something went wrong. You can try again.';\n return make('server', true, raw, undefined, msg);\n}\n","// SPDX-License-Identifier: MIT\nimport type { ContentBlock } from './content-block';\nimport type { Citation } from './citation';\n\nexport type Role = 'user' | 'assistant' | 'system' | 'tool';\n\nexport interface Message {\n id: string;\n role: Role;\n /** Plain text, or a list of structured content blocks. */\n content: string | ContentBlock[];\n /** Present when role === 'tool'. */\n toolCallId?: string;\n /** Optional display/author name. */\n name?: string;\n /**\n * Reasoning text emitted by the model before/alongside the visible\n * response. Populated by adapters from {type:'reasoning'} or\n * {type:'thinking'} content blocks (LangGraph) or REASONING_MESSAGE_*\n * events (AG-UI). Always a plain string — provider-specific shape\n * (encrypted blocks, multi-step summaries) is absorbed by the adapter\n * and not surfaced here.\n */\n reasoning?: string;\n /**\n * Wall-clock duration of the reasoning phase in milliseconds.\n * Populated by the adapter when both start (first reasoning chunk) and\n * end (first response-text chunk, or final canonical message) are\n * known. Undefined when reasoning timing isn't available.\n */\n reasoningDurationMs?: number;\n /** Runtime-specific extras; do not rely on shape in portable code. */\n extra?: Record<string, unknown>;\n /** Provider-agnostic citation list. Populated by adapters. */\n citations?: Citation[];\n /**\n * IDs of tool calls emitted BY this assistant message. Populated by\n * adapters from provider-native fields (LangGraph: `tool_calls[].id`;\n * Anthropic: `tool_use` content blocks). Used by `<chat-tool-calls>` to\n * scope its rendering to a single message — otherwise it falls back to\n * the agent's global toolCalls list, which renders duplicates across\n * every AI message in a thread.\n */\n toolCallIds?: string[];\n}\n\n/**\n * Type guard narrowing a {@link Message} to `role: 'user'`.\n *\n * @param m The message to test.\n * @returns `true` (and narrows `m`) when the message was sent by the user.\n * @example\n * ```ts\n * const userTurns = agent.messages().filter(isUserMessage);\n * ```\n */\nexport function isUserMessage(m: Message): m is Message & { role: 'user' } {\n return m.role === 'user';\n}\n\n/**\n * Type guard narrowing a {@link Message} to `role: 'assistant'`.\n *\n * @param m The message to test.\n * @returns `true` (and narrows `m`) when the message came from the assistant.\n * @example\n * ```ts\n * const reply = agent.messages().findLast(isAssistantMessage);\n * ```\n */\nexport function isAssistantMessage(m: Message): m is Message & { role: 'assistant' } {\n return m.role === 'assistant';\n}\n\n/**\n * Type guard narrowing a {@link Message} to `role: 'tool'` (a tool result turn).\n *\n * @param m The message to test.\n * @returns `true` (and narrows `m`) when the message is a tool result.\n * @example\n * ```ts\n * if (isToolMessage(m)) console.log(m.toolCallId);\n * ```\n */\nexport function isToolMessage(m: Message): m is Message & { role: 'tool' } {\n return m.role === 'tool';\n}\n\n/**\n * Type guard narrowing a {@link Message} to `role: 'system'`.\n *\n * @param m The message to test.\n * @returns `true` (and narrows `m`) when the message is a system message.\n * @example\n * ```ts\n * const visible = agent.messages().filter((m) => !isSystemMessage(m));\n * ```\n */\nexport function isSystemMessage(m: Message): m is Message & { role: 'system' } {\n return m.role === 'system';\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken } from '@angular/core';\nimport type { Agent } from './agent';\n\n/** A typed handle that threads a state shape through Angular DI from\n * `provideAgent(ref, …)` to `injectAgent(ref)` without per-call-site\n * restatement of the generic. */\nexport interface AgentRef<TState> {\n readonly token: InjectionToken<Agent<TState>>;\n}\n\n/**\n * Create a typed agent handle.\n *\n * @param debugName Optional name shown in Angular DI error messages.\n * @returns An {@link AgentRef} carrying a state-typed `InjectionToken`.\n * @example\n * ```ts\n * interface TripState { day: number; places: string[]; }\n * export const TRIP = createAgentRef<TripState>('trip');\n * // app.config.ts: provideAgent(TRIP, { assistantId: 'trip' })\n * // component: const agent = injectAgent(TRIP); // LangGraphAgent<TripState>\n * ```\n */\nexport function createAgentRef<TState>(debugName?: string): AgentRef<TState> {\n return { token: new InjectionToken<Agent<TState>>(debugName ?? 'ThreadplaneAgent') };\n}\n","// SPDX-License-Identifier: MIT\nimport { Directive, input, TemplateRef, inject } from '@angular/core';\nimport type { MessageTemplateType } from '../../chat.types';\n\n@Directive({\n selector: 'ng-template[chatMessageTemplate]',\n standalone: true,\n})\nexport class MessageTemplateDirective {\n readonly chatMessageTemplate = input.required<MessageTemplateType>();\n readonly templateRef = inject(TemplateRef);\n}\n","// libs/chat/src/lib/styles/chat-tokens.ts\n// SPDX-License-Identifier: MIT\n\nconst LIGHT_TOKENS = `\n --ngaf-chat-bg: rgb(255, 255, 255);\n --ngaf-chat-surface: rgb(255, 255, 255);\n --ngaf-chat-surface-alt: rgb(251, 251, 251);\n --ngaf-chat-primary: rgb(28, 28, 28);\n --ngaf-chat-on-primary: rgb(255, 255, 255);\n --ngaf-chat-text: rgb(28, 28, 28);\n --ngaf-chat-text-muted: rgb(115, 115, 115);\n --ngaf-chat-separator: rgb(229, 229, 229);\n --ngaf-chat-muted: rgb(200, 200, 200);\n --ngaf-chat-error-bg: #fef2f2;\n --ngaf-chat-error-border: #fecaca;\n --ngaf-chat-error-text: #dc2626;\n --ngaf-chat-destructive: #dc2626;\n --ngaf-chat-warning-bg: #fffbeb;\n --ngaf-chat-warning-text: #b45309;\n --ngaf-chat-success: #16a34a;\n --ngaf-chat-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\n --ngaf-chat-shadow-md: 0 4px 6px -1px rgba(0,0,0,.10), 0 2px 4px -1px rgba(0,0,0,.06);\n --ngaf-chat-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.10), 0 4px 6px -2px rgba(0,0,0,.05);\n\n /* --a2ui-* light variant */\n --a2ui-primary: #4f8df5;\n --a2ui-on-primary: #ffffff;\n --a2ui-primary-hover: #3a78e0;\n --a2ui-secondary: #5f6470;\n --a2ui-on-secondary: #ffffff;\n --a2ui-surface: #ffffff;\n --a2ui-on-surface: #1a1d23;\n --a2ui-surface-variant: rgba(0, 0, 0, 0.04);\n --a2ui-on-surface-variant: rgba(0, 0, 0, 0.6);\n --a2ui-outline: rgba(0, 0, 0, 0.12);\n --a2ui-outline-variant: rgba(0, 0, 0, 0.06);\n --a2ui-error: #dc2626;\n --a2ui-on-error: #ffffff;\n --a2ui-scrim: rgba(0, 0, 0, 0.4);\n --a2ui-elevation-0: none;\n --a2ui-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.06);\n --a2ui-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.08);\n --a2ui-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.10);\n --a2ui-elevation-4: 0 8px 16px rgba(0, 0, 0, 0.14);\n --a2ui-elevation-5: 0 16px 32px rgba(0, 0, 0, 0.18);\n`;\n\nconst DARK_TOKENS = `\n --ngaf-chat-bg: rgb(17, 17, 17);\n --ngaf-chat-surface: rgb(28, 28, 28);\n --ngaf-chat-surface-alt: rgb(44, 44, 44);\n --ngaf-chat-primary: rgb(255, 255, 255);\n --ngaf-chat-on-primary: rgb(28, 28, 28);\n --ngaf-chat-text: rgb(245, 245, 245);\n --ngaf-chat-text-muted: rgb(160, 160, 160);\n --ngaf-chat-separator: rgb(45, 45, 45);\n --ngaf-chat-muted: rgb(60, 60, 60);\n --ngaf-chat-error-bg: rgb(45, 21, 21);\n --ngaf-chat-error-border: #dc2626;\n --ngaf-chat-error-text: #fca5a5;\n --ngaf-chat-destructive: #ef4444;\n --ngaf-chat-warning-bg: rgb(45, 35, 21);\n --ngaf-chat-warning-text: #fbbf24;\n --ngaf-chat-success: #4ade80;\n\n /* --a2ui-* dark variant (preserves current chat.css values) */\n --a2ui-primary: #4f8df5;\n --a2ui-on-primary: #ffffff;\n --a2ui-primary-hover: #6699f7;\n --a2ui-secondary: #8a92a3;\n --a2ui-on-secondary: #ffffff;\n --a2ui-surface: #1a1d23;\n --a2ui-on-surface: #ffffff;\n --a2ui-surface-variant: rgba(255, 255, 255, 0.05);\n --a2ui-on-surface-variant: rgba(255, 255, 255, 0.7);\n --a2ui-outline: rgba(255, 255, 255, 0.1);\n --a2ui-outline-variant: rgba(255, 255, 255, 0.05);\n --a2ui-error: #f5524f;\n --a2ui-on-error: #ffffff;\n --a2ui-scrim: rgba(0, 0, 0, 0.6);\n --a2ui-elevation-0: none;\n --a2ui-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.3);\n --a2ui-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.35);\n --a2ui-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.4);\n --a2ui-elevation-4: 0 8px 16px rgba(0, 0, 0, 0.45);\n --a2ui-elevation-5: 0 16px 32px rgba(0, 0, 0, 0.5);\n`;\n\nconst GEOMETRY_TOKENS = `\n --ngaf-chat-radius-bubble: 15px;\n --ngaf-chat-radius-input: 20px;\n --ngaf-chat-radius-card: 8px;\n --ngaf-chat-radius-button: 8px;\n --ngaf-chat-radius-launcher: 9999px;\n --ngaf-chat-max-width: 48rem;\n`;\n\nconst TYPOGRAPHY_TOKENS = `\n --ngaf-chat-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --ngaf-chat-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --ngaf-chat-font-size: 1rem;\n --ngaf-chat-font-size-sm: 0.875rem;\n --ngaf-chat-font-size-xs: 0.75rem;\n --ngaf-chat-line-height: 1.6;\n --ngaf-chat-line-height-tight: 1.5;\n`;\n\nconst SPACING_TOKENS = `\n --ngaf-chat-space-1: 4px;\n --ngaf-chat-space-2: 8px;\n --ngaf-chat-space-3: 12px;\n --ngaf-chat-space-4: 16px;\n --ngaf-chat-space-5: 20px;\n --ngaf-chat-space-6: 24px;\n --ngaf-chat-space-8: 32px;\n --ngaf-chat-edge-pad: 16px;\n --ngaf-chat-input-gap: 0.75rem;\n --ngaf-chat-sidenav-width-expanded: 280px;\n --ngaf-chat-sidenav-width-collapsed: 56px;\n --ngaf-chat-sidenav-width-drawer: 280px;\n`;\n\nconst LAYER_TOKENS = `\n /* Z-index layers — documented for consumers + future primitives.\n * Default values listed; overridable per-app via :root or :host.\n * Modal layers sit above drawer so palettes/dialogs stay reachable\n * when the drawer is open. */\n --ngaf-chat-z-overlay-content: 30; /* chat-sidebar panel, chat-popup window */\n --ngaf-chat-z-drawer-scrim: 1000; /* chat-sidenav-scrim backdrop */\n --ngaf-chat-z-drawer: 1001; /* chat-sidenav drawer mode host */\n --ngaf-chat-z-modal-scrim: 1100; /* chat-history-search-palette backdrop */\n --ngaf-chat-z-modal: 1101; /* chat-history-search-palette dialog */\n`;\n\nconst EDGE_CLAIM_TOKENS = `\n /* Edge-claim primitive — peer-aware panel coexistence.\n Each docked panel publishes the edge it occupies via a\n data-threadplane-chat-* attribute on <html>; other panels read these\n custom properties to leave room. Defaults to 0px so consumers\n not using chat-sidebar/chat-debug see zero overhead.\n\n TWO LAYERS:\n 1. Per-component claim vars (--ngaf-chat-<component>-claim-<edge>)\n are read by PEERS only — never by the component that wrote\n them. This eliminates self-feedback (where a right-docked\n panel would offset itself by reading its own claim).\n 2. Aggregate occupy-* vars are convenience reads for external\n consumers and for cases where any-panel-on-edge matters. */\n --ngaf-chat-occupy-top: 0px;\n --ngaf-chat-occupy-right: 0px;\n --ngaf-chat-occupy-bottom: 0px;\n --ngaf-chat-occupy-left: 0px;\n\n /* Per-component claims (peer-only reads). */\n --ngaf-chat-sidebar-claim-right: 0px;\n --ngaf-chat-debug-claim-top: 0px;\n --ngaf-chat-debug-claim-right: 0px;\n --ngaf-chat-debug-claim-bottom: 0px;\n --ngaf-chat-debug-claim-left: 0px;\n\n /* Sizes the chat-debug dock contributes when it claims an edge.\n Split by orientation so consumers can override independently. */\n --ngaf-chat-debug-panel-size-h: 40vh;\n --ngaf-chat-debug-panel-size-w: 420px;\n`;\n\nconst KEYFRAMES = `\n @keyframes ngaf-chat-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes ngaf-chat-typing-dot {\n 0%, 80%, 100% { transform: scale(0.5); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes ngaf-chat-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n @keyframes ngaf-chat-caret-blink {\n 0%, 50% { opacity: 1; }\n 50.01%, 100% { opacity: 0; }\n }\n @keyframes ngaf-chat-caret-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes ngaf-chat-welcome-mount {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n`;\n\n/**\n * Component-scoped styles. Imported into every chat component's `styles`\n * array. Carries only:\n * - `:host` font-family + color (so the component inherits text styling)\n * - keyframes the components use\n *\n * Token *defaults* are NOT set on `:host` — they're set on `:root` via the\n * shared style element below (`ensureChatRootStyles()`). That shift is what\n * makes the documented `:root { --ngaf-chat-*: ... }` consumer override\n * actually work, because direct-on-host token settings would shadow\n * inheritance regardless of CSS specificity.\n */\nexport const CHAT_HOST_TOKENS = `\n :host {\n font-family: var(--ngaf-chat-font-family);\n color: var(--ngaf-chat-text);\n }\n`;\n// Note: @keyframes are NOT placed in CHAT_HOST_TOKENS. Angular's emulated\n// view encapsulation scopes @keyframes names per-component, which can\n// desynchronise from animation property references when styles are\n// concatenated across helper strings. They're injected globally via\n// ROOT_TOKEN_STYLES below so the names match what `animation: ngaf-chat-*`\n// references in component styles (which Angular leaves untouched).\n\n/**\n * WCAG 2.3.3 — honor the OS-level \"Reduce Motion\" preference. Collapses\n * every transition/animation in the chat lib (and the a2ui catalog,\n * which renders in the same document) to instant. The `!important`\n * flag intentionally overrides any inline `style=\"transition: ...\"`\n * applied by future code — accessibility wins.\n *\n * Infinite-loop indicators (spinner, typing dots, caret, etc.) need\n * explicit `animation: none` because `iteration-count: 1` alone would\n * freeze them mid-loop, which reads as a bug.\n */\nconst REDUCED_MOTION_STYLES = `\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n\n .tcc__pill[data-status=\"running\"] svg,\n .ngaf-chat-typing-dot,\n .ngaf-chat-caret,\n .ngaf-chat-welcome__pulse,\n .chat-genui-skeleton,\n .chat-debug__pill--active {\n animation: none !important;\n opacity: 1 !important;\n }\n\n .tcc__pill[data-status=\"running\"] svg {\n transform: none !important;\n }\n}\n`;\n\n/**\n * Token defaults written to `<head>` once on first chat-component\n * construction. Wrapped in `@layer ngaf-chat` so the consumer's unlayered\n * `:root { --ngaf-chat-*: ... }` rule beats the lib's defaults regardless\n * of source order — the standard CSS pattern for framework defaults.\n *\n * Theme switching:\n * - `prefers-color-scheme: dark` → dark by default.\n * - `[data-theme=\"dark\"]` on `<html>` / `<body>` / any wrapper\n * forces dark.\n * - `[data-theme=\"light\"]` forces light.\n */\nconst A2UI_INVARIANT_TOKENS = `\n /* --a2ui-* theme-invariant tokens (spacing, typography, shape, motion, focus, aliases) */\n\n /* Spacing scale (4px base) */\n --a2ui-spacing-1: 4px;\n --a2ui-spacing-2: 8px;\n --a2ui-spacing-3: 12px;\n --a2ui-spacing-4: 16px;\n --a2ui-spacing-5: 24px;\n --a2ui-spacing-6: 32px;\n --a2ui-spacing-7: 40px;\n\n /* Typography (per Text usageHint) */\n --a2ui-typography-h1-size: 32px;\n --a2ui-typography-h1-weight: 700;\n --a2ui-typography-h1-line-height: 1.2;\n --a2ui-typography-h2-size: 24px;\n --a2ui-typography-h2-weight: 600;\n --a2ui-typography-h2-line-height: 1.3;\n --a2ui-typography-h3-size: 20px;\n --a2ui-typography-h3-weight: 600;\n --a2ui-typography-h3-line-height: 1.3;\n --a2ui-typography-h4-size: 18px;\n --a2ui-typography-h4-weight: 500;\n --a2ui-typography-h4-line-height: 1.4;\n --a2ui-typography-h5-size: 16px;\n --a2ui-typography-h5-weight: 500;\n --a2ui-typography-h5-line-height: 1.4;\n --a2ui-typography-body-size: 14px;\n --a2ui-typography-body-weight: 400;\n --a2ui-typography-body-line-height: 1.5;\n --a2ui-typography-caption-size: 12px;\n --a2ui-typography-caption-weight: 400;\n --a2ui-typography-caption-line-height: 1.4;\n --a2ui-typography-label-size: 12px;\n --a2ui-typography-label-weight: 500;\n\n /* Shape radius */\n --a2ui-shape-extra-small: 4px;\n --a2ui-shape-small: 8px;\n --a2ui-shape-medium: 12px;\n --a2ui-shape-large: 16px;\n --a2ui-shape-extra-large: 28px;\n\n /* Focus ring */\n --a2ui-focus-ring-color: var(--a2ui-primary);\n --a2ui-focus-ring-width: 2px;\n\n /* Motion */\n --a2ui-motion-duration-short: 100ms;\n --a2ui-motion-duration-medium: 200ms;\n --a2ui-motion-duration-long: 300ms;\n --a2ui-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);\n --a2ui-motion-easing-emphasized: cubic-bezier(0.2, 0, 0, 1.4);\n\n /* Aliases (kept for back-compat) */\n --a2ui-card-bg: var(--a2ui-surface);\n --a2ui-input-bg: var(--a2ui-surface-variant);\n --a2ui-input-text: var(--a2ui-on-surface);\n --a2ui-label: var(--a2ui-on-surface-variant);\n --a2ui-caption: var(--a2ui-on-surface-variant);\n --a2ui-border: var(--a2ui-outline);\n`;\n\nexport const ROOT_TOKEN_STYLES = `\n@layer ngaf-chat {\n :root {\n ${LIGHT_TOKENS}\n ${GEOMETRY_TOKENS}\n ${TYPOGRAPHY_TOKENS}\n ${SPACING_TOKENS}\n ${LAYER_TOKENS}\n ${EDGE_CLAIM_TOKENS}\n ${A2UI_INVARIANT_TOKENS}\n }\n @media (prefers-color-scheme: dark) {\n :root { ${DARK_TOKENS} }\n }\n :root[data-theme=\"light\"],\n [data-theme=\"light\"],\n :root[data-threadplane-chat-theme=\"light\"],\n [data-threadplane-chat-theme=\"light\"] { ${LIGHT_TOKENS} }\n :root[data-theme=\"dark\"],\n [data-theme=\"dark\"],\n :root[data-threadplane-chat-theme=\"dark\"],\n [data-threadplane-chat-theme=\"dark\"] { ${DARK_TOKENS} }\n\n /* Edge-claim attribute mappings.\n chat-sidebar sets data-threadplane-chat-sidebar=\"open\" while its panel is open.\n chat-debug sets data-threadplane-chat-debug to its current dock while open. */\n :root[data-threadplane-chat-sidebar=\"open\"] {\n --ngaf-chat-sidebar-claim-right: var(--ngaf-chat-sidebar-width-drawer, 28rem);\n --ngaf-chat-occupy-right: var(--ngaf-chat-sidebar-width-drawer, 28rem);\n }\n :root[data-threadplane-chat-debug=\"bottom\"] {\n --ngaf-chat-debug-claim-bottom: var(--ngaf-chat-debug-panel-size-h, 40vh);\n --ngaf-chat-occupy-bottom: var(--ngaf-chat-debug-panel-size-h, 40vh);\n }\n :root[data-threadplane-chat-debug=\"right\"] {\n --ngaf-chat-debug-claim-right: var(--ngaf-chat-debug-panel-size-w, 420px);\n --ngaf-chat-occupy-right: var(--ngaf-chat-debug-panel-size-w, 420px);\n }\n :root[data-threadplane-chat-debug=\"left\"] {\n --ngaf-chat-debug-claim-left: var(--ngaf-chat-debug-panel-size-w, 420px);\n --ngaf-chat-occupy-left: var(--ngaf-chat-debug-panel-size-w, 420px);\n }\n}\n${KEYFRAMES}\n${REDUCED_MOTION_STYLES}\n`;\n\nconst STYLE_ELEMENT_ID = 'ngaf-chat-root-tokens';\n\n/**\n * Idempotent: appends a `<style id=\"ngaf-chat-root-tokens\">` to `<head>`\n * the first time it's called. Subsequent calls are no-ops.\n *\n * No-op outside the browser (server-side rendering).\n */\nexport function ensureChatRootStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ELEMENT_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ELEMENT_ID;\n style.textContent = ROOT_TOKEN_STYLES;\n document.head.appendChild(style);\n}\n\n// Auto-inject on module evaluation. Every chat component imports\n// `CHAT_HOST_TOKENS` from this file, so the first chat component to load\n// triggers this once. Safe to evaluate eagerly: idempotent + SSR-guarded.\n//\n// Note: this side-effect call is the \"fast path\" — it normally fires\n// during the first chat-component import on the client. But production\n// bundlers with aggressive tree-shaking can drop it if they treat the\n// published artifact as side-effect-free (the published `sideEffects`\n// field doesn't match the bundled fesm filename, and TS-path consumers\n// route through the source where it does match). The top-level chat\n// compositions (`ChatComponent`, `ChatPopupComponent`,\n// `ChatSidebarComponent`, `ChatDebugComponent`) also call this from\n// their constructors so the injection is guaranteed even when the\n// module-eval call gets stripped. Both paths are idempotent.\nensureChatRootStyles();\n","// libs/chat/src/lib/styles/chat-message-list.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_MESSAGE_LIST_STYLES = `\n :host {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: var(--ngaf-chat-space-4) var(--ngaf-chat-space-6);\n max-width: var(--ngaf-chat-max-width);\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n }\n`;\n","// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n contentChildren,\n input,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent, Message } from '../../agent';\nimport { MessageTemplateDirective } from './message-template.directive';\nimport type { MessageTemplateType } from '../../chat.types';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_MESSAGE_LIST_STYLES } from '../../styles/chat-message-list.styles';\n\n/**\n * Maps a {@link Message} to a {@link MessageTemplateType}.\n * Exported as a standalone function so it can be unit-tested without DOM rendering.\n */\nexport function getMessageType(message: Message): MessageTemplateType {\n switch (message.role) {\n case 'user':\n return 'human';\n case 'assistant':\n return 'ai';\n case 'tool':\n return 'tool';\n case 'system':\n return 'system';\n default:\n return 'ai';\n }\n}\n\n@Component({\n selector: 'chat-message-list',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_MESSAGE_LIST_STYLES],\n template: `\n @for (message of messages(); track message.id) {\n @let template = findTemplate(getMessageType(message));\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: message, index: $index }\"\n />\n }\n }\n `,\n})\nexport class ChatMessageListComponent {\n readonly agent = input.required<Agent>();\n\n readonly messageTemplates = contentChildren(MessageTemplateDirective);\n\n readonly messages = computed(() => this.agent().messages());\n\n readonly getMessageType = getMessageType;\n\n findTemplate(type: MessageTemplateType): MessageTemplateDirective | undefined {\n return this.messageTemplates().find(t => t.chatMessageTemplate() === type);\n }\n}\n","// libs/chat/src/lib/styles/chat-message.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_MESSAGE_STYLES = `\n :host { display: block; }\n :host([data-role=\"user\"]) {\n display: block;\n margin-top: 0.5rem;\n }\n :host([data-role=\"user\"][data-prev-role=\"assistant\"]) { margin-top: 1.5rem; }\n :host([data-role=\"user\"]) .chat-message__bubble {\n /* Right-align the user bubble. */\n margin-left: auto;\n max-width: 80%;\n }\n /*\n * Assistant bubbles get the 80% cap on the bubble itself.\n */\n :host([data-role=\"assistant\"]) .chat-message__bubble {\n max-width: 80%;\n }\n :host([data-role=\"assistant\"]) {\n display: block;\n position: relative;\n margin-top: 1.5rem;\n color: var(--ngaf-chat-text);\n line-height: 1.55;\n font-size: var(--ngaf-chat-font-size);\n max-width: 100%;\n }\n :host([data-role=\"assistant\"]):first-child { margin-top: 0; }\n\n .chat-message__bubble {\n width: fit-content;\n padding: 8px 12px;\n border-radius: var(--ngaf-chat-radius-bubble);\n background: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-on-primary);\n white-space: pre-wrap;\n line-height: var(--ngaf-chat-line-height-tight);\n font-size: var(--ngaf-chat-font-size);\n overflow-wrap: break-word;\n }\n\n .chat-message__assistant-body {\n padding: 0 12px 0 4px;\n overflow-wrap: break-word;\n }\n\n .chat-message__caret {\n display: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n vertical-align: middle;\n margin-left: 4px;\n margin-bottom: 2px;\n background: radial-gradient(circle at 30% 30%,\n var(--ngaf-chat-text) 0%,\n var(--ngaf-chat-text-muted) 70%,\n transparent 100%);\n box-shadow: 0 0 6px var(--ngaf-chat-text-muted);\n animation: ngaf-chat-caret-fade-in 200ms ease-out 300ms forwards,\n ngaf-chat-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) 500ms infinite;\n opacity: 0;\n }\n :host([data-role=\"assistant\"][data-current=\"true\"][data-streaming=\"true\"]) .chat-message__caret {\n display: inline-block;\n }\n\n .chat-message__plain { /* system / tool fallback */ }\n\n .chat-message__controls {\n display: none;\n gap: 1rem;\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: none;\n }\n :host([data-role=\"assistant\"]) .chat-message__controls {\n display: flex;\n }\n :host([data-role=\"assistant\"]:hover) .chat-message__controls,\n :host([data-role=\"assistant\"]:focus-within) .chat-message__controls,\n :host([data-current=\"true\"]) .chat-message__controls {\n opacity: 1;\n pointer-events: auto;\n }\n @media (max-width: 768px) {\n :host([data-role=\"assistant\"]) .chat-message__controls { opacity: 1; pointer-events: auto; }\n }\n .chat-message__control-btn {\n width: 20px;\n height: 20px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-primary);\n cursor: pointer;\n padding: 0;\n transition: transform 200ms ease;\n }\n .chat-message__control-btn:hover { transform: scale(1.05); }\n .chat-message__control-btn:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n border-radius: 4px;\n }\n .chat-message__control-btn svg { width: 16px; height: 16px; pointer-events: none; }\n`;\n","// libs/chat/src/lib/primitives/chat-citations/chat-citations-card.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { Citation } from '../../agent/citation';\n\n@Component({\n selector: 'chat-citations-card',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"chat-citations-card\">\n <div class=\"chat-citations-card__index\">{{ citation().index }}</div>\n <div class=\"chat-citations-card__body\">\n @if (citation().url; as url) {\n <a class=\"chat-citations-card__title\" [href]=\"url\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ citation().title ?? url }}\n </a>\n } @else if (citation().title) {\n <span class=\"chat-citations-card__title\">{{ citation().title }}</span>\n }\n @if (citation().snippet; as s) {\n <p class=\"chat-citations-card__snippet\">{{ s }}</p>\n }\n </div>\n </div>\n `,\n})\nexport class ChatCitationsCardComponent {\n readonly citation = input.required<Citation>();\n}\n","// libs/chat/src/lib/markdown/citations-resolver.service.ts\n// SPDX-License-Identifier: MIT\nimport { Injectable, computed, signal, type Signal } from '@angular/core';\nimport type { CitationDefinition } from '@cacheplane/partial-markdown';\nimport type { Message } from '../agent/message';\nimport type { Citation } from '../agent/citation';\n\nexport interface ResolvedCitation {\n source: 'message' | 'markdown';\n citation: Citation;\n}\n\n@Injectable()\nexport class CitationsResolverService {\n readonly message = signal<Message | null>(null);\n readonly markdownDefs = signal<Map<string, CitationDefinition>>(new Map());\n\n lookup(refId: string): Signal<ResolvedCitation | null> {\n return computed(() => {\n const fromMessage = this.message()?.citations?.find(c => c.id === refId);\n if (fromMessage) return { source: 'message', citation: fromMessage };\n const fromMd = this.markdownDefs().get(refId);\n if (fromMd) return { source: 'markdown', citation: mdDefToCitation(fromMd) };\n return null;\n });\n }\n}\n\nexport function mdDefToCitation(def: CitationDefinition): Citation {\n let url: string | undefined;\n const titleParts: string[] = [];\n const snippetParts: string[] = [];\n let phase: 'before' | 'after' = 'before';\n for (const child of def.children) {\n if ((child.type === 'link' || child.type === 'autolink') && url === undefined) {\n url = (child as { url?: string }).url;\n phase = 'after';\n continue;\n }\n const t = inlineToText(child);\n (phase === 'before' ? titleParts : snippetParts).push(t);\n }\n const title = titleParts.join('').trim() || undefined;\n const snippet = snippetParts.join('').trim() || undefined;\n return { id: def.id, index: def.index, title, url, snippet };\n}\n\nfunction inlineToText(node: unknown): string {\n const n = node as { type: string; text?: string; children?: unknown[]; url?: string };\n if (typeof n.text === 'string') return n.text;\n if (n.type === 'autolink' && typeof n.url === 'string') return n.url;\n if (Array.isArray(n.children)) return n.children.map(inlineToText).join('');\n return '';\n}\n","// libs/chat/src/lib/primitives/chat-citations/chat-citations.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n ChangeDetectionStrategy, Component, ContentChild, Directive, TemplateRef,\n computed, inject, input,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Message } from '../../agent/message';\nimport type { Citation } from '../../agent/citation';\nimport { ChatCitationsCardComponent } from './chat-citations-card.component';\nimport { CitationsResolverService, mdDefToCitation } from '../../markdown/citations-resolver.service';\n\n/**\n * ContentChild template directive for custom citation card rendering.\n * Usage: <ng-template chatCitationCard let-citation>...</ng-template>\n */\n@Directive({ selector: 'ng-template[chatCitationCard]', standalone: true })\nexport class ChatCitationCardTemplateDirective {\n readonly tpl = inject<TemplateRef<{ $implicit: Citation }>>(TemplateRef);\n}\n\n@Component({\n selector: 'chat-citations',\n standalone: true,\n imports: [NgTemplateOutlet, ChatCitationsCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (citations().length > 0) {\n <section class=\"chat-citations\">\n <h4 class=\"chat-citations__heading\">{{ heading() }}</h4>\n <ul class=\"chat-citations__list\">\n @for (c of citations(); track c.id) {\n <li class=\"chat-citations__item\">\n @if (cardTpl) {\n <ng-container *ngTemplateOutlet=\"cardTpl.tpl; context: { $implicit: c }\" />\n } @else {\n <chat-citations-card [citation]=\"c\" />\n }\n </li>\n }\n </ul>\n </section>\n }\n `,\n})\nexport class ChatCitationsComponent {\n readonly message = input.required<Message>();\n readonly heading = input<string>('Sources');\n\n @ContentChild(ChatCitationCardTemplateDirective) cardTpl: ChatCitationCardTemplateDirective | null = null;\n\n /**\n * Optional resolver — present when chat-citations is rendered inside a\n * chat-message that provides CitationsResolverService (the standard\n * placement). When absent, the panel reads only Message.citations.\n */\n private readonly resolver = inject(CitationsResolverService, { optional: true });\n\n /**\n * Combined citation list:\n * 1. Message.citations (provider-populated, takes precedence by id)\n * 2. Markdown sidecar defs (Pandoc-formatted [^id]: lines), merged in\n * for any id not already present.\n *\n * Sorted by index ascending. This guarantees the sources panel surfaces\n * citations whether they come from message metadata, content syntax, or\n * both — matching the same precedence as inline-marker resolution.\n */\n protected readonly citations = computed<Citation[]>(() => {\n const fromMessage = this.message().citations ?? [];\n const seenIds = new Set(fromMessage.map(c => c.id));\n const fromMarkdown: Citation[] = [];\n const mdDefs = this.resolver?.markdownDefs();\n if (mdDefs) {\n for (const def of mdDefs.values()) {\n if (!seenIds.has(def.id)) fromMarkdown.push(mdDefToCitation(def));\n }\n }\n return [...fromMessage, ...fromMarkdown].sort((a, b) => a.index - b.index);\n });\n}\n","// libs/chat/src/lib/primitives/chat-message/chat-message.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed, effect, inject } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_MESSAGE_STYLES } from '../../styles/chat-message.styles';\nimport { ChatCitationsComponent } from '../chat-citations/chat-citations.component';\nimport { CitationsResolverService } from '../../markdown/citations-resolver.service';\nimport type { Message } from '../../agent/message';\n\nexport type ChatMessageRole = 'user' | 'assistant' | 'system' | 'tool';\n\n@Component({\n selector: 'chat-message',\n standalone: true,\n imports: [ChatCitationsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_MESSAGE_STYLES],\n providers: [CitationsResolverService],\n host: {\n '[attr.data-role]': 'role()',\n '[attr.data-current]': 'currentStr()',\n '[attr.data-streaming]': 'streamingStr()',\n '[attr.data-prev-role]': 'prevRole() ?? null',\n },\n template: `\n <div [class]=\"bodyClass()\">\n <ng-content />\n <span class=\"chat-message__caret\" aria-hidden=\"true\"></span>\n </div>\n @if (message()?.role === 'assistant' && message(); as msg) {\n <chat-citations [message]=\"msg\" />\n }\n <div class=\"chat-message__controls\">\n <ng-content select=\"[chatMessageControls]\" />\n </div>\n `,\n})\nexport class ChatMessageComponent {\n readonly role = input.required<ChatMessageRole>();\n readonly current = input(false);\n readonly streaming = input(false);\n readonly prevRole = input<ChatMessageRole | undefined>(undefined);\n readonly message = input<Message | undefined>(undefined);\n\n private readonly resolver = inject(CitationsResolverService);\n\n constructor() {\n effect(() => {\n this.resolver.message.set(this.message() ?? null);\n });\n }\n\n readonly currentStr = computed(() => String(this.current()));\n readonly streamingStr = computed(() => String(this.streaming()));\n\n readonly bodyClass = computed(() => {\n switch (this.role()) {\n case 'user': return 'chat-message__bubble';\n case 'assistant': return 'chat-message__assistant-body';\n default: return 'chat-message__plain';\n }\n });\n}\n","// libs/chat/src/lib/styles/chat-message-actions.styles.ts\n// SPDX-License-Identifier: MIT\n//\n// Action-button row underneath assistant messages. Hidden by default, fades\n// in on hover/focus of the parent chat-message, always visible on mobile.\nexport const CHAT_MESSAGE_ACTIONS_STYLES = `\n :host {\n display: flex;\n gap: 0.5rem;\n padding: 16px 0 12px 0;\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: none;\n }\n :host-context(chat-message[data-role=\"assistant\"]:hover),\n :host-context(chat-message[data-role=\"assistant\"]:focus-within),\n :host-context(chat-message[data-role=\"assistant\"][data-current=\"true\"]) {\n opacity: 1;\n pointer-events: auto;\n }\n :host-context(chat-message[data-streaming=\"true\"]) {\n /* Hide while the message is actively streaming. */\n opacity: 0 !important;\n pointer-events: none !important;\n }\n @media (max-width: 768px) {\n :host-context(chat-message[data-role=\"assistant\"]) {\n opacity: 1;\n pointer-events: auto;\n }\n }\n .chat-message-actions__btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0;\n padding: 0;\n margin: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n transition: color 150ms ease, transform 150ms ease, background 150ms ease;\n }\n .chat-message-actions__btn:hover {\n color: var(--ngaf-chat-text);\n transform: scale(1.05);\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-message-actions__btn:focus-visible {\n outline: 2px solid var(--ngaf-chat-text-muted);\n outline-offset: 2px;\n }\n .chat-message-actions__btn.is-active {\n color: var(--ngaf-chat-text);\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-message-actions__btn svg {\n width: 16px;\n height: 16px;\n pointer-events: none;\n }\n .chat-message-actions__check {\n font-size: 14px;\n font-weight: 700;\n line-height: 1;\n color: var(--ngaf-chat-success);\n }\n`;\n","// libs/chat/src/lib/primitives/chat-message-actions/chat-message-actions.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, output, signal, inject, DOCUMENT } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_MESSAGE_ACTIONS_STYLES } from '../../styles/chat-message-actions.styles';\n\n/**\n * Default action buttons that appear under each assistant message:\n * regenerate, copy-to-clipboard, thumbs up, thumbs down.\n *\n * Hidden by default, fades in on `:hover`/`:focus-within` of the parent\n * `chat-message`, and stays visible on the current/last assistant message\n * and on mobile.\n */\n@Component({\n selector: 'chat-message-actions',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_MESSAGE_ACTIONS_STYLES],\n host: {\n 'role': 'toolbar',\n '[attr.aria-label]': '\"Message actions\"',\n },\n template: `\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n aria-label=\"Regenerate response\"\n title=\"Regenerate\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() || null\"\n (click)=\"regenerate.emit()\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 12a9 9 0 0 1 15.5-6.36L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-15.5 6.36L3 16\" />\n <path d=\"M3 21v-5h5\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n [class.is-active]=\"copied()\"\n [attr.aria-label]=\"copied() ? 'Copied' : 'Copy to clipboard'\"\n [title]=\"copied() ? 'Copied' : 'Copy'\"\n (click)=\"onCopy()\"\n >\n @if (copied()) {\n <span class=\"chat-message-actions__check\" aria-hidden=\"true\">✓</span>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </svg>\n }\n </button>\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n [class.is-active]=\"rating() === 'up'\"\n [attr.aria-pressed]=\"rating() === 'up'\"\n aria-label=\"Thumbs up\"\n title=\"Good response\"\n (click)=\"onRate('up')\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M7 11V20a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V12a1 1 0 0 1 1-1h3z\" />\n <path d=\"M7 11l4-7a2 2 0 0 1 2-2h0a2 2 0 0 1 2 2v4h5a2 2 0 0 1 2 2l-2 7a2 2 0 0 1-2 1.5H7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"chat-message-actions__btn\"\n [class.is-active]=\"rating() === 'down'\"\n [attr.aria-pressed]=\"rating() === 'down'\"\n aria-label=\"Thumbs down\"\n title=\"Poor response\"\n (click)=\"onRate('down')\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 13V4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-3z\" />\n <path d=\"M17 13l-4 7a2 2 0 0 1-2 2h0a2 2 0 0 1-2-2v-4H4a2 2 0 0 1-2-2l2-7A2 2 0 0 1 6 5h11\" />\n </svg>\n </button>\n `,\n})\nexport class ChatMessageActionsComponent {\n /** Plain text content to copy. Required for the copy button to function. */\n readonly content = input<string>('');\n /** When true, the regenerate button is disabled (e.g. while the agent is streaming). */\n readonly disabled = input<boolean>(false);\n\n /** Emitted when the user clicks regenerate. Wire this to `agent.regenerate(index)`. */\n readonly regenerate = output<void>();\n /** Emitted with 'up' or 'down' when the user rates the response. */\n readonly rate = output<'up' | 'down'>();\n /** Emitted with the copied content after a successful clipboard write. */\n readonly contentCopied = output<string>();\n\n protected readonly copied = signal(false);\n protected readonly rating = signal<'up' | 'down' | null>(null);\n private readonly document = inject(DOCUMENT);\n\n protected async onCopy(): Promise<void> {\n const text = this.content();\n if (!text) return;\n let succeeded = false;\n const win = this.document.defaultView;\n // Prefer Async Clipboard API; fall back to execCommand if it rejects\n // (e.g. permissions, non-secure context, document-not-focused). The\n // prior impl gated the fallback only on API absence, so a rejecting\n // API silently failed with no user feedback.\n if (win?.navigator?.clipboard?.writeText) {\n try {\n await win.navigator.clipboard.writeText(text);\n succeeded = true;\n } catch {\n // Async API failed — fall through to legacy path below.\n }\n }\n if (!succeeded) {\n try {\n const ta = this.document.createElement('textarea');\n ta.value = text;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n this.document.body.appendChild(ta);\n ta.select();\n succeeded = !!this.document.execCommand?.('copy');\n ta.remove();\n } catch {\n // Both paths failed — leave copied state unchanged.\n }\n }\n if (succeeded) {\n this.copied.set(true);\n this.contentCopied.emit(text);\n setTimeout(() => this.copied.set(false), 2000);\n }\n }\n\n protected onRate(value: 'up' | 'down'): void {\n // Toggle off when clicking the same rating.\n this.rating.set(this.rating() === value ? null : value);\n this.rate.emit(value);\n }\n}\n","// libs/chat/src/lib/styles/chat-window.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_WINDOW_STYLES = `\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n }\n .chat-window__header {\n height: 56px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 var(--ngaf-chat-space-6);\n border-bottom: 1px solid var(--ngaf-chat-separator);\n font-weight: 500;\n color: var(--ngaf-chat-primary);\n }\n .chat-window__header:empty { display: none; }\n /* When the consumer doesn't project a header, balance the chat content\n * with breathing room at the top equivalent to the input gap at the bottom. */\n .chat-window__header:empty + .chat-window__body {\n padding-top: var(--ngaf-chat-input-gap);\n }\n .chat-window__body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .chat-window__footer {\n position: relative;\n flex-shrink: 0;\n margin-top: var(--ngaf-chat-input-gap);\n }\n .chat-window__footer:empty { display: none; }\n .chat-window__scroll-fade {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 100%;\n height: 32px;\n background: linear-gradient(180deg, transparent 0%, var(--ngaf-chat-bg) 100%);\n pointer-events: none;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-window/chat-window.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_WINDOW_STYLES } from '../../styles/chat-window.styles';\n\n@Component({\n selector: 'chat-window',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_WINDOW_STYLES],\n template: `\n <div class=\"chat-window__header\"><ng-content select=\"[chatHeader]\" /></div>\n <div class=\"chat-window__body\"><ng-content select=\"[chatBody]\" /></div>\n <div class=\"chat-window__footer\">\n <div class=\"chat-window__scroll-fade\" aria-hidden=\"true\"></div>\n <ng-content select=\"[chatFooter]\" />\n </div>\n `,\n})\nexport class ChatWindowComponent {}\n","// libs/chat/src/lib/styles/chat-trace.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_TRACE_STYLES = `\n :host { display: block; font-size: var(--ngaf-chat-font-size-sm); }\n .chat-trace__header {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n cursor: pointer;\n user-select: none;\n color: var(--ngaf-chat-text-muted);\n background: transparent;\n border: 0;\n padding: 0;\n width: 100%;\n text-align: left;\n font: inherit;\n }\n .chat-trace__chevron {\n width: 12px;\n height: 12px;\n transition: transform 200ms ease;\n flex-shrink: 0;\n }\n :host([data-expanded=\"true\"]) .chat-trace__chevron { transform: rotate(90deg); }\n .chat-trace__label { display: flex; align-items: center; gap: 0.5rem; flex: 1; min-width: 0; }\n :host([data-state=\"running\"]) .chat-trace__label { animation: ngaf-chat-pulse 1.5s ease-in-out infinite; }\n :host([data-state=\"error\"]) .chat-trace__label { color: var(--ngaf-chat-error-text); }\n .chat-trace__content {\n padding-left: 1rem;\n padding-top: 0.375rem;\n margin-left: 0.375rem;\n border-left: 1px solid var(--ngaf-chat-separator);\n max-height: 250px;\n overflow: auto;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-trace/chat-trace.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, signal, effect, computed } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_TRACE_STYLES } from '../../styles/chat-trace.styles';\n\nexport type TraceState = 'pending' | 'running' | 'done' | 'error';\n\n@Component({\n selector: 'chat-trace',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_TRACE_STYLES],\n host: {\n '[attr.data-state]': 'state()',\n '[attr.data-expanded]': 'expandedStr()',\n },\n template: `\n <button\n type=\"button\"\n class=\"chat-trace__header\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggle()\"\n >\n <svg class=\"chat-trace__chevron\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 2l4 4-4 4\"/>\n </svg>\n <span class=\"chat-trace__label\">\n <ng-content select=\"[traceIcon]\" />\n <ng-content select=\"[traceLabel]\" />\n </span>\n <ng-content select=\"[traceMeta]\" />\n </button>\n @if (expanded()) {\n <div class=\"chat-trace__content\"><ng-content /></div>\n }\n `,\n})\nexport class ChatTraceComponent {\n readonly state = input<TraceState>('pending');\n /** When state is not 'running' or 'error', honors this input as the default expansion. */\n readonly defaultExpanded = input<boolean>(false);\n\n /** null = follow auto state-driven logic; non-null = manual override (user click). */\n private readonly _expandedOverride = signal<boolean | null>(null);\n\n readonly expanded = computed(() => {\n const override = this._expandedOverride();\n if (override !== null) return override;\n const s = this.state();\n if (s === 'running' || s === 'error') return true;\n return this.defaultExpanded();\n });\n\n readonly expandedStr = computed(() => String(this.expanded()));\n\n constructor() {\n let prevState: TraceState | undefined;\n effect(() => {\n const s = this.state();\n // Re-entering running/error from a terminal state: clear manual override\n // so auto-expand kicks in. (Not on done → done, not on user-toggled state.)\n if ((s === 'running' || s === 'error') && prevState && prevState !== s) {\n this._expandedOverride.set(null);\n }\n prevState = s;\n });\n }\n\n toggle(): void {\n this._expandedOverride.set(!this.expanded());\n }\n}\n","// libs/chat/src/lib/styles/chat-reasoning.styles.ts\n// SPDX-License-Identifier: MIT\n//\n// Style block for the chat-reasoning primitive. Pill-shaped header with\n// a chevron + label; expanded body sits below the header with a thin\n// left border (matches the blockquote pattern in chat-markdown.styles).\n// Muted text colors throughout so reasoning content recedes visually\n// next to the response.\nexport const CHAT_REASONING_STYLES = `\n :host { display: block; margin: 0 0 0.5rem; }\n :host([data-has-content=\"false\"]) { display: none; }\n\n .chat-reasoning__header {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 4px 10px;\n background: var(--ngaf-chat-surface-alt);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 9999px;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-xs);\n font-family: inherit;\n cursor: pointer;\n line-height: 1.2;\n }\n .chat-reasoning__header:hover { color: var(--ngaf-chat-text); }\n\n .chat-reasoning__chevron {\n width: 10px;\n height: 10px;\n transition: transform 120ms ease;\n }\n :host([data-expanded=\"true\"]) .chat-reasoning__chevron { transform: rotate(90deg); }\n\n .chat-reasoning__pulse {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--ngaf-chat-text-muted);\n animation: chat-reasoning-pulse 1.2s ease-in-out infinite;\n }\n @keyframes chat-reasoning-pulse {\n 0%, 100% { opacity: 0.3; }\n 50% { opacity: 1; }\n }\n\n .chat-reasoning__body {\n margin-top: 0.5rem;\n padding-left: 12px;\n border-left: 2px solid var(--ngaf-chat-separator);\n color: var(--ngaf-chat-text-muted);\n }\n .chat-reasoning__body chat-streaming-md { font-size: 0.95em; }\n`;\n","// libs/chat/src/lib/styles/chat-markdown.styles.ts\n// SPDX-License-Identifier: MIT\n//\n// Scoped to the `chat-streaming-md` element selector (not `:host`) because\n// the component renders markdown via innerHTML and uses\n// `ViewEncapsulation.None` — emulated encapsulation would skip these rules\n// since innerHTML-injected nodes don't carry `_ngcontent-xxx` attributes.\n// Keeping selectors prefixed with the element name preserves locality so\n// these rules don't leak to other markup on the page.\n//\n// Covers the CommonMark + GFM surface: headings, paragraphs, links, lists\n// (bullet/ordered/task), code (inline + fenced), blockquotes, horizontal\n// rules, tables, images, bold (`strong`), italic (`em`), strikethrough\n// (`del`/`s`).\nexport const CHAT_MARKDOWN_STYLES = `\n chat-streaming-md { display: block; color: var(--ngaf-chat-text); line-height: var(--ngaf-chat-line-height); }\n\n /* Headings */\n chat-streaming-md h1, chat-streaming-md h2, chat-streaming-md h3, chat-streaming-md h4, chat-streaming-md h5, chat-streaming-md h6 {\n font-weight: 600;\n line-height: 1.25;\n margin: 1.25rem 0 0.75rem;\n }\n chat-streaming-md h1:first-child, chat-streaming-md h2:first-child, chat-streaming-md h3:first-child,\n chat-streaming-md h4:first-child, chat-streaming-md h5:first-child, chat-streaming-md h6:first-child { margin-top: 0; }\n chat-streaming-md h1 { font-size: 1.5em; font-weight: 700; }\n chat-streaming-md h2 { font-size: 1.25em; }\n chat-streaming-md h3 { font-size: 1.1em; }\n chat-streaming-md h4 { font-size: 1em; }\n chat-streaming-md h5, chat-streaming-md h6 { font-size: 0.95em; color: var(--ngaf-chat-text-muted); }\n\n /* Paragraphs and inline emphasis */\n chat-streaming-md p { margin: 0 0 0.75rem; line-height: 1.6; font-size: var(--ngaf-chat-font-size); }\n chat-streaming-md p:last-child { margin-bottom: 0; }\n chat-streaming-md strong, chat-streaming-md b { font-weight: 700; }\n chat-streaming-md em, chat-streaming-md i { font-style: italic; }\n chat-streaming-md del, chat-streaming-md s { text-decoration: line-through; color: var(--ngaf-chat-text-muted); }\n chat-streaming-md mark { background: var(--ngaf-chat-surface-alt); padding: 0 2px; border-radius: 2px; }\n chat-streaming-md sub { font-size: 0.75em; vertical-align: sub; }\n chat-streaming-md sup { font-size: 0.75em; vertical-align: super; }\n\n /* Links */\n chat-streaming-md a { color: var(--ngaf-chat-primary); text-decoration: underline; text-underline-offset: 2px; }\n chat-streaming-md a:hover { text-decoration-thickness: 2px; }\n\n /* Lists (CommonMark + GFM task lists) */\n chat-streaming-md ul, chat-streaming-md ol { margin: 0 0 0.75rem; padding-left: 1.5rem; }\n chat-streaming-md ul { list-style: disc outside; }\n chat-streaming-md ol { list-style: decimal outside; }\n chat-streaming-md ul ul { list-style: circle outside; }\n chat-streaming-md ul ul ul { list-style: square outside; }\n chat-streaming-md li { margin: 0.2rem 0; }\n chat-streaming-md li::marker { color: var(--ngaf-chat-text-muted); }\n chat-streaming-md li > p { margin: 0 0 0.25rem; }\n chat-streaming-md li > ul, chat-streaming-md li > ol { margin: 0.25rem 0 0; }\n /* GFM task lists: marked emits <li><input type=\"checkbox\" disabled> ... */\n chat-streaming-md li:has(> input[type=\"checkbox\"]) { list-style: none; margin-left: -1.25rem; }\n chat-streaming-md li > input[type=\"checkbox\"] { margin-right: 0.5rem; vertical-align: middle; }\n\n /* Code (inline + fenced) */\n chat-streaming-md code {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n padding: 1px 5px;\n border-radius: 4px;\n font-family: var(--ngaf-chat-font-mono);\n font-size: 0.9em;\n }\n chat-streaming-md pre {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n padding: 12px 14px;\n border-radius: var(--ngaf-chat-radius-card);\n overflow-x: auto;\n font-family: var(--ngaf-chat-font-mono);\n font-size: var(--ngaf-chat-font-size-sm);\n line-height: 1.5;\n margin: 0 0 0.75rem;\n }\n chat-streaming-md pre code { background: transparent; padding: 0; border-radius: 0; font-size: inherit; }\n\n /* Blockquote */\n chat-streaming-md blockquote {\n border-left: 3px solid var(--ngaf-chat-separator);\n padding: 0.25rem 0 0.25rem 12px;\n margin: 0 0 0.75rem;\n color: var(--ngaf-chat-text-muted);\n }\n chat-streaming-md blockquote > :last-child { margin-bottom: 0; }\n\n /* Horizontal rule */\n chat-streaming-md hr {\n border: none;\n border-top: 1px solid var(--ngaf-chat-separator);\n margin: 1rem 0;\n }\n\n /* Tables (GFM) */\n chat-streaming-md table {\n border-collapse: collapse;\n margin: 0 0 0.75rem;\n width: 100%;\n font-size: 0.95em;\n }\n chat-streaming-md thead { background: var(--ngaf-chat-surface-alt); }\n chat-streaming-md th, chat-streaming-md td {\n border: 1px solid var(--ngaf-chat-separator);\n padding: 6px 10px;\n text-align: left;\n vertical-align: top;\n }\n chat-streaming-md th { font-weight: 600; }\n /* Component-rendered table: chat-md-table becomes a horizontally-scrollable\n wrapper for the inner <table>; row/cell elements stay layout-transparent\n so the browser's table layout takes over. Without this overflow wrapper,\n wide tables push their parent container past the viewport horizontally. */\n chat-streaming-md chat-md-table {\n display: block;\n overflow-x: auto;\n max-width: 100%;\n margin: 0 0 0.75rem;\n }\n chat-streaming-md chat-md-table-row { display: contents; }\n chat-streaming-md chat-md-table-cell { display: contents; }\n chat-streaming-md chat-md-table > table { margin: 0; }\n /* Task-list items: checkbox + first paragraph render inline; subsequent\n blocks (sub-lists, multi-paragraph items) flow normally below. */\n chat-streaming-md li.chat-md-list-item--task {\n list-style: none;\n margin-left: -1.25rem;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 0.5rem;\n }\n chat-streaming-md li.chat-md-list-item--task > input[type=\"checkbox\"] {\n margin: 0;\n flex: 0 0 auto;\n transform: translateY(2px);\n }\n /* The chat-md-children wrapper around list-item content takes remaining width */\n chat-streaming-md li.chat-md-list-item--task > chat-md-children {\n flex: 1 1 auto;\n min-width: 0;\n }\n /* Tight task items: only the FIRST paragraph aligns inline with the\n checkbox (margin collapsed). Subsequent paragraphs/blocks keep their\n normal vertical spacing so multi-block items render readably. */\n chat-streaming-md li.chat-md-list-item--task > chat-md-children > chat-md-paragraph:first-child > p {\n margin: 0;\n }\n\n /* Media */\n chat-streaming-md img { max-width: 100%; height: auto; border-radius: 6px; }\n /* Broken-image fallback: muted pill showing alt text + icon. Triggered\n when <img> fires (error). Caught by live browser smoke — prior impl\n showed only the browser's broken-image icon with no readable alt. */\n chat-streaming-md .chat-md-image--broken {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.25rem 0.5rem;\n background: var(--ngaf-chat-surface-alt);\n border: 1px dashed var(--ngaf-chat-separator);\n border-radius: 6px;\n font-size: 0.9em;\n color: var(--ngaf-chat-text-muted, currentColor);\n opacity: 0.85;\n }\n chat-streaming-md .chat-md-image__icon { font-size: 1em; line-height: 1; }\n chat-streaming-md .chat-md-image__alt { font-style: italic; }\n`;\n","// libs/chat/src/lib/markdown/markdown-view-registry.ts\n// SPDX-License-Identifier: MIT\nimport { InjectionToken } from '@angular/core';\nimport type { ViewRegistry } from '@threadplane/render';\n\n/**\n * DI token for the markdown view registry consumed by <chat-streaming-md>\n * and <md-children>. Maps MarkdownNode.type strings (e.g. \"paragraph\",\n * \"heading\") to Angular components that render that node type.\n *\n * `<chat-streaming-md>` provides the runtime registry on its component-level\n * injector — either the consumer-supplied [viewRegistry] input, or\n * `cacheplaneMarkdownViews` (the default) — so descendant <md-children>\n * components resolve the right components for each node.\n */\nexport const MARKDOWN_VIEW_REGISTRY = new InjectionToken<ViewRegistry>(\n 'MARKDOWN_VIEW_REGISTRY',\n);\n","// libs/chat/src/lib/markdown/markdown-children.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n inject,\n input,\n computed,\n Type,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport type { ViewRegistry } from '@threadplane/render';\nimport type { MarkdownNode } from '@cacheplane/partial-markdown';\nimport { MARKDOWN_VIEW_REGISTRY } from './markdown-view-registry';\n\n/**\n * Recursively dispatches a parent node's children through the markdown view\n * registry. Each child's `type` is looked up in the registry; the resolved\n * component is rendered with `[node]` bound to that child.\n *\n * Position-stable: `track $index` avoids NG0956 re-creation warnings that\n * occur when the markdown pipeline re-parses content on every stream delta,\n * producing new child object references even for unchanged nodes.\n */\n@Component({\n selector: 'chat-md-children',\n standalone: true,\n imports: [NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (child of children(); track $index) {\n @let comp = resolve(child);\n @if (comp) {\n <ng-container *ngComponentOutlet=\"comp; inputs: { node: child }\" />\n }\n }\n `,\n})\nexport class MarkdownChildrenComponent {\n readonly parent = input.required<MarkdownNode>();\n private readonly registry = inject<ViewRegistry>(MARKDOWN_VIEW_REGISTRY);\n\n protected readonly children = computed<readonly MarkdownNode[]>(() => {\n const p = this.parent();\n return 'children' in p && Array.isArray((p as { children?: MarkdownNode[] }).children)\n ? ((p as { children: MarkdownNode[] }).children as readonly MarkdownNode[])\n : [];\n });\n\n protected resolve(child: MarkdownNode): Type<unknown> | null {\n const entry = this.registry[child.type];\n if (!entry) return null;\n // ViewRegistry entries are either a bare Type or { component, fallback? }.\n return typeof entry === 'function' ? entry : entry.component;\n }\n}\n","// libs/chat/src/lib/markdown/views/markdown-document.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownDocumentNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-document',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<chat-md-children [parent]=\"node()\" />`,\n})\nexport class MarkdownDocumentComponent {\n readonly node = input.required<MarkdownDocumentNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-paragraph.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownParagraphNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-paragraph',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<p><chat-md-children [parent]=\"node()\" /></p>`,\n})\nexport class MarkdownParagraphComponent {\n readonly node = input.required<MarkdownParagraphNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-heading.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownHeadingNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-heading',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @switch (node().level) {\n @case (1) { <h1><chat-md-children [parent]=\"node()\" /></h1> }\n @case (2) { <h2><chat-md-children [parent]=\"node()\" /></h2> }\n @case (3) { <h3><chat-md-children [parent]=\"node()\" /></h3> }\n @case (4) { <h4><chat-md-children [parent]=\"node()\" /></h4> }\n @case (5) { <h5><chat-md-children [parent]=\"node()\" /></h5> }\n @case (6) { <h6><chat-md-children [parent]=\"node()\" /></h6> }\n }\n `,\n})\nexport class MarkdownHeadingComponent {\n readonly node = input.required<MarkdownHeadingNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-blockquote.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownBlockquoteNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-blockquote',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<blockquote><chat-md-children [parent]=\"node()\" /></blockquote>`,\n})\nexport class MarkdownBlockquoteComponent {\n readonly node = input.required<MarkdownBlockquoteNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-list.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownListNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-list',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (node().ordered) {\n <ol [attr.start]=\"node().start ?? null\"><chat-md-children [parent]=\"node()\" /></ol>\n } @else {\n <ul><chat-md-children [parent]=\"node()\" /></ul>\n }\n `,\n})\nexport class MarkdownListComponent {\n readonly node = input.required<MarkdownListNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-list-item.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownListItemNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-list-item',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <li [class.chat-md-list-item--task]=\"node().task !== undefined\">\n @if (node().task !== undefined) {\n <input type=\"checkbox\" disabled [checked]=\"node().task!.checked\" />\n }\n <chat-md-children [parent]=\"node()\" />\n </li>\n `,\n})\nexport class MarkdownListItemComponent {\n readonly node = input.required<MarkdownListItemNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-code-block.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport type { MarkdownCodeBlockNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-code-block',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<pre><code [class]=\"languageClass()\">{{ node().text }}</code></pre>`,\n})\nexport class MarkdownCodeBlockComponent {\n readonly node = input.required<MarkdownCodeBlockNode>();\n protected readonly languageClass = computed(() => {\n const lang = this.node().language;\n return lang ? `language-${lang}` : '';\n });\n}\n","// libs/chat/src/lib/markdown/views/markdown-thematic-break.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownThematicBreakNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-thematic-break',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<hr>`,\n})\nexport class MarkdownThematicBreakComponent {\n readonly node = input.required<MarkdownThematicBreakNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-text.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownTextNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-text',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `{{ node().text }}`,\n})\nexport class MarkdownTextComponent {\n readonly node = input.required<MarkdownTextNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-emphasis.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownEmphasisNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-emphasis',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<em><chat-md-children [parent]=\"node()\" /></em>`,\n})\nexport class MarkdownEmphasisComponent {\n readonly node = input.required<MarkdownEmphasisNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-strong.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownStrongNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-strong',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<strong><chat-md-children [parent]=\"node()\" /></strong>`,\n})\nexport class MarkdownStrongComponent {\n readonly node = input.required<MarkdownStrongNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-strikethrough.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownStrikethroughNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-strikethrough',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<del><chat-md-children [parent]=\"node()\" /></del>`,\n})\nexport class MarkdownStrikethroughComponent {\n readonly node = input.required<MarkdownStrikethroughNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-inline-code.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownInlineCodeNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-inline-code',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<code>{{ node().text }}</code>`,\n})\nexport class MarkdownInlineCodeComponent {\n readonly node = input.required<MarkdownInlineCodeNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-link.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownLinkNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\n\n@Component({\n selector: 'chat-md-link',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<a [href]=\"node().url\" [attr.title]=\"node().title || null\"><chat-md-children [parent]=\"node()\" /></a>`,\n})\nexport class MarkdownLinkComponent {\n readonly node = input.required<MarkdownLinkNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-autolink.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownAutolinkNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-autolink',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<a [href]=\"node().url\">{{ node().url }}</a>`,\n})\nexport class MarkdownAutolinkComponent {\n readonly node = input.required<MarkdownAutolinkNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-image.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport type { MarkdownImageNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-image',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (failed()) {\n <span class=\"chat-md-image chat-md-image--broken\"\n role=\"img\"\n [attr.aria-label]=\"node().alt || node().url\"\n [attr.title]=\"node().title || node().url || null\">\n <span class=\"chat-md-image__icon\" aria-hidden=\"true\">🖼️</span>\n @if (node().alt) {\n <span class=\"chat-md-image__alt\">{{ node().alt }}</span>\n } @else {\n <span class=\"chat-md-image__alt\">image unavailable</span>\n }\n </span>\n } @else {\n <img\n [src]=\"node().url\"\n [alt]=\"node().alt\"\n [attr.title]=\"node().title || null\"\n (error)=\"failed.set(true)\"\n />\n }\n `,\n})\nexport class MarkdownImageComponent {\n readonly node = input.required<MarkdownImageNode>();\n protected readonly failed = signal(false);\n}\n","// libs/chat/src/lib/markdown/views/markdown-soft-break.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownSoftBreakNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-soft-break',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<br>`,\n})\nexport class MarkdownSoftBreakComponent {\n readonly node = input.required<MarkdownSoftBreakNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-hard-break.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { MarkdownHardBreakNode } from '@cacheplane/partial-markdown';\n\n@Component({\n selector: 'chat-md-hard-break',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<br>`,\n})\nexport class MarkdownHardBreakComponent {\n readonly node = input.required<MarkdownHardBreakNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-citation-reference.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport type { MarkdownCitationReferenceNode } from '@cacheplane/partial-markdown';\nimport { CitationsResolverService } from '../citations-resolver.service';\n\n@Component({\n selector: 'chat-md-citation-reference',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (resolved(); as r) {\n @if (r.citation.url; as href) {\n <a class=\"chat-citation-marker\"\n [attr.href]=\"href\"\n [attr.title]=\"r.citation.snippet ?? href\"\n target=\"_blank\" rel=\"noopener noreferrer\">\n <sup>[{{ node().index }}]</sup>\n </a>\n } @else {\n <span class=\"chat-citation-marker chat-citation-marker--no-url\"\n [attr.title]=\"r.citation.snippet ?? r.citation.title ?? null\">\n <sup>[{{ node().index }}]</sup>\n </span>\n }\n } @else {\n <span class=\"chat-citation-marker chat-citation-marker--unresolved\"\n [attr.title]=\"'No source available'\">\n <sup>[{{ node().index }}]</sup>\n </span>\n }\n `,\n})\nexport class MarkdownCitationReferenceComponent {\n readonly node = input.required<MarkdownCitationReferenceNode>();\n private readonly resolver = inject(CitationsResolverService);\n protected readonly resolved = computed(() => {\n const lookup = this.resolver.lookup(this.node().refId);\n return lookup();\n });\n}\n","// libs/chat/src/lib/markdown/markdown-table-row.token.ts\n// SPDX-License-Identifier: MIT\nimport { InjectionToken, Signal, signal } from '@angular/core';\n\n/**\n * Provided by MarkdownTableRowComponent for header rows so that\n * MarkdownTableCellComponent can render <th> instead of <td>.\n * The value is a Signal<boolean> so that it tracks the row's isHeader reactively.\n */\nexport const IS_HEADER_ROW = new InjectionToken<Signal<boolean>>('IS_HEADER_ROW', {\n providedIn: null,\n factory: () => signal(false),\n});\n","// libs/chat/src/lib/markdown/views/markdown-table-row.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed, inject } from '@angular/core';\nimport type { MarkdownTableRowNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\nimport { IS_HEADER_ROW } from '../markdown-table-row.token';\n\n@Component({\n selector: 'chat-md-table-row',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <tr class=\"chat-md-table-row\" [class.chat-md-table-row--header]=\"node().isHeader\">\n <chat-md-children [parent]=\"node()\" />\n </tr>\n `,\n providers: [\n {\n provide: IS_HEADER_ROW,\n useFactory: () => {\n const comp = inject(MarkdownTableRowComponent);\n return computed(() => comp.node().isHeader);\n },\n },\n ],\n})\nexport class MarkdownTableRowComponent {\n readonly node = input.required<MarkdownTableRowNode>();\n}\n","// libs/chat/src/lib/markdown/views/markdown-table.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport type { MarkdownTableNode, MarkdownTableRowNode } from '@cacheplane/partial-markdown';\nimport { MarkdownTableRowComponent } from './markdown-table-row.component';\n\n@Component({\n selector: 'chat-md-table',\n standalone: true,\n imports: [MarkdownTableRowComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <table class=\"chat-md-table\">\n <thead>\n @if (headerRow(); as row) {\n <chat-md-table-row [node]=\"row\" />\n }\n </thead>\n <tbody>\n @for (row of bodyRows(); track $index) {\n <chat-md-table-row [node]=\"row\" />\n }\n </tbody>\n </table>\n `,\n})\nexport class MarkdownTableComponent {\n readonly node = input.required<MarkdownTableNode>();\n\n protected readonly headerRow = computed<MarkdownTableRowNode | null>(() => {\n const rows = this.node().children;\n return rows.length > 0 && rows[0].isHeader ? rows[0] : null;\n });\n\n protected readonly bodyRows = computed<MarkdownTableRowNode[]>(() => {\n const rows = this.node().children;\n return rows[0]?.isHeader ? rows.slice(1) : rows;\n });\n}\n","// libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, inject, computed } from '@angular/core';\nimport type { MarkdownTableCellNode } from '@cacheplane/partial-markdown';\nimport { MarkdownChildrenComponent } from '../markdown-children.component';\nimport { IS_HEADER_ROW } from '../markdown-table-row.token';\n\n@Component({\n selector: 'chat-md-table-cell',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (isHeader()) {\n <th class=\"chat-md-table-cell\" [style.text-align]=\"alignment() ?? null\">\n <chat-md-children [parent]=\"node()\" />\n </th>\n } @else {\n <td class=\"chat-md-table-cell\" [style.text-align]=\"alignment() ?? null\">\n <chat-md-children [parent]=\"node()\" />\n </td>\n }\n `,\n})\nexport class MarkdownTableCellComponent {\n readonly node = input.required<MarkdownTableCellNode>();\n\n private readonly isHeaderRowToken = inject(IS_HEADER_ROW, { optional: true });\n protected readonly isHeader = computed(() => this.isHeaderRowToken ? this.isHeaderRowToken() : false);\n protected readonly alignment = computed(() => this.node().alignment);\n}\n","// libs/chat/src/lib/markdown/cacheplane-markdown-views.ts\n// SPDX-License-Identifier: MIT\nimport { views, type ViewRegistry } from '@threadplane/render';\nimport { MarkdownDocumentComponent } from './views/markdown-document.component';\nimport { MarkdownParagraphComponent } from './views/markdown-paragraph.component';\nimport { MarkdownHeadingComponent } from './views/markdown-heading.component';\nimport { MarkdownBlockquoteComponent } from './views/markdown-blockquote.component';\nimport { MarkdownListComponent } from './views/markdown-list.component';\nimport { MarkdownListItemComponent } from './views/markdown-list-item.component';\nimport { MarkdownCodeBlockComponent } from './views/markdown-code-block.component';\nimport { MarkdownThematicBreakComponent } from './views/markdown-thematic-break.component';\nimport { MarkdownTextComponent } from './views/markdown-text.component';\nimport { MarkdownEmphasisComponent } from './views/markdown-emphasis.component';\nimport { MarkdownStrongComponent } from './views/markdown-strong.component';\nimport { MarkdownStrikethroughComponent } from './views/markdown-strikethrough.component';\nimport { MarkdownInlineCodeComponent } from './views/markdown-inline-code.component';\nimport { MarkdownLinkComponent } from './views/markdown-link.component';\nimport { MarkdownAutolinkComponent } from './views/markdown-autolink.component';\nimport { MarkdownImageComponent } from './views/markdown-image.component';\nimport { MarkdownSoftBreakComponent } from './views/markdown-soft-break.component';\nimport { MarkdownHardBreakComponent } from './views/markdown-hard-break.component';\nimport { MarkdownCitationReferenceComponent } from './views/markdown-citation-reference.component';\nimport { MarkdownTableComponent } from './views/markdown-table.component';\nimport { MarkdownTableRowComponent } from './views/markdown-table-row.component';\nimport { MarkdownTableCellComponent } from './views/markdown-table-cell.component';\n\n/**\n * Default view registry consumed by <chat-streaming-md>. Maps every\n * MarkdownNode.type emitted by @cacheplane/partial-markdown@0.2 to its\n * corresponding Angular component.\n *\n * Override per-node-type via `withViews(cacheplaneMarkdownViews, { … })`.\n */\nexport const cacheplaneMarkdownViews: ViewRegistry = views({\n 'document': MarkdownDocumentComponent,\n 'paragraph': MarkdownParagraphComponent,\n 'heading': MarkdownHeadingComponent,\n 'blockquote': MarkdownBlockquoteComponent,\n 'list': MarkdownListComponent,\n 'list-item': MarkdownListItemComponent,\n 'code-block': MarkdownCodeBlockComponent,\n 'thematic-break': MarkdownThematicBreakComponent,\n 'text': MarkdownTextComponent,\n 'emphasis': MarkdownEmphasisComponent,\n 'strong': MarkdownStrongComponent,\n 'strikethrough': MarkdownStrikethroughComponent,\n 'inline-code': MarkdownInlineCodeComponent,\n 'link': MarkdownLinkComponent,\n 'autolink': MarkdownAutolinkComponent,\n 'image': MarkdownImageComponent,\n 'soft-break': MarkdownSoftBreakComponent,\n 'hard-break': MarkdownHardBreakComponent,\n 'citation-reference': MarkdownCitationReferenceComponent,\n 'table': MarkdownTableComponent,\n 'table-row': MarkdownTableRowComponent,\n 'table-cell': MarkdownTableCellComponent,\n});\n","// libs/chat/src/lib/streaming/streaming-markdown.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport {\n createPartialMarkdownParser,\n materialize,\n type MarkdownDocumentNode,\n type PartialMarkdownParser,\n} from '@cacheplane/partial-markdown';\nimport type { ViewRegistry } from '@threadplane/render';\nimport { CHAT_MARKDOWN_STYLES } from '../styles/chat-markdown.styles';\nimport { MARKDOWN_VIEW_REGISTRY } from '../markdown/markdown-view-registry';\nimport { MarkdownChildrenComponent } from '../markdown/markdown-children.component';\nimport { cacheplaneMarkdownViews } from '../markdown/cacheplane-markdown-views';\nimport { CitationsResolverService } from '../markdown/citations-resolver.service';\n\n/**\n * Renders streaming markdown by walking a @cacheplane/partial-markdown AST\n * through @threadplane/render's view registry.\n *\n * Reactivity model: the live `parser.root` keeps a stable JS reference\n * across pushes (partial-markdown's identity guarantee). To make Angular\n * signals propagate downstream when the underlying tree changes, we surface\n * a materialized snapshot via `materialize()`. The snapshot shares\n * structurally — unchanged subtrees keep the SAME reference, and any\n * descendant change yields a NEW root reference. This lets Angular's\n * `Object.is` equality check both detect changes (root reference differs)\n * and short-circuit unchanged subtrees (per-node references stable).\n *\n * Override per-node-type renderers via the `[viewRegistry]` input or by\n * supplying a different `MARKDOWN_VIEW_REGISTRY` provider in the injector\n * tree.\n */\n@Component({\n selector: 'chat-streaming-md',\n standalone: true,\n imports: [MarkdownChildrenComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: CHAT_MARKDOWN_STYLES,\n template: `\n @if (root(); as r) {\n <chat-md-children [parent]=\"r\" />\n }\n `,\n providers: [\n {\n provide: MARKDOWN_VIEW_REGISTRY,\n useFactory: (host: ChatStreamingMdComponent) => host.resolvedRegistry(),\n deps: [ChatStreamingMdComponent],\n },\n ],\n})\nexport class ChatStreamingMdComponent {\n readonly content = input<string>('');\n readonly streaming = input<boolean>(false);\n readonly viewRegistry = input<ViewRegistry | undefined>(undefined);\n\n readonly resolvedRegistry = computed(\n () => this.viewRegistry() ?? cacheplaneMarkdownViews,\n );\n\n private readonly resolver = inject(CitationsResolverService, { optional: true });\n\n constructor() {\n effect(() => {\n const r = this.root();\n if (this.resolver && r) {\n this.resolver.markdownDefs.set(r.citations ?? new Map());\n }\n });\n }\n\n // Parser instance is rebuilt only when content diverges from the prior\n // prefix (rare). For the common streaming case where content extends the\n // prior content, we push the delta and reuse the existing parser tree.\n private parser: PartialMarkdownParser = createPartialMarkdownParser();\n private prior = '';\n private finished = false;\n\n readonly root = computed<MarkdownDocumentNode | null>(() => {\n const c = this.content();\n const isStreaming = this.streaming();\n if (c !== this.prior) {\n if (c.startsWith(this.prior)) {\n this.parser.push(c.slice(this.prior.length));\n } else {\n // Content shrank or diverged — reset.\n this.parser = createPartialMarkdownParser();\n this.finished = false;\n if (c.length > 0) this.parser.push(c);\n }\n if (!isStreaming && !this.finished) {\n // @cacheplane/partial-markdown@0.3 does not flush trailing text on\n // finish() unless the buffer ends with a newline. Plain LLM\n // responses often omit the trailing newline, which causes the\n // parser to emit a document with zero children — i.e. the message\n // renders empty. Push a sentinel newline first to force the open\n // paragraph closed before we finalize.\n if (!c.endsWith('\\n')) this.parser.push('\\n');\n this.parser.finish();\n this.finished = true;\n }\n this.prior = c;\n } else if (!isStreaming && !this.finished) {\n // Streaming flipped to false without new content; ensure parser is finalized.\n if (!this.prior.endsWith('\\n')) this.parser.push('\\n');\n this.parser.finish();\n this.finished = true;\n }\n // Materialize for Angular reactivity: produces a NEW root reference when\n // any descendant subtree changed; same reference when nothing changed\n // (structural sharing). This is what makes signal-based CD propagate\n // downstream changes despite the parser preserving identity.\n return materialize(this.parser.root) as MarkdownDocumentNode | null;\n });\n}\n","// SPDX-License-Identifier: MIT\n\n/**\n * Render a millisecond duration as a human-readable label suitable for\n * the chat-reasoning \"Thought for Ns\" pill.\n *\n * - <1 s → \"<1s\"\n * - 1–59 s → \"Ns\" (e.g. \"4s\")\n * - ≥60 s → \"Nm Ms\" (e.g. \"1m 12s\", \"60m 0s\")\n *\n * Negative or non-finite inputs collapse to \"<1s\" so a corrupted timing\n * map never produces noisy output.\n */\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 1000) return '<1s';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds - minutes * 60;\n return `${minutes}m ${seconds}s`;\n}\n","// libs/chat/src/lib/primitives/chat-reasoning/chat-reasoning.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, ChangeDetectionStrategy,\n computed, effect, input, signal,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_REASONING_STYLES } from '../../styles/chat-reasoning.styles';\nimport { ChatStreamingMdComponent } from '../../streaming/streaming-markdown.component';\nimport { formatDuration } from '../../utils/format-duration';\n\n/**\n * Renders an assistant's reasoning content as a compact pill that\n * expands to reveal the underlying text. Three visual states:\n *\n * - Streaming: pill shows \"Thinking…\" with a pulsing dot; auto-expanded\n * so the user sees reasoning stream in real time.\n * - Idle, with durationMs known: pill shows \"Thought for {duration}\";\n * collapsed by default, expand on click.\n * - Idle, no duration: pill shows \"Show reasoning\"; collapsed by default.\n *\n * The body re-uses chat-streaming-md so reasoning content gets the same\n * markdown rendering pipeline as the visible response (lists, code,\n * step labels often appear in reasoning output).\n *\n * Internal state: a tristate \"expanded\" — null means follow auto state-\n * driven logic (force-expand on isStreaming, otherwise honor\n * defaultExpanded), boolean is a manual user choice that wins for the\n * lifetime of the instance.\n */\n@Component({\n selector: 'chat-reasoning',\n standalone: true,\n imports: [ChatStreamingMdComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_REASONING_STYLES],\n host: {\n '[attr.data-has-content]': 'hasContent()',\n '[attr.data-expanded]': 'expandedStr()',\n '[attr.data-streaming]': 'isStreaming()',\n },\n template: `\n <button\n type=\"button\"\n class=\"chat-reasoning__header\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggle()\"\n >\n <svg class=\"chat-reasoning__chevron\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 2l4 4-4 4\"/>\n </svg>\n @if (isStreaming()) {\n <span class=\"chat-reasoning__pulse\" aria-hidden=\"true\"></span>\n }\n <span class=\"chat-reasoning__label\">{{ resolvedLabel() }}</span>\n </button>\n @if (expanded()) {\n <div class=\"chat-reasoning__body\">\n <chat-streaming-md [content]=\"content()\" [streaming]=\"isStreaming()\" />\n </div>\n }\n `,\n})\nexport class ChatReasoningComponent {\n readonly content = input<string>('');\n readonly isStreaming = input<boolean>(false);\n readonly durationMs = input<number | undefined>(undefined);\n readonly label = input<string | undefined>(undefined);\n readonly defaultExpanded = input<boolean>(false);\n\n readonly hasContent = computed(() => (this.content() ?? '').length > 0);\n\n /** null = follow auto logic (streaming → expanded, else defaultExpanded). */\n private readonly _expandedOverride = signal<boolean | null>(null);\n\n readonly expanded = computed(() => {\n const override = this._expandedOverride();\n if (override !== null) return override;\n if (this.isStreaming()) return true;\n return this.defaultExpanded();\n });\n\n readonly expandedStr = computed(() => String(this.expanded()));\n\n readonly resolvedLabel = computed(() => {\n const explicit = this.label();\n if (explicit) return explicit;\n if (this.isStreaming()) return 'Thinking…';\n const ms = this.durationMs();\n if (typeof ms === 'number') return `Thought for ${formatDuration(ms)}`;\n return 'Show reasoning';\n });\n\n constructor() {\n // Reset the manual override when streaming re-engages from idle (e.g.\n // follow-up turn that re-uses this instance) so the auto force-expand\n // logic takes over again. Spec §3.3 bullet 3.\n let prevStreaming = false;\n effect(() => {\n const streaming = this.isStreaming();\n if (!prevStreaming && streaming) {\n this._expandedOverride.set(null);\n }\n prevStreaming = streaming;\n });\n }\n\n toggle(): void {\n this._expandedOverride.set(!this.expanded());\n }\n}\n","// libs/chat/src/lib/styles/chat-launcher-button.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_LAUNCHER_BUTTON_STYLES = `\n :host { display: inline-block; }\n .chat-launcher-button {\n width: 56px;\n height: 56px;\n border-radius: var(--ngaf-chat-radius-launcher);\n background: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-on-primary);\n border: 0;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--ngaf-chat-shadow-md);\n transition: transform 200ms ease;\n }\n .chat-launcher-button:hover { transform: scale(1.05); }\n .chat-launcher-button svg { width: 24px; height: 24px; }\n`;\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, output } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_LAUNCHER_BUTTON_STYLES } from '../../styles/chat-launcher-button.styles';\n\n@Component({\n selector: 'chat-launcher-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_LAUNCHER_BUTTON_STYLES],\n template: `\n <button type=\"button\" class=\"chat-launcher-button\" aria-label=\"Open chat\" (click)=\"clicked.emit()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>\n </svg>\n </button>\n `,\n})\nexport class ChatLauncherButtonComponent {\n /** Fires when the inner <button> receives a click. Prefer this over\n * binding `(click)` on the host element — explicit output gives\n * consumers (and Playwright) an unambiguous click target that won't\n * be intercepted by sibling overlays in higher stacking contexts.\n * Native `(click)` on the host still works for back-compat: the\n * click event bubbles through unchanged. */\n readonly clicked = output<void>();\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_SUGGESTIONS_STYLES = `\n :host { display: block; }\n .chat-suggestions { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; }\n .chat-suggestion {\n padding: 6px 10px;\n font-size: var(--ngaf-chat-font-size-xs);\n border-radius: var(--ngaf-chat-radius-bubble);\n border: 1px solid var(--ngaf-chat-muted);\n background: transparent;\n color: var(--ngaf-chat-text);\n cursor: pointer;\n transition: transform 200ms ease;\n }\n .chat-suggestion:hover { transform: scale(1.03); }\n .chat-suggestion:disabled { cursor: wait; opacity: 0.6; }\n`;\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SUGGESTIONS_STYLES } from '../../styles/chat-suggestions.styles';\n\n@Component({\n selector: 'chat-suggestions',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_SUGGESTIONS_STYLES],\n template: `\n <div class=\"chat-suggestions\">\n @for (s of suggestions(); track s) {\n <button type=\"button\" class=\"chat-suggestion\" (click)=\"selected.emit(s)\">{{ s }}</button>\n }\n </div>\n `,\n})\nexport class ChatSuggestionsComponent {\n readonly suggestions = input<string[]>([]);\n readonly selected = output<string>();\n}\n","// libs/chat/src/lib/styles/chat-input.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_INPUT_STYLES = `\n:host {\n display: block;\n width: 100%;\n padding: 0 var(--ngaf-chat-edge-pad);\n box-sizing: border-box;\n}\n\n.chat-input__container {\n width: 100%;\n max-width: var(--ngaf-chat-max-width);\n margin: 0 auto;\n}\n\n.chat-input__pill {\n display: flex;\n align-items: center;\n gap: 8px;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 9999px;\n padding: 8px 8px 8px 16px;\n min-height: 56px;\n box-sizing: border-box;\n}\n\n.chat-input__textarea {\n flex: 1 1 auto;\n border: 0;\n outline: none;\n resize: none;\n background: transparent;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: 1rem;\n line-height: 1.5;\n padding: 0;\n field-sizing: content;\n overflow-y: auto;\n}\n.chat-input__textarea::placeholder { color: var(--ngaf-chat-text-muted); }\n.chat-input__textarea::-webkit-scrollbar { width: 4px; }\n.chat-input__textarea::-webkit-scrollbar-thumb { background: var(--ngaf-chat-separator); border-radius: 4px; }\n\n.chat-input__controls {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: none;\n}\n\n.chat-input__send,\n.chat-input__send--stop {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: opacity 150ms ease, transform 150ms ease, background 150ms ease;\n padding: 0;\n}\n.chat-input__send {\n background: var(--ngaf-chat-text);\n color: var(--ngaf-chat-bg);\n}\n.chat-input__send:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n background: var(--ngaf-chat-text-muted);\n}\n.chat-input__send:not(:disabled):hover { transform: scale(1.05); }\n.chat-input__send svg { width: 16px; height: 16px; }\n\n.chat-input__send--stop {\n background: var(--ngaf-chat-text-muted);\n color: var(--ngaf-chat-bg);\n}\n.chat-input__send--stop:hover { transform: scale(1.05); }\n.chat-input__send--stop svg { width: 14px; height: 14px; }\n`;\n","// libs/chat/src/lib/primitives/chat-input/chat-input.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n ElementRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_INPUT_STYLES } from '../../styles/chat-input.styles';\n\n/**\n * Submits a trimmed message to the agent.\n * Returns the trimmed string on success, or `null` if the input was empty.\n */\nexport function submitMessage(\n agent: Agent,\n text: string,\n): string | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n void agent.submit({ message: trimmed });\n return trimmed;\n}\n\n@Component({\n selector: 'chat-input',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_INPUT_STYLES],\n template: `\n <div class=\"chat-input__container\">\n <ng-content select=\"[chatInputBanner]\" />\n <ng-content select=\"[chatInputAttachments]\" />\n <div class=\"chat-input__pill\">\n <ng-content select=\"[chatInputLeading]\" />\n <textarea\n #textareaEl\n class=\"chat-input__textarea\"\n [value]=\"messageText()\"\n (input)=\"onInput($event)\"\n [placeholder]=\"placeholder()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (compositionstart)=\"composing.set(true)\"\n (compositionend)=\"composing.set(false)\"\n (focus)=\"focused.set(true)\"\n (blur)=\"focused.set(false)\"\n name=\"messageText\"\n rows=\"1\"\n aria-label=\"Type a message\"\n ></textarea>\n <div class=\"chat-input__controls\">\n <ng-content select=\"[chatInputModelSelect]\" />\n <ng-content select=\"[chatInputTrailing]\" />\n @if (isLoading() && canStop()) {\n <button\n type=\"button\"\n class=\"chat-input__send chat-input__send--stop\"\n (click)=\"onStop()\"\n aria-label=\"Stop generating\"\n title=\"Stop generating\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/>\n </svg>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"chat-input__send\"\n [disabled]=\"!canSubmit()\"\n (click)=\"onSubmit()\"\n aria-label=\"Send message\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\"/>\n <polyline points=\"5 12 12 5 19 12\"/>\n </svg>\n </button>\n }\n </div>\n </div>\n <ng-content select=\"[chatInputFooter]\" />\n </div>\n `,\n})\nexport class ChatInputComponent {\n readonly agent = input.required<Agent>();\n readonly submitOnEnter = input<boolean>(true);\n readonly placeholder = input<string>('');\n /** When true (default), shows a stop button while the agent is streaming. */\n readonly showStopButton = input<boolean>(true);\n readonly submitted = output<string>();\n readonly stopped = output<void>();\n readonly messageText = signal<string>('');\n readonly isLoading = computed(() => this.agent().isLoading());\n /** True while an IME composition (CJK input, accent, autocorrect) is active. */\n protected readonly composing = signal(false);\n readonly focused = signal(false);\n\n /** Submit is allowed only when not loading and there's non-whitespace text. */\n readonly canSubmit = computed(() => {\n if (this.isLoading()) return false;\n return this.messageText().trim().length > 0;\n });\n\n /** The stop button only appears when the consumer opted in AND we're loading. */\n readonly canStop = computed(() => this.showStopButton());\n\n private readonly textareaEl = viewChild<ElementRef<HTMLTextAreaElement>>('textareaEl');\n\n /**\n * Auto-resize the textarea to fit its content as the user types or pastes\n * multi-line text. Caps at min(40vh, 320px); beyond that the textarea\n * scrolls. Without this, multi-line input is hidden behind the rows=\"1\"\n * fixed height (caught by live browser smoke).\n */\n constructor() {\n effect(() => {\n const text = this.messageText();\n const el = this.textareaEl()?.nativeElement;\n if (!el) return;\n // Cap: min(40vh, 320px). Recomputed on each input so viewport resizes\n // between keystrokes are picked up without a dedicated resize listener.\n const viewportH = typeof window === 'undefined' ? 600 : window.innerHeight;\n const cap = Math.min(viewportH * 0.4, 320);\n el.style.height = 'auto';\n const next = Math.min(el.scrollHeight, cap);\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > cap ? 'auto' : 'hidden';\n void text;\n });\n }\n\n focusTextarea(): void {\n this.textareaEl()?.nativeElement.focus();\n }\n\n onSubmit(): void {\n const submitted = submitMessage(this.agent(), this.messageText());\n if (submitted !== null) {\n this.submitted.emit(submitted);\n this.messageText.set('');\n const el = this.textareaEl()?.nativeElement;\n if (el) el.value = '';\n requestAnimationFrame(() => this.textareaEl()?.nativeElement.focus());\n }\n }\n\n /** Sync the textarea's value into the signal on user input. A direct\n * [value]/(input) pair is used instead of ngModel: NgModel does not\n * reliably write a programmatic clear back to the view under zoneless\n * + OnPush, leaving sent text visible in the composer (audit F1). */\n protected onInput(event: Event): void {\n this.messageText.set((event.target as HTMLTextAreaElement).value);\n }\n\n /** Abort the current streaming response (if the adapter supports it). */\n onStop(): void {\n const a = this.agent() as unknown as { stop?: () => void | Promise<void> };\n if (typeof a.stop === 'function') {\n void a.stop();\n }\n this.stopped.emit();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (!this.submitOnEnter() || event.shiftKey) return;\n // Don't submit while an IME composition is in progress (CJK input,\n // dead-key accents, autocorrect popups). The composition's terminating\n // Enter must reach the textarea so the candidate is committed; submitting\n // here would discard the user's in-progress character.\n if (this.composing() || event.isComposing || event.keyCode === 229) return;\n event.preventDefault();\n this.onSubmit();\n }\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_TYPING_INDICATOR_STYLES = `\n /* Sit in the same centered column as chat-message-list so the dots\n don't flash at the scroll container's left edge before the assistant\n message renders. */\n :host {\n display: block;\n padding: 0 var(--ngaf-chat-space-6) var(--ngaf-chat-space-3);\n max-width: var(--ngaf-chat-max-width);\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n }\n .chat-typing__dots { display: inline-flex; gap: 4px; align-items: center; }\n .chat-typing__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--ngaf-chat-text-muted);\n animation: ngaf-chat-typing-dot 1.4s ease-in-out infinite both;\n }\n .chat-typing__dot:nth-child(2) { animation-delay: 0.2s; }\n .chat-typing__dot:nth-child(3) { animation-delay: 0.4s; }\n`;\n","// libs/chat/src/lib/primitives/chat-typing-indicator/chat-typing-indicator.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_TYPING_INDICATOR_STYLES } from '../../styles/chat-typing-indicator.styles';\n\n/**\n * Whether the agent should show a \"typing\" indicator — it is loading and has\n * not yet started streaming the assistant's reply.\n *\n * @param agent The agent to inspect.\n * @returns `true` while the agent is awaiting a response but no assistant text\n * has streamed yet; `false` once tokens arrive or the agent is idle.\n * @example\n * ```ts\n * \\@if (isTyping(agent)) { <chat-typing-indicator [agent]=\"agent\" /> }\n * ```\n */\nexport function isTyping(agent: Agent): boolean {\n if (!agent.isLoading()) return false;\n const msgs = agent.messages();\n if (msgs.length === 0) return true;\n const last = msgs[msgs.length - 1];\n if (last.role === 'user') return true;\n if (last.role === 'assistant') {\n return typeof last.content === 'string'\n ? !last.content\n : last.content.length === 0;\n }\n return false;\n}\n\n@Component({\n selector: 'chat-typing-indicator',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_TYPING_INDICATOR_STYLES],\n template: `\n @if (visible()) {\n <div class=\"chat-typing__dots\" role=\"status\" aria-label=\"Assistant is typing\">\n <span class=\"chat-typing__dot\"></span>\n <span class=\"chat-typing__dot\"></span>\n <span class=\"chat-typing__dot\"></span>\n </div>\n }\n `,\n})\nexport class ChatTypingIndicatorComponent {\n readonly agent = input.required<Agent>();\n readonly visible = computed(() => isTyping(this.agent()));\n}\n","// libs/chat/src/lib/styles/chat-history-search-palette.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_HISTORY_SEARCH_PALETTE_STYLES = `\n :host { display: contents; }\n .chat-history-search-palette__scrim {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: var(--ngaf-chat-z-modal-scrim, 1100);\n border: 0;\n padding: 0;\n cursor: pointer;\n }\n .chat-history-search-palette {\n position: fixed;\n top: 15vh;\n left: 50%;\n transform: translateX(-50%);\n width: min(560px, 90vw);\n max-height: 70vh;\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.25);\n z-index: var(--ngaf-chat-z-modal, 1101);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .chat-history-search-palette__input-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--ngaf-chat-separator);\n }\n .chat-history-search-palette__icon {\n width: 18px;\n height: 18px;\n color: var(--ngaf-chat-text-muted);\n flex-shrink: 0;\n }\n .chat-history-search-palette__input {\n flex: 1 1 auto;\n border: 0;\n outline: none;\n background: transparent;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: 1rem;\n }\n .chat-history-search-palette__input::placeholder {\n color: var(--ngaf-chat-text-muted);\n }\n .chat-history-search-palette__close {\n background: transparent;\n border: 0;\n padding: 4px;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n .chat-history-search-palette__close:hover { color: var(--ngaf-chat-text); }\n .chat-history-search-palette__list {\n flex: 1 1 auto;\n overflow-y: auto;\n padding: 4px;\n margin: 0;\n list-style: none;\n }\n .chat-history-search-palette__row {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n }\n .chat-history-search-palette__row[aria-selected=\"true\"] {\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-history-search-palette__row-title {\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size);\n }\n .chat-history-search-palette__row-subtitle {\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n margin-top: 2px;\n }\n .chat-history-search-palette__empty,\n .chat-history-search-palette__hint {\n padding: 24px 16px;\n color: var(--ngaf-chat-text-muted);\n text-align: center;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-history-search-palette__skeleton {\n padding: 8px 4px;\n }\n .chat-history-search-palette__skeleton-row {\n height: 36px;\n margin: 4px 0;\n background: var(--ngaf-chat-surface-alt);\n border-radius: 8px;\n animation: ngaf-chat-pulse 1.4s ease-in-out infinite;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-history-search-palette/chat-history-search-palette.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n effect,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_HISTORY_SEARCH_PALETTE_STYLES } from '../../styles/chat-history-search-palette.styles';\n\nexport interface ThreadMatch {\n id: string;\n title: string;\n /** Optional secondary line, rendered muted under the title. */\n subtitle?: string;\n}\n\nlet paletteInstanceCounter = 0;\n\n@Component({\n selector: 'chat-history-search-palette',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_HISTORY_SEARCH_PALETTE_STYLES],\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-history-search-palette__scrim\"\n aria-label=\"Close search\"\n (click)=\"closed.emit()\"\n ></button>\n <div\n class=\"chat-history-search-palette\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Search conversations\"\n >\n <div class=\"chat-history-search-palette__input-row\">\n <svg class=\"chat-history-search-palette__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"/>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n </svg>\n <input\n #inputEl\n class=\"chat-history-search-palette__input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeRowId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n <button\n type=\"button\"\n class=\"chat-history-search-palette__close\"\n aria-label=\"Close\"\n (click)=\"closed.emit()\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n @if (loading() && results().length === 0) {\n <div class=\"chat-history-search-palette__skeleton\" aria-hidden=\"true\">\n <div class=\"chat-history-search-palette__skeleton-row\"></div>\n <div class=\"chat-history-search-palette__skeleton-row\"></div>\n <div class=\"chat-history-search-palette__skeleton-row\"></div>\n </div>\n } @else if (results().length === 0 && query().length === 0) {\n <div class=\"chat-history-search-palette__hint\">Type to search your conversations.</div>\n } @else if (results().length === 0) {\n <div class=\"chat-history-search-palette__empty\">No conversations match.</div>\n } @else {\n <ul class=\"chat-history-search-palette__list\" role=\"listbox\" [id]=\"listId\">\n @for (row of results(); let i = $index; track row.id) {\n <li\n class=\"chat-history-search-palette__row\"\n role=\"option\"\n tabindex=\"-1\"\n [id]=\"rowId(i)\"\n [attr.aria-selected]=\"i === activeIndex() ? 'true' : 'false'\"\n (click)=\"onRowClick(row.id)\"\n (keydown.enter)=\"onRowClick(row.id)\"\n (keydown.space)=\"onRowClick(row.id)\"\n >\n <span class=\"chat-history-search-palette__row-title\">{{ row.title }}</span>\n @if (row.subtitle) {\n <span class=\"chat-history-search-palette__row-subtitle\">{{ row.subtitle }}</span>\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n `,\n})\nexport class ChatHistorySearchPaletteComponent {\n readonly open = model<boolean>(false);\n readonly query = model<string>('');\n readonly results = input<ThreadMatch[]>([]);\n readonly loading = input<boolean>(false);\n readonly placeholder = input<string>('Search conversations');\n\n readonly threadSelected = output<string>();\n readonly closed = output<void>();\n\n protected readonly activeIndex = signal<number>(0);\n protected readonly listId = `chat-history-search-palette__results-${++paletteInstanceCounter}`;\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.activeIndex.set(0);\n queueMicrotask(() => this.inputEl()?.nativeElement.focus());\n }\n });\n effect(() => {\n const max = this.results().length - 1;\n if (max >= 0 && this.activeIndex() > max) {\n this.activeIndex.set(max);\n }\n });\n }\n\n protected rowId(index: number): string {\n return `${this.listId}__row-${index}`;\n }\n\n protected activeRowId(): string | null {\n return this.results().length > 0 ? this.rowId(this.activeIndex()) : null;\n }\n\n protected onInput(e: Event): void {\n const value = (e.target as HTMLInputElement).value;\n this.query.set(value);\n }\n\n protected onInputKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.closed.emit();\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const max = this.results().length - 1;\n if (max < 0) return;\n this.activeIndex.set(Math.min(this.activeIndex() + 1, max));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.activeIndex.set(Math.max(this.activeIndex() - 1, 0));\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const rows = this.results();\n if (rows.length === 0) return;\n const row = rows[this.activeIndex()];\n this.threadSelected.emit(row.id);\n return;\n }\n }\n\n protected onRowClick(id: string): void {\n this.threadSelected.emit(id);\n }\n}\n","// libs/chat/src/lib/styles/chat-overflow-menu.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_OVERFLOW_MENU_STYLES = `\n :host { display: contents; }\n .chat-overflow-menu__scrim {\n position: fixed;\n inset: 0;\n background: transparent;\n z-index: 59;\n border: 0;\n padding: 0;\n cursor: default;\n }\n .chat-overflow-menu {\n position: fixed;\n z-index: 60;\n min-width: 160px;\n padding: 4px;\n margin: 0;\n list-style: none;\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);\n }\n .chat-overflow-menu__item {\n display: block;\n padding: 8px 12px;\n border-radius: 4px;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n user-select: none;\n }\n .chat-overflow-menu__item:hover {\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-overflow-menu__item:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: -2px;\n }\n .chat-overflow-menu__item--destructive {\n color: var(--ngaf-chat-error-text);\n }\n .chat-overflow-menu__item--disabled {\n color: var(--ngaf-chat-text-muted);\n cursor: not-allowed;\n pointer-events: none;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-overflow-menu/chat-overflow-menu.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n computed,\n effect,\n input,\n output,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_OVERFLOW_MENU_STYLES } from '../../styles/chat-overflow-menu.styles';\n\nexport interface OverflowMenuItem {\n /** Stable id emitted via (itemSelected). */\n id: string;\n label: string;\n /** 'destructive' renders the label in red. Default 'normal'. */\n tone?: 'normal' | 'destructive';\n /** Disabled items render muted and ignore clicks/keypresses. */\n disabled?: boolean;\n}\n\n@Component({\n selector: 'chat-overflow-menu',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_OVERFLOW_MENU_STYLES],\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-overflow-menu__scrim\"\n aria-label=\"Close menu\"\n (click)=\"closed.emit()\"\n ></button>\n <ul\n class=\"chat-overflow-menu\"\n role=\"menu\"\n tabindex=\"-1\"\n [style.top.px]=\"position().top\"\n [style.left.px]=\"position().left\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (item of items(); track item.id) {\n <li\n role=\"menuitem\"\n tabindex=\"0\"\n class=\"chat-overflow-menu__item\"\n [class.chat-overflow-menu__item--destructive]=\"item.tone === 'destructive'\"\n [class.chat-overflow-menu__item--disabled]=\"item.disabled\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [attr.tabindex]=\"item.disabled ? -1 : 0\"\n (click)=\"onItemClick(item)\"\n (keydown.enter)=\"onItemClick(item)\"\n (keydown.space)=\"onItemClick(item)\"\n >\n {{ item.label }}\n </li>\n }\n </ul>\n }\n `,\n})\nexport class ChatOverflowMenuComponent {\n readonly open = input<boolean>(false);\n readonly items = input<OverflowMenuItem[]>([]);\n /** Element the menu anchors against (positions just below its bottom-right corner). */\n readonly anchor = input<HTMLElement | null>(null);\n /** Alternative anchor: explicit viewport coordinates (e.g. cursor position\n * from a right-click). Takes precedence over `anchor` when set. */\n readonly anchorPos = input<{ x: number; y: number } | null>(null);\n readonly itemSelected = output<string>();\n readonly closed = output<void>();\n\n protected readonly position = computed<{ top: number; left: number }>(() => {\n if (!this.open()) return { top: 0, left: 0 };\n const pos = this.anchorPos();\n if (pos) {\n return { top: pos.y + 4, left: Math.max(pos.x, 8) };\n }\n const el = this.anchor();\n if (!el) {\n const vw = typeof window === 'undefined' ? 0 : window.innerWidth;\n const vh = typeof window === 'undefined' ? 0 : window.innerHeight;\n return { top: Math.max(vh / 3, 0), left: Math.max(vw / 2 - 80, 0) };\n }\n const rect = el.getBoundingClientRect();\n return { top: rect.bottom + 4, left: Math.max(rect.right - 160, 8) };\n });\n\n constructor() {\n effect(() => {\n if (!this.open()) return;\n queueMicrotask(() => {\n const root = document.querySelector('.chat-overflow-menu');\n const first = root?.querySelector<HTMLElement>('.chat-overflow-menu__item:not(.chat-overflow-menu__item--disabled)');\n first?.focus();\n });\n });\n }\n\n protected onItemClick(item: OverflowMenuItem): void {\n if (item.disabled) return;\n this.itemSelected.emit(item.id);\n this.closed.emit();\n }\n\n protected onMenuKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.closed.emit();\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const root = (e.currentTarget as HTMLElement);\n const items = Array.from(root.querySelectorAll<HTMLElement>('.chat-overflow-menu__item:not(.chat-overflow-menu__item--disabled)'));\n if (items.length === 0) return;\n const current = document.activeElement as HTMLElement | null;\n const idx = current ? items.indexOf(current) : -1;\n const next = e.key === 'ArrowDown'\n ? Math.min((idx < 0 ? 0 : idx + 1), items.length - 1)\n : Math.max(idx - 1, 0);\n items[next]?.focus();\n }\n }\n}\n","// libs/chat/src/lib/styles/chat-confirm-dialog.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_CONFIRM_DIALOG_STYLES = `\n :host { display: contents; }\n .chat-confirm-dialog__scrim {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 70;\n border: 0;\n padding: 0;\n cursor: pointer;\n }\n .chat-confirm-dialog {\n position: fixed;\n top: 30vh;\n left: 50%;\n transform: translateX(-50%);\n width: min(420px, 90vw);\n z-index: 71;\n padding: 20px;\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.25);\n }\n .chat-confirm-dialog__title {\n margin: 0 0 8px 0;\n color: var(--ngaf-chat-text);\n font-size: 1.125rem;\n font-weight: 600;\n }\n .chat-confirm-dialog__body {\n margin: 0 0 16px 0;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n line-height: 1.5;\n }\n .chat-confirm-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n .chat-confirm-dialog__cancel,\n .chat-confirm-dialog__confirm {\n padding: 8px 16px;\n border-radius: 6px;\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n border: 1px solid var(--ngaf-chat-separator);\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n }\n .chat-confirm-dialog__cancel:hover { background: var(--ngaf-chat-surface-alt); }\n .chat-confirm-dialog__confirm {\n background: var(--ngaf-chat-text);\n color: var(--ngaf-chat-bg);\n border-color: transparent;\n }\n .chat-confirm-dialog__confirm--destructive {\n background: var(--ngaf-chat-destructive);\n color: #fff;\n border-color: transparent;\n }\n .chat-confirm-dialog__confirm--destructive:hover {\n filter: brightness(1.1);\n }\n .chat-confirm-dialog__cancel:focus-visible,\n .chat-confirm-dialog__confirm:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-confirm-dialog/chat-confirm-dialog.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n effect,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_CONFIRM_DIALOG_STYLES } from '../../styles/chat-confirm-dialog.styles';\n\nlet confirmDialogInstanceCounter = 0;\n\n@Component({\n selector: 'chat-confirm-dialog',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_CONFIRM_DIALOG_STYLES],\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-confirm-dialog__scrim\"\n aria-label=\"Cancel\"\n (click)=\"cancelled.emit()\"\n ></button>\n <div\n class=\"chat-confirm-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"body() ? bodyId : null\"\n (keydown)=\"onDialogKeydown($event)\"\n >\n <h2 [id]=\"titleId\" class=\"chat-confirm-dialog__title\">{{ title() }}</h2>\n @if (body()) {\n <p [id]=\"bodyId\" class=\"chat-confirm-dialog__body\">{{ body() }}</p>\n }\n <div class=\"chat-confirm-dialog__actions\">\n <button\n #cancelBtn\n type=\"button\"\n class=\"chat-confirm-dialog__cancel\"\n (click)=\"cancelled.emit()\"\n >{{ cancelLabel() }}</button>\n <button\n type=\"button\"\n class=\"chat-confirm-dialog__confirm\"\n [class.chat-confirm-dialog__confirm--destructive]=\"tone() === 'destructive'\"\n (click)=\"confirmed.emit()\"\n >{{ confirmLabel() }}</button>\n </div>\n </div>\n }\n `,\n})\nexport class ChatConfirmDialogComponent {\n readonly open = input<boolean>(false);\n readonly title = input<string>('Are you sure?');\n readonly body = input<string>('');\n readonly confirmLabel = input<string>('Confirm');\n readonly cancelLabel = input<string>('Cancel');\n readonly tone = input<'destructive' | 'normal'>('normal');\n\n readonly confirmed = output<void>();\n readonly cancelled = output<void>();\n\n private readonly instanceId = ++confirmDialogInstanceCounter;\n protected readonly titleId = `chat-confirm-dialog__title-${this.instanceId}`;\n protected readonly bodyId = `chat-confirm-dialog__body-${this.instanceId}`;\n\n private readonly cancelBtn = viewChild<ElementRef<HTMLButtonElement>>('cancelBtn');\n\n constructor() {\n effect(() => {\n if (!this.open()) return;\n queueMicrotask(() => this.cancelBtn()?.nativeElement.focus());\n });\n }\n\n protected onDialogKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.cancelled.emit();\n }\n }\n}\n","// libs/chat/src/lib/styles/chat-scroll-bubble.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_SCROLL_BUBBLE_STYLES = `\n :host {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-bottom: 8px;\n z-index: 2;\n pointer-events: none;\n }\n .chat-scroll-bubble {\n pointer-events: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 36px;\n height: 36px;\n padding: 0 12px;\n border-radius: 9999px;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n color: var(--ngaf-chat-text);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n cursor: pointer;\n transition: transform 150ms ease, box-shadow 150ms ease;\n }\n .chat-scroll-bubble:hover { transform: scale(1.05); }\n .chat-scroll-bubble__dots { display: inline-flex; gap: 4px; align-items: center; }\n .chat-scroll-bubble__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--ngaf-chat-text-muted);\n animation: ngaf-chat-typing-dot 1.4s ease-in-out infinite both;\n }\n .chat-scroll-bubble__dot:nth-child(2) { animation-delay: 0.2s; }\n .chat-scroll-bubble__dot:nth-child(3) { animation-delay: 0.4s; }\n .chat-scroll-bubble__arrow {\n width: 16px;\n height: 16px;\n display: block;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, output, computed } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SCROLL_BUBBLE_STYLES } from '../../styles/chat-scroll-bubble.styles';\n\nexport type ChatScrollBubbleMode = 'streaming' | 'idle';\n\n@Component({\n selector: 'chat-scroll-bubble',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_SCROLL_BUBBLE_STYLES],\n template: `\n <button\n type=\"button\"\n class=\"chat-scroll-bubble\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"clicked.emit()\"\n >\n @if (mode() === 'streaming') {\n <span class=\"chat-scroll-bubble__dots\" aria-hidden=\"true\">\n <span class=\"chat-scroll-bubble__dot\"></span>\n <span class=\"chat-scroll-bubble__dot\"></span>\n <span class=\"chat-scroll-bubble__dot\"></span>\n </span>\n } @else {\n <svg class=\"chat-scroll-bubble__arrow\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <polyline points=\"19 12 12 19 5 12\"/>\n </svg>\n }\n </button>\n `,\n})\nexport class ChatScrollBubbleComponent {\n readonly mode = input.required<ChatScrollBubbleMode>();\n readonly clicked = output<void>();\n protected readonly ariaLabel = computed(() =>\n this.mode() === 'streaming' ? 'Latest activity' : 'Scroll to latest',\n );\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_ERROR_STYLES = `\n :host { display: block; }\n .chat-error {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n background: var(--ngaf-chat-error-bg);\n border: 1px solid var(--ngaf-chat-error-border);\n color: var(--ngaf-chat-error-text);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 8px 12px;\n font-size: var(--ngaf-chat-font-size-sm);\n margin: 0 var(--ngaf-chat-space-6) var(--ngaf-chat-space-2);\n }\n .chat-error__icon { flex-shrink: 0; width: 16px; height: 16px; margin-top: 2px; }\n .chat-error__msg { flex: 1; min-width: 0; word-break: break-word; }\n .chat-error__retry {\n flex-shrink: 0;\n background: transparent;\n color: var(--ngaf-chat-error-text);\n border: 1px solid var(--ngaf-chat-error-border);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 2px 10px;\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n transition: background 150ms ease, color 150ms ease;\n white-space: nowrap;\n }\n .chat-error__retry:hover {\n background: var(--ngaf-chat-error-border);\n color: var(--ngaf-chat-error-text);\n }\n .chat-error__retry:focus-visible {\n outline: 2px solid var(--ngaf-chat-error-border);\n outline-offset: 2px;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-error/chat-error.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input } from '@angular/core';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_ERROR_STYLES } from '../../styles/chat-error.styles';\n\nexport function extractErrorMessage(error: unknown): string | null {\n if (!error) return null;\n if (error instanceof Error) return error.message;\n if (typeof error === 'string') return error;\n return String(error);\n}\n\n@Component({\n selector: 'chat-error',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_ERROR_STYLES],\n template: `\n @if (agent().error(); as err) {\n <div class=\"chat-error\" role=\"alert\">\n <svg class=\"chat-error__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n <span class=\"chat-error__msg\">{{ err.message }}</span>\n @if (err.retryable) {\n <button type=\"button\" class=\"chat-error__retry\" (click)=\"agent().retry()\">Retry</button>\n }\n </div>\n }\n `,\n})\nexport class ChatErrorComponent {\n readonly agent = input.required<Agent>();\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_INTERRUPT_STYLES = `\n :host { display: block; }\n .chat-interrupt {\n background: var(--ngaf-chat-warning-bg);\n color: var(--ngaf-chat-warning-text);\n border-left: 3px solid var(--ngaf-chat-warning-text);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 12px 16px;\n margin: 0 var(--ngaf-chat-space-6) var(--ngaf-chat-space-2);\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-interrupt__title { font-weight: 600; margin: 0 0 4px; display: flex; align-items: center; gap: 6px; }\n .chat-interrupt__body { margin: 0 0 8px; opacity: 0.95; }\n .chat-interrupt__actions { display: flex; gap: 8px; flex-wrap: wrap; }\n`;\n","// libs/chat/src/lib/primitives/chat-interrupt/chat-interrupt.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent } from '../../agent';\nimport type { AgentInterrupt } from '../../agent/agent-interrupt';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_INTERRUPT_STYLES } from '../../styles/chat-interrupt.styles';\n\n/**\n * Read the agent's current human-in-the-loop interrupt, if any.\n *\n * @param agent The agent to inspect.\n * @returns The pending {@link AgentInterrupt}, or `undefined` when the agent is\n * not currently waiting on an interrupt.\n * @example\n * ```ts\n * const interrupt = getInterrupt(agent);\n * if (interrupt) agent.resume('approved');\n * ```\n */\nexport function getInterrupt(agent: Agent): AgentInterrupt | undefined {\n return agent.interrupt?.();\n}\n\n@Component({\n selector: 'chat-interrupt',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_INTERRUPT_STYLES],\n template: `\n @if (interrupt(); as currentInterrupt) {\n <div class=\"chat-interrupt\" role=\"status\">\n <div class=\"chat-interrupt__title\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/>\n </svg>\n Agent paused\n </div>\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"{ $implicit: currentInterrupt }\"\n />\n } @else {\n <p class=\"chat-interrupt__body\">{{ defaultText(currentInterrupt) }}</p>\n }\n </div>\n }\n `,\n})\nexport class ChatInterruptComponent {\n readonly agent = input.required<Agent>();\n readonly templateRef = contentChild(TemplateRef);\n readonly interrupt = computed(() => getInterrupt(this.agent()));\n\n defaultText(i: AgentInterrupt): string {\n const v = (i as { value?: unknown }).value;\n return typeof v === 'string' ? v : JSON.stringify(v);\n }\n}\n","// libs/chat/src/lib/compositions/chat-tool-call-card/chat-tool-call-card.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { ChatTraceComponent, type TraceState } from '../../primitives/chat-trace/chat-trace.component';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport type { ToolCallStatus } from '../../agent';\n\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: unknown;\n result?: unknown;\n /** Optional — present when the parent provides it. Drives the pill + default-collapsed logic. */\n status?: ToolCallStatus;\n}\n\n@Component({\n selector: 'chat-tool-call-card',\n standalone: true,\n imports: [ChatTraceComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; }\n .tcc__name {\n font-family: var(--ngaf-chat-font-mono);\n font-size: var(--ngaf-chat-font-size-sm, 13px);\n color: var(--ngaf-chat-text-muted);\n font-weight: 400;\n padding-left: 2px;\n }\n .tcc__pill {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 9999px;\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text-muted);\n font-size: 10px;\n font-weight: 500;\n margin-left: 6px;\n line-height: 1.4;\n }\n .tcc__pill svg { width: 10px; height: 10px; }\n .tcc__pill[data-status=\"running\"] svg { animation: tcc-spin 0.8s linear infinite; }\n @keyframes tcc-spin { to { transform: rotate(360deg); } }\n .tcc__section { padding: 8px 0; }\n .tcc__section + .tcc__section { border-top: 1px solid var(--ngaf-chat-separator); }\n .tcc__section-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--ngaf-chat-text-muted);\n margin: 0 0 4px;\n }\n .tcc__section-body {\n font-family: var(--ngaf-chat-font-mono);\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text);\n white-space: pre-wrap;\n overflow-x: auto;\n margin: 0;\n }\n `],\n template: `\n <chat-trace [state]=\"state()\" [defaultExpanded]=\"autoExpanded()\">\n <span traceLabel>\n <span class=\"tcc__name\">{{ toolCall().name }}</span>\n <span class=\"tcc__pill\" [attr.data-status]=\"status()\" [attr.aria-label]=\"ariaLabel()\">\n @switch (status()) {\n @case ('running') {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"M8 2 a6 6 0 0 1 6 6\" stroke-linecap=\"round\"/>\n </svg>\n }\n @case ('complete') {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m3 8 4 4 6-8\"/>\n </svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"M8 4v5\"/>\n <circle cx=\"8\" cy=\"12\" r=\"0.5\" fill=\"currentColor\"/>\n </svg>\n }\n }\n </span>\n </span>\n <div class=\"tcc__section\">\n <p class=\"tcc__section-label\">Inputs</p>\n <pre class=\"tcc__section-body\">{{ formatJson(toolCall().args) }}</pre>\n </div>\n @if (toolCall().result !== undefined) {\n <div class=\"tcc__section\">\n <p class=\"tcc__section-label\">Output</p>\n <pre class=\"tcc__section-body\">{{ formatJson(toolCall().result) }}</pre>\n </div>\n }\n </chat-trace>\n `,\n})\nexport class ChatToolCallCardComponent {\n readonly toolCall = input.required<ToolCallInfo>();\n readonly defaultCollapsed = input<boolean>(true);\n\n readonly status = computed<ToolCallStatus>(() => {\n const tc = this.toolCall();\n if (tc.status) return tc.status;\n return tc.result !== undefined ? 'complete' : 'running';\n });\n\n readonly state = computed<TraceState>(() => {\n switch (this.status()) {\n case 'complete': return 'done';\n case 'error': return 'error';\n case 'running': return 'running';\n default: return 'pending';\n }\n });\n\n readonly autoExpanded = computed<boolean>(() => {\n const s = this.status();\n if (s === 'running' || s === 'error') return true;\n return !this.defaultCollapsed();\n });\n\n readonly ariaLabel = computed<string>(() => {\n switch (this.status()) {\n case 'running': return 'Running';\n case 'complete': return 'Completed';\n case 'error': return 'Failed';\n default: return '';\n }\n });\n\n formatJson(value: unknown): string {\n if (typeof value === 'string') return value;\n try { return JSON.stringify(value, null, 2); } catch { return String(value); }\n }\n}\n","// libs/chat/src/lib/compositions/chat-subagent-card/chat-subagent-card.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { ChatTraceComponent, type TraceState } from '../../primitives/chat-trace/chat-trace.component';\nimport { ChatToolCallCardComponent, type ToolCallInfo } from '../chat-tool-call-card/chat-tool-call-card.component';\nimport { ChatStreamingMdComponent } from '../../streaming/streaming-markdown.component';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport type { Subagent, SubagentStatus } from '../../agent/subagent';\nimport type { Message, ToolCall } from '../../agent';\n\n/**\n * Returns a CSS style string for a subagent's status badge.\n * Kept exported for backward compatibility with existing consumers; the\n * preferred way to style status visually is via the `data-status` attribute\n * + CSS selectors (see component styles below).\n */\nexport function statusColor(status: SubagentStatus): string {\n switch (status) {\n case 'pending': return 'background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text-muted);';\n case 'running': return 'background: var(--ngaf-chat-warning-bg); color: var(--ngaf-chat-warning-text);';\n case 'complete': return 'color: var(--ngaf-chat-success);';\n case 'error': return 'background: var(--ngaf-chat-error-bg); color: var(--ngaf-chat-error-text);';\n }\n}\n\nfunction statusToTraceState(s: SubagentStatus): TraceState {\n switch (s) {\n case 'pending': return 'pending';\n case 'running': return 'running';\n case 'complete': return 'done';\n case 'error': return 'error';\n }\n}\n\n@Component({\n selector: 'chat-subagent-card',\n standalone: true,\n imports: [ChatTraceComponent, ChatToolCallCardComponent, ChatStreamingMdComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; }\n .sac__name { color: var(--ngaf-chat-text); font-weight: 500; font-size: var(--ngaf-chat-font-size-sm); }\n .sac__id { font-family: var(--ngaf-chat-font-mono); font-size: var(--ngaf-chat-font-size-xs); color: var(--ngaf-chat-text-muted); margin-left: 4px; }\n .sac__pill {\n padding: 1px 8px;\n border-radius: 9999px;\n font-size: 11px;\n font-weight: 500;\n margin-left: 4px;\n }\n .sac__pill[data-status=\"pending\"] { background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text-muted); }\n .sac__pill[data-status=\"running\"] { background: var(--ngaf-chat-warning-bg); color: var(--ngaf-chat-warning-text); }\n .sac__pill[data-status=\"complete\"] { color: var(--ngaf-chat-success); }\n .sac__pill[data-status=\"error\"] { background: var(--ngaf-chat-error-bg); color: var(--ngaf-chat-error-text); }\n .sac__count { font-size: var(--ngaf-chat-font-size-xs); color: var(--ngaf-chat-text-muted); }\n .sac__msg { padding: 6px 0; }\n .sac__msg + .sac__msg { border-top: 1px solid var(--ngaf-chat-separator); }\n .sac__reasoning {\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text-muted);\n font-style: italic;\n margin-bottom: 4px;\n }\n `],\n template: `\n <chat-trace [state]=\"state()\">\n <span traceLabel>\n <span class=\"sac__name\">{{ subagent().name ?? 'Subagent' }}</span>\n <span class=\"sac__id\">{{ subagent().toolCallId }}</span>\n <span class=\"sac__pill\" [attr.data-status]=\"subagent().status()\">{{ subagent().status() }}</span>\n </span>\n <div class=\"sac__count\" traceMeta>{{ subagent().messages().length }} message(s)</div>\n @for (m of subagent().messages(); track m.id) {\n <div class=\"sac__msg\" [attr.data-role]=\"m.role\">\n @if (m.reasoning) {\n <div class=\"sac__reasoning\">{{ m.reasoning }}</div>\n }\n @if (textOf(m); as t) {\n <chat-streaming-md [content]=\"t\" />\n }\n @for (tc of toolCallsFor(m); track tc.id) {\n <chat-tool-call-card [toolCall]=\"toToolCallInfo(tc)\" />\n }\n </div>\n }\n </chat-trace>\n `,\n})\nexport class ChatSubagentCardComponent {\n readonly subagent = input.required<Subagent>();\n readonly state = computed<TraceState>(() => statusToTraceState(this.subagent().status()));\n\n protected textOf(m: Message): string {\n const c = m.content;\n return typeof c === 'string' ? c : '';\n }\n\n protected toolCallsFor(m: Message): ToolCall[] {\n const ids = m.toolCallIds ?? [];\n if (ids.length === 0) return [];\n const all = this.subagent().toolCalls?.() ?? [];\n return ids.map((id) => all.find((tc) => tc.id === id)).filter((tc): tc is ToolCall => !!tc);\n }\n\n protected toToolCallInfo(tc: ToolCall): ToolCallInfo {\n return { id: tc.id, name: tc.name, args: tc.args, result: tc.result, status: tc.status };\n }\n}\n","// libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-call-template.directive.ts\n// SPDX-License-Identifier: MIT\nimport { Directive, TemplateRef, inject, input } from '@angular/core';\nimport type { ToolCall, ToolCallStatus } from '../../agent';\n\n/**\n * Template-context surface available to a per-tool template. The first\n * argument is the ToolCall itself (let-call); status is exposed as a\n * named context property (let-status=\"status\").\n */\nexport interface ChatToolCallTemplateContext {\n $implicit: ToolCall;\n status: ToolCallStatus;\n}\n\n/**\n * Registers a per-tool-name template inside <chat-tool-calls>. The\n * primitive collects all directive instances via contentChildren() and\n * dispatches incoming calls by their `name` field. A literal \"*\" name\n * registers a wildcard catch-all that handles any tool name without a\n * specific template registered.\n *\n * Usage:\n *\n * <chat-tool-calls [agent]=\"agent\" [message]=\"msg\">\n * <ng-template chatToolCallTemplate=\"search_web\" let-call let-status=\"status\">\n * <my-search-result-card [query]=\"call.args.query\" [status]=\"status\"/>\n * </ng-template>\n * <ng-template chatToolCallTemplate=\"*\" let-call>\n * <chat-tool-call-card [toolCall]=\"call\"/>\n * </ng-template>\n * </chat-tool-calls>\n */\n@Directive({\n selector: '[chatToolCallTemplate]',\n standalone: true,\n})\nexport class ChatToolCallTemplateDirective {\n /** The tool name this template handles, or \"*\" for the wildcard catch-all. */\n readonly name = input.required<string>({ alias: 'chatToolCallTemplate' });\n readonly templateRef = inject(TemplateRef<ChatToolCallTemplateContext>);\n}\n","// libs/chat/src/lib/primitives/chat-tool-calls/group-summary.ts\n// SPDX-License-Identifier: MIT\n\n/**\n * Default summary text for a group of N consecutive same-name tool calls.\n * Recognizes a small set of common tool-name prefixes; falls back to a\n * generic \"Called {name} N times\" otherwise.\n *\n * Consumers can override the registry per-instance via the\n * `[groupSummary]` input on <chat-tool-calls>.\n */\nexport function summarizeGroup(name: string, count: number): string {\n const noun = nounForPrefix(name);\n if (noun) return `${noun.verb} ${count} ${pluralize(noun.singular, count)}`;\n return `Called ${name} ${count} ${count === 1 ? 'time' : 'times'}`;\n}\n\ninterface NounEntry { verb: string; singular: string }\n\nfunction nounForPrefix(name: string): NounEntry | null {\n if (name.startsWith('search_')) return { verb: 'Searched', singular: 'site' };\n if (name.startsWith('generate_')) return { verb: 'Generated', singular: 'item' };\n if (name.startsWith('read_')) return { verb: 'Read', singular: 'file' };\n if (name.startsWith('write_')) return { verb: 'Wrote', singular: 'file' };\n if (name.startsWith('list_')) return { verb: 'Listed', singular: 'item' };\n return null;\n}\n\nfunction pluralize(word: string, count: number): string {\n return count === 1 ? word : `${word}s`;\n}\n","// SPDX-License-Identifier: MIT\nimport type { Agent, Message, ToolCall } from '../../agent';\n\n/**\n * Resolves the tool calls that belong to a specific message, mirroring the\n * per-message scoping the chat lib uses to avoid every assistant bubble\n * re-rendering the whole thread's tool-call list.\n *\n * - No message context → the agent's global tool-call list.\n * - Assistant message with `toolCallIds` (LangGraph) → those ids, in order.\n * - Assistant message with `tool_use` content blocks (Anthropic) → those ids.\n * - Assistant message with no linkage → [] (this message emitted no calls).\n * - Any non-assistant message → the global list (callers filter as needed).\n *\n * MUST be called inside a reactive context (computed/effect) so the\n * `agent.toolCalls()` signal read registers a dependency.\n */\nexport function resolveMessageToolCalls(agent: Agent, message: Message | undefined): ToolCall[] {\n const all = agent.toolCalls();\n if (message && message.role === 'assistant') {\n if (message.toolCallIds && message.toolCallIds.length > 0) {\n return message.toolCallIds\n .map((id) => all.find((tc) => tc.id === id))\n .filter((x): x is ToolCall => !!x);\n }\n if (Array.isArray(message.content)) {\n const blocks = message.content.filter((b) => b.type === 'tool_use');\n return blocks\n .map((b) => all.find((tc) => tc.id === b.id))\n .filter((x): x is ToolCall => !!x);\n }\n return [];\n }\n return all;\n}\n","// libs/chat/src/lib/primitives/chat-tool-calls/chat-tool-calls.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, ChangeDetectionStrategy,\n computed, contentChildren, input, signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent, Message, ToolCall, Subagent } from '../../agent';\nimport { ChatToolCallCardComponent, type ToolCallInfo } from '../../compositions/chat-tool-call-card/chat-tool-call-card.component';\nimport { ChatSubagentCardComponent } from '../../compositions/chat-subagent-card/chat-subagent-card.component';\nimport { ChatToolCallTemplateDirective } from './chat-tool-call-template.directive';\nimport { summarizeGroup as defaultSummarizeGroup } from './group-summary';\nimport { resolveMessageToolCalls } from './resolve-message-tool-calls';\n\ninterface Group {\n name: string;\n calls: ToolCall[];\n templateRef?: ChatToolCallTemplateDirective;\n /** Present when this group anchors a subagent spawned by its (single) task call. */\n subagent?: Subagent;\n}\n\n@Component({\n selector: 'chat-tool-calls',\n standalone: true,\n imports: [NgTemplateOutlet, ChatToolCallCardComponent, ChatSubagentCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n :host { display: block; margin-bottom: 20px; }\n .ctc__group {\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: var(--ngaf-chat-radius-card);\n margin: 0 0 4px;\n }\n .ctc__group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: 0;\n font: inherit;\n color: var(--ngaf-chat-text);\n cursor: pointer;\n text-align: left;\n }\n .ctc__group-chevron {\n width: 10px; height: 10px;\n transition: transform 120ms ease;\n }\n .ctc__group[data-expanded=\"true\"] .ctc__group-chevron { transform: rotate(90deg); }\n .ctc__group-body {\n padding: 0 12px 8px;\n border-top: 1px solid var(--ngaf-chat-separator);\n }\n `],\n template: `\n @for (group of groups(); track $index) {\n @if (group.subagent) {\n <chat-subagent-card [subagent]=\"group.subagent\" />\n } @else if (group.calls.length > 1 && !group.templateRef) {\n <!-- Default grouped strip -->\n @let expanded = expandedGroups().has($index);\n <div class=\"ctc__group\" [attr.data-group]=\"true\" [attr.data-expanded]=\"expanded\">\n <button type=\"button\" class=\"ctc__group-header\" (click)=\"toggleGroup($index)\">\n <svg class=\"ctc__group-chevron\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 2l4 4-4 4\"/>\n </svg>\n <span>{{ summarize(group.name, group.calls.length) }}</span>\n </button>\n @if (expanded) {\n <div class=\"ctc__group-body\">\n @for (tc of group.calls; track tc.id) {\n <chat-tool-call-card [toolCall]=\"toToolCallInfo(tc)\" />\n }\n </div>\n }\n </div>\n } @else if (group.templateRef) {\n @for (tc of group.calls; track tc.id) {\n <ng-container\n [ngTemplateOutlet]=\"group.templateRef.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: tc, status: tc.status }\"\n />\n }\n } @else {\n @for (tc of group.calls; track tc.id) {\n <chat-tool-call-card [toolCall]=\"toToolCallInfo(tc)\" />\n }\n }\n }\n `,\n})\nexport class ChatToolCallsComponent {\n readonly agent = input.required<Agent>();\n readonly message = input<Message | undefined>(undefined);\n readonly grouping = input<'auto' | 'none'>('auto');\n readonly groupSummary = input<((name: string, count: number) => string) | undefined>(undefined);\n\n /**\n * Tool names whose groups should be hidden. Used by chat compositions\n * to filter out internal/orchestration tools (e.g. GenUI dispatchers)\n * whose args streaming is not meaningful to surface in the chat.\n * Default empty — preserves prior behavior for non-filtering consumers.\n */\n readonly excludeToolNames = input<readonly string[]>([]);\n\n /** Per-tool-name + wildcard templates registered as content children. */\n readonly templates = contentChildren(ChatToolCallTemplateDirective);\n\n private readonly templateRegistry = computed(() => {\n const map = new Map<string, ChatToolCallTemplateDirective>();\n for (const t of this.templates()) {\n map.set(t.name(), t);\n }\n return map;\n });\n\n readonly toolCalls = computed((): ToolCall[] =>\n resolveMessageToolCalls(this.agent(), this.message()),\n );\n\n readonly groups = computed((): Group[] => {\n const excludeSet = new Set(this.excludeToolNames());\n const calls = this.toolCalls().filter(tc => !excludeSet.has(tc.name));\n const subs = this.agent().subagents?.() ?? new Map<string, Subagent>();\n const groupingMode = this.grouping();\n const registry = this.templateRegistry();\n const wildcard = registry.get('*');\n const out: Group[] = [];\n for (const tc of calls) {\n // A tool call that spawned a subagent renders as a standalone subagent\n // card anchored to that call. It never groups with adjacent calls, on\n // either side: it is its own group and carries a `subagent`, so the next\n // call can't append to it (a subagent group is never a group target).\n if (subs.has(tc.id)) {\n out.push({ name: tc.name, calls: [tc], subagent: subs.get(tc.id) });\n continue;\n }\n const tpl = registry.get(tc.name) ?? wildcard;\n const last = out[out.length - 1];\n const sameName = last && !last.subagent && last.name === tc.name;\n const canGroup = groupingMode === 'auto' && sameName;\n if (canGroup) {\n last.calls.push(tc);\n if (!last.templateRef && tpl) last.templateRef = tpl;\n } else {\n out.push({ name: tc.name, calls: [tc], templateRef: tpl });\n }\n }\n return out;\n });\n\n private readonly _expandedGroups = signal(new Set<number>());\n readonly expandedGroups = this._expandedGroups.asReadonly();\n\n toggleGroup(index: number): void {\n this._expandedGroups.update((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index); else next.add(index);\n return next;\n });\n }\n\n protected summarize(name: string, count: number): string {\n return (this.groupSummary() ?? defaultSummarizeGroup)(name, count);\n }\n\n protected toToolCallInfo(tc: ToolCall): ToolCallInfo {\n return { id: tc.id, name: tc.name, args: tc.args, result: tc.result, status: tc.status };\n }\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_GENERATIVE_UI_STYLES = `\n :host {\n display: block;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size);\n line-height: var(--ngaf-chat-line-height);\n }\n .chat-generative-ui__error {\n color: var(--ngaf-chat-error-text);\n background: var(--ngaf-chat-error-bg);\n border: 1px solid var(--ngaf-chat-error-border);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 8px 12px;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n`;\n","// SPDX-License-Identifier: MIT\nimport type { Spec, UIElement } from '@json-render/core';\n\n/**\n * The json-render schema prompt shipped with the example backends documents\n * state-bound props as `{ statePath: \"/path\" }` (the A2UI binding dialect —\n * see `examples/<example>/python/src/schemas/json_render.py`). The\n * @json-render/core\n * prop resolver only understands `$state`/`$bindState` expressions, so a raw\n * `{ statePath }` object would fall through to the view component unresolved\n * and interpolate as the literal string \"[object Object]\".\n *\n * `normalizeJsonRenderSpec` rewrites each top-level `{ statePath: p }` prop\n * to the engine-native `{ $bindState: p }` AND records it in the element's\n * `_bindings` map (prop name → path) so the a2ui catalog components can\n * write user input back to the state store — mirroring exactly what\n * `surfaceToSpec` does for A2UI path refs.\n */\ninterface StatePathRef {\n statePath: string;\n}\n\nfunction isStatePathRef(value: unknown): value is StatePathRef {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n typeof (value as Record<string, unknown>)['statePath'] === 'string' &&\n Object.keys(value).length === 1\n );\n}\n\n/** Rewrites schema-documented `{ statePath }` prop refs to `$bindState` +\n * `_bindings`. Returns the input reference unchanged when no rewriting is\n * needed (keeps downstream memoization intact). */\nexport function normalizeJsonRenderSpec(spec: Spec): Spec {\n const sourceElements = (spec.elements ?? {}) as Record<string, UIElement>;\n let specChanged = false;\n const elements: Record<string, UIElement> = {};\n\n for (const [id, el] of Object.entries(sourceElements)) {\n const rawProps = el?.props as Record<string, unknown> | undefined;\n if (!rawProps) {\n elements[id] = el;\n continue;\n }\n\n let elementChanged = false;\n const props: Record<string, unknown> = {};\n const bindings: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(rawProps)) {\n if (isStatePathRef(value)) {\n props[key] = { $bindState: value.statePath };\n bindings[key] = value.statePath;\n elementChanged = true;\n } else {\n props[key] = value;\n }\n }\n\n if (elementChanged) {\n // Merge with any model-emitted `_bindings` (never observed, but cheap\n // to preserve) — rewritten paths win.\n const existing = (rawProps['_bindings'] ?? {}) as Record<string, string>;\n props['_bindings'] = { ...existing, ...bindings };\n elements[id] = { ...el, props } as UIElement;\n specChanged = true;\n } else {\n elements[id] = el;\n }\n }\n\n return specChanged ? ({ ...spec, elements } as Spec) : spec;\n}\n","// libs/chat/src/lib/primitives/chat-generative-ui/chat-generative-ui.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n effect,\n input,\n output,\n untracked,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { Spec, StateStore } from '@json-render/core';\nimport type { AngularRegistry, RenderEvent } from '@threadplane/render';\nimport { RenderSpecComponent } from '@threadplane/render';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_GENERATIVE_UI_STYLES } from '../../styles/chat-generative-ui.styles';\nimport { normalizeJsonRenderSpec } from './normalize-json-render-spec';\n\n@Component({\n selector: 'chat-generative-ui',\n standalone: true,\n imports: [RenderSpecComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_GENERATIVE_UI_STYLES],\n template: `\n @if (normalizedSpec()) {\n <render-spec\n [spec]=\"normalizedSpec()\"\n [registry]=\"registry()\"\n [store]=\"store()\"\n [handlers]=\"handlers()\"\n [loading]=\"loading()\"\n (events)=\"events.emit($event)\"\n />\n }\n `,\n})\nexport class ChatGenerativeUiComponent {\n readonly spec = input<Spec | null>(null);\n readonly registry = input<AngularRegistry | undefined>(undefined);\n readonly store = input<StateStore | undefined>(undefined);\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>> | undefined>(undefined);\n readonly loading = input<boolean>(false);\n readonly events = output<RenderEvent>();\n\n /** The bound spec with schema-documented `{ statePath }` prop refs\n * rewritten to engine-native `{ $bindState }` + `_bindings` so values\n * resolve against the state store instead of interpolating as\n * \"[object Object]\" (F4). */\n protected readonly normalizedSpec = computed(() => {\n const s = this.spec();\n return s ? normalizeJsonRenderSpec(s) : null;\n });\n\n /** Last value this component seeded per state path. Lets the seeding\n * effect distinguish \"still the value we wrote (possibly a partial\n * chunk from streaming — safe to overwrite with the newer one)\" from\n * \"user edited it via a bound control — leave it alone\". */\n private readonly seeded = new Map<string, unknown>();\n\n constructor() {\n // Seed `spec.state` (the schema's \"initial state model\") into an\n // EXPLICIT consumer-provided store, which is typically EMPTY at first —\n // without this, statePath/$bindState props would resolve to undefined.\n // A consumer-provided store intentionally has shared/live semantics\n // across surfaces: every surface bound to it reads (and writes) the same\n // state, so the first surface to seed a path wins. When NO store input\n // is given, this effect is a no-op and render-spec self-seeds its own\n // per-instance internal store from spec.state, keeping surfaces with\n // overlapping state keys isolated from each other (a2ui parity).\n effect(() => {\n const s = this.spec();\n const store = this.store();\n const state = s?.state as Record<string, unknown> | undefined;\n if (!state || !store) return;\n // Untracked: store reads/writes must not become dependencies — the\n // effect re-runs on spec/store-identity changes only, not on every\n // write to the (possibly shared) store.\n untracked(() => {\n for (const [key, value] of Object.entries(state)) {\n const path = key.startsWith('/') ? key : `/${key}`;\n const current = store.get(path);\n const untouched =\n current === undefined ||\n (this.seeded.has(path) && current === this.seeded.get(path));\n if (untouched) {\n if (current !== value) store.set(path, value);\n this.seeded.set(path, value);\n }\n }\n });\n });\n }\n}\n","// libs/chat/src/lib/primitives/chat-tool-views/chat-tool-views.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport type { Spec, StateStore } from '@json-render/core';\nimport type { RenderEvent, ViewRegistry } from '@threadplane/render';\nimport { toRenderRegistry } from '@threadplane/render';\nimport type { Agent, Message, ToolCall } from '../../agent';\nimport { resolveMessageToolCalls } from '../chat-tool-calls/resolve-message-tool-calls';\nimport { ChatGenerativeUiComponent } from '../chat-generative-ui/chat-generative-ui.component';\n\n/**\n * Renders a frontend component for a tool call by reusing the chat\n * composition's `views` registry. A tool call whose `name` matches a\n * registry key is bridged into a synthetic one-element render spec\n * (`{ root: name, elements: { [name]: { type: name, props } } }`) and\n * rendered through the existing render-spec pipeline.\n *\n * Props merge the live `args` (present while the call streams) with the\n * `result` (on completion) and always include `status`, so a view\n * component can show its own loading/empty/error states. `RenderElement`\n * filters props down to the component's declared inputs, so extra keys\n * (and a `status` a component chooses not to declare) are harmless.\n */\n@Component({\n selector: 'chat-tool-views',\n standalone: true,\n imports: [ChatGenerativeUiComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (view of toolViews(); track view.id) {\n <chat-generative-ui\n [spec]=\"view.spec\"\n [registry]=\"registry()\"\n [store]=\"store()\"\n [handlers]=\"handlers()\"\n [loading]=\"view.loading\"\n (events)=\"events.emit($event)\"\n />\n }\n `,\n})\nexport class ChatToolViewsComponent {\n readonly agent = input.required<Agent>();\n readonly events = output<RenderEvent>();\n readonly message = input<Message | undefined>(undefined);\n readonly views = input<ViewRegistry | undefined>(undefined);\n readonly store = input<StateStore | undefined>(undefined);\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>({});\n\n readonly registry = computed(() => {\n const v = this.views();\n return v ? toRenderRegistry(v) : undefined;\n });\n\n readonly toolViews = computed(() => {\n const v = this.views();\n if (!v) return [];\n const names = new Set(Object.keys(v));\n return resolveMessageToolCalls(this.agent(), this.message())\n .filter((tc) => names.has(tc.name))\n .map((tc) => ({ id: tc.id, loading: tc.status === 'running', spec: toToolViewSpec(tc) }));\n });\n}\n\n/** Wraps a tool call into a synthetic single-element render spec. */\nfunction toToolViewSpec(tc: ToolCall): Spec {\n const args = isRecord(tc.args) ? tc.args : {};\n const result = isRecord(tc.result) ? tc.result : {};\n return {\n root: tc.name,\n elements: {\n [tc.name]: {\n type: tc.name,\n props: { ...args, ...result, status: tc.status },\n },\n },\n };\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// libs/chat/src/lib/primitives/chat-subagents/chat-subagents.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent } from '../../agent';\nimport type { Subagent } from '../../agent/subagent';\nimport { ChatSubagentCardComponent } from '../../compositions/chat-subagent-card/chat-subagent-card.component';\n\nexport function activeSubagentsFromAgent(agent: Agent): Subagent[] {\n const map = agent.subagents?.();\n if (!map) return [];\n const out: Subagent[] = [];\n map.forEach((sa) => {\n const s = sa.status();\n if (s !== 'complete' && s !== 'error') out.push(sa);\n });\n return out;\n}\n\n@Component({\n selector: 'chat-subagents',\n standalone: true,\n imports: [NgTemplateOutlet, ChatSubagentCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (subagent of activeSubagents(); track subagent.toolCallId) {\n @if (templateRef()) {\n <ng-container [ngTemplateOutlet]=\"templateRef()!\" [ngTemplateOutletContext]=\"{ $implicit: subagent }\" />\n } @else {\n <chat-subagent-card [subagent]=\"subagent\" />\n }\n }\n `,\n})\nexport class ChatSubagentsComponent {\n readonly agent = input.required<Agent>();\n readonly templateRef = contentChild(TemplateRef);\n readonly activeSubagents = computed(() => activeSubagentsFromAgent(this.agent()));\n}\n","// SPDX-License-Identifier: MIT\nexport const CHAT_THREAD_LIST_STYLES = `\n :host { display: block; padding: var(--ngaf-chat-space-2); }\n .chat-thread-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 2px; }\n .chat-thread-list__item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: var(--ngaf-chat-radius-button);\n cursor: pointer;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size-sm);\n background: transparent;\n border: 0;\n text-align: left;\n width: 100%;\n box-sizing: border-box;\n transition: background-color 150ms ease;\n }\n .chat-thread-list__item:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 5%, transparent); }\n .chat-thread-list__item[data-active=\"true\"] {\n background: var(--ngaf-chat-surface-alt);\n font-weight: 500;\n }\n .chat-thread-list__item-title {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n }\n .chat-thread-list__item-time {\n font-size: 11px;\n color: var(--ngaf-chat-text-muted);\n display: block;\n }\n .chat-thread-list__new {\n display: block;\n width: 100%;\n height: 36px;\n margin-bottom: var(--ngaf-chat-space-2);\n border: 1px dashed var(--ngaf-chat-separator);\n border-radius: var(--ngaf-chat-radius-button);\n background: transparent;\n color: var(--ngaf-chat-primary);\n cursor: pointer;\n font-size: var(--ngaf-chat-font-size-sm);\n box-sizing: border-box;\n transition: background 150ms ease;\n }\n .chat-thread-list__new:hover { background: var(--ngaf-chat-surface-alt); }\n .chat-thread-list__item-wrap {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .chat-thread-list__item-wrap .chat-thread-list__item {\n flex: 1 1 auto;\n min-width: 0;\n }\n .chat-thread-list__kebab {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n transition: opacity 100ms ease;\n padding: 0;\n line-height: 1;\n font-size: 18px;\n }\n .chat-thread-list__item-wrap:hover .chat-thread-list__kebab,\n .chat-thread-list__item-wrap:focus-within .chat-thread-list__kebab {\n opacity: 1;\n }\n .chat-thread-list__kebab:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-thread-list__kebab:focus-visible {\n opacity: 1;\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-thread-list__initial {\n display: none;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n align-items: center;\n justify-content: center;\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n font-weight: 500;\n font-size: 13px;\n flex-shrink: 0;\n }\n .chat-thread-list__item-pin {\n width: 11px;\n height: 11px;\n margin-right: 4px;\n color: var(--ngaf-chat-text-muted);\n vertical-align: -1px;\n display: inline-block;\n }\n .chat-thread-list__edit {\n flex: 1 1 auto;\n border: 1px solid var(--ngaf-chat-primary);\n border-radius: var(--ngaf-chat-radius-button);\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n padding: 6px 10px;\n min-height: 36px;\n outline: none;\n box-sizing: border-box;\n }\n .chat-thread-list__pin-slot {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 13px;\n height: 13px;\n margin-right: 4px;\n flex-shrink: 0;\n vertical-align: -1px;\n }\n .chat-thread-list__pin-slot .chat-thread-list__item-pin {\n position: absolute;\n inset: 0;\n width: 13px;\n height: 13px;\n opacity: 1;\n transition: opacity 100ms ease;\n }\n .chat-thread-list__pin-slot .chat-thread-list__grip {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--ngaf-chat-text-muted);\n font-size: 11px;\n line-height: 1;\n letter-spacing: -1px;\n opacity: 0;\n transition: opacity 100ms ease;\n user-select: none;\n pointer-events: none;\n }\n .chat-thread-list__item-wrap:hover .chat-thread-list__pin-slot .chat-thread-list__item-pin,\n .chat-thread-list__item-wrap:focus-within .chat-thread-list__pin-slot .chat-thread-list__item-pin {\n opacity: 0;\n }\n .chat-thread-list__item-wrap:hover .chat-thread-list__pin-slot .chat-thread-list__grip,\n .chat-thread-list__item-wrap:focus-within .chat-thread-list__pin-slot .chat-thread-list__grip {\n opacity: 1;\n }\n .chat-thread-list__item-wrap[draggable=\"true\"] { cursor: grab; }\n .chat-thread-list__item-wrap[draggable=\"true\"]:active { cursor: grabbing; }\n\n .chat-thread-list__item-wrap[data-dragging=\"true\"] {\n opacity: 0.4;\n }\n\n .chat-thread-list__item-wrap[data-drop-position=\"before\"]::before,\n .chat-thread-list__item-wrap[data-drop-position=\"after\"]::after {\n content: '';\n position: absolute;\n left: 4px;\n right: 4px;\n height: 2px;\n background: var(--ngaf-chat-primary);\n border-radius: 1px;\n pointer-events: none;\n }\n .chat-thread-list__item-wrap[data-drop-position=\"before\"]::before { top: -1px; }\n .chat-thread-list__item-wrap[data-drop-position=\"after\"]::after { bottom: -1px; }\n`;\n","// libs/chat/src/lib/primitives/chat-thread-list/chat-thread-list.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n computed,\n contentChild,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_THREAD_LIST_STYLES } from '../../styles/chat-thread-list.styles';\nimport {\n ChatOverflowMenuComponent,\n type OverflowMenuItem,\n} from '../chat-overflow-menu/chat-overflow-menu.component';\nimport { ChatConfirmDialogComponent } from '../chat-confirm-dialog/chat-confirm-dialog.component';\nimport type { Project } from '../chat-project-list/chat-project-list.component';\n\nexport type Thread = {\n id: string;\n /** Optional human-friendly label. Falls back to a slice of the id. */\n title?: string;\n /** Optional epoch-ms timestamp used by the default item template to\n * render a relative-time line (\"just now\" / \"5 min ago\"). When absent\n * the default template omits the second line. */\n updatedAt?: number;\n /** Optional lifecycle status. Undefined treated as 'active'. The framework\n * does NOT auto-filter by this field — consumers pre-filter into separate\n * `threads` and `archivedThreads` inputs on chat-sidenav. The field is\n * typed documentation of intent. */\n status?: 'active' | 'archived';\n /** Optional flag indicating the thread is pinned (sticky-top). The framework\n * renders a pin icon when true but does NOT sort — the consumer pre-sorts\n * pinned threads to the top of the `threads` input. */\n pinned?: boolean;\n /** Optional project association. Consumers pre-filter threads by project\n * before passing to the sidenav. Null/undefined means no project. */\n projectId?: string | null;\n [key: string]: unknown;\n};\n\n/**\n * Per-thread row-action adapter. Consumer-provided. The framework calls\n * these methods after user confirmation (delete) or commit (rename) and\n * manages optimistic UI + rollback on rejection.\n *\n * Consumers MUST refresh their `threads` signal on success — the framework\n * clears optimistic overrides in a `finally` block, so a successful adapter\n * call that leaves the input list unchanged would re-render the row.\n */\nexport interface ThreadActionAdapter {\n delete?(threadId: string): Promise<void>;\n rename?(threadId: string, newTitle: string): Promise<void>;\n /** Archive a thread (reversible). No confirmation dialog — framework calls\n * this immediately on click. */\n archive?(threadId: string): Promise<void>;\n /** Restore an archived thread to the active list. */\n unarchive?(threadId: string): Promise<void>;\n /** Mark the thread as pinned. */\n pin?(threadId: string): Promise<void>;\n /** Unpin a previously pinned thread. */\n unpin?(threadId: string): Promise<void>;\n /** Move thread to a project (or pass null to remove from any project).\n * Optimistically hides the row from the current project's visible list;\n * consumer is expected to refresh the threads input. */\n moveToProject?(threadId: string, projectId: string | null): Promise<void>;\n /** Reorder a pinned thread. `beforeId` is the id of the pinned thread it\n * should be placed before, or null to move to the end of the pinned list.\n * Framework optimistically reorders the visible list and awaits this\n * method; rejection rolls back. */\n reorderPinned?(threadId: string, beforeId: string | null): Promise<void>;\n}\n\n@Component({\n selector: 'chat-thread-list',\n standalone: true,\n imports: [NgTemplateOutlet, ChatOverflowMenuComponent, ChatConfirmDialogComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_THREAD_LIST_STYLES],\n template: `\n @if (showNewThreadButton()) {\n <button type=\"button\" class=\"chat-thread-list__new\" (click)=\"newThreadRequested.emit()\">+ New thread</button>\n }\n <ul class=\"chat-thread-list\">\n @for (thread of visibleThreads(); track thread.id) {\n <li\n class=\"chat-thread-list__item-wrap\"\n [attr.draggable]=\"thread.pinned && actions()?.reorderPinned ? 'true' : null\"\n [attr.data-dragging]=\"draggingThreadId() === thread.id ? 'true' : null\"\n [attr.data-drop-position]=\"dropPositionFor(thread.id)\"\n (dragstart)=\"onDragStart($event, thread.id)\"\n (dragover)=\"onDragOver($event, thread.id)\"\n (dragleave)=\"onDragLeave($event, thread.id)\"\n (drop)=\"onDrop($event, thread.id)\"\n (dragend)=\"onDragEnd()\"\n (contextmenu)=\"onRowContextMenu(thread.id, $event)\"\n >\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"{ $implicit: thread, isActive: thread.id === activeThreadId() }\"\n />\n } @else if (editingThreadId() === thread.id) {\n <input\n #editInput\n class=\"chat-thread-list__edit\"\n type=\"text\"\n [value]=\"editingValue()\"\n (input)=\"onEditInput($event)\"\n (keydown.enter)=\"commitRename(thread.id)\"\n (keydown.escape)=\"cancelRename()\"\n (blur)=\"cancelRename()\"\n aria-label=\"Rename conversation\"\n />\n } @else {\n <button\n type=\"button\"\n class=\"chat-thread-list__item\"\n [attr.title]=\"threadLabel(thread)\"\n [attr.data-active]=\"thread.id === activeThreadId() ? 'true' : null\"\n [attr.aria-current]=\"thread.id === activeThreadId() ? 'true' : null\"\n (click)=\"selectThread(thread.id)\"\n >\n <span class=\"chat-thread-list__initial\" aria-hidden=\"true\">{{ initialOf(threadLabel(thread)) }}</span>\n <span class=\"chat-thread-list__item-title\">\n @if (thread.pinned) {\n <span class=\"chat-thread-list__pin-slot\" aria-hidden=\"true\">\n <svg class=\"chat-thread-list__item-pin\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/>\n </svg>\n @if (actions()?.reorderPinned) {\n <span class=\"chat-thread-list__grip\">⋮⋮</span>\n }\n </span>\n }\n {{ threadLabel(thread) }}\n </span>\n @if (thread.updatedAt !== undefined) {\n <span class=\"chat-thread-list__item-time\">{{ relativeTime(thread.updatedAt) }}</span>\n }\n </button>\n\n @if (showKebab()) {\n <button\n #kebab\n type=\"button\"\n class=\"chat-thread-list__kebab\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"menuOpenForId() === thread.id ? 'true' : 'false'\"\n (click)=\"openMenu(thread.id, kebab)\"\n >⋯</button>\n }\n }\n </li>\n }\n </ul>\n\n <chat-overflow-menu\n [open]=\"menuOpenForId() !== null\"\n [items]=\"currentMenuItems()\"\n [anchor]=\"menuAnchor()\"\n [anchorPos]=\"menuAnchorPos()\"\n (itemSelected)=\"onMenuAction($event)\"\n (closed)=\"menuOpenForId.set(null)\"\n />\n\n <chat-overflow-menu\n [open]=\"moveMenuOpenForId() !== null\"\n [items]=\"moveMenuItems()\"\n [anchor]=\"menuAnchor()\"\n [anchorPos]=\"menuAnchorPos()\"\n (itemSelected)=\"onMoveMenuAction($event)\"\n (closed)=\"moveMenuOpenForId.set(null)\"\n />\n\n <chat-confirm-dialog\n [open]=\"confirmDeleteId() !== null\"\n title=\"Delete conversation?\"\n body=\"This conversation will be permanently deleted.\"\n confirmLabel=\"Delete\"\n tone=\"destructive\"\n (confirmed)=\"performDelete()\"\n (cancelled)=\"confirmDeleteId.set(null)\"\n />\n `,\n})\nexport class ChatThreadListComponent {\n readonly threads = input.required<Thread[]>();\n readonly activeThreadId = input<string>('');\n readonly showNewThreadButton = input<boolean>(false);\n readonly actions = input<ThreadActionAdapter | null>(null);\n readonly mode = input<'active' | 'archived'>('active');\n readonly projects = input<Project[] | null>(null);\n\n readonly threadSelected = output<string>();\n readonly newThreadRequested = output<void>();\n\n readonly templateRef = contentChild(TemplateRef);\n\n protected readonly editingThreadId = signal<string | null>(null);\n protected readonly editingValue = signal<string>('');\n protected readonly menuOpenForId = signal<string | null>(null);\n protected readonly menuAnchor = signal<HTMLElement | null>(null);\n /** Cursor-anchored position when the menu was opened via right-click.\n * Mutually exclusive with `menuAnchor` — set one, null the other. */\n protected readonly menuAnchorPos = signal<{ x: number; y: number } | null>(null);\n protected readonly confirmDeleteId = signal<string | null>(null);\n\n protected readonly moveMenuOpenForId = signal<string | null>(null);\n\n protected readonly moveMenuItems = computed<OverflowMenuItem[]>(() => {\n if (!this.moveMenuOpenForId()) return [];\n const list: OverflowMenuItem[] = [{ id: '__none__', label: 'No project' }];\n for (const p of this.projects() ?? []) {\n list.push({ id: p.id, label: p.name });\n }\n return list;\n });\n\n /** Ids hidden from the rendered list during pending delete, archive, or\n * unarchive. The framework doesn't distinguish — all three actions hide\n * the row from the current list until the adapter promise settles. */\n private readonly pendingHidden = signal<ReadonlySet<string>>(new Set());\n private readonly pendingRenames = signal<ReadonlyMap<string, string>>(new Map());\n\n /** Pending reorder overrides for pinned threads. Each entry: \"move this id\n * to before that id (or to end if null)\". Cleared in `finally` after the\n * adapter call settles. */\n private readonly pendingOrder = signal<ReadonlyMap<string, string | null>>(new Map());\n\n /** Id of the thread currently being dragged via HTML5 drag-and-drop. */\n protected readonly draggingThreadId = signal<string | null>(null);\n\n /** Drop target during a drag: which row, and whether the indicator shows\n * on the top edge ('before') or bottom edge ('after'). */\n protected readonly dropTarget = signal<{ threadId: string; position: 'before' | 'after' } | null>(null);\n\n protected readonly visibleThreads = computed<Thread[]>(() => {\n const hidden = this.pendingHidden();\n const renames = this.pendingRenames();\n const pending = this.pendingOrder();\n\n let result = this.threads()\n .filter((t) => !hidden.has(t.id))\n .map((t) => (renames.has(t.id) ? ({ ...t, title: renames.get(t.id) }) : t));\n\n if (pending.size > 0) {\n const pinned = result.filter((t) => t.pinned === true);\n const unpinned = result.filter((t) => t.pinned !== true);\n for (const [threadId, beforeId] of pending) {\n const idx = pinned.findIndex((t) => t.id === threadId);\n if (idx < 0) continue;\n const [moved] = pinned.splice(idx, 1);\n if (beforeId === null) {\n pinned.push(moved);\n } else {\n const beforeIdx = pinned.findIndex((t) => t.id === beforeId);\n if (beforeIdx < 0) pinned.push(moved);\n else pinned.splice(beforeIdx, 0, moved);\n }\n }\n result = [...pinned, ...unpinned];\n }\n return result;\n });\n\n protected readonly currentMenuItems = computed<OverflowMenuItem[]>(() => {\n const id = this.menuOpenForId();\n if (!id) return [];\n const a = this.actions();\n if (!a) return [];\n const items: OverflowMenuItem[] = [];\n if (this.mode() === 'active') {\n const thread = this.threads().find((t) => t.id === id);\n const isPinned = thread?.pinned === true;\n if (a.rename) items.push({ id: 'rename', label: 'Rename' });\n if (a.pin && !isPinned) items.push({ id: 'pin', label: 'Pin' });\n if (a.unpin && isPinned) items.push({ id: 'unpin', label: 'Unpin' });\n\n if (isPinned && a.reorderPinned) {\n const pinned = this.threads().filter((t) => t.pinned === true);\n const pinnedIdx = pinned.findIndex((t) => t.id === id);\n if (pinnedIdx > 0) items.push({ id: 'move-up', label: 'Move up' });\n if (pinnedIdx >= 0 && pinnedIdx < pinned.length - 1) items.push({ id: 'move-down', label: 'Move down' });\n }\n\n if (a.moveToProject && this.projects() !== null) {\n items.push({ id: 'move', label: 'Move to project' });\n }\n if (a.archive) items.push({ id: 'archive', label: 'Archive' });\n if (a.delete) items.push({ id: 'delete', label: 'Delete', tone: 'destructive' });\n } else {\n if (a.unarchive) items.push({ id: 'unarchive', label: 'Unarchive' });\n if (a.delete) items.push({ id: 'delete', label: 'Delete', tone: 'destructive' });\n }\n return items;\n });\n\n private readonly editInput = viewChild<ElementRef<HTMLInputElement>>('editInput');\n\n selectThread(threadId: string): void {\n this.threadSelected.emit(threadId);\n }\n\n protected threadLabel(thread: Thread): string {\n const title = thread['title'];\n if (typeof title === 'string' && title.length > 0) return title;\n return thread.id;\n }\n\n protected relativeTime(epochMs: number): string {\n const delta = Date.now() - epochMs;\n if (delta < 60_000) return 'just now';\n if (delta < 3_600_000) return `${Math.floor(delta / 60_000)} min ago`;\n if (delta < 86_400_000) return `${Math.floor(delta / 3_600_000)} hr ago`;\n return `${Math.floor(delta / 86_400_000)} day ago`;\n }\n\n protected showKebab(): boolean {\n const a = this.actions();\n if (!a) return false;\n if (this.mode() === 'active') {\n return Boolean(\n a.rename || a.pin || a.unpin || a.archive || a.delete ||\n a.reorderPinned ||\n (a.moveToProject && this.projects() !== null)\n );\n }\n return Boolean(a.unarchive || a.delete);\n }\n\n protected openMenu(threadId: string, anchor: HTMLElement): void {\n this.menuAnchor.set(anchor);\n this.menuAnchorPos.set(null);\n this.menuOpenForId.set(threadId);\n }\n\n /** Right-click on a row opens the same overflow menu anchored at the\n * cursor. Always prevents the native context menu — including when the\n * adapter exposes no row actions (in which case we open nothing rather\n * than confusing the user with the OS menu on what looks like a custom\n * list). */\n protected onRowContextMenu(threadId: string, event: MouseEvent): void {\n event.preventDefault();\n if (!this.showKebab()) return;\n if (this.editingThreadId() !== null) return;\n this.menuAnchor.set(null);\n this.menuAnchorPos.set({ x: event.clientX, y: event.clientY });\n this.menuOpenForId.set(threadId);\n }\n\n /** First grapheme of a title rendered as an uppercase initial for the\n * collapsed sidenav. Falls back to \"?\" for empty/whitespace titles. */\n protected initialOf(title: string): string {\n const trimmed = (title ?? '').trim();\n if (!trimmed) return '?';\n const first = Array.from(trimmed)[0];\n return first.toUpperCase ? first.toUpperCase() : first;\n }\n\n protected onMenuAction(id: string): void {\n const threadId = this.menuOpenForId();\n this.menuOpenForId.set(null);\n if (!threadId) return;\n\n if (id === 'rename') {\n const t = this.threads().find((x) => x.id === threadId);\n this.editingValue.set(typeof t?.title === 'string' ? t.title : '');\n this.editingThreadId.set(threadId);\n queueMicrotask(() => this.editInput()?.nativeElement.focus());\n } else if (id === 'delete') {\n this.confirmDeleteId.set(threadId);\n } else if (id === 'archive') {\n void this.performArchive(threadId);\n } else if (id === 'unarchive') {\n void this.performUnarchive(threadId);\n } else if (id === 'pin') {\n void this.performPin(threadId);\n } else if (id === 'unpin') {\n void this.performUnpin(threadId);\n } else if (id === 'move') {\n this.moveMenuOpenForId.set(threadId);\n } else if (id === 'move-up') {\n void this.performMoveUp(threadId);\n } else if (id === 'move-down') {\n void this.performMoveDown(threadId);\n }\n }\n\n protected async performPin(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.pin) return;\n try { await a.pin(threadId); } catch { /* visual state remains until next successful refresh */ }\n }\n\n protected async performUnpin(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.unpin) return;\n try { await a.unpin(threadId); } catch { /* visual state remains until next successful refresh */ }\n }\n\n protected onEditInput(e: Event): void {\n this.editingValue.set((e.target as HTMLInputElement).value);\n }\n\n protected cancelRename(): void {\n this.editingThreadId.set(null);\n }\n\n protected async commitRename(threadId: string): Promise<void> {\n const newTitle = this.editingValue().trim();\n this.editingThreadId.set(null);\n if (!newTitle) return;\n const a = this.actions();\n if (!a?.rename) return;\n\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.set(threadId, newTitle);\n return n;\n });\n try {\n await a.rename(threadId, newTitle);\n } catch {\n // Rollback happens via the finally clear below.\n } finally {\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performDelete(): Promise<void> {\n const threadId = this.confirmDeleteId();\n this.confirmDeleteId.set(null);\n if (!threadId) return;\n const a = this.actions();\n if (!a?.delete) return;\n\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.delete(threadId);\n } catch {\n // Rollback: clear override below so the row reappears.\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performArchive(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.archive) return;\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.archive(threadId);\n } catch {\n // Rollback: clear override below so the row reappears.\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected onMoveMenuAction(itemId: string): void {\n const threadId = this.moveMenuOpenForId();\n this.moveMenuOpenForId.set(null);\n if (!threadId) return;\n const projectId = itemId === '__none__' ? null : itemId;\n void this.performMoveToProject(threadId, projectId);\n }\n\n protected async performMoveToProject(threadId: string, projectId: string | null): Promise<void> {\n const a = this.actions();\n if (!a?.moveToProject) return;\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.moveToProject(threadId, projectId);\n } catch {\n /* rollback via finally */\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performReorderPinned(threadId: string, beforeId: string | null): Promise<void> {\n const a = this.actions();\n if (!a?.reorderPinned) return;\n this.pendingOrder.update((m) => {\n const n = new Map(m);\n n.set(threadId, beforeId);\n return n;\n });\n try {\n await a.reorderPinned(threadId, beforeId);\n } catch {\n /* rollback via finally */\n } finally {\n this.pendingOrder.update((m) => {\n const n = new Map(m);\n n.delete(threadId);\n return n;\n });\n }\n }\n\n protected async performMoveUp(threadId: string): Promise<void> {\n const pinned = this.threads().filter((t) => t.pinned === true);\n const idx = pinned.findIndex((t) => t.id === threadId);\n if (idx <= 0) return;\n const beforeId = pinned[idx - 1].id;\n await this.performReorderPinned(threadId, beforeId);\n }\n\n protected async performMoveDown(threadId: string): Promise<void> {\n const pinned = this.threads().filter((t) => t.pinned === true);\n const idx = pinned.findIndex((t) => t.id === threadId);\n if (idx < 0 || idx >= pinned.length - 1) return;\n const beforeId = idx + 2 < pinned.length ? pinned[idx + 2].id : null;\n await this.performReorderPinned(threadId, beforeId);\n }\n\n protected onDragStart(e: DragEvent, threadId: string): void {\n const dt = e.dataTransfer;\n if (!dt) return;\n dt.setData('text/plain', threadId);\n dt.effectAllowed = 'move';\n this.draggingThreadId.set(threadId);\n }\n\n protected onDragOver(e: DragEvent, threadId: string): void {\n const dragging = this.draggingThreadId();\n if (!dragging || dragging === threadId) return;\n const target = this.threads().find((t) => t.id === threadId);\n if (target?.pinned !== true) return;\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const offsetY = e.clientY - rect.top;\n const position: 'before' | 'after' = offsetY < rect.height / 2 ? 'before' : 'after';\n const cur = this.dropTarget();\n if (!cur || cur.threadId !== threadId || cur.position !== position) {\n this.dropTarget.set({ threadId, position });\n }\n }\n\n protected onDragLeave(_e: DragEvent, threadId: string): void {\n if (this.dropTarget()?.threadId === threadId) {\n this.dropTarget.set(null);\n }\n }\n\n protected onDrop(e: DragEvent, targetThreadId: string): void {\n e.preventDefault();\n const dragId = e.dataTransfer?.getData('text/plain') ?? this.draggingThreadId();\n const target = this.dropTarget();\n this.draggingThreadId.set(null);\n this.dropTarget.set(null);\n if (!dragId || dragId === targetThreadId || !target) return;\n\n const pinned = this.threads().filter((t) => t.pinned === true);\n const targetIdx = pinned.findIndex((t) => t.id === targetThreadId);\n if (targetIdx < 0) return;\n let beforeId: string | null;\n if (target.position === 'before') {\n beforeId = targetThreadId;\n } else {\n const filteredPinned = pinned.filter((t) => t.id !== dragId);\n const filteredTargetIdx = filteredPinned.findIndex((t) => t.id === targetThreadId);\n beforeId = filteredTargetIdx + 1 < filteredPinned.length\n ? filteredPinned[filteredTargetIdx + 1].id\n : null;\n }\n void this.performReorderPinned(dragId, beforeId);\n }\n\n protected onDragEnd(): void {\n this.draggingThreadId.set(null);\n this.dropTarget.set(null);\n }\n\n protected dropPositionFor(threadId: string): 'before' | 'after' | null {\n const t = this.dropTarget();\n return t?.threadId === threadId ? t.position : null;\n }\n\n protected async performUnarchive(threadId: string): Promise<void> {\n const a = this.actions();\n if (!a?.unarchive) return;\n this.pendingHidden.update((s) => new Set([...s, threadId]));\n try {\n await a.unarchive(threadId);\n } catch {\n // Rollback: clear override below so the row reappears.\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(threadId);\n return n;\n });\n }\n }\n}\n","// libs/chat/src/lib/styles/chat-project-list.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_PROJECT_LIST_STYLES = `\n :host { display: block; padding: var(--ngaf-chat-space-2); }\n .chat-project-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 2px; }\n .chat-project-list__item-wrap {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .chat-project-list__item {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 32px;\n padding: 6px 12px;\n border-radius: var(--ngaf-chat-radius-button);\n cursor: pointer;\n color: var(--ngaf-chat-text);\n font-size: var(--ngaf-chat-font-size-sm);\n background: transparent;\n border: 0;\n text-align: left;\n box-sizing: border-box;\n transition: background-color 150ms ease;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .chat-project-list__item:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 5%, transparent); }\n .chat-project-list__item[data-active=\"true\"] {\n background: var(--ngaf-chat-surface-alt);\n font-weight: 500;\n }\n .chat-project-list__kebab {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n transition: opacity 100ms ease;\n padding: 0;\n line-height: 1;\n font-size: 18px;\n }\n .chat-project-list__item-wrap:hover .chat-project-list__kebab,\n .chat-project-list__item-wrap:focus-within .chat-project-list__kebab {\n opacity: 1;\n }\n .chat-project-list__kebab:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-project-list__kebab:focus-visible {\n opacity: 1;\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-project-list__edit {\n flex: 1 1 auto;\n border: 1px solid var(--ngaf-chat-primary);\n border-radius: var(--ngaf-chat-radius-button);\n background: var(--ngaf-chat-bg);\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n padding: 6px 10px;\n min-height: 32px;\n outline: none;\n box-sizing: border-box;\n }\n .chat-project-list__new {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n border: 0;\n padding: 10px 16px;\n border-radius: 8px;\n font-family: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n font-weight: 400;\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n width: 100%;\n }\n .chat-project-list__new:hover {\n background: color-mix(in srgb, var(--ngaf-chat-text) 8%, var(--ngaf-chat-surface-alt));\n color: var(--ngaf-chat-text);\n }\n`;\n","// libs/chat/src/lib/primitives/chat-project-list/chat-project-list.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_PROJECT_LIST_STYLES } from '../../styles/chat-project-list.styles';\nimport {\n ChatOverflowMenuComponent,\n type OverflowMenuItem,\n} from '../chat-overflow-menu/chat-overflow-menu.component';\nimport { ChatConfirmDialogComponent } from '../chat-confirm-dialog/chat-confirm-dialog.component';\n\nexport type Project = {\n id: string;\n name: string;\n /** Open shape — consumers may add icon, color, createdAt, etc. */\n [key: string]: unknown;\n};\n\n/**\n * Consumer-provided adapter for project lifecycle actions. The framework calls\n * these methods after user confirmation (delete) or commit (create/rename) and\n * manages optimistic UI + rollback on rejection.\n */\nexport interface ProjectActionAdapter {\n /** Create a new project. Returns the new project id; consumer is expected\n * to also refresh its projects signal. */\n create?(name: string): Promise<{ id: string }>;\n rename?(projectId: string, newName: string): Promise<void>;\n /** Permanently delete the project. The framework calls this AFTER user\n * confirms via the confirm dialog. */\n delete?(projectId: string): Promise<void>;\n}\n\n@Component({\n selector: 'chat-project-list',\n standalone: true,\n imports: [ChatOverflowMenuComponent, ChatConfirmDialogComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_PROJECT_LIST_STYLES],\n template: `\n @if (showNewProjectButton()) {\n <button type=\"button\" class=\"chat-project-list__new\" (click)=\"onNewProjectClicked()\">+ New project</button>\n }\n <ul class=\"chat-project-list\">\n @if (creatingProject()) {\n <li class=\"chat-project-list__item-wrap\">\n <input\n #createInput\n class=\"chat-project-list__edit\"\n type=\"text\"\n placeholder=\"New project name\"\n [value]=\"creatingValue()\"\n (input)=\"onCreateInput($event)\"\n (keydown.enter)=\"commitCreate()\"\n (keydown.escape)=\"cancelCreate()\"\n (blur)=\"cancelCreate()\"\n aria-label=\"New project name\"\n />\n </li>\n }\n @for (project of visibleProjects(); track project.id) {\n <li class=\"chat-project-list__item-wrap\">\n @if (editingProjectId() === project.id) {\n <input\n #editInput\n class=\"chat-project-list__edit\"\n type=\"text\"\n [value]=\"editingValue()\"\n (input)=\"onEditInput($event)\"\n (keydown.enter)=\"commitRename(project.id)\"\n (keydown.escape)=\"cancelRename()\"\n (blur)=\"cancelRename()\"\n aria-label=\"Rename project\"\n />\n } @else {\n <button\n type=\"button\"\n class=\"chat-project-list__item\"\n [attr.data-active]=\"project.id === activeProjectId() ? 'true' : null\"\n [attr.aria-current]=\"project.id === activeProjectId() ? 'true' : null\"\n (click)=\"selectProject(project.id)\"\n >{{ project.name }}</button>\n\n @if (showKebab()) {\n <button\n #kebab\n type=\"button\"\n class=\"chat-project-list__kebab\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"menuOpenForId() === project.id ? 'true' : 'false'\"\n (click)=\"openMenu(project.id, kebab)\"\n >⋯</button>\n }\n }\n </li>\n }\n </ul>\n\n <chat-overflow-menu\n [open]=\"menuOpenForId() !== null\"\n [items]=\"currentMenuItems()\"\n [anchor]=\"menuAnchor()\"\n (itemSelected)=\"onMenuAction($event)\"\n (closed)=\"menuOpenForId.set(null)\"\n />\n\n <chat-confirm-dialog\n [open]=\"confirmDeleteId() !== null\"\n title=\"Delete project?\"\n body=\"The project will be deleted. Threads in this project will remain but become unassigned.\"\n confirmLabel=\"Delete\"\n tone=\"destructive\"\n (confirmed)=\"performDelete()\"\n (cancelled)=\"confirmDeleteId.set(null)\"\n />\n `,\n})\nexport class ChatProjectListComponent {\n readonly projects = input.required<Project[]>();\n readonly activeProjectId = input<string | null>(null);\n readonly showNewProjectButton = input<boolean>(false);\n readonly actions = input<ProjectActionAdapter | null>(null);\n\n readonly projectSelected = output<string>();\n readonly newProjectRequested = output<void>();\n\n protected readonly creatingProject = signal<boolean>(false);\n protected readonly creatingValue = signal<string>('');\n protected readonly editingProjectId = signal<string | null>(null);\n protected readonly editingValue = signal<string>('');\n protected readonly menuOpenForId = signal<string | null>(null);\n protected readonly menuAnchor = signal<HTMLElement | null>(null);\n protected readonly confirmDeleteId = signal<string | null>(null);\n\n private readonly pendingHidden = signal<ReadonlySet<string>>(new Set());\n private readonly pendingRenames = signal<ReadonlyMap<string, string>>(new Map());\n\n protected readonly visibleProjects = computed<Project[]>(() => {\n const hidden = this.pendingHidden();\n const renames = this.pendingRenames();\n return this.projects()\n .filter((p) => !hidden.has(p.id))\n .map((p) => (renames.has(p.id) ? ({ ...p, name: renames.get(p.id)! }) : p));\n });\n\n protected readonly currentMenuItems = computed<OverflowMenuItem[]>(() => {\n const id = this.menuOpenForId();\n if (!id) return [];\n const a = this.actions();\n if (!a) return [];\n const items: OverflowMenuItem[] = [];\n if (a.rename) items.push({ id: 'rename', label: 'Rename' });\n if (a.delete) items.push({ id: 'delete', label: 'Delete', tone: 'destructive' });\n return items;\n });\n\n private readonly createInput = viewChild<ElementRef<HTMLInputElement>>('createInput');\n private readonly editInput = viewChild<ElementRef<HTMLInputElement>>('editInput');\n\n constructor() {\n effect(() => {\n if (this.creatingProject()) {\n queueMicrotask(() => this.createInput()?.nativeElement.focus());\n }\n });\n }\n\n protected selectProject(projectId: string): void {\n this.projectSelected.emit(projectId);\n }\n\n protected showKebab(): boolean {\n const a = this.actions();\n if (!a) return false;\n return Boolean(a.rename || a.delete);\n }\n\n protected openMenu(projectId: string, anchor: HTMLElement): void {\n this.menuAnchor.set(anchor);\n this.menuOpenForId.set(projectId);\n }\n\n protected onMenuAction(id: string): void {\n const projectId = this.menuOpenForId();\n this.menuOpenForId.set(null);\n if (!projectId) return;\n\n if (id === 'rename') {\n const p = this.projects().find((x) => x.id === projectId);\n this.editingValue.set(p?.name ?? '');\n this.editingProjectId.set(projectId);\n queueMicrotask(() => this.editInput()?.nativeElement.focus());\n } else if (id === 'delete') {\n this.confirmDeleteId.set(projectId);\n }\n }\n\n protected onNewProjectClicked(): void {\n this.creatingValue.set('');\n this.creatingProject.set(true);\n this.newProjectRequested.emit();\n }\n\n protected onCreateInput(e: Event): void {\n this.creatingValue.set((e.target as HTMLInputElement).value);\n }\n\n protected cancelCreate(): void {\n this.creatingProject.set(false);\n this.creatingValue.set('');\n }\n\n protected async commitCreate(): Promise<void> {\n const name = this.creatingValue().trim();\n this.creatingProject.set(false);\n this.creatingValue.set('');\n if (!name) return;\n const a = this.actions();\n if (!a?.create) return;\n try { await a.create(name); } catch { /* consumer's refresh won't show the row */ }\n }\n\n protected onEditInput(e: Event): void {\n this.editingValue.set((e.target as HTMLInputElement).value);\n }\n\n protected cancelRename(): void {\n this.editingProjectId.set(null);\n }\n\n protected async commitRename(projectId: string): Promise<void> {\n const newName = this.editingValue().trim();\n this.editingProjectId.set(null);\n if (!newName) return;\n const a = this.actions();\n if (!a?.rename) return;\n\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.set(projectId, newName);\n return n;\n });\n try {\n await a.rename(projectId, newName);\n } catch {\n /* rollback via finally */\n } finally {\n this.pendingRenames.update((m) => {\n const n = new Map(m);\n n.delete(projectId);\n return n;\n });\n }\n }\n\n protected async performDelete(): Promise<void> {\n const projectId = this.confirmDeleteId();\n this.confirmDeleteId.set(null);\n if (!projectId) return;\n const a = this.actions();\n if (!a?.delete) return;\n\n this.pendingHidden.update((s) => new Set([...s, projectId]));\n try {\n await a.delete(projectId);\n } catch {\n /* rollback */\n } finally {\n this.pendingHidden.update((s) => {\n const n = new Set(s);\n n.delete(projectId);\n return n;\n });\n }\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-genui-skeleton',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; width: 100%; }\n .chat-genui-skeleton {\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 10px;\n padding: 14px;\n background: var(--ngaf-chat-surface-alt);\n }\n .chat-genui-skeleton__label {\n font-size: 12px;\n color: var(--ngaf-chat-text-muted);\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .chat-genui-skeleton__rows {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .chat-genui-skeleton__row {\n height: 10px;\n border-radius: 5px;\n background: linear-gradient(\n 90deg,\n var(--ngaf-chat-separator) 0%,\n color-mix(in srgb, var(--ngaf-chat-separator) 70%, transparent) 50%,\n var(--ngaf-chat-separator) 100%\n );\n background-size: 200% 100%;\n animation: chat-genui-skeleton-shimmer 1.4s ease-in-out infinite;\n }\n .chat-genui-skeleton__row:nth-child(1) { width: 70%; }\n .chat-genui-skeleton__row:nth-child(2) { width: 90%; }\n .chat-genui-skeleton__row:nth-child(3) { width: 50%; }\n @keyframes chat-genui-skeleton-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `],\n template: `\n <div class=\"chat-genui-skeleton\" role=\"status\" aria-live=\"polite\">\n <div class=\"chat-genui-skeleton__label\">\n <span aria-hidden=\"true\">✨</span>\n <span>Building UI…</span>\n </div>\n <div class=\"chat-genui-skeleton__rows\">\n <div class=\"chat-genui-skeleton__row\"></div>\n <div class=\"chat-genui-skeleton__row\"></div>\n <div class=\"chat-genui-skeleton__row\"></div>\n </div>\n </div>\n `,\n})\nexport class ChatGenuiSkeletonComponent {}\n","// SPDX-License-Identifier: MIT\nimport {\n Component, computed, contentChild, input, output,\n TemplateRef, ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { AgentWithHistory, AgentCheckpoint } from '../../agent';\n\n@Component({\n selector: 'chat-timeline',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (cp of history(); track $index) {\n @if (templateRef()) {\n <ng-container\n [ngTemplateOutlet]=\"templateRef()!\"\n [ngTemplateOutletContext]=\"{ $implicit: cp, index: $index }\"\n />\n }\n }\n `,\n})\nexport class ChatTimelineComponent {\n readonly agent = input.required<AgentWithHistory>();\n\n readonly checkpointSelected = output<AgentCheckpoint>();\n\n readonly templateRef = contentChild(TemplateRef);\n\n readonly history = computed<AgentCheckpoint[]>(() => this.agent().history());\n\n selectCheckpoint(cp: AgentCheckpoint): void {\n this.checkpointSelected.emit(cp);\n }\n}\n","// libs/chat/src/lib/styles/chat-welcome.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_WELCOME_STYLES = `\n :host {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 0;\n padding: var(--ngaf-chat-welcome-padding, 24px);\n box-sizing: border-box;\n animation: ngaf-chat-welcome-mount 200ms ease-out both;\n }\n .chat-welcome__inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ngaf-chat-welcome-gap, 1.25rem);\n width: 100%;\n max-width: var(--ngaf-chat-welcome-max-width, 36rem);\n text-align: center;\n }\n .chat-welcome__beacon {\n display: inline-block;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: radial-gradient(circle at 30% 30%,\n var(--ngaf-chat-text) 0%,\n var(--ngaf-chat-text-muted) 70%,\n transparent 100%);\n animation: ngaf-chat-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n margin-bottom: 8px;\n }\n .chat-welcome__title {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 500;\n color: var(--ngaf-chat-text);\n line-height: 1.3;\n }\n @media (min-width: 768px) {\n .chat-welcome__title { font-size: 1.5rem; }\n }\n .chat-welcome__input {\n width: 100%;\n margin-top: 0.5rem;\n }\n .chat-welcome__suggestions {\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n }\n /* Consumers commonly project chips wrapped in a single <div\n chatWelcomeSuggestions> element. In that case the slot's flex gap\n applies between divs (one of them) — not between the chips inside.\n Apply the same flex layout one level down so the chips actually\n get spacing. Safe no-op when chips are projected directly. */\n .chat-welcome__suggestions > div {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 8px;\n }\n .chat-welcome__suggestions:empty { display: none; }\n`;\n\nexport const CHAT_WELCOME_SUGGESTION_STYLES = `\n :host { display: inline-block; }\n .chat-welcome-suggestion {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 10px 16px;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 9999px;\n color: var(--ngaf-chat-text);\n font-family: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n text-align: center;\n cursor: pointer;\n transition: background 150ms ease, border-color 150ms ease, transform 120ms ease;\n }\n .chat-welcome-suggestion:hover {\n background: var(--ngaf-chat-surface-alt);\n border-color: var(--ngaf-chat-text-muted);\n }\n .chat-welcome-suggestion:active { transform: scale(0.98); }\n .chat-welcome-suggestion:focus-visible {\n outline: 2px solid var(--ngaf-chat-text-muted);\n outline-offset: 2px;\n }\n .chat-welcome-suggestion__label { white-space: nowrap; }\n .chat-welcome-suggestion__chevron { display: none; }\n`;\n","// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_WELCOME_STYLES } from '../../styles/chat-welcome.styles';\n\n/**\n * Empty-state owner. Renders a centered greeting + slot-projected input +\n * optional vertical suggestion rows. Mounted only when the parent chat has\n * no messages and welcome is not disabled.\n *\n * Slots:\n * [chatWelcomeTitle] — replaces the default <h1> \"How can I help?\"\n * [chatWelcomeInput] — projects the chat input into the center column\n * [chatWelcomeSuggestions] — projects suggestion rows below the input\n *\n * Host CSS variables (override on :host or any ancestor):\n * --ngaf-chat-welcome-max-width default 36rem\n * --ngaf-chat-welcome-gap default 1.25rem\n * --ngaf-chat-welcome-padding default 24px\n */\n@Component({\n selector: 'chat-welcome',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_WELCOME_STYLES],\n template: `\n <div class=\"chat-welcome__inner\">\n <span class=\"chat-welcome__beacon\" aria-hidden=\"true\"></span>\n <ng-content select=\"[chatWelcomeTitle]\">\n <h1 class=\"chat-welcome__title\">How can I help?</h1>\n </ng-content>\n <div class=\"chat-welcome__input\"><ng-content select=\"[chatWelcomeInput]\" /></div>\n <div class=\"chat-welcome__suggestions\">\n <ng-content select=\"[chatWelcomeSuggestions]\" />\n </div>\n </div>\n `,\n})\nexport class ChatWelcomeComponent {}\n","// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_WELCOME_SUGGESTION_STYLES } from '../../styles/chat-welcome.styles';\n\n@Component({\n selector: 'chat-welcome-suggestion',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_WELCOME_SUGGESTION_STYLES],\n template: `\n <button\n type=\"button\"\n class=\"chat-welcome-suggestion\"\n [attr.title]=\"description() || null\"\n [attr.aria-description]=\"description() || null\"\n (click)=\"selected.emit(value())\"\n >\n <ng-content select=\"[chatWelcomeSuggestionIcon]\" />\n <span class=\"chat-welcome-suggestion__label\">{{ label() }}</span>\n <span class=\"chat-welcome-suggestion__chevron\" aria-hidden=\"true\">›</span>\n </button>\n `,\n})\nexport class ChatWelcomeSuggestionComponent {\n readonly label = input.required<string>();\n readonly value = input.required<string>();\n /** Optional short description, surfaced as a hover/focus tooltip on the chip. */\n readonly description = input<string>();\n readonly selected = output<string>();\n}\n","// libs/chat/src/lib/styles/chat-select.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_SELECT_STYLES = `\n :host {\n display: inline-block;\n position: relative;\n }\n .chat-select__trigger {\n height: 32px;\n padding: 0 10px;\n border: 0;\n border-radius: 9999px;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease;\n }\n .chat-select__trigger:hover:not(:disabled) {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-select__trigger:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .chat-select__chevron {\n width: 12px;\n height: 12px;\n transition: transform 120ms ease;\n flex: none;\n }\n .chat-select__trigger.is-open .chat-select__chevron {\n transform: rotate(180deg);\n }\n .chat-select__menu {\n position: absolute;\n bottom: calc(100% + 8px);\n right: 0;\n min-width: 180px;\n max-height: 320px;\n overflow-y: auto;\n background: var(--ngaf-chat-surface);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 12px;\n box-shadow: var(--ngaf-chat-shadow-lg);\n padding: 4px;\n z-index: 10;\n }\n .chat-select__option {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n text-align: left;\n border: 0;\n background: transparent;\n padding: 8px 10px;\n border-radius: 8px;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n cursor: pointer;\n }\n .chat-select__option-desc {\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text-muted);\n line-height: 1.3;\n white-space: normal;\n }\n .chat-select__option:hover:not(:disabled),\n .chat-select__option:focus-visible {\n background: var(--ngaf-chat-surface-alt);\n outline: none;\n }\n .chat-select__option.is-active {\n background: var(--ngaf-chat-surface-alt);\n font-weight: 500;\n }\n .chat-select__option:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n","// libs/chat/src/lib/primitives/chat-select/chat-select.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SELECT_STYLES } from '../../styles/chat-select.styles';\n\nexport interface ChatSelectOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\n/**\n * Generic single-select dropdown. Designed to slot into the chat input pill\n * (via [chatInputModelSelect]) but usable anywhere.\n *\n * Inputs:\n * options — array of { value, label, disabled? }; required\n * value — currently selected value (two-way via model())\n * placeholder — trigger label when no option matches; default 'Select'\n * disabled — disables the trigger; default false\n * menuLabel — aria-label for the popover; defaults to placeholder\n */\n@Component({\n selector: 'chat-select',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, CHAT_SELECT_STYLES],\n template: `\n <button\n type=\"button\"\n class=\"chat-select__trigger\"\n [class.is-open]=\"open()\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"chat-select__label\">{{ currentLabel() }}</span>\n <svg class=\"chat-select__chevron\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n @if (open()) {\n <div\n class=\"chat-select__menu\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.aria-label]=\"menuLabel() ?? placeholder()\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (opt of options(); track opt.value) {\n <button\n type=\"button\"\n class=\"chat-select__option\"\n [class.is-active]=\"opt.value === value()\"\n [disabled]=\"opt.disabled === true\"\n role=\"option\"\n [attr.aria-selected]=\"opt.value === value()\"\n (click)=\"selectOption(opt)\"\n >\n <span class=\"chat-select__option-label\">{{ opt.label }}</span>\n @if (opt.description) {\n <span class=\"chat-select__option-desc\">{{ opt.description }}</span>\n }\n </button>\n }\n </div>\n }\n `,\n})\nexport class ChatSelectComponent {\n readonly options = input.required<readonly ChatSelectOption[]>();\n readonly value = model<string>('');\n readonly placeholder = input<string>('Select');\n readonly disabled = input<boolean>(false);\n readonly menuLabel = input<string | undefined>(undefined);\n\n protected readonly open = signal(false);\n\n protected readonly currentLabel = computed(() => {\n const v = this.value();\n const match = this.options().find((o) => o.value === v);\n return match?.label ?? this.placeholder();\n });\n\n private readonly hostEl = inject(ElementRef).nativeElement as HTMLElement;\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n let onDocClick: ((e: Event) => void) | null = null;\n effect(() => {\n const isOpen = this.open();\n const win = this.document.defaultView;\n if (!win) return;\n if (isOpen && !onDocClick) {\n onDocClick = (e) => {\n const path = (e as Event & { composedPath?: () => EventTarget[] }).composedPath?.() ?? [];\n if (!path.includes(this.hostEl as EventTarget)) {\n this.open.set(false);\n }\n };\n win.addEventListener('mousedown', onDocClick, true);\n } else if (!isOpen && onDocClick) {\n win.removeEventListener('mousedown', onDocClick, true);\n onDocClick = null;\n }\n });\n this.destroyRef.onDestroy(() => {\n if (onDocClick) {\n const win = this.document.defaultView;\n win?.removeEventListener('mousedown', onDocClick, true);\n onDocClick = null;\n }\n });\n }\n\n protected toggle(): void {\n if (this.disabled()) return;\n this.open.update((v) => !v);\n }\n\n protected selectOption(opt: ChatSelectOption): void {\n if (opt.disabled) return;\n this.value.set(opt.value);\n this.open.set(false);\n }\n\n protected onTriggerKeydown(e: KeyboardEvent): void {\n if (this.disabled()) return;\n // Escape closes an open menu when focus is still on the trigger\n // (e.g. user clicked to open, then pressed Escape without arrowing\n // into the menu). Caught by live browser smoke — without this, click\n // + Escape leaves the menu open until the user clicks outside.\n if (e.key === 'Escape' && this.open()) {\n e.preventDefault();\n this.open.set(false);\n return;\n }\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault();\n this.open.set(true);\n requestAnimationFrame(() => this.focusOption(0));\n }\n }\n\n protected onMenuKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.open.set(false);\n this.focusTrigger();\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n this.moveFocus(e.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n if (e.key === 'Enter' || e.key === ' ') {\n const t = e.target as HTMLElement;\n if (t.classList.contains('chat-select__option')) {\n e.preventDefault();\n (t as HTMLButtonElement).click();\n }\n }\n }\n\n private focusOption(index: number): void {\n const opts = this.queryOptions();\n opts[index]?.focus();\n }\n\n private focusTrigger(): void {\n this.queryTrigger()?.focus();\n }\n\n private moveFocus(dir: 1 | -1): void {\n const opts = this.queryOptions().filter((b) => !b.disabled);\n if (!opts.length) return;\n const active = this.document.activeElement as HTMLElement | null;\n const idx = active ? opts.indexOf(active as HTMLButtonElement) : -1;\n const next = (idx + dir + opts.length) % opts.length;\n opts[next]?.focus();\n }\n\n private queryOptions(): HTMLButtonElement[] {\n return Array.from(this.hostEl.querySelectorAll<HTMLButtonElement>('.chat-select__option'));\n }\n\n private queryTrigger(): HTMLButtonElement | null {\n return this.hostEl.querySelector<HTMLButtonElement>('.chat-select__trigger');\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport {\n runLicenseCheck,\n LICENSE_PUBLIC_KEY,\n inferNoncommercial,\n} from '@threadplane/licensing';\nimport type { AngularRegistry } from '@threadplane/render';\n\nconst PACKAGE_NAME = '@threadplane/chat';\n\n/**\n * Application-wide options for {@link provideChat}. Every field is optional;\n * the values are exposed to all chat components in the tree via the\n * `CHAT_CONFIG` injection token, so you set them once at bootstrap instead of\n * threading props through every component.\n */\nexport interface ChatConfig {\n /** Shared render registry for consumers that read CHAT_CONFIG. */\n renderRegistry?: AngularRegistry;\n /** Shared AI avatar label for consumers that read CHAT_CONFIG (default: \"A\"). */\n avatarLabel?: string;\n /** Shared assistant display name for consumers that read CHAT_CONFIG (default: \"Assistant\"). */\n assistantName?: string;\n /** Signed license token from threadplane.ai. Optional; omitted in dev. */\n license?: string;\n /**\n * @internal\n * Test-only env hint override. Not part of the stable API.\n */\n __licenseEnvHint?: { isNoncommercial: boolean };\n /**\n * @internal\n * Test-only public-key override. Defaults to the compile-time embedded\n * `LICENSE_PUBLIC_KEY`. Not part of the stable API.\n */\n __licensePublicKey?: Uint8Array;\n}\n\nexport const CHAT_CONFIG = new InjectionToken<ChatConfig>('CHAT_CONFIG');\n\n/**\n * Bootstrap `@threadplane/chat` in an Angular application or standalone\n * component tree.\n *\n * Call this once inside `bootstrapApplication` (or the `providers` array of a\n * root `ApplicationConfig`). It registers the shared {@link ChatConfig} token\n * so every chat component in the tree can read the render registry, avatar\n * label, and assistant display name without explicit prop threading.\n *\n * A license check is fired asynchronously on every call (it never throws; a\n * watermark is shown in non-commercial builds when no valid token is supplied).\n *\n * @param config Options bag that controls the chat feature set:\n * - `renderRegistry` — shared {@link AngularRegistry} wiring tool-view\n * components to their names; pass the value returned by\n * `defineAngularRegistry` from `\\@threadplane/render`.\n * - `avatarLabel` — short label shown in the AI avatar bubble (default `\"A\"`).\n * - `assistantName` — display name shown above assistant messages\n * (default `\"Assistant\"`).\n * - `license` — signed token from threadplane.ai; omit in development.\n * @returns An `EnvironmentProviders` value suitable for the `providers` array\n * of `bootstrapApplication` or `ApplicationConfig`.\n * @example\n * ```ts\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideChat } from '@threadplane/chat';\n * import { defineAngularRegistry, provideRender } from '@threadplane/render';\n * import { DayCardComponent } from './day-card.component';\n *\n * const registry = defineAngularRegistry({ day_card: DayCardComponent });\n *\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideChat({ renderRegistry: registry, avatarLabel: 'AI' }),\n * provideRender({ registry }),\n * ],\n * });\n * ```\n */\nexport function provideChat(config: ChatConfig) {\n void runLicenseCheck({\n package: PACKAGE_NAME,\n token: config.license,\n publicKey: config.__licensePublicKey ?? LICENSE_PUBLIC_KEY,\n isNoncommercial:\n config.__licenseEnvHint?.isNoncommercial ?? inferNoncommercial(),\n });\n\n return makeEnvironmentProviders([\n { provide: CHAT_CONFIG, useValue: config },\n ]);\n}\n","// SPDX-License-Identifier: MIT\nimport { effect, inject, untracked, type WritableSignal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router, NavigationEnd, type NavigationExtras } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\nexport interface ThreadRoutingConfig {\n /** The app-owned source-of-truth signal for the active thread id. */\n threadId: WritableSignal<string | null>;\n /** Router commands for a thread id (or the bare/welcome path when null).\n * Default: `(id) => (id ? ['/', id] : ['/'])`. */\n toCommands?: (id: string | null) => unknown[];\n /** Extract the thread id from a URL (null = bare). Default: last non-empty path segment. */\n threadIdFromUrl?: (url: string) => string | null;\n /** Optional async validity check; on `false` the helper redirects to the bare path\n * (`replaceUrl: true`). LangGraph apps pass `id => threads.getThread(id).then(Boolean)`. */\n validate?: (id: string) => Promise<boolean>;\n /** Extras merged into every navigate (default `{ queryParamsHandling: 'preserve' }`). */\n navigationExtras?: NavigationExtras;\n}\n\nconst defaultFromUrl = (url: string): string | null => {\n const seg = url.split('?')[0].split('#')[0].split('/').filter(Boolean);\n return seg.length ? seg[seg.length - 1] : null;\n};\nconst defaultToCommands = (id: string | null): unknown[] => (id ? ['/', id] : ['/']);\n\n/**\n * Bind an app-owned `activeThreadId` signal to the URL — restore on load, stamp on change,\n * validate-or-redirect, with a bare URL meaning \"no thread\" (welcome). URL is the source of\n * truth; nothing is written to localStorage. Must be called in an injection context.\n *\n * @example\n * ```ts\n * export const ACTIVE_THREAD = signal<string | null>(null);\n * // providers: provideAgent({ threadId: ACTIVE_THREAD, onThreadId: id => ACTIVE_THREAD.set(id) })\n * const threads = inject(LangGraphThreadsAdapter);\n * injectThreadRouting({ threadId: ACTIVE_THREAD, validate: id => threads.getThread(id).then(Boolean) });\n * ```\n */\nexport function injectThreadRouting(config: ThreadRoutingConfig): void {\n const router = inject(Router);\n const fromUrl = config.threadIdFromUrl ?? defaultFromUrl;\n const toCommands = config.toCommands ?? defaultToCommands;\n const extras: NavigationExtras = config.navigationExtras ?? { queryParamsHandling: 'preserve' };\n\n const urlThreadId = toSignal(\n router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map((e) => fromUrl(e.urlAfterRedirects)),\n startWith(fromUrl(router.url)),\n ),\n { initialValue: fromUrl(router.url) },\n );\n\n // Seed the signal from the URL once.\n config.threadId.set(urlThreadId());\n\n // URL → signal.\n effect(() => {\n const urlId = urlThreadId();\n if (urlId !== untracked(() => config.threadId())) config.threadId.set(urlId);\n });\n\n // signal → URL.\n effect(() => {\n const id = config.threadId();\n const urlId = untracked(() => urlThreadId());\n if (id !== urlId) void router.navigate(toCommands(id), extras);\n });\n\n // validate stale ids → redirect to bare. Memoize the last id checked so\n // re-visiting the same thread (A → B → A) doesn't re-hit the backend.\n if (config.validate) {\n const validate = config.validate;\n let lastValidated: string | null = null;\n effect(() => {\n const id = urlThreadId();\n if (!id || id === lastValidated) return;\n lastValidated = id;\n void validate(id).then((ok) => {\n if (!ok && untracked(() => urlThreadId()) === id) {\n void router.navigate(toCommands(null), { ...extras, replaceUrl: true });\n }\n });\n });\n }\n}\n","// SPDX-License-Identifier: MIT\n\nimport { InjectionToken, Signal } from '@angular/core';\n\nexport interface ChatLifecycle {\n /** True after `<chat>` initializes with a non-null agent binding. */\n readonly componentReady: Signal<boolean>;\n /** True after the first user submit. Sticky for the life of the chat instance — does NOT reset on clearThread. */\n readonly firstMessageSent: Signal<boolean>;\n /** Count of user submits. Resets on clearThread. */\n readonly messageCount: Signal<number>;\n /** Epoch ms of the most recent user submit. Resets on clearThread. */\n readonly inputSubmittedAt: Signal<number | null>;\n}\n\nexport const CHAT_LIFECYCLE = new InjectionToken<ChatLifecycle>('CHAT_LIFECYCLE');\n","// SPDX-License-Identifier: MIT\nimport { toJSONSchema } from 'zod/v4';\nimport type { StandardSchemaV1 } from '@threadplane/render';\n\n/** A client tool spec as shipped to the model / AG-UI RunAgentInput.tools. */\nexport interface ClientToolSpec {\n readonly name: string;\n readonly description: string;\n readonly parameters: Record<string, unknown>;\n}\n\n/**\n * Convert a Standard Schema to a JSON Schema for the model's `parameters`.\n * Uses Zod's converter; throws a clear error for non-Zod validators (callers\n * should supply a Zod schema — see the client-tools docs).\n */\nexport function deriveJsonSchema(toolName: string, schema: StandardSchemaV1): Record<string, unknown> {\n try {\n return toJSONSchema(schema as never) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `client tool \"${toolName}\": could not derive a JSON Schema from its schema. ` +\n `Use a Zod schema (recommended) or an already-JSON-Schema-compatible validator. ` +\n `Underlying error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n","// SPDX-License-Identifier: MIT\nimport type { StandardSchemaV1 } from '@threadplane/render';\nimport type { AnyFunctionToolDef } from './tool-def';\nimport type { ClientToolResult } from './client-tools-capability';\n\n/** Validate raw model args against a Standard Schema. */\nexport async function validateArgs(\n schema: StandardSchemaV1,\n args: unknown,\n): Promise<{ ok: true; value: unknown } | { ok: false; error: string }> {\n const res = await schema['~standard'].validate(args);\n if (res.issues) {\n return { ok: false, error: res.issues.map((i) => i.message).join('; ') };\n }\n // Cast rather than rely on discriminant narrowing: the cockpit example apps\n // compile this source with `strictNullChecks: false`, where the\n // `issues?: undefined` discriminant doesn't narrow `res` to the success type.\n return { ok: true, value: (res as { value: unknown }).value };\n}\n\n/** Validate args, run the handler, and normalize the outcome to a ClientToolResult. */\nexport async function executeFunctionTool(\n def: AnyFunctionToolDef,\n rawArgs: unknown,\n): Promise<ClientToolResult> {\n const v = await validateArgs(def.schema, rawArgs);\n if (!v.ok) return { ok: false, error: `invalid arguments: ${(v as { error: string }).error}` };\n try {\n const value = await def.handler((v as { value: unknown }).value as never);\n return { ok: true, value };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { effect } from '@angular/core';\nimport type { Agent } from '../agent';\nimport type { ClientToolRegistry } from './tool-def';\nimport { executeFunctionTool } from './execute';\n\n/**\n * Watches the agent's pending client tool calls and auto-runs FUNCTION tools,\n * resolving each with its result. View/ask (component) tools are handled by the\n * rendering layer, not here. No-op if the agent lacks the clientTools\n * capability. MUST be called in an injection context (sets up an effect).\n */\nexport function startClientToolExecutor(agent: Agent, registry: ClientToolRegistry): void {\n const cap = agent.clientTools;\n if (!cap) return;\n const inFlight = new Set<string>();\n effect(() => {\n for (const tc of cap.pending()) {\n const def = registry[tc.name];\n if (!def || def.kind !== 'function') continue; // non-function handled elsewhere\n // NB: do NOT skip on `tc.status === 'complete'`. A client tool call is\n // marked 'complete' once its args finish streaming, yet it still has no\n // result and needs the browser to execute it. `pending` already excludes\n // calls that have a result or were resolved; `inFlight` prevents a\n // double-dispatch within a render cycle.\n if (inFlight.has(tc.id)) continue;\n inFlight.add(tc.id);\n void executeFunctionTool(def, tc.args).then((result) => {\n cap.resolve(tc.id, result);\n inFlight.delete(tc.id);\n });\n }\n });\n}\n","// SPDX-License-Identifier: MIT\nimport { effect } from '@angular/core';\nimport { views, type ViewRegistry } from '@threadplane/render';\nimport type { RenderEvent, RenderViewEntry } from '@threadplane/render';\nimport type { Agent, ToolCall } from '../agent';\nimport type { ClientToolRegistry, ClientToolDef } from './tool-def';\nimport type { ClientToolSpec } from './to-json-schema';\nimport { deriveJsonSchema } from './to-json-schema';\nimport { startClientToolExecutor } from './client-tool-executor';\n\nexport interface ClientToolsCoordinator {\n /** Components for `view`/`ask` tools, keyed by tool name — merge into the chat `views`. */\n readonly viewRegistry: ViewRegistry;\n /** Wire the coordinator to an agent: ship the catalog, run function tools, auto-ack view tools.\n * MUST be called inside an injection context (sets up effects). Safe no-op if the agent lacks\n * the clientTools capability. */\n connect(agent: Agent): void;\n /** Handle a render event bubbled up from a mounted view/ask component (resolves `ask` results). */\n handleRenderEvent(agent: Agent, event: RenderEvent): void;\n}\n\n/** Build the catalog spec list shipped to the model. */\nexport function toClientToolSpecs(registry: ClientToolRegistry): ClientToolSpec[] {\n return Object.entries(registry).map(([name, def]) => ({\n name,\n description: def.description,\n parameters: deriveJsonSchema(name, def.schema),\n }));\n}\n\n/** Map each view/ask tool to a RenderViewEntry that carries its schema, so the\n * render lib can gate the real component's mount on schema-readiness (showing\n * the fallback skeleton while a streaming tool call's args are still\n * incomplete) instead of mounting a required-input component too early. */\nfunction viewComponents(registry: ClientToolRegistry): Record<string, RenderViewEntry> {\n const out: Record<string, RenderViewEntry> = {};\n for (const [name, def] of Object.entries(registry)) {\n if (def.kind === 'view' || def.kind === 'ask') {\n out[name] = { component: def.component, schema: def.schema };\n }\n }\n return out;\n}\n\nexport function createClientToolsCoordinator(registry: ClientToolRegistry): ClientToolsCoordinator {\n const viewRegistry = views(viewComponents(registry));\n const ackedViews = new Set<string>();\n\n return {\n viewRegistry,\n connect(agent: Agent): void {\n const cap = agent.clientTools;\n if (!cap) return;\n cap.setCatalog(toClientToolSpecs(registry));\n startClientToolExecutor(agent, registry); // function tools\n // Auto-ack `view` tools: they render but produce no user value.\n effect(() => {\n for (const tc of cap.pending()) {\n const def: ClientToolDef | undefined = registry[tc.name];\n if (!def || def.kind !== 'view') continue;\n if (ackedViews.has(tc.id)) continue;\n ackedViews.add(tc.id);\n cap.resolve(tc.id, { ok: true, value: { shown: true } });\n }\n });\n },\n handleRenderEvent(agent: Agent, event: RenderEvent): void {\n if (event.type !== 'result') return;\n const cap = agent.clientTools;\n if (!cap) return;\n // elementKey is the tool NAME in the tool-view spec; resolve the pending `ask`\n // call for that name with the component's emitted value.\n const name = event.elementKey;\n const pending = cap.pending().find(\n (tc: ToolCall) => tc.name === name && registry[tc.name]?.kind === 'ask',\n );\n if (pending) cap.resolve(pending.id, { ok: true, value: event.value });\n },\n };\n}\n","// SPDX-License-Identifier: MIT\nimport type { Spec, UIElement } from '@json-render/core';\nimport type {\n A2uiSurface, A2uiComponent, A2uiAction, A2uiChildren,\n A2uiActionContextEntry,\n} from '@threadplane/a2ui';\nimport { resolveDynamic, getByPointer, isPathRef } from '@threadplane/a2ui';\n\nconst RESERVED_PROP_KEYS = new Set(['child', 'children', 'action', 'tabItems', 'entryPointChild', 'contentChild']);\n\ntype RenderedAction = Record<string, { action: string; params: Record<string, unknown> }>;\n\n/** Pull the (single) component-type key + its props from a v1 ComponentDef wrapper. */\nfunction unwrapComponentDef(def: A2uiComponent['component']): { type: string; props: Record<string, unknown> } {\n const entries = Object.entries(def as Record<string, unknown>);\n if (entries.length !== 1) {\n return { type: 'Text', props: {} };\n }\n const [type, props] = entries[0];\n return { type, props: (props ?? {}) as Record<string, unknown> };\n}\n\nfunction resolveAction(\n action: A2uiAction | undefined,\n surface: A2uiSurface,\n sourceComponentId: string,\n): RenderedAction | undefined {\n if (!action) return undefined;\n const resolvedContext: Record<string, unknown> = {};\n if (Array.isArray(action.context)) {\n for (const entry of action.context as A2uiActionContextEntry[]) {\n resolvedContext[entry.key] = resolveDynamic(entry.value, surface.dataModel);\n }\n }\n return {\n click: {\n action: 'a2ui:event',\n params: {\n surfaceId: surface.surfaceId,\n sourceComponentId,\n name: action.name,\n context: resolvedContext,\n },\n },\n } as RenderedAction;\n}\n\nfunction childrenToList(\n children: A2uiChildren | undefined,\n surface: A2uiSurface,\n): { ids: string[]; templateExpand?: { componentId: string; arrPath: string; arr: unknown[] } } | undefined {\n if (!children) return undefined;\n if ('explicitList' in children) {\n return { ids: children.explicitList };\n }\n if ('template' in children) {\n const t = children.template;\n const arr = getByPointer(surface.dataModel, t.dataBinding);\n if (!Array.isArray(arr)) return { ids: [] };\n const ids = arr.map((_, i) => `${t.componentId}__${i}`);\n return { ids, templateExpand: { componentId: t.componentId, arrPath: t.dataBinding, arr } };\n }\n return undefined;\n}\n\nexport function surfaceToSpec(surface: A2uiSurface): Spec | null {\n if (surface.components.size === 0) return null;\n\n const elements: Record<string, UIElement> = {};\n\n for (const [id, comp] of surface.components) {\n const { type, props: rawProps } = unwrapComponentDef(comp.component);\n\n const resolvedProps: Record<string, unknown> = {};\n const bindings: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(rawProps)) {\n if (RESERVED_PROP_KEYS.has(key)) continue;\n if (isPathRef(value)) {\n // Leave path refs as json-render two-way binding markers so the\n // render lib resolves them against its state store on every\n // render. Without this, the catalog component receives a static\n // snapshot taken at conversion time and never reflects user\n // input writes back into the store. The `_bindings` map below\n // tells the catalog component which prop names map to which\n // paths so its injectRenderHost().set(path, value) call can\n // write the typed value back to the render state store.\n const path = (value as { path: string }).path;\n bindings[key] = path;\n resolvedProps[key] = { $bindState: path };\n } else {\n resolvedProps[key] = resolveDynamic(value, surface.dataModel);\n }\n }\n if (Object.keys(bindings).length > 0) {\n resolvedProps['_bindings'] = bindings;\n }\n\n const action = (rawProps as { action?: A2uiAction }).action;\n const on = resolveAction(action, surface, id);\n\n // Map children — handle Card single child / Button single child / Modal entryPointChild+contentChild / Tabs tabItems\n let children: string[] | undefined;\n if (type === 'Card' && typeof (rawProps as { child?: unknown }).child === 'string') {\n children = [(rawProps as { child: string }).child];\n } else if (type === 'Button' && typeof (rawProps as { child?: unknown }).child === 'string') {\n children = [(rawProps as { child: string }).child];\n } else if (type === 'Modal') {\n const m = rawProps as { entryPointChild?: string; contentChild?: string };\n const ids: string[] = [];\n if (m.entryPointChild) ids.push(m.entryPointChild);\n if (m.contentChild) ids.push(m.contentChild);\n children = ids;\n } else if (type === 'Tabs') {\n const items = (rawProps as { tabItems?: { title?: unknown; child: string }[] }).tabItems ?? [];\n children = items.map(t => t.child);\n // Resolve tab titles and pass them as a plain string array for the Tabs component's tab bar.\n resolvedProps['tabTitles'] = items.map(t =>\n t.title !== undefined ? String(resolveDynamic(t.title, surface.dataModel)) : '',\n );\n } else if (type === 'MultipleChoice') {\n // Resolve options[*].label (DynamicString) so the component receives plain strings.\n const opts = (rawProps as { options?: { label?: unknown; value: string }[] }).options ?? [];\n resolvedProps['options'] = opts.map(o => ({\n label: o.label !== undefined ? String(resolveDynamic(o.label, surface.dataModel)) : '',\n value: o.value,\n }));\n } else {\n const childInfo = childrenToList((rawProps as { children?: A2uiChildren }).children, surface);\n if (childInfo) {\n children = childInfo.ids;\n if (childInfo.templateExpand) {\n const t = childInfo.templateExpand;\n const templateComp = surface.components.get(t.componentId);\n if (templateComp) {\n const { type: tType, props: tRaw } = unwrapComponentDef(templateComp.component);\n for (let i = 0; i < t.arr.length; i++) {\n const scope = { basePath: `${t.arrPath}/${i}`, item: t.arr[i] };\n const itemProps: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(tRaw)) {\n if (RESERVED_PROP_KEYS.has(k)) continue;\n itemProps[k] = resolveDynamic(v, surface.dataModel, scope);\n }\n elements[`${t.componentId}__${i}`] = { type: tType, props: itemProps };\n }\n }\n }\n }\n }\n\n elements[id] = {\n type,\n props: resolvedProps,\n ...(children ? { children } : {}),\n ...(on ? { on } : {}),\n };\n }\n\n // Use `root` if present in the components map; otherwise prefer first id.\n const root = surface.components.has('root')\n ? 'root'\n : (surface.components.keys().next().value as string);\n\n return { root, elements, state: surface.dataModel } as Spec;\n}\n","// SPDX-License-Identifier: MIT\nimport type { A2uiSurface, A2uiActionMessage } from '@threadplane/a2ui';\n\nfunction toDynamicValue(v: unknown): unknown {\n if (typeof v === 'string') return { literalString: v };\n if (typeof v === 'number') return { literalNumber: v };\n if (typeof v === 'boolean') return { literalBoolean: v };\n return { literalString: String(v) };\n}\n\n/**\n * Derive a human-readable label for an outgoing action by walking from\n * the source component to its authored visible text. Today supported:\n * Button → child Text → literalString. Returns null for other component\n * types or when the linkage isn't well-formed; callers fall back to a\n * camelCase humanization of `action.name`.\n *\n * Why: the chat-lib used to ship a hardcoded `KNOWN_LABELS` map\n * (bookingSubmit → 'Search flights') that embedded app-specific\n * knowledge in the primitive. The LLM that authors a surface already\n * writes the Button's visible text — reuse it as the action label.\n * See spec 2026-05-19-llm-generated-labels-design.md.\n */\nfunction deriveActionLabel(surface: A2uiSurface, sourceId: string): string | null {\n const source = surface.components.get(sourceId);\n if (!source) return null;\n const buttonProps = (source.component as { Button?: { child?: string } }).Button;\n if (!buttonProps?.child) return null;\n const labelText = surface.components.get(buttonProps.child);\n if (!labelText) return null;\n const textProps = (labelText.component as { Text?: { text?: unknown } }).Text;\n if (!textProps) return null;\n // `text` may be either a raw string (LLM-author ergonomic shorthand) or\n // a wrapped DynamicString `{ literalString: \"...\" }` (canonical v1 shape).\n // Accept both so the label survives whichever form the LLM happens to emit.\n const text = textProps.text;\n if (typeof text === 'string') {\n return text.length > 0 ? text : null;\n }\n if (text && typeof text === 'object' && typeof (text as { literalString?: unknown }).literalString === 'string') {\n const literal = (text as { literalString: string }).literalString;\n return literal.length > 0 ? literal : null;\n }\n return null;\n}\n\n/** Builds an A2uiActionMessage from handler params and the current surface.\n * The action.context is serialized as v1 DynamicValue-wrapped entries.\n * Sets action.label when the source component is a Button with a Text\n * child whose literalString is non-empty. */\nexport function buildA2uiActionMessage(\n params: Record<string, unknown>,\n surface: A2uiSurface,\n): A2uiActionMessage {\n const rawContext = (params['context'] as Record<string, unknown>) ?? {};\n const wrappedContext: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rawContext)) {\n wrappedContext[k] = toDynamicValue(v);\n }\n\n const sourceComponentId = params['sourceComponentId'] as string;\n\n const message: A2uiActionMessage = {\n version: 'v1',\n action: {\n name: params['name'] as string,\n surfaceId: surface.surfaceId,\n sourceComponentId,\n timestamp: new Date().toISOString(),\n context: wrappedContext,\n },\n };\n\n const label = deriveActionLabel(surface, sourceComponentId);\n if (label) message.action.label = label;\n\n if (surface.sendDataModel) {\n message.metadata = {\n a2uiClientDataModel: {\n version: 'v1',\n surfaces: { [surface.surfaceId]: surface.dataModel },\n },\n };\n }\n return message;\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CHAT_HOST_TOKENS } from '../styles/chat-tokens';\n\n@Component({\n selector: 'a2ui-default-fallback',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; width: 100%; }\n .a2ui-default-fallback {\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 10px;\n padding: 14px;\n background: var(--ngaf-chat-surface-alt);\n }\n .a2ui-default-fallback__label {\n font-size: 12px;\n color: var(--ngaf-chat-text-muted);\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .a2ui-default-fallback__rows {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .a2ui-default-fallback__row {\n height: 10px;\n border-radius: 5px;\n background: linear-gradient(\n 90deg,\n var(--ngaf-chat-separator) 0%,\n color-mix(in srgb, var(--ngaf-chat-separator) 70%, transparent) 50%,\n var(--ngaf-chat-separator) 100%\n );\n background-size: 200% 100%;\n animation: a2ui-default-fallback-shimmer 1.4s ease-in-out infinite;\n }\n .a2ui-default-fallback__row:nth-child(1) { width: 70%; }\n .a2ui-default-fallback__row:nth-child(2) { width: 90%; }\n .a2ui-default-fallback__row:nth-child(3) { width: 50%; }\n @keyframes a2ui-default-fallback-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `],\n template: `\n <div class=\"a2ui-default-fallback\" role=\"status\" aria-live=\"polite\">\n <div class=\"a2ui-default-fallback__label\">\n <span aria-hidden=\"true\">&#10024;</span>\n <span>Building UI&hellip;</span>\n </div>\n <div class=\"a2ui-default-fallback__rows\">\n <div class=\"a2ui-default-fallback__row\"></div>\n <div class=\"a2ui-default-fallback__row\"></div>\n <div class=\"a2ui-default-fallback__row\"></div>\n </div>\n </div>\n `,\n})\nexport class A2uiDefaultFallbackComponent {}\n","// SPDX-License-Identifier: MIT\nimport {\n Component, computed, input, output, ChangeDetectionStrategy, Type,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport type { A2uiSurface, A2uiActionMessage } from '@threadplane/a2ui';\nimport { RenderSpecComponent, toRenderRegistry } from '@threadplane/render';\nimport type { ViewRegistry, RenderEvent } from '@threadplane/render';\nimport { surfaceToSpec } from './surface-to-spec';\nimport { buildA2uiActionMessage } from './build-action-message';\nimport { A2uiDefaultFallbackComponent } from './a2ui-default-fallback.component';\nimport type { A2uiSurfaceState } from './surface-store';\nimport type { A2uiViews } from './views';\n\n@Component({\n selector: 'a2ui-surface',\n standalone: true,\n imports: [\n RenderSpecComponent,\n A2uiDefaultFallbackComponent,\n NgComponentOutlet,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n // The host applies the agent-set v1 styles (`beginRendering.styles`)\n // as inline CSS custom properties + font-family. Catalog components\n // consume `--a2ui-primary` for accents (buttons, sliders, focus,\n // etc.); `font-family` cascades naturally from the host.\n host: {\n '[style.--a2ui-primary]': 'primaryColor()',\n '[style.font-family]': 'fontFamily()',\n },\n template: `\n @if (spec(); as s) {\n <render-spec\n [spec]=\"s\"\n [registry]=\"registry()\"\n [handlers]=\"internalHandlers()\"\n (events)=\"onRenderEvent($event)\"\n />\n } @else if (state(); as st) {\n @if (surfaceFallback(); as fb) {\n <ng-container *ngComponentOutlet=\"fb\" />\n } @else {\n <a2ui-default-fallback />\n }\n }\n `,\n})\n/**\n * Renders an A2UI surface. Supports two input shapes:\n * - `state` (preferred): chat-side `A2uiSurfaceState` driving progressive\n * per-component rendering via `a2uiSlot` + readiness gates.\n * - `surface` (legacy): wire-format `A2uiSurface` fed into `<render-spec>`;\n * kept for backwards compatibility.\n *\n * When both inputs are set, `state` takes priority for rendering AND for\n * action-message construction; `surface` is only consulted when `state`\n * is unset.\n */\nexport class A2uiSurfaceComponent {\n /** Wire-format surface (legacy path — kept for backwards compat). */\n readonly surface = input<A2uiSurface>();\n /** Chat-side surface state with per-component readiness. When set,\n * this takes priority and the progressive renderer is used. */\n readonly state = input<A2uiSurfaceState>();\n readonly catalog = input.required<A2uiViews | ViewRegistry>();\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>({});\n /** Optional top-level placeholder when the surface has no components\n * yet. Defaults to A2uiDefaultFallbackComponent. */\n readonly surfaceFallback = input<Type<unknown> | undefined>(undefined);\n readonly events = output<RenderEvent>();\n readonly action = output<A2uiActionMessage>();\n\n /** Agent-set primary color from `beginRendering.styles.primaryColor`.\n * Returns null when unset so the host binding doesn't override the\n * consumer's `:root`-level `--a2ui-primary` default. */\n readonly primaryColor = computed<string | null>(() =>\n (this.state()?.surface ?? this.surface())?.styles?.primaryColor ?? null\n );\n\n /** Agent-set font family from `beginRendering.styles.font`. Returns\n * null when unset so the host doesn't override consumer fonts. */\n readonly fontFamily = computed<string | null>(() =>\n (this.state()?.surface ?? this.surface())?.styles?.font ?? null\n );\n\n /** Roots from the surface state — components whose ids appear as\n * children of no other component. The wire spec includes\n * `beginRendering.root` as the single root; that path stays usable\n * but we keep the renderer permissive in case future surfaces emit\n * multiple top-level components.\n *\n * Conservative: returns only the first key from componentViews\n * insertion order. The wire format's beginRendering.root carries the\n * true root id; plumbing it through A2uiSurfaceState is a follow-up. */\n readonly rootIds = computed<string[]>(() => {\n const st = this.state();\n if (!st) return [];\n return [...st.componentViews.keys()].slice(0, 1);\n });\n\n /** Convert the A2UI surface to a json-render Spec for rendering.\n * Prefers `state().surface` (the progressively-built wire surface)\n * over the legacy `surface` input. surfaceToSpec handles\n * children.explicitList → spec.children translation + reserved-key\n * filtering + path-ref → $bindState rewriting; the rendered tree\n * then uses render-element's standard input-mapping\n * (`childKeys: el.children`) so catalog components receive the\n * inputs they actually declare.\n *\n * This supersedes the earlier slot-based progressive renderer,\n * which mounted root components but never populated their\n * childKeys input — leaving Columns/Rows/etc. with no children. */\n readonly spec = computed(() => {\n const surf = this.state()?.surface ?? this.surface();\n return surf && surf.components.size > 0 ? surfaceToSpec(surf) : null;\n });\n\n /** Convert ViewRegistry to AngularRegistry for RenderSpecComponent. */\n readonly registry = computed(() => toRenderRegistry(this.catalog() as ViewRegistry));\n\n /** Merge built-in A2UI handlers with consumer-provided handlers. */\n readonly internalHandlers = computed(() => {\n const consumerHandlers = this.handlers();\n return {\n 'a2ui:event': (params: Record<string, unknown>) => {\n // Prefer state.surface so action messages reference the surface\n // we actually rendered, even if a legacy `[surface]` input with\n // a mismatched id is also bound.\n const surf = this.state()?.surface ?? this.surface();\n if (!surf) return undefined;\n const message = buildA2uiActionMessage(params, surf);\n this.action.emit(message);\n return message;\n },\n 'a2ui:localAction': (params: Record<string, unknown>) => {\n const call = params['call'] as string;\n const args = (params['args'] as Record<string, unknown>) ?? {};\n\n // Consumer handler takes priority\n if (consumerHandlers[call]) {\n return consumerHandlers[call](args);\n }\n\n // Built-in fallback\n if (call === 'openUrl' && typeof globalThis.window !== 'undefined') {\n globalThis.window.open(String(args['url'] ?? ''), '_blank');\n }\n return undefined;\n },\n };\n });\n\n onRenderEvent(event: RenderEvent): void {\n this.events.emit(event);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, type Signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport type { PartialJsonParser, JsonObjectNode } from '@cacheplane/partial-json';\nimport { materialize } from '@cacheplane/partial-json';\n\nexport interface ElementAccumulationState {\n hasType: boolean;\n hasProps: boolean;\n hasChildren: boolean;\n streaming: boolean;\n}\n\nexport interface ParseTreeStore {\n push(chunk: string): void;\n readonly spec: Signal<Spec | null>;\n readonly elementStates: Signal<Map<string, ElementAccumulationState>>;\n}\n\n/**\n * Create a {@link ParseTreeStore} — feeds streamed JSON chunks through a\n * partial-JSON parser and exposes the progressively-materialized spec and\n * per-element accumulation state as signals, so a generative-UI surface can\n * render while the spec is still arriving.\n *\n * @param parser The partial-JSON parser used to incrementally materialize chunks.\n * @returns A {@link ParseTreeStore}; call `push(chunk)` as bytes stream in.\n * @example\n * ```ts\n * const store = createParseTreeStore(parser);\n * store.push('{\"type\":\"Car');\n * store.spec(); // best-effort Spec | null\n * ```\n */\nexport function createParseTreeStore(parser: PartialJsonParser): ParseTreeStore {\n const specSignal = signal<Spec | null>(null);\n const elementStatesSignal = signal<Map<string, ElementAccumulationState>>(new Map());\n\n function computeElementStates(materialized: any): Map<string, ElementAccumulationState> {\n const states = new Map<string, ElementAccumulationState>();\n if (!materialized || typeof materialized !== 'object' || !materialized.elements) {\n return states;\n }\n\n const elements = materialized.elements as Record<string, any>;\n // We also need the parse tree to know if the element object node is still streaming\n const elementsNode = parser.getByPath('/elements') as JsonObjectNode | null;\n\n for (const [key, el] of Object.entries(elements)) {\n if (!el || typeof el !== 'object') continue;\n\n let streaming = true;\n if (elementsNode) {\n const elNode = elementsNode.children.get(key);\n if (elNode && elNode.status === 'complete') {\n streaming = false;\n }\n }\n\n states.set(key, {\n hasType: 'type' in el && el.type !== undefined,\n hasProps: 'props' in el && el.props !== undefined,\n hasChildren: 'children' in el && el.children !== undefined,\n streaming,\n });\n }\n\n return states;\n }\n\n function push(chunk: string): void {\n parser.push(chunk);\n if (parser.root) {\n const materialized = materialize(parser.root);\n specSignal.set(materialized as Spec);\n elementStatesSignal.set(computeElementStates(materialized));\n }\n }\n\n return {\n push,\n spec: specSignal.asReadonly(),\n elementStates: elementStatesSignal.asReadonly(),\n };\n}\n","// SPDX-License-Identifier: MIT\nimport type { A2uiComponentDef } from '@threadplane/a2ui';\n\nconst REF_PATTERN = /\\{(\\$\\.[^}]+)\\}/g;\n\nfunction walk(value: unknown, into: Set<string>): void {\n if (typeof value === 'string') {\n let m: RegExpExecArray | null;\n REF_PATTERN.lastIndex = 0;\n while ((m = REF_PATTERN.exec(value)) !== null) into.add(m[1]);\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) walk(v, into);\n return;\n }\n if (value && typeof value === 'object') {\n for (const v of Object.values(value as Record<string, unknown>)) walk(v, into);\n }\n}\n\n/** Extracts the set of data-model paths (e.g. `$.form.name`) referenced\n * by `{$.path}` expressions inside a component's prop bag. Result is\n * deduplicated and sorted for stable signal identity. */\nexport function extractBindings(def: A2uiComponentDef): readonly string[] {\n const out = new Set<string>();\n walk(def, out);\n return [...out].sort();\n}\n","// SPDX-License-Identifier: MIT\nimport { computed, signal, type Signal } from '@angular/core';\nimport type {\n A2uiMessage, A2uiSurface, A2uiComponent,\n A2uiSurfaceUpdate, A2uiDataModelUpdate, A2uiBeginRendering, A2uiDeleteSurface,\n A2uiDataModelEntry,\n} from '@threadplane/a2ui';\nimport { setByPointer } from '@threadplane/a2ui';\nimport type { A2uiComponentView } from './component-view';\nimport { extractBindings } from './extract-bindings';\n\ninterface SurfaceBuffer {\n /** Pending component map (replaces on next beginRendering). */\n components?: Map<string, A2uiComponent>;\n /** Pending per-component views (replaces on next beginRendering). */\n componentViews?: Map<string, A2uiComponentView>;\n /** Pending data model deltas accumulated since last beginRendering. */\n dataModelDeltas: { path?: string; contents: A2uiDataModelEntry[] }[];\n}\n\n/** Chat-side state for a surface — wraps the wire-format `A2uiSurface`\n * with the per-component projection the progressive renderer consumes.\n * Both maps are kept in sync; the wire shape preserves existing\n * `surfaceToSpec` semantics, the view shape carries readiness. */\nexport interface A2uiSurfaceState {\n readonly surface: A2uiSurface;\n readonly componentViews: ReadonlyMap<string, A2uiComponentView>;\n}\n\nexport interface A2uiSurfaceStore {\n apply(message: A2uiMessage): void;\n /**\n * Live-stream entry point. Iterates envelopes and feeds each through\n * `apply()`. Records the tool_call_id so the wrapped-content classifier\n * can short-circuit duplicate dispatch when the final AIMessage arrives.\n */\n applyPartialArgs(toolCallId: string, envelopes: readonly A2uiMessage[]): void;\n /** True if a tool_call_id has produced live envelopes via applyPartialArgs. */\n isPartialLive(toolCallId: string): boolean;\n /** Wire-format surfaces, for downstream consumers (e.g. surfaceToSpec). */\n readonly surfaces: Signal<Map<string, A2uiSurface>>;\n surface(surfaceId: string): Signal<A2uiSurface | undefined>;\n /** Chat-side projections with per-component readiness. */\n readonly surfaceStates: Signal<Map<string, A2uiSurfaceState>>;\n surfaceState(surfaceId: string): Signal<A2uiSurfaceState | undefined>;\n}\n\nfunction entriesToObject(entries: A2uiDataModelEntry[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const e of entries) {\n if ('valueString' in e && e.valueString !== undefined) out[e.key] = e.valueString;\n else if ('valueNumber' in e && e.valueNumber !== undefined) out[e.key] = e.valueNumber;\n else if ('valueBoolean' in e && e.valueBoolean !== undefined) out[e.key] = e.valueBoolean;\n else if ('valueMap' in e && Array.isArray(e.valueMap)) out[e.key] = entriesToObject(e.valueMap);\n }\n return out;\n}\n\n/** Returns true if `path` (in `$.a.b.c` form) resolves to a defined,\n * non-null value inside `dataModel`. Used to decide per-component\n * readiness. */\nfunction isResolved(dataModel: Record<string, unknown>, path: string): boolean {\n const segments = path.startsWith('$.') ? path.slice(2).split('.') : path.split('.');\n let cur: unknown = dataModel;\n for (const seg of segments) {\n if (cur == null || typeof cur !== 'object') return false;\n cur = (cur as Record<string, unknown>)[seg];\n }\n return cur !== undefined && cur !== null;\n}\n\n/** Resolve `{$.path}` references in a value against the data model.\n * Strings that look like a single full reference are replaced with\n * the resolved value; partial-reference strings get string-substituted;\n * nested objects/arrays are recursed. */\nfunction resolveProps(value: unknown, dataModel: Record<string, unknown>): unknown {\n if (typeof value === 'string') {\n const full = value.match(/^\\{(\\$\\.[^}]+)\\}$/);\n if (full) {\n const segs = full[1].slice(2).split('.');\n let cur: unknown = dataModel;\n for (const s of segs) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[s];\n }\n return cur;\n }\n return value.replace(/\\{(\\$\\.[^}]+)\\}/g, (_, path: string) => {\n const segs = path.slice(2).split('.');\n let cur: unknown = dataModel;\n for (const s of segs) {\n if (cur == null || typeof cur !== 'object') return '';\n cur = (cur as Record<string, unknown>)[s];\n }\n return cur == null ? '' : String(cur);\n });\n }\n if (Array.isArray(value)) return value.map((v) => resolveProps(v, dataModel));\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = resolveProps(v, dataModel);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Create an {@link A2uiSurfaceStore} — the per-conversation store that buffers\n * streamed A2UI surface updates, tracks each surface's data model + lifecycle\n * state, and exposes them as signals for rendering. One store backs a chat\n * thread's A2UI surfaces.\n *\n * @returns A fresh, empty {@link A2uiSurfaceStore}.\n * @example\n * ```ts\n * const store = createA2uiSurfaceStore();\n * const surfaces = store.surfaces; // Signal<Map<string, A2uiSurface>>\n * ```\n */\nexport function createA2uiSurfaceStore(): A2uiSurfaceStore {\n const surfacesSignal = signal<Map<string, A2uiSurface>>(new Map());\n const surfaceStatesSignal = signal<Map<string, A2uiSurfaceState>>(new Map());\n const buffers = new Map<string, SurfaceBuffer>();\n\n function bufferOf(surfaceId: string): SurfaceBuffer {\n let b = buffers.get(surfaceId);\n if (!b) { b = { dataModelDeltas: [] }; buffers.set(surfaceId, b); }\n return b;\n }\n\n function apply(message: A2uiMessage): void {\n if ('surfaceUpdate' in message) {\n const upd = message.surfaceUpdate as A2uiSurfaceUpdate;\n const b = bufferOf(upd.surfaceId);\n const map = new Map<string, A2uiComponent>();\n for (const c of upd.components) map.set(c.id, c);\n b.components = map;\n // Project per-component views with bindings extracted from prop\n // expressions. ready starts false; props starts empty.\n const views = new Map<string, A2uiComponentView>();\n for (const c of upd.components) {\n const def = c.component;\n const typeKey = (def && typeof def === 'object')\n ? (Object.keys(def)[0] ?? 'Unknown')\n : 'Unknown';\n views.set(c.id, {\n id: c.id,\n type: typeKey,\n bindings: extractBindings(def),\n ready: false,\n props: {},\n def,\n });\n }\n b.componentViews = views;\n return;\n }\n if ('dataModelUpdate' in message) {\n const upd = message.dataModelUpdate as A2uiDataModelUpdate;\n const surface = surfacesSignal().get(upd.surfaceId);\n if (surface) {\n // Already-rendered surface: apply incrementally.\n let dataModel = surface.dataModel;\n const obj = entriesToObject(upd.contents);\n if (upd.path && upd.path !== '/') {\n for (const [k, v] of Object.entries(obj)) {\n dataModel = setByPointer(dataModel, `${upd.path}/${k}`, v);\n }\n } else {\n dataModel = { ...dataModel, ...obj };\n }\n const next = new Map(surfacesSignal());\n const nextSurface = { ...surface, dataModel };\n next.set(upd.surfaceId, nextSurface);\n surfacesSignal.set(next);\n\n // Recompute per-component readiness with the monotonic rule.\n const prevState = surfaceStatesSignal().get(upd.surfaceId);\n if (prevState) {\n const nextViews = new Map<string, A2uiComponentView>();\n for (const [id, v] of prevState.componentViews) {\n const allResolved = v.bindings.every((p) => isResolved(dataModel, p));\n // Monotonic: once ready=true, stays true even if a later\n // update clears a referenced path.\n const nextReady = v.ready || allResolved;\n nextViews.set(id, {\n ...v,\n ready: nextReady,\n props: nextReady\n ? (resolveProps(v.def, dataModel) as Record<string, unknown>)\n : v.props,\n });\n }\n const nextStatesMap = new Map(surfaceStatesSignal());\n nextStatesMap.set(upd.surfaceId, { surface: nextSurface, componentViews: nextViews });\n surfaceStatesSignal.set(nextStatesMap);\n }\n } else {\n // Pre-render: buffer the delta.\n const b = bufferOf(upd.surfaceId);\n b.dataModelDeltas.push({ path: upd.path, contents: upd.contents });\n }\n return;\n }\n if ('beginRendering' in message) {\n const begin = message.beginRendering as A2uiBeginRendering;\n const b = buffers.get(begin.surfaceId);\n if (!b || !b.components) return; // no surfaceUpdate yet — no-op\n // Build initial data model from buffered deltas.\n let dataModel: Record<string, unknown> = {};\n for (const d of b.dataModelDeltas) {\n const obj = entriesToObject(d.contents);\n if (d.path && d.path !== '/') {\n for (const [k, v] of Object.entries(obj)) {\n dataModel = setByPointer(dataModel, `${d.path}/${k}`, v);\n }\n } else {\n dataModel = { ...dataModel, ...obj };\n }\n }\n // Merge with any existing surface's dataModel if this is a re-render.\n const existing = surfacesSignal().get(begin.surfaceId);\n if (existing) {\n dataModel = { ...existing.dataModel, ...dataModel };\n }\n // Capture v1 styles (font, primaryColor) from beginRendering. A\n // re-render keeps any prior styles unless the new beginRendering\n // explicitly overrides them — this matches the agent's likely\n // intent (\"change the data, keep the look\").\n const nextStyles = begin.styles\n ?? existing?.styles;\n const surface: A2uiSurface = {\n surfaceId: begin.surfaceId,\n catalogId: 'basic',\n components: b.components,\n dataModel,\n ...(nextStyles ? { styles: nextStyles } : {}),\n };\n const next = new Map(surfacesSignal());\n next.set(begin.surfaceId, surface);\n surfacesSignal.set(next);\n\n // Project per-component views with initial readiness based on the\n // accumulated data model.\n const baseViews = b.componentViews ?? new Map<string, A2uiComponentView>();\n const initialViews = new Map<string, A2uiComponentView>();\n for (const [id, v] of baseViews) {\n const allResolved = v.bindings.every((p) => isResolved(dataModel, p));\n initialViews.set(id, {\n ...v,\n ready: allResolved,\n props: allResolved\n ? (resolveProps(v.def, dataModel) as Record<string, unknown>)\n : {},\n });\n }\n const nextStates = new Map(surfaceStatesSignal());\n nextStates.set(begin.surfaceId, { surface, componentViews: initialViews });\n surfaceStatesSignal.set(nextStates);\n\n // Reset buffer so subsequent surfaceUpdate is the next round.\n buffers.set(begin.surfaceId, { dataModelDeltas: [] });\n return;\n }\n if ('deleteSurface' in message) {\n const del = message.deleteSurface as A2uiDeleteSurface;\n buffers.delete(del.surfaceId);\n const next = new Map(surfacesSignal());\n next.delete(del.surfaceId);\n surfacesSignal.set(next);\n const nextStates = new Map(surfaceStatesSignal());\n nextStates.delete(del.surfaceId);\n surfaceStatesSignal.set(nextStates);\n return;\n }\n }\n\n function surface(surfaceId: string): Signal<A2uiSurface | undefined> {\n return computed(() => surfacesSignal().get(surfaceId));\n }\n\n function surfaceState(surfaceId: string): Signal<A2uiSurfaceState | undefined> {\n return computed(() => surfaceStatesSignal().get(surfaceId));\n }\n\n const liveTools = new Set<string>();\n\n function applyPartialArgs(\n toolCallId: string,\n envelopes: readonly A2uiMessage[],\n ): void {\n liveTools.add(toolCallId);\n for (const env of envelopes) {\n apply(env);\n }\n }\n\n function isPartialLive(toolCallId: string): boolean {\n return liveTools.has(toolCallId);\n }\n\n return {\n apply,\n applyPartialArgs,\n isPartialLive,\n surfaces: surfacesSignal.asReadonly(),\n surface,\n surfaceStates: surfaceStatesSignal.asReadonly(),\n surfaceState,\n };\n}\n","// libs/chat/src/lib/streaming/trace.ts\n// SPDX-License-Identifier: MIT\n//\n// localStorage / window-flag-gated debug tracer for @threadplane/chat streaming.\n// Off by default. Enable via:\n// window.__threadplaneChatTrace = true\n// localStorage.THREADPLANE_CHAT_STREAM_TRACE = '1'\n//\n// All call sites should be guarded with `if (isTraceEnabled())` so the\n// argument-collection cost is paid only when tracing is on.\n\nexport function isTraceEnabled(): boolean {\n if (typeof globalThis === 'undefined') return false;\n const win = (globalThis as { window?: { __threadplaneChatTrace?: boolean; localStorage?: Storage } }).window;\n if (!win) return false;\n if (win.__threadplaneChatTrace === true) return true;\n try {\n return win.localStorage?.getItem('THREADPLANE_CHAT_STREAM_TRACE') === '1';\n } catch {\n return false;\n }\n}\n\nexport function trace(...args: unknown[]): void {\n if (isTraceEnabled()) {\n // eslint-disable-next-line no-console\n console.debug('[ngaf-chat-stream]', ...args);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, untracked, type Signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { createPartialJsonParser } from '@cacheplane/partial-json';\nimport { createParseTreeStore, type ElementAccumulationState, type ParseTreeStore } from './parse-tree-store';\nimport { createA2uiMessageParser, type A2uiMessageParser } from '@threadplane/a2ui';\nimport type { A2uiSurface } from '@threadplane/a2ui';\nimport { createA2uiSurfaceStore, type A2uiSurfaceStore, type A2uiSurfaceState } from '../a2ui/surface-store';\nimport { isTraceEnabled, trace } from './trace';\n\nexport type ContentType = 'pending' | 'markdown' | 'json-render' | 'a2ui' | 'mixed';\n\nconst A2UI_PREFIX = '---a2ui_JSON---';\n\nexport interface ContentClassifier {\n update(content: string): void;\n readonly type: Signal<ContentType>;\n readonly markdown: Signal<string>;\n readonly spec: Signal<Spec | null>;\n readonly elementStates: Signal<Map<string, ElementAccumulationState>>;\n readonly a2uiSurfaces: Signal<Map<string, A2uiSurface>>;\n readonly a2uiSurfaceStates: Signal<Map<string, A2uiSurfaceState>>;\n readonly streaming: Signal<boolean>;\n readonly errors: Signal<string[]>;\n dispose(): void;\n}\n\n/**\n * Create a {@link ContentClassifier} — the streaming accumulator that inspects\n * an assistant message's content as it arrives and classifies it (markdown vs a\n * generative-UI/A2UI spec), exposing the parsed result and per-element state as\n * signals so the renderer can switch modes mid-stream.\n *\n * @returns A fresh {@link ContentClassifier}; call `dispose()` when done.\n * @example\n * ```ts\n * const cc = createContentClassifier();\n * effect(() => console.log(cc.type())); // 'pending' | 'markdown' | 'spec'\n * ```\n */\nexport function createContentClassifier(): ContentClassifier {\n const typeSignal = signal<ContentType>('pending');\n const markdownSignal = signal<string>('');\n const specSignal = signal<Spec | null>(null);\n const elementStatesSignal = signal<Map<string, ElementAccumulationState>>(new Map());\n const streamingSignal = signal<boolean>(false);\n const errorsSignal = signal<string[]>([]);\n\n let processedLength = 0;\n let store: ParseTreeStore | null = null;\n let jsonStartIndex = 0;\n\n let a2uiParser: A2uiMessageParser | null = null;\n let a2uiStore: A2uiSurfaceStore | null = null;\n const a2uiSurfacesSignal = signal<Map<string, A2uiSurface>>(new Map());\n const a2uiSurfaceStatesSignal = signal<Map<string, A2uiSurfaceState>>(new Map());\n\n /**\n * Decide the content type from the first non-whitespace character.\n * Returns 'pending' when:\n * - content is empty or all whitespace, OR\n * - the first non-whitespace char is '-' AND content is too short to\n * confirm or disprove the full A2UI_PREFIX (the \"patience\" case).\n * Once we have at least A2UI_PREFIX.length non-prefix chars after the\n * first '-', we commit to either 'a2ui' (full match) or 'markdown'\n * (definitively not the prefix).\n */\n function detectType(content: string): ContentType {\n for (let i = 0; i < content.length; i++) {\n const ch = content[i];\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') continue;\n\n if (ch === '{') {\n return 'json-render';\n }\n\n if (ch === '-') {\n if (content.startsWith(A2UI_PREFIX, i)) {\n return 'a2ui';\n }\n const remaining = content.length - i;\n if (remaining < A2UI_PREFIX.length) {\n const candidate = content.slice(i);\n if (A2UI_PREFIX.startsWith(candidate)) {\n return 'pending';\n }\n return 'markdown';\n }\n return 'markdown';\n }\n\n return 'markdown';\n }\n return 'pending';\n }\n\n function initJsonStore(jsonContent: string): void {\n const parser = createPartialJsonParser();\n store = createParseTreeStore(parser);\n if (jsonContent.length > 0) {\n store.push(jsonContent);\n }\n syncJsonSignals();\n }\n\n function syncJsonSignals(): void {\n if (!store) return;\n specSignal.set(store.spec());\n elementStatesSignal.set(store.elementStates());\n\n const spec = store.spec();\n if (spec) {\n streamingSignal.set(isStillStreaming());\n } else {\n streamingSignal.set(true);\n }\n }\n\n function isStillStreaming(): boolean {\n if (!store) return false;\n const states = store.elementStates();\n for (const state of states.values()) {\n if (state.streaming) return true;\n }\n const spec = store.spec();\n if (!spec || !spec.root || !spec.elements) return true;\n return false;\n }\n\n function resetState(): void {\n typeSignal.set('pending');\n markdownSignal.set('');\n specSignal.set(null);\n elementStatesSignal.set(new Map());\n streamingSignal.set(false);\n errorsSignal.set([]);\n processedLength = 0;\n store = null;\n jsonStartIndex = 0;\n a2uiParser = null;\n a2uiStore = null;\n a2uiSurfacesSignal.set(new Map());\n a2uiSurfaceStatesSignal.set(new Map());\n }\n\n function update(content: string): void {\n // Wrap in untracked() because this is called during template rendering\n // (via classifyMessage in ChatComponent's AI message template). Angular's\n // NG0600 forbids writing signals during change detection; untracked()\n // opts out of the reactive graph for this imperative push-based update.\n untracked(() => {\n // If content shrunk vs. last seen length, the underlying message was\n // replaced (e.g. via langgraph RemoveMessage / id-match content\n // replacement followed by force-refresh-from-server). Reset state so\n // the new content is classified fresh — otherwise the classifier\n // keeps the streamed (pre-mutation) markdown/json type and the UI\n // never updates.\n if (content.length < processedLength) {\n resetState();\n }\n const currentType = typeSignal();\n\n if (currentType === 'pending') {\n const detected = detectType(content);\n if (detected === 'pending') return;\n\n typeSignal.set(detected);\n\n if (detected === 'markdown') {\n markdownSignal.set(content);\n processedLength = content.length;\n } else if (detected === 'json-render') {\n streamingSignal.set(true);\n jsonStartIndex = 0;\n for (let i = 0; i < content.length; i++) {\n if (content[i] !== ' ' && content[i] !== '\\t' && content[i] !== '\\n' && content[i] !== '\\r') {\n jsonStartIndex = i;\n break;\n }\n }\n const jsonContent = content.slice(jsonStartIndex);\n try {\n initJsonStore(jsonContent);\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n processedLength = content.length;\n } else if (detected === 'a2ui') {\n streamingSignal.set(true);\n a2uiParser = createA2uiMessageParser();\n a2uiStore = createA2uiSurfaceStore();\n jsonStartIndex = content.indexOf(A2UI_PREFIX) + A2UI_PREFIX.length;\n const a2uiContent = content.slice(jsonStartIndex);\n if (a2uiContent.length > 0) {\n try {\n const msgs = a2uiParser.push(a2uiContent);\n for (const msg of msgs) a2uiStore.apply(msg);\n a2uiSurfacesSignal.set(a2uiStore.surfaces());\n a2uiSurfaceStatesSignal.set(a2uiStore.surfaceStates());\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n }\n processedLength = content.length;\n }\n return;\n }\n\n // Compute delta\n const delta = content.slice(processedLength);\n processedLength = content.length;\n\n if (delta.length === 0) return;\n\n if (currentType === 'markdown' || currentType === 'mixed') {\n markdownSignal.set(content);\n } else if (currentType === 'json-render') {\n if (store) {\n try {\n store.push(delta);\n syncJsonSignals();\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n }\n } else if (currentType === 'a2ui') {\n if (a2uiParser && a2uiStore) {\n try {\n const msgs = a2uiParser.push(delta);\n for (const msg of msgs) a2uiStore.apply(msg);\n a2uiSurfacesSignal.set(a2uiStore.surfaces());\n a2uiSurfaceStatesSignal.set(a2uiStore.surfaceStates());\n } catch (err) {\n errorsSignal.update(prev => [...prev, err instanceof Error ? err.message : String(err)]);\n }\n }\n }\n\n if (isTraceEnabled()) {\n trace('classifier.update', { contentLength: content.length, type: typeSignal() });\n }\n });\n }\n\n function dispose(): void {\n store = null;\n a2uiParser = null;\n a2uiStore = null;\n }\n\n return {\n update,\n type: typeSignal.asReadonly(),\n markdown: markdownSignal.asReadonly(),\n spec: specSignal.asReadonly(),\n elementStates: elementStatesSignal.asReadonly(),\n a2uiSurfaces: a2uiSurfacesSignal.asReadonly(),\n a2uiSurfaceStates: a2uiSurfaceStatesSignal.asReadonly(),\n streaming: streamingSignal.asReadonly(),\n errors: errorsSignal.asReadonly(),\n dispose,\n };\n}\n","// libs/chat/src/lib/a2ui/envelope-normalizer.ts\n// SPDX-License-Identifier: MIT\n\nconst ENVELOPE_KEYS = ['surfaceUpdate', 'beginRendering', 'dataModelUpdate', 'deleteSurface'] as const;\n\n/**\n * The parent LLM may emit envelope-tool arguments in four shapes (observed in\n * the spike across gpt-5-mini and gpt-5): the canonical {envelopes: [...]},\n * a singular typo {envelope: [...]}, positional keys {0: env, 1: env, ...}\n * when the model treats the args as the array, or a flat single envelope.\n * This pure function maps all four into a canonical envelope list.\n *\n * Strict-mode tool binding (OpenAI) should eliminate the non-canonical\n * shapes in production, but the normalizer is the safety net.\n */\nexport function normalizeEnvelopeArgs(\n args: Record<string, unknown> | null | undefined,\n): unknown[] | null {\n if (!args || typeof args !== 'object' || Array.isArray(args)) return null;\n\n // (a) canonical: { envelopes: [...] }\n if (Array.isArray((args as { envelopes?: unknown }).envelopes)) {\n return (args as { envelopes: unknown[] }).envelopes;\n }\n // (b) singular typo: { envelope: [...] }\n if (Array.isArray((args as { envelope?: unknown }).envelope)) {\n return (args as { envelope: unknown[] }).envelope;\n }\n const keys = Object.keys(args);\n if (keys.length === 0) return null;\n // (c) positional keys: { 0: env, 1: env, ... }\n if (keys.every((k) => /^\\d+$/.test(k))) {\n return keys\n .map((k) => Number(k))\n .sort((a, b) => a - b)\n .map((k) => (args as Record<string, unknown>)[String(k)]);\n }\n // (d) flat single envelope: { surfaceUpdate: {...} } | { beginRendering: ... } | etc\n if (ENVELOPE_KEYS.some((k) => k in args)) {\n return [args];\n }\n return null;\n}\n","// libs/chat/src/lib/a2ui/partial-args-bridge.ts\n// SPDX-License-Identifier: MIT\nimport { createPartialJsonParser, materialize } from '@cacheplane/partial-json';\nimport type { A2uiMessage, A2uiSurfaceUpdate } from '@threadplane/a2ui';\nimport type { A2uiSurfaceStore } from './surface-store';\nimport { normalizeEnvelopeArgs } from './envelope-normalizer';\n\nexport interface PartialArgsBridge {\n /**\n * Replace the cumulative argument-string buffer for `toolCallId` with\n * `argsSoFar` and re-extract any newly-complete envelopes. The args\n * string is expected to grow monotonically.\n */\n push(toolCallId: string, argsSoFar: string): void;\n /** True if a tool_call_id has been poisoned by malformed input. */\n isPoisoned(toolCallId: string): boolean;\n}\n\ninterface BridgeState {\n parser: ReturnType<typeof createPartialJsonParser>;\n /** Number of envelopes already dispatched to the store. */\n dispatchedCount: number;\n /**\n * Have we dispatched the initial surfaceUpdate + synthesised beginRendering\n * pair for this turn yet? Until true, dispatch is deferred — we wait for\n * the first surfaceUpdate to have at least one component with an `id` so\n * `pickRoot` can target a real root and the surface actually mounts.\n */\n surfacePairDispatched: boolean;\n /** surfaceId the synthesised beginRendering targets (to avoid double-mounting). */\n synthesisedSurfaceId: string | null;\n /** Once true, all subsequent pushes are ignored. */\n poisoned: boolean;\n}\n\n/**\n * Validate that `s` is a syntactically plausible JSON prefix. We can't\n * `JSON.parse` an incomplete string, so we run a lightweight scanner that\n * follows the grammar and tolerates only truncation at the right edge.\n * Returns false if any character violates JSON syntax mid-stream.\n *\n * The partial-json parser silently halts on bad input (setting an internal\n * error flag that is not exposed through its public API), so we use this\n * pre-check to detect poisoned streams.\n */\nfunction isValidJsonPrefix(s: string): boolean {\n // Stack of expected closers: '}' for objects, ']' for arrays,\n // 'k' (object key expected), 'v' (value expected), ',' or ':'.\n // We model JSON with a small state machine. Returns true if the input\n // is consumable as a prefix of some valid JSON document.\n let i = 0;\n const len = s.length;\n // Outer state: 'value' (expecting any value), 'object-key' (after `{`\n // or `,`), 'after-key' (after a key string, expect `:`), 'after-value'\n // (after a value, expect `,` or matching close).\n type Frame = { container: 'object' | 'array' };\n const stack: Frame[] = [];\n let state: 'value' | 'object-key' | 'after-key' | 'after-value' = 'value';\n\n function skipWs(): void {\n while (i < len) {\n const c = s.charCodeAt(i);\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d) i++;\n else break;\n }\n }\n\n function scanString(): boolean {\n // Already at opening quote\n if (s[i] !== '\"') return false;\n i++;\n while (i < len) {\n const c = s[i];\n if (c === '\\\\') {\n i++;\n if (i >= len) return true; // truncated escape\n i++;\n continue;\n }\n if (c === '\"') { i++; return true; }\n i++;\n }\n // Truncated mid-string is OK for a prefix.\n return true;\n }\n\n function scanLiteral(lit: string): boolean {\n // Match as much of `lit` as remains in input. Truncation OK.\n let j = 0;\n while (i < len && j < lit.length) {\n if (s[i] !== lit[j]) return false;\n i++; j++;\n }\n return true;\n }\n\n function scanNumber(): boolean {\n // Lenient: consume digits, '.', 'e', 'E', '+', '-' starting from current\n if (s[i] === '-') i++;\n while (i < len) {\n const c = s[i];\n if ((c >= '0' && c <= '9') || c === '.' || c === 'e' || c === 'E' || c === '+' || c === '-') i++;\n else break;\n }\n return true;\n }\n\n while (i < len) {\n skipWs();\n if (i >= len) break;\n const c = s[i];\n\n if (state === 'value') {\n if (c === '{') {\n i++; stack.push({ container: 'object' }); state = 'object-key';\n } else if (c === '[') {\n i++; stack.push({ container: 'array' }); state = 'value';\n } else if (c === '\"') {\n if (!scanString()) return false;\n state = 'after-value';\n } else if (c === 't') { if (!scanLiteral('true')) return false; state = 'after-value'; }\n else if (c === 'f') { if (!scanLiteral('false')) return false; state = 'after-value'; }\n else if (c === 'n') { if (!scanLiteral('null')) return false; state = 'after-value'; }\n else if (c === '-' || (c >= '0' && c <= '9')) { if (!scanNumber()) return false; state = 'after-value'; }\n else if (c === ']' && stack.length > 0 && stack[stack.length - 1].container === 'array') {\n // empty array close\n i++; stack.pop(); state = 'after-value';\n } else {\n return false;\n }\n } else if (state === 'object-key') {\n if (c === '\"') {\n if (!scanString()) return false;\n state = 'after-key';\n } else if (c === '}' && stack.length > 0 && stack[stack.length - 1].container === 'object') {\n i++; stack.pop(); state = 'after-value';\n } else {\n return false;\n }\n } else if (state === 'after-key') {\n if (c === ':') { i++; state = 'value'; }\n else return false;\n } else if (state === 'after-value') {\n if (stack.length === 0) {\n // Trailing content after top-level value is invalid.\n return false;\n }\n const top = stack[stack.length - 1];\n if (c === ',') {\n i++;\n state = top.container === 'object' ? 'object-key' : 'value';\n } else if (c === '}' && top.container === 'object') {\n i++; stack.pop(); state = 'after-value';\n } else if (c === ']' && top.container === 'array') {\n i++; stack.pop(); state = 'after-value';\n } else {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Subscribes to LangGraph custom events of name 'a2ui-partial' and feeds\n * the surface store envelope-by-envelope as the parent LLM streams its\n * tool_call.arguments JSON. Uses @cacheplane/partial-json to extract\n * structurally-complete envelope objects from the growing args string.\n *\n * Synthesis safety net: if the first complete surfaceUpdate arrives and\n * no beginRendering has been extracted yet, the bridge synthesises one\n * targeted at the surfaceUpdate's first component (preferring id='root'\n * if present). This makes the surface mount IMMEDIATELY after the first\n * surfaceUpdate parses — without waiting for the LLM to emit beginRendering\n * at the end of its envelope list — so the render-element fallback gate\n * (PR #252) actually fires while dataModelUpdates flow in.\n *\n * The store's apply() already treats repeated beginRendering for the same\n * surfaceId as idempotent (just re-applies styles), so the LLM's eventual\n * beginRendering (if any) is a no-op rather than a conflict.\n */\nexport function createPartialArgsBridge(store: A2uiSurfaceStore): PartialArgsBridge {\n const states = new Map<string, BridgeState>();\n\n function stateOf(toolCallId: string): BridgeState {\n let s = states.get(toolCallId);\n if (!s) {\n s = {\n parser: createPartialJsonParser(),\n dispatchedCount: 0,\n surfacePairDispatched: false,\n synthesisedSurfaceId: null,\n poisoned: false,\n };\n states.set(toolCallId, s);\n }\n return s;\n }\n\n function pickRoot(components: readonly { id: string }[]): string | null {\n if (components.length === 0) return null;\n const explicitRoot = components.find((c) => c.id === 'root');\n return explicitRoot ? explicitRoot.id : components[0].id;\n }\n\n function push(toolCallId: string, argsSoFar: string): void {\n const state = stateOf(toolCallId);\n if (state.poisoned) return;\n // Pre-check: poison if the args string isn't a valid JSON prefix.\n if (!isValidJsonPrefix(argsSoFar)) {\n state.poisoned = true;\n return;\n }\n try {\n // Reset the parser to a fresh state and feed the entire cumulative\n // string. The parser is monotonic — same input always yields the\n // same tree — so re-parsing is safe and avoids delta-tracking bugs.\n state.parser = createPartialJsonParser();\n state.parser.push(argsSoFar);\n } catch {\n state.poisoned = true;\n return;\n }\n const rootNode = state.parser.getByPath('/');\n if (!rootNode) return;\n const materialised = materialize(rootNode) as Record<string, unknown> | null;\n if (!materialised || typeof materialised !== 'object') return;\n const envelopes = normalizeEnvelopeArgs(materialised);\n if (!envelopes) return;\n\n // Phase 1: defer initial dispatch until the first envelope is a complete\n // surfaceUpdate whose components include at least one entry with an `id`\n // — otherwise pickRoot returns null and synthesis silently no-ops, leaving\n // the surface unmounted forever. Once we have a pickable root, dispatch\n // the surfaceUpdate AND a synthesised beginRendering as an atomic pair.\n if (!state.surfacePairDispatched) {\n const firstEnv = envelopes[0] as A2uiMessage | undefined;\n if (!firstEnv || !('surfaceUpdate' in firstEnv)) return;\n if (!isStructurallyComplete(firstEnv)) return;\n const upd = (firstEnv as { surfaceUpdate: A2uiSurfaceUpdate }).surfaceUpdate;\n if (upd.components.length === 0) return;\n const root = pickRoot(upd.components);\n if (!root) return;\n state.surfacePairDispatched = true;\n state.dispatchedCount = 1; // index 0 = the surfaceUpdate we just sent\n state.synthesisedSurfaceId = upd.surfaceId;\n store.applyPartialArgs(toolCallId, [\n firstEnv,\n { beginRendering: { surfaceId: upd.surfaceId, root } },\n ]);\n }\n\n // Phase 2: dispatch any newly-complete envelopes beyond the initial pair.\n const newEnvelopes: A2uiMessage[] = [];\n for (let i = state.dispatchedCount; i < envelopes.length; i++) {\n const env = envelopes[i] as A2uiMessage;\n if (!isStructurallyComplete(env)) {\n // Stop at the first not-yet-complete envelope; later siblings can't\n // exist before earlier ones complete (envelopes are an ordered list).\n break;\n }\n // Skip a \"real\" beginRendering for the synthesised surface — the store\n // already treats it as idempotent (just re-applies styles), but we\n // advance past it so dispatchedCount stays in sync with the index.\n if (\n 'beginRendering' in env &&\n (env as { beginRendering: { surfaceId?: string } }).beginRendering.surfaceId ===\n state.synthesisedSurfaceId\n ) {\n state.dispatchedCount = i + 1;\n continue;\n }\n newEnvelopes.push(env);\n state.dispatchedCount = i + 1;\n }\n if (newEnvelopes.length > 0) {\n store.applyPartialArgs(toolCallId, newEnvelopes);\n }\n }\n\n function isPoisoned(toolCallId: string): boolean {\n return stateOf(toolCallId).poisoned;\n }\n\n return { push, isPoisoned };\n}\n\n/** True if the envelope has a recognised discriminator key with an object value. */\nfunction isStructurallyComplete(env: unknown): env is A2uiMessage {\n if (!env || typeof env !== 'object' || Array.isArray(env)) return false;\n const obj = env as Record<string, unknown>;\n for (const k of ['surfaceUpdate', 'beginRendering', 'dataModelUpdate', 'deleteSurface']) {\n if (k in obj && typeof obj[k] === 'object' && obj[k] !== null) {\n // For surfaceUpdate, also require non-undefined surfaceId + components.\n if (k === 'surfaceUpdate') {\n const su = obj[k] as { surfaceId?: unknown; components?: unknown };\n return typeof su.surfaceId === 'string' && Array.isArray(su.components);\n }\n return true;\n }\n }\n return false;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Synthesize a short human-readable label for a serialized A2UI action\n * message, so the chat composition can render \"Search flights\" instead\n * of a raw `{\"version\":\"v1\",\"action\":...}` JSON dump as a user bubble.\n *\n * Per the A2UI spec, action messages flow on the client → agent\n * return channel and are framed as typed events (closer to tool calls\n * than user utterances). The spec is silent on chat-bubble rendering;\n * Google's \"A2UI in Practice\" article and the Stream Chat reference\n * both warn against modeling actions as chat-history user turns.\n *\n * Label source priority:\n * 1. `action.label` if present — populated by `buildA2uiActionMessage`\n * from the source component's authored visible text (e.g. a\n * Button's child Text literalString). This is the LLM-authored\n * label and the preferred source.\n * 2. CamelCase humanization of `action.name` (`bookingSubmit` →\n * \"Booking submit\"). Used when no label was stamped — typically\n * because the source component isn't a Button-with-Text-child.\n *\n * Returns null for any content that isn't a v1 A2UI action message;\n * callers should fall back to the original content in that case.\n *\n * Design context: a previous iteration shipped a hardcoded\n * `KNOWN_LABELS` map (bookingSubmit → 'Search flights') that embedded\n * app-specific knowledge in the chat-lib primitive. That map was\n * removed in favor of derivation from the authored UI; see spec\n * 2026-05-19-llm-generated-labels-design.md.\n *\n * Sources:\n * - https://a2ui.org/specification/v0.9-a2ui/\n * - https://medium.com/google-cloud/a2ui-in-practice-patterns-pitfalls-and-the-messages-that-hold-it-together-658720b83789\n * - https://getstream.io/blog/a2ui-chat-integration/\n */\n\nexport function a2uiActionLabel(content: string): string | null {\n if (typeof content !== 'string' || content.length === 0) return null;\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('{')) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return null;\n }\n if (!isRecord(parsed)) return null;\n if (parsed['version'] !== 'v1') return null;\n const action = parsed['action'];\n if (!isRecord(action)) return null;\n const name = action['name'];\n if (typeof name !== 'string' || name.length === 0) return null;\n\n // Preferred: label stamped at emit time by buildA2uiActionMessage from\n // the source component's authored visible text.\n const authoredLabel = action['label'];\n if (typeof authoredLabel === 'string' && authoredLabel.length > 0) {\n return authoredLabel;\n }\n\n // Fallback: humanize the camelCase action name.\n return humanizeCamelCase(name);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** \"bookingSubmit\" → \"Booking submit\". \"addToCart\" → \"Add to cart\". */\nfunction humanizeCamelCase(name: string): string {\n const spaced = name.replace(/([a-z])([A-Z])/g, '$1 $2');\n const lower = spaced.toLowerCase();\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n}\n","// SPDX-License-Identifier: MIT\nimport type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Extracts a human-readable string from a message's content.\n *\n * `BaseMessage.content` is `string | MessageContentComplex[]`. Reasoning-\n * capable models (OpenAI gpt-5/o-series, Anthropic) emit complex arrays of\n * typed blocks: `{type:'text',text}`, `{type:'reasoning',...}`, tool-use\n * blocks, etc. We render only the visible text portions and skip anything\n * else. Stringifying the whole array would dump raw JSON like\n * `[{\"type\":\"text\",...}]` into the chat bubble.\n */\nexport function messageContent(message: BaseMessage): string {\n return extractText(message.content);\n}\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let out = '';\n for (const block of content) {\n if (typeof block === 'string') {\n out += block;\n continue;\n }\n if (!isRecord(block)) continue;\n const t = block['type'];\n if (t === 'text' || t === 'output_text' || t === undefined) {\n const text = block['text'];\n if (typeof text === 'string') out += text;\n }\n // Skip reasoning, tool_use, image, etc. — not chat-bubble content.\n }\n return out;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// libs/chat/src/lib/compositions/chat/chat.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, ChangeDetectionStrategy, input, model, output, computed, effect, signal, untracked, viewChild, ElementRef,\n DestroyRef, inject, Injector, runInInjectionContext,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KeyValuePipe } from '@angular/common';\nimport type { Agent, Message } from '../../agent';\nimport { ChatReasoningComponent } from '../../primitives/chat-reasoning/chat-reasoning.component';\nimport type { ViewRegistry, RenderEvent } from '@threadplane/render';\nimport type { A2uiActionMessage } from '@threadplane/a2ui';\nimport type { StateStore } from '@json-render/core';\nimport { toRenderRegistry, signalStateStore, withViews } from '@threadplane/render';\nimport type { ClientToolRegistry } from '../../client-tools/tool-def';\nimport { createClientToolsCoordinator } from '../../client-tools/client-tools-coordinator';\nimport { ChatWindowComponent } from '../../primitives/chat-window/chat-window.component';\nimport { ChatMessageListComponent } from '../../primitives/chat-message-list/chat-message-list.component';\nimport { MessageTemplateDirective } from '../../primitives/chat-message-list/message-template.directive';\nimport { ChatMessageComponent, type ChatMessageRole } from '../../primitives/chat-message/chat-message.component';\nimport { ChatInputComponent } from '../../primitives/chat-input/chat-input.component';\nimport { ChatTypingIndicatorComponent } from '../../primitives/chat-typing-indicator/chat-typing-indicator.component';\nimport { ChatErrorComponent } from '../../primitives/chat-error/chat-error.component';\nimport { ChatThreadListComponent, type Thread } from '../../primitives/chat-thread-list/chat-thread-list.component';\nimport { ChatGenerativeUiComponent } from '../../primitives/chat-generative-ui/chat-generative-ui.component';\nimport { ChatToolViewsComponent } from '../../primitives/chat-tool-views/chat-tool-views.component';\nimport { ChatStreamingMdComponent } from '../../streaming/streaming-markdown.component';\nimport { ChatToolCallsComponent } from '../../primitives/chat-tool-calls/chat-tool-calls.component';\nimport { ChatMessageActionsComponent } from '../../primitives/chat-message-actions/chat-message-actions.component';\nimport { ChatWelcomeComponent } from '../../primitives/chat-welcome/chat-welcome.component';\nimport { ChatSelectComponent, type ChatSelectOption } from '../../primitives/chat-select/chat-select.component';\nimport { A2uiSurfaceComponent } from '../../a2ui/surface.component';\nimport { ChatScrollBubbleComponent } from '../../primitives/chat-scroll-bubble/chat-scroll-bubble.component';\nimport { createContentClassifier, type ContentClassifier } from '../../streaming/content-classifier';\nimport { createPartialArgsBridge, type PartialArgsBridge } from '../../a2ui/partial-args-bridge';\nimport { createA2uiSurfaceStore, type A2uiSurfaceStore } from '../../a2ui/surface-store';\nimport { a2uiActionLabel } from '../../a2ui/action-label';\nimport { messageContent } from '../shared/message-utils';\nimport { CHAT_HOST_TOKENS, ensureChatRootStyles } from '../../styles/chat-tokens';\nimport type { ChatRenderEvent } from './chat-render-event';\nimport { CHAT_LIFECYCLE, type ChatLifecycle } from '../../lifecycle';\n\n/**\n * Internal helper: WritableSignals backing the readonly ChatLifecycle surface\n * exposed via CHAT_LIFECYCLE. ChatComponent populates these as the user\n * interacts; consumers (e.g. cockpit-telemetry) only see the readonly view.\n */\ninterface ChatLifecycleInternal extends ChatLifecycle {\n _internal: {\n componentReady: ReturnType<typeof signal<boolean>>;\n firstMessageSent: ReturnType<typeof signal<boolean>>;\n messageCount: ReturnType<typeof signal<number>>;\n inputSubmittedAt: ReturnType<typeof signal<number | null>>;\n };\n}\n\nfunction createChatLifecycle(): ChatLifecycleInternal {\n const componentReady = signal(false);\n const firstMessageSent = signal(false);\n const messageCount = signal(0);\n const inputSubmittedAt = signal<number | null>(null);\n return {\n componentReady: componentReady.asReadonly(),\n firstMessageSent: firstMessageSent.asReadonly(),\n messageCount: messageCount.asReadonly(),\n inputSubmittedAt: inputSubmittedAt.asReadonly(),\n _internal: { componentReady, firstMessageSent, messageCount, inputSubmittedAt },\n };\n}\n\n/**\n * Returns true when the scroll position is within `tolerance` px of the bottom.\n * Pure helper extracted for unit testing.\n */\nexport function isPinned(\n scrollHeight: number,\n scrollTop: number,\n clientHeight: number,\n tolerance = 150,\n): boolean {\n return scrollHeight - scrollTop - clientHeight < tolerance;\n}\n\n@Component({\n selector: 'chat',\n standalone: true,\n imports: [\n KeyValuePipe,\n ChatWindowComponent, ChatMessageListComponent, MessageTemplateDirective, ChatMessageComponent,\n ChatInputComponent, ChatTypingIndicatorComponent, ChatErrorComponent,\n ChatThreadListComponent, ChatGenerativeUiComponent,\n ChatStreamingMdComponent, ChatToolCallsComponent, ChatToolViewsComponent, A2uiSurfaceComponent,\n ChatMessageActionsComponent, ChatWelcomeComponent, ChatSelectComponent, ChatReasoningComponent,\n ChatScrollBubbleComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: CHAT_LIFECYCLE, useFactory: createChatLifecycle },\n ],\n styles: [CHAT_HOST_TOKENS, `\n :host {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n height: 100%;\n min-height: 0;\n max-height: 100%;\n overflow: hidden;\n background: var(--ngaf-chat-bg);\n }\n :host > chat-welcome {\n display: flex;\n flex: 1 1 auto;\n width: 100%;\n }\n .chat-shell { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .chat-shell__sidebar {\n width: 240px;\n flex-shrink: 0;\n border-right: 1px solid var(--ngaf-chat-separator);\n background: var(--ngaf-chat-surface-alt);\n overflow-y: auto;\n display: none;\n }\n @media (min-width: 768px) { .chat-shell__sidebar { display: block; } }\n .chat-shell__main { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; }\n .chat-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 60px 20px;\n color: var(--ngaf-chat-text-muted);\n text-align: center;\n flex: 1;\n min-height: 0;\n }\n .chat-empty[hidden] { display: none; }\n .chat-empty__title { font-size: 1.125rem; font-weight: 500; color: var(--ngaf-chat-text); margin: 0; }\n .chat-empty__sub { margin: 0; font-size: var(--ngaf-chat-font-size-sm); }\n .chat-empty__title { font-size: 1.125rem; font-weight: 500; color: var(--ngaf-chat-text); margin: 0; }\n .chat-empty__sub { margin: 0; font-size: var(--ngaf-chat-font-size-sm); }\n .chat-scroll { flex: 1; min-height: 0; overflow-y: auto; padding-top: var(--ngaf-chat-edge-pad); }\n .chat-scroll::-webkit-scrollbar { width: 6px; }\n .chat-scroll::-webkit-scrollbar-thumb { background: var(--ngaf-chat-separator); border-radius: 10px; }\n [chatFooter] {\n padding-bottom: var(--ngaf-chat-edge-pad);\n }\n .chat-footer-wrap { position: relative; }\n `],\n template: `\n @if (showWelcome()) {\n <chat-welcome>\n <chat-input chatWelcomeInput [agent]=\"agent()\" [submitOnEnter]=\"true\" placeholder=\"Type a message...\">\n @if (showModelPicker() && modelOptions().length > 0) {\n <chat-select\n chatInputModelSelect\n [options]=\"modelOptions()\"\n [(value)]=\"selectedModel\"\n [placeholder]=\"modelPickerPlaceholder()\"\n />\n }\n </chat-input>\n <ng-container ngProjectAs=\"[chatWelcomeSuggestions]\">\n <ng-content select=\"[chatWelcomeSuggestions]\" />\n </ng-container>\n </chat-welcome>\n } @else {\n <div class=\"chat-shell\">\n @if (threads().length > 0) {\n <aside class=\"chat-shell__sidebar\">\n <chat-thread-list\n [threads]=\"threads()\"\n [activeThreadId]=\"activeThreadId()\"\n (threadSelected)=\"threadSelected.emit($event)\"\n />\n </aside>\n }\n <div class=\"chat-shell__main\">\n <chat-window>\n <ng-content select=\"[chatHeader]\" chatHeader />\n <div chatBody class=\"chat-scroll\" #scrollContainer (scroll)=\"onScroll()\">\n <chat-message-list [agent]=\"agent()\">\n <ng-template chatMessageTemplate=\"human\" let-message let-i=\"index\">\n <chat-message [role]=\"'user'\" [prevRole]=\"prevRole(i)\">{{ humanContent(message) }}</chat-message>\n </ng-template>\n\n <ng-template chatMessageTemplate=\"ai\" let-message let-i=\"index\">\n @let content = messageContent(message);\n @let classified = classifyMessage(content, message);\n @let pending = classified.type() === 'pending';\n <chat-message\n [role]=\"'assistant'\"\n [message]=\"message\"\n [prevRole]=\"prevRole(i)\"\n [streaming]=\"agent().isLoading() && i === agent().messages().length - 1\"\n [current]=\"i === agent().messages().length - 1\"\n >\n @if (message.reasoning) {\n <chat-reasoning\n [content]=\"message.reasoning\"\n [isStreaming]=\"isReasoningStreaming(message, i)\"\n [durationMs]=\"message.reasoningDurationMs\"\n />\n }\n <chat-tool-calls [agent]=\"agent()\" [message]=\"message\" [excludeToolNames]=\"excludedToolNames()\">\n <ng-container ngProjectAs=\"[chatToolCallTemplate]\">\n <ng-content select=\"[chatToolCallTemplate]\" />\n </ng-container>\n </chat-tool-calls>\n <chat-tool-views\n [agent]=\"agent()\"\n [message]=\"message\"\n [views]=\"effectiveViews()\"\n [store]=\"resolvedStore()\"\n [handlers]=\"handlers()\"\n (events)=\"onClientToolEvent($event)\"\n />\n @if (classified.markdown(); as md) {\n <chat-streaming-md [content]=\"md\" [streaming]=\"agent().isLoading() && i === agent().messages().length - 1\" />\n }\n @if (classified.spec(); as spec) {\n <!-- Pass ONLY the explicit consumer store (may be\n undefined) — never the conversation-wide internal\n fallback. Without a consumer store, render-spec\n self-seeds a per-instance store from spec.state so\n same-key dashboards across messages stay isolated\n (a2ui parity). -->\n <chat-generative-ui\n [spec]=\"spec\"\n [registry]=\"renderRegistry()\"\n [store]=\"store()\"\n [handlers]=\"handlers()\"\n [loading]=\"agent().isLoading()\"\n (events)=\"onSpecEvent($event, i)\"\n />\n }\n @if (classified.type() === 'a2ui' && views(); as catalog) {\n @for (entry of classified.a2uiSurfaces() | keyvalue; track entry.key) {\n <a2ui-surface\n [surface]=\"entry.value\"\n [state]=\"classified.a2uiSurfaceStates().get(entry.key)\"\n [catalog]=\"catalog\"\n [handlers]=\"handlers()\"\n (action)=\"onA2uiAction($event)\"\n (events)=\"onA2uiEvent($event, i, entry.key)\"\n />\n }\n }\n <chat-message-actions\n chatMessageControls\n [content]=\"content\"\n [disabled]=\"agent().isLoading()\"\n (regenerate)=\"onRegenerate(i)\"\n (rate)=\"onRate(message, $event)\"\n (contentCopied)=\"onCopy(message, $event)\"\n />\n </chat-message>\n </ng-template>\n\n <ng-template chatMessageTemplate=\"tool\" let-message>\n <!-- Tool messages route through chat-trace; hidden from main flow. -->\n </ng-template>\n\n <ng-template chatMessageTemplate=\"system\" let-message>\n <chat-message [role]=\"'system'\">{{ messageContent(message) }}</chat-message>\n </ng-template>\n </chat-message-list>\n\n <!-- Suppress the floor typing-indicator while the current\n assistant bubble is streaming: its own caret is already\n the loading affordance. Showing both reads as visual\n noise rather than richer feedback. See\n currentAssistantStreaming() on the component class. -->\n @if (pinned() && !currentAssistantStreaming()) {\n <chat-typing-indicator [agent]=\"agent()\" />\n }\n </div>\n <div chatFooter class=\"chat-footer-wrap\">\n @if (!pinned()) {\n <chat-scroll-bubble\n [mode]=\"agent().isLoading() ? 'streaming' : 'idle'\"\n (clicked)=\"onScrollBubbleClick()\"\n />\n }\n <chat-error [agent]=\"agent()\" />\n <chat-input [agent]=\"agent()\" [submitOnEnter]=\"true\" placeholder=\"Type a message...\" (submitted)=\"onUserSubmitted()\">\n @if (showModelPicker() && modelOptions().length > 0) {\n <chat-select\n chatInputModelSelect\n [options]=\"modelOptions()\"\n [(value)]=\"selectedModel\"\n [placeholder]=\"modelPickerPlaceholder()\"\n />\n } @else {\n <ng-container ngProjectAs=\"[chatInputModelSelect]\">\n <ng-content select=\"[chatInputModelSelect]\" />\n </ng-container>\n }\n </chat-input>\n </div>\n </chat-window>\n </div>\n </div>\n }\n `,\n})\nexport class ChatComponent {\n readonly agent = input.required<Agent>();\n readonly views = input<ViewRegistry | undefined>(undefined);\n /**\n * Client-declared tools (`view`/`ask`/`function`) the model may call. When\n * provided, a coordinator ships their catalog to the agent, runs `function`\n * tools in the browser, and renders/resolves `view`/`ask` tools through the\n * same tool-views pipeline as `views`. Additive — leave undefined for the\n * classic server-tools-only experience.\n */\n readonly clientTools = input<ClientToolRegistry | undefined>(undefined);\n readonly store = input<StateStore | undefined>(undefined);\n readonly handlers = input<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>({});\n readonly threads = input<Thread[]>([]);\n readonly activeThreadId = input<string>('');\n readonly welcomeDisabled = input<boolean>(false);\n\n /**\n * High-level model-picker API. When `modelOptions` is non-empty, the chat\n * composition renders a `<chat-select>` inside the input pill (in BOTH\n * welcome and conversation modes), wired to the two-way `selectedModel`\n * model. Consumers who want full control should leave `modelOptions`\n * empty and project a `<chat-select chatInputModelSelect>` themselves.\n */\n readonly modelOptions = input<readonly ChatSelectOption[]>([]);\n /**\n * When `false`, hide the auto-rendered model picker even when\n * `modelOptions` is non-empty. Useful in cramped surfaces (popup,\n * sidebar) where the picker crowds the input. Defaults to `true`.\n * Has no effect when consumers project their own\n * `<chat-select chatInputModelSelect>` via content projection.\n */\n readonly showModelPicker = input<boolean>(true);\n readonly selectedModel = model<string>('');\n readonly modelPickerPlaceholder = input<string>('Choose a model');\n\n /**\n * Tool names whose calls produce a rendered GenUI surface rather than\n * visible text. Used to (a) filter <chat-tool-calls> so internal\n * dispatchers don't render args JSON as cards, and (b) detect\n * \"this is a GenUI turn\" for the building-UI skeleton.\n * Default covers the canonical A2UI + json-render schema tools.\n */\n readonly genuiToolNames = input<readonly string[]>([\n 'generate_a2ui_schema',\n 'generate_json_render_spec',\n 'render_spec',\n ]);\n\n readonly showWelcome = computed(() => {\n if (this.welcomeDisabled()) return false;\n const a = this.agent() as unknown as { isThreadLoading?: () => boolean };\n if (a.isThreadLoading?.()) return false;\n return this.agent().messages().length === 0;\n });\n readonly threadSelected = output<string>();\n readonly renderEvent = output<ChatRenderEvent>();\n /** Emitted when the user clicks the regenerate button on an assistant message. */\n readonly regenerate = output<void>();\n /** Emitted when the user rates an assistant message. */\n readonly rate = output<{ messageIndex: number; rating: 'up' | 'down' }>();\n /** Emitted when the user copies an assistant message. */\n readonly messageCopy = output<{ messageIndex: number; content: string }>();\n private readonly _internalStore = signalStateStore({});\n readonly resolvedStore = computed(() => {\n const explicit = this.store();\n if (explicit) return explicit;\n // A render store is needed whenever there's any view registry to render\n // through — user-supplied `views()` OR client-tool view/ask components.\n if (this.effectiveViews()) return this._internalStore;\n return undefined;\n });\n\n /**\n * Lazily-built client-tools coordinator, memoized on the `clientTools`\n * registry input. Undefined when no client tools are declared. The\n * coordinator owns the catalog/executor wiring and the view/ask render\n * registry; the composition merges and connects it below.\n */\n private readonly coordinator = computed(() => {\n const reg = this.clientTools();\n return reg ? createClientToolsCoordinator(reg) : undefined;\n });\n\n /**\n * The view registry actually used for rendering tool-views and for\n * excluding view-backed tool names from default tool-call cards. Merges\n * the coordinator's `view`/`ask` components (keyed by tool name) into the\n * user-supplied `views()` so client-declared component tools render through\n * the same pipeline. Falls back to `views()` when no client tools exist.\n */\n protected readonly effectiveViews = computed(() => {\n const base = this.views();\n const coord = this.coordinator();\n if (!coord) return base;\n return base ? withViews(base, coord.viewRegistry) : coord.viewRegistry;\n });\n\n readonly renderRegistry = computed(() => {\n const v = this.views();\n return v ? toRenderRegistry(v) : undefined;\n });\n\n /** Tool names that have a registered view (keys of the effective view\n * registry, including client-declared view/ask tools). These render as\n * inline tool-views and are excluded from the default tool-call card so\n * they don't render twice. */\n readonly viewToolNames = computed<readonly string[]>(() => Object.keys(this.effectiveViews() ?? {}));\n\n /** Union of GenUI dispatcher tool names and registered view tool names. */\n readonly excludedToolNames = computed<readonly string[]>(() => [\n ...this.genuiToolNames(),\n ...this.viewToolNames(),\n ]);\n\n readonly messageContent = messageContent;\n\n /**\n * Renderable content for a human-role message bubble. Most human\n * messages are typed prompts and pass through `messageContent`\n * unchanged. A2UI action messages (e.g. form submits, button clicks\n * on a rendered surface) flow through the same submit channel and\n * land in the message stream as a HumanMessage whose content is a\n * JSON-serialized `A2uiActionMessage`. Showing the raw JSON as if\n * the user typed it leaks the protocol; per the A2UI spec\n * those events resemble tool calls more than user utterances.\n *\n * `a2uiActionLabel` returns a short human-readable label for\n * recognized action shapes (\"Search flights\", \"Selected flight UA123\",\n * etc.) — or null for any non-action content, in which case we fall\n * back to the original text.\n */\n protected humanContent(message: unknown): string {\n // Cast: `messageContent` is typed against LangChain's BaseMessage, but\n // templates iterate the chat-lib's looser `Message` shape. Either type\n // is fine at runtime (`extractText` only reads `.content`).\n const raw = messageContent(message as Parameters<typeof messageContent>[0]);\n return a2uiActionLabel(raw) ?? raw;\n }\n\n /**\n * True while a message's reasoning is mid-stream — i.e. it's the latest\n * message, the agent is loading, the message has reasoning content, and\n * no response text has arrived yet. Once the response text begins, the\n * reasoning pill collapses (per its internal logic).\n */\n protected isReasoningStreaming(message: Message, index: number): boolean {\n const agent = this.agent();\n const isTail = index === agent.messages().length - 1;\n if (!isTail || !agent.isLoading()) return false;\n if (!message.reasoning || message.reasoning.length === 0) return false;\n const text = typeof message.content === 'string' ? message.content : '';\n return text.length === 0;\n }\n\n private readonly classifiers = new Map<string, ContentClassifier>();\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n // Resolved against the component's own `providers` in normal use. The fallback\n // is for tests that construct ChatComponent via `new` inside a bare injection\n // context (no element injector, so component-level providers are skipped).\n private readonly lifecycle = (inject(CHAT_LIFECYCLE, { optional: true }) ?? createChatLifecycle()) as ChatLifecycleInternal;\n private eventsSubscribed = false;\n\n /**\n * Shared A2UI surface store fed by the live partial-args bridge. The\n * content-classifier path will share this store via tool_call_id\n * short-circuit (skipping re-dispatch for live tool_call_ids).\n */\n protected readonly liveSurfaceStore: A2uiSurfaceStore = createA2uiSurfaceStore();\n private readonly partialBridge: PartialArgsBridge = createPartialArgsBridge(this.liveSurfaceStore);\n private partialEventsLastIndex = 0;\n\n private readonly scrollContainer = viewChild<ElementRef<HTMLElement>>('scrollContainer');\n private readonly messageCount = computed(() => this.agent().messages().length);\n private prevMessageCount = 0;\n private wasLoading = false;\n protected readonly pinned = signal<boolean>(true);\n private programmaticScrollCount = 0;\n private static readonly PIN_TOLERANCE_PX = 150;\n\n /**\n * True iff there's a current (last-index) assistant message that's\n * still streaming. The bubble's own caret already signals loading;\n * we suppress the floor typing-indicator in that case so the user\n * doesn't see two loading affordances at once.\n *\n * Matches the same `streaming + current` condition the bubble uses\n * to enable `.chat-message__caret`:\n * `agent().isLoading() && i === agent().messages().length - 1`\n * `i === agent().messages().length - 1`\n *\n * Restricted to assistant role because the caret only renders on\n * assistant bubbles (`:host([data-role=\"assistant\"][data-current=...\n * ][data-streaming=...])`).\n */\n protected readonly currentAssistantStreaming = computed(() => {\n if (!this.agent().isLoading()) return false;\n const msgs = this.agent().messages();\n if (msgs.length === 0) return false;\n const last = msgs[msgs.length - 1];\n return last?.role === 'assistant';\n });\n\n constructor() {\n // Inject the chat lib's root CSS custom properties (--ngaf-chat-bg,\n // --ngaf-chat-surface, --ngaf-chat-radius-input, etc.) the first\n // time any chat composition is constructed. The module-eval side\n // effect that previously handled this is unreliable under\n // aggressive production tree-shaking — bundlers that don't see\n // the source `chat-tokens.ts` path in the published artifact's\n // `sideEffects` glob drop the call entirely, leaving consumers\n // with zero token defaults (sidenav has no width, input has no\n // border, chips have no chrome — everything renders as plain\n // text on the page background). Calling from a constructor that\n // is unconditionally reachable from user code defeats that\n // tree-shaking and is idempotent. */\n ensureChatRootStyles();\n effect(() => {\n if (this.eventsSubscribed) return;\n let agent: ReturnType<typeof this.agent>;\n try { agent = this.agent(); } catch { return; }\n this.eventsSubscribed = true;\n this.lifecycle._internal.componentReady.set(true);\n agent.events$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n if (event.type !== 'state_update') return;\n const store = this.resolvedStore();\n if (!store) return;\n store.update(event.data);\n });\n });\n\n // Sync the agent STATE signal into the render store. AG-UI delivers\n // backend data as agent shared state (STATE_SNAPSHOT/STATE_DELTA); other\n // adapters expose graph state via the same `state()` signal. The render\n // store keys are JSON pointers, so map each top-level state key `k` to\n // `/k`. Exclude `messages` (carried in the snapshot but irrelevant to the\n // render store and large). Fires for any adapter whose `state()` carries\n // non-message keys; no-op when no render store is active. Coexists with\n // the events$ `state_update` path above (both merge into the same store).\n effect(() => {\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n const stateFn = (agentRef as unknown as { state?: () => unknown }).state;\n if (typeof stateFn !== 'function') return;\n const state = stateFn.call(agentRef);\n const store = this.resolvedStore();\n if (!store || state == null || typeof state !== 'object' || Array.isArray(state)) return;\n const updates: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(state as Record<string, unknown>)) {\n if (k === 'messages') continue;\n updates['/' + k] = v;\n }\n if (Object.keys(updates).length > 0) store.update(updates);\n });\n\n // Spec 4: flip CHAT_LIFECYCLE.firstMessageSent when the agent's stream\n // starts, regardless of submit path (input-bound, programmatic, suggestion-\n // click). Sticky — guarded so we never re-set a flag that's already true.\n // `lifecycle` is not on the base Agent contract; adapters like @threadplane/langgraph\n // attach it. Duck-type the read so non-lifecycle agents are a no-op.\n effect(() => {\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n const lc = (agentRef as unknown as { lifecycle?: { streamStartedAt?: () => number | null } }).lifecycle;\n const streamStartedAt = lc?.streamStartedAt?.();\n if (streamStartedAt != null && !this.lifecycle._internal.firstMessageSent()) {\n this.lifecycle._internal.firstMessageSent.set(true);\n }\n });\n\n // Auto-scroll-to-bottom. Fires on every signal update during streaming\n // (each token mutates the last message's content), so this MUST be cheap\n // and idempotent. Earlier this used scrollTo({ behavior: 'smooth' }) per\n // token, which queues overlapping smooth-scroll animations (~12/sec)\n // and produces visibly jerky scroll. Direct `scrollTop = scrollHeight`\n // is instant, free, and only repaints when the value actually changes.\n effect(() => {\n let count: number;\n let msgs: ReturnType<ReturnType<typeof this.agent>['messages']>;\n try { count = this.messageCount(); msgs = this.agent().messages(); } catch { return; }\n const lastContent = msgs.length > 0 ? (msgs[msgs.length - 1] as unknown as Record<string, unknown>)['content'] : undefined;\n void lastContent;\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n const isNewMessage = count !== this.prevMessageCount;\n this.prevMessageCount = count;\n if (isNewMessage || this.pinned()) {\n this.programmaticScrollCount++;\n el.scrollTop = el.scrollHeight;\n requestAnimationFrame(() => { this.programmaticScrollCount--; });\n if (isNewMessage) untracked(() => this.pinned.set(true));\n }\n });\n\n // Final scroll when streaming completes. The content-mutation effect above\n // fires on every token but stops when streaming ends; action buttons\n // (reload, copy) render on idle and can land below the fold without this.\n effect(() => {\n let loading: boolean;\n try { loading = this.agent().isLoading(); } catch { return; }\n if (loading) {\n this.wasLoading = true;\n return;\n }\n if (!this.wasLoading) return;\n this.wasLoading = false;\n if (this.pinned()) {\n // Defer one frame so message-actions have rendered.\n requestAnimationFrame(() => {\n const el2 = this.scrollContainer()?.nativeElement;\n if (!el2) return;\n this.programmaticScrollCount++;\n el2.scrollTop = el2.scrollHeight;\n requestAnimationFrame(() => { this.programmaticScrollCount--; });\n });\n }\n });\n\n // Subscribe to a2ui-partial custom events from the LangGraph backend.\n // Each event delivers a cumulative args string keyed by tool_call_id;\n // bridge.push() re-parses and dispatches new envelopes incrementally.\n // The runtime-neutral Agent contract does not require a customEvents\n // signal, so we feature-detect: adapters that expose it (e.g.\n // LangGraphAgent's customEvents signal) light up live streaming;\n // others continue to use the wrapped final-message classifier path.\n effect(() => {\n let agent: ReturnType<typeof this.agent>;\n try { agent = this.agent(); } catch { return; }\n const customSig = (agent as unknown as {\n customEvents?: () => readonly { name: string; data: unknown }[];\n }).customEvents;\n if (typeof customSig !== 'function') return;\n const events = customSig();\n for (let i = this.partialEventsLastIndex; i < events.length; i++) {\n const e = events[i];\n if (e.name !== 'a2ui-partial') continue;\n const d = e.data as { tool_call_id?: string; args_so_far?: string } | null;\n if (!d || typeof d.tool_call_id !== 'string' || typeof d.args_so_far !== 'string') continue;\n this.partialBridge.push(d.tool_call_id, d.args_so_far);\n }\n this.partialEventsLastIndex = events.length;\n });\n\n // Connect the client-tools coordinator to the agent. connect() ships the\n // tool catalog, starts the function-tool executor, and installs the view\n // auto-ack effect. Those installs create effect()s of their own, which\n // Angular forbids from *within* a running effect (NG0602). So this effect\n // only detects readiness (both coordinator + agent present) and defers the\n // actual connect() to a microtask that runs OUTSIDE the reactive context,\n // re-entering the component's injection context so the coordinator's\n // effects bind to this component's lifecycle. `connected` guards against\n // re-running per coordinator identity (a new clientTools registry yields a\n // new coordinator and re-connects; the old one's effects are abandoned).\n let connected: unknown;\n effect(() => {\n const coord = this.coordinator();\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n if (!coord || !agentRef) return;\n if (connected === coord) return;\n connected = coord;\n queueMicrotask(() => {\n runInInjectionContext(this.injector, () => coord.connect(agentRef));\n });\n });\n\n effect(() => {\n // janitor: drop classifiers for messages no longer in the agent's list\n let liveIds: Set<string>;\n try {\n liveIds = new Set<string>();\n for (const m of this.agent().messages()) {\n const id = (m as unknown as { id?: string }).id;\n if (id) liveIds.add(id);\n }\n } catch { return; }\n for (const key of [...this.classifiers.keys()]) {\n if (!liveIds.has(key)) {\n this.classifiers.get(key)?.dispose();\n this.classifiers.delete(key);\n }\n }\n });\n }\n\n prevRole(index: number): ChatMessageRole | undefined {\n if (index === 0) return undefined;\n const prev = this.agent().messages()[index - 1];\n if (!prev) return undefined;\n const role = (prev as unknown as { role?: string }).role;\n if (role === 'user') return 'user';\n if (role === 'assistant') return 'assistant';\n if (role === 'system') return 'system';\n if (role === 'tool') return 'tool';\n return undefined;\n }\n\n protected onScroll(): void {\n if (this.programmaticScrollCount > 0) return;\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n const nextPinned = isPinned(el.scrollHeight, el.scrollTop, el.clientHeight, ChatComponent.PIN_TOLERANCE_PX);\n if (nextPinned !== this.pinned()) this.pinned.set(nextPinned);\n }\n\n protected onScrollBubbleClick(): void {\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n this.programmaticScrollCount++;\n el.scrollTop = el.scrollHeight;\n requestAnimationFrame(() => { this.programmaticScrollCount--; });\n this.pinned.set(true);\n }\n\n protected onUserSubmitted(): void {\n this.pinned.set(true);\n this.recordSubmit();\n }\n\n /**\n * Programmatic submit. Calls `agent.submit({ message: text })` and updates\n * the CHAT_LIFECYCLE signals. Trimmed-empty text is a no-op.\n */\n submitMessage(text: string): void {\n const trimmed = text.trim();\n if (!trimmed) return;\n void this.agent().submit({ message: trimmed });\n this.recordSubmit();\n }\n\n /**\n * Clears local view state (classifiers, surface store, lifecycle counters)\n * for a new thread.\n *\n * Resets messageCount to 0 and inputSubmittedAt to null. componentReady and\n * firstMessageSent are NOT reset (sticky for the chat instance lifetime).\n */\n clearThread(): void {\n this.clearClassifiers();\n this.lifecycle._internal.messageCount.set(0);\n this.lifecycle._internal.inputSubmittedAt.set(null);\n }\n\n private recordSubmit(): void {\n if (!this.lifecycle._internal.firstMessageSent()) {\n this.lifecycle._internal.firstMessageSent.set(true);\n }\n this.lifecycle._internal.messageCount.update((c) => c + 1);\n this.lifecycle._internal.inputSubmittedAt.set(Date.now());\n }\n\n /**\n * Look up the previous message in the agent's messages list.\n * Returns undefined for the first message.\n */\n protected prevMessage(index: number): unknown {\n if (index === 0) return undefined;\n return this.agent().messages()[index - 1];\n }\n\n /**\n * True when this assistant message is part of a GenUI render turn.\n * Walks backward through messages from `index` until it finds either\n * an assistant message with `tool_calls` referencing a GenUI tool\n * (→ this turn produces a surface) or a human message (→ the\n * preceding turn ended; this assistant message stands on its own).\n *\n * Also checks the message itself for:\n * - `extra.tool_calls[].name` matching a GenUI tool (post-streaming\n * state of the tool-call AI message), OR\n * - `extra.content[].type === 'function_call' && .name` matching\n * (live during the OpenAI Responses-API streaming chunks before\n * `tool_calls` populates).\n *\n * The walk-back approach is robust to LangGraph's in-place\n * replacement of the ToolMessage (which strips the `name` field),\n * unlike a single prev-message check.\n */\n protected isGenuiTurn(message: unknown, _prevMsg: unknown, index?: number): boolean {\n const names = new Set(this.genuiToolNames());\n const m = message as { extra?: Record<string, unknown> } | null | undefined;\n if (!m) return false;\n\n // Direct check on the message itself (covers the tool-call AI message).\n const calls = (m.extra?.['tool_calls'] as Array<{ name?: string }> | undefined) ?? [];\n if (calls.some(c => c.name != null && names.has(c.name))) return true;\n\n const rawContent = m.extra?.['content'];\n if (Array.isArray(rawContent)) {\n for (const block of rawContent) {\n if (block != null\n && typeof block === 'object'\n && (block as { type?: unknown }).type === 'function_call'\n && typeof (block as { name?: unknown }).name === 'string'\n && names.has((block as { name: string }).name)) {\n return true;\n }\n }\n }\n\n // Content-shape detector: during streaming, LangGraph projects the\n // sub-LLM's tool_call.arguments as the assistant message's content\n // string (NOT as a structured array). The structured array form\n // only materialises after streaming completes. So during streaming,\n // we see the JSON envelopes flowing in as text — neither tool_calls\n // nor content[].function_call are populated. Detect via stable\n // A2UI/json-render markers in the content string.\n const projectedContent = (m as { content?: unknown }).content;\n if (typeof projectedContent === 'string' && projectedContent.length > 0) {\n // A2UI v1 envelope keys (canonical Google shape).\n if (projectedContent.includes('\"surfaceUpdate\"')\n || projectedContent.includes('\"beginRendering\"')\n || projectedContent.includes('\"dataModelUpdate\"')) {\n return true;\n }\n // json-render spec shape — looks like `{ \"root\": \"...\", \"elements\": ... }`.\n if (projectedContent.includes('\"root\"') && projectedContent.includes('\"elements\"')) {\n return true;\n }\n }\n\n // Direct prev-message check (fast path for the well-formed case\n // where the immediately-preceding tool message still has its name).\n const p = _prevMsg as { role?: string; name?: string; extra?: Record<string, unknown> } | null | undefined;\n if (p && p.role === 'tool') {\n const toolName = (p.extra?.['name'] as string | undefined) ?? p.name;\n if (typeof toolName === 'string' && names.has(toolName)) return true;\n }\n\n // Walk backward through messages for the emit-phase assistant\n // message whose own structure has no GenUI hint. Bounded by the\n // most recent human message (= start of the current turn).\n if (typeof index === 'number' && index > 0) {\n const msgs = this.agent().messages();\n for (let i = index - 1; i >= 0; i--) {\n const prev = msgs[i] as { role?: string; extra?: Record<string, unknown> };\n if (!prev) break;\n if (prev.role === 'user') break; // crossed the turn boundary\n\n const prevCalls = (prev.extra?.['tool_calls'] as Array<{ name?: string }> | undefined) ?? [];\n if (prevCalls.some(c => c.name != null && names.has(c.name))) return true;\n\n const prevRaw = prev.extra?.['content'];\n if (Array.isArray(prevRaw)) {\n for (const block of prevRaw) {\n if (block != null\n && typeof block === 'object'\n && (block as { type?: unknown }).type === 'function_call'\n && typeof (block as { name?: unknown }).name === 'string'\n && names.has((block as { name: string }).name)) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n }\n\n classifyMessage(content: string, message: { id?: string }): ContentClassifier {\n const id = message.id ?? '';\n let c = this.classifiers.get(id);\n if (!c) {\n c = createContentClassifier();\n this.classifiers.set(id, c);\n }\n c.update(content);\n return c;\n }\n\n clearClassifiers(): void {\n for (const [, c] of this.classifiers) {\n c.dispose();\n }\n this.classifiers.clear();\n }\n\n onSpecEvent(event: RenderEvent, messageIndex: number): void {\n this.renderEvent.emit({ messageIndex, event });\n }\n\n /**\n * Forwards a render event bubbled up from a `<chat-tool-views>` component\n * (a client-declared `view`/`ask` tool's rendered UI) to the client-tools\n * coordinator. The coordinator resolves the matching pending `ask` tool call\n * when the event is a `result`. No-op when no client tools are wired.\n */\n protected onClientToolEvent(event: RenderEvent): void {\n const coord = this.coordinator();\n if (!coord) return;\n let agentRef: ReturnType<typeof this.agent>;\n try { agentRef = this.agent(); } catch { return; }\n coord.handleRenderEvent(agentRef, event);\n }\n\n onA2uiAction(message: A2uiActionMessage): void {\n void this.agent().submit({ message: JSON.stringify(message) });\n }\n\n onA2uiEvent(event: RenderEvent, messageIndex: number, surfaceId: string): void {\n this.renderEvent.emit({ messageIndex, surfaceId, event });\n }\n\n /** Regenerate the assistant response at the given message index. */\n onRegenerate(messageIndex: number): void {\n void this.agent().regenerate(messageIndex);\n this.regenerate.emit();\n }\n\n onRate(message: unknown, value: 'up' | 'down'): void {\n const idx = this.agent().messages().indexOf(message as never);\n this.rate.emit({ messageIndex: idx, rating: value });\n }\n\n onCopy(message: unknown, content: string): void {\n const idx = this.agent().messages().indexOf(message as never);\n this.messageCopy.emit({ messageIndex: idx, content });\n }\n\n}\n","// libs/chat/src/lib/compositions/chat-popup/chat-popup.component.ts\n// SPDX-License-Identifier: MIT\nimport { Component, ChangeDetectionStrategy, input, model, DestroyRef, inject, DOCUMENT, effect } from '@angular/core';\nimport type { Agent } from '../../agent';\nimport type { ViewRegistry } from '@threadplane/render';\nimport type { ClientToolRegistry } from '../../client-tools/tool-def';\nimport { ChatComponent } from '../chat/chat.component';\nimport type { ChatSelectOption } from '../../primitives/chat-select/chat-select.component';\nimport { ChatLauncherButtonComponent } from '../../primitives/chat-launcher-button/chat-launcher-button.component';\nimport { CHAT_HOST_TOKENS, ensureChatRootStyles } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-popup',\n standalone: true,\n imports: [ChatComponent, ChatLauncherButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { position: fixed; bottom: 1rem; right: 1rem; z-index: var(--ngaf-chat-z-overlay-content, 30); }\n .chat-popup__launcher { position: relative; }\n .chat-popup__window {\n position: fixed;\n bottom: 5rem;\n right: 1rem;\n width: 24rem;\n height: 600px;\n max-height: calc(100vh - 6rem);\n background: var(--ngaf-chat-bg);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: 0.75rem;\n box-shadow: 0 5px 40px rgba(0,0,0,.16);\n transform-origin: bottom right;\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n pointer-events: none;\n transition: transform 200ms ease-out, opacity 100ms ease-out;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .chat-popup__window[data-open=\"true\"] {\n transform: scale(1) translateY(0);\n opacity: 1;\n pointer-events: auto;\n }\n @media (max-width: 640px) {\n .chat-popup__window { inset: 0; width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; bottom: auto; right: auto; }\n }\n .chat-popup__close {\n position: absolute; top: 8px; right: 8px;\n width: 32px; height: 32px;\n background: transparent; border: 0; cursor: pointer;\n color: var(--ngaf-chat-text-muted);\n border-radius: 50%;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .chat-popup__close:hover { background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text); }\n `],\n template: `\n <div class=\"chat-popup__launcher\">\n <chat-launcher-button (clicked)=\"toggle()\" />\n </div>\n <div class=\"chat-popup__window\" [attr.data-open]=\"open() ? 'true' : 'false'\" role=\"dialog\" aria-modal=\"false\">\n <button type=\"button\" class=\"chat-popup__close\" (click)=\"closeWindow()\" aria-label=\"Close chat\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n <chat\n [agent]=\"agent()\"\n [views]=\"views()\"\n [clientTools]=\"clientTools()\"\n [modelOptions]=\"modelOptions()\"\n [showModelPicker]=\"showModelPicker()\"\n [selectedModel]=\"selectedModel()\"\n (selectedModelChange)=\"selectedModel.set($event)\"\n >\n <ng-content select=\"[chatHeader]\" chatHeader />\n <ng-content select=\"[chatWelcomeSuggestions]\" chatWelcomeSuggestions />\n </chat>\n </div>\n `,\n})\nexport class ChatPopupComponent {\n readonly agent = input.required<Agent>();\n /** A2UI component catalog forwarded to the inner <chat>. Without it,\n * messages classified as A2UI parse correctly but never mount a\n * surface. Pass `a2uiBasicCatalog()` from `@threadplane/chat`. */\n readonly views = input<ViewRegistry | undefined>(undefined);\n /** Frontend-declared client tools forwarded to the inner `<chat>`. */\n readonly clientTools = input<ClientToolRegistry | undefined>(undefined);\n /** Forwarded to the inner <chat>. When non-empty, a model picker pill\n * renders in the chat-input chrome. */\n readonly modelOptions = input<readonly ChatSelectOption[]>([]);\n /**\n * Forwarded to the inner `<chat>`. When `false`, hides the\n * auto-rendered model picker even with non-empty `modelOptions`.\n * Use this in narrow surfaces (the chat-sidebar panel is 28rem\n * wide; chat-popup is 24rem) where the picker crowds the input.\n * Defaults to `true`.\n */\n readonly showModelPicker = input<boolean>(true);\n /** Two-way bound current model value. */\n readonly selectedModel = model<string>('');\n readonly open = model(false);\n /**\n * Keyboard shortcut (single key) that toggles the popup with cmd (mac)\n * or ctrl (other). Set to `null` to disable. Default: 'k' — matches the\n * widely-used cmd/ctrl+K convention.\n */\n readonly shortcut = input<string | null>('k');\n /** Close the popup on Escape (default true). */\n readonly closeOnEscape = input<boolean>(true);\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n\n constructor() {\n // Inject chat lib root CSS custom properties — see ChatComponent\n // for the full rationale. Idempotent + lifecycle-guaranteed.\n ensureChatRootStyles();\n effect(() => {\n // Re-bind whenever shortcut/closeOnEscape change.\n const shortcut = this.shortcut();\n const closeOnEscape = this.closeOnEscape();\n const win = this.document.defaultView;\n if (!win) return;\n const isMac = /Mac|iPhone|iPad/i.test(win.navigator.platform || win.navigator.userAgent);\n const handler = (e: KeyboardEvent): void => {\n if (shortcut && e.key.toLowerCase() === shortcut.toLowerCase() && (isMac ? e.metaKey : e.ctrlKey)) {\n e.preventDefault();\n this.toggle();\n return;\n }\n if (closeOnEscape && this.open() && e.key === 'Escape') {\n this.closeWindow();\n }\n };\n win.addEventListener('keydown', handler);\n this.destroyRef.onDestroy(() => win.removeEventListener('keydown', handler));\n });\n }\n\n toggle(): void { this.open.update((v) => !v); }\n openWindow(): void { this.open.set(true); }\n closeWindow(): void { this.open.set(false); }\n}\n","// libs/chat/src/lib/compositions/chat-sidebar/chat-sidebar.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n DOCUMENT,\n effect,\n inject,\n input,\n model,\n} from '@angular/core';\nimport type { Agent } from '../../agent';\nimport type { ViewRegistry } from '@threadplane/render';\nimport type { ClientToolRegistry } from '../../client-tools/tool-def';\nimport { ChatComponent } from '../chat/chat.component';\nimport { ChatLauncherButtonComponent } from '../../primitives/chat-launcher-button/chat-launcher-button.component';\nimport type { ChatSelectOption } from '../../primitives/chat-select/chat-select.component';\nimport { CHAT_HOST_TOKENS, ensureChatRootStyles } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-sidebar',\n standalone: true,\n imports: [ChatComponent, ChatLauncherButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-push]': 'pushContent() ? \"true\" : \"false\"',\n '[attr.data-open]': 'open() ? \"true\" : \"false\"',\n },\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; }\n .chat-sidebar__content { transition: margin-right 300ms ease; min-height: 100vh; }\n :host([data-push=\"true\"][data-open=\"true\"]) .chat-sidebar__content { margin-right: 28rem; }\n @media (max-width: 640px) {\n :host([data-push=\"true\"][data-open=\"true\"]) .chat-sidebar__content { margin-right: 0; }\n }\n .chat-sidebar__panel {\n position: fixed;\n top: 0; right: 0;\n bottom: var(--ngaf-chat-debug-claim-bottom, 0);\n width: 28rem;\n background: var(--ngaf-chat-bg);\n border-left: 1px solid var(--ngaf-chat-separator);\n box-shadow: -8px 0 32px rgba(0,0,0,.08);\n transform: translateX(100%);\n transition: transform 200ms ease-out, bottom 200ms ease-out;\n z-index: var(--ngaf-chat-z-overlay-content, 30);\n display: flex;\n flex-direction: column;\n }\n .chat-sidebar__panel[data-open=\"true\"] { transform: translateX(0); }\n @media (max-width: 640px) {\n .chat-sidebar__panel { width: 100vw; }\n }\n .chat-sidebar__panel-header {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--ngaf-chat-separator);\n min-height: 48px;\n }\n .chat-sidebar__panel-title {\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--ngaf-chat-text);\n font-weight: 500;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-sidebar__close {\n flex: 0 0 auto;\n width: 32px; height: 32px;\n background: transparent; border: 0; cursor: pointer;\n color: var(--ngaf-chat-text-muted);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .chat-sidebar__close:hover { background: var(--ngaf-chat-surface-alt); color: var(--ngaf-chat-text); }\n .chat-sidebar__launcher {\n position: fixed;\n bottom: calc(1rem + var(--ngaf-chat-debug-claim-bottom, 0));\n right: 1rem;\n z-index: var(--ngaf-chat-z-overlay-content, 30);\n transition: bottom 200ms ease-out;\n }\n /* Hide the launcher when the sidebar is open — the close button on the\n panel handles dismissal, and the panel covers the launcher anyway. */\n :host([data-open=\"true\"]) .chat-sidebar__launcher { display: none; }\n `],\n template: `\n <div class=\"chat-sidebar__content\"><ng-content /></div>\n <div class=\"chat-sidebar__launcher\">\n <chat-launcher-button (clicked)=\"toggle()\" />\n </div>\n <aside class=\"chat-sidebar__panel\" [attr.data-open]=\"open() ? 'true' : 'false'\" role=\"complementary\" [attr.aria-hidden]=\"open() ? 'false' : 'true'\">\n <div class=\"chat-sidebar__panel-header\">\n <div class=\"chat-sidebar__panel-title\">\n <ng-content select=\"[chatSidebarPanelTitle]\" />\n </div>\n <button type=\"button\" class=\"chat-sidebar__close\" (click)=\"closeWindow()\" aria-label=\"Close chat\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n <chat\n [agent]=\"agent()\"\n [views]=\"views()\"\n [clientTools]=\"clientTools()\"\n [modelOptions]=\"modelOptions()\"\n [showModelPicker]=\"showModelPicker()\"\n [selectedModel]=\"selectedModel()\"\n (selectedModelChange)=\"selectedModel.set($event)\"\n >\n <ng-content select=\"[chatHeader]\" chatHeader />\n <ng-content select=\"[chatWelcomeSuggestions]\" chatWelcomeSuggestions />\n </chat>\n </aside>\n `,\n})\nexport class ChatSidebarComponent {\n readonly agent = input.required<Agent>();\n /** A2UI component catalog forwarded to the inner <chat>. Without it,\n * messages classified as A2UI parse correctly but never mount a\n * surface. Pass `a2uiBasicCatalog()` from `@threadplane/chat`. */\n readonly views = input<ViewRegistry | undefined>(undefined);\n /** Frontend-declared client tools forwarded to the inner `<chat>`. */\n readonly clientTools = input<ClientToolRegistry | undefined>(undefined);\n /** Forwarded to the inner <chat>. When non-empty, a model picker pill\n * renders in the chat-input chrome. */\n readonly modelOptions = input<readonly ChatSelectOption[]>([]);\n /**\n * Forwarded to the inner `<chat>`. When `false`, hides the\n * auto-rendered model picker even with non-empty `modelOptions`.\n * Use this in narrow surfaces (the chat-sidebar panel is 28rem\n * wide; chat-popup is 24rem) where the picker crowds the input.\n * Defaults to `true`.\n */\n readonly showModelPicker = input<boolean>(true);\n /** Two-way bound current model value. */\n readonly selectedModel = model<string>('');\n readonly open = model(false);\n /** Close the sidebar on Escape (default true). */\n readonly closeOnEscape = input<boolean>(true);\n readonly pushContent = input<boolean>(false);\n\n private readonly document = inject(DOCUMENT);\n\n constructor() {\n // Inject chat lib root CSS custom properties — see ChatComponent\n // for the full rationale. Idempotent + lifecycle-guaranteed.\n ensureChatRootStyles();\n // Publish the right-edge claim while the panel is open. Peer panels\n // (e.g. chat-debug) read --ngaf-chat-occupy-right to leave room.\n effect(() => {\n if (typeof document === 'undefined') return;\n const html = document.documentElement;\n if (this.open()) {\n html.dataset['threadplaneChatSidebar'] = 'open';\n } else {\n delete html.dataset['threadplaneChatSidebar'];\n }\n });\n effect((onCleanup) => {\n const closeOnEscape = this.closeOnEscape();\n const win = this.document.defaultView;\n if (!win) return;\n const handler = (e: KeyboardEvent): void => {\n if (closeOnEscape && this.open() && e.key === 'Escape') {\n this.closeWindow();\n }\n };\n win.addEventListener('keydown', handler);\n onCleanup(() => win.removeEventListener('keydown', handler));\n });\n }\n\n toggle(): void { this.open.update((v) => !v); }\n openWindow(): void { this.open.set(true); }\n closeWindow(): void { this.open.set(false); }\n}\n","// libs/chat/src/lib/compositions/chat-timeline-slider/chat-timeline-slider.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component, computed, input, output, signal,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { AgentWithHistory, AgentCheckpoint } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\n@Component({\n selector: 'chat-timeline-slider',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [CHAT_HOST_TOKENS, `\n :host { display: block; padding: var(--ngaf-chat-space-2); }\n .timeline-slider__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 var(--ngaf-chat-space-1) var(--ngaf-chat-space-2);\n }\n .timeline-slider__title {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--ngaf-chat-text-muted);\n margin: 0;\n }\n .timeline-slider__count {\n font-size: var(--ngaf-chat-font-size-xs);\n color: var(--ngaf-chat-text-muted);\n }\n .timeline-slider__empty {\n text-align: center;\n padding: var(--ngaf-chat-space-4);\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-xs);\n }\n .timeline-slider__list {\n list-style: none;\n padding-left: 12px;\n margin: 0;\n border-left: 1px solid var(--ngaf-chat-separator);\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .timeline-slider__entry {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n margin-left: -1px;\n border-left: 2px solid transparent;\n border-radius: var(--ngaf-chat-radius-button);\n cursor: default;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n transition: background 150ms ease;\n }\n .timeline-slider__entry:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 5%, transparent); }\n .timeline-slider__entry[data-active=\"true\"] {\n border-left-color: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-text);\n }\n .timeline-slider__index {\n width: 22px;\n height: 22px;\n border-radius: 9999px;\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text-muted);\n font-size: 11px;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .timeline-slider__entry[data-active=\"true\"] .timeline-slider__index {\n background: var(--ngaf-chat-primary);\n color: var(--ngaf-chat-on-primary);\n }\n .timeline-slider__body { flex: 1; min-width: 0; }\n .timeline-slider__label {\n font-weight: 500;\n color: var(--ngaf-chat-text);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .timeline-slider__id {\n font-family: var(--ngaf-chat-font-mono);\n font-size: 11px;\n color: var(--ngaf-chat-text-muted);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .timeline-slider__actions { display: flex; gap: 4px; flex-shrink: 0; }\n .timeline-slider__btn {\n padding: 2px 8px;\n font-size: var(--ngaf-chat-font-size-xs);\n border-radius: var(--ngaf-chat-radius-button);\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n border: 0;\n cursor: pointer;\n transition: background 150ms ease;\n }\n .timeline-slider__btn:hover { background: color-mix(in srgb, var(--ngaf-chat-text) 8%, transparent); }\n `],\n template: `\n <div class=\"timeline-slider__header\">\n <h3 class=\"timeline-slider__title\">Timeline</h3>\n <span class=\"timeline-slider__count\">{{ history().length }} checkpoint(s)</span>\n </div>\n\n @if (history().length === 0) {\n <p class=\"timeline-slider__empty\">No checkpoints yet.</p>\n } @else {\n <ul class=\"timeline-slider__list\">\n @for (cp of history(); track $index; let i = $index) {\n <li\n class=\"timeline-slider__entry\"\n [attr.data-active]=\"i === selectedIndex() ? 'true' : null\"\n >\n <span class=\"timeline-slider__index\">{{ i + 1 }}</span>\n <div class=\"timeline-slider__body\">\n <p class=\"timeline-slider__label\">{{ cp.label ?? 'Step ' + (i + 1) }}</p>\n @if (cp.id) {\n <p class=\"timeline-slider__id\">{{ cp.id }}</p>\n }\n </div>\n <div class=\"timeline-slider__actions\">\n <button type=\"button\" class=\"timeline-slider__btn\" title=\"Replay from this checkpoint\" (click)=\"replay(cp)\">Replay</button>\n <button type=\"button\" class=\"timeline-slider__btn\" title=\"Fork from this checkpoint\" (click)=\"fork(cp, i)\">Fork</button>\n </div>\n </li>\n }\n </ul>\n }\n `,\n})\nexport class ChatTimelineSliderComponent {\n readonly agent = input.required<AgentWithHistory>();\n\n readonly selectedIndex = signal<number>(-1);\n\n readonly history = computed<AgentCheckpoint[]>(() => this.agent().history());\n\n readonly replayRequested = output<string>();\n readonly forkRequested = output<string>();\n\n replay(cp: AgentCheckpoint): void {\n if (cp.id) this.replayRequested.emit(cp.id);\n }\n\n fork(cp: AgentCheckpoint, index: number): void {\n this.selectedIndex.set(index);\n if (cp.id) this.forkRequested.emit(cp.id);\n }\n}\n","// libs/chat/src/lib/styles/chat-sidenav.styles.ts\n// SPDX-License-Identifier: MIT\nexport const CHAT_SIDENAV_STYLES = `\n /*\n * In expanded / collapsed modes the sidenav is \"always visible\" beside the\n * main content — the consumer reserves space with padding-left on the\n * layout container. The host must be position: fixed so it doesn't\n * participate in document flow; otherwise its display: block stretches\n * to the parent's full width and pushes siblings below the viewport.\n */\n :host {\n display: block;\n height: 100%;\n }\n :host([data-mode=\"expanded\"]),\n :host([data-mode=\"collapsed\"]) {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 100;\n }\n :host([data-mode=\"expanded\"]) {\n width: var(--ngaf-chat-sidenav-width-expanded);\n }\n :host([data-mode=\"collapsed\"]) {\n width: var(--ngaf-chat-sidenav-width-collapsed);\n }\n :host([data-mode=\"expanded\"]) .chat-sidenav {\n width: 100%;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav {\n width: 100%;\n }\n :host([data-mode=\"drawer\"]) {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: var(--ngaf-chat-sidenav-width-drawer);\n z-index: var(--ngaf-chat-z-drawer, 1001);\n }\n :host([data-mode=\"drawer\"][data-open=\"true\"]) {\n box-shadow: 8px 0 32px rgba(0, 0, 0, 0.18);\n }\n .chat-sidenav {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--ngaf-chat-bg);\n border-right: 1px solid var(--ngaf-chat-separator);\n box-sizing: border-box;\n overflow: hidden;\n }\n :host([data-mode=\"drawer\"]) .chat-sidenav {\n width: 100%;\n height: 100%;\n transition: transform 200ms ease;\n transform: translateX(-100%);\n }\n :host([data-mode=\"drawer\"][data-open=\"true\"]) .chat-sidenav {\n transform: translateX(0);\n }\n .chat-sidenav__header {\n flex-shrink: 0;\n padding: var(--ngaf-chat-space-3);\n }\n /* Collapse the header slot when the consumer doesn't project content\n * — matches the chat-window pattern. Avoids 24px of dead space above\n * the New chat button. */\n .chat-sidenav__header:empty { display: none; }\n .chat-sidenav__topbar {\n flex-shrink: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n padding: var(--ngaf-chat-space-2) var(--ngaf-chat-space-3);\n border-bottom: 1px solid var(--ngaf-chat-separator);\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__topbar {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: var(--ngaf-chat-space-2) 0;\n }\n .chat-sidenav__topbar .chat-sidenav__action--close {\n width: 36px;\n height: 36px;\n padding: 0;\n justify-content: center;\n flex: 0 0 auto;\n }\n .chat-sidenav__topbar .chat-sidenav__action--close .chat-sidenav__action-label {\n display: none;\n }\n .chat-sidenav__action--new {\n /* Geometry only — fill/color set by the late-cascade\n .chat-sidenav__action.chat-sidenav__action--new block. */\n border: 0;\n padding: 12px 18px;\n border-radius: 8px;\n font-size: var(--ngaf-chat-font-size-sm);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n width: 100%;\n }\n .chat-sidenav__action--new:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n /* Collapsed mode: shrink to 32×32 icon-only square. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--new {\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 10px;\n justify-content: center;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--new .chat-sidenav__action-label {\n display: none;\n }\n .chat-sidenav__actions {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: var(--ngaf-chat-space-3);\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__actions {\n align-items: center;\n padding: var(--ngaf-chat-space-2);\n }\n .chat-sidenav__action {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text);\n border-radius: 8px;\n cursor: pointer;\n font-family: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n font-weight: 400;\n text-align: left;\n }\n .chat-sidenav__action:hover { background: var(--ngaf-chat-surface-alt); }\n .chat-sidenav__action:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action {\n width: 36px;\n height: 36px;\n padding: 0;\n justify-content: center;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action-label {\n display: none;\n }\n /* Primary CTA pill — defined AFTER the generic .chat-sidenav__action\n rule so its background/padding/radius win the cascade with equal\n specificity. The earlier --new block above is kept for the\n collapsed-mode overrides (which are :host-prefixed, higher\n specificity, so they still apply). */\n .chat-sidenav__action.chat-sidenav__action--new {\n background: var(--ngaf-chat-text);\n color: var(--ngaf-chat-bg);\n border-radius: 8px;\n padding: 12px 18px;\n font-weight: 600;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-sidenav__action.chat-sidenav__action--new:hover {\n background: var(--ngaf-chat-text);\n filter: brightness(0.92);\n }\n .chat-sidenav__action-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n .chat-sidenav__primary,\n .chat-sidenav__sections {\n flex-shrink: 0;\n }\n .chat-sidenav__threads {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n .chat-sidenav__threads-heading {\n padding: 8px 12px 4px;\n font-size: 11px;\n color: var(--ngaf-chat-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__threads-heading {\n display: none;\n }\n .chat-sidenav__footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-top: 1px solid var(--ngaf-chat-separator);\n gap: 8px;\n flex-shrink: 0;\n }\n .chat-sidenav__footer-left {\n display: flex;\n align-items: center;\n gap: 4px;\n min-height: 28px;\n }\n .chat-sidenav__debug {\n height: 28px;\n min-width: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n padding: 0 9px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 500;\n }\n .chat-sidenav__debug:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-sidenav__debug:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-sidenav__debug-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #22c55e;\n box-shadow: 0 0 8px color-mix(in srgb, #22c55e 60%, transparent);\n flex: 0 0 auto;\n }\n .chat-sidenav__debug-dot--streaming {\n animation: chat-sidenav-debug-pulse 1.2s ease-in-out infinite;\n }\n @keyframes chat-sidenav-debug-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.6; transform: scale(0.85); }\n }\n .chat-sidenav__footer-right {\n display: flex;\n align-items: center;\n gap: 4px;\n /* Push to the right edge even when the left container is empty. */\n margin-left: auto;\n }\n .chat-sidenav__toggle {\n width: 28px;\n height: 28px;\n border-radius: 8px;\n border: 0;\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .chat-sidenav__toggle:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n /* Collapsed mode: footer becomes a vertical stack; debug stays visible. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer {\n flex-direction: column;\n align-items: center;\n padding: 10px 4px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer-left {\n display: flex;\n flex-direction: column;\n align-items: center;\n min-height: 28px;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__debug {\n width: 28px;\n padding: 0;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__debug-label,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer-left > :not(.chat-sidenav__debug) {\n display: none;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__footer-right {\n flex-direction: column;\n }\n /* Legacy [sidenavAccount] slot: kept renderable but visually folded into\n the new footer. Existing consumers' content still projects; the slot\n just renders in the footer-right area visually. */\n .chat-sidenav__account {\n display: none;\n }\n .chat-sidenav__account:has(> *) {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .chat-sidenav__archived { flex-shrink: 0; }\n .chat-sidenav__archived-heading {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--ngaf-chat-text);\n font: inherit;\n font-size: var(--ngaf-chat-font-size-sm);\n text-align: left;\n cursor: pointer;\n }\n .chat-sidenav__archived-heading:hover {\n background: var(--ngaf-chat-surface-alt);\n color: var(--ngaf-chat-text);\n }\n .chat-sidenav__archived-heading:focus-visible {\n outline: 2px solid var(--ngaf-chat-primary);\n outline-offset: 2px;\n }\n .chat-sidenav__archived-chevron {\n width: 12px;\n height: 12px;\n transition: transform 150ms ease;\n flex-shrink: 0;\n }\n .chat-sidenav__archived[data-open=\"true\"] .chat-sidenav__archived-chevron {\n transform: rotate(90deg);\n }\n .chat-sidenav__archived-empty {\n padding: 8px 12px;\n color: var(--ngaf-chat-text-muted);\n font-size: var(--ngaf-chat-font-size-sm);\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__archived { display: none; }\n .chat-sidenav__projects { flex-shrink: 0; }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__projects { display: none; }\n\n /* Collapsed-mode thread row presentation: hide labels, kebab and grip;\n * surface the per-thread initial circle so the strip reads as a list of\n * threads rather than an empty column. */\n :host([data-mode=\"collapsed\"]) .chat-thread-list__initial {\n display: inline-flex;\n }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item-title { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item-time { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__kebab { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__grip { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item-wrap {\n justify-content: center;\n }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__item {\n padding: 6px;\n justify-content: center;\n align-items: center;\n flex-direction: row;\n }\n :host([data-mode=\"collapsed\"]) .chat-thread-list__new { display: none; }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--search {\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 10px;\n justify-content: center;\n background: transparent;\n }\n :host([data-mode=\"collapsed\"]) .chat-sidenav__action--search .chat-sidenav__action-label {\n display: none;\n }\n /* Collapsed: thread list, project list, archived block, sections — all hidden. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__threads,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__projects,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__archived,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__sections,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__primary {\n display: none;\n }\n /* Collapsed: reduce horizontal padding so 32×32 buttons sit centered. */\n :host([data-mode=\"collapsed\"]) .chat-sidenav__topbar,\n :host([data-mode=\"collapsed\"]) .chat-sidenav__actions {\n padding: 8px 4px;\n align-items: center;\n justify-content: center;\n }\n`;\n","// SPDX-License-Identifier: MIT\ndeclare const THREADPLANE_CHAT_DEBUG: boolean;\ndeclare const ngDevMode: boolean;\n\nexport const CHAT_DEBUG_INCLUDED =\n ngDevMode ||\n (typeof THREADPLANE_CHAT_DEBUG !== 'undefined' && THREADPLANE_CHAT_DEBUG === true);\n","// libs/chat/src/lib/compositions/chat-sidenav/chat-sidenav.component.ts\n// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ComponentRef,\n DestroyRef,\n effect,\n Injector,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewContainerRef,\n type OutputRefSubscription,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\nimport { CHAT_SIDENAV_STYLES } from '../../styles/chat-sidenav.styles';\nimport {\n ChatThreadListComponent,\n type Thread,\n type ThreadActionAdapter,\n} from '../../primitives/chat-thread-list/chat-thread-list.component';\nimport {\n ChatProjectListComponent,\n type Project,\n type ProjectActionAdapter,\n} from '../../primitives/chat-project-list/chat-project-list.component';\nimport type { Agent, AgentWithHistory } from '../../agent';\nimport { CHAT_DEBUG_INCLUDED } from './chat-debug-gate';\n\nexport type ChatSidenavMode = 'expanded' | 'collapsed' | 'drawer';\ntype ChatDebugDock = 'right' | 'bottom' | 'left';\n\ninterface ChatDebugInstance {\n setOpen(value: boolean): void;\n setDock?(dock: ChatDebugDock): void;\n openChange?: {\n subscribe(callback: (open: boolean) => void): OutputRefSubscription;\n };\n dockChange?: {\n subscribe(callback: (dock: ChatDebugDock) => void): OutputRefSubscription;\n };\n}\n\n@Component({\n selector: 'chat-sidenav',\n standalone: true,\n imports: [ChatThreadListComponent, ChatProjectListComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-mode]': 'mode()',\n '[attr.data-open]': 'open() ? \"true\" : \"false\"',\n },\n styles: [CHAT_HOST_TOKENS, CHAT_SIDENAV_STYLES],\n template: `\n <nav\n class=\"chat-sidenav\"\n aria-label=\"Sidebar navigation\"\n tabindex=\"-1\"\n (keydown.escape)=\"onEscape()\"\n >\n <div class=\"chat-sidenav__header\">\n <ng-content select=\"[sidenavHeader]\" />\n </div>\n\n <div class=\"chat-sidenav__topbar\">\n <button\n type=\"button\"\n class=\"chat-sidenav__action chat-sidenav__action--new\"\n (click)=\"newChat.emit()\"\n aria-label=\"New chat\"\n title=\"New chat\"\n >\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n <span class=\"chat-sidenav__action-label\">New chat</span>\n </button>\n @if (mode() === 'drawer') {\n <button\n type=\"button\"\n class=\"chat-sidenav__action chat-sidenav__action--close\"\n (click)=\"openChange.emit(false)\"\n aria-label=\"Close conversations\"\n title=\"Close conversations\"\n >\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n <span class=\"chat-sidenav__action-label\">Close</span>\n </button>\n }\n </div>\n\n <div class=\"chat-sidenav__actions\">\n <button\n type=\"button\"\n class=\"chat-sidenav__action chat-sidenav__action--search\"\n (click)=\"searchOpened.emit()\"\n aria-label=\"Search conversations\"\n title=\"Search conversations (⌘K)\"\n >\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n <span class=\"chat-sidenav__action-label\">Search</span>\n </button>\n </div>\n\n <div class=\"chat-sidenav__primary\">\n <ng-content select=\"[sidenavPrimary]\" />\n </div>\n\n @if (projects() !== null) {\n <div class=\"chat-sidenav__projects\">\n <div class=\"chat-sidenav__threads-heading\">Projects</div>\n <chat-project-list\n [projects]=\"projects()!\"\n [activeProjectId]=\"selectedProjectId()\"\n [showNewProjectButton]=\"!!projectActions()?.create\"\n [actions]=\"projectActions()\"\n (projectSelected)=\"projectSelected.emit($event)\"\n (newProjectRequested)=\"newProjectRequested.emit()\"\n />\n </div>\n } @if (threads() !== null) {\n <div class=\"chat-sidenav__threads\">\n <div class=\"chat-sidenav__threads-heading\">Recent</div>\n <chat-thread-list\n [threads]=\"threads()!\"\n [activeThreadId]=\"activeThreadId() ?? ''\"\n [actions]=\"actions()\"\n [projects]=\"projects()\"\n (threadSelected)=\"threadSelected.emit($event)\"\n />\n </div>\n } @if (archivedThreads() !== null) {\n <div\n class=\"chat-sidenav__archived\"\n [attr.data-open]=\"archivedOpen() ? 'true' : 'false'\"\n >\n <button\n type=\"button\"\n class=\"chat-sidenav__archived-heading\"\n [attr.aria-expanded]=\"archivedOpen() ? 'true' : 'false'\"\n aria-controls=\"chat-sidenav__archived-list\"\n (click)=\"archivedOpen.set(!archivedOpen())\"\n >\n <svg\n class=\"chat-sidenav__archived-chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n <span>Archived</span>\n </button>\n @if (archivedOpen()) {\n <div id=\"chat-sidenav__archived-list\">\n @if (archivedThreads()!.length === 0) {\n <div class=\"chat-sidenav__archived-empty\">\n No archived conversations.\n </div>\n } @else {\n <chat-thread-list\n mode=\"archived\"\n [threads]=\"archivedThreads()!\"\n [activeThreadId]=\"activeThreadId() ?? ''\"\n [actions]=\"actions()\"\n [projects]=\"projects()\"\n (threadSelected)=\"threadSelected.emit($event)\"\n />\n }\n </div>\n }\n </div>\n }\n\n <div class=\"chat-sidenav__sections\">\n <ng-content select=\"[sidenavSections]\" />\n </div>\n\n <div class=\"chat-sidenav__footer\">\n <div class=\"chat-sidenav__footer-left\">\n @if (showDebugButton()) {\n <button\n type=\"button\"\n class=\"chat-sidenav__debug\"\n aria-label=\"Open chat devtools\"\n title=\"Open chat devtools\"\n (click)=\"openDebug($event)\"\n >\n <span\n class=\"chat-sidenav__debug-dot\"\n [class.chat-sidenav__debug-dot--streaming]=\"isDebugStreaming()\"\n aria-hidden=\"true\"\n ></span>\n @if (mode() !== 'collapsed') {\n <span class=\"chat-sidenav__debug-label\">Devtools</span>\n }\n </button>\n }\n <ng-content select=\"[sidenavFooterLeft]\" />\n </div>\n <div class=\"chat-sidenav__footer-right\">\n <ng-content select=\"[sidenavFooterRight]\" />\n @if (mode() !== 'drawer') {\n <button\n type=\"button\"\n class=\"chat-sidenav__toggle\"\n (click)=\"onCollapseToggle()\"\n [attr.aria-label]=\"\n mode() === 'collapsed' ? 'Expand sidenav' : 'Collapse sidenav'\n \"\n [attr.title]=\"\n (mode() === 'collapsed' ? 'Expand sidenav' : 'Collapse sidenav') +\n ' (⌘B)'\n \"\n >\n @if (mode() === 'collapsed') {\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n } @else {\n <svg\n class=\"chat-sidenav__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 6 9 12 15 18\" />\n </svg>\n }\n </button>\n }\n </div>\n <!-- Legacy slot kept for back-compat — see chat-sidenav.styles.ts for visibility rules -->\n <div class=\"chat-sidenav__account\">\n <ng-content select=\"[sidenavAccount]\" />\n </div>\n </div>\n </nav>\n <ng-container #debugHost />\n `,\n})\nexport class ChatSidenavComponent {\n readonly mode = input<ChatSidenavMode>('expanded');\n readonly open = input<boolean>(false);\n readonly threads = input<Thread[] | null>(null);\n readonly activeThreadId = input<string | null>(null);\n readonly actions = input<ThreadActionAdapter | null>(null);\n readonly archivedThreads = input<Thread[] | null>(null);\n readonly projects = input<Project[] | null>(null);\n readonly selectedProjectId = input<string | null>(null);\n readonly projectActions = input<ProjectActionAdapter | null>(null);\n readonly agent = input<Agent | AgentWithHistory | null>(null);\n readonly debug = input<boolean>(true);\n\n readonly newChat = output<void>();\n readonly threadSelected = output<string>();\n readonly searchOpened = output<void>();\n readonly openChange = output<boolean>();\n readonly modeChange = output<ChatSidenavMode>();\n readonly projectSelected = output<string>();\n readonly newProjectRequested = output<void>();\n\n protected readonly archivedOpen = signal<boolean>(false);\n protected readonly showDebugButton = computed(\n () => CHAT_DEBUG_INCLUDED && this.debug() && this.agent() !== null\n );\n protected readonly isDebugStreaming = computed(\n () => this.agent()?.status?.() === 'running'\n );\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly debugHost = viewChild('debugHost', {\n read: ViewContainerRef,\n });\n private debugRef: ComponentRef<ChatDebugInstance> | null = null;\n private debugOutputSubscriptions: OutputRefSubscription[] = [];\n private currentDebugDock: ChatDebugDock = 'right';\n\n constructor() {\n this.destroyRef.onDestroy(() => this.destroyDebug());\n\n effect(() => {\n const showDebug = this.showDebugButton();\n const agent = this.agent();\n if (!showDebug || !agent) {\n this.destroyDebug();\n return;\n }\n this.debugRef?.setInput('agent', agent);\n });\n\n fromEvent<KeyboardEvent>(window, 'keydown')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((e) => {\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key !== 'k' && key !== 'b') return;\n const t = e.target as HTMLElement | null;\n if (t) {\n const tag = t.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || t.isContentEditable)\n return;\n }\n if (key === 'k') {\n e.preventDefault();\n this.searchOpened.emit();\n return;\n }\n // Cmd/Ctrl+B: toggle expanded ↔ collapsed (no-op in drawer mode).\n if (this.mode() === 'drawer') return;\n e.preventDefault();\n this.modeChange.emit(\n this.mode() === 'collapsed' ? 'expanded' : 'collapsed'\n );\n });\n }\n\n protected openDebug(event: MouseEvent): void {\n event.stopPropagation();\n void this.ensureDebugPanel();\n }\n\n protected onEscape(): void {\n if (this.mode() === 'drawer' && this.open()) {\n this.openChange.emit(false);\n }\n }\n\n protected onCollapseToggle(): void {\n const m = this.mode();\n if (m === 'drawer') return;\n this.modeChange.emit(m === 'collapsed' ? 'expanded' : 'collapsed');\n }\n\n private async ensureDebugPanel(): Promise<void> {\n if (!CHAT_DEBUG_INCLUDED) {\n return;\n }\n if (!this.showDebugButton()) {\n this.destroyDebug();\n return;\n }\n const host = this.debugHost();\n const agent = this.agent();\n if (!host || !agent) return;\n\n if (!this.debugRef) {\n const { ChatDebugComponent } = await import('@threadplane/chat/debug');\n if (!this.showDebugButton()) return;\n this.debugRef = host.createComponent(ChatDebugComponent, {\n injector: this.injector,\n });\n this.debugRef.setInput('launcher', 'none');\n this.debugRef.setInput('storageKey', 'chat-sidenav-debug');\n const initialDock = this.defaultDebugDock();\n this.debugRef.setInput('dock', initialDock);\n const openSub = this.debugRef.instance.openChange?.subscribe((open) => {\n if (open) {\n this.setDebugEdgeClaim(this.currentDebugDock);\n } else {\n this.clearDebugEdgeClaim();\n }\n });\n const dockSub = this.debugRef.instance.dockChange?.subscribe((dock) => {\n this.currentDebugDock = dock;\n this.setDebugEdgeClaim(dock);\n });\n this.debugOutputSubscriptions = [\n openSub,\n dockSub,\n ].filter((sub): sub is OutputRefSubscription => !!sub);\n this.currentDebugDock = initialDock;\n this.setDebugEdgeClaim(initialDock);\n }\n\n this.debugRef.setInput('agent', agent);\n this.debugRef.instance.setOpen(true);\n this.debugRef.changeDetectorRef.detectChanges();\n if (this.currentDebugDock === 'bottom') {\n this.debugRef.instance.setDock?.('bottom');\n this.debugRef.changeDetectorRef.detectChanges();\n }\n this.setDebugEdgeClaim(this.currentDebugDock);\n }\n\n private destroyDebug(): void {\n for (const subscription of this.debugOutputSubscriptions) {\n subscription.unsubscribe();\n }\n this.debugOutputSubscriptions = [];\n this.debugRef?.destroy();\n this.debugRef = null;\n this.clearDebugEdgeClaim();\n }\n\n private defaultDebugDock(): ChatDebugDock {\n if (typeof document === 'undefined') return 'right';\n return document.querySelector('chat-sidebar') ? 'bottom' : 'right';\n }\n\n private setDebugEdgeClaim(dock: ChatDebugDock): void {\n if (typeof document === 'undefined') return;\n document.documentElement.dataset['threadplaneChatDebug'] = dock;\n }\n\n private clearDebugEdgeClaim(): void {\n if (typeof document === 'undefined') return;\n delete document.documentElement.dataset['threadplaneChatDebug'];\n }\n}\n","// libs/chat/src/lib/primitives/chat-sidenav-scrim/chat-sidenav-scrim.component.ts\n// SPDX-License-Identifier: MIT\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n/**\n * Backdrop scrim for chat-sidenav's drawer mode, rendered as a sibling of\n * <chat-sidenav> so its z-index sits cleanly between the page content\n * and the drawer host (escapes the drawer host's stacking context).\n *\n * Usage:\n * <chat-sidenav-scrim [open]=\"drawerOpen()\" (dismiss)=\"drawerOpen.set(false)\" />\n * <chat-sidenav [(open)]=\"drawerOpen\" ...></chat-sidenav>\n */\n@Component({\n selector: 'chat-sidenav-scrim',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"chat-sidenav-scrim__button\"\n aria-label=\"Close conversations\"\n (click)=\"dismiss.emit()\"\n ></button>\n }\n `,\n styles: [\n `\n :host { display: contents; }\n .chat-sidenav-scrim__button {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: var(--ngaf-chat-z-drawer-scrim, 1000);\n border: 0;\n padding: 0;\n cursor: pointer;\n }\n `,\n ],\n})\nexport class ChatSidenavScrimComponent {\n /** When true, render the backdrop button covering the viewport. */\n readonly open = input<boolean>(false);\n /** Fires when the user clicks the backdrop. */\n readonly dismiss = output<void>();\n}\n","// SPDX-License-Identifier: MIT\nimport {\n Component,\n computed,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport type { Agent } from '../../agent';\nimport type { AgentInterrupt } from '../../agent/agent-interrupt';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\nexport type InterruptAction = 'accept' | 'edit' | 'respond' | 'ignore';\n\n/**\n * Retrieves the current interrupt value from an Agent, or undefined when\n * the runtime does not expose interrupts.\n * Exported for unit testing without DOM rendering.\n */\nexport function getInterruptFromAgent(agent: Agent): AgentInterrupt | undefined {\n return agent.interrupt?.();\n}\n\n/**\n * Extracts a human-readable reason from an interrupt value. When the value\n * is an object with a string `reason` field, returns that directly. Falls\n * back to a JSON dump so consumers always see something rather than nothing.\n * Exported for unit testing.\n */\nexport function interruptReasonText(interrupt: AgentInterrupt | undefined): string {\n if (!interrupt) return '';\n const v = interrupt.value as { reason?: unknown } | undefined;\n if (v && typeof v === 'object' && typeof (v as { reason?: unknown }).reason === 'string') {\n return (v as { reason: string }).reason;\n }\n if (typeof v === 'string') return v;\n return JSON.stringify(v ?? '', null, 2);\n}\n\n@Component({\n selector: 'chat-interrupt-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n CHAT_HOST_TOKENS,\n `\n .chat-interrupt-panel {\n background: var(--ngaf-chat-surface);\n color: var(--ngaf-chat-text);\n border: 1px solid var(--ngaf-chat-separator);\n border-radius: var(--ngaf-chat-radius-card);\n padding: 14px 16px;\n font-size: var(--ngaf-chat-font-size-sm);\n }\n .chat-interrupt-panel__eyebrow {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.12em;\n color: var(--ngaf-chat-warning-text);\n margin: 0 0 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .chat-interrupt-panel__dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--ngaf-chat-warning-text);\n flex: 0 0 6px;\n }\n .chat-interrupt-panel__body {\n margin: 0 0 12px;\n color: var(--ngaf-chat-text);\n white-space: pre-wrap;\n }\n .chat-interrupt-panel__actions {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n align-items: center;\n }\n .btn {\n border: 0;\n padding: 6px 14px;\n border-radius: var(--ngaf-chat-radius-button);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: transform 200ms ease, opacity 200ms ease;\n }\n .btn:hover { transform: scale(1.03); }\n .btn-primary { background: var(--ngaf-chat-primary); color: var(--ngaf-chat-on-primary); }\n .btn-secondary { background: transparent; color: var(--ngaf-chat-text); border: 1px solid var(--ngaf-chat-separator); }\n .btn-text {\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n padding: 6px 10px;\n }\n .btn-text:hover { color: var(--ngaf-chat-text); }\n `,\n ],\n template: `\n @if (interrupt()) {\n <div role=\"alert\" class=\"chat-interrupt-panel\">\n <p class=\"chat-interrupt-panel__eyebrow\">\n <span class=\"chat-interrupt-panel__dot\" aria-hidden=\"true\"></span>\n Agent paused — review needed\n </p>\n <p class=\"chat-interrupt-panel__body\">{{ interruptReason() }}</p>\n <div class=\"chat-interrupt-panel__actions\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"action.emit('accept')\">Accept</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"action.emit('edit')\">Edit</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"action.emit('respond')\">Respond</button>\n <button type=\"button\" class=\"btn btn-text\" (click)=\"action.emit('ignore')\">Ignore</button>\n </div>\n </div>\n }\n `,\n})\nexport class ChatInterruptPanelComponent {\n readonly agent = input.required<Agent>();\n\n readonly action = output<InterruptAction>();\n\n readonly interrupt = computed(() => getInterruptFromAgent(this.agent()));\n\n readonly interruptReason = computed(() => interruptReasonText(this.interrupt()));\n}\n","// SPDX-License-Identifier: MIT\nimport {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n TemplateRef,\n computed,\n contentChild,\n effect,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Agent } from '../../agent';\nimport { CHAT_HOST_TOKENS } from '../../styles/chat-tokens';\n\nexport type ChatApprovalAction = 'approve' | 'edit' | 'cancel';\n\n@Component({\n selector: 'chat-approval-card',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\n CHAT_HOST_TOKENS,\n `\n :host { display: contents; }\n dialog.chat-approval-card {\n width: 440px;\n max-width: calc(100vw - 32px);\n /* Center in the viewport. The UA stylesheet sets margin:auto on open\n modal dialogs, but our reset properties below shadow it. Re-assert. */\n margin: auto;\n padding: 0;\n border: 0;\n border-radius: 12px;\n background: var(--ngaf-chat-surface);\n color: var(--ngaf-chat-text);\n box-shadow: 0 20px 50px rgba(0,0,0,0.18);\n }\n dialog.chat-approval-card::backdrop {\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n }\n .chat-approval-card__header {\n padding: 14px 16px 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n border-bottom: 1px solid var(--ngaf-chat-separator);\n }\n .chat-approval-card__header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--ngaf-chat-text);\n }\n .chat-approval-card__header svg {\n color: var(--ngaf-chat-warning-text);\n width: 16px;\n height: 16px;\n flex: 0 0 16px;\n }\n .chat-approval-card__body {\n padding: 14px 16px;\n font-size: var(--ngaf-chat-font-size-sm, 13px);\n color: var(--ngaf-chat-text);\n }\n .chat-approval-card__actions {\n padding: 8px 16px 14px;\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n align-items: center;\n }\n .btn {\n border: 0;\n padding: 6px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: transform 200ms ease, opacity 200ms ease;\n }\n .btn:hover { transform: scale(1.03); }\n .btn-primary { background: var(--ngaf-chat-primary); color: var(--ngaf-chat-on-primary); }\n .btn-secondary { background: transparent; color: var(--ngaf-chat-text); border: 1px solid var(--ngaf-chat-separator); }\n .btn-text {\n background: transparent;\n color: var(--ngaf-chat-text-muted);\n padding: 6px 10px;\n }\n .btn-text:hover { color: var(--ngaf-chat-text); }\n `,\n ],\n template: `\n <dialog #dialogEl class=\"chat-approval-card\" (close)=\"onDialogClose()\" (cancel)=\"onCancelEvent($event)\">\n <div class=\"chat-approval-card__header\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>\n <h4>{{ title() }}</h4>\n </div>\n <div class=\"chat-approval-card__body\">\n @if (bodyTemplate(); as tpl) {\n @if (payload(); as p) {\n <ng-container *ngTemplateOutlet=\"tpl; context: { $implicit: p }\"></ng-container>\n }\n }\n </div>\n <div class=\"chat-approval-card__actions\">\n <button type=\"button\" class=\"btn btn-text\" (click)=\"emit('cancel')\">Cancel</button>\n @if (showEdit()) {\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"emit('edit')\">Edit</button>\n }\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"emit('approve')\">Approve</button>\n </div>\n </dialog>\n `,\n})\nexport class ChatApprovalCardComponent {\n readonly agent = input.required<Agent>();\n readonly matchKind = input<string | undefined>(undefined);\n readonly title = input<string>('Approval required');\n readonly showEdit = input<boolean>(false);\n\n readonly action = output<ChatApprovalAction>();\n\n protected readonly bodyTemplate = contentChild<TemplateRef<unknown>>('body');\n private readonly dialogRef = viewChild<ElementRef<HTMLDialogElement>>('dialogEl');\n\n private readonly interrupt = computed(() => this.agent().interrupt?.());\n\n protected readonly payload = computed(() => {\n const i = this.interrupt();\n if (!i) return undefined;\n const v = i.value as { kind?: unknown } | undefined;\n const want = this.matchKind();\n if (want !== undefined) {\n if (!v || typeof v !== 'object' || (v as { kind?: unknown }).kind !== want) {\n return undefined;\n }\n }\n return v;\n });\n\n constructor() {\n effect(() => {\n const p = this.payload();\n const dialog = this.dialogRef()?.nativeElement;\n if (!dialog) return;\n if (p && !dialog.open) {\n dialog.showModal();\n } else if (!p && dialog.open) {\n dialog.close();\n }\n });\n }\n\n protected emit(action: ChatApprovalAction): void {\n this.action.emit(action);\n // 'approve' and 'cancel' are terminal — they resolve the interrupt, so the\n // dialog closes. 'edit' is non-terminal: the caller reveals an inline\n // editor in the body slot and submits the resume itself, so we leave the\n // dialog open.\n if (action !== 'edit') {\n this.closeDialog();\n }\n }\n\n protected onCancelEvent(ev: Event): void {\n // Native dialog's cancel event fires on Escape. Treat as cancel.\n ev.preventDefault();\n this.action.emit('cancel');\n this.closeDialog();\n }\n\n private closeDialog(): void {\n const dialog = this.dialogRef()?.nativeElement;\n if (!dialog) return;\n if (dialog.open) dialog.close();\n }\n\n protected onDialogClose(): void {\n // Native close — no-op; emit happens in emit() / onCancelEvent.\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { SecurityContext } from '@angular/core';\nimport type { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nlet markedParse: ((src: string) => string) | null = null;\nlet markedLoadAttempted = false;\nfunction ensureMarkedLoaded(): void {\n if (markedLoadAttempted) return;\n markedLoadAttempted = true;\n // Eagerly kick off the dynamic import so it's ready for subsequent calls\n void import('marked')\n .then((m) => {\n // GFM: enables tables, strikethrough, autolinks, task lists.\n // breaks: single \\n becomes <br>. LLM chat output frequently uses\n // soft line breaks for visual structure where stricter markdown\n // would treat them as continuation. Matching common chat UX.\n const opts = { async: false, gfm: true, breaks: true } as const;\n markedParse = (src: string) => (m as any).marked.parse(src, opts) as string;\n })\n .catch(() => {\n markedParse = null;\n });\n}\n\n// Kick off the import at module load time so it resolves before first render\nensureMarkedLoaded();\n\n/**\n * Escape and convert plain text to basic HTML (fallback when marked is unavailable).\n */\nfunction plainTextToHtml(content: string): string {\n return content\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\n/g, '<br>');\n}\n\n/**\n * Renders markdown content to sanitized HTML.\n * Falls back to plain text with newline->br conversion if `marked` is not installed.\n */\nexport function renderMarkdown(content: string, sanitizer: DomSanitizer): SafeHtml {\n if (markedParse) {\n const html = markedParse(content);\n return sanitizer.bypassSecurityTrustHtml(\n sanitizer.sanitize(SecurityContext.HTML, html) ?? ''\n );\n }\n // Fallback: escape HTML and convert newlines to <br>\n return sanitizer.bypassSecurityTrustHtml(plainTextToHtml(content));\n}\n\n/**\n * Renders markdown to a sanitized HTML string (not SafeHtml).\n * Used by the streaming markdown component for direct innerHTML assignment.\n */\nexport function renderMarkdownToString(content: string, sanitizer: DomSanitizer): string {\n if (markedParse) {\n const html = markedParse(content);\n return sanitizer.sanitize(SecurityContext.HTML, html) ?? '';\n }\n return plainTextToHtml(content);\n}\n","// SPDX-License-Identifier: MIT\nimport type { Type } from '@angular/core';\nimport type { RenderViewEntry } from '@threadplane/render';\n\n/** Catalog entry for the A2UI surface renderer.\n *\n * `component` is mounted once all of the component's bindings (data\n * model paths referenced in its prop expressions) have resolved. While\n * any binding is unpopulated, the `fallback` is mounted instead. If\n * `fallback` is omitted, the lib's default fallback\n * (`A2uiDefaultFallbackComponent`) is mounted.\n *\n * This is a chat-side alias for the shared `RenderViewEntry` shape so\n * consumers of `@threadplane/chat` don't have to import from `@threadplane/render`. */\nexport type A2uiViewEntry = RenderViewEntry;\n\n/** Catalog shape accepted by `<a2ui-surface>`. Each entry is either a\n * bare `Type<unknown>` (legacy shape — no per-component fallback) or\n * an `A2uiViewEntry`. */\nexport type A2uiViews = Readonly<Record<string, Type<unknown> | A2uiViewEntry>>;\n\n/** Normalize a catalog entry to the `A2uiViewEntry` shape. Bare\n * `Type<unknown>` entries are wrapped as `{ component }`; entries\n * already in the discriminated shape are returned unchanged. */\nexport function normalizeViewEntry(\n entry: Type<unknown> | A2uiViewEntry,\n): A2uiViewEntry {\n if (typeof entry === 'function') return { component: entry };\n return entry;\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-audio-player',\n standalone: true,\n template: `\n <div class=\"a2ui-audio-wrap\">\n @if (description()) {\n <span class=\"a2ui-audio-description\">{{ description() }}</span>\n }\n <audio\n class=\"a2ui-audio\"\n [src]=\"url()\"\n [autoplay]=\"autoPlay()\"\n [controls]=\"controls()\"\n ></audio>\n </div>\n `,\n styles: [`\n .a2ui-audio-wrap {\n display: flex;\n flex-direction: column;\n gap: var(--a2ui-spacing-1);\n }\n .a2ui-audio-description {\n font-size: var(--a2ui-typography-caption-size);\n color: var(--a2ui-on-surface-variant);\n }\n .a2ui-audio {\n display: block;\n width: 100%;\n }\n `],\n})\nexport class A2uiAudioPlayerComponent {\n readonly url = input<string>('');\n /** v1 canonical prop: short description / title rendered above the player. */\n readonly description = input<string>('');\n /** v1 prop name: autoPlay (camelCase). */\n readonly autoPlay = input<boolean>(false);\n readonly controls = input<boolean>(true);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-button',\n standalone: true,\n imports: [RenderElementComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n [class]=\"primary() ? 'a2ui-btn a2ui-btn--primary' : 'a2ui-btn a2ui-btn--secondary'\"\n [disabled]=\"disabled()\"\n (click)=\"handleClick()\"\n >\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </button>\n `,\n styles: [`\n .a2ui-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-4);\n border-radius: var(--a2ui-shape-small);\n font-size: var(--a2ui-typography-body-size);\n font-weight: 500;\n cursor: pointer;\n transition: background var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard),\n opacity var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n border: none;\n }\n .a2ui-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .a2ui-btn--primary {\n background: var(--a2ui-primary);\n color: var(--a2ui-on-primary);\n }\n .a2ui-btn--primary:hover:not(:disabled) { background: var(--a2ui-primary-hover); }\n .a2ui-btn--secondary {\n background: var(--a2ui-surface-variant);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n }\n .a2ui-btn--secondary:hover:not(:disabled) { background: var(--a2ui-outline); }\n `],\n})\nexport class A2uiButtonComponent {\n /** v1: child Text component is rendered inside the button via childKeys. */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly primary = input<boolean>(true);\n readonly disabled = input<boolean>(false);\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n\n handleClick(): void {\n this.emit()('click');\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-card',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div class=\"a2ui-card\">\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-card {\n display: flex;\n flex-direction: column;\n gap: var(--a2ui-spacing-2);\n border-radius: var(--a2ui-shape-medium);\n border: 1px solid var(--a2ui-outline);\n background: var(--a2ui-surface);\n padding: var(--a2ui-spacing-4);\n box-shadow: var(--a2ui-elevation-1);\n }\n `],\n})\nexport class A2uiCardComponent {\n /** v1: a single child key, delivered via childKeys[0] from the render framework. */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n}\n","// SPDX-License-Identifier: MIT\nimport type { RenderHost } from '@threadplane/render';\n\n/** Writes a typed value to the render state store if the prop has a binding path. */\nexport function emitBinding(\n host: RenderHost,\n bindings: Record<string, string> | undefined,\n prop: string,\n value: unknown,\n): void {\n const path = bindings?.[prop];\n if (path) {\n host.set(path, value);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n@Component({\n selector: 'a2ui-check-box',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label class=\"a2ui-cb\">\n <input type=\"checkbox\" [checked]=\"effectiveValue()\" (change)=\"onChange($event)\" class=\"a2ui-cb__input\" />\n {{ label() }}\n </label>\n `,\n styles: [`\n .a2ui-cb {\n display: flex;\n align-items: center;\n gap: var(--a2ui-spacing-2);\n font-size: var(--a2ui-typography-body-size);\n cursor: pointer;\n }\n .a2ui-cb__input {\n width: 16px;\n height: 16px;\n border-radius: var(--a2ui-shape-extra-small);\n cursor: pointer;\n accent-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiCheckBoxComponent {\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 canonical prop: boolean checked state. */\n readonly value = input<boolean | undefined>(undefined);\n /** Pre-v1 alias retained for back-compat. */\n readonly checked = input<boolean>(false);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly effectiveValue = computed(() => this.value() ?? this.checked());\n\n onChange(event: Event): void {\n const val = (event.target as HTMLInputElement).checked;\n // Emit on whichever binding the surface declared. v1 surfaces use\n // `value`; pre-v1 used `checked`.\n const bound = this._bindings();\n if (bound['value']) {\n emitBinding(this.host, bound, 'value', val);\n } else {\n emitBinding(this.host, bound, 'checked', val);\n }\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\ntype ColumnAlignment = 'start' | 'center' | 'end' | 'stretch';\n\nconst ALIGN_MAP: Record<ColumnAlignment, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', stretch: 'stretch',\n};\n\n@Component({\n selector: 'a2ui-column',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div class=\"a2ui-col\" [style.align-items]=\"alignItems()\" [style.gap.px]=\"gapPx()\">\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-col {\n display: flex;\n flex-direction: column;\n }\n `],\n})\nexport class A2uiColumnComponent {\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly gap = input<number>(3);\n readonly alignment = input<ColumnAlignment>('start');\n readonly distribution = input<'start' | 'center' | 'end' | 'spaceBetween' | 'spaceAround' | 'spaceEvenly'>('start');\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly alignItems = computed(() => ALIGN_MAP[this.alignment()] ?? 'flex-start');\n /** Convert the Tailwind gap unit (multiples of 4px) to pixels. */\n protected readonly gapPx = computed(() => this.gap() * 4);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n@Component({\n selector: 'a2ui-date-time-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-dti\">\n @if (label()) {\n <label [htmlFor]=\"_inputId\" class=\"a2ui-dti__label\">{{ label() }}</label>\n }\n <input\n [id]=\"_inputId\"\n [type]=\"htmlInputType()\"\n [value]=\"value()\"\n class=\"a2ui-dti__input\"\n (change)=\"onChange($event)\"\n />\n </div>\n `,\n styles: [`\n .a2ui-dti { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-dti__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-dti__input {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-3);\n font-size: var(--a2ui-typography-body-size);\n border-radius: var(--a2ui-shape-small);\n background: var(--a2ui-input-bg);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n outline: none;\n transition: border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n }\n .a2ui-dti__input:focus {\n outline: var(--a2ui-focus-ring-width) solid var(--a2ui-focus-ring-color);\n outline-offset: 2px;\n border-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiDateTimeInputComponent {\n private static _idCounter = 0;\n protected readonly _inputId = `a2ui-date-time-input-${++A2uiDateTimeInputComponent._idCounter}`;\n\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 prop: value (resolved DynamicString). */\n readonly value = input<string>('');\n /** v1 prop: enableDate — include date portion. */\n readonly enableDate = input<boolean>(true);\n /** v1 prop: enableTime — include time portion. */\n readonly enableTime = input<boolean>(false);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n /** Derives HTML input type from enableDate + enableTime. */\n protected readonly htmlInputType = computed<string>(() => {\n const d = this.enableDate();\n const t = this.enableTime();\n if (d && t) return 'datetime-local';\n if (t) return 'time';\n return 'date';\n });\n\n onChange(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n emitBinding(this.host, this._bindings(), 'value', val);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-divider',\n standalone: true,\n template: `\n @if (orientation() === 'vertical') {\n <div class=\"a2ui-divider a2ui-divider--vertical\"></div>\n } @else {\n <hr class=\"a2ui-divider a2ui-divider--horizontal\" />\n }\n `,\n styles: [`\n .a2ui-divider--horizontal {\n display: block;\n width: 100%;\n border: none;\n border-top: 1px solid var(--a2ui-outline);\n margin: var(--a2ui-spacing-2) 0;\n }\n .a2ui-divider--vertical {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n background: var(--a2ui-outline);\n margin: 0 var(--a2ui-spacing-2);\n }\n `],\n})\nexport class A2uiDividerComponent {\n /** Canonical v1 spec name. The LLM emits this. */\n readonly axis = input<'horizontal' | 'vertical' | undefined>(undefined);\n /** Older alias retained for json-render usage and back-compat. */\n readonly direction = input<'horizontal' | 'vertical'>('horizontal');\n /** Effective axis — `axis` wins if provided, otherwise fall back to `direction`. */\n protected readonly orientation = computed<'horizontal' | 'vertical'>(() =>\n this.axis() ?? this.direction()\n );\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-icon',\n standalone: true,\n template: `\n <span\n class=\"a2ui-icon\"\n [style.font-size]=\"size() ? size() + 'px' : '1.125rem'\"\n [attr.aria-label]=\"effectiveName()\"\n >{{ effectiveName() }}</span>\n `,\n styles: [`\n .a2ui-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n user-select: none;\n }\n `],\n})\nexport class A2uiIconComponent {\n /** v1 canonical prop. */\n readonly name = input<string | undefined>(undefined);\n /** Pre-v1 alias retained for back-compat. */\n readonly icon = input<string>('');\n readonly size = input<number | null>(null);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly effectiveName = computed(() => this.name() ?? this.icon());\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n/** v1 fit values mapped 1:1 to CSS object-fit. */\ntype ImageFit = 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';\n\n/** v1 usageHint maps to a sizing preset. The component renders fluid by\n * default; usageHint sets a max-width / aspect-ratio to match common\n * intents. */\ntype ImageUsageHint = 'icon' | 'avatar' | 'smallFeature' | 'mediumFeature' | 'largeFeature' | 'header';\n\nconst USAGE_HINT_STYLE: Record<ImageUsageHint, { maxWidth: string; aspectRatio?: string; borderRadius?: string }> = {\n icon: { maxWidth: '24px', aspectRatio: '1 / 1' },\n avatar: { maxWidth: '48px', aspectRatio: '1 / 1', borderRadius: '50%' },\n smallFeature: { maxWidth: '160px' },\n mediumFeature: { maxWidth: '320px' },\n largeFeature: { maxWidth: '480px' },\n header: { maxWidth: '100%', aspectRatio: '16 / 5' },\n};\n\n@Component({\n selector: 'a2ui-image',\n standalone: true,\n template: `\n <img\n class=\"a2ui-img\"\n [src]=\"url()\"\n [alt]=\"alt()\"\n [style.width]=\"explicitWidth()\"\n [style.height]=\"explicitHeight()\"\n [style.object-fit]=\"fit()\"\n [style.max-width]=\"hintStyle()?.maxWidth\"\n [style.aspect-ratio]=\"hintStyle()?.aspectRatio || null\"\n [style.border-radius]=\"hintStyle()?.borderRadius || null\"\n />\n `,\n styles: [`\n .a2ui-img {\n display: block;\n max-width: 100%;\n border-radius: var(--a2ui-shape-extra-small);\n }\n `],\n})\nexport class A2uiImageComponent {\n readonly url = input<string>('');\n readonly alt = input<string>('');\n readonly width = input<number | null>(null);\n readonly height = input<number | null>(null);\n /** v1 prop: CSS object-fit equivalent. */\n readonly fit = input<ImageFit | undefined>(undefined);\n /** v1 prop: sizing preset. */\n readonly usageHint = input<ImageUsageHint | undefined>(undefined);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected explicitWidth(): string | null {\n return this.width() != null ? this.width() + 'px' : null;\n }\n protected explicitHeight(): string | null {\n return this.height() != null ? this.height() + 'px' : null;\n }\n protected hintStyle(): { maxWidth: string; aspectRatio?: string; borderRadius?: string } | null {\n const h = this.usageHint();\n return h ? USAGE_HINT_STYLE[h] : null;\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-list',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div [class]=\"listClass()\" [style.align-items]=\"alignmentCss()\">\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-list--vertical {\n display: flex;\n flex-direction: column;\n gap: var(--a2ui-spacing-1);\n overflow-y: auto;\n max-height: 384px;\n }\n .a2ui-list--horizontal {\n display: flex;\n flex-direction: row;\n gap: var(--a2ui-spacing-1);\n overflow-x: auto;\n }\n `],\n})\nexport class A2uiListComponent {\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly direction = input<'vertical' | 'horizontal'>('vertical');\n /** v1 canonical prop: cross-axis alignment. */\n readonly alignment = input<'start' | 'center' | 'end' | 'stretch' | undefined>(undefined);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly listClass = computed(() => {\n return this.direction() === 'horizontal'\n ? 'a2ui-list--horizontal'\n : 'a2ui-list--vertical';\n });\n\n protected readonly alignmentCss = computed<string | null>(() => {\n const a = this.alignment();\n if (!a) return null;\n return a === 'start' ? 'flex-start'\n : a === 'end' ? 'flex-end'\n : a; // center / stretch are valid CSS values as-is\n });\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-modal',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <!-- Entry point (trigger): always rendered inline, e.g. a button. -->\n @if (entryPointKey(); as epKey) {\n <div\n class=\"a2ui-modal__trigger\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"Open modal\"\n (click)=\"open.set(true)\"\n (keydown.enter)=\"open.set(true)\"\n (keydown.space)=\"open.set(true)\"\n >\n <render-element [elementKey]=\"epKey\" [spec]=\"spec()\" />\n </div>\n }\n\n <!-- Modal overlay: shown when open. -->\n @if (open()) {\n <div\n class=\"a2ui-modal__overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n class=\"a2ui-modal__backdrop\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"Dismiss dialog\"\n (click)=\"open.set(false)\"\n (keydown.enter)=\"open.set(false)\"\n (keydown.space)=\"open.set(false)\"\n ></div>\n <div class=\"a2ui-modal__panel\">\n @if (title()) {\n <h2 class=\"a2ui-modal__title\">{{ title() }}</h2>\n }\n @if (contentKey(); as cKey) {\n <render-element [elementKey]=\"cKey\" [spec]=\"spec()\" />\n }\n </div>\n </div>\n }\n `,\n styles: [`\n .a2ui-modal__trigger {\n display: contents;\n }\n .a2ui-modal__overlay {\n position: fixed;\n inset: 0;\n z-index: 50;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .a2ui-modal__backdrop {\n position: absolute;\n inset: 0;\n background: var(--a2ui-scrim);\n backdrop-filter: blur(4px);\n }\n .a2ui-modal__panel {\n position: relative;\n background: var(--a2ui-surface);\n border: 1px solid var(--a2ui-outline);\n border-radius: var(--a2ui-shape-medium);\n padding: var(--a2ui-spacing-5);\n max-width: 512px;\n width: 100%;\n margin: 0 var(--a2ui-spacing-4);\n box-shadow: var(--a2ui-elevation-4);\n }\n .a2ui-modal__title {\n font-size: var(--a2ui-typography-h4-size);\n font-weight: var(--a2ui-typography-h4-weight);\n margin: 0 0 var(--a2ui-spacing-4);\n }\n `],\n})\nexport class A2uiModalComponent {\n /**\n * v1: childKeys[0] = entryPointChild (inline trigger),\n * childKeys[1] = contentChild (modal body).\n */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n /** Resolved title string (from optional title DynamicString). */\n readonly title = input<string>('');\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly open = signal(false);\n\n protected readonly entryPointKey = computed(() => this.childKeys()[0] ?? null);\n protected readonly contentKey = computed(() => this.childKeys()[1] ?? null);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n/** Resolved option shape — label and value are plain strings after surface-to-spec resolves them. */\ninterface ResolvedOption {\n label: string;\n value: string;\n}\n\n@Component({\n selector: 'a2ui-multiple-choice',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-mc\">\n @if (label()) {\n <span class=\"a2ui-mc__label\">{{ label() }}</span>\n }\n\n @if (isSingleSelect()) {\n <!-- Single-select: HTML <select> -->\n <select class=\"a2ui-mc__select\" (change)=\"onSelectChange($event)\">\n @for (opt of options(); track opt.value) {\n <option [value]=\"opt.value\" [selected]=\"isSelected(opt.value)\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <!-- Multi-select: checkbox list -->\n <div class=\"a2ui-mc__checks\">\n @for (opt of options(); track opt.value) {\n <label class=\"a2ui-mc__check-row\">\n <input\n type=\"checkbox\"\n class=\"a2ui-mc__checkbox\"\n [checked]=\"isSelected(opt.value)\"\n (change)=\"onCheckChange(opt.value, $event)\"\n />\n {{ opt.label }}\n </label>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .a2ui-mc { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-mc__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-mc__select {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-3);\n font-size: var(--a2ui-typography-body-size);\n border-radius: var(--a2ui-shape-small);\n background: var(--a2ui-input-bg);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n outline: none;\n transition: border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n }\n .a2ui-mc__select:focus {\n outline: var(--a2ui-focus-ring-width) solid var(--a2ui-focus-ring-color);\n outline-offset: 2px;\n border-color: var(--a2ui-primary);\n }\n .a2ui-mc__checks { display: flex; flex-direction: column; gap: var(--a2ui-spacing-2); }\n .a2ui-mc__check-row {\n display: flex;\n align-items: center;\n gap: var(--a2ui-spacing-2);\n font-size: var(--a2ui-typography-body-size);\n cursor: pointer;\n }\n .a2ui-mc__checkbox {\n width: 16px;\n height: 16px;\n border-radius: var(--a2ui-shape-extra-small);\n cursor: pointer;\n accent-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiMultipleChoiceComponent {\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** Resolved current selections from surface-to-spec. Normalized in\n * `selectionsArray` because LLMs sometimes seed the data model with a\n * scalar (e.g. `\"5\"`) instead of an array (`[\"5\"]`); we coerce so\n * .includes() works either way. */\n readonly selections = input<string | string[] | undefined>(undefined);\n\n protected readonly selectionsArray = computed<string[]>(() => {\n const v = this.selections();\n if (Array.isArray(v)) return v;\n if (v == null || v === '') return [];\n return [String(v)];\n });\n /** Resolved options with plain string labels (surface-to-spec resolves DynamicString). */\n readonly options = input<ResolvedOption[]>([]);\n /** When ≤ 1 — render as single-select <select>; otherwise multi-select checkboxes. */\n readonly maxAllowedSelections = input<number>(1);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly isSingleSelect = computed(() => this.maxAllowedSelections() <= 1);\n\n protected isSelected(value: string): boolean {\n return this.selectionsArray().includes(value);\n }\n\n onSelectChange(event: Event): void {\n const val = (event.target as HTMLSelectElement).value;\n emitBinding(this.host, this._bindings(), 'selections', val);\n }\n\n onCheckChange(value: string, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n const current = [...this.selectionsArray()];\n const idx = current.indexOf(value);\n if (checked && idx === -1) {\n current.push(value);\n } else if (!checked && idx !== -1) {\n current.splice(idx, 1);\n }\n // Pass the updated selections array directly (typed value, no JSON stringification needed).\n emitBinding(this.host, this._bindings(), 'selections', current);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\ntype RowAlignment = 'start' | 'center' | 'end' | 'stretch';\ntype RowDistribution = 'start' | 'center' | 'end' | 'space-between' | 'space-around';\n\nconst ROW_ALIGN_MAP: Record<RowAlignment, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end', stretch: 'stretch',\n};\n\nconst ROW_JUSTIFY_MAP: Record<RowDistribution, string> = {\n start: 'flex-start', center: 'center', end: 'flex-end',\n 'space-between': 'space-between', 'space-around': 'space-around',\n};\n\n@Component({\n selector: 'a2ui-row',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div\n class=\"a2ui-row\"\n [style.align-items]=\"alignItems()\"\n [style.justify-content]=\"justifyContent()\"\n [style.gap.px]=\"gapPx()\"\n >\n @for (key of childKeys(); track key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n `,\n styles: [`\n .a2ui-row {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n }\n `],\n})\nexport class A2uiRowComponent {\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n readonly gap = input<number>(3);\n readonly alignment = input<RowAlignment>('start');\n readonly distribution = input<RowDistribution>('start');\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly alignItems = computed(() => ROW_ALIGN_MAP[this.alignment()] ?? 'flex-start');\n protected readonly justifyContent = computed(() => ROW_JUSTIFY_MAP[this.distribution()] ?? 'flex-start');\n /** Convert the gap unit (multiples of 4px) to pixels. */\n protected readonly gapPx = computed(() => this.gap() * 4);\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n@Component({\n selector: 'a2ui-slider',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-slider\">\n @if (label()) {\n <label [htmlFor]=\"_inputId\" class=\"a2ui-slider__label\">{{ label() }}: {{ value() }}</label>\n }\n <input\n [id]=\"_inputId\"\n type=\"range\"\n class=\"a2ui-slider__input\"\n [min]=\"minValue()\"\n [max]=\"maxValue()\"\n [step]=\"step()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n />\n </div>\n `,\n styles: [`\n .a2ui-slider { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-slider__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-slider__input {\n width: 100%;\n cursor: pointer;\n accent-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiSliderComponent {\n private static _idCounter = 0;\n protected readonly _inputId = `a2ui-slider-${++A2uiSliderComponent._idCounter}`;\n\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 prop: value (resolved DynamicNumber). */\n readonly value = input<number>(0);\n /** v1 prop: minValue. */\n readonly minValue = input<number>(0);\n /** v1 prop: maxValue. */\n readonly maxValue = input<number>(100);\n readonly step = input<number>(1);\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n onInput(event: Event): void {\n const val = Number((event.target as HTMLInputElement).value);\n emitBinding(this.host, this._bindings(), 'value', val);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, effect, input, signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { RenderElementComponent } from '@threadplane/render';\n\n@Component({\n selector: 'a2ui-tabs',\n standalone: true,\n imports: [RenderElementComponent],\n template: `\n <div class=\"a2ui-tabs\">\n <div class=\"a2ui-tabs__tablist\" role=\"tablist\">\n @for (title of tabTitles(); track $index) {\n <button\n role=\"tab\"\n [class]=\"$index === activeIndex() ? 'a2ui-tabs__tab a2ui-tabs__tab--active' : 'a2ui-tabs__tab'\"\n [attr.aria-selected]=\"$index === activeIndex()\"\n (click)=\"selectTab($index)\"\n >{{ title }}</button>\n }\n </div>\n <div class=\"a2ui-tabs__panel\" role=\"tabpanel\">\n @if (activeChildKey(); as key) {\n <render-element [elementKey]=\"key\" [spec]=\"spec()\" />\n }\n </div>\n </div>\n `,\n styles: [`\n .a2ui-tabs { display: flex; flex-direction: column; }\n .a2ui-tabs__tablist {\n display: flex;\n border-bottom: 1px solid var(--a2ui-outline);\n }\n .a2ui-tabs__tab {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-4);\n font-size: var(--a2ui-typography-body-size);\n font-weight: 500;\n cursor: pointer;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--a2ui-label);\n transition: color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard),\n border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n margin-bottom: -1px;\n }\n .a2ui-tabs__tab:hover { color: var(--a2ui-on-surface); }\n .a2ui-tabs__tab--active {\n border-bottom-color: var(--a2ui-primary);\n color: var(--a2ui-on-surface);\n }\n .a2ui-tabs__panel { padding-top: var(--a2ui-spacing-3); }\n `],\n})\nexport class A2uiTabsComponent {\n /** Resolved tab titles from tabItems[*].title — produced by surface-to-spec. */\n readonly tabTitles = input<string[]>([]);\n /** v1: each child key corresponds to a tab's contentChild (childKeys[i] ↔ tabTitles[i]). */\n readonly childKeys = input<string[]>([]);\n readonly spec = input.required<Spec>();\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n\n protected readonly activeIndex = signal(0);\n\n constructor() {\n // Reset active tab when the surface changes entirely.\n effect(() => {\n const len = this.childKeys().length;\n if (this.activeIndex() >= len && len > 0) this.activeIndex.set(0);\n });\n }\n\n protected readonly activeChildKey = computed(() => {\n const idx = this.activeIndex();\n const keys = this.childKeys();\n return idx >= 0 && idx < keys.length ? keys[idx] : null;\n });\n\n selectTab(index: number): void {\n this.activeIndex.set(index);\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\ntype UsageHint = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'caption' | 'body';\n\n@Component({\n selector: 'a2ui-text',\n standalone: true,\n template: `<span [class]=\"cssClass()\">{{ text() }}</span>`,\n styles: [`\n .a2ui-text-h1 {\n display: block;\n font-size: var(--a2ui-typography-h1-size);\n font-weight: var(--a2ui-typography-h1-weight);\n line-height: var(--a2ui-typography-h1-line-height);\n margin: 0;\n }\n .a2ui-text-h2 {\n display: block;\n font-size: var(--a2ui-typography-h2-size);\n font-weight: var(--a2ui-typography-h2-weight);\n line-height: var(--a2ui-typography-h2-line-height);\n margin: 0;\n }\n .a2ui-text-h3 {\n display: block;\n font-size: var(--a2ui-typography-h3-size);\n font-weight: var(--a2ui-typography-h3-weight);\n line-height: var(--a2ui-typography-h3-line-height);\n margin: 0;\n }\n .a2ui-text-h4 {\n display: block;\n font-size: var(--a2ui-typography-h4-size);\n font-weight: var(--a2ui-typography-h4-weight);\n line-height: var(--a2ui-typography-h4-line-height);\n margin: 0;\n }\n .a2ui-text-h5 {\n display: block;\n font-size: var(--a2ui-typography-h5-size);\n font-weight: var(--a2ui-typography-h5-weight);\n line-height: var(--a2ui-typography-h5-line-height);\n margin: 0;\n }\n .a2ui-text-caption {\n display: block;\n font-size: var(--a2ui-typography-caption-size);\n font-weight: var(--a2ui-typography-caption-weight);\n color: var(--a2ui-caption);\n line-height: var(--a2ui-typography-caption-line-height);\n }\n .a2ui-text-body {\n display: block;\n font-size: var(--a2ui-typography-body-size);\n font-weight: var(--a2ui-typography-body-weight);\n line-height: var(--a2ui-typography-body-line-height);\n }\n `],\n})\nexport class A2uiTextComponent {\n readonly text = input<string>('');\n readonly usageHint = input<UsageHint>('body');\n // Framework-mandated inputs the render harness passes to every element.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected cssClass(): string {\n return `a2ui-text-${this.usageHint()}`;\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { injectRenderHost } from '@threadplane/render';\nimport { emitBinding } from './emit-binding';\n\n/** v1 textFieldType values from A2uiTextField. */\ntype TextFieldType = 'date' | 'longText' | 'number' | 'shortText' | 'obscured';\n\n/** Maps v1 textFieldType to HTML input[type] or textarea. */\nconst TYPE_MAP: Record<TextFieldType, string> = {\n shortText: 'text',\n longText: 'text', // handled by textarea below\n number: 'number',\n obscured: 'password',\n date: 'date',\n};\n\n@Component({\n selector: 'a2ui-text-field',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"a2ui-tf\">\n @if (label()) {\n <label [htmlFor]=\"_inputId\" class=\"a2ui-tf__label\">{{ label() }}</label>\n }\n @if (textFieldType() === 'longText') {\n <textarea\n [id]=\"_inputId\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n rows=\"4\"\n class=\"a2ui-tf__input\"\n (input)=\"onInput($event)\"\n ></textarea>\n } @else {\n <input\n [id]=\"_inputId\"\n [type]=\"htmlInputType()\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [pattern]=\"validationRegexp() || ''\"\n class=\"a2ui-tf__input\"\n (input)=\"onInput($event)\"\n />\n }\n </div>\n `,\n styles: [`\n .a2ui-tf { display: flex; flex-direction: column; gap: var(--a2ui-spacing-1); }\n .a2ui-tf__label {\n font-size: var(--a2ui-typography-label-size);\n font-weight: var(--a2ui-typography-label-weight);\n color: var(--a2ui-label);\n }\n .a2ui-tf__input {\n padding: var(--a2ui-spacing-2) var(--a2ui-spacing-3);\n font-size: var(--a2ui-typography-body-size);\n border-radius: var(--a2ui-shape-small);\n background: var(--a2ui-input-bg);\n color: var(--a2ui-on-surface);\n border: 1px solid var(--a2ui-outline);\n outline: none;\n transition: border-color var(--a2ui-motion-duration-short) var(--a2ui-motion-easing-standard);\n resize: vertical;\n }\n .a2ui-tf__input:focus {\n outline: var(--a2ui-focus-ring-width) solid var(--a2ui-focus-ring-color);\n outline-offset: 2px;\n border-color: var(--a2ui-primary);\n }\n `],\n})\nexport class A2uiTextFieldComponent {\n private static _idCounter = 0;\n protected readonly _inputId = `a2ui-text-field-${++A2uiTextFieldComponent._idCounter}`;\n\n private readonly host = injectRenderHost();\n\n readonly label = input<string>('');\n /** v1 prop: text (resolved string value). */\n readonly text = input<string>('');\n /** Back-compat alias: value. surface-to-spec resolves DynamicString → plain string. */\n readonly value = computed(() => this.text() ?? '');\n readonly placeholder = input<string>('');\n readonly textFieldType = input<TextFieldType>('shortText');\n readonly validationRegexp = input<string>('');\n readonly _bindings = input<Record<string, string>>({});\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n\n protected readonly htmlInputType = computed(() =>\n TYPE_MAP[this.textFieldType()] ?? 'text',\n );\n\n onInput(event: Event): void {\n const val = (event.target as HTMLInputElement | HTMLTextAreaElement).value;\n // Emit on 'text' binding (v1 prop name); also try 'value' for compat.\n const bound = this._bindings();\n if (bound['text']) {\n emitBinding(this.host, bound, 'text', val);\n } else {\n emitBinding(this.host, bound, 'value', val);\n }\n }\n}\n","// SPDX-License-Identifier: MIT\nimport { Component, input } from '@angular/core';\nimport type { Spec } from '@json-render/core';\n\n@Component({\n selector: 'a2ui-video',\n standalone: true,\n template: `\n <video\n class=\"a2ui-video\"\n [src]=\"url()\"\n [autoplay]=\"autoPlay()\"\n [controls]=\"controls()\"\n ></video>\n `,\n styles: [`\n .a2ui-video {\n display: block;\n width: 100%;\n border-radius: var(--a2ui-shape-small);\n }\n `],\n})\nexport class A2uiVideoComponent {\n readonly url = input<string>('');\n /** v1 prop name: autoPlay (camelCase). */\n readonly autoPlay = input<boolean>(false);\n readonly controls = input<boolean>(true);\n // Framework inputs required by the render harness.\n readonly bindings = input<Record<string, string>>({});\n readonly emit = input<(event: string) => void>(() => { /* noop */ });\n readonly loading = input<boolean>(false);\n readonly childKeys = input<string[]>([]);\n readonly spec = input<Spec | undefined>(undefined);\n}\n","// SPDX-License-Identifier: MIT\nimport { views, type ViewRegistry } from '@threadplane/render';\nimport { A2uiAudioPlayerComponent } from './audio-player.component';\nimport { A2uiButtonComponent } from './button.component';\nimport { A2uiCardComponent } from './card.component';\nimport { A2uiCheckBoxComponent } from './check-box.component';\nimport { A2uiColumnComponent } from './column.component';\nimport { A2uiDateTimeInputComponent } from './date-time-input.component';\nimport { A2uiDividerComponent } from './divider.component';\nimport { A2uiIconComponent } from './icon.component';\nimport { A2uiImageComponent } from './image.component';\nimport { A2uiListComponent } from './list.component';\nimport { A2uiModalComponent } from './modal.component';\nimport { A2uiMultipleChoiceComponent } from './multiple-choice.component';\nimport { A2uiRowComponent } from './row.component';\nimport { A2uiSliderComponent } from './slider.component';\nimport { A2uiTabsComponent } from './tabs.component';\nimport { A2uiTextComponent } from './text.component';\nimport { A2uiTextFieldComponent } from './text-field.component';\nimport { A2uiVideoComponent } from './video.component';\n\n/**\n * Build the built-in A2UI component catalog — a {@link ViewRegistry} mapping\n * the standard A2UI element types (Card, Button, TextField, Image, AudioPlayer,\n * Video, …) to their Angular renderers. Spread it into `provideViews` (with any\n * of your own views) so an agent's A2UI surface specs render.\n *\n * @returns A {@link ViewRegistry} of the standard A2UI components.\n * @example\n * ```ts\n * providers: [provideViews({ ...a2uiBasicCatalog(), MyWidget: MyWidgetComponent })]\n * ```\n */\nexport function a2uiBasicCatalog(): ViewRegistry {\n return views({\n AudioPlayer: A2uiAudioPlayerComponent,\n Button: A2uiButtonComponent,\n Card: A2uiCardComponent,\n CheckBox: A2uiCheckBoxComponent,\n Column: A2uiColumnComponent,\n DateTimeInput: A2uiDateTimeInputComponent,\n Divider: A2uiDividerComponent,\n Icon: A2uiIconComponent,\n Image: A2uiImageComponent,\n List: A2uiListComponent,\n Modal: A2uiModalComponent,\n MultipleChoice: A2uiMultipleChoiceComponent,\n Row: A2uiRowComponent,\n Slider: A2uiSliderComponent,\n Tabs: A2uiTabsComponent,\n Text: A2uiTextComponent,\n TextField: A2uiTextFieldComponent,\n Video: A2uiVideoComponent,\n });\n}\n","// SPDX-License-Identifier: MIT\nimport type { Type } from '@angular/core';\nimport type { StandardSchemaV1, StandardSchemaInferOutput } from '@threadplane/render';\nimport type { ClientToolDef, FunctionToolDef, ViewToolDef, AskToolDef } from './tool-def';\nimport type { AcceptComponent } from './component-inputs';\nexport type { ViewProps } from './component-inputs';\n\n/**\n * Declare an async function tool the model can call; its resolved return value\n * becomes the tool result shipped back to the model.\n *\n * @param description Natural-language description the model sees.\n * @param schema Standard Schema (e.g. a Zod object) for the arguments; the\n * handler's argument type is inferred from it.\n * @param handler Runs in the browser when the model calls the tool; its return\n * type `R` is carried on the resulting {@link FunctionToolDef}.\n * @returns A {@link FunctionToolDef} for inclusion in {@link tools}.\n * @example\n * ```ts\n * const move = action('Move a stop', z.object({ fromDay: z.number() }), (a) => a.fromDay);\n * const registry = tools({ move_stop: move });\n * ```\n */\nexport function action<S extends StandardSchemaV1, R>(\n description: string,\n schema: S,\n handler: (args: StandardSchemaInferOutput<S>) => R | Promise<R>,\n): FunctionToolDef<S, R> {\n return { kind: 'function', description, schema, handler };\n}\n\n/**\n * Render-only component tool — the model fills the component's props from the\n * schema's output; the tool call is auto-acknowledged once the component mounts.\n *\n * The component's signal inputs are checked against the schema output type\n * (strict-but-flexible: every schema key must be a declared input with an\n * assignable type; the component may declare extra inputs the schema doesn't fill).\n * Author the component with `ViewProps<typeof schema>` as the input type set to\n * guarantee the shapes stay aligned.\n *\n * @param description Natural-language description the model sees.\n * @param schema Standard Schema defining the props the model must supply.\n * @param component Angular component whose signal inputs must be compatible with\n * the schema output. A type-level error is reported here when they diverge.\n * @returns A {@link ViewToolDef} for inclusion in {@link tools}.\n * @example\n * ```ts\n * const schema = z.object({ label: z.string(), day: z.number() });\n * type Inputs = ViewProps<typeof schema>; // { label: string; day: number }\n *\n * \\@Component({ ... })\n * class DayCardComponent {\n * label = input.required<string>();\n * day = input.required<number>();\n * }\n *\n * const dayCard = view('Show a day card', schema, DayCardComponent);\n * const registry = tools({ day_card: dayCard });\n * ```\n */\nexport function view<S extends StandardSchemaV1, C>(\n description: string,\n schema: S,\n component: AcceptComponent<S, C>,\n): ViewToolDef<S, C> {\n return { kind: 'view', description, schema, component: component as Type<C> };\n}\n\n/**\n * Interactive (human-in-the-loop) component tool — the model fills the\n * component's props from the schema's output; the value the component emits\n * back to the framework becomes the tool result sent to the model.\n *\n * The component's signal inputs are checked against the schema output type\n * (strict-but-flexible: every schema key must be a declared input with an\n * assignable type; the component may declare extra inputs the schema doesn't\n * fill). Author the component with `ViewProps<typeof schema>` to derive input\n * prop types directly from the schema.\n *\n * @param description Natural-language description the model sees.\n * @param schema Standard Schema defining the props the model must supply.\n * @param component Angular component whose signal inputs must be compatible with\n * the schema output. A type-level error is reported here when they diverge.\n * @returns An {@link AskToolDef} for inclusion in {@link tools}.\n * @example\n * ```ts\n * const schema = z.object({ question: z.string(), options: z.array(z.string()) });\n * type Inputs = ViewProps<typeof schema>;\n *\n * \\@Component({ ... })\n * class ChoiceCardComponent {\n * question = input.required<string>();\n * options = input.required<string[]>();\n * // Emits the chosen option back to the model.\n * }\n *\n * const choice = ask('Ask the user to choose', schema, ChoiceCardComponent);\n * const registry = tools({ pick_option: choice });\n * ```\n */\nexport function ask<S extends StandardSchemaV1, C>(\n description: string,\n schema: S,\n component: AcceptComponent<S, C>,\n): AskToolDef<S, C> {\n return { kind: 'ask', description, schema, component: component as Type<C> };\n}\n\n/**\n * Collect named client tools into a frozen, name-keyed registry.\n *\n * The overload is generic over the entire map (`const M`) so that each tool's\n * precise type ({@link FunctionToolDef}`<S,R>`, {@link ViewToolDef}`<S,C>`, or\n * {@link AskToolDef}`<S,C>`) and every literal key are preserved in the\n * {@link ClientToolRegistry} passed to `provideChat`. This lets downstream\n * consumers look up individual tools without losing generic information.\n *\n * @param map An object literal mapping tool names to tool definitions created\n * by {@link action}, {@link view}, or {@link ask}.\n * @returns A frozen `Readonly<M>` where `M` is the exact inferred map shape.\n * @example\n * ```ts\n * const move = action('Move a stop', z.object({ fromDay: z.number() }), (a) => a.fromDay);\n * const dayCard = view('Show a day card', z.object({ label: z.string() }), DayCardComponent);\n *\n * const registry = tools({ move_stop: move, day_card: dayCard });\n * // registry.move_stop is FunctionToolDef<...>\n * // registry.day_card is ViewToolDef<...>\n * ```\n */\nexport function tools<const M extends Record<string, ClientToolDef>>(map: M): Readonly<M> {\n return Object.freeze({ ...map });\n}\n","// SPDX-License-Identifier: MIT\nimport { signal, Signal, WritableSignal } from '@angular/core';\nimport { EMPTY, type Observable } from 'rxjs';\nimport type {\n Agent,\n Message,\n AgentStatus,\n ToolCall,\n AgentInterrupt,\n Subagent,\n AgentSubmitInput,\n AgentSubmitOptions,\n AgentEvent,\n AgentCheckpoint,\n} from '../agent';\nimport type { AgentError } from '../agent/agent-error';\n\nexport interface MockAgent extends Agent {\n messages: WritableSignal<Message[]>;\n status: WritableSignal<AgentStatus>;\n isLoading: WritableSignal<boolean>;\n error: WritableSignal<AgentError | undefined>;\n toolCalls: WritableSignal<ToolCall[]>;\n state: WritableSignal<Record<string, unknown>>;\n interrupt?: WritableSignal<AgentInterrupt | undefined>;\n subagents?: WritableSignal<Map<string, Subagent>>;\n history?: WritableSignal<AgentCheckpoint[]>;\n events$: Observable<AgentEvent>;\n /**\n * Minimal lifecycle stub the chat lib's effects subscribe to. We only\n * model the signals the chat composition currently reads; richer adapter\n * lifecycles (langgraph, ag-ui) extend this contract on their own mocks.\n * The public `lifecycle` view is a readonly signal; tests drive the\n * value via `_internal.streamStartedAt.set(...)` below.\n */\n lifecycle: {\n streamStartedAt: Signal<number | null>;\n };\n /**\n * Test-only escape hatch for driving lifecycle signals from a spec. Mirrors\n * the `_internal` pattern used by CHAT_LIFECYCLE so tests can flip the\n * underlying writable without going through a full submit/stream cycle.\n */\n _internal: {\n streamStartedAt: WritableSignal<number | null>;\n };\n /** Captured calls to submit() in order. */\n submitCalls: Array<{ input: AgentSubmitInput; opts?: AgentSubmitOptions }>;\n /** Count of stop() invocations. */\n stopCount: number;\n}\n\nexport interface MockAgentOptions {\n messages?: Message[];\n status?: AgentStatus;\n isLoading?: boolean;\n error?: AgentError;\n toolCalls?: ToolCall[];\n state?: Record<string, unknown>;\n withInterrupt?: boolean;\n withSubagents?: boolean;\n history?: AgentCheckpoint[];\n events$?: Observable<AgentEvent>;\n}\n\n/**\n * Build an in-memory {@link Agent} for tests and stories — no transport, no\n * network. Every field is a writable signal so a test can drive UI states\n * (loading, error, interrupts, tool calls, subagents) deterministically.\n *\n * @param opts Initial values for the mock's signals; all optional.\n * @returns A {@link MockAgent} satisfying the full `Agent` contract.\n * @example\n * ```ts\n * const agent = mockAgent({\n * messages: [{ id: '1', role: 'assistant', content: 'Hi' }],\n * isLoading: true,\n * });\n * ```\n */\nexport function mockAgent(opts: MockAgentOptions = {}): MockAgent {\n const messages = signal<Message[]>(opts.messages ?? []);\n const status = signal<AgentStatus>(opts.status ?? 'idle');\n const isLoading = signal<boolean>(opts.isLoading ?? false);\n const error = signal<AgentError | undefined>(opts.error ?? undefined);\n const toolCalls = signal<ToolCall[]>(opts.toolCalls ?? []);\n const state = signal<Record<string, unknown>>(opts.state ?? {});\n\n const interrupt = opts.withInterrupt\n ? signal<AgentInterrupt | undefined>(undefined)\n : undefined;\n const subagents = opts.withSubagents\n ? signal<Map<string, Subagent>>(new Map())\n : undefined;\n const history = opts.history\n ? signal<AgentCheckpoint[]>(opts.history)\n : undefined;\n\n const submitCalls: MockAgent['submitCalls'] = [];\n let stopCount = 0;\n\n const streamStartedAt = signal<number | null>(null);\n\n const agent: MockAgent = {\n messages, status, isLoading, error, toolCalls, state,\n ...(interrupt ? { interrupt } : {}),\n ...(subagents ? { subagents } : {}),\n ...(history ? { history } : {}),\n lifecycle: { streamStartedAt: streamStartedAt.asReadonly() },\n _internal: { streamStartedAt },\n events$: opts.events$ ?? EMPTY,\n submit: async (input, submitOpts) => { submitCalls.push({ input, opts: submitOpts }); },\n stop: async () => { stopCount++; },\n retry: async () => { return; },\n regenerate: async (assistantMessageIndex: number) => {\n // Truncate messages [N..end] and record the call as a synthetic submit so\n // tests can assert regenerate behavior via the same submitCalls log.\n const current = messages();\n messages.set(current.slice(0, assistantMessageIndex));\n submitCalls.push({ input: { regenerate: { assistantMessageIndex } } as never, opts: undefined });\n },\n submitCalls,\n get stopCount() { return stopCount; },\n };\n\n return agent;\n}\n","// SPDX-License-Identifier: MIT\n\n// Shared types\nexport type { ChatConfig } from './lib/provide-chat';\nexport type { MessageTemplateType } from './lib/chat.types';\n\n// Agent contract (runtime-neutral)\nexport type {\n Agent,\n AgentWithHistory,\n Citation,\n Message,\n Role,\n ContentBlock,\n ToolCall,\n ToolCallStatus,\n AgentStatus,\n AgentInterrupt,\n Subagent,\n SubagentStatus,\n AgentSubmitInput,\n AgentSubmitOptions,\n AgentEvent,\n AgentStateUpdateEvent,\n AgentCustomEvent,\n AgentCheckpoint,\n AgentRuntimeTelemetryEvent,\n AgentRuntimeTelemetryPayload,\n AgentRuntimeTelemetryProperties,\n AgentRuntimeTelemetrySink,\n} from './lib/agent';\nexport {\n isUserMessage,\n isAssistantMessage,\n isToolMessage,\n isSystemMessage,\n createAgentRef,\n AgentError,\n AGENT_ERROR_MESSAGES,\n toAgentError,\n isAbortError,\n} from './lib/agent';\nexport type { AgentRef } from './lib/agent';\nexport type { AgentErrorKind } from './lib/agent';\n\n// Primitives\nexport { ChatMessageListComponent, getMessageType } from './lib/primitives/chat-message-list/chat-message-list.component';\nexport { MessageTemplateDirective } from './lib/primitives/chat-message-list/message-template.directive';\nexport { ChatMessageComponent } from './lib/primitives/chat-message/chat-message.component';\nexport type { ChatMessageRole } from './lib/primitives/chat-message/chat-message.component';\nexport { ChatMessageActionsComponent } from './lib/primitives/chat-message-actions/chat-message-actions.component';\nexport { ChatWindowComponent } from './lib/primitives/chat-window/chat-window.component';\nexport { ChatTraceComponent } from './lib/primitives/chat-trace/chat-trace.component';\nexport type { TraceState } from './lib/primitives/chat-trace/chat-trace.component';\nexport { ChatReasoningComponent } from './lib/primitives/chat-reasoning/chat-reasoning.component';\nexport { ChatLauncherButtonComponent } from './lib/primitives/chat-launcher-button/chat-launcher-button.component';\nexport { ChatSuggestionsComponent } from './lib/primitives/chat-suggestions/chat-suggestions.component';\nexport { ChatInputComponent, submitMessage } from './lib/primitives/chat-input/chat-input.component';\nexport { ChatTypingIndicatorComponent, isTyping } from './lib/primitives/chat-typing-indicator/chat-typing-indicator.component';\nexport { ChatHistorySearchPaletteComponent } from './lib/primitives/chat-history-search-palette/chat-history-search-palette.component';\nexport { ChatOverflowMenuComponent } from './lib/primitives/chat-overflow-menu/chat-overflow-menu.component';\nexport type { OverflowMenuItem } from './lib/primitives/chat-overflow-menu/chat-overflow-menu.component';\nexport { ChatConfirmDialogComponent } from './lib/primitives/chat-confirm-dialog/chat-confirm-dialog.component';\nexport type { ThreadMatch } from './lib/primitives/chat-history-search-palette/chat-history-search-palette.component';\nexport { ChatScrollBubbleComponent } from './lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component';\nexport type { ChatScrollBubbleMode } from './lib/primitives/chat-scroll-bubble/chat-scroll-bubble.component';\nexport { ChatErrorComponent, extractErrorMessage } from './lib/primitives/chat-error/chat-error.component';\nexport { ChatInterruptComponent, getInterrupt } from './lib/primitives/chat-interrupt/chat-interrupt.component';\nexport { ChatToolCallsComponent } from './lib/primitives/chat-tool-calls/chat-tool-calls.component';\nexport { ChatToolViewsComponent } from './lib/primitives/chat-tool-views/chat-tool-views.component';\nexport { ChatToolCallTemplateDirective } from './lib/primitives/chat-tool-calls/chat-tool-call-template.directive';\nexport type { ChatToolCallTemplateContext } from './lib/primitives/chat-tool-calls/chat-tool-call-template.directive';\nexport { ChatSubagentsComponent } from './lib/primitives/chat-subagents/chat-subagents.component';\nexport { ChatThreadListComponent } from './lib/primitives/chat-thread-list/chat-thread-list.component';\nexport type { Thread, ThreadActionAdapter } from './lib/primitives/chat-thread-list/chat-thread-list.component';\nexport { ChatProjectListComponent } from './lib/primitives/chat-project-list/chat-project-list.component';\nexport type { Project, ProjectActionAdapter } from './lib/primitives/chat-project-list/chat-project-list.component';\nexport { ChatGenuiSkeletonComponent } from './lib/primitives/chat-genui-skeleton/chat-genui-skeleton.component';\nexport { ChatTimelineComponent } from './lib/primitives/chat-timeline/chat-timeline.component';\nexport { ChatGenerativeUiComponent } from './lib/primitives/chat-generative-ui/chat-generative-ui.component';\nexport { ChatWelcomeComponent } from './lib/primitives/chat-welcome/chat-welcome.component';\nexport { ChatWelcomeSuggestionComponent } from './lib/primitives/chat-welcome/chat-welcome-suggestion.component';\nexport { ChatSelectComponent } from './lib/primitives/chat-select/chat-select.component';\nexport type { ChatSelectOption } from './lib/primitives/chat-select/chat-select.component';\nexport { ChatCitationsComponent, ChatCitationCardTemplateDirective } from './lib/primitives/chat-citations/chat-citations.component';\nexport { ChatCitationsCardComponent } from './lib/primitives/chat-citations/chat-citations-card.component';\n\n// DI provider\nexport { provideChat, CHAT_CONFIG } from './lib/provide-chat';\n\n// Routing utilities\nexport { injectThreadRouting } from './lib/routing/thread-routing';\nexport type { ThreadRoutingConfig } from './lib/routing/thread-routing';\n\n// Lifecycle\nexport { CHAT_LIFECYCLE } from './lib/lifecycle';\nexport type { ChatLifecycle } from './lib/lifecycle';\n\n// Compositions\nexport { ChatComponent } from './lib/compositions/chat/chat.component';\nexport type { ChatRenderEvent } from './lib/compositions/chat/chat-render-event';\nexport { ChatPopupComponent } from './lib/compositions/chat-popup/chat-popup.component';\nexport { ChatSidebarComponent } from './lib/compositions/chat-sidebar/chat-sidebar.component';\nexport { ChatTimelineSliderComponent } from './lib/compositions/chat-timeline-slider/chat-timeline-slider.component';\nexport { ChatSidenavComponent } from './lib/compositions/chat-sidenav/chat-sidenav.component';\nexport { ChatSidenavScrimComponent } from './lib/primitives/chat-sidenav-scrim/chat-sidenav-scrim.component';\nexport type { ChatSidenavMode } from './lib/compositions/chat-sidenav/chat-sidenav.component';\nexport { ChatInterruptPanelComponent } from './lib/compositions/chat-interrupt-panel/chat-interrupt-panel.component';\nexport type { InterruptAction } from './lib/compositions/chat-interrupt-panel/chat-interrupt-panel.component';\nexport { ChatApprovalCardComponent } from './lib/compositions/chat-approval-card/chat-approval-card.component';\nexport type { ChatApprovalAction } from './lib/compositions/chat-approval-card/chat-approval-card.component';\nexport { ChatToolCallCardComponent } from './lib/compositions/chat-tool-call-card/chat-tool-call-card.component';\nexport type { ToolCallInfo } from './lib/compositions/chat-tool-call-card/chat-tool-call-card.component';\nexport { ChatSubagentCardComponent, statusColor } from './lib/compositions/chat-subagent-card/chat-subagent-card.component';\n\n// Citations resolver\nexport { CitationsResolverService } from './lib/markdown/citations-resolver.service';\nexport type { ResolvedCitation } from './lib/markdown/citations-resolver.service';\n\n// Streaming\nexport { ChatStreamingMdComponent } from './lib/streaming/streaming-markdown.component';\n\n// Markdown rendering primitives + registry\nexport { MARKDOWN_VIEW_REGISTRY } from './lib/markdown/markdown-view-registry';\nexport { MarkdownChildrenComponent } from './lib/markdown/markdown-children.component';\nexport { cacheplaneMarkdownViews } from './lib/markdown/cacheplane-markdown-views';\n\n// Per-node-type markdown view components (consumers use these to override\n// individual nodes via withViews(cacheplaneMarkdownViews, { … })).\nexport { MarkdownDocumentComponent } from './lib/markdown/views/markdown-document.component';\nexport { MarkdownParagraphComponent } from './lib/markdown/views/markdown-paragraph.component';\nexport { MarkdownHeadingComponent } from './lib/markdown/views/markdown-heading.component';\nexport { MarkdownBlockquoteComponent } from './lib/markdown/views/markdown-blockquote.component';\nexport { MarkdownListComponent } from './lib/markdown/views/markdown-list.component';\nexport { MarkdownListItemComponent } from './lib/markdown/views/markdown-list-item.component';\nexport { MarkdownCodeBlockComponent } from './lib/markdown/views/markdown-code-block.component';\nexport { MarkdownThematicBreakComponent } from './lib/markdown/views/markdown-thematic-break.component';\nexport { MarkdownTextComponent } from './lib/markdown/views/markdown-text.component';\nexport { MarkdownEmphasisComponent } from './lib/markdown/views/markdown-emphasis.component';\nexport { MarkdownStrongComponent } from './lib/markdown/views/markdown-strong.component';\nexport { MarkdownStrikethroughComponent } from './lib/markdown/views/markdown-strikethrough.component';\nexport { MarkdownInlineCodeComponent } from './lib/markdown/views/markdown-inline-code.component';\nexport { MarkdownLinkComponent } from './lib/markdown/views/markdown-link.component';\nexport { MarkdownAutolinkComponent } from './lib/markdown/views/markdown-autolink.component';\nexport { MarkdownImageComponent } from './lib/markdown/views/markdown-image.component';\nexport { MarkdownSoftBreakComponent } from './lib/markdown/views/markdown-soft-break.component';\nexport { MarkdownHardBreakComponent } from './lib/markdown/views/markdown-hard-break.component';\nexport { MarkdownCitationReferenceComponent } from './lib/markdown/views/markdown-citation-reference.component';\nexport { MarkdownTableComponent } from './lib/markdown/views/markdown-table.component';\nexport { MarkdownTableRowComponent } from './lib/markdown/views/markdown-table-row.component';\nexport { MarkdownTableCellComponent } from './lib/markdown/views/markdown-table-cell.component';\nexport { IS_HEADER_ROW } from './lib/markdown/markdown-table-row.token';\n\n// Shared utilities\n// (Internal styling constants CHAT_MARKDOWN_STYLES and ICON_* are intentionally\n// NOT exported — they are implementation details consumed via relative imports\n// inside the lib; theming is done through CSS custom properties, not these.)\nexport { renderMarkdown } from './lib/streaming/markdown-render';\nexport { messageContent } from './lib/compositions/shared/message-utils';\nexport { formatDuration } from './lib/utils/format-duration';\n\n// Views (re-exported from @threadplane/render for convenience)\nexport { views, withViews, withoutViews, toRenderRegistry } from '@threadplane/render';\nexport type { ViewRegistry } from '@threadplane/render';\n\n// Streaming / Generative UI\nexport { createContentClassifier } from './lib/streaming/content-classifier';\nexport type { ContentClassifier, ContentType } from './lib/streaming/content-classifier';\nexport { createParseTreeStore } from './lib/streaming/parse-tree-store';\nexport type { ParseTreeStore, ElementAccumulationState } from './lib/streaming/parse-tree-store';\n\n// A2UI\nexport { createA2uiSurfaceStore } from './lib/a2ui/surface-store';\nexport type { A2uiSurfaceStore, A2uiSurfaceState } from './lib/a2ui/surface-store';\nexport { normalizeViewEntry } from './lib/a2ui/views';\nexport type { A2uiViewEntry, A2uiViews } from './lib/a2ui/views';\nexport type { A2uiComponentView } from './lib/a2ui/component-view';\nexport { createPartialArgsBridge } from './lib/a2ui/partial-args-bridge';\nexport type { PartialArgsBridge } from './lib/a2ui/partial-args-bridge';\nexport { normalizeEnvelopeArgs } from './lib/a2ui/envelope-normalizer';\nexport { A2uiSurfaceComponent } from './lib/a2ui/surface.component';\n// surfaceToSpec: internal A2UI plumbing — consumed via relative imports, not public.\nexport { buildA2uiActionMessage } from './lib/a2ui/build-action-message';\nexport { a2uiBasicCatalog } from './lib/a2ui/catalog/index';\nexport { emitBinding } from './lib/a2ui/catalog/emit-binding';\n\n// A2UI catalog components (for custom catalog composition via withViews)\nexport { A2uiTextFieldComponent } from './lib/a2ui/catalog/text-field.component';\nexport { A2uiCheckBoxComponent } from './lib/a2ui/catalog/check-box.component';\nexport { A2uiButtonComponent } from './lib/a2ui/catalog/button.component';\nexport { A2uiMultipleChoiceComponent } from './lib/a2ui/catalog/multiple-choice.component';\nexport { A2uiSliderComponent } from './lib/a2ui/catalog/slider.component';\nexport { A2uiDateTimeInputComponent } from './lib/a2ui/catalog/date-time-input.component';\nexport { A2uiTextComponent } from './lib/a2ui/catalog/text.component';\nexport { A2uiIconComponent } from './lib/a2ui/catalog/icon.component';\nexport { A2uiImageComponent } from './lib/a2ui/catalog/image.component';\nexport { A2uiColumnComponent } from './lib/a2ui/catalog/column.component';\nexport { A2uiRowComponent } from './lib/a2ui/catalog/row.component';\nexport { A2uiCardComponent } from './lib/a2ui/catalog/card.component';\nexport { A2uiDividerComponent } from './lib/a2ui/catalog/divider.component';\nexport { A2uiListComponent } from './lib/a2ui/catalog/list.component';\nexport { A2uiModalComponent } from './lib/a2ui/catalog/modal.component';\nexport { A2uiTabsComponent } from './lib/a2ui/catalog/tabs.component';\nexport { A2uiAudioPlayerComponent } from './lib/a2ui/catalog/audio-player.component';\nexport { A2uiVideoComponent } from './lib/a2ui/catalog/video.component';\n\n// A2UI types (re-exported from @threadplane/a2ui for convenience)\nexport type {\n A2uiActionMessage, A2uiClientDataModel,\n A2uiSurface, A2uiComponent, A2uiTheme,\n DynamicString, DynamicNumber, DynamicBoolean,\n A2uiChildren, A2uiAction, A2uiActionContextEntry,\n A2uiComponentDef,\n} from '@threadplane/a2ui';\nexport { isPathRef, isLiteralString, isLiteralNumber, isLiteralBoolean } from '@threadplane/a2ui';\n\n// Client tools (declaration API — tools/action/view/ask + JSON-schema derivation)\nexport { tools, action, view, ask } from './lib/client-tools/tools';\nexport { deriveJsonSchema } from './lib/client-tools/to-json-schema';\nexport type { ClientToolDef, AnyFunctionToolDef, FunctionToolDef, ViewToolDef, AskToolDef, ClientToolRegistry, StandardSchemaV1, StandardSchemaInferInput, StandardSchemaInferOutput } from './lib/client-tools/tool-def';\nexport type { ViewProps } from './lib/client-tools/component-inputs';\n/** Inferred argument type for a schema (alias of StandardSchemaInferOutput). */\nexport type ToolArgs<S extends import('./lib/client-tools/tool-def').StandardSchemaV1> = import('./lib/client-tools/tool-def').StandardSchemaInferOutput<S>;\nexport type { ClientToolSpec } from './lib/client-tools/to-json-schema';\nexport type { ClientToolsCapability, ClientToolResult } from './lib/client-tools/client-tools-capability';\nexport { validateArgs, executeFunctionTool } from './lib/client-tools/execute';\nexport { startClientToolExecutor } from './lib/client-tools/client-tool-executor';\n// createClientToolsCoordinator: internal — provideChat wires it; not public.\nexport { toClientToolSpecs } from './lib/client-tools/client-tools-coordinator';\nexport type { ClientToolsCoordinator } from './lib/client-tools/client-tools-coordinator';\n\n// Test utilities (no vitest dep — safe to ship in the main runtime bundle)\nexport { mockAgent } from './lib/testing/mock-agent';\nexport type { MockAgent, MockAgentOptions } from './lib/testing/mock-agent';\n\n// Conformance helpers ship from the secondary entry point @threadplane/chat/testing\n// (they import vitest at module level; keeping them out of the main bundle).\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["defaultSummarizeGroup","isRecord","materialize"],"mappings":"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"}