@newheap/platform-ai-chat 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"newheap-platform-ai-chat.mjs","sources":["../../../projects/nh-ai-chat/src/lib/models/assistant-api.models.ts","../../../projects/nh-ai-chat/src/lib/models/assistant-sse.models.ts","../../../projects/nh-ai-chat/src/lib/models/assistant-admin.models.ts","../../../projects/nh-ai-chat/src/lib/nh-assistant.config.ts","../../../projects/nh-ai-chat/src/lib/i18n/nh-assistant-translations.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-transport.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-admin-api.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-sse-parser.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-api.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-reducer.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-page-context.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-ui-state.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant.store.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-panel.service.ts","../../../projects/nh-ai-chat/src/lib/provide-nh-assistant.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-icon.component.ts","../../../projects/nh-ai-chat/src/lib/components/launcher/nh-assistant-launcher.component.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-translate.pipe.ts","../../../projects/nh-ai-chat/src/lib/components/agent-picker/nh-assistant-agent-picker.component.ts","../../../projects/nh-ai-chat/src/lib/components/composer/nh-assistant-composer.component.ts","../../../projects/nh-ai-chat/src/lib/components/composer/nh-assistant-composer.component.html","../../../projects/nh-ai-chat/src/lib/components/conversation-list/nh-assistant-conversation-list.component.ts","../../../projects/nh-ai-chat/src/lib/components/conversation-list/nh-assistant-conversation-list.component.html","../../../projects/nh-ai-chat/src/lib/components/preferences/nh-assistant-preferences.component.ts","../../../projects/nh-ai-chat/src/lib/components/preferences/nh-assistant-preferences.component.html","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-markdown.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-markdown.pipe.ts","../../../projects/nh-ai-chat/src/lib/components/approval-card/nh-assistant-approval-card.component.ts","../../../projects/nh-ai-chat/src/lib/components/approval-card/nh-assistant-approval-card.component.html","../../../projects/nh-ai-chat/src/lib/components/tool-call-card/nh-assistant-tool-call-card.component.ts","../../../projects/nh-ai-chat/src/lib/components/tool-call-card/nh-assistant-tool-call-card.component.html","../../../projects/nh-ai-chat/src/lib/components/thread/nh-assistant-thread.component.ts","../../../projects/nh-ai-chat/src/lib/components/thread/nh-assistant-thread.component.html","../../../projects/nh-ai-chat/src/lib/components/panel/nh-assistant-panel.component.ts","../../../projects/nh-ai-chat/src/lib/components/panel/nh-assistant-panel.component.html","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-errors.ts","../../../projects/nh-ai-chat/src/public-api.ts","../../../projects/nh-ai-chat/src/newheap-platform-ai-chat.ts"],"sourcesContent":["/*\n * Wire models of the NewHeap assistant HTTP API.\n *\n * These interfaces are a literal translation of the assistant API contract. Keep the\n * field names identical to the JSON the server returns (camelCase, ISO-8601 UTC dates,\n * GUID strings for ids).\n */\n\nexport interface AssistantStatus {\n enabled: boolean;\n agents: AgentSummary[];\n limits: {\n maxMessageChars: number;\n maxToolCallsPerTurn: number;\n };\n /** True when the caller also passes the admin policy and may use the `admin/*` endpoints. */\n canAdminister: boolean;\n}\n\nexport interface AgentSummary {\n id: string;\n version: number;\n displayNameKey: string;\n descriptionKey: string;\n canMutate: boolean;\n}\n\nexport interface ConversationSummary {\n id: string;\n agentId: string;\n title: string | null;\n status: ConversationStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Conversation extends ConversationSummary {\n agentVersion: number;\n messages: Message[];\n pendingApproval: ApprovalPart | null;\n}\n\nexport type ConversationStatus = 'idle' | 'running' | 'waiting-for-approval' | 'failed' | 'archived';\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant' | 'tool';\n createdAt: string;\n parts: MessagePart[];\n}\n\nexport type MessagePart = TextPart | ToolCallPart | ApprovalPart;\n\nexport interface TextPart {\n type: 'text';\n text: string;\n}\n\nexport type ToolCallStatus = 'running' | 'succeeded' | 'failed' | 'awaiting-approval' | 'rejected';\n\nexport interface ToolCallPart {\n type: 'tool-call';\n invocationId: string;\n toolId: string;\n toolVersion: number;\n displayName: string;\n status: ToolCallStatus;\n argumentsPreview: string | null;\n resultPreview: string | null;\n resultCode: string | null;\n}\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected' | 'expired';\n\nexport interface ApprovalPresentationField {\n label: string;\n value: string;\n}\n\nexport interface ApprovalPresentation {\n toolDisplayName: string;\n summary: string;\n fields: ApprovalPresentationField[];\n notice: string | null;\n}\n\nexport interface ApprovalPart {\n type: 'approval';\n approvalId: string;\n proposalId: string;\n proposalHash: string;\n toolId: string;\n summary: string;\n /** Trusted server-side presentation. Missing on old events and when no presenter handled the tool. */\n presentation?: ApprovalPresentation | null;\n argumentsPreview: string;\n targets: string[];\n expiresAt: string;\n status: ApprovalStatus;\n}\n\n/** Response of `GET conversations?page=&itemsPerPage=`. */\nexport interface ConversationPage {\n items: ConversationSummary[];\n total: number;\n}\n\n/** Body of `POST conversations`. */\nexport interface CreateConversationRequest {\n agentId: string;\n title?: string;\n}\n\n/** An entity the user has open, for example `{ type: 'project', id: 'AA09027', label: 'Project AA09027' }`. */\nexport interface ClientContextEntity {\n /** Dash-case, for example `order-group`. */\n type: string;\n /** At most 64 characters. */\n id: string;\n /** At most 120 characters. */\n label?: string | null;\n}\n\n/**\n * What the user has open when sending a message. Untrusted page data for the model:\n * entity ids are search hints only and never grant access.\n */\nexport interface ClientContext {\n /** For example `/order-group/123`; at most 200 characters. */\n route: string;\n /** Page title; at most 120 characters. */\n title?: string | null;\n /** At most 5 entities. */\n entities?: ClientContextEntity[];\n}\n\n/** Library name of the contract's `ClientContext`. */\nexport type NhAssistantClientContext = ClientContext;\n\n/** Body of `POST conversations/{id}/messages`. */\nexport interface SendMessageRequest {\n text: string;\n clientMessageId: string;\n /** Page context of this message; `null` when the user left it out. */\n clientContext?: ClientContext | null;\n}\n\nexport type ApprovalDecision = 'approve' | 'reject';\n\n/** Body of `POST conversations/{id}/approvals/{approvalId}/decide`. */\nexport interface DecideApprovalRequest {\n decision: ApprovalDecision;\n expectedProposalHash: string;\n reason?: string;\n}\n","import { ApprovalPart } from './assistant-api.models';\n\n/*\n * Server-sent events of an assistant turn.\n *\n * Every event arrives as `event: <name>` plus `data: <JSON>` followed by an empty line.\n * The stream closes after `turn.completed` or `error`.\n */\n\nexport interface TurnStartedEvent {\n turnId: string;\n userMessageId: string;\n assistantMessageId: string;\n}\n\nexport interface MessageDeltaEvent {\n messageId: string;\n text: string;\n}\n\nexport interface ToolStartedEvent {\n invocationId: string;\n toolId: string;\n toolVersion: number;\n displayName: string;\n argumentsPreview: string | null;\n}\n\nexport interface ToolCompletedEvent {\n invocationId: string;\n status: 'succeeded' | 'failed';\n resultCode: string | null;\n resultPreview: string | null;\n}\n\nexport type ApprovalRequiredEvent = ApprovalPart;\n\nexport type TurnCompletionStatus = 'completed' | 'waiting-for-approval' | 'cancelled' | 'failed';\n\nexport interface TurnUsage {\n inputTokens: number;\n outputTokens: number;\n toolCalls: number;\n}\n\nexport interface TurnCompletedEvent {\n turnId: string;\n status: TurnCompletionStatus;\n usage: TurnUsage;\n errorCode: string | null;\n}\n\nexport interface AssistantErrorEvent {\n code: string;\n messageKey: string;\n}\n\n/** Map from SSE event name to its data payload. */\nexport interface NhAssistantSseEventMap {\n 'turn.started': TurnStartedEvent;\n 'message.delta': MessageDeltaEvent;\n 'tool.started': ToolStartedEvent;\n 'tool.completed': ToolCompletedEvent;\n 'approval.required': ApprovalRequiredEvent;\n 'turn.completed': TurnCompletedEvent;\n 'error': AssistantErrorEvent;\n}\n\nexport type NhAssistantSseEventType = keyof NhAssistantSseEventMap;\n\n/** One parsed assistant event, discriminated by its SSE event name. */\nexport type NhAssistantSseEvent = {\n [K in NhAssistantSseEventType]: { type: K; data: NhAssistantSseEventMap[K] };\n}[NhAssistantSseEventType];\n\nexport const NH_ASSISTANT_SSE_EVENT_TYPES: readonly NhAssistantSseEventType[] = [\n 'turn.started',\n 'message.delta',\n 'tool.started',\n 'tool.completed',\n 'approval.required',\n 'turn.completed',\n 'error'\n];\n\n/**\n * Stable client-side failure codes. The client emits these as `error` events when the\n * transport fails before the server could send its own `error` event.\n */\nexport const NhAssistantClientErrorCodes = {\n network: 'assistant-network',\n unauthenticated: 'assistant-unauthenticated',\n forbidden: 'assistant-forbidden',\n notFound: 'assistant-not-found',\n conversationBusy: 'assistant-conversation-busy',\n validation: 'assistant-validation',\n versionConflict: 'assistant-version-conflict',\n invalidResponse: 'assistant-invalid-response',\n streamInterrupted: 'assistant-stream-interrupted',\n server: 'assistant-server'\n} as const;\n\nexport type NhAssistantClientErrorCode = typeof NhAssistantClientErrorCodes[keyof typeof NhAssistantClientErrorCodes];\n","/*\n * Wire models of the assistant preference and administration endpoints.\n *\n * Literal translation of the assistant API contract (preferences and `admin/*`). Keep the\n * field names identical to the JSON the server returns.\n */\n\nexport type AssistantStyle = 'default' | 'direct' | 'personal' | 'detailed';\n\nexport type AssistantAddressForm = 'informal' | 'formal';\n\nexport type AssistantResponseLength = 'short' | 'normal' | 'long';\n\nexport interface AssistantPreferences {\n style: AssistantStyle;\n addressForm: AssistantAddressForm;\n responseLength: AssistantResponseLength;\n /** At most 1,000 characters. Steers style only; it never overrides the fixed rules. */\n customInstructions: string | null;\n}\n\nexport interface ApplicationContext {\n text: string;\n version: number;\n hash: string;\n updatedAt: string;\n updatedBy: string | null;\n}\n\nexport interface ApplicationContextVersion {\n version: number;\n hash: string;\n updatedAt: string;\n updatedBy: string | null;\n}\n\n/** Body of `PUT admin/context`. */\nexport interface UpdateApplicationContextRequest {\n text: string;\n expectedVersion: number;\n}\n\nexport type ToolCatalogEffect = 'read-only' | 'idempotent-mutation' | 'mutation' | 'destructive';\n\nexport interface ToolCatalogEntry {\n id: string;\n source: 'local' | 'bridge' | 'mcp';\n effect: ToolCatalogEffect;\n description: string;\n}\n\n/** Equals `NhAiAutonomyLevel`. */\nexport type AssistantAutonomy = 'observe' | 'explain' | 'propose' | 'simulate' | 'execute';\n\nexport interface AdminAgentInput {\n id: string;\n displayName: string;\n description: string;\n instructions: string;\n toolSelectors: string[];\n mcpServerIds: string[];\n requiredPolicy: string | null;\n autonomy: AssistantAutonomy;\n isEnabled: boolean;\n}\n\n/** Body of `PUT admin/agents/{id}`. */\nexport type UpdateAdminAgentRequest = AdminAgentInput & { expectedVersion: number };\n\nexport interface AdminAgent extends AdminAgentInput {\n version: number;\n source: 'code' | 'admin';\n isOverridden: boolean;\n instructionsHash: string;\n updatedAt: string;\n}\n\nexport type McpAuthMode = 'none' | 'bearer' | 'api-key' | 'forward-user-token';\n\nexport interface McpServerInput {\n id: string;\n displayName: string;\n url: string;\n authMode: McpAuthMode;\n headerName: string | null;\n /** Write-only. Omit to keep the stored secret, `\"\"` to clear it. */\n secret?: string | null;\n requiredPolicy: string | null;\n isEnabled: boolean;\n}\n\nexport interface McpServer {\n id: string;\n displayName: string;\n url: string;\n authMode: McpAuthMode;\n headerName: string | null;\n hasSecret: boolean;\n requiredPolicy: string | null;\n isEnabled: boolean;\n lastSyncAt: string | null;\n lastSyncStatus: 'ok' | 'failed' | null;\n assignedAgentIds: string[];\n}\n\nexport interface McpServerTestResult {\n ok: boolean;\n code: string | null;\n toolCount: number | null;\n}\n\nexport type McpToolEffect = 'read-only' | 'mutation';\n\nexport type McpToolStatus = 'available' | 'schema-changed' | 'missing';\n\nexport interface McpTool {\n remoteName: string;\n localId: string;\n description: string;\n descriptionOverride: string | null;\n isEnabled: boolean;\n effect: McpToolEffect;\n status: McpToolStatus;\n /** Remote annotation. Untrusted: shown as a hint only, never used as a default. */\n readOnlyHint: boolean | null;\n}\n\n/** Body of `PUT admin/mcp-servers/{id}/tools/{remoteName}`. */\nexport interface UpdateMcpToolRequest {\n isEnabled: boolean;\n effect: McpToolEffect;\n descriptionOverride: string | null;\n}\n","import { InjectionToken, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { ClientContext } from './models/assistant-api.models';\n\n/** Decides whether the current user may see and use the assistant. */\nexport interface NhAssistantAccessPolicy {\n canUse(): boolean | Observable<boolean>;\n}\n\nexport interface NhAssistantConfig {\n /** Base URL of the assistant endpoints, for example `environment.api.baseUrl + '/assistant'`. */\n apiBaseUrl: string;\n /**\n * Returns the caller's bearer token, or null when the request should be anonymous. It runs\n * in the injection context of the assistant scope before every request, so it may call\n * `inject(...)`, for example `() => inject(MyAuthService).getAuthorization()?.token ?? null`.\n */\n getAccessToken: () => string | null | Promise<string | null>;\n /**\n * Returns what the user has open, sent with each message as untrusted page context.\n * Runs in the assistant's injection context when the panel opens and before every\n * message, like `getAccessToken`. The library validates and truncates the result; a\n * failing getter or an invalid shape only leaves the context out. Default: none.\n */\n getPageContext?: () => ClientContext | null | Promise<ClientContext | null>;\n /**\n * Stable, non-secret identity for browser UI state (for example a user id plus tenant id).\n * Runs in the assistant injection context. Return null on sign-out. Without this callback\n * the assistant keeps UI state in memory only. Never return an access token.\n */\n getStateScope?: () => string | null | Promise<string | null>;\n /** Injectable access policy. Default: always allowed. */\n accessPolicy?: Type<NhAssistantAccessPolicy>;\n /** Agent selected when the user has not chosen one. Default: the first agent the server lists. */\n defaultAgentId?: string;\n /** `'bundled'` merges the library's `en` and `nl` texts into `TranslateService`; `'host'` leaves translations to the host. Default `'bundled'`. */\n translations?: 'bundled' | 'host';\n /**\n * Router link of the host's assistant administration page. The panel shows a link to it\n * only when the server reports `canAdminister`. Default: no link.\n */\n adminRoute?: string | any[];\n /** Renders assistant text as sanitized Markdown. Default `{ enabled: true }`. */\n markdown?: { enabled: boolean };\n}\n\nexport const NH_ASSISTANT_CONFIG = new InjectionToken<NhAssistantConfig>('NH_ASSISTANT_CONFIG');\n\nexport const NH_ASSISTANT_ACCESS_POLICY = new InjectionToken<NhAssistantAccessPolicy>('NH_ASSISTANT_ACCESS_POLICY');\n\n/** The `fetch` function type the assistant client uses. */\nexport type NhAssistantFetch = (input: string, init: RequestInit) => Promise<Response>;\n\n/**\n * Transport used by the assistant client. It is deliberately independent of the host's\n * `HttpClient` and interceptors, because streaming responses need `fetch` and the access\n * token comes from `NhAssistantConfig.getAccessToken`. Tests and the mock API from\n * `@newheap/platform-ai-chat/testing` replace it.\n */\nexport const NH_ASSISTANT_FETCH = new InjectionToken<NhAssistantFetch>('NH_ASSISTANT_FETCH', {\n providedIn: 'root',\n factory: () => (input: string, init: RequestInit) => globalThis.fetch(input, init)\n});\n\n/** Default policy: every user who can reach the host may use the assistant. */\nexport class NhAssistantAllowAllAccessPolicy implements NhAssistantAccessPolicy {\n canUse(): boolean {\n return true;\n }\n}\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport { TranslateService, TranslationObject } from '@ngx-translate/core';\nimport { merge } from 'rxjs';\nimport en from './en.json';\nimport nl from './nl.json';\n\n/** The library's own translation bundles, keyed by language. All keys live under `nh-assistant.`. */\nexport const NH_ASSISTANT_TRANSLATIONS: Readonly<Record<'en' | 'nl', TranslationObject>> = { en, nl };\n\ntype TranslationTree = { [key: string]: unknown };\n\nconst rootKey = 'nh-assistant';\n\nfunction isTree(value: unknown): value is TranslationTree {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Deep merge where values of `override` win. */\nfunction mergeTrees(base: TranslationTree, override: TranslationTree): TranslationTree {\n const result: TranslationTree = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] = isTree(current) && isTree(value) ? mergeTrees(current, value) : value;\n }\n return result;\n}\n\nfunction hasAllKeys(bundle: TranslationTree, candidate: unknown): boolean {\n if (!isTree(candidate)) {\n return false;\n }\n\n return Object.entries(bundle).every(([key, value]) =>\n isTree(value) ? hasAllKeys(value, candidate[key]) : key in candidate\n );\n}\n\n/**\n * Merges the bundled texts into `TranslateService` whenever the host loads or replaces a\n * language. Host loaders never lose the library texts, the library never pre-empts the\n * host loader, and keys the host defines under `nh-assistant.` (agent names, overrides)\n * win over the bundle. Languages without a bundle receive the English texts.\n */\n@Injectable({ providedIn: 'root' })\nexport class NhAssistantTranslationMerger {\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private started = false;\n\n start(): void {\n const translate = this.translate;\n if (this.started || !translate) {\n return;\n }\n this.started = true;\n\n const subscription = merge(translate.onTranslationChange, translate.onLangChange).subscribe(event => {\n if (event.lang && isTree(event.translations)) {\n this.ensure(event.lang, event.translations[rootKey]);\n }\n });\n this.destroyRef.onDestroy(() => subscription.unsubscribe());\n\n // The current language is loaded or already requested by the host, so merging into it\n // never pre-empts the host loader; a later load triggers a new merge.\n const current = translate.getCurrentLang();\n if (current) {\n this.ensure(current, translate.instant(rootKey));\n }\n }\n\n private ensure(language: string, existing: unknown): void {\n const bundle = (NH_ASSISTANT_TRANSLATIONS[language as 'en' | 'nl'] ?? NH_ASSISTANT_TRANSLATIONS.en) as TranslationTree;\n const bundleRoot = bundle[rootKey] as TranslationTree;\n if (hasAllKeys(bundleRoot, existing)) {\n return;\n }\n\n const merged = mergeTrees(bundleRoot, isTree(existing) ? existing : {});\n this.translate?.setTranslation(language, { [rootKey]: merged } as TranslationObject, true);\n }\n}\n","import { EnvironmentInjector, Injectable, inject, runInInjectionContext } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable, Subscriber } from 'rxjs';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NH_ASSISTANT_CONFIG, NH_ASSISTANT_FETCH } from '../nh-assistant.config';\n\n/** A failed JSON request of the assistant API. Carries a stable code, never response text. */\nexport class NhAssistantApiError extends Error {\n constructor(\n readonly status: number,\n readonly code: string,\n readonly messageKey: string\n ) {\n super(code);\n this.name = 'NhAssistantApiError';\n }\n}\n\n/** Translation key that belongs to a failure code. */\nexport function nhAssistantErrorMessageKey(code: string): string {\n return `nh-assistant.errors.${code}`;\n}\n\n/** Maps an HTTP status of the assistant API to a stable client failure code. */\nexport function nhAssistantCodeForStatus(status: number): string {\n if (status === 0) {\n return NhAssistantClientErrorCodes.network;\n }\n if (status === 400) {\n return NhAssistantClientErrorCodes.validation;\n }\n if (status === 401) {\n return NhAssistantClientErrorCodes.unauthenticated;\n }\n if (status === 403) {\n return NhAssistantClientErrorCodes.forbidden;\n }\n if (status === 404) {\n return NhAssistantClientErrorCodes.notFound;\n }\n if (status === 409) {\n return NhAssistantClientErrorCodes.conversationBusy;\n }\n\n return NhAssistantClientErrorCodes.server;\n}\n\n/** Status-specific codes that replace the generic mapping for one endpoint. */\nexport type NhAssistantStatusCodes = Partial<Record<number, string>>;\n\nconst safeCode = /^[a-z0-9][a-z0-9.-]{0,79}$/;\n\n/**\n * Shared transport of the assistant services: `fetch` with the host's token, the current\n * language and stable failure codes. Internal to the library.\n */\n@Injectable()\nexport class NhAssistantTransport {\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly fetchFn = inject(NH_ASSISTANT_FETCH);\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly injector = inject(EnvironmentInjector);\n\n /** A cold JSON request that aborts on unsubscribe and errors with `NhAssistantApiError`. */\n json<T>(method: string, path: string, body?: unknown, statusCodes: NhAssistantStatusCodes = {}): Observable<T> {\n return new Observable<T>(subscriber => {\n const abort = new AbortController();\n\n void this.executeJson<T>(method, path, body, statusCodes, abort.signal, subscriber);\n\n return () => abort.abort();\n });\n }\n\n async fetch(method: string, path: string, accept: string, body: unknown, signal: AbortSignal): Promise<Response> {\n const init = await this.createInit(method, accept, body, signal);\n return this.fetchFn(this.url(path), init);\n }\n\n /**\n * The failure code of a response: a safe `code` field of a JSON error body wins, then the\n * endpoint's status mapping, then the generic mapping. Response text is never used.\n */\n async failureCode(response: Response, statusCodes: NhAssistantStatusCodes = {}): Promise<string> {\n try {\n const text = await response.text();\n const body = text.length > 0 ? JSON.parse(text) as unknown : null;\n const code = body && typeof body === 'object' ? (body as Record<string, unknown>)['code'] : null;\n if (typeof code === 'string' && safeCode.test(code)) {\n return code;\n }\n } catch {\n // A non-JSON error body carries no code.\n }\n\n return statusCodes[response.status] ?? nhAssistantCodeForStatus(response.status);\n }\n\n private async executeJson<T>(\n method: string,\n path: string,\n body: unknown,\n statusCodes: NhAssistantStatusCodes,\n signal: AbortSignal,\n subscriber: Subscriber<T>\n ): Promise<void> {\n let response: Response;\n try {\n response = await this.fetch(method, path, 'application/json', body, signal);\n } catch {\n if (!signal.aborted) {\n subscriber.error(createApiError(0, nhAssistantCodeForStatus(0)));\n }\n return;\n }\n\n if (!response.ok) {\n const code = await this.failureCode(response, statusCodes);\n subscriber.error(createApiError(response.status, code));\n return;\n }\n\n try {\n const text = response.status === 204 ? '' : await response.text();\n subscriber.next((text.length > 0 ? JSON.parse(text) : undefined) as T);\n subscriber.complete();\n } catch {\n if (!signal.aborted) {\n subscriber.error(createApiError(response.status, NhAssistantClientErrorCodes.invalidResponse));\n }\n }\n }\n\n private async createInit(method: string, accept: string, body: unknown, signal: AbortSignal): Promise<RequestInit> {\n const headers: Record<string, string> = { Accept: accept };\n\n const token = await runInInjectionContext(this.injector, () => this.config.getAccessToken());\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const language = this.translate?.getCurrentLang();\n if (language) {\n headers['Accept-Language'] = language;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n return {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal,\n cache: 'no-store'\n };\n }\n\n private url(path: string): string {\n const base = this.config.apiBaseUrl.replace(/\\/+$/, '');\n return `${base}/${path}`;\n }\n}\n\nfunction createApiError(status: number, code: string): NhAssistantApiError {\n return new NhAssistantApiError(status, code, nhAssistantErrorMessageKey(code));\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n AdminAgent,\n AdminAgentInput,\n ApplicationContext,\n ApplicationContextVersion,\n McpServer,\n McpServerInput,\n McpServerTestResult,\n McpTool,\n ToolCatalogEntry,\n UpdateAdminAgentRequest,\n UpdateApplicationContextRequest,\n UpdateMcpToolRequest\n} from '../models/assistant-admin.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantStatusCodes, NhAssistantTransport } from './nh-assistant-transport';\n\n/** In the admin endpoints a 409 means a stale `expectedVersion` or a forbidden state change. */\nconst adminStatusCodes: NhAssistantStatusCodes = {\n 409: NhAssistantClientErrorCodes.versionConflict\n};\n\n/**\n * Client for the assistant administration endpoints (`admin/*`). The server requires the\n * access policy and the admin policy; show the administration only when\n * `NhAssistantStore.canAdminister()` is true. Failures error with `NhAssistantApiError`.\n * Secrets are write-only: `McpServer` only reports `hasSecret`.\n */\n@Injectable()\nexport class NhAssistantAdminApiService {\n private readonly transport = inject(NhAssistantTransport);\n\n getContext(): Observable<ApplicationContext> {\n return this.request<ApplicationContext>('GET', 'admin/context');\n }\n\n /** Saves a new context version; fails with `assistant-version-conflict` when `expectedVersion` is stale. */\n updateContext(request: UpdateApplicationContextRequest): Observable<ApplicationContext> {\n return this.request<ApplicationContext>('PUT', 'admin/context', request);\n }\n\n getContextVersions(): Observable<ApplicationContextVersion[]> {\n return this.request<ApplicationContextVersion[]>('GET', 'admin/context/versions');\n }\n\n /** Local, bridge and MCP tools, for choosing tool selectors. */\n getTools(): Observable<ToolCatalogEntry[]> {\n return this.request<ToolCatalogEntry[]>('GET', 'admin/tools');\n }\n\n getAgents(): Observable<AdminAgent[]> {\n return this.request<AdminAgent[]>('GET', 'admin/agents');\n }\n\n createAgent(input: AdminAgentInput): Observable<AdminAgent> {\n return this.request<AdminAgent>('POST', 'admin/agents', input);\n }\n\n updateAgent(agentId: string, request: UpdateAdminAgentRequest): Observable<AdminAgent> {\n return this.request<AdminAgent>('PUT', `admin/agents/${encodeURIComponent(agentId)}`, request);\n }\n\n /** Restores a code agent to its definition in code. */\n resetAgent(agentId: string): Observable<AdminAgent> {\n return this.request<AdminAgent>('POST', `admin/agents/${encodeURIComponent(agentId)}/reset`);\n }\n\n /** Deletes an admin agent. Code agents cannot be deleted; disable them instead. */\n deleteAgent(agentId: string): Observable<void> {\n return this.request<void>('DELETE', `admin/agents/${encodeURIComponent(agentId)}`);\n }\n\n getMcpServers(): Observable<McpServer[]> {\n return this.request<McpServer[]>('GET', 'admin/mcp-servers');\n }\n\n createMcpServer(input: McpServerInput): Observable<McpServer> {\n return this.request<McpServer>('POST', 'admin/mcp-servers', input);\n }\n\n /** Omit `secret` to keep the stored secret; send `\"\"` to clear it. */\n updateMcpServer(serverId: string, input: McpServerInput): Observable<McpServer> {\n return this.request<McpServer>('PUT', `admin/mcp-servers/${encodeURIComponent(serverId)}`, input);\n }\n\n deleteMcpServer(serverId: string): Observable<void> {\n return this.request<void>('DELETE', `admin/mcp-servers/${encodeURIComponent(serverId)}`);\n }\n\n testMcpServer(serverId: string): Observable<McpServerTestResult> {\n return this.request<McpServerTestResult>('POST', `admin/mcp-servers/${encodeURIComponent(serverId)}/test`);\n }\n\n /** Reads the remote tool list. New tools start disabled; a changed input schema disables a tool. */\n syncMcpServer(serverId: string): Observable<McpTool[]> {\n return this.request<McpTool[]>('POST', `admin/mcp-servers/${encodeURIComponent(serverId)}/sync`);\n }\n\n getMcpTools(serverId: string): Observable<McpTool[]> {\n return this.request<McpTool[]>('GET', `admin/mcp-servers/${encodeURIComponent(serverId)}/tools`);\n }\n\n updateMcpTool(serverId: string, remoteName: string, request: UpdateMcpToolRequest): Observable<McpTool> {\n const path = `admin/mcp-servers/${encodeURIComponent(serverId)}/tools/${encodeURIComponent(remoteName)}`;\n return this.request<McpTool>('PUT', path, request);\n }\n\n private request<T>(method: string, path: string, body?: unknown): Observable<T> {\n return this.transport.json<T>(method, path, body, adminStatusCodes);\n }\n}\n","/** One raw server-sent event before its data is interpreted. */\nexport interface NhAssistantRawSseMessage {\n event: string;\n data: string;\n}\n\n/**\n * Incremental parser for the `text/event-stream` format.\n *\n * Feed decoded text chunks in arrival order. Chunks may split lines, fields and line\n * terminators anywhere. Comment lines (starting with `:`, such as the `: keep-alive`\n * heartbeat) are ignored; `id` and `retry` fields are accepted and ignored. An event is\n * dispatched at the empty line that terminates it. An unterminated event at the end of\n * the stream is discarded, as the SSE specification requires.\n */\nexport class NhAssistantSseParser {\n private buffer = '';\n private eventName = '';\n private dataLines: string[] = [];\n\n push(chunk: string): NhAssistantRawSseMessage[] {\n this.buffer += chunk;\n\n const messages: NhAssistantRawSseMessage[] = [];\n let lineStart = 0;\n\n for (let index = 0; index < this.buffer.length; index++) {\n const character = this.buffer[index];\n if (character !== '\\n' && character !== '\\r') {\n continue;\n }\n\n if (character === '\\r' && index === this.buffer.length - 1) {\n // A trailing CR may be the first half of a CRLF split across chunks.\n break;\n }\n\n const line = this.buffer.slice(lineStart, index);\n if (character === '\\r' && this.buffer[index + 1] === '\\n') {\n index++;\n }\n lineStart = index + 1;\n\n const message = this.processLine(line);\n if (message) {\n messages.push(message);\n }\n }\n\n this.buffer = this.buffer.slice(lineStart);\n return messages;\n }\n\n /** Signals the end of the stream and returns an event that a trailing CR completed. */\n end(): NhAssistantRawSseMessage[] {\n const messages: NhAssistantRawSseMessage[] = [];\n if (this.buffer.endsWith('\\r')) {\n const message = this.processLine(this.buffer.slice(0, -1));\n if (message) {\n messages.push(message);\n }\n }\n\n this.buffer = '';\n this.eventName = '';\n this.dataLines = [];\n return messages;\n }\n\n private processLine(line: string): NhAssistantRawSseMessage | null {\n if (line.length === 0) {\n return this.dispatch();\n }\n\n if (line.startsWith(':')) {\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex < 0 ? line : line.slice(0, colonIndex);\n let value = colonIndex < 0 ? '' : line.slice(colonIndex + 1);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n if (field === 'event') {\n this.eventName = value;\n } else if (field === 'data') {\n this.dataLines.push(value);\n }\n\n return null;\n }\n\n private dispatch(): NhAssistantRawSseMessage | null {\n const hasData = this.dataLines.length > 0;\n const message: NhAssistantRawSseMessage = {\n event: this.eventName || 'message',\n data: this.dataLines.join('\\n')\n };\n\n this.eventName = '';\n this.dataLines = [];\n\n return hasData ? message : null;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, Subscriber } from 'rxjs';\nimport { AssistantPreferences } from '../models/assistant-admin.models';\nimport {\n AgentSummary,\n AssistantStatus,\n Conversation,\n ConversationPage,\n CreateConversationRequest,\n DecideApprovalRequest,\n SendMessageRequest\n} from '../models/assistant-api.models';\nimport {\n NH_ASSISTANT_SSE_EVENT_TYPES,\n NhAssistantClientErrorCodes,\n NhAssistantSseEvent,\n NhAssistantSseEventType\n} from '../models/assistant-sse.models';\nimport { NhAssistantSseParser } from './nh-assistant-sse-parser';\nimport { NhAssistantTransport, nhAssistantErrorMessageKey } from './nh-assistant-transport';\n\nexport { NhAssistantApiError, nhAssistantCodeForStatus, nhAssistantErrorMessageKey } from './nh-assistant-transport';\n\nconst knownEventTypes = new Set<string>(NH_ASSISTANT_SSE_EVENT_TYPES);\n\n/**\n * Client for the assistant HTTP API. JSON endpoints return cold observables that abort\n * their request on unsubscribe. Streaming endpoints emit every contract event and complete\n * after `turn.completed` or `error`; transport failures become an `error` event with a\n * client failure code instead of an observable error.\n */\n@Injectable()\nexport class NhAssistantApiService {\n private readonly transport = inject(NhAssistantTransport);\n\n status(): Observable<AssistantStatus> {\n return this.transport.json<AssistantStatus>('GET', 'status');\n }\n\n agents(): Observable<AgentSummary[]> {\n return this.transport.json<AgentSummary[]>('GET', 'agents');\n }\n\n listConversations(page = 1, itemsPerPage = 20): Observable<ConversationPage> {\n const query = `page=${encodeURIComponent(page)}&itemsPerPage=${encodeURIComponent(itemsPerPage)}`;\n return this.transport.json<ConversationPage>('GET', `conversations?${query}`);\n }\n\n createConversation(request: CreateConversationRequest): Observable<Conversation> {\n return this.transport.json<Conversation>('POST', 'conversations', request);\n }\n\n getConversation(conversationId: string): Observable<Conversation> {\n return this.transport.json<Conversation>('GET', `conversations/${encodeURIComponent(conversationId)}`);\n }\n\n deleteConversation(conversationId: string): Observable<void> {\n return this.transport.json<void>('DELETE', `conversations/${encodeURIComponent(conversationId)}`);\n }\n\n sendMessage(conversationId: string, request: SendMessageRequest): Observable<NhAssistantSseEvent> {\n return this.requestStream(`conversations/${encodeURIComponent(conversationId)}/messages`, request);\n }\n\n decideApproval(conversationId: string, approvalId: string, request: DecideApprovalRequest): Observable<NhAssistantSseEvent> {\n const path = `conversations/${encodeURIComponent(conversationId)}/approvals/${encodeURIComponent(approvalId)}/decide`;\n return this.requestStream(path, request);\n }\n\n cancel(conversationId: string): Observable<void> {\n return this.transport.json<void>('POST', `conversations/${encodeURIComponent(conversationId)}/cancel`);\n }\n\n /** The caller's own assistant preferences. */\n getPreferences(): Observable<AssistantPreferences> {\n return this.transport.json<AssistantPreferences>('GET', 'preferences');\n }\n\n /** Replaces the caller's own assistant preferences and returns the stored values. */\n updatePreferences(preferences: AssistantPreferences): Observable<AssistantPreferences> {\n return this.transport.json<AssistantPreferences>('PUT', 'preferences', preferences);\n }\n\n private requestStream(path: string, body: unknown): Observable<NhAssistantSseEvent> {\n return new Observable<NhAssistantSseEvent>(subscriber => {\n const abort = new AbortController();\n\n void this.executeStream(path, body, abort.signal, subscriber);\n\n return () => abort.abort();\n });\n }\n\n private async executeStream(\n path: string,\n body: unknown,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantSseEvent>\n ): Promise<void> {\n let response: Response;\n try {\n response = await this.transport.fetch('POST', path, 'text/event-stream', body, signal);\n } catch {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.network);\n return;\n }\n\n if (!response.ok) {\n this.emitClientError(subscriber, signal, await this.transport.failureCode(response));\n return;\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n if (!response.body || !contentType.toLowerCase().startsWith('text/event-stream')) {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.invalidResponse);\n return;\n }\n\n await this.readStream(response.body, signal, subscriber);\n }\n\n private async readStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantSseEvent>\n ): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const parser = new NhAssistantSseParser();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n const text = done ? decoder.decode() : decoder.decode(value, { stream: true });\n const messages = done ? [...parser.push(text), ...parser.end()] : parser.push(text);\n\n for (const message of messages) {\n if (!knownEventTypes.has(message.event)) {\n continue;\n }\n\n let data: unknown;\n try {\n data = JSON.parse(message.data);\n } catch {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.invalidResponse);\n return;\n }\n\n const event = { type: message.event as NhAssistantSseEventType, data } as NhAssistantSseEvent;\n subscriber.next(event);\n\n if (event.type === 'turn.completed' || event.type === 'error') {\n subscriber.complete();\n return;\n }\n }\n\n if (done) {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.streamInterrupted);\n return;\n }\n }\n } catch {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.streamInterrupted);\n } finally {\n // Releases the connection once a terminal event arrived or the consumer unsubscribed.\n reader.cancel().catch(() => undefined);\n }\n }\n\n private emitClientError(subscriber: Subscriber<NhAssistantSseEvent>, signal: AbortSignal, code: string): void {\n if (signal.aborted || subscriber.closed) {\n return;\n }\n\n subscriber.next({ type: 'error', data: { code, messageKey: nhAssistantErrorMessageKey(code) } });\n subscriber.complete();\n }\n}\n","import {\n ApprovalPart,\n Conversation,\n ConversationStatus,\n Message,\n MessagePart,\n ToolCallPart\n} from '../models/assistant-api.models';\nimport { NhAssistantSseEvent, TurnCompletionStatus } from '../models/assistant-sse.models';\n\n/**\n * Applies one assistant event to a conversation and returns the new conversation.\n * The input is never mutated, so the result can be stored in a signal directly.\n *\n * @param clientMessageId id of the optimistic user message of the current turn; its id is\n * replaced by the server's `userMessageId` when `turn.started` arrives.\n */\nexport function applyNhAssistantEvent(\n conversation: Conversation,\n event: NhAssistantSseEvent,\n clientMessageId?: string\n): Conversation {\n switch (event.type) {\n case 'turn.started': {\n let messages = conversation.messages.map(message =>\n clientMessageId && message.id === clientMessageId ? { ...message, id: event.data.userMessageId } : message\n );\n if (!messages.some(message => message.id === event.data.assistantMessageId)) {\n messages = [...messages, createAssistantMessage(event.data.assistantMessageId)];\n }\n\n return { ...conversation, status: 'running', messages };\n }\n\n case 'message.delta': {\n const messages = ensureMessage(conversation.messages, event.data.messageId);\n return {\n ...conversation,\n messages: messages.map(message =>\n message.id === event.data.messageId ? appendText(message, event.data.text) : message\n )\n };\n }\n\n case 'tool.started': {\n const data = event.data;\n if (findToolCall(conversation.messages, data.invocationId)) {\n return updateToolCall(conversation, data.invocationId, part => ({\n ...part,\n toolId: data.toolId,\n toolVersion: data.toolVersion,\n displayName: data.displayName,\n argumentsPreview: data.argumentsPreview,\n status: 'running'\n }));\n }\n\n const part: ToolCallPart = {\n type: 'tool-call',\n invocationId: data.invocationId,\n toolId: data.toolId,\n toolVersion: data.toolVersion,\n displayName: data.displayName,\n status: 'running',\n argumentsPreview: data.argumentsPreview,\n resultPreview: null,\n resultCode: null\n };\n return appendToCurrentAssistantMessage(conversation, part);\n }\n\n case 'tool.completed': {\n const data = event.data;\n return updateToolCall(conversation, data.invocationId, part => ({\n ...part,\n status: data.status,\n resultCode: data.resultCode,\n resultPreview: data.resultPreview\n }));\n }\n\n case 'approval.required': {\n const approval: ApprovalPart = { ...event.data, type: 'approval' };\n const withToolAwaiting = markLatestRunningToolAwaiting(\n conversation,\n approval.toolId,\n approval.presentation?.toolDisplayName);\n const exists = withToolAwaiting.messages.some(message =>\n message.parts.some(part => part.type === 'approval' && part.approvalId === approval.approvalId)\n );\n const withApproval = exists\n ? replaceApproval(withToolAwaiting, approval)\n : appendToCurrentAssistantMessage(withToolAwaiting, approval);\n\n return { ...withApproval, status: 'waiting-for-approval', pendingApproval: approval };\n }\n\n case 'turn.completed': {\n const status = conversationStatusFor(event.data.status);\n return {\n ...conversation,\n status,\n pendingApproval: status === 'waiting-for-approval' ? conversation.pendingApproval : null\n };\n }\n\n case 'error':\n return {\n ...conversation,\n status: conversation.status === 'running' ? 'failed' : conversation.status\n };\n }\n}\n\n/** Records the user's approval decision locally until the server state is reloaded. */\nexport function applyNhAssistantApprovalDecision(\n conversation: Conversation,\n approvalId: string,\n decision: 'approve' | 'reject'\n): Conversation {\n const approval = conversation.messages\n .flatMap(message => message.parts)\n .find((part): part is ApprovalPart => part.type === 'approval' && part.approvalId === approvalId)\n ?? conversation.pendingApproval;\n const toolId = approval?.approvalId === approvalId ? approval.toolId : null;\n\n const messages = conversation.messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part.type === 'approval' && part.approvalId === approvalId\n ? { ...part, status: decision === 'approve' ? 'approved' : 'rejected' } as ApprovalPart\n : part\n )\n }));\n\n let updated: Conversation = {\n ...conversation,\n messages,\n status: 'running',\n pendingApproval: null\n };\n\n if (toolId) {\n const awaiting = findLatestToolCall(updated.messages, part => part.toolId === toolId && part.status === 'awaiting-approval');\n if (awaiting) {\n updated = updateToolCall(updated, awaiting.invocationId, part => ({\n ...part,\n status: decision === 'approve' ? 'running' : 'rejected'\n }));\n }\n }\n\n return updated;\n}\n\nfunction conversationStatusFor(status: TurnCompletionStatus): ConversationStatus {\n switch (status) {\n case 'completed':\n case 'cancelled':\n return 'idle';\n case 'waiting-for-approval':\n return 'waiting-for-approval';\n case 'failed':\n return 'failed';\n }\n}\n\nfunction createAssistantMessage(id: string): Message {\n return { id, role: 'assistant', createdAt: new Date().toISOString(), parts: [] };\n}\n\nfunction ensureMessage(messages: Message[], messageId: string): Message[] {\n return messages.some(message => message.id === messageId)\n ? messages\n : [...messages, createAssistantMessage(messageId)];\n}\n\nfunction appendText(message: Message, text: string): Message {\n const last = message.parts[message.parts.length - 1];\n if (last?.type === 'text') {\n return { ...message, parts: [...message.parts.slice(0, -1), { type: 'text', text: last.text + text }] };\n }\n\n return { ...message, parts: [...message.parts, { type: 'text', text }] };\n}\n\nfunction appendToCurrentAssistantMessage(conversation: Conversation, part: MessagePart): Conversation {\n let index = -1;\n for (let position = conversation.messages.length - 1; position >= 0; position--) {\n if (conversation.messages[position].role === 'assistant') {\n index = position;\n break;\n }\n }\n\n if (index < 0) {\n const message = createAssistantMessage(`local-${partKey(part)}`);\n return { ...conversation, messages: [...conversation.messages, { ...message, parts: [part] }] };\n }\n\n return {\n ...conversation,\n messages: conversation.messages.map((message, position) =>\n position === index ? { ...message, parts: [...message.parts, part] } : message\n )\n };\n}\n\nfunction partKey(part: MessagePart): string {\n if (part.type === 'tool-call') {\n return part.invocationId;\n }\n if (part.type === 'approval') {\n return part.approvalId;\n }\n\n return 'text';\n}\n\nfunction findToolCall(messages: Message[], invocationId: string): ToolCallPart | undefined {\n return findLatestToolCall(messages, part => part.invocationId === invocationId);\n}\n\nfunction findLatestToolCall(messages: Message[], predicate: (part: ToolCallPart) => boolean): ToolCallPart | undefined {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex--) {\n const parts = messages[messageIndex].parts;\n for (let partIndex = parts.length - 1; partIndex >= 0; partIndex--) {\n const part = parts[partIndex];\n if (part.type === 'tool-call' && predicate(part)) {\n return part;\n }\n }\n }\n\n return undefined;\n}\n\nfunction updateToolCall(\n conversation: Conversation,\n invocationId: string,\n update: (part: ToolCallPart) => ToolCallPart\n): Conversation {\n return {\n ...conversation,\n messages: conversation.messages.map(message =>\n message.parts.some(part => part.type === 'tool-call' && part.invocationId === invocationId)\n ? {\n ...message,\n parts: message.parts.map(part =>\n part.type === 'tool-call' && part.invocationId === invocationId ? update(part) : part\n )\n }\n : message\n )\n };\n}\n\nfunction markLatestRunningToolAwaiting(\n conversation: Conversation,\n toolId: string,\n displayName?: string\n): Conversation {\n const running = findLatestToolCall(conversation.messages, part => part.toolId === toolId && part.status === 'running');\n if (!running) {\n return conversation;\n }\n\n return updateToolCall(conversation, running.invocationId, part => ({\n ...part,\n displayName: displayName ?? part.displayName,\n status: 'awaiting-approval'\n }));\n}\n\nfunction replaceApproval(conversation: Conversation, approval: ApprovalPart): Conversation {\n return {\n ...conversation,\n messages: conversation.messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part.type === 'approval' && part.approvalId === approval.approvalId ? approval : part\n )\n }))\n };\n}\n","import { ClientContext, ClientContextEntity } from '../models/assistant-api.models';\n\n/** Limits of the page context (contract 15.2). */\nexport const NH_ASSISTANT_PAGE_CONTEXT_LIMITS = {\n route: 200,\n title: 120,\n entities: 5,\n entityId: 64,\n entityLabel: 120\n} as const;\n\nconst dashCase = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n/**\n * Validates host-provided page context and truncates it to the contract limits.\n * Returns null for an invalid shape (not an object or no route), so the message is sent\n * without page context. Route, title and labels are truncated; entities beyond five are\n * dropped, and entities with a type that is not dash-case, an empty id or an id longer\n * than 64 characters are dropped because a truncated id would point at another entity.\n */\nexport function normalizeNhAssistantClientContext(value: unknown): ClientContext | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const route = typeof value['route'] === 'string' ? value['route'].trim() : '';\n if (route.length === 0) {\n return null;\n }\n\n const result: ClientContext = { route: truncate(route, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.route) };\n\n const title = typeof value['title'] === 'string' ? value['title'].trim() : '';\n if (title.length > 0) {\n result.title = truncate(title, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.title);\n }\n\n if (Array.isArray(value['entities'])) {\n const entities = value['entities']\n .map(normalizeEntity)\n .filter((entity): entity is ClientContextEntity => entity !== null)\n .slice(0, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.entities);\n if (entities.length > 0) {\n result.entities = entities;\n }\n }\n\n return result;\n}\n\n/** Short text for the page-context chip: the first entity's label, the title or the route. */\nexport function describeNhAssistantClientContext(context: ClientContext): string {\n const entity = context.entities?.[0];\n if (entity) {\n return entity.label ?? `${entity.type} ${entity.id}`;\n }\n\n return context.title ?? context.route;\n}\n\nfunction normalizeEntity(value: unknown): ClientContextEntity | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const type = typeof value['type'] === 'string' ? value['type'].trim() : '';\n const id = typeof value['id'] === 'string' ? value['id'].trim() : '';\n if (!dashCase.test(type) || id.length === 0 || id.length > NH_ASSISTANT_PAGE_CONTEXT_LIMITS.entityId) {\n return null;\n }\n\n const entity: ClientContextEntity = { type, id };\n const label = typeof value['label'] === 'string' ? value['label'].trim() : '';\n if (label.length > 0) {\n entity.label = truncate(label, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.entityLabel);\n }\n return entity;\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : value.slice(0, max);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import { EnvironmentInjector, Injectable, inject, runInInjectionContext } from '@angular/core';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\n\ninterface AssistantUiState {\n agentId: string | null;\n conversationId: string | null;\n panelOpen: boolean;\n}\n\nconst emptyState: AssistantUiState = { agentId: null, conversationId: null, panelOpen: false };\nconst storagePrefix = 'nh-assistant-ui:v1:';\n\n/** Browser-only UI pointers. Messages, drafts, tokens and page context are never stored. */\n@Injectable()\nexport class NhAssistantUiState {\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly injector = inject(EnvironmentInjector);\n private key: string | null = null;\n private state: AssistantUiState = { ...emptyState };\n private activated = false;\n private activationRevision = 0;\n\n async activate(): Promise<{ changed: boolean; state: Readonly<AssistantUiState> }> {\n const revision = ++this.activationRevision;\n let scope: string | null = null;\n try {\n scope = await runInInjectionContext(this.injector, () => this.config.getStateScope?.() ?? null);\n } catch {\n scope = null;\n }\n\n if (revision !== this.activationRevision) {\n return { changed: false, state: this.state };\n }\n\n const normalized = typeof scope === 'string' ? scope.trim() : '';\n const key = normalized.length > 0 && normalized.length <= 256\n ? `${storagePrefix}${encodeURIComponent(this.config.apiBaseUrl)}:${encodeURIComponent(normalized)}`\n : null;\n if (this.activated && key === this.key) {\n return { changed: false, state: this.state };\n }\n\n this.activated = true;\n this.key = key;\n this.state = this.read();\n return { changed: true, state: this.state };\n }\n\n deactivate(): void {\n this.activationRevision++;\n this.activated = false;\n this.key = null;\n this.state = { ...emptyState };\n }\n\n update(patch: Partial<AssistantUiState>): void {\n this.state = { ...this.state, ...patch };\n if (!this.key) {\n return;\n }\n\n try {\n globalThis.localStorage?.setItem(this.key, JSON.stringify(this.state));\n } catch {\n // Storage can be unavailable or full; the live assistant remains usable.\n }\n }\n\n private read(): AssistantUiState {\n if (!this.key) {\n return { ...emptyState };\n }\n\n try {\n const raw = globalThis.localStorage?.getItem(this.key);\n const value: unknown = raw ? JSON.parse(raw) : null;\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { ...emptyState };\n }\n\n const saved = value as Record<string, unknown>;\n return {\n agentId: validId(saved['agentId']),\n conversationId: validId(saved['conversationId']),\n panelOpen: saved['panelOpen'] === true\n };\n } catch {\n return { ...emptyState };\n }\n }\n}\n\nfunction validId(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 && value.length <= 256 ? value : null;\n}\n","import { DestroyRef, EnvironmentInjector, Injectable, computed, inject, runInInjectionContext, signal } from '@angular/core';\nimport { Observable, Subscription, firstValueFrom, isObservable } from 'rxjs';\nimport {\n AgentSummary,\n ApprovalDecision,\n AssistantStatus,\n ClientContext,\n Conversation,\n ConversationSummary\n} from '../models/assistant-api.models';\nimport { NhAssistantClientErrorCodes, NhAssistantSseEvent, TurnUsage } from '../models/assistant-sse.models';\nimport { NH_ASSISTANT_ACCESS_POLICY, NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantApiError, NhAssistantApiService, nhAssistantErrorMessageKey } from './nh-assistant-api.service';\nimport { applyNhAssistantApprovalDecision, applyNhAssistantEvent } from './nh-assistant-reducer';\nimport { normalizeNhAssistantClientContext } from './nh-assistant-page-context';\nimport { NhAssistantUiState } from './nh-assistant-ui-state';\n\n/** A user-facing assistant failure: a stable code and a translation key, never raw server text. */\nexport interface NhAssistantError {\n code: string;\n messageKey: string;\n}\n\nconst conversationPageSize = 50;\nconst cancelGracePeriodMs = 5_000;\n\n/**\n * Signal-based state of one assistant scope: availability, agents, the conversation list\n * and the active conversation with its streamed turn.\n */\n@Injectable()\nexport class NhAssistantStore {\n private readonly api = inject(NhAssistantApiService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly injector = inject(EnvironmentInjector);\n private readonly accessPolicy = inject(NH_ASSISTANT_ACCESS_POLICY);\n private readonly uiState = inject(NhAssistantUiState);\n\n private readonly accessGrantedState = signal<boolean | null>(null);\n private readonly statusState = signal<AssistantStatus | null>(null);\n private readonly statusLoadingState = signal(false);\n private readonly selectedAgentIdState = signal<string | null>(null);\n private readonly conversationsState = signal<ConversationSummary[]>([]);\n private readonly conversationsTotalState = signal(0);\n private readonly conversationsLoadingState = signal(false);\n private readonly activeConversationState = signal<Conversation | null>(null);\n private readonly conversationLoadingState = signal(false);\n private readonly streamingState = signal(false);\n private readonly decidingState = signal(false);\n private readonly errorState = signal<NhAssistantError | null>(null);\n private readonly lastUsageState = signal<TurnUsage | null>(null);\n private readonly restoredDraftState = signal<string | null>(null);\n private readonly pageContextState = signal<ClientContext | null>(null);\n private readonly pageContextExcludedState = signal(false);\n private readonly restorePanelOpenState = signal(false);\n\n private accessSubscription?: Subscription;\n private streamSubscription?: Subscription;\n private cancelTimer?: ReturnType<typeof setTimeout>;\n private initialization?: Promise<void>;\n private statusRevision = 0;\n private accountRevision = 0;\n private pendingSendResolve?: (accepted: boolean) => void;\n\n /** True when the access policy allows the user and the server reports the assistant as enabled. */\n readonly enabled = computed(() => this.accessGrantedState() === true && this.statusState()?.enabled === true);\n readonly accessGranted = this.accessGrantedState.asReadonly();\n /** True when the assistant is enabled and the server reports that the caller passes the admin policy. */\n readonly canAdminister = computed(() => this.enabled() && this.statusState()?.canAdminister === true);\n readonly statusLoading = this.statusLoadingState.asReadonly();\n readonly limits = computed(() => this.statusState()?.limits ?? null);\n readonly agents = computed<AgentSummary[]>(() => this.statusState()?.agents ?? []);\n readonly selectedAgentId = this.selectedAgentIdState.asReadonly();\n readonly selectedAgent = computed(() =>\n this.agents().find(agent => agent.id === this.selectedAgentIdState()) ?? null\n );\n readonly conversations = this.conversationsState.asReadonly();\n readonly conversationsTotal = this.conversationsTotalState.asReadonly();\n readonly conversationsLoading = this.conversationsLoadingState.asReadonly();\n readonly activeConversation = this.activeConversationState.asReadonly();\n readonly conversationLoading = this.conversationLoadingState.asReadonly();\n readonly streaming = this.streamingState.asReadonly();\n readonly pendingApproval = computed(() => this.activeConversationState()?.pendingApproval ?? null);\n readonly deciding = this.decidingState.asReadonly();\n readonly error = this.errorState.asReadonly();\n readonly lastUsage = this.lastUsageState.asReadonly();\n /** Text of a message the server did not accept, so the composer can offer it again. */\n readonly restoredDraft = this.restoredDraftState.asReadonly();\n /** Page context that the next message would send, for the transparency chip. */\n readonly pageContext = this.pageContextState.asReadonly();\n /** True when the user left the page context out of the next message. */\n readonly pageContextExcluded = this.pageContextExcludedState.asReadonly();\n /** Whether the drawer was open when this account last left the application. */\n readonly restorePanelOpen = this.restorePanelOpenState.asReadonly();\n /** True while the user can send: enabled, an agent is chosen and no turn runs or waits. */\n readonly canSend = computed(() => {\n const conversation = this.activeConversationState();\n const blocked = conversation !== null && conversation.status !== 'idle';\n return this.enabled() && this.selectedAgentIdState() !== null && !this.streamingState() && !this.conversationLoadingState() && !blocked;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.accessSubscription?.unsubscribe();\n this.streamSubscription?.unsubscribe();\n clearTimeout(this.cancelTimer);\n });\n }\n\n /** Evaluates the access policy and loads the server status once. Safe to call repeatedly. */\n initialize(): Promise<void> {\n this.initialization ??= this.startInitialization();\n return this.initialization;\n }\n\n /** Reloads the server status, for example after the host changed the signed-in user. */\n async reloadStatus(): Promise<void> {\n const revision = ++this.statusRevision;\n if (this.accessGrantedState() !== true) {\n this.accountRevision++;\n this.stopLocalTurn();\n this.statusState.set(null);\n this.activeConversationState.set(null);\n this.selectedAgentIdState.set(null);\n this.conversationsState.set([]);\n this.conversationsTotalState.set(0);\n this.conversationLoadingState.set(false);\n this.conversationsLoadingState.set(false);\n this.pageContextState.set(null);\n this.pageContextExcludedState.set(false);\n this.restoredDraftState.set(null);\n this.errorState.set(null);\n this.lastUsageState.set(null);\n this.restorePanelOpenState.set(false);\n this.uiState.deactivate();\n return;\n }\n\n this.statusLoadingState.set(true);\n try {\n const restored = await this.uiState.activate();\n if (revision !== this.statusRevision) {\n return;\n }\n if (restored.changed) {\n this.accountRevision++;\n this.stopLocalTurn();\n this.statusState.set(null);\n this.activeConversationState.set(null);\n this.conversationsState.set([]);\n this.conversationsTotalState.set(0);\n this.conversationLoadingState.set(false);\n this.conversationsLoadingState.set(false);\n this.pageContextState.set(null);\n this.pageContextExcludedState.set(false);\n this.restoredDraftState.set(null);\n this.errorState.set(null);\n this.lastUsageState.set(null);\n this.selectedAgentIdState.set(restored.state.agentId);\n this.restorePanelOpenState.set(restored.state.panelOpen);\n }\n\n const status = await firstValueFrom(this.api.status());\n if (revision !== this.statusRevision) {\n return;\n }\n this.statusState.set(status);\n if (status.enabled) {\n this.selectInitialAgent(status.agents);\n if (!this.activeConversationState() && restored.state.conversationId) {\n await this.loadConversation(restored.state.conversationId, true);\n }\n }\n } catch {\n // An unavailable assistant endpoint hides the assistant instead of showing an error.\n if (revision === this.statusRevision) {\n this.statusState.set(null);\n }\n } finally {\n if (revision === this.statusRevision) {\n this.statusLoadingState.set(false);\n }\n }\n }\n\n async refreshConversations(): Promise<void> {\n if (!this.enabled()) {\n return;\n }\n\n const revision = this.accountRevision;\n this.conversationsLoadingState.set(true);\n try {\n const page = await firstValueFrom(this.api.listConversations(1, conversationPageSize));\n if (revision === this.accountRevision) {\n this.conversationsState.set(page.items);\n this.conversationsTotalState.set(page.total);\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.conversationsLoadingState.set(false);\n }\n }\n }\n\n /** Chooses the agent for the next new conversation. Switching away from the active conversation's agent starts a new one. */\n selectAgent(agentId: string): void {\n if (!this.agents().some(agent => agent.id === agentId)) {\n return;\n }\n\n this.selectedAgentIdState.set(agentId);\n this.uiState.update({ agentId });\n const active = this.activeConversationState();\n if (active && active.agentId !== agentId && !this.streamingState()) {\n this.startNewConversation();\n }\n }\n\n /** Leaves the active conversation; the next message creates a new one. */\n startNewConversation(): void {\n if (this.streamingState()) {\n return;\n }\n\n this.activeConversationState.set(null);\n this.uiState.update({ conversationId: null });\n this.errorState.set(null);\n this.lastUsageState.set(null);\n }\n\n async openConversation(conversationId: string): Promise<void> {\n await this.loadConversation(conversationId, false);\n }\n\n private async loadConversation(conversationId: string, restoring: boolean): Promise<void> {\n if (this.streamingState() || this.activeConversationState()?.id === conversationId) {\n return;\n }\n\n const revision = this.accountRevision;\n this.conversationLoadingState.set(true);\n this.errorState.set(null);\n try {\n const conversation = await firstValueFrom(this.api.getConversation(conversationId));\n if (revision !== this.accountRevision) {\n return;\n }\n if (!this.agents().some(agent => agent.id === conversation.agentId)) {\n this.uiState.update({ conversationId: null });\n return;\n }\n this.activeConversationState.set(conversation);\n this.selectedAgentIdState.set(conversation.agentId);\n this.uiState.update({ conversationId, agentId: conversation.agentId });\n } catch (error) {\n if (revision !== this.accountRevision) {\n return;\n }\n if (error instanceof NhAssistantApiError && (error.status === 403 || error.status === 404)) {\n this.uiState.update({ conversationId: null });\n }\n if (!restoring) {\n this.setError(error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.conversationLoadingState.set(false);\n }\n }\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n if (this.streamingState() && this.activeConversationState()?.id === conversationId) {\n return;\n }\n\n const revision = this.accountRevision;\n try {\n await firstValueFrom(this.api.deleteConversation(conversationId), { defaultValue: undefined });\n if (revision !== this.accountRevision) {\n return;\n }\n this.conversationsState.update(items => items.filter(item => item.id !== conversationId));\n this.conversationsTotalState.update(total => Math.max(0, total - 1));\n if (this.activeConversationState()?.id === conversationId) {\n this.activeConversationState.set(null);\n this.uiState.update({ conversationId: null });\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n }\n }\n\n /**\n * Sends a user message. Creates a conversation with the selected agent when none is\n * active, shows the message optimistically and applies the streamed events.\n * Resolves `false` when the message was not accepted.\n */\n async send(text: string): Promise<boolean> {\n const trimmed = text.trim();\n await this.initialize();\n await this.reloadStatus();\n const maxChars = this.limits()?.maxMessageChars ?? Number.MAX_SAFE_INTEGER;\n if (trimmed.length === 0 || trimmed.length > maxChars || !this.canSend()) {\n return false;\n }\n\n this.errorState.set(null);\n this.restoredDraftState.set(null);\n this.streamingState.set(true);\n const accountRevision = this.accountRevision;\n\n let conversation = this.activeConversationState();\n if (!conversation) {\n conversation = await this.createConversation();\n if (!conversation) {\n if (accountRevision === this.accountRevision) {\n this.streamingState.set(false);\n this.restoredDraftState.set(text);\n }\n return false;\n }\n }\n\n const clientContext = await this.contextForMessage();\n if (accountRevision !== this.accountRevision) {\n return false;\n }\n const clientMessageId = createClientMessageId();\n const previousStatus = conversation.status;\n this.activeConversationState.set({\n ...conversation,\n status: 'running',\n messages: [\n ...conversation.messages,\n { id: clientMessageId, role: 'user', createdAt: new Date().toISOString(), parts: [{ type: 'text', text: trimmed }] }\n ]\n });\n\n const conversationId = conversation.id;\n return new Promise<boolean>(resolve => {\n this.pendingSendResolve = resolve;\n let started = false;\n let failedAfterStart = false;\n\n this.runStream(this.api.sendMessage(conversationId, {\n text: trimmed,\n clientMessageId,\n ...(clientContext === undefined ? {} : { clientContext })\n }), {\n next: event => {\n if (event.type === 'error' && !started) {\n this.removeMessage(clientMessageId, previousStatus);\n this.restoredDraftState.set(text);\n this.errorState.set(event.data);\n resolve(false);\n return;\n }\n\n if (event.type === 'turn.started') {\n started = true;\n resolve(true);\n }\n if (event.type === 'error') {\n failedAfterStart = true;\n }\n\n this.applyEvent(event, clientMessageId);\n },\n complete: () => {\n this.pendingSendResolve = undefined;\n resolve(started);\n this.afterTurn(conversationId, failedAfterStart);\n }\n });\n });\n }\n\n /** Approves or rejects the pending approval. Ignores repeated calls while a decision is in flight. */\n decide(decision: ApprovalDecision, reason?: string): void {\n const conversation = this.activeConversationState();\n const approval = conversation?.pendingApproval ?? null;\n if (!conversation || !approval || this.decidingState() || this.streamingState()) {\n return;\n }\n\n this.decidingState.set(true);\n this.streamingState.set(true);\n this.errorState.set(null);\n\n let accepted = false;\n let failed = false;\n const request = { decision, expectedProposalHash: approval.proposalHash, ...(reason ? { reason } : {}) };\n\n this.runStream(this.api.decideApproval(conversation.id, approval.approvalId, request), {\n next: event => {\n if (!accepted && event.type !== 'error') {\n accepted = true;\n this.updateActive(current => applyNhAssistantApprovalDecision(current, approval.approvalId, decision));\n }\n if (event.type === 'error') {\n failed = true;\n if (!accepted) {\n this.errorState.set(event.data);\n return;\n }\n }\n\n this.applyEvent(event);\n },\n complete: () => {\n this.decidingState.set(false);\n this.afterTurn(conversation.id, failed);\n }\n });\n }\n\n /** Asks the server to stop the running turn or to abandon a waiting approval. */\n async cancel(): Promise<void> {\n const conversation = this.activeConversationState();\n if (!conversation || (conversation.status === 'idle' && !this.streamingState())) {\n return;\n }\n\n const revision = this.accountRevision;\n try {\n await firstValueFrom(this.api.cancel(conversation.id), { defaultValue: undefined });\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n return;\n }\n\n if (revision !== this.accountRevision) {\n return;\n }\n\n if (!this.streamingState()) {\n await this.reloadActiveConversation(conversation.id);\n return;\n }\n\n // The server ends the stream with turn.completed(cancelled); stop waiting if it does not.\n clearTimeout(this.cancelTimer);\n this.cancelTimer = setTimeout(() => {\n if (this.streamingState()) {\n this.streamSubscription?.unsubscribe();\n this.streamingState.set(false);\n this.decidingState.set(false);\n void this.reloadActiveConversation(conversation.id);\n }\n }, cancelGracePeriodMs);\n }\n\n clearError(): void {\n this.errorState.set(null);\n }\n\n /** Persists only drawer visibility, never the page context or a message draft. */\n setPanelOpen(open: boolean): void {\n this.restorePanelOpenState.set(open);\n this.uiState.update({ panelOpen: open });\n }\n\n /** Reads the host's page context again so the chip shows what the next message sends. */\n async refreshPageContext(): Promise<void> {\n const revision = this.accountRevision;\n const context = await this.readPageContext();\n if (revision === this.accountRevision) {\n this.pageContextState.set(context ?? null);\n }\n }\n\n /** Leaves the page context out of the next message only, or includes it again. */\n setPageContextExcluded(excluded: boolean): void {\n this.pageContextExcludedState.set(excluded);\n }\n\n /** Returns and clears the draft of a message that was not accepted. */\n consumeRestoredDraft(): string | null {\n const draft = this.restoredDraftState();\n this.restoredDraftState.set(null);\n return draft;\n }\n\n /**\n * Page context for one message: `undefined` omits the field (no getter, getter failed or\n * invalid shape), `null` sends an explicit \"none\" (no context or left out by the user).\n */\n private async contextForMessage(): Promise<ClientContext | null | undefined> {\n if (!this.config.getPageContext) {\n return undefined;\n }\n\n if (this.pageContextExcludedState()) {\n this.pageContextExcludedState.set(false);\n return null;\n }\n\n const revision = this.accountRevision;\n const context = await this.readPageContext();\n if (revision === this.accountRevision) {\n this.pageContextState.set(context ?? null);\n }\n return context;\n }\n\n private async readPageContext(): Promise<ClientContext | null | undefined> {\n const getter = this.config.getPageContext;\n if (!getter) {\n return undefined;\n }\n\n try {\n const value = await runInInjectionContext(this.injector, () => getter());\n if (value === null || value === undefined) {\n return null;\n }\n return normalizeNhAssistantClientContext(value) ?? undefined;\n } catch {\n // A failing host getter never blocks sending; the message goes without page context.\n return undefined;\n }\n }\n\n private async startInitialization(): Promise<void> {\n const decision = this.accessPolicy.canUse();\n if (!isObservable(decision)) {\n this.accessGrantedState.set(decision);\n await this.reloadStatus();\n return;\n }\n\n await new Promise<void>(resolve => {\n this.accessSubscription = (decision as Observable<boolean>).subscribe({\n next: granted => {\n this.accessGrantedState.set(granted);\n void this.reloadStatus().finally(() => resolve());\n },\n error: () => {\n this.accessGrantedState.set(false);\n resolve();\n },\n complete: () => resolve()\n });\n });\n }\n\n private async createConversation(): Promise<Conversation | null> {\n const agentId = this.selectedAgentIdState();\n if (!agentId) {\n return null;\n }\n\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.createConversation({ agentId }));\n if (revision !== this.accountRevision) {\n return null;\n }\n this.activeConversationState.set(conversation);\n this.uiState.update({ conversationId: conversation.id });\n this.conversationsState.update(items => [toSummary(conversation), ...items.filter(item => item.id !== conversation.id)]);\n this.conversationsTotalState.update(total => total + 1);\n return conversation;\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n return null;\n }\n }\n\n private runStream(\n stream: Observable<NhAssistantSseEvent>,\n handlers: { next: (event: NhAssistantSseEvent) => void; complete: () => void }\n ): void {\n this.streamSubscription?.unsubscribe();\n this.streamingState.set(true);\n\n const finish = () => {\n clearTimeout(this.cancelTimer);\n this.streamingState.set(false);\n handlers.complete();\n };\n\n this.streamSubscription = stream.subscribe({\n next: event => handlers.next(event),\n error: () => {\n this.errorState.set(clientError(NhAssistantClientErrorCodes.network));\n finish();\n },\n complete: finish\n });\n }\n\n private stopLocalTurn(): void {\n this.streamSubscription?.unsubscribe();\n this.pendingSendResolve?.(false);\n this.pendingSendResolve = undefined;\n clearTimeout(this.cancelTimer);\n this.streamingState.set(false);\n this.decidingState.set(false);\n }\n\n private applyEvent(event: NhAssistantSseEvent, clientMessageId?: string): void {\n this.updateActive(conversation => applyNhAssistantEvent(conversation, event, clientMessageId));\n\n if (event.type === 'error') {\n this.errorState.set(event.data);\n }\n if (event.type === 'turn.completed') {\n this.lastUsageState.set(event.data.usage);\n if (event.data.status === 'failed') {\n const code = event.data.errorCode ?? NhAssistantClientErrorCodes.server;\n this.errorState.set(clientError(code));\n }\n }\n }\n\n private afterTurn(conversationId: string, reload: boolean): void {\n const active = this.activeConversationState();\n if (active?.id === conversationId) {\n this.conversationsState.update(items => items.map(item =>\n item.id === conversationId ? { ...item, status: active.status, updatedAt: new Date().toISOString() } : item\n ));\n }\n\n if (reload) {\n void this.reloadActiveConversation(conversationId);\n }\n if (!active?.title) {\n void this.refreshConversations();\n }\n }\n\n private async reloadActiveConversation(conversationId: string): Promise<void> {\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.getConversation(conversationId));\n if (revision === this.accountRevision && this.activeConversationState()?.id === conversationId && !this.streamingState()) {\n this.activeConversationState.set(conversation);\n }\n } catch {\n // Keep the local state; the error of the turn is already shown.\n }\n }\n\n private updateActive(update: (conversation: Conversation) => Conversation): void {\n const conversation = this.activeConversationState();\n if (conversation) {\n this.activeConversationState.set(update(conversation));\n }\n }\n\n private removeMessage(messageId: string, status: Conversation['status']): void {\n this.updateActive(conversation => ({\n ...conversation,\n status,\n messages: conversation.messages.filter(message => message.id !== messageId)\n }));\n }\n\n private selectInitialAgent(agents: AgentSummary[]): void {\n const current = this.selectedAgentIdState();\n if (current && agents.some(agent => agent.id === current)) {\n return;\n }\n\n const preferred = agents.find(agent => agent.id === this.config.defaultAgentId) ?? agents[0] ?? null;\n this.selectedAgentIdState.set(preferred?.id ?? null);\n this.uiState.update({ agentId: preferred?.id ?? null });\n }\n\n private setError(error: unknown): void {\n if (error instanceof NhAssistantApiError) {\n this.errorState.set({ code: error.code, messageKey: error.messageKey });\n return;\n }\n\n this.errorState.set(clientError(NhAssistantClientErrorCodes.server));\n }\n}\n\nfunction clientError(code: string): NhAssistantError {\n return { code, messageKey: nhAssistantErrorMessageKey(code) };\n}\n\nfunction toSummary(conversation: Conversation): ConversationSummary {\n return {\n id: conversation.id,\n agentId: conversation.agentId,\n title: conversation.title,\n status: conversation.status,\n createdAt: conversation.createdAt,\n updatedAt: conversation.updatedAt\n };\n}\n\nfunction createClientMessageId(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (cryptoApi?.getRandomValues) {\n cryptoApi.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index++) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Injectable, Injector, Signal, afterNextRender, effect, inject, signal, untracked } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { NhAssistantStore } from './nh-assistant.store';\n\n/** Drawer width on wider screens; below the mobile breakpoint the panel fills the screen. */\nexport const NH_ASSISTANT_PANEL_WIDTH = '420px';\nexport const NH_ASSISTANT_PANEL_MOBILE_QUERY = '(max-width: 599.98px)';\n\n/**\n * Opens and closes the assistant panel as a CDK overlay drawer on the right edge.\n * `nh-assistant-panel` registers its content once; any component can then open the panel,\n * optionally on a specific conversation. Escape closes the panel and focus returns to the\n * element that opened it.\n */\n@Injectable()\nexport class NhAssistantPanelService {\n private readonly overlay = inject(Overlay);\n private readonly store = inject(NhAssistantStore);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly breakpoints = inject(BreakpointObserver);\n\n private readonly openState = signal(false);\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n private subscriptions = new Subscription();\n private returnFocusTo: HTMLElement | null = null;\n\n readonly isOpen: Signal<boolean> = this.openState.asReadonly();\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.dispose());\n effect(() => {\n if (this.store.enabled() && this.store.restorePanelOpen() && this.portal && !this.openState()) {\n untracked(() => queueMicrotask(() => {\n if (this.portal && this.store.enabled() && this.store.restorePanelOpen() && !this.openState()) {\n this.showPanel();\n }\n }));\n }\n });\n }\n\n open(conversationId?: string): void {\n if (this.openState() && !conversationId) {\n return;\n }\n\n this.showPanel();\n void this.store.initialize().then(() => this.store.reloadStatus()).then(() => {\n if (this.openState()) {\n this.store.setPanelOpen(true);\n }\n if (conversationId) {\n void this.store.openConversation(conversationId);\n }\n });\n }\n\n private showPanel(): void {\n if (this.openState()) {\n return;\n }\n\n const active = this.document.activeElement;\n this.returnFocusTo = active instanceof HTMLElement ? active : null;\n this.openState.set(true);\n this.attach();\n }\n\n close(): void {\n if (!this.openState()) {\n return;\n }\n\n this.openState.set(false);\n this.store.setPanelOpen(false);\n this.overlayRef?.detach();\n\n const target = this.returnFocusTo;\n this.returnFocusTo = null;\n if (target?.isConnected) {\n target.focus();\n }\n }\n\n toggle(): void {\n if (this.openState()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /** Called by `nh-assistant-panel`; hosts should place that component once instead. */\n registerPanel(portal: TemplatePortal): void {\n this.portal = portal;\n if (this.openState()) {\n this.attach();\n } else {\n void this.store.initialize().then(() => {\n if (this.portal === portal && this.store.enabled() && this.store.restorePanelOpen()) {\n this.showPanel();\n }\n });\n }\n }\n\n unregisterPanel(portal: TemplatePortal): void {\n if (this.portal !== portal) {\n return;\n }\n\n this.overlayRef?.detach();\n this.portal = undefined;\n }\n\n private attach(): void {\n if (!this.portal || this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.ensureOverlay();\n overlayRef.attach(this.portal);\n this.updateSize(this.breakpoints.isMatched(NH_ASSISTANT_PANEL_MOBILE_QUERY));\n\n afterNextRender(() => {\n const target = overlayRef.overlayElement.querySelector<HTMLElement>('[data-nh-assistant-autofocus]');\n target?.focus();\n }, { injector: this.injector });\n }\n\n private ensureOverlay(): OverlayRef {\n if (this.overlayRef) {\n return this.overlayRef;\n }\n\n const overlayRef = this.overlay.create({\n positionStrategy: this.overlay.position().global().top('0').right('0'),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: 'nh-assistant-overlay-pane',\n height: '100%',\n width: NH_ASSISTANT_PANEL_WIDTH,\n maxWidth: '100vw'\n });\n\n this.subscriptions.add(overlayRef.keydownEvents().subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }));\n this.subscriptions.add(this.breakpoints.observe(NH_ASSISTANT_PANEL_MOBILE_QUERY).subscribe(state => {\n this.updateSize(state.matches);\n }));\n\n this.overlayRef = overlayRef;\n return overlayRef;\n }\n\n private updateSize(mobile: boolean): void {\n this.overlayRef?.updateSize({ width: mobile ? '100vw' : NH_ASSISTANT_PANEL_WIDTH, height: '100%' });\n }\n\n private dispose(): void {\n this.subscriptions.unsubscribe();\n this.overlayRef?.dispose();\n this.overlayRef = undefined;\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';\nimport { NhAssistantTranslationMerger } from './i18n/nh-assistant-translations';\nimport {\n NH_ASSISTANT_ACCESS_POLICY,\n NH_ASSISTANT_CONFIG,\n NhAssistantAllowAllAccessPolicy,\n NhAssistantConfig\n} from './nh-assistant.config';\nimport { NhAssistantAdminApiService } from './services/nh-assistant-admin-api.service';\nimport { NhAssistantApiService } from './services/nh-assistant-api.service';\nimport { NhAssistantPanelService } from './services/nh-assistant-panel.service';\nimport { NhAssistantStore } from './services/nh-assistant.store';\nimport { NhAssistantUiState } from './services/nh-assistant-ui-state';\nimport { NhAssistantTransport } from './services/nh-assistant-transport';\n\n/**\n * Registers the assistant client, store and panel for one application or route scope.\n * Call it once in the root providers; a route may call it again to host an isolated\n * assistant with its own configuration.\n */\nexport function provideNhAssistant(config: NhAssistantConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NH_ASSISTANT_CONFIG, useValue: config },\n { provide: NH_ASSISTANT_ACCESS_POLICY, useClass: config.accessPolicy ?? NhAssistantAllowAllAccessPolicy },\n NhAssistantTransport,\n NhAssistantApiService,\n NhAssistantAdminApiService,\n NhAssistantStore,\n NhAssistantUiState,\n NhAssistantPanelService,\n ...(config.translations === 'host'\n ? []\n : [provideEnvironmentInitializer(() => inject(NhAssistantTranslationMerger).start())])\n ]);\n}\n","import { ChangeDetectionStrategy, Component, InjectionToken, computed, inject, input } from '@angular/core';\n\nexport type NhAssistantIconName =\n | 'assistant'\n | 'close'\n | 'send'\n | 'stop'\n | 'plus'\n | 'list'\n | 'trash'\n | 'tool'\n | 'check'\n | 'x'\n | 'warning'\n | 'chevron-down'\n | 'clock'\n | 'settings'\n | 'admin'\n | 'edit'\n | 'refresh'\n | 'link'\n | 'page';\n\n/**\n * Optional icon classes of the host's icon library, for example `{ close: 'ph ph-x' }`.\n * Icons without a class use the library's small built-in outline glyphs.\n */\nexport const NH_ASSISTANT_ICONS = new InjectionToken<Partial<Record<NhAssistantIconName, string>>>('NH_ASSISTANT_ICONS');\n\nconst builtInPaths: Record<NhAssistantIconName, string> = {\n assistant: 'M12 3l1.8 4.7 4.7 1.8-4.7 1.8L12 16l-1.8-4.7-4.7-1.8 4.7-1.8zM18.5 15l.8 2 2 .8-2 .8-.8 2-.8-2-2-.8 2-.8z',\n close: 'M6 6l12 12M18 6L6 18',\n send: 'M4 12l16-8-6 16-2.5-6.5zM11.5 13.5L20 4',\n stop: 'M7 7h10v10H7z',\n plus: 'M12 5v14M5 12h14',\n list: 'M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01',\n trash: 'M4 7h16M10 11v6M14 11v6M6 7l1 13h10l1-13M9 7V4h6v3',\n tool: 'M14.7 6.3a4 4 0 0 0-5.4 5.4L4 17l3 3 5.3-5.3a4 4 0 0 0 5.4-5.4l-2.5 2.5-2.1-.4-.4-2.1z',\n check: 'M5 12.5l4.5 4.5L19 7.5',\n x: 'M7 7l10 10M17 7L7 17',\n warning: 'M12 4L2.5 20h19zM12 10v4M12 17h.01',\n 'chevron-down': 'M6 9l6 6 6-6',\n clock: 'M12 3a9 9 0 1 0 0 18 9 9 0 1 0 0-18zM12 7v5l3 2',\n settings: 'M4 7h9M17 7h3M4 17h3M11 17h9M15 5v4M9 15v4',\n admin: 'M12 3l7 3v5c0 4.5-3 8.2-7 10-4-1.8-7-5.5-7-10V6zM9.5 12l2 2 3.5-3.5',\n edit: 'M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4',\n refresh: 'M20 11a8 8 0 0 0-14.3-4.9L4 8M4 4v4h4M4 13a8 8 0 0 0 14.3 4.9L20 16M20 20v-4h-4',\n link: 'M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1',\n page: 'M6 3h8l4 4v14H6zM14 3v4h4M9 12h6M9 16h6'\n};\n\n/** Decorative icon. The surrounding control provides the accessible name. */\n@Component({\n selector: 'nh-assistant-icon',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (iconClass(); as iconClass) {\n <i [class]=\"iconClass\" aria-hidden=\"true\"></i>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" aria-hidden=\"true\" focusable=\"false\">\n <path [attr.d]=\"path()\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n `,\n styles: [`\n :host { display: inline-flex; align-items: center; justify-content: center; line-height: 1; font-size: 1.15em; }\n svg { display: block; }\n `]\n})\nexport class NhAssistantIconComponent {\n private readonly icons = inject(NH_ASSISTANT_ICONS, { optional: true });\n\n readonly name = input.required<NhAssistantIconName>();\n readonly iconClass = computed(() => this.icons?.[this.name()] ?? null);\n readonly path = computed(() => builtInPaths[this.name()]);\n}\n","import { ChangeDetectionStrategy, Component, afterNextRender, computed, effect, inject, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantPanelService } from '../../services/nh-assistant-panel.service';\nimport { NhAssistantStore } from '../../services/nh-assistant.store';\n\n/**\n * Header button that opens the assistant panel. It renders nothing while the assistant is\n * disabled on the server or the access policy denies the user. A badge marks a conversation\n * that waits for approval. Projected content replaces the default icon.\n */\n@Component({\n selector: 'nh-assistant-launcher',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (store.enabled()) {\n <button\n class=\"launcher\"\n type=\"button\"\n [class.open]=\"panel.isOpen()\"\n [attr.aria-expanded]=\"panel.isOpen()\"\n [attr.aria-label]=\"label() | translate\"\n [attr.title]=\"label() | translate\"\n (click)=\"panel.toggle()\">\n <ng-content><nh-assistant-icon name=\"assistant\" /></ng-content>\n @if (waitingForApproval()) {\n <span class=\"badge\" aria-hidden=\"true\"></span>\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.pending-approval' | translate }}</span>\n }\n </button>\n }\n `,\n styleUrl: './nh-assistant-launcher.component.scss'\n})\nexport class NhAssistantLauncherComponent {\n readonly store = inject(NhAssistantStore);\n readonly panel = inject(NhAssistantPanelService);\n\n readonly waitingForApproval = computed(() =>\n this.store.pendingApproval() !== null ||\n this.store.conversations().some(conversation => conversation.status === 'waiting-for-approval')\n );\n readonly label = computed(() => this.panel.isOpen() ? 'nh-assistant.launcher.close' : 'nh-assistant.launcher.open');\n\n constructor() {\n // Browser only: the status request and access policy need the signed-in user.\n afterNextRender(() => {\n void this.store.initialize();\n });\n\n effect(() => {\n if (this.store.enabled()) {\n untracked(() => void this.store.refreshConversations());\n }\n });\n }\n}\n","import { ChangeDetectorRef, DestroyRef, Pipe, PipeTransform, inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { merge } from 'rxjs';\n\n/**\n * Translates the first key that has a translation and otherwise returns the fallback text.\n * Used for server-provided keys (agent names, error message keys, result codes) that the\n * host may or may not translate.\n */\n@Pipe({ name: 'nhAssistantTranslate', standalone: true, pure: false })\nexport class NhAssistantTranslatePipe implements PipeTransform {\n private readonly translate = inject(TranslateService);\n private lastKeys = '';\n private lastParams = '';\n private lastValue = '';\n private dirty = true;\n\n constructor() {\n const changeDetector = inject(ChangeDetectorRef);\n const subscription = merge(this.translate.onTranslationChange, this.translate.onLangChange).subscribe(() => {\n this.dirty = true;\n changeDetector.markForCheck();\n });\n inject(DestroyRef).onDestroy(() => subscription.unsubscribe());\n }\n\n transform(keys: string | readonly (string | null | undefined)[], fallback = '', params?: Record<string, unknown>): string {\n const candidates = (Array.isArray(keys) ? keys : [keys]).filter((key): key is string => !!key);\n const keySignature = candidates.join('|');\n const paramSignature = params ? JSON.stringify(params) : '';\n if (!this.dirty && keySignature === this.lastKeys && paramSignature === this.lastParams) {\n return this.lastValue;\n }\n\n this.lastKeys = keySignature;\n this.lastParams = paramSignature;\n this.dirty = false;\n this.lastValue = this.resolve(candidates, fallback, params);\n return this.lastValue;\n }\n\n private resolve(candidates: string[], fallback: string, params?: Record<string, unknown>): string {\n for (const key of candidates) {\n const value = this.translate.instant(key, params);\n if (typeof value === 'string' && value.length > 0 && value !== key) {\n return value;\n }\n }\n\n return fallback;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { AgentSummary } from '../../models/assistant-api.models';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\n\nlet nextId = 0;\n\n/**\n * Chooses the agent for new conversations. Agent names come from the host's translation\n * keys; agents created by an administrator carry literal text, which is shown as is.\n */\n@Component({\n selector: 'nh-assistant-agent-picker',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label class=\"visually-hidden\" [for]=\"selectId\">{{ 'nh-assistant.agent-picker.label' | translate }}</label>\n <select\n [id]=\"selectId\"\n [disabled]=\"disabled() || agents().length < 2\"\n [attr.title]=\"selected() ? ([selected()!.descriptionKey] | nhAssistantTranslate: selected()!.descriptionKey) : null\"\n (change)=\"onChange($event)\">\n @for (agent of agents(); track agent.id) {\n <option [value]=\"agent.id\" [selected]=\"agent.id === selectedAgentId()\">\n {{ [agent.displayNameKey] | nhAssistantTranslate: agent.displayNameKey }}\n </option>\n }\n </select>\n @if (selected(); as agent) {\n <span class=\"capability\" [attr.data-can-mutate]=\"agent.canMutate\">\n {{ (agent.canMutate ? 'nh-assistant.agent-picker.can-mutate' : 'nh-assistant.agent-picker.read-only') | translate }}\n </span>\n }\n `,\n styleUrl: './nh-assistant-agent-picker.component.scss'\n})\nexport class NhAssistantAgentPickerComponent {\n readonly agents = input.required<readonly AgentSummary[]>();\n readonly selectedAgentId = input<string | null>(null);\n readonly disabled = input(false);\n readonly agentChange = output<string>();\n\n readonly selectId = `nh-assistant-agent-picker-${nextId++}`;\n readonly selected = computed(() => this.agents().find(agent => agent.id === this.selectedAgentId()) ?? null);\n\n onChange(event: Event): void {\n this.agentChange.emit((event.target as HTMLSelectElement).value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\n\nlet nextId = 0;\n\n/**\n * Message input. Enter sends when sending is available; Shift+Enter inserts a new line.\n * Drafting remains available while the assistant runs or waits for approval.\n */\n@Component({\n selector: 'nh-assistant-composer',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-composer.component.html',\n styleUrl: './nh-assistant-composer.component.scss'\n})\nexport class NhAssistantComposerComponent {\n /** Disables the editor only when the conversation itself cannot accept a draft. */\n readonly disabled = input(false);\n /** Blocks sending without disabling the editor or clearing its draft. */\n readonly sendDisabled = input(false);\n /** Shows the stop button instead of the send button. */\n readonly busy = input(false);\n /** Announces why sending is temporarily unavailable. */\n readonly status = input<'running' | 'waiting-for-approval' | null>(null);\n readonly maxLength = input<number | null>(null);\n /** Text to put back into the input, for example a message the server did not accept. */\n readonly restore = input<string | null>(null);\n\n readonly send = output<string>();\n readonly cancel = output<void>();\n readonly restored = output<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly textarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('textarea');\n private ownedFocus = false;\n private previousBusy = false;\n\n readonly inputId = `nh-assistant-composer-${nextId++}`;\n readonly hintId = `${this.inputId}-hint`;\n readonly text = signal('');\n readonly length = computed(() => this.text().trim().length);\n readonly tooLong = computed(() => {\n const max = this.maxLength();\n return max !== null && this.length() > max;\n });\n readonly showCounter = computed(() => {\n const max = this.maxLength();\n return max !== null && this.length() >= max * 0.8;\n });\n readonly canSend = computed(() =>\n !this.disabled() && !this.sendDisabled() && this.length() > 0 && !this.tooLong());\n\n constructor() {\n effect(() => {\n const draft = this.restore();\n if (draft !== null) {\n untracked(() => {\n this.text.set(draft);\n this.restored.emit();\n });\n }\n });\n\n effect(() => {\n const busy = this.busy();\n if (this.previousBusy && !busy) {\n queueMicrotask(() => this.restoreOwnedFocus());\n }\n this.previousBusy = busy;\n });\n }\n\n @HostListener('focusin')\n onFocusIn(): void {\n this.ownedFocus = true;\n }\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n if (next instanceof Node && !this.host.nativeElement.contains(next)) {\n this.ownedFocus = false;\n }\n }\n\n onInput(event: Event): void {\n this.text.set((event.target as HTMLTextAreaElement).value);\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.shiftKey || event.isComposing) {\n return;\n }\n\n event.preventDefault();\n this.submit();\n }\n\n onSubmit(event: SubmitEvent): void {\n event.preventDefault();\n this.submit();\n queueMicrotask(() => this.textarea().nativeElement.focus({ preventScroll: true }));\n }\n\n submit(): void {\n if (!this.canSend()) {\n return;\n }\n\n const text = this.text().trim();\n this.text.set('');\n this.send.emit(text);\n }\n\n private restoreOwnedFocus(): void {\n if (!this.ownedFocus || matchMedia('(pointer: coarse)').matches) {\n return;\n }\n\n const active = document.activeElement;\n if (active === document.body || active === null || !active.isConnected) {\n this.textarea().nativeElement.focus({ preventScroll: true });\n }\n }\n}\n","<form class=\"composer\" (submit)=\"onSubmit($event)\">\n <label class=\"visually-hidden\" [for]=\"inputId\">{{ 'nh-assistant.composer.label' | translate }}</label>\n <textarea\n #textarea\n data-nh-assistant-autofocus\n rows=\"2\"\n [id]=\"inputId\"\n [value]=\"text()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"'nh-assistant.composer.placeholder' | translate\"\n [attr.aria-describedby]=\"hintId\"\n [attr.aria-invalid]=\"tooLong() ? true : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n\n <div class=\"actions\">\n @if (busy()) {\n <button\n class=\"stop\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.composer.stop' | translate\"\n [attr.title]=\"'nh-assistant.composer.stop' | translate\"\n (click)=\"cancel.emit()\">\n <nh-assistant-icon name=\"stop\" />\n </button>\n } @else {\n <button\n class=\"send\"\n type=\"submit\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"'nh-assistant.composer.send' | translate\"\n [attr.title]=\"'nh-assistant.composer.send' | translate\">\n <nh-assistant-icon name=\"send\" />\n </button>\n }\n </div>\n</form>\n\n@if (status(); as status) {\n <p class=\"composer-status\" role=\"status\" aria-live=\"polite\">\n {{ 'nh-assistant.composer.status.' + status | translate }}\n </p>\n}\n\n<p class=\"hint\" [id]=\"hintId\">\n @if (tooLong()) {\n <span class=\"error\">{{ 'nh-assistant.composer.too-long' | translate }}</span>\n } @else {\n <span>{{ 'nh-assistant.composer.hint' | translate }}</span>\n }\n @if (showCounter()) {\n <span class=\"counter\" [class.error]=\"tooLong()\">\n {{ 'nh-assistant.composer.characters' | translate: { count: length(), max: maxLength() } }}\n </span>\n }\n</p>\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ConversationSummary } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\n\n/** The user's conversations with loading and empty states; selecting one opens it. */\n@Component({\n selector: 'nh-assistant-conversation-list',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-conversation-list.component.html',\n styleUrl: './nh-assistant-conversation-list.component.scss'\n})\nexport class NhAssistantConversationListComponent {\n readonly conversations = input.required<readonly ConversationSummary[]>();\n readonly total = input(0);\n readonly activeConversationId = input<string | null>(null);\n readonly loading = input(false);\n readonly disabled = input(false);\n\n readonly conversationSelect = output<string>();\n readonly conversationDelete = output<string>();\n readonly conversationCreate = output<void>();\n}\n","<nav class=\"list\" [attr.aria-label]=\"'nh-assistant.conversation-list.title' | translate\" [attr.aria-busy]=\"loading()\">\n <header class=\"header\">\n <h3>{{ 'nh-assistant.conversation-list.title' | translate }}</h3>\n @if (conversations().length > 0 && total() > conversations().length) {\n <span class=\"count\">{{ 'nh-assistant.conversation-list.count' | translate: { count: conversations().length, total: total() } }}</span>\n }\n <button\n class=\"icon-button\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.panel.new-conversation' | translate\"\n [attr.title]=\"'nh-assistant.panel.new-conversation' | translate\"\n (click)=\"conversationCreate.emit()\">\n <nh-assistant-icon name=\"plus\" />\n </button>\n </header>\n\n @if (loading() && conversations().length === 0) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.conversation-list.loading' | translate }}</p>\n } @else if (conversations().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.conversation-list.empty' | translate }}</p>\n } @else {\n <ul>\n @for (conversation of conversations(); track conversation.id) {\n <li [class.active]=\"conversation.id === activeConversationId()\">\n <button\n class=\"item\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-current]=\"conversation.id === activeConversationId() ? 'true' : null\"\n (click)=\"conversationSelect.emit(conversation.id)\">\n <span class=\"title\">{{ conversation.title || ('nh-assistant.conversation-list.untitled' | translate) }}</span>\n <span class=\"meta\">\n <span class=\"status\" [attr.data-status]=\"conversation.status\">{{ 'nh-assistant.conversation-list.status.' + conversation.status | translate }}</span>\n <time [attr.datetime]=\"conversation.updatedAt\">{{ conversation.updatedAt | date: 'short' }}</time>\n </span>\n </button>\n <button\n class=\"icon-button delete\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"('nh-assistant.conversation-list.delete' | translate) + ': ' + (conversation.title || ('nh-assistant.conversation-list.untitled' | translate))\"\n [attr.title]=\"'nh-assistant.conversation-list.delete' | translate\"\n (click)=\"conversationDelete.emit(conversation.id)\">\n <nh-assistant-icon name=\"trash\" />\n </button>\n </li>\n }\n </ul>\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, output, signal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AssistantAddressForm,\n AssistantPreferences,\n AssistantResponseLength,\n AssistantStyle\n} from '../../models/assistant-admin.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NhAssistantApiService } from '../../services/nh-assistant-api.service';\nimport { NhAssistantError } from '../../services/nh-assistant.store';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../../services/nh-assistant-transport';\n\n/** Maximum length of the user's own instructions. */\nexport const NH_ASSISTANT_MAX_CUSTOM_INSTRUCTIONS = 1_000;\n\nlet nextId = 0;\n\n/**\n * The user's own assistant preferences: style, form of address, answer length and\n * optional instructions. Preferences steer style only; the server keeps them below the\n * application context and agent instructions.\n */\n@Component({\n selector: 'nh-assistant-preferences',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-preferences.component.html',\n styleUrl: './nh-assistant-preferences.component.scss'\n})\nexport class NhAssistantPreferencesComponent {\n private readonly api = inject(NhAssistantApiService);\n private subscription?: Subscription;\n\n /** Emitted when the user leaves the preferences. */\n readonly closed = output<void>();\n /** Emitted with the stored preferences after a successful save. */\n readonly saved = output<AssistantPreferences>();\n\n readonly id = `nh-assistant-preferences-${nextId++}`;\n readonly styles: readonly AssistantStyle[] = ['default', 'direct', 'personal', 'detailed'];\n readonly addressForms: readonly AssistantAddressForm[] = ['informal', 'formal'];\n readonly responseLengths: readonly AssistantResponseLength[] = ['short', 'normal', 'long'];\n readonly maxInstructions = NH_ASSISTANT_MAX_CUSTOM_INSTRUCTIONS;\n\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly saving = signal(false);\n readonly savedMessage = signal(false);\n readonly error = signal<NhAssistantError | null>(null);\n\n readonly style = signal<AssistantStyle>('default');\n readonly addressForm = signal<AssistantAddressForm>('informal');\n readonly responseLength = signal<AssistantResponseLength>('normal');\n readonly customInstructions = signal('');\n private readonly stored = signal<AssistantPreferences | null>(null);\n\n readonly instructionsLength = computed(() => this.customInstructions().length);\n readonly tooLong = computed(() => this.instructionsLength() > this.maxInstructions);\n readonly dirty = computed(() => {\n const stored = this.stored();\n return !stored || stored.style !== this.style() || stored.addressForm !== this.addressForm() ||\n stored.responseLength !== this.responseLength() || (stored.customInstructions ?? '') !== this.customInstructions();\n });\n readonly canSave = computed(() => !this.loading() && !this.saving() && !this.tooLong() && this.dirty());\n readonly errorKeys = computed(() => {\n const error = this.error();\n return error ? [error.messageKey, nhAssistantErrorMessageKey(error.code), 'nh-assistant.errors.generic'] : [];\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n this.load();\n }\n\n load(): void {\n this.loading.set(true);\n this.loadFailed.set(false);\n this.subscription?.unsubscribe();\n this.subscription = this.api.getPreferences().subscribe({\n next: preferences => {\n this.apply(preferences);\n this.loading.set(false);\n },\n error: () => {\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n\n onInstructionsInput(event: Event): void {\n this.customInstructions.set((event.target as HTMLTextAreaElement).value);\n this.savedMessage.set(false);\n }\n\n choose<T>(target: { set(value: T): void }, value: T): void {\n target.set(value);\n this.savedMessage.set(false);\n }\n\n save(): void {\n if (!this.canSave()) {\n return;\n }\n\n const instructions = this.customInstructions().trim();\n const preferences: AssistantPreferences = {\n style: this.style(),\n addressForm: this.addressForm(),\n responseLength: this.responseLength(),\n customInstructions: instructions.length > 0 ? instructions : null\n };\n\n this.saving.set(true);\n this.error.set(null);\n this.savedMessage.set(false);\n this.subscription?.unsubscribe();\n this.subscription = this.api.updatePreferences(preferences).subscribe({\n next: stored => {\n this.apply(stored);\n this.saving.set(false);\n this.savedMessage.set(true);\n this.saved.emit(stored);\n },\n error: (error: unknown) => {\n this.saving.set(false);\n this.error.set(error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : { code: 'assistant-server', messageKey: nhAssistantErrorMessageKey('assistant-server') });\n }\n });\n }\n\n private apply(preferences: AssistantPreferences): void {\n this.stored.set(preferences);\n this.style.set(preferences.style);\n this.addressForm.set(preferences.addressForm);\n this.responseLength.set(preferences.responseLength);\n this.customInstructions.set(preferences.customInstructions ?? '');\n }\n}\n","<section class=\"preferences\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"loading() || saving()\">\n <header class=\"header\">\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.preferences.title' | translate }}</h3>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.preferences.back' | translate\"\n [attr.title]=\"'nh-assistant.preferences.back' | translate\"\n (click)=\"closed.emit()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </header>\n\n @if (loading()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.preferences.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.preferences.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.preferences.retry' | translate }}</button>\n </div>\n } @else {\n <form class=\"form\" (submit)=\"$event.preventDefault(); save()\">\n <p class=\"description\">{{ 'nh-assistant.preferences.description' | translate }}</p>\n\n <fieldset>\n <legend>{{ 'nh-assistant.preferences.style-label' | translate }}</legend>\n <div class=\"options styles\">\n @for (option of styles; track option) {\n <label class=\"option\" [class.selected]=\"style() === option\">\n <input type=\"radio\" [name]=\"id + '-style'\" [value]=\"option\" [checked]=\"style() === option\" (change)=\"choose(style, option)\" />\n <span>\n <strong>{{ 'nh-assistant.preferences.style.' + option | translate }}</strong>\n <small>{{ 'nh-assistant.preferences.style.' + option + '-description' | translate }}</small>\n </span>\n </label>\n }\n </div>\n </fieldset>\n\n <fieldset>\n <legend>{{ 'nh-assistant.preferences.address-form-label' | translate }}</legend>\n <div class=\"options segmented\">\n @for (option of addressForms; track option) {\n <label class=\"option\" [class.selected]=\"addressForm() === option\">\n <input type=\"radio\" [name]=\"id + '-address'\" [value]=\"option\" [checked]=\"addressForm() === option\" (change)=\"choose(addressForm, option)\" />\n <span><strong>{{ 'nh-assistant.preferences.address-form.' + option | translate }}</strong></span>\n </label>\n }\n </div>\n </fieldset>\n\n <fieldset>\n <legend>{{ 'nh-assistant.preferences.response-length-label' | translate }}</legend>\n <div class=\"options segmented\">\n @for (option of responseLengths; track option) {\n <label class=\"option\" [class.selected]=\"responseLength() === option\">\n <input type=\"radio\" [name]=\"id + '-length'\" [value]=\"option\" [checked]=\"responseLength() === option\" (change)=\"choose(responseLength, option)\" />\n <span><strong>{{ 'nh-assistant.preferences.response-length.' + option | translate }}</strong></span>\n </label>\n }\n </div>\n </fieldset>\n\n <div class=\"field\">\n <label [for]=\"id + '-instructions'\">{{ 'nh-assistant.preferences.custom-instructions-label' | translate }}</label>\n <textarea\n rows=\"4\"\n [id]=\"id + '-instructions'\"\n [value]=\"customInstructions()\"\n [attr.aria-describedby]=\"id + '-instructions-hint'\"\n [attr.aria-invalid]=\"tooLong() ? true : null\"\n (input)=\"onInstructionsInput($event)\"></textarea>\n <p class=\"hint\" [id]=\"id + '-instructions-hint'\">\n @if (tooLong()) {\n <span class=\"error-text\">{{ 'nh-assistant.preferences.too-long' | translate }}</span>\n } @else {\n <span>{{ 'nh-assistant.preferences.custom-instructions-hint' | translate }}</span>\n }\n <span class=\"counter\" [class.error-text]=\"tooLong()\">\n {{ 'nh-assistant.preferences.characters' | translate: { count: instructionsLength(), max: maxInstructions } }}\n </span>\n </p>\n </div>\n\n @if (error(); as error) {\n <p class=\"message error\" role=\"alert\">\n <nh-assistant-icon name=\"warning\" />\n {{ errorKeys() | nhAssistantTranslate: error.code }}\n </p>\n }\n @if (savedMessage()) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />\n {{ 'nh-assistant.preferences.saved' | translate }}\n </p>\n }\n\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" (click)=\"closed.emit()\">{{ 'nh-assistant.preferences.back' | translate }}</button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"!canSave()\">\n {{ (saving() ? 'nh-assistant.preferences.saving' : 'nh-assistant.preferences.save') | translate }}\n </button>\n </div>\n </form>\n }\n</section>\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\nimport createDOMPurify, { DOMPurify } from 'dompurify';\nimport { Marked, Tokens } from 'marked';\n\nconst allowedTags = [\n 'p', 'br', 'strong', 'em', 'del', 'code', 'pre', 'blockquote', 'ul', 'ol', 'li', 'a',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'table', 'thead', 'tbody', 'tr', 'th', 'td'\n];\nconst allowedAttributes = ['href', 'title', 'start', 'align'];\nconst allowedUris = /^(?:https?:|mailto:|\\/(?!\\/)|#)/i;\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Renders model text as Markdown into a strict HTML subset. Inline HTML in the model text\n * is shown as literal text, images render as their alt text, and the result is sanitized\n * with DOMPurify. Links open in a new tab with `rel=\"noopener noreferrer\"`.\n */\n@Injectable({ providedIn: 'root' })\nexport class NhAssistantMarkdownRenderer {\n private readonly document = inject(DOCUMENT);\n private readonly marked = new Marked({\n gfm: true,\n breaks: true,\n async: false,\n renderer: {\n html(token: Tokens.HTML | Tokens.Tag): string {\n return escapeHtml(token.text);\n },\n image(token: Tokens.Image): string {\n return escapeHtml(token.text);\n }\n }\n });\n private purifier: DOMPurify | null = null;\n\n render(text: string): string {\n const purifier = this.getPurifier();\n if (!purifier) {\n return `<p>${escapeHtml(text)}</p>`;\n }\n\n const html = this.marked.parse(text, { async: false });\n return purifier.sanitize(html, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttributes,\n ALLOWED_URI_REGEXP: allowedUris,\n ALLOW_DATA_ATTR: false,\n ALLOW_ARIA_ATTR: false\n });\n }\n\n private getPurifier(): DOMPurify | null {\n if (this.purifier) {\n return this.purifier;\n }\n\n const view = this.document.defaultView;\n if (!view) {\n return null;\n }\n\n const purifier = createDOMPurify(view);\n if (!purifier.isSupported) {\n return null;\n }\n\n purifier.addHook('afterSanitizeAttributes', node => {\n if (node.tagName === 'A') {\n node.setAttribute('target', '_blank');\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n\n this.purifier = purifier;\n return purifier;\n }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { NhAssistantMarkdownRenderer } from './nh-assistant-markdown';\n\n/** Renders model text into sanitized HTML. Pure, so unchanged text is not rendered again. */\n@Pipe({ name: 'nhAssistantMarkdown', standalone: true })\nexport class NhAssistantMarkdownPipe implements PipeTransform {\n private readonly renderer = inject(NhAssistantMarkdownRenderer);\n\n transform(text: string): string {\n return this.renderer.render(text);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, ApprovalPart } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\n\n/** Formats remaining milliseconds as `m:ss`, or `h:mm:ss` above one hour. */\nexport function formatNhAssistantCountdown(milliseconds: number): string {\n const totalSeconds = Math.max(0, Math.ceil(milliseconds / 1000));\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const paddedSeconds = seconds.toString().padStart(2, '0');\n\n return hours > 0\n ? `${hours}:${minutes.toString().padStart(2, '0')}:${paddedSeconds}`\n : `${minutes}:${paddedSeconds}`;\n}\n\n/**\n * Asks the user to approve or reject a proposed mutation. Shows the summary, targets,\n * proposed arguments and a countdown to expiry. A decision is emitted at most once until\n * the host reports that it is no longer deciding.\n */\n@Component({\n selector: 'nh-assistant-approval-card',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-approval-card.component.html',\n styleUrl: './nh-assistant-approval-card.component.scss',\n host: {\n '[attr.data-status]': 'effectiveStatus()'\n }\n})\nexport class NhAssistantApprovalCardComponent {\n readonly approval = input.required<ApprovalPart>();\n /** True while the host submits a decision; disables both buttons. */\n readonly deciding = input(false);\n readonly decide = output<ApprovalDecision>();\n\n private readonly now = signal(Date.now());\n private readonly submitted = signal(false);\n\n readonly remainingMs = computed(() => Date.parse(this.approval().expiresAt) - this.now());\n readonly expired = computed(() => this.approval().status === 'expired' ||\n (this.approval().status === 'pending' && this.remainingMs() <= 0));\n readonly effectiveStatus = computed(() => this.expired() ? 'expired' : this.approval().status);\n readonly actionable = computed(() => this.effectiveStatus() === 'pending');\n readonly disabled = computed(() => !this.actionable() || this.deciding() || this.submitted());\n readonly countdown = computed(() => formatNhAssistantCountdown(this.remainingMs()));\n readonly presentedSummary = computed(() => this.approval().presentation?.summary ?? null);\n\n constructor() {\n // Tick only while the approval is pending and not yet expired.\n effect(onCleanup => {\n if (this.approval().status !== 'pending') {\n return;\n }\n\n const expiresAt = Date.parse(this.approval().expiresAt);\n const timer = setInterval(() => {\n this.now.set(Date.now());\n if (Date.now() >= expiresAt) {\n clearInterval(timer);\n }\n }, 1000);\n onCleanup(() => clearInterval(timer));\n });\n\n // Allow a new attempt once the host finished deciding and the approval is still pending.\n effect(() => {\n if (!this.deciding() && this.approval().status === 'pending') {\n this.submitted.set(false);\n }\n });\n }\n\n choose(decision: ApprovalDecision): void {\n if (this.disabled()) {\n return;\n }\n\n this.submitted.set(true);\n this.decide.emit(decision);\n }\n}\n","<section class=\"card\" [attr.aria-label]=\"'nh-assistant.approval.title' | translate\">\n <header class=\"header\">\n <nh-assistant-icon [name]=\"actionable() ? 'warning' : effectiveStatus() === 'approved' ? 'check' : 'x'\" />\n <h3>{{ 'nh-assistant.approval.title' | translate }}</h3>\n <span class=\"status\">{{ 'nh-assistant.approval.status.' + effectiveStatus() | translate }}</span>\n </header>\n\n @if (approval().presentation; as presentation) {\n <p class=\"tool-name\">{{ presentation.toolDisplayName }}</p>\n <p class=\"summary\">{{ presentation.summary }}</p>\n @if (presentation.fields.length > 0) {\n <dl class=\"presentation-fields\">\n @for (field of presentation.fields; track $index) {\n <div>\n <dt>{{ field.label }}</dt>\n <dd>{{ field.value }}</dd>\n </div>\n }\n </dl>\n }\n @if (presentation.notice) {\n <p class=\"notice\">{{ presentation.notice }}</p>\n }\n } @else {\n <p class=\"summary\">{{ 'nh-assistant.approval.fallback-summary' | translate }}</p>\n }\n\n <details class=\"technical-details\">\n <summary>{{ 'nh-assistant.approval.technical-details' | translate }}</summary>\n <p class=\"label\">{{ 'nh-assistant.approval.tool-id' | translate }}</p>\n <code>{{ approval().toolId }}</code>\n @if (approval().targets.length > 0) {\n <p class=\"label\">{{ 'nh-assistant.approval.targets' | translate }}</p>\n <ul class=\"targets\">\n @for (target of approval().targets; track $index) {\n <li>{{ target }}</li>\n }\n </ul>\n }\n @if (approval().argumentsPreview) {\n <p class=\"label\">{{ 'nh-assistant.approval.arguments' | translate }}</p>\n <pre>{{ approval().argumentsPreview }}</pre>\n }\n </details>\n\n @if (actionable()) {\n <p class=\"expiry\" aria-live=\"off\">\n <nh-assistant-icon name=\"clock\" />\n {{ 'nh-assistant.approval.expires-in' | translate: { time: countdown() } }}\n </p>\n <div class=\"actions\">\n <button\n class=\"reject\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.approval.reject-label' | translate: { summary: presentedSummary() ?? ('nh-assistant.approval.fallback-summary' | translate) }\"\n (click)=\"choose('reject')\">\n {{ 'nh-assistant.approval.reject' | translate }}\n </button>\n <button\n class=\"approve\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.approval.approve-label' | translate: { summary: presentedSummary() ?? ('nh-assistant.approval.fallback-summary' | translate) }\"\n (click)=\"choose('approve')\">\n {{ 'nh-assistant.approval.approve' | translate }}\n </button>\n </div>\n @if (deciding()) {\n <p class=\"deciding\" role=\"status\">{{ 'nh-assistant.approval.deciding' | translate }}</p>\n }\n } @else if (expired()) {\n <p class=\"expiry\">{{ 'nh-assistant.approval.expired' | translate }}</p>\n }\n</section>\n","import { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ToolCallPart } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent, NhAssistantIconName } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\n\nlet nextId = 0;\n\nconst statusIcons: Record<ToolCallPart['status'], NhAssistantIconName> = {\n running: 'tool',\n succeeded: 'check',\n failed: 'warning',\n 'awaiting-approval': 'clock',\n rejected: 'x'\n};\n\n/** Shows one tool invocation with its status and expandable input and result previews. */\n@Component({\n selector: 'nh-assistant-tool-call-card',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-tool-call-card.component.html',\n styleUrl: './nh-assistant-tool-call-card.component.scss',\n host: {\n '[attr.data-status]': 'part().status'\n }\n})\nexport class NhAssistantToolCallCardComponent {\n readonly part = input.required<ToolCallPart>();\n\n readonly detailsId = `nh-assistant-tool-call-${nextId++}`;\n readonly expanded = signal(false);\n readonly statusIcon = computed(() => statusIcons[this.part().status]);\n readonly hasDetails = computed(() => !!this.part().toolId);\n\n toggle(): void {\n this.expanded.update(expanded => !expanded);\n }\n}\n","<article class=\"card\" [attr.aria-label]=\"'nh-assistant.tool-call.label' | translate: { name: part().displayName }\">\n <header class=\"header\">\n <span class=\"status-icon\" [class.spinning]=\"part().status === 'running'\">\n <nh-assistant-icon [name]=\"statusIcon()\" />\n </span>\n <span class=\"title\">{{ part().displayName }}</span>\n <span class=\"status\">{{ 'nh-assistant.tool-call.status.' + part().status | translate }}</span>\n @if (hasDetails()) {\n <button\n class=\"toggle\"\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"detailsId\"\n [attr.aria-label]=\"(expanded() ? 'nh-assistant.tool-call.hide-details' : 'nh-assistant.tool-call.show-details') | translate\"\n [attr.title]=\"(expanded() ? 'nh-assistant.tool-call.hide-details' : 'nh-assistant.tool-call.show-details') | translate\"\n (click)=\"toggle()\">\n <nh-assistant-icon name=\"chevron-down\" [class.rotated]=\"expanded()\" />\n </button>\n }\n </header>\n\n @if (part().resultCode; as resultCode) {\n <p class=\"result-code\">\n {{ ['nh-assistant.result-codes.' + resultCode, 'nh-assistant.errors.' + resultCode] | nhAssistantTranslate: resultCode }}\n </p>\n }\n\n @if (hasDetails()) {\n <div class=\"details\" [id]=\"detailsId\" [hidden]=\"!expanded()\">\n <p class=\"label\">{{ 'nh-assistant.tool-call.tool-id' | translate }}</p>\n <code>{{ part().toolId }}</code>\n @if (part().argumentsPreview; as argumentsPreview) {\n <p class=\"label\">{{ 'nh-assistant.tool-call.arguments' | translate }}</p>\n <pre>{{ argumentsPreview }}</pre>\n }\n @if (part().resultPreview; as resultPreview) {\n <p class=\"label\">{{ 'nh-assistant.tool-call.result' | translate }}</p>\n <pre>{{ resultPreview }}</pre>\n }\n </div>\n }\n</article>\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, Message } from '../../models/assistant-api.models';\nimport { NhAssistantMarkdownPipe } from '../../internal/nh-assistant-markdown.pipe';\nimport { NhAssistantApprovalCardComponent } from '../approval-card/nh-assistant-approval-card.component';\nimport { NhAssistantToolCallCardComponent } from '../tool-call-card/nh-assistant-tool-call-card.component';\n\n/** Above this number of messages the thread renders through CDK virtual scrolling. */\nexport const NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD = 200;\n\n/** Distance from the bottom, in pixels, within which new content keeps the thread pinned to the end. */\nconst stickToBottomDistance = 120;\n\n/**\n * The messages of a conversation as a live log. Assistant text renders as sanitized\n * Markdown, tool calls and approvals as cards. The thread follows new content while the\n * user is at the bottom.\n */\n@Component({\n selector: 'nh-assistant-thread',\n standalone: true,\n imports: [\n NgTemplateOutlet,\n ScrollingModule,\n TranslatePipe,\n NhAssistantMarkdownPipe,\n NhAssistantToolCallCardComponent,\n NhAssistantApprovalCardComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-thread.component.html',\n styleUrl: './nh-assistant-thread.component.scss'\n})\nexport class NhAssistantThreadComponent {\n private readonly injector = inject(Injector);\n\n readonly messages = input.required<readonly Message[]>();\n readonly streaming = input(false);\n readonly deciding = input(false);\n readonly markdown = input(true);\n readonly approvalDecision = output<ApprovalDecision>();\n\n readonly virtualThreshold = NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD;\n readonly virtual = computed(() => this.messages().length > NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD);\n readonly working = computed(() => {\n if (!this.streaming()) {\n return false;\n }\n\n const last = this.messages()[this.messages().length - 1];\n return !last || last.role === 'user' || last.parts.length === 0;\n });\n\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n private readonly viewport = viewChild(CdkVirtualScrollViewport);\n\n constructor() {\n effect(() => {\n this.messages();\n this.working();\n const element = this.scrollElement();\n const pinned = !element || element.scrollHeight - element.scrollTop - element.clientHeight <= stickToBottomDistance;\n if (pinned) {\n afterNextRender(() => this.scrollToEnd(), { injector: this.injector });\n }\n });\n }\n\n trackMessage(_index: number, message: Message): string {\n return message.id;\n }\n\n private scrollElement(): HTMLElement | null {\n return this.viewport()?.elementRef.nativeElement ?? this.scroller()?.nativeElement ?? null;\n }\n\n private scrollToEnd(): void {\n const viewport = this.viewport();\n if (viewport) {\n viewport.scrollToIndex(this.messages().length - 1);\n viewport.scrollTo({ bottom: 0 });\n return;\n }\n\n const element = this.scroller()?.nativeElement;\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n }\n}\n","<div class=\"log\" role=\"log\" aria-live=\"polite\" [attr.aria-label]=\"'nh-assistant.thread.label' | translate\" [attr.aria-busy]=\"streaming()\">\n @if (virtual()) {\n <cdk-virtual-scroll-viewport class=\"scroller\" itemSize=\"120\" minBufferPx=\"1200\" maxBufferPx=\"2400\">\n <div class=\"row\" *cdkVirtualFor=\"let message of messages(); trackBy: trackMessage\">\n <ng-container [ngTemplateOutlet]=\"messageTemplate\" [ngTemplateOutletContext]=\"{ $implicit: message }\" />\n </div>\n @if (working()) {\n <ng-container [ngTemplateOutlet]=\"workingTemplate\" />\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n <div class=\"scroller\" #scroller tabindex=\"0\">\n @for (message of messages(); track message.id) {\n <div class=\"row\">\n <ng-container [ngTemplateOutlet]=\"messageTemplate\" [ngTemplateOutletContext]=\"{ $implicit: message }\" />\n </div>\n }\n @if (working()) {\n <ng-container [ngTemplateOutlet]=\"workingTemplate\" />\n }\n </div>\n }\n</div>\n\n<ng-template #messageTemplate let-message>\n <article class=\"message\" [attr.data-role]=\"message.role\">\n <p class=\"author\">{{ 'nh-assistant.thread.' + (message.role === 'user' ? 'you' : message.role) | translate }}</p>\n @for (part of message.parts; track $index) {\n @switch (part.type) {\n @case ('text') {\n @if (message.role === 'assistant' && markdown()) {\n <div class=\"bubble markdown\" [innerHTML]=\"part.text | nhAssistantMarkdown\"></div>\n } @else {\n <div class=\"bubble plain\">{{ part.text }}</div>\n }\n }\n @case ('tool-call') {\n <nh-assistant-tool-call-card class=\"part\" [part]=\"part\" />\n }\n @case ('approval') {\n <nh-assistant-approval-card class=\"part\" [approval]=\"part\" [deciding]=\"deciding()\" (decide)=\"approvalDecision.emit($event)\" />\n }\n }\n }\n </article>\n</ng-template>\n\n<ng-template #workingTemplate>\n <p class=\"working\" role=\"status\">\n <span class=\"dots\" aria-hidden=\"true\"><span></span><span></span><span></span></span>\n {{ 'nh-assistant.thread.working' | translate }}\n </p>\n</ng-template>\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { NavigationEnd, Router, RouterLink } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, ClientContext } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NH_ASSISTANT_CONFIG } from '../../nh-assistant.config';\nimport { NhAssistantPanelService } from '../../services/nh-assistant-panel.service';\nimport { NhAssistantStore } from '../../services/nh-assistant.store';\nimport { describeNhAssistantClientContext } from '../../services/nh-assistant-page-context';\nimport { NhAssistantAgentPickerComponent } from '../agent-picker/nh-assistant-agent-picker.component';\nimport { NhAssistantComposerComponent } from '../composer/nh-assistant-composer.component';\nimport { NhAssistantConversationListComponent } from '../conversation-list/nh-assistant-conversation-list.component';\nimport { NhAssistantPreferencesComponent } from '../preferences/nh-assistant-preferences.component';\nimport { NhAssistantThreadComponent } from '../thread/nh-assistant-thread.component';\n\nlet nextId = 0;\n\n/**\n * The assistant drawer. Place it once in the application layout; it renders nothing in\n * place and appears as an overlay when `NhAssistantPanelService.open()` is called.\n */\n@Component({\n selector: 'nh-assistant-panel',\n standalone: true,\n imports: [\n RouterLink,\n TranslatePipe,\n NhAssistantTranslatePipe,\n NhAssistantIconComponent,\n NhAssistantAgentPickerComponent,\n NhAssistantComposerComponent,\n NhAssistantConversationListComponent,\n NhAssistantPreferencesComponent,\n NhAssistantThreadComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-panel.component.html',\n styleUrl: './nh-assistant-panel.component.scss'\n})\nexport class NhAssistantPanelComponent implements AfterViewInit, OnDestroy {\n readonly store = inject(NhAssistantStore);\n readonly panel = inject(NhAssistantPanelService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly router = inject(Router, { optional: true });\n private readonly drawer = viewChild.required<TemplateRef<unknown>>('drawer');\n private portal?: TemplatePortal;\n\n readonly titleId = `nh-assistant-panel-title-${nextId++}`;\n readonly markdown = this.config.markdown?.enabled ?? true;\n readonly showConversations = signal(false);\n readonly showPreferences = signal(false);\n readonly adminRoute = this.config.adminRoute ?? null;\n readonly conversation = this.store.activeConversation;\n private readonly conversationId = computed(() => this.conversation()?.id ?? null);\n readonly messages = computed(() => this.conversation()?.messages ?? []);\n readonly closed = computed(() => {\n const status = this.conversation()?.status;\n return status === 'failed' || status === 'archived';\n });\n readonly busy = computed(() => this.store.streaming() || this.conversation()?.status === 'running');\n readonly composerDisabled = computed(() => !this.store.canSend());\n readonly composerStatus = computed<'running' | 'waiting-for-approval' | null>(() => {\n if (this.store.streaming() || this.conversation()?.status === 'running') {\n return 'running';\n }\n return this.conversation()?.status === 'waiting-for-approval' ? 'waiting-for-approval' : null;\n });\n readonly errorKeys = computed(() => {\n const error = this.store.error();\n return error ? [error.messageKey, `nh-assistant.errors.${error.code}`, 'nh-assistant.errors.generic'] : [];\n });\n\n constructor() {\n // Opening, creating or leaving a conversation returns from the list to the thread.\n effect(() => {\n if (this.conversationId() !== undefined) {\n untracked(() => {\n this.showConversations.set(false);\n this.showPreferences.set(false);\n });\n }\n });\n\n effect(() => {\n if (this.panel.isOpen()) {\n untracked(() => {\n void this.store.initialize().then(() => this.store.refreshConversations());\n this.refreshPageContext();\n });\n }\n });\n\n // The drawer stays open while the user navigates; keep the page-context chip current.\n const navigation = this.router?.events.subscribe(event => {\n if (event instanceof NavigationEnd && this.panel.isOpen()) {\n this.refreshPageContext();\n }\n });\n inject(DestroyRef).onDestroy(() => navigation?.unsubscribe());\n }\n\n ngAfterViewInit(): void {\n this.portal = new TemplatePortal(this.drawer(), this.viewContainerRef);\n this.panel.registerPanel(this.portal);\n }\n\n ngOnDestroy(): void {\n if (this.portal) {\n this.panel.unregisterPanel(this.portal);\n }\n }\n\n refreshPageContext(): void {\n void this.store.refreshPageContext();\n }\n\n describeContext(context: ClientContext): string {\n return describeNhAssistantClientContext(context);\n }\n\n toggleConversations(): void {\n this.showPreferences.set(false);\n this.showConversations.update(show => !show);\n }\n\n togglePreferences(): void {\n this.showConversations.set(false);\n this.showPreferences.update(show => !show);\n }\n\n newConversation(): void {\n this.store.startNewConversation();\n this.showConversations.set(false);\n }\n\n openConversation(conversationId: string): void {\n void this.store.openConversation(conversationId);\n this.showConversations.set(false);\n }\n\n deleteConversation(conversationId: string): void {\n void this.store.deleteConversation(conversationId);\n }\n\n send(text: string): void {\n this.showConversations.set(false);\n this.showPreferences.set(false);\n void this.store.send(text);\n }\n\n decide(decision: ApprovalDecision): void {\n this.store.decide(decision);\n }\n\n cancel(): void {\n void this.store.cancel();\n }\n}\n","<ng-template #drawer>\n <section class=\"drawer\" role=\"dialog\" aria-modal=\"false\" [attr.aria-labelledby]=\"titleId\">\n <header class=\"header\">\n <div class=\"heading\">\n <h2 [id]=\"titleId\">{{ 'nh-assistant.panel.title' | translate }}</h2>\n @if (store.enabled()) {\n <nh-assistant-agent-picker\n [agents]=\"store.agents()\"\n [selectedAgentId]=\"store.selectedAgentId()\"\n [disabled]=\"store.streaming()\"\n (agentChange)=\"store.selectAgent($event)\" />\n }\n </div>\n <div class=\"header-actions\">\n @if (store.enabled()) {\n <button\n class=\"icon-button\"\n type=\"button\"\n [class.active]=\"showConversations()\"\n [attr.aria-expanded]=\"showConversations()\"\n [attr.aria-label]=\"(showConversations() ? 'nh-assistant.panel.hide-conversations' : 'nh-assistant.panel.show-conversations') | translate\"\n [attr.title]=\"(showConversations() ? 'nh-assistant.panel.hide-conversations' : 'nh-assistant.panel.show-conversations') | translate\"\n (click)=\"toggleConversations()\">\n <nh-assistant-icon name=\"list\" />\n </button>\n <button\n class=\"icon-button\"\n type=\"button\"\n [class.active]=\"showPreferences()\"\n [attr.aria-expanded]=\"showPreferences()\"\n [attr.aria-label]=\"'nh-assistant.panel.open-preferences' | translate\"\n [attr.title]=\"'nh-assistant.panel.open-preferences' | translate\"\n (click)=\"togglePreferences()\">\n <nh-assistant-icon name=\"settings\" />\n </button>\n @if (adminRoute && store.canAdminister()) {\n <a\n class=\"icon-button\"\n [routerLink]=\"adminRoute\"\n [attr.aria-label]=\"'nh-assistant.panel.open-admin' | translate\"\n [attr.title]=\"'nh-assistant.panel.open-admin' | translate\"\n (click)=\"panel.close()\">\n <nh-assistant-icon name=\"admin\" />\n </a>\n }\n <button\n class=\"icon-button\"\n type=\"button\"\n [disabled]=\"store.streaming()\"\n [attr.aria-label]=\"'nh-assistant.panel.new-conversation' | translate\"\n [attr.title]=\"'nh-assistant.panel.new-conversation' | translate\"\n (click)=\"newConversation()\">\n <nh-assistant-icon name=\"plus\" />\n </button>\n }\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.panel.close' | translate\"\n [attr.title]=\"'nh-assistant.panel.close' | translate\"\n (click)=\"panel.close()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </div>\n </header>\n\n <div class=\"body\">\n @if (store.statusLoading() && !store.enabled()) {\n <div class=\"state\" role=\"status\">\n <p class=\"state-title\">{{ 'nh-assistant.panel.loading' | translate }}</p>\n </div>\n } @else if (!store.enabled()) {\n <div class=\"state\">\n <nh-assistant-icon class=\"state-icon\" name=\"warning\" />\n <p class=\"state-title\">{{ 'nh-assistant.panel.unavailable-title' | translate }}</p>\n <p>{{ 'nh-assistant.panel.unavailable-description' | translate }}</p>\n </div>\n } @else {\n @if (showPreferences()) {\n <nh-assistant-preferences class=\"overlay-view\" (closed)=\"showPreferences.set(false)\" />\n }\n\n @if (showConversations()) {\n <nh-assistant-conversation-list\n class=\"overlay-view\"\n [conversations]=\"store.conversations()\"\n [total]=\"store.conversationsTotal()\"\n [activeConversationId]=\"conversation()?.id ?? null\"\n [loading]=\"store.conversationsLoading()\"\n [disabled]=\"store.streaming()\"\n (conversationSelect)=\"openConversation($event)\"\n (conversationDelete)=\"deleteConversation($event)\"\n (conversationCreate)=\"newConversation()\" />\n }\n\n @if (store.conversationLoading()) {\n <div class=\"state\" role=\"status\">\n <p class=\"state-title\">{{ 'nh-assistant.thread.loading' | translate }}</p>\n </div>\n } @else if (messages().length === 0 && !store.streaming()) {\n <div class=\"state\">\n <nh-assistant-icon class=\"state-icon\" name=\"assistant\" />\n <p class=\"state-title\">{{ 'nh-assistant.panel.empty-title' | translate }}</p>\n <p>{{ 'nh-assistant.panel.empty-description' | translate }}</p>\n </div>\n } @else {\n <nh-assistant-thread\n class=\"thread\"\n [messages]=\"messages()\"\n [streaming]=\"store.streaming()\"\n [deciding]=\"store.deciding()\"\n [markdown]=\"markdown\"\n (approvalDecision)=\"decide($event)\" />\n }\n }\n </div>\n\n @if (store.error(); as error) {\n <div class=\"error\" role=\"alert\">\n <nh-assistant-icon name=\"warning\" />\n <p>{{ errorKeys() | nhAssistantTranslate: error.code }}</p>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.panel.dismiss-error' | translate\"\n [attr.title]=\"'nh-assistant.panel.dismiss-error' | translate\"\n (click)=\"store.clearError()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </div>\n }\n\n @if (store.enabled() && !showPreferences()) {\n <footer class=\"footer\" (focusin)=\"refreshPageContext()\">\n @if (closed()) {\n <p class=\"notice\">{{ 'nh-assistant.panel.conversation-closed' | translate }}</p>\n }\n @if (store.pageContext(); as context) {\n <div class=\"context-chip\" [class.excluded]=\"store.pageContextExcluded()\" [attr.title]=\"context.route\">\n <nh-assistant-icon name=\"page\" />\n <span class=\"context-text\">\n {{ (store.pageContextExcluded() ? 'nh-assistant.page-context.excluded' : 'nh-assistant.page-context.included') | translate: { page: describeContext(context) } }}\n </span>\n <button\n class=\"icon-button small\"\n type=\"button\"\n [attr.aria-pressed]=\"store.pageContextExcluded()\"\n [attr.aria-label]=\"(store.pageContextExcluded() ? 'nh-assistant.page-context.include' : 'nh-assistant.page-context.exclude') | translate: { page: describeContext(context) }\"\n [attr.title]=\"(store.pageContextExcluded() ? 'nh-assistant.page-context.include' : 'nh-assistant.page-context.exclude') | translate: { page: describeContext(context) }\"\n (click)=\"store.setPageContextExcluded(!store.pageContextExcluded())\">\n <nh-assistant-icon [name]=\"store.pageContextExcluded() ? 'plus' : 'x'\" />\n </button>\n </div>\n }\n <nh-assistant-composer\n [disabled]=\"closed()\"\n [sendDisabled]=\"composerDisabled()\"\n [busy]=\"busy()\"\n [status]=\"composerStatus()\"\n [maxLength]=\"store.limits()?.maxMessageChars ?? null\"\n [restore]=\"store.restoredDraft()\"\n (restored)=\"store.consumeRestoredDraft()\"\n (send)=\"send($event)\"\n (cancel)=\"cancel()\" />\n </footer>\n }\n </section>\n</ng-template>\n","import { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantError } from '../services/nh-assistant.store';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../services/nh-assistant-transport';\n\n/** Converts any failure into a user-facing code and translation key, never raw text. */\nexport function toNhAssistantError(error: unknown): NhAssistantError {\n if (error instanceof NhAssistantApiError) {\n return { code: error.code, messageKey: error.messageKey };\n }\n\n return { code: NhAssistantClientErrorCodes.server, messageKey: nhAssistantErrorMessageKey(NhAssistantClientErrorCodes.server) };\n}\n\n/** Translation keys for an error, from the most to the least specific. */\nexport function nhAssistantErrorKeys(error: NhAssistantError | null): string[] {\n return error ? [error.messageKey, nhAssistantErrorMessageKey(error.code), 'nh-assistant.errors.generic'] : [];\n}\n\n/** Dash-case identifiers as the contract requires for agent and MCP server ids. */\nexport const NH_ASSISTANT_DASH_CASE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n","/*\n * Public API surface of @newheap/platform-ai-chat.\n */\nexport * from './lib/models/assistant-api.models';\nexport * from './lib/models/assistant-sse.models';\nexport * from './lib/models/assistant-admin.models';\nexport * from './lib/nh-assistant.config';\nexport * from './lib/provide-nh-assistant';\nexport * from './lib/i18n/nh-assistant-translations';\nexport * from './lib/services/nh-assistant-sse-parser';\nexport { NhAssistantStatusCodes } from './lib/services/nh-assistant-transport';\nexport * from './lib/services/nh-assistant-api.service';\nexport * from './lib/services/nh-assistant-admin-api.service';\nexport * from './lib/services/nh-assistant-reducer';\nexport * from './lib/services/nh-assistant-page-context';\nexport * from './lib/services/nh-assistant.store';\nexport * from './lib/services/nh-assistant-panel.service';\nexport { NH_ASSISTANT_ICONS, NhAssistantIconName } from './lib/internal/nh-assistant-icon.component';\nexport * from './lib/components/launcher/nh-assistant-launcher.component';\nexport * from './lib/components/panel/nh-assistant-panel.component';\nexport * from './lib/components/conversation-list/nh-assistant-conversation-list.component';\nexport * from './lib/components/thread/nh-assistant-thread.component';\nexport * from './lib/components/composer/nh-assistant-composer.component';\nexport * from './lib/components/tool-call-card/nh-assistant-tool-call-card.component';\nexport * from './lib/components/approval-card/nh-assistant-approval-card.component';\nexport * from './lib/components/agent-picker/nh-assistant-agent-picker.component';\nexport * from './lib/components/preferences/nh-assistant-preferences.component';\n\n/*\n * Internal building blocks shared with the secondary entry points. Not part of the public\n * API; they may change without notice.\n */\nexport { NhAssistantIconComponent as ɵNhAssistantIconComponent } from './lib/internal/nh-assistant-icon.component';\nexport { NhAssistantTranslatePipe as ɵNhAssistantTranslatePipe } from './lib/internal/nh-assistant-translate.pipe';\nexport {\n NH_ASSISTANT_DASH_CASE as ɵNH_ASSISTANT_DASH_CASE,\n nhAssistantErrorKeys as ɵnhAssistantErrorKeys,\n toNhAssistantError as ɵtoNhAssistantError\n} from './lib/internal/nh-assistant-errors';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId"],"mappings":"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"}
1
+ {"version":3,"file":"newheap-platform-ai-chat.mjs","sources":["../../../projects/nh-ai-chat/src/lib/models/assistant-api.models.ts","../../../projects/nh-ai-chat/src/lib/models/assistant-sse.models.ts","../../../projects/nh-ai-chat/src/lib/models/assistant-admin.models.ts","../../../projects/nh-ai-chat/src/lib/nh-assistant.config.ts","../../../projects/nh-ai-chat/src/lib/i18n/nh-assistant-translations.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-transport.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-admin-api.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-sse-parser.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-api.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-reducer.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-page-context.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-ui-state.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant.store.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-panel.service.ts","../../../projects/nh-ai-chat/src/lib/provide-nh-assistant.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-icon.component.ts","../../../projects/nh-ai-chat/src/lib/components/launcher/nh-assistant-launcher.component.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-translate.pipe.ts","../../../projects/nh-ai-chat/src/lib/components/agent-picker/nh-assistant-agent-picker.component.ts","../../../projects/nh-ai-chat/src/lib/components/composer/nh-assistant-composer.component.ts","../../../projects/nh-ai-chat/src/lib/components/composer/nh-assistant-composer.component.html","../../../projects/nh-ai-chat/src/lib/components/conversation-list/nh-assistant-conversation-list.component.ts","../../../projects/nh-ai-chat/src/lib/components/conversation-list/nh-assistant-conversation-list.component.html","../../../projects/nh-ai-chat/src/lib/components/preferences/nh-assistant-preferences.component.ts","../../../projects/nh-ai-chat/src/lib/components/preferences/nh-assistant-preferences.component.html","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-markdown.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-markdown.pipe.ts","../../../projects/nh-ai-chat/src/lib/components/approval-card/nh-assistant-approval-card.component.ts","../../../projects/nh-ai-chat/src/lib/components/approval-card/nh-assistant-approval-card.component.html","../../../projects/nh-ai-chat/src/lib/components/tool-call-card/nh-assistant-tool-call-card.component.ts","../../../projects/nh-ai-chat/src/lib/components/tool-call-card/nh-assistant-tool-call-card.component.html","../../../projects/nh-ai-chat/src/lib/components/thread/nh-assistant-thread.component.ts","../../../projects/nh-ai-chat/src/lib/components/thread/nh-assistant-thread.component.html","../../../projects/nh-ai-chat/src/lib/components/panel/nh-assistant-panel.component.ts","../../../projects/nh-ai-chat/src/lib/components/panel/nh-assistant-panel.component.html","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-errors.ts","../../../projects/nh-ai-chat/src/public-api.ts","../../../projects/nh-ai-chat/src/newheap-platform-ai-chat.ts"],"sourcesContent":["/*\n * Wire models of the NewHeap assistant HTTP API.\n *\n * These interfaces are a literal translation of the assistant API contract. Keep the\n * field names identical to the JSON the server returns (camelCase, ISO-8601 UTC dates,\n * GUID strings for ids).\n */\n\nexport interface AssistantStatus {\n enabled: boolean;\n agents: AgentSummary[];\n limits: {\n maxMessageChars: number;\n maxToolCallsPerTurn: number;\n };\n /** True when the caller also passes the admin policy and may use the `admin/*` endpoints. */\n canAdminister: boolean;\n}\n\nexport interface AgentSummary {\n id: string;\n version: number;\n displayNameKey: string;\n descriptionKey: string;\n canMutate: boolean;\n}\n\nexport interface ConversationSummary {\n id: string;\n agentId: string;\n title: string | null;\n status: ConversationStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Conversation extends ConversationSummary {\n agentVersion: number;\n messages: Message[];\n pendingApproval: ApprovalPart | null;\n}\n\nexport type ConversationStatus = 'idle' | 'running' | 'waiting-for-approval' | 'failed' | 'archived';\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant' | 'tool';\n createdAt: string;\n parts: MessagePart[];\n}\n\nexport type MessagePart = TextPart | ToolCallPart | ApprovalPart;\n\nexport interface TextPart {\n type: 'text';\n text: string;\n}\n\nexport type ToolCallStatus = 'running' | 'succeeded' | 'failed' | 'awaiting-approval' | 'rejected';\n\nexport interface ToolCallPart {\n type: 'tool-call';\n invocationId: string;\n toolId: string;\n toolVersion: number;\n displayName: string;\n status: ToolCallStatus;\n argumentsPreview: string | null;\n resultPreview: string | null;\n resultCode: string | null;\n}\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected' | 'expired';\n\nexport interface ApprovalPresentationField {\n label: string;\n value: string;\n}\n\nexport interface ApprovalPresentation {\n toolDisplayName: string;\n summary: string;\n fields: ApprovalPresentationField[];\n notice: string | null;\n}\n\nexport interface ApprovalPart {\n type: 'approval';\n approvalId: string;\n proposalId: string;\n proposalHash: string;\n toolId: string;\n summary: string;\n /** Trusted server-side presentation. Missing on old events and when no presenter handled the tool. */\n presentation?: ApprovalPresentation | null;\n argumentsPreview: string;\n targets: string[];\n expiresAt: string;\n status: ApprovalStatus;\n}\n\n/** Response of `GET conversations?page=&itemsPerPage=`. */\nexport interface ConversationPage {\n items: ConversationSummary[];\n total: number;\n}\n\n/** Body of `POST conversations`. */\nexport interface CreateConversationRequest {\n agentId: string;\n title?: string;\n}\n\n/** An entity the user has open, for example `{ type: 'project', id: 'AA09027', label: 'Project AA09027' }`. */\nexport interface ClientContextEntity {\n /** Dash-case, for example `order-group`. */\n type: string;\n /** At most 64 characters. */\n id: string;\n /** At most 120 characters. */\n label?: string | null;\n}\n\n/**\n * What the user has open when sending a message. Untrusted page data for the model:\n * entity ids are search hints only and never grant access.\n */\nexport interface ClientContext {\n /** For example `/order-group/123`; at most 200 characters. */\n route: string;\n /** Page title; at most 120 characters. */\n title?: string | null;\n /** At most 5 entities. */\n entities?: ClientContextEntity[];\n}\n\n/** Library name of the contract's `ClientContext`. */\nexport type NhAssistantClientContext = ClientContext;\n\n/** Body of `POST conversations/{id}/messages`. */\nexport interface SendMessageRequest {\n text: string;\n clientMessageId: string;\n /** Page context of this message; `null` when the user left it out. */\n clientContext?: ClientContext | null;\n}\n\nexport type ApprovalDecision = 'approve' | 'reject';\n\n/** Body of `POST conversations/{id}/approvals/{approvalId}/decide`. */\nexport interface DecideApprovalRequest {\n decision: ApprovalDecision;\n expectedProposalHash: string;\n reason?: string;\n}\n","import { ApprovalPart } from './assistant-api.models';\n\n/*\n * Server-sent events of an assistant turn.\n *\n * Every event arrives as `event: <name>` plus `data: <JSON>` followed by an empty line.\n * The stream closes after `turn.completed` or `error`.\n */\n\nexport interface TurnStartedEvent {\n turnId: string;\n userMessageId: string;\n assistantMessageId: string;\n}\n\nexport interface MessageDeltaEvent {\n messageId: string;\n text: string;\n}\n\nexport interface ToolStartedEvent {\n invocationId: string;\n toolId: string;\n toolVersion: number;\n displayName: string;\n argumentsPreview: string | null;\n}\n\nexport interface ToolCompletedEvent {\n invocationId: string;\n status: 'succeeded' | 'failed';\n resultCode: string | null;\n resultPreview: string | null;\n}\n\nexport type ApprovalRequiredEvent = ApprovalPart;\n\nexport type TurnCompletionStatus = 'completed' | 'waiting-for-approval' | 'cancelled' | 'failed';\n\nexport interface TurnUsage {\n inputTokens: number;\n outputTokens: number;\n toolCalls: number;\n}\n\nexport interface TurnCompletedEvent {\n turnId: string;\n status: TurnCompletionStatus;\n usage: TurnUsage;\n errorCode: string | null;\n}\n\nexport interface AssistantErrorEvent {\n code: string;\n messageKey: string;\n}\n\n/** Map from SSE event name to its data payload. */\nexport interface NhAssistantSseEventMap {\n 'turn.started': TurnStartedEvent;\n 'message.delta': MessageDeltaEvent;\n 'tool.started': ToolStartedEvent;\n 'tool.completed': ToolCompletedEvent;\n 'approval.required': ApprovalRequiredEvent;\n 'turn.completed': TurnCompletedEvent;\n 'error': AssistantErrorEvent;\n}\n\nexport type NhAssistantSseEventType = keyof NhAssistantSseEventMap;\n\n/** One parsed assistant event, discriminated by its SSE event name. */\nexport type NhAssistantSseEvent = {\n [K in NhAssistantSseEventType]: { type: K; data: NhAssistantSseEventMap[K] };\n}[NhAssistantSseEventType];\n\nexport const NH_ASSISTANT_SSE_EVENT_TYPES: readonly NhAssistantSseEventType[] = [\n 'turn.started',\n 'message.delta',\n 'tool.started',\n 'tool.completed',\n 'approval.required',\n 'turn.completed',\n 'error'\n];\n\n/**\n * Stable client-side failure codes. The client emits these as `error` events when the\n * transport fails before the server could send its own `error` event.\n */\nexport const NhAssistantClientErrorCodes = {\n network: 'assistant-network',\n unauthenticated: 'assistant-unauthenticated',\n forbidden: 'assistant-forbidden',\n notFound: 'assistant-not-found',\n conversationBusy: 'assistant-conversation-busy',\n validation: 'assistant-validation',\n versionConflict: 'assistant-version-conflict',\n invalidResponse: 'assistant-invalid-response',\n streamInterrupted: 'assistant-stream-interrupted',\n server: 'assistant-server'\n} as const;\n\nexport type NhAssistantClientErrorCode = typeof NhAssistantClientErrorCodes[keyof typeof NhAssistantClientErrorCodes];\n","/*\n * Wire models of the assistant preference and administration endpoints.\n *\n * Literal translation of the assistant API contract (preferences and `admin/*`). Keep the\n * field names identical to the JSON the server returns.\n */\n\nexport type AssistantStyle = 'default' | 'direct' | 'personal' | 'detailed';\n\nexport type AssistantAddressForm = 'informal' | 'formal';\n\nexport type AssistantResponseLength = 'short' | 'normal' | 'long';\n\nexport interface AssistantPreferences {\n style: AssistantStyle;\n addressForm: AssistantAddressForm;\n responseLength: AssistantResponseLength;\n /** At most 1,000 characters. Steers style only; it never overrides the fixed rules. */\n customInstructions: string | null;\n}\n\nexport interface ApplicationContext {\n text: string;\n version: number;\n hash: string;\n updatedAt: string;\n updatedBy: string | null;\n}\n\nexport interface ApplicationContextVersion {\n version: number;\n hash: string;\n updatedAt: string;\n updatedBy: string | null;\n}\n\n/** Body of `PUT admin/context`. */\nexport interface UpdateApplicationContextRequest {\n text: string;\n expectedVersion: number;\n}\n\nexport type ToolCatalogEffect = 'read-only' | 'idempotent-mutation' | 'mutation' | 'destructive';\n\nexport interface ToolCatalogEntry {\n id: string;\n source: 'local' | 'bridge' | 'mcp';\n effect: ToolCatalogEffect;\n description: string;\n}\n\n/** Equals `NhAiAutonomyLevel`. */\nexport type AssistantAutonomy = 'observe' | 'explain' | 'propose' | 'simulate' | 'execute';\n\nexport interface AdminAgentInput {\n id: string;\n displayName: string;\n description: string;\n instructions: string;\n toolSelectors: string[];\n mcpServerIds: string[];\n requiredPolicy: string | null;\n autonomy: AssistantAutonomy;\n isEnabled: boolean;\n}\n\n/** Body of `PUT admin/agents/{id}`. */\nexport type UpdateAdminAgentRequest = AdminAgentInput & { expectedVersion: number };\n\nexport interface AdminAgent extends AdminAgentInput {\n version: number;\n source: 'code' | 'admin';\n isOverridden: boolean;\n instructionsHash: string;\n updatedAt: string;\n}\n\nexport type McpAuthMode = 'none' | 'bearer' | 'api-key' | 'forward-user-token';\n\nexport interface McpServerInput {\n id: string;\n displayName: string;\n url: string;\n authMode: McpAuthMode;\n headerName: string | null;\n /** Write-only. Omit to keep the stored secret, `\"\"` to clear it. */\n secret?: string | null;\n requiredPolicy: string | null;\n isEnabled: boolean;\n}\n\nexport interface McpServer {\n id: string;\n displayName: string;\n url: string;\n authMode: McpAuthMode;\n headerName: string | null;\n hasSecret: boolean;\n requiredPolicy: string | null;\n isEnabled: boolean;\n lastSyncAt: string | null;\n lastSyncStatus: 'ok' | 'failed' | null;\n assignedAgentIds: string[];\n}\n\nexport interface McpServerTestResult {\n ok: boolean;\n code: string | null;\n toolCount: number | null;\n}\n\nexport type McpToolEffect = 'read-only' | 'mutation';\n\nexport type McpToolStatus = 'available' | 'schema-changed' | 'missing';\n\nexport interface McpTool {\n remoteName: string;\n localId: string;\n description: string;\n descriptionOverride: string | null;\n isEnabled: boolean;\n effect: McpToolEffect;\n status: McpToolStatus;\n /** Remote annotation. Untrusted: shown as a hint only, never used as a default. */\n readOnlyHint: boolean | null;\n}\n\n/** Body of `PUT admin/mcp-servers/{id}/tools/{remoteName}`. */\nexport interface UpdateMcpToolRequest {\n isEnabled: boolean;\n effect: McpToolEffect;\n descriptionOverride: string | null;\n}\n","import { InjectionToken, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { ClientContext } from './models/assistant-api.models';\n\n/** Decides whether the current user may see and use the assistant. */\nexport interface NhAssistantAccessPolicy {\n canUse(): boolean | Observable<boolean>;\n}\n\nexport interface NhAssistantConfig {\n /** Base URL of the assistant endpoints, for example `environment.api.baseUrl + '/assistant'`. */\n apiBaseUrl: string;\n /**\n * Returns the caller's bearer token, or null when the request should be anonymous. It runs\n * in the injection context of the assistant scope before every request, so it may call\n * `inject(...)`, for example `() => inject(MyAuthService).getAuthorization()?.token ?? null`.\n */\n getAccessToken: () => string | null | Promise<string | null>;\n /**\n * Returns what the user has open, sent with each message as untrusted page context.\n * Runs in the assistant's injection context when the panel opens and before every\n * message, like `getAccessToken`. The library validates and truncates the result; a\n * failing getter or an invalid shape only leaves the context out. Default: none.\n */\n getPageContext?: () => ClientContext | null | Promise<ClientContext | null>;\n /**\n * Stable, non-secret identity for browser UI state (for example a user id plus tenant id).\n * Runs in the assistant injection context. Return null on sign-out. Without this callback\n * the assistant keeps UI state in memory only. Never return an access token.\n */\n getStateScope?: () => string | null | Promise<string | null>;\n /** Injectable access policy. Default: always allowed. */\n accessPolicy?: Type<NhAssistantAccessPolicy>;\n /** Agent selected when the user has not chosen one. Default: the first agent the server lists. */\n defaultAgentId?: string;\n /** `'bundled'` merges the library's `en` and `nl` texts into `TranslateService`; `'host'` leaves translations to the host. Default `'bundled'`. */\n translations?: 'bundled' | 'host';\n /**\n * Router link of the host's assistant administration page. The panel shows a link to it\n * only when the server reports `canAdminister`. Default: no link.\n */\n adminRoute?: string | any[];\n /** Renders assistant text as sanitized Markdown. Default `{ enabled: true }`. */\n markdown?: { enabled: boolean };\n}\n\nexport const NH_ASSISTANT_CONFIG = new InjectionToken<NhAssistantConfig>('NH_ASSISTANT_CONFIG');\n\nexport const NH_ASSISTANT_ACCESS_POLICY = new InjectionToken<NhAssistantAccessPolicy>('NH_ASSISTANT_ACCESS_POLICY');\n\n/** The `fetch` function type the assistant client uses. */\nexport type NhAssistantFetch = (input: string, init: RequestInit) => Promise<Response>;\n\n/**\n * Transport used by the assistant client. It is deliberately independent of the host's\n * `HttpClient` and interceptors, because streaming responses need `fetch` and the access\n * token comes from `NhAssistantConfig.getAccessToken`. Tests and the mock API from\n * `@newheap/platform-ai-chat/testing` replace it.\n */\nexport const NH_ASSISTANT_FETCH = new InjectionToken<NhAssistantFetch>('NH_ASSISTANT_FETCH', {\n providedIn: 'root',\n factory: () => (input: string, init: RequestInit) => globalThis.fetch(input, init)\n});\n\n/** Default policy: every user who can reach the host may use the assistant. */\nexport class NhAssistantAllowAllAccessPolicy implements NhAssistantAccessPolicy {\n canUse(): boolean {\n return true;\n }\n}\n","import { DestroyRef, Injectable, inject } from '@angular/core';\nimport { TranslateService, TranslationObject } from '@ngx-translate/core';\nimport { merge } from 'rxjs';\nimport en from './en.json';\nimport nl from './nl.json';\n\n/** The library's own translation bundles, keyed by language. All keys live under `nh-assistant.`. */\nexport const NH_ASSISTANT_TRANSLATIONS: Readonly<Record<'en' | 'nl', TranslationObject>> = { en, nl };\n\ntype TranslationTree = { [key: string]: unknown };\n\nconst rootKey = 'nh-assistant';\n\nfunction isTree(value: unknown): value is TranslationTree {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Deep merge where values of `override` win. */\nfunction mergeTrees(base: TranslationTree, override: TranslationTree): TranslationTree {\n const result: TranslationTree = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] = isTree(current) && isTree(value) ? mergeTrees(current, value) : value;\n }\n return result;\n}\n\nfunction hasAllKeys(bundle: TranslationTree, candidate: unknown): boolean {\n if (!isTree(candidate)) {\n return false;\n }\n\n return Object.entries(bundle).every(([key, value]) =>\n isTree(value) ? hasAllKeys(value, candidate[key]) : key in candidate\n );\n}\n\n/**\n * Merges the bundled texts into `TranslateService` whenever the host loads or replaces a\n * language. Host loaders never lose the library texts, the library never pre-empts the\n * host loader, and keys the host defines under `nh-assistant.` (agent names, overrides)\n * win over the bundle. Languages without a bundle receive the English texts.\n */\n@Injectable({ providedIn: 'root' })\nexport class NhAssistantTranslationMerger {\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private started = false;\n\n start(): void {\n const translate = this.translate;\n if (this.started || !translate) {\n return;\n }\n this.started = true;\n\n const subscription = merge(translate.onTranslationChange, translate.onLangChange).subscribe(event => {\n if (event.lang && isTree(event.translations)) {\n this.ensure(event.lang, event.translations[rootKey]);\n }\n });\n this.destroyRef.onDestroy(() => subscription.unsubscribe());\n\n // The current language is loaded or already requested by the host, so merging into it\n // never pre-empts the host loader; a later load triggers a new merge.\n const current = translate.getCurrentLang();\n if (current) {\n this.ensure(current, translate.instant(rootKey));\n }\n }\n\n private ensure(language: string, existing: unknown): void {\n const bundle = (NH_ASSISTANT_TRANSLATIONS[language as 'en' | 'nl'] ?? NH_ASSISTANT_TRANSLATIONS.en) as TranslationTree;\n const bundleRoot = bundle[rootKey] as TranslationTree;\n if (hasAllKeys(bundleRoot, existing)) {\n return;\n }\n\n const merged = mergeTrees(bundleRoot, isTree(existing) ? existing : {});\n this.translate?.setTranslation(language, { [rootKey]: merged } as TranslationObject, true);\n }\n}\n","import { EnvironmentInjector, Injectable, inject, runInInjectionContext } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable, Subscriber } from 'rxjs';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NH_ASSISTANT_CONFIG, NH_ASSISTANT_FETCH } from '../nh-assistant.config';\n\n/** A failed JSON request of the assistant API. Carries a stable code, never response text. */\nexport class NhAssistantApiError extends Error {\n constructor(\n readonly status: number,\n readonly code: string,\n readonly messageKey: string\n ) {\n super(code);\n this.name = 'NhAssistantApiError';\n }\n}\n\n/** Translation key that belongs to a failure code. */\nexport function nhAssistantErrorMessageKey(code: string): string {\n return `nh-assistant.errors.${code}`;\n}\n\n/** Maps an HTTP status of the assistant API to a stable client failure code. */\nexport function nhAssistantCodeForStatus(status: number): string {\n if (status === 0) {\n return NhAssistantClientErrorCodes.network;\n }\n if (status === 400) {\n return NhAssistantClientErrorCodes.validation;\n }\n if (status === 401) {\n return NhAssistantClientErrorCodes.unauthenticated;\n }\n if (status === 403) {\n return NhAssistantClientErrorCodes.forbidden;\n }\n if (status === 404) {\n return NhAssistantClientErrorCodes.notFound;\n }\n if (status === 409) {\n return NhAssistantClientErrorCodes.conversationBusy;\n }\n\n return NhAssistantClientErrorCodes.server;\n}\n\n/** Status-specific codes that replace the generic mapping for one endpoint. */\nexport type NhAssistantStatusCodes = Partial<Record<number, string>>;\n\nconst safeCode = /^[a-z0-9][a-z0-9.-]{0,79}$/;\n\n/**\n * Shared transport of the assistant services: `fetch` with the host's token, the current\n * language and stable failure codes. Internal to the library.\n */\n@Injectable()\nexport class NhAssistantTransport {\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly fetchFn = inject(NH_ASSISTANT_FETCH);\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly injector = inject(EnvironmentInjector);\n\n /** A cold JSON request that aborts on unsubscribe and errors with `NhAssistantApiError`. */\n json<T>(method: string, path: string, body?: unknown, statusCodes: NhAssistantStatusCodes = {}): Observable<T> {\n return new Observable<T>(subscriber => {\n const abort = new AbortController();\n\n void this.executeJson<T>(method, path, body, statusCodes, abort.signal, subscriber);\n\n return () => abort.abort();\n });\n }\n\n async fetch(method: string, path: string, accept: string, body: unknown, signal: AbortSignal): Promise<Response> {\n const init = await this.createInit(method, accept, body, signal);\n return this.fetchFn(this.url(path), init);\n }\n\n /**\n * The failure code of a response: a safe `code` field of a JSON error body wins, then the\n * endpoint's status mapping, then the generic mapping. Response text is never used.\n */\n async failureCode(response: Response, statusCodes: NhAssistantStatusCodes = {}): Promise<string> {\n try {\n const text = await response.text();\n const body = text.length > 0 ? JSON.parse(text) as unknown : null;\n const code = body && typeof body === 'object' ? (body as Record<string, unknown>)['code'] : null;\n if (typeof code === 'string' && safeCode.test(code)) {\n return code;\n }\n } catch {\n // A non-JSON error body carries no code.\n }\n\n return statusCodes[response.status] ?? nhAssistantCodeForStatus(response.status);\n }\n\n private async executeJson<T>(\n method: string,\n path: string,\n body: unknown,\n statusCodes: NhAssistantStatusCodes,\n signal: AbortSignal,\n subscriber: Subscriber<T>\n ): Promise<void> {\n let response: Response;\n try {\n response = await this.fetch(method, path, 'application/json', body, signal);\n } catch {\n if (!signal.aborted) {\n subscriber.error(createApiError(0, nhAssistantCodeForStatus(0)));\n }\n return;\n }\n\n if (!response.ok) {\n const code = await this.failureCode(response, statusCodes);\n subscriber.error(createApiError(response.status, code));\n return;\n }\n\n try {\n const text = response.status === 204 ? '' : await response.text();\n subscriber.next((text.length > 0 ? JSON.parse(text) : undefined) as T);\n subscriber.complete();\n } catch {\n if (!signal.aborted) {\n subscriber.error(createApiError(response.status, NhAssistantClientErrorCodes.invalidResponse));\n }\n }\n }\n\n private async createInit(method: string, accept: string, body: unknown, signal: AbortSignal): Promise<RequestInit> {\n const headers: Record<string, string> = { Accept: accept };\n\n const token = await runInInjectionContext(this.injector, () => this.config.getAccessToken());\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const language = this.translate?.getCurrentLang();\n if (language) {\n headers['Accept-Language'] = language;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n return {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal,\n cache: 'no-store'\n };\n }\n\n private url(path: string): string {\n const base = this.config.apiBaseUrl.replace(/\\/+$/, '');\n return `${base}/${path}`;\n }\n}\n\nfunction createApiError(status: number, code: string): NhAssistantApiError {\n return new NhAssistantApiError(status, code, nhAssistantErrorMessageKey(code));\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n AdminAgent,\n AdminAgentInput,\n ApplicationContext,\n ApplicationContextVersion,\n McpServer,\n McpServerInput,\n McpServerTestResult,\n McpTool,\n ToolCatalogEntry,\n UpdateAdminAgentRequest,\n UpdateApplicationContextRequest,\n UpdateMcpToolRequest\n} from '../models/assistant-admin.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantStatusCodes, NhAssistantTransport } from './nh-assistant-transport';\n\n/** In the admin endpoints a 409 means a stale `expectedVersion` or a forbidden state change. */\nconst adminStatusCodes: NhAssistantStatusCodes = {\n 409: NhAssistantClientErrorCodes.versionConflict\n};\n\n/**\n * Client for the assistant administration endpoints (`admin/*`). The server requires the\n * access policy and the admin policy; show the administration only when\n * `NhAssistantStore.canAdminister()` is true. Failures error with `NhAssistantApiError`.\n * Secrets are write-only: `McpServer` only reports `hasSecret`.\n */\n@Injectable()\nexport class NhAssistantAdminApiService {\n private readonly transport = inject(NhAssistantTransport);\n\n getContext(): Observable<ApplicationContext> {\n return this.request<ApplicationContext>('GET', 'admin/context');\n }\n\n /** Saves a new context version; fails with `assistant-version-conflict` when `expectedVersion` is stale. */\n updateContext(request: UpdateApplicationContextRequest): Observable<ApplicationContext> {\n return this.request<ApplicationContext>('PUT', 'admin/context', request);\n }\n\n getContextVersions(): Observable<ApplicationContextVersion[]> {\n return this.request<ApplicationContextVersion[]>('GET', 'admin/context/versions');\n }\n\n /** Local, bridge and MCP tools, for choosing tool selectors. */\n getTools(): Observable<ToolCatalogEntry[]> {\n return this.request<ToolCatalogEntry[]>('GET', 'admin/tools');\n }\n\n getAgents(): Observable<AdminAgent[]> {\n return this.request<AdminAgent[]>('GET', 'admin/agents');\n }\n\n createAgent(input: AdminAgentInput): Observable<AdminAgent> {\n return this.request<AdminAgent>('POST', 'admin/agents', input);\n }\n\n updateAgent(agentId: string, request: UpdateAdminAgentRequest): Observable<AdminAgent> {\n return this.request<AdminAgent>('PUT', `admin/agents/${encodeURIComponent(agentId)}`, request);\n }\n\n /** Restores a code agent to its definition in code. */\n resetAgent(agentId: string): Observable<AdminAgent> {\n return this.request<AdminAgent>('POST', `admin/agents/${encodeURIComponent(agentId)}/reset`);\n }\n\n /** Deletes an admin agent. Code agents cannot be deleted; disable them instead. */\n deleteAgent(agentId: string): Observable<void> {\n return this.request<void>('DELETE', `admin/agents/${encodeURIComponent(agentId)}`);\n }\n\n getMcpServers(): Observable<McpServer[]> {\n return this.request<McpServer[]>('GET', 'admin/mcp-servers');\n }\n\n createMcpServer(input: McpServerInput): Observable<McpServer> {\n return this.request<McpServer>('POST', 'admin/mcp-servers', input);\n }\n\n /** Omit `secret` to keep the stored secret; send `\"\"` to clear it. */\n updateMcpServer(serverId: string, input: McpServerInput): Observable<McpServer> {\n return this.request<McpServer>('PUT', `admin/mcp-servers/${encodeURIComponent(serverId)}`, input);\n }\n\n deleteMcpServer(serverId: string): Observable<void> {\n return this.request<void>('DELETE', `admin/mcp-servers/${encodeURIComponent(serverId)}`);\n }\n\n testMcpServer(serverId: string): Observable<McpServerTestResult> {\n return this.request<McpServerTestResult>('POST', `admin/mcp-servers/${encodeURIComponent(serverId)}/test`);\n }\n\n /** Reads the remote tool list. New tools start disabled; a changed input schema disables a tool. */\n syncMcpServer(serverId: string): Observable<McpTool[]> {\n return this.request<McpTool[]>('POST', `admin/mcp-servers/${encodeURIComponent(serverId)}/sync`);\n }\n\n getMcpTools(serverId: string): Observable<McpTool[]> {\n return this.request<McpTool[]>('GET', `admin/mcp-servers/${encodeURIComponent(serverId)}/tools`);\n }\n\n updateMcpTool(serverId: string, remoteName: string, request: UpdateMcpToolRequest): Observable<McpTool> {\n const path = `admin/mcp-servers/${encodeURIComponent(serverId)}/tools/${encodeURIComponent(remoteName)}`;\n return this.request<McpTool>('PUT', path, request);\n }\n\n private request<T>(method: string, path: string, body?: unknown): Observable<T> {\n return this.transport.json<T>(method, path, body, adminStatusCodes);\n }\n}\n","/** One raw server-sent event before its data is interpreted. */\nexport interface NhAssistantRawSseMessage {\n event: string;\n data: string;\n}\n\n/**\n * Incremental parser for the `text/event-stream` format.\n *\n * Feed decoded text chunks in arrival order. Chunks may split lines, fields and line\n * terminators anywhere. Comment lines (starting with `:`, such as the `: keep-alive`\n * heartbeat) are ignored; `id` and `retry` fields are accepted and ignored. An event is\n * dispatched at the empty line that terminates it. An unterminated event at the end of\n * the stream is discarded, as the SSE specification requires.\n */\nexport class NhAssistantSseParser {\n private buffer = '';\n private eventName = '';\n private dataLines: string[] = [];\n\n push(chunk: string): NhAssistantRawSseMessage[] {\n this.buffer += chunk;\n\n const messages: NhAssistantRawSseMessage[] = [];\n let lineStart = 0;\n\n for (let index = 0; index < this.buffer.length; index++) {\n const character = this.buffer[index];\n if (character !== '\\n' && character !== '\\r') {\n continue;\n }\n\n if (character === '\\r' && index === this.buffer.length - 1) {\n // A trailing CR may be the first half of a CRLF split across chunks.\n break;\n }\n\n const line = this.buffer.slice(lineStart, index);\n if (character === '\\r' && this.buffer[index + 1] === '\\n') {\n index++;\n }\n lineStart = index + 1;\n\n const message = this.processLine(line);\n if (message) {\n messages.push(message);\n }\n }\n\n this.buffer = this.buffer.slice(lineStart);\n return messages;\n }\n\n /** Signals the end of the stream and returns an event that a trailing CR completed. */\n end(): NhAssistantRawSseMessage[] {\n const messages: NhAssistantRawSseMessage[] = [];\n if (this.buffer.endsWith('\\r')) {\n const message = this.processLine(this.buffer.slice(0, -1));\n if (message) {\n messages.push(message);\n }\n }\n\n this.buffer = '';\n this.eventName = '';\n this.dataLines = [];\n return messages;\n }\n\n private processLine(line: string): NhAssistantRawSseMessage | null {\n if (line.length === 0) {\n return this.dispatch();\n }\n\n if (line.startsWith(':')) {\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex < 0 ? line : line.slice(0, colonIndex);\n let value = colonIndex < 0 ? '' : line.slice(colonIndex + 1);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n if (field === 'event') {\n this.eventName = value;\n } else if (field === 'data') {\n this.dataLines.push(value);\n }\n\n return null;\n }\n\n private dispatch(): NhAssistantRawSseMessage | null {\n const hasData = this.dataLines.length > 0;\n const message: NhAssistantRawSseMessage = {\n event: this.eventName || 'message',\n data: this.dataLines.join('\\n')\n };\n\n this.eventName = '';\n this.dataLines = [];\n\n return hasData ? message : null;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, Subscriber } from 'rxjs';\nimport { AssistantPreferences } from '../models/assistant-admin.models';\nimport {\n AgentSummary,\n AssistantStatus,\n Conversation,\n ConversationPage,\n CreateConversationRequest,\n DecideApprovalRequest,\n SendMessageRequest\n} from '../models/assistant-api.models';\nimport {\n NH_ASSISTANT_SSE_EVENT_TYPES,\n NhAssistantClientErrorCodes,\n NhAssistantSseEvent,\n NhAssistantSseEventType\n} from '../models/assistant-sse.models';\nimport { NhAssistantSseParser } from './nh-assistant-sse-parser';\nimport { NhAssistantTransport, nhAssistantErrorMessageKey } from './nh-assistant-transport';\n\nexport { NhAssistantApiError, nhAssistantCodeForStatus, nhAssistantErrorMessageKey } from './nh-assistant-transport';\n\nconst knownEventTypes = new Set<string>(NH_ASSISTANT_SSE_EVENT_TYPES);\n\n/**\n * Client for the assistant HTTP API. JSON endpoints return cold observables that abort\n * their request on unsubscribe. Streaming endpoints emit every contract event and complete\n * after `turn.completed` or `error`; transport failures become an `error` event with a\n * client failure code instead of an observable error.\n */\n@Injectable()\nexport class NhAssistantApiService {\n private readonly transport = inject(NhAssistantTransport);\n\n status(): Observable<AssistantStatus> {\n return this.transport.json<AssistantStatus>('GET', 'status');\n }\n\n agents(): Observable<AgentSummary[]> {\n return this.transport.json<AgentSummary[]>('GET', 'agents');\n }\n\n listConversations(page = 1, itemsPerPage = 20): Observable<ConversationPage> {\n const query = `page=${encodeURIComponent(page)}&itemsPerPage=${encodeURIComponent(itemsPerPage)}`;\n return this.transport.json<ConversationPage>('GET', `conversations?${query}`);\n }\n\n createConversation(request: CreateConversationRequest): Observable<Conversation> {\n return this.transport.json<Conversation>('POST', 'conversations', request);\n }\n\n getConversation(conversationId: string): Observable<Conversation> {\n return this.transport.json<Conversation>('GET', `conversations/${encodeURIComponent(conversationId)}`);\n }\n\n deleteConversation(conversationId: string): Observable<void> {\n return this.transport.json<void>('DELETE', `conversations/${encodeURIComponent(conversationId)}`);\n }\n\n sendMessage(conversationId: string, request: SendMessageRequest): Observable<NhAssistantSseEvent> {\n return this.requestStream(`conversations/${encodeURIComponent(conversationId)}/messages`, request);\n }\n\n decideApproval(conversationId: string, approvalId: string, request: DecideApprovalRequest): Observable<NhAssistantSseEvent> {\n const path = `conversations/${encodeURIComponent(conversationId)}/approvals/${encodeURIComponent(approvalId)}/decide`;\n return this.requestStream(path, request);\n }\n\n cancel(conversationId: string): Observable<void> {\n return this.transport.json<void>('POST', `conversations/${encodeURIComponent(conversationId)}/cancel`);\n }\n\n /** The caller's own assistant preferences. */\n getPreferences(): Observable<AssistantPreferences> {\n return this.transport.json<AssistantPreferences>('GET', 'preferences');\n }\n\n /** Replaces the caller's own assistant preferences and returns the stored values. */\n updatePreferences(preferences: AssistantPreferences): Observable<AssistantPreferences> {\n return this.transport.json<AssistantPreferences>('PUT', 'preferences', preferences);\n }\n\n private requestStream(path: string, body: unknown): Observable<NhAssistantSseEvent> {\n return new Observable<NhAssistantSseEvent>(subscriber => {\n const abort = new AbortController();\n\n void this.executeStream(path, body, abort.signal, subscriber);\n\n return () => abort.abort();\n });\n }\n\n private async executeStream(\n path: string,\n body: unknown,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantSseEvent>\n ): Promise<void> {\n let response: Response;\n try {\n response = await this.transport.fetch('POST', path, 'text/event-stream', body, signal);\n } catch {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.network);\n return;\n }\n\n if (!response.ok) {\n this.emitClientError(subscriber, signal, await this.transport.failureCode(response));\n return;\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n if (!response.body || !contentType.toLowerCase().startsWith('text/event-stream')) {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.invalidResponse);\n return;\n }\n\n await this.readStream(response.body, signal, subscriber);\n }\n\n private async readStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantSseEvent>\n ): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const parser = new NhAssistantSseParser();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n const text = done ? decoder.decode() : decoder.decode(value, { stream: true });\n const messages = done ? [...parser.push(text), ...parser.end()] : parser.push(text);\n\n for (const message of messages) {\n if (!knownEventTypes.has(message.event)) {\n continue;\n }\n\n let data: unknown;\n try {\n data = JSON.parse(message.data);\n } catch {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.invalidResponse);\n return;\n }\n\n const event = { type: message.event as NhAssistantSseEventType, data } as NhAssistantSseEvent;\n subscriber.next(event);\n\n if (event.type === 'turn.completed' || event.type === 'error') {\n subscriber.complete();\n return;\n }\n }\n\n if (done) {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.streamInterrupted);\n return;\n }\n }\n } catch {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.streamInterrupted);\n } finally {\n // Releases the connection once a terminal event arrived or the consumer unsubscribed.\n reader.cancel().catch(() => undefined);\n }\n }\n\n private emitClientError(subscriber: Subscriber<NhAssistantSseEvent>, signal: AbortSignal, code: string): void {\n if (signal.aborted || subscriber.closed) {\n return;\n }\n\n subscriber.next({ type: 'error', data: { code, messageKey: nhAssistantErrorMessageKey(code) } });\n subscriber.complete();\n }\n}\n","import {\n ApprovalPart,\n Conversation,\n ConversationStatus,\n Message,\n MessagePart,\n ToolCallPart\n} from '../models/assistant-api.models';\nimport { NhAssistantSseEvent, TurnCompletionStatus } from '../models/assistant-sse.models';\n\n/**\n * Applies one assistant event to a conversation and returns the new conversation.\n * The input is never mutated, so the result can be stored in a signal directly.\n *\n * @param clientMessageId id of the optimistic user message of the current turn; its id is\n * replaced by the server's `userMessageId` when `turn.started` arrives.\n */\nexport function applyNhAssistantEvent(\n conversation: Conversation,\n event: NhAssistantSseEvent,\n clientMessageId?: string\n): Conversation {\n switch (event.type) {\n case 'turn.started': {\n let messages = conversation.messages.map(message =>\n clientMessageId && message.id === clientMessageId ? { ...message, id: event.data.userMessageId } : message\n );\n if (!messages.some(message => message.id === event.data.assistantMessageId)) {\n messages = [...messages, createAssistantMessage(event.data.assistantMessageId)];\n }\n\n return { ...conversation, status: 'running', messages };\n }\n\n case 'message.delta': {\n const messages = ensureMessage(conversation.messages, event.data.messageId);\n return {\n ...conversation,\n messages: messages.map(message =>\n message.id === event.data.messageId ? appendText(message, event.data.text) : message\n )\n };\n }\n\n case 'tool.started': {\n const data = event.data;\n if (findToolCall(conversation.messages, data.invocationId)) {\n return updateToolCall(conversation, data.invocationId, part => ({\n ...part,\n toolId: data.toolId,\n toolVersion: data.toolVersion,\n displayName: data.displayName,\n argumentsPreview: data.argumentsPreview,\n status: 'running'\n }));\n }\n\n const part: ToolCallPart = {\n type: 'tool-call',\n invocationId: data.invocationId,\n toolId: data.toolId,\n toolVersion: data.toolVersion,\n displayName: data.displayName,\n status: 'running',\n argumentsPreview: data.argumentsPreview,\n resultPreview: null,\n resultCode: null\n };\n return appendToCurrentAssistantMessage(conversation, part);\n }\n\n case 'tool.completed': {\n const data = event.data;\n return updateToolCall(conversation, data.invocationId, part => ({\n ...part,\n status: data.status,\n resultCode: data.resultCode,\n resultPreview: data.resultPreview\n }));\n }\n\n case 'approval.required': {\n const approval: ApprovalPart = { ...event.data, type: 'approval' };\n const withToolAwaiting = markLatestRunningToolAwaiting(\n conversation,\n approval.toolId,\n approval.presentation?.toolDisplayName);\n const exists = withToolAwaiting.messages.some(message =>\n message.parts.some(part => part.type === 'approval' && part.approvalId === approval.approvalId)\n );\n const withApproval = exists\n ? replaceApproval(withToolAwaiting, approval)\n : appendToCurrentAssistantMessage(withToolAwaiting, approval);\n\n return { ...withApproval, status: 'waiting-for-approval', pendingApproval: approval };\n }\n\n case 'turn.completed': {\n const status = conversationStatusFor(event.data.status);\n return {\n ...conversation,\n status,\n pendingApproval: status === 'waiting-for-approval' ? conversation.pendingApproval : null\n };\n }\n\n case 'error':\n return {\n ...conversation,\n status: conversation.status === 'running' ? 'failed' : conversation.status\n };\n }\n}\n\n/** Records the user's approval decision locally until the server state is reloaded. */\nexport function applyNhAssistantApprovalDecision(\n conversation: Conversation,\n approvalId: string,\n decision: 'approve' | 'reject'\n): Conversation {\n const approval = conversation.messages\n .flatMap(message => message.parts)\n .find((part): part is ApprovalPart => part.type === 'approval' && part.approvalId === approvalId)\n ?? conversation.pendingApproval;\n const toolId = approval?.approvalId === approvalId ? approval.toolId : null;\n\n const messages = conversation.messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part.type === 'approval' && part.approvalId === approvalId\n ? { ...part, status: decision === 'approve' ? 'approved' : 'rejected' } as ApprovalPart\n : part\n )\n }));\n\n let updated: Conversation = {\n ...conversation,\n messages,\n status: 'running',\n pendingApproval: null\n };\n\n if (toolId) {\n const awaiting = findLatestToolCall(updated.messages, part => part.toolId === toolId && part.status === 'awaiting-approval');\n if (awaiting) {\n updated = updateToolCall(updated, awaiting.invocationId, part => ({\n ...part,\n status: decision === 'approve' ? 'running' : 'rejected'\n }));\n }\n }\n\n return updated;\n}\n\n/**\n * True when an assistant message after the latest user message contains non-blank text,\n * so the latest turn produced a visible answer. Tool calls and approvals alone do not count.\n */\nexport function nhAssistantLatestTurnHasText(conversation: Conversation): boolean {\n for (let position = conversation.messages.length - 1; position >= 0; position--) {\n const message = conversation.messages[position];\n if (message.role === 'user') {\n return false;\n }\n if (message.role === 'assistant' && message.parts.some(part => part.type === 'text' && part.text.trim().length > 0)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction conversationStatusFor(status: TurnCompletionStatus): ConversationStatus {\n switch (status) {\n case 'completed':\n case 'cancelled':\n return 'idle';\n case 'waiting-for-approval':\n return 'waiting-for-approval';\n case 'failed':\n return 'failed';\n }\n}\n\nfunction createAssistantMessage(id: string): Message {\n return { id, role: 'assistant', createdAt: new Date().toISOString(), parts: [] };\n}\n\nfunction ensureMessage(messages: Message[], messageId: string): Message[] {\n return messages.some(message => message.id === messageId)\n ? messages\n : [...messages, createAssistantMessage(messageId)];\n}\n\nfunction appendText(message: Message, text: string): Message {\n const last = message.parts[message.parts.length - 1];\n if (last?.type === 'text') {\n return { ...message, parts: [...message.parts.slice(0, -1), { type: 'text', text: last.text + text }] };\n }\n\n return { ...message, parts: [...message.parts, { type: 'text', text }] };\n}\n\nfunction appendToCurrentAssistantMessage(conversation: Conversation, part: MessagePart): Conversation {\n let index = -1;\n for (let position = conversation.messages.length - 1; position >= 0; position--) {\n if (conversation.messages[position].role === 'assistant') {\n index = position;\n break;\n }\n }\n\n if (index < 0) {\n const message = createAssistantMessage(`local-${partKey(part)}`);\n return { ...conversation, messages: [...conversation.messages, { ...message, parts: [part] }] };\n }\n\n return {\n ...conversation,\n messages: conversation.messages.map((message, position) =>\n position === index ? { ...message, parts: [...message.parts, part] } : message\n )\n };\n}\n\nfunction partKey(part: MessagePart): string {\n if (part.type === 'tool-call') {\n return part.invocationId;\n }\n if (part.type === 'approval') {\n return part.approvalId;\n }\n\n return 'text';\n}\n\nfunction findToolCall(messages: Message[], invocationId: string): ToolCallPart | undefined {\n return findLatestToolCall(messages, part => part.invocationId === invocationId);\n}\n\nfunction findLatestToolCall(messages: Message[], predicate: (part: ToolCallPart) => boolean): ToolCallPart | undefined {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex--) {\n const parts = messages[messageIndex].parts;\n for (let partIndex = parts.length - 1; partIndex >= 0; partIndex--) {\n const part = parts[partIndex];\n if (part.type === 'tool-call' && predicate(part)) {\n return part;\n }\n }\n }\n\n return undefined;\n}\n\nfunction updateToolCall(\n conversation: Conversation,\n invocationId: string,\n update: (part: ToolCallPart) => ToolCallPart\n): Conversation {\n return {\n ...conversation,\n messages: conversation.messages.map(message =>\n message.parts.some(part => part.type === 'tool-call' && part.invocationId === invocationId)\n ? {\n ...message,\n parts: message.parts.map(part =>\n part.type === 'tool-call' && part.invocationId === invocationId ? update(part) : part\n )\n }\n : message\n )\n };\n}\n\nfunction markLatestRunningToolAwaiting(\n conversation: Conversation,\n toolId: string,\n displayName?: string\n): Conversation {\n const running = findLatestToolCall(conversation.messages, part => part.toolId === toolId && part.status === 'running');\n if (!running) {\n return conversation;\n }\n\n return updateToolCall(conversation, running.invocationId, part => ({\n ...part,\n displayName: displayName ?? part.displayName,\n status: 'awaiting-approval'\n }));\n}\n\nfunction replaceApproval(conversation: Conversation, approval: ApprovalPart): Conversation {\n return {\n ...conversation,\n messages: conversation.messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part.type === 'approval' && part.approvalId === approval.approvalId ? approval : part\n )\n }))\n };\n}\n","import { ClientContext, ClientContextEntity } from '../models/assistant-api.models';\n\n/** Limits of the page context (contract 15.2). */\nexport const NH_ASSISTANT_PAGE_CONTEXT_LIMITS = {\n route: 200,\n title: 120,\n entities: 5,\n entityId: 64,\n entityLabel: 120\n} as const;\n\nconst dashCase = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n/**\n * Validates host-provided page context and truncates it to the contract limits.\n * Returns null for an invalid shape (not an object or no route), so the message is sent\n * without page context. Route, title and labels are truncated; entities beyond five are\n * dropped, and entities with a type that is not dash-case, an empty id or an id longer\n * than 64 characters are dropped because a truncated id would point at another entity.\n */\nexport function normalizeNhAssistantClientContext(value: unknown): ClientContext | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const route = typeof value['route'] === 'string' ? value['route'].trim() : '';\n if (route.length === 0) {\n return null;\n }\n\n const result: ClientContext = { route: truncate(route, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.route) };\n\n const title = typeof value['title'] === 'string' ? value['title'].trim() : '';\n if (title.length > 0) {\n result.title = truncate(title, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.title);\n }\n\n if (Array.isArray(value['entities'])) {\n const entities = value['entities']\n .map(normalizeEntity)\n .filter((entity): entity is ClientContextEntity => entity !== null)\n .slice(0, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.entities);\n if (entities.length > 0) {\n result.entities = entities;\n }\n }\n\n return result;\n}\n\n/** Short text for the page-context chip: the first entity's label, the title or the route. */\nexport function describeNhAssistantClientContext(context: ClientContext): string {\n const entity = context.entities?.[0];\n if (entity) {\n return entity.label ?? `${entity.type} ${entity.id}`;\n }\n\n return context.title ?? context.route;\n}\n\nfunction normalizeEntity(value: unknown): ClientContextEntity | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const type = typeof value['type'] === 'string' ? value['type'].trim() : '';\n const id = typeof value['id'] === 'string' ? value['id'].trim() : '';\n if (!dashCase.test(type) || id.length === 0 || id.length > NH_ASSISTANT_PAGE_CONTEXT_LIMITS.entityId) {\n return null;\n }\n\n const entity: ClientContextEntity = { type, id };\n const label = typeof value['label'] === 'string' ? value['label'].trim() : '';\n if (label.length > 0) {\n entity.label = truncate(label, NH_ASSISTANT_PAGE_CONTEXT_LIMITS.entityLabel);\n }\n return entity;\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : value.slice(0, max);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import { EnvironmentInjector, Injectable, inject, runInInjectionContext } from '@angular/core';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\n\ninterface AssistantUiState {\n agentId: string | null;\n conversationId: string | null;\n panelOpen: boolean;\n}\n\nconst emptyState: AssistantUiState = { agentId: null, conversationId: null, panelOpen: false };\nconst storagePrefix = 'nh-assistant-ui:v1:';\n\n/** Browser-only UI pointers. Messages, drafts, tokens and page context are never stored. */\n@Injectable()\nexport class NhAssistantUiState {\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly injector = inject(EnvironmentInjector);\n private key: string | null = null;\n private state: AssistantUiState = { ...emptyState };\n private activated = false;\n private activationRevision = 0;\n\n async activate(): Promise<{ changed: boolean; state: Readonly<AssistantUiState> }> {\n const revision = ++this.activationRevision;\n let scope: string | null = null;\n try {\n scope = await runInInjectionContext(this.injector, () => this.config.getStateScope?.() ?? null);\n } catch {\n scope = null;\n }\n\n if (revision !== this.activationRevision) {\n return { changed: false, state: this.state };\n }\n\n const normalized = typeof scope === 'string' ? scope.trim() : '';\n const key = normalized.length > 0 && normalized.length <= 256\n ? `${storagePrefix}${encodeURIComponent(this.config.apiBaseUrl)}:${encodeURIComponent(normalized)}`\n : null;\n if (this.activated && key === this.key) {\n return { changed: false, state: this.state };\n }\n\n this.activated = true;\n this.key = key;\n this.state = this.read();\n return { changed: true, state: this.state };\n }\n\n deactivate(): void {\n this.activationRevision++;\n this.activated = false;\n this.key = null;\n this.state = { ...emptyState };\n }\n\n update(patch: Partial<AssistantUiState>): void {\n this.state = { ...this.state, ...patch };\n if (!this.key) {\n return;\n }\n\n try {\n globalThis.localStorage?.setItem(this.key, JSON.stringify(this.state));\n } catch {\n // Storage can be unavailable or full; the live assistant remains usable.\n }\n }\n\n private read(): AssistantUiState {\n if (!this.key) {\n return { ...emptyState };\n }\n\n try {\n const raw = globalThis.localStorage?.getItem(this.key);\n const value: unknown = raw ? JSON.parse(raw) : null;\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { ...emptyState };\n }\n\n const saved = value as Record<string, unknown>;\n return {\n agentId: validId(saved['agentId']),\n conversationId: validId(saved['conversationId']),\n panelOpen: saved['panelOpen'] === true\n };\n } catch {\n return { ...emptyState };\n }\n }\n}\n\nfunction validId(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 && value.length <= 256 ? value : null;\n}\n","import { DestroyRef, EnvironmentInjector, Injectable, computed, inject, runInInjectionContext, signal } from '@angular/core';\nimport { Observable, Subscription, firstValueFrom, isObservable } from 'rxjs';\nimport {\n AgentSummary,\n ApprovalDecision,\n AssistantStatus,\n ClientContext,\n Conversation,\n ConversationSummary\n} from '../models/assistant-api.models';\nimport { NhAssistantClientErrorCodes, NhAssistantSseEvent, TurnUsage } from '../models/assistant-sse.models';\nimport { NH_ASSISTANT_ACCESS_POLICY, NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantApiError, NhAssistantApiService, nhAssistantErrorMessageKey } from './nh-assistant-api.service';\nimport { applyNhAssistantApprovalDecision, applyNhAssistantEvent, nhAssistantLatestTurnHasText } from './nh-assistant-reducer';\nimport { normalizeNhAssistantClientContext } from './nh-assistant-page-context';\nimport { NhAssistantUiState } from './nh-assistant-ui-state';\n\n/** A user-facing assistant failure: a stable code and a translation key, never raw server text. */\nexport interface NhAssistantError {\n code: string;\n messageKey: string;\n}\n\n/**\n * A non-blocking remark about a turn that completed normally, for example a limit that cut the\n * answer short. The conversation stays usable; the notice only explains the answer.\n */\nexport type NhAssistantNotice = NhAssistantError;\n\n/** Notice code for a completed turn that produced no answer text and no server code. */\nexport const NH_ASSISTANT_NO_ANSWER_NOTICE_CODE = 'assistant-no-answer';\n\nconst conversationPageSize = 50;\nconst cancelGracePeriodMs = 5_000;\n\n/**\n * Signal-based state of one assistant scope: availability, agents, the conversation list\n * and the active conversation with its streamed turn.\n */\n@Injectable()\nexport class NhAssistantStore {\n private readonly api = inject(NhAssistantApiService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly injector = inject(EnvironmentInjector);\n private readonly accessPolicy = inject(NH_ASSISTANT_ACCESS_POLICY);\n private readonly uiState = inject(NhAssistantUiState);\n\n private readonly accessGrantedState = signal<boolean | null>(null);\n private readonly statusState = signal<AssistantStatus | null>(null);\n private readonly statusLoadingState = signal(false);\n private readonly selectedAgentIdState = signal<string | null>(null);\n private readonly conversationsState = signal<ConversationSummary[]>([]);\n private readonly conversationsTotalState = signal(0);\n private readonly conversationsLoadingState = signal(false);\n private readonly activeConversationState = signal<Conversation | null>(null);\n private readonly conversationLoadingState = signal(false);\n private readonly streamingState = signal(false);\n private readonly decidingState = signal(false);\n private readonly errorState = signal<NhAssistantError | null>(null);\n private readonly noticeState = signal<NhAssistantNotice | null>(null);\n private readonly lastUsageState = signal<TurnUsage | null>(null);\n private readonly restoredDraftState = signal<string | null>(null);\n private readonly pageContextState = signal<ClientContext | null>(null);\n private readonly pageContextExcludedState = signal(false);\n private readonly restorePanelOpenState = signal(false);\n\n private accessSubscription?: Subscription;\n private streamSubscription?: Subscription;\n private cancelTimer?: ReturnType<typeof setTimeout>;\n private initialization?: Promise<void>;\n private statusRevision = 0;\n private accountRevision = 0;\n private pendingSendResolve?: (accepted: boolean) => void;\n\n /** True when the access policy allows the user and the server reports the assistant as enabled. */\n readonly enabled = computed(() => this.accessGrantedState() === true && this.statusState()?.enabled === true);\n readonly accessGranted = this.accessGrantedState.asReadonly();\n /** True when the assistant is enabled and the server reports that the caller passes the admin policy. */\n readonly canAdminister = computed(() => this.enabled() && this.statusState()?.canAdminister === true);\n readonly statusLoading = this.statusLoadingState.asReadonly();\n readonly limits = computed(() => this.statusState()?.limits ?? null);\n readonly agents = computed<AgentSummary[]>(() => this.statusState()?.agents ?? []);\n readonly selectedAgentId = this.selectedAgentIdState.asReadonly();\n readonly selectedAgent = computed(() =>\n this.agents().find(agent => agent.id === this.selectedAgentIdState()) ?? null\n );\n readonly conversations = this.conversationsState.asReadonly();\n readonly conversationsTotal = this.conversationsTotalState.asReadonly();\n readonly conversationsLoading = this.conversationsLoadingState.asReadonly();\n readonly activeConversation = this.activeConversationState.asReadonly();\n readonly conversationLoading = this.conversationLoadingState.asReadonly();\n readonly streaming = this.streamingState.asReadonly();\n readonly pendingApproval = computed(() => this.activeConversationState()?.pendingApproval ?? null);\n readonly deciding = this.decidingState.asReadonly();\n readonly error = this.errorState.asReadonly();\n /** Non-blocking remark about the latest completed turn; shown only while no error is shown. */\n readonly notice = this.noticeState.asReadonly();\n readonly lastUsage = this.lastUsageState.asReadonly();\n /** Text of a message the server did not accept, so the composer can offer it again. */\n readonly restoredDraft = this.restoredDraftState.asReadonly();\n /** Page context that the next message would send, for the transparency chip. */\n readonly pageContext = this.pageContextState.asReadonly();\n /** True when the user left the page context out of the next message. */\n readonly pageContextExcluded = this.pageContextExcludedState.asReadonly();\n /** Whether the drawer was open when this account last left the application. */\n readonly restorePanelOpen = this.restorePanelOpenState.asReadonly();\n /** True while the user can send: enabled, an agent is chosen and no turn runs or waits. */\n readonly canSend = computed(() => {\n const conversation = this.activeConversationState();\n const blocked = conversation !== null && conversation.status !== 'idle';\n return this.enabled() && this.selectedAgentIdState() !== null && !this.streamingState() && !this.conversationLoadingState() && !blocked;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.accessSubscription?.unsubscribe();\n this.streamSubscription?.unsubscribe();\n clearTimeout(this.cancelTimer);\n });\n }\n\n /** Evaluates the access policy and loads the server status once. Safe to call repeatedly. */\n initialize(): Promise<void> {\n this.initialization ??= this.startInitialization();\n return this.initialization;\n }\n\n /** Reloads the server status, for example after the host changed the signed-in user. */\n async reloadStatus(): Promise<void> {\n const revision = ++this.statusRevision;\n if (this.accessGrantedState() !== true) {\n this.accountRevision++;\n this.stopLocalTurn();\n this.statusState.set(null);\n this.activeConversationState.set(null);\n this.selectedAgentIdState.set(null);\n this.conversationsState.set([]);\n this.conversationsTotalState.set(0);\n this.conversationLoadingState.set(false);\n this.conversationsLoadingState.set(false);\n this.pageContextState.set(null);\n this.pageContextExcludedState.set(false);\n this.restoredDraftState.set(null);\n this.errorState.set(null);\n this.noticeState.set(null);\n this.lastUsageState.set(null);\n this.restorePanelOpenState.set(false);\n this.uiState.deactivate();\n return;\n }\n\n this.statusLoadingState.set(true);\n try {\n const restored = await this.uiState.activate();\n if (revision !== this.statusRevision) {\n return;\n }\n if (restored.changed) {\n this.accountRevision++;\n this.stopLocalTurn();\n this.statusState.set(null);\n this.activeConversationState.set(null);\n this.conversationsState.set([]);\n this.conversationsTotalState.set(0);\n this.conversationLoadingState.set(false);\n this.conversationsLoadingState.set(false);\n this.pageContextState.set(null);\n this.pageContextExcludedState.set(false);\n this.restoredDraftState.set(null);\n this.errorState.set(null);\n this.noticeState.set(null);\n this.lastUsageState.set(null);\n this.selectedAgentIdState.set(restored.state.agentId);\n this.restorePanelOpenState.set(restored.state.panelOpen);\n }\n\n const status = await firstValueFrom(this.api.status());\n if (revision !== this.statusRevision) {\n return;\n }\n this.statusState.set(status);\n if (status.enabled) {\n this.selectInitialAgent(status.agents);\n if (!this.activeConversationState() && restored.state.conversationId) {\n await this.loadConversation(restored.state.conversationId, true);\n }\n }\n } catch {\n // An unavailable assistant endpoint hides the assistant instead of showing an error.\n if (revision === this.statusRevision) {\n this.statusState.set(null);\n }\n } finally {\n if (revision === this.statusRevision) {\n this.statusLoadingState.set(false);\n }\n }\n }\n\n async refreshConversations(): Promise<void> {\n if (!this.enabled()) {\n return;\n }\n\n const revision = this.accountRevision;\n this.conversationsLoadingState.set(true);\n try {\n const page = await firstValueFrom(this.api.listConversations(1, conversationPageSize));\n if (revision === this.accountRevision) {\n this.conversationsState.set(page.items);\n this.conversationsTotalState.set(page.total);\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.conversationsLoadingState.set(false);\n }\n }\n }\n\n /** Chooses the agent for the next new conversation. Switching away from the active conversation's agent starts a new one. */\n selectAgent(agentId: string): void {\n if (!this.agents().some(agent => agent.id === agentId)) {\n return;\n }\n\n this.selectedAgentIdState.set(agentId);\n this.uiState.update({ agentId });\n const active = this.activeConversationState();\n if (active && active.agentId !== agentId && !this.streamingState()) {\n this.startNewConversation();\n }\n }\n\n /** Leaves the active conversation; the next message creates a new one. */\n startNewConversation(): void {\n if (this.streamingState()) {\n return;\n }\n\n this.activeConversationState.set(null);\n this.uiState.update({ conversationId: null });\n this.errorState.set(null);\n this.noticeState.set(null);\n this.lastUsageState.set(null);\n }\n\n async openConversation(conversationId: string): Promise<void> {\n await this.loadConversation(conversationId, false);\n }\n\n private async loadConversation(conversationId: string, restoring: boolean): Promise<void> {\n if (this.streamingState() || this.activeConversationState()?.id === conversationId) {\n return;\n }\n\n const revision = this.accountRevision;\n this.conversationLoadingState.set(true);\n this.errorState.set(null);\n this.noticeState.set(null);\n try {\n const conversation = await firstValueFrom(this.api.getConversation(conversationId));\n if (revision !== this.accountRevision) {\n return;\n }\n if (!this.agents().some(agent => agent.id === conversation.agentId)) {\n this.uiState.update({ conversationId: null });\n return;\n }\n this.activeConversationState.set(conversation);\n this.selectedAgentIdState.set(conversation.agentId);\n this.uiState.update({ conversationId, agentId: conversation.agentId });\n } catch (error) {\n if (revision !== this.accountRevision) {\n return;\n }\n if (error instanceof NhAssistantApiError && (error.status === 403 || error.status === 404)) {\n this.uiState.update({ conversationId: null });\n }\n if (!restoring) {\n this.setError(error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.conversationLoadingState.set(false);\n }\n }\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n if (this.streamingState() && this.activeConversationState()?.id === conversationId) {\n return;\n }\n\n const revision = this.accountRevision;\n try {\n await firstValueFrom(this.api.deleteConversation(conversationId), { defaultValue: undefined });\n if (revision !== this.accountRevision) {\n return;\n }\n this.conversationsState.update(items => items.filter(item => item.id !== conversationId));\n this.conversationsTotalState.update(total => Math.max(0, total - 1));\n if (this.activeConversationState()?.id === conversationId) {\n this.activeConversationState.set(null);\n this.noticeState.set(null);\n this.uiState.update({ conversationId: null });\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n }\n }\n\n /**\n * Sends a user message. Creates a conversation with the selected agent when none is\n * active, shows the message optimistically and applies the streamed events.\n * Resolves `false` when the message was not accepted.\n */\n async send(text: string): Promise<boolean> {\n const trimmed = text.trim();\n await this.initialize();\n await this.reloadStatus();\n const maxChars = this.limits()?.maxMessageChars ?? Number.MAX_SAFE_INTEGER;\n if (trimmed.length === 0 || trimmed.length > maxChars || !this.canSend()) {\n return false;\n }\n\n this.errorState.set(null);\n\n this.noticeState.set(null);\n this.restoredDraftState.set(null);\n this.streamingState.set(true);\n const accountRevision = this.accountRevision;\n\n let conversation = this.activeConversationState();\n if (!conversation) {\n conversation = await this.createConversation();\n if (!conversation) {\n if (accountRevision === this.accountRevision) {\n this.streamingState.set(false);\n this.restoredDraftState.set(text);\n }\n return false;\n }\n }\n\n const clientContext = await this.contextForMessage();\n if (accountRevision !== this.accountRevision) {\n return false;\n }\n const clientMessageId = createClientMessageId();\n const previousStatus = conversation.status;\n this.activeConversationState.set({\n ...conversation,\n status: 'running',\n messages: [\n ...conversation.messages,\n { id: clientMessageId, role: 'user', createdAt: new Date().toISOString(), parts: [{ type: 'text', text: trimmed }] }\n ]\n });\n\n const conversationId = conversation.id;\n return new Promise<boolean>(resolve => {\n this.pendingSendResolve = resolve;\n let started = false;\n let failedAfterStart = false;\n\n this.runStream(this.api.sendMessage(conversationId, {\n text: trimmed,\n clientMessageId,\n ...(clientContext === undefined ? {} : { clientContext })\n }), {\n next: event => {\n if (event.type === 'error' && !started) {\n this.removeMessage(clientMessageId, previousStatus);\n this.restoredDraftState.set(text);\n this.errorState.set(event.data);\n resolve(false);\n return;\n }\n\n if (event.type === 'turn.started') {\n started = true;\n resolve(true);\n }\n if (event.type === 'error') {\n failedAfterStart = true;\n }\n\n this.applyEvent(event, clientMessageId);\n },\n complete: () => {\n this.pendingSendResolve = undefined;\n resolve(started);\n this.afterTurn(conversationId, failedAfterStart);\n }\n });\n });\n }\n\n /** Approves or rejects the pending approval. Ignores repeated calls while a decision is in flight. */\n decide(decision: ApprovalDecision, reason?: string): void {\n const conversation = this.activeConversationState();\n const approval = conversation?.pendingApproval ?? null;\n if (!conversation || !approval || this.decidingState() || this.streamingState()) {\n return;\n }\n\n this.decidingState.set(true);\n this.streamingState.set(true);\n this.errorState.set(null);\n this.noticeState.set(null);\n\n let accepted = false;\n let failed = false;\n const request = { decision, expectedProposalHash: approval.proposalHash, ...(reason ? { reason } : {}) };\n\n this.runStream(this.api.decideApproval(conversation.id, approval.approvalId, request), {\n next: event => {\n if (!accepted && event.type !== 'error') {\n accepted = true;\n this.updateActive(current => applyNhAssistantApprovalDecision(current, approval.approvalId, decision));\n }\n if (event.type === 'error') {\n failed = true;\n if (!accepted) {\n this.errorState.set(event.data);\n return;\n }\n }\n\n this.applyEvent(event);\n },\n complete: () => {\n this.decidingState.set(false);\n this.afterTurn(conversation.id, failed);\n }\n });\n }\n\n /** Asks the server to stop the running turn or to abandon a waiting approval. */\n async cancel(): Promise<void> {\n const conversation = this.activeConversationState();\n if (!conversation || (conversation.status === 'idle' && !this.streamingState())) {\n return;\n }\n\n const revision = this.accountRevision;\n try {\n await firstValueFrom(this.api.cancel(conversation.id), { defaultValue: undefined });\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n return;\n }\n\n if (revision !== this.accountRevision) {\n return;\n }\n\n if (!this.streamingState()) {\n await this.reloadActiveConversation(conversation.id);\n return;\n }\n\n // The server ends the stream with turn.completed(cancelled); stop waiting if it does not.\n clearTimeout(this.cancelTimer);\n this.cancelTimer = setTimeout(() => {\n if (this.streamingState()) {\n this.streamSubscription?.unsubscribe();\n this.streamingState.set(false);\n this.decidingState.set(false);\n void this.reloadActiveConversation(conversation.id);\n }\n }, cancelGracePeriodMs);\n }\n\n clearError(): void {\n this.errorState.set(null);\n }\n\n clearNotice(): void {\n this.noticeState.set(null);\n }\n\n /** Persists only drawer visibility, never the page context or a message draft. */\n setPanelOpen(open: boolean): void {\n this.restorePanelOpenState.set(open);\n this.uiState.update({ panelOpen: open });\n }\n\n /** Reads the host's page context again so the chip shows what the next message sends. */\n async refreshPageContext(): Promise<void> {\n const revision = this.accountRevision;\n const context = await this.readPageContext();\n if (revision === this.accountRevision) {\n this.pageContextState.set(context ?? null);\n }\n }\n\n /** Leaves the page context out of the next message only, or includes it again. */\n setPageContextExcluded(excluded: boolean): void {\n this.pageContextExcludedState.set(excluded);\n }\n\n /** Returns and clears the draft of a message that was not accepted. */\n consumeRestoredDraft(): string | null {\n const draft = this.restoredDraftState();\n this.restoredDraftState.set(null);\n return draft;\n }\n\n /**\n * Page context for one message: `undefined` omits the field (no getter, getter failed or\n * invalid shape), `null` sends an explicit \"none\" (no context or left out by the user).\n */\n private async contextForMessage(): Promise<ClientContext | null | undefined> {\n if (!this.config.getPageContext) {\n return undefined;\n }\n\n if (this.pageContextExcludedState()) {\n this.pageContextExcludedState.set(false);\n return null;\n }\n\n const revision = this.accountRevision;\n const context = await this.readPageContext();\n if (revision === this.accountRevision) {\n this.pageContextState.set(context ?? null);\n }\n return context;\n }\n\n private async readPageContext(): Promise<ClientContext | null | undefined> {\n const getter = this.config.getPageContext;\n if (!getter) {\n return undefined;\n }\n\n try {\n const value = await runInInjectionContext(this.injector, () => getter());\n if (value === null || value === undefined) {\n return null;\n }\n return normalizeNhAssistantClientContext(value) ?? undefined;\n } catch {\n // A failing host getter never blocks sending; the message goes without page context.\n return undefined;\n }\n }\n\n private async startInitialization(): Promise<void> {\n const decision = this.accessPolicy.canUse();\n if (!isObservable(decision)) {\n this.accessGrantedState.set(decision);\n await this.reloadStatus();\n return;\n }\n\n await new Promise<void>(resolve => {\n this.accessSubscription = (decision as Observable<boolean>).subscribe({\n next: granted => {\n this.accessGrantedState.set(granted);\n void this.reloadStatus().finally(() => resolve());\n },\n error: () => {\n this.accessGrantedState.set(false);\n resolve();\n },\n complete: () => resolve()\n });\n });\n }\n\n private async createConversation(): Promise<Conversation | null> {\n const agentId = this.selectedAgentIdState();\n if (!agentId) {\n return null;\n }\n\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.createConversation({ agentId }));\n if (revision !== this.accountRevision) {\n return null;\n }\n this.activeConversationState.set(conversation);\n this.uiState.update({ conversationId: conversation.id });\n this.conversationsState.update(items => [toSummary(conversation), ...items.filter(item => item.id !== conversation.id)]);\n this.conversationsTotalState.update(total => total + 1);\n return conversation;\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(error);\n }\n return null;\n }\n }\n\n private runStream(\n stream: Observable<NhAssistantSseEvent>,\n handlers: { next: (event: NhAssistantSseEvent) => void; complete: () => void }\n ): void {\n this.streamSubscription?.unsubscribe();\n this.streamingState.set(true);\n\n const finish = () => {\n clearTimeout(this.cancelTimer);\n this.streamingState.set(false);\n handlers.complete();\n };\n\n this.streamSubscription = stream.subscribe({\n next: event => handlers.next(event),\n error: () => {\n this.errorState.set(clientError(NhAssistantClientErrorCodes.network));\n finish();\n },\n complete: finish\n });\n }\n\n private stopLocalTurn(): void {\n this.streamSubscription?.unsubscribe();\n this.pendingSendResolve?.(false);\n this.pendingSendResolve = undefined;\n clearTimeout(this.cancelTimer);\n this.streamingState.set(false);\n this.decidingState.set(false);\n }\n\n private applyEvent(event: NhAssistantSseEvent, clientMessageId?: string): void {\n this.updateActive(conversation => applyNhAssistantEvent(conversation, event, clientMessageId));\n\n if (event.type === 'error') {\n this.errorState.set(event.data);\n }\n if (event.type === 'turn.completed') {\n this.lastUsageState.set(event.data.usage);\n if (event.data.status === 'failed') {\n const code = event.data.errorCode ?? NhAssistantClientErrorCodes.server;\n this.errorState.set(clientError(code));\n } else if (event.data.status === 'completed') {\n this.noticeState.set(this.completionNotice(event.data.errorCode));\n }\n }\n }\n\n /** A completed turn with a server code, or without any answer text, explains itself with a notice. */\n private completionNotice(errorCode: string | null): NhAssistantNotice | null {\n if (errorCode) {\n return clientError(errorCode);\n }\n const conversation = this.activeConversationState();\n if (conversation && !nhAssistantLatestTurnHasText(conversation)) {\n return { code: NH_ASSISTANT_NO_ANSWER_NOTICE_CODE, messageKey: 'nh-assistant.notices.no-answer' };\n }\n\n return null;\n }\n\n private afterTurn(conversationId: string, reload: boolean): void {\n const active = this.activeConversationState();\n if (active?.id === conversationId) {\n this.conversationsState.update(items => items.map(item =>\n item.id === conversationId ? { ...item, status: active.status, updatedAt: new Date().toISOString() } : item\n ));\n }\n\n if (reload) {\n void this.reloadActiveConversation(conversationId);\n }\n if (!active?.title) {\n void this.refreshConversations();\n }\n }\n\n private async reloadActiveConversation(conversationId: string): Promise<void> {\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.getConversation(conversationId));\n if (revision === this.accountRevision && this.activeConversationState()?.id === conversationId && !this.streamingState()) {\n this.activeConversationState.set(conversation);\n }\n } catch {\n // Keep the local state; the error of the turn is already shown.\n }\n }\n\n private updateActive(update: (conversation: Conversation) => Conversation): void {\n const conversation = this.activeConversationState();\n if (conversation) {\n this.activeConversationState.set(update(conversation));\n }\n }\n\n private removeMessage(messageId: string, status: Conversation['status']): void {\n this.updateActive(conversation => ({\n ...conversation,\n status,\n messages: conversation.messages.filter(message => message.id !== messageId)\n }));\n }\n\n private selectInitialAgent(agents: AgentSummary[]): void {\n const current = this.selectedAgentIdState();\n if (current && agents.some(agent => agent.id === current)) {\n return;\n }\n\n const preferred = agents.find(agent => agent.id === this.config.defaultAgentId) ?? agents[0] ?? null;\n this.selectedAgentIdState.set(preferred?.id ?? null);\n this.uiState.update({ agentId: preferred?.id ?? null });\n }\n\n private setError(error: unknown): void {\n if (error instanceof NhAssistantApiError) {\n this.errorState.set({ code: error.code, messageKey: error.messageKey });\n return;\n }\n\n this.errorState.set(clientError(NhAssistantClientErrorCodes.server));\n }\n}\n\nfunction clientError(code: string): NhAssistantError {\n return { code, messageKey: nhAssistantErrorMessageKey(code) };\n}\n\nfunction toSummary(conversation: Conversation): ConversationSummary {\n return {\n id: conversation.id,\n agentId: conversation.agentId,\n title: conversation.title,\n status: conversation.status,\n createdAt: conversation.createdAt,\n updatedAt: conversation.updatedAt\n };\n}\n\nfunction createClientMessageId(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (cryptoApi?.getRandomValues) {\n cryptoApi.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index++) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Injectable, Injector, Signal, afterNextRender, effect, inject, signal, untracked } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { NhAssistantStore } from './nh-assistant.store';\n\n/** Drawer width on wider screens; below the mobile breakpoint the panel fills the screen. */\nexport const NH_ASSISTANT_PANEL_WIDTH = '420px';\nexport const NH_ASSISTANT_PANEL_MOBILE_QUERY = '(max-width: 599.98px)';\n\n/**\n * Opens and closes the assistant panel as a CDK overlay drawer on the right edge.\n * `nh-assistant-panel` registers its content once; any component can then open the panel,\n * optionally on a specific conversation. Escape closes the panel and focus returns to the\n * element that opened it.\n */\n@Injectable()\nexport class NhAssistantPanelService {\n private readonly overlay = inject(Overlay);\n private readonly store = inject(NhAssistantStore);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly breakpoints = inject(BreakpointObserver);\n\n private readonly openState = signal(false);\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n private subscriptions = new Subscription();\n private returnFocusTo: HTMLElement | null = null;\n\n readonly isOpen: Signal<boolean> = this.openState.asReadonly();\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.dispose());\n effect(() => {\n if (this.store.enabled() && this.store.restorePanelOpen() && this.portal && !this.openState()) {\n untracked(() => queueMicrotask(() => {\n if (this.portal && this.store.enabled() && this.store.restorePanelOpen() && !this.openState()) {\n this.showPanel();\n }\n }));\n }\n });\n }\n\n open(conversationId?: string): void {\n if (this.openState() && !conversationId) {\n return;\n }\n\n this.showPanel();\n void this.store.initialize().then(() => this.store.reloadStatus()).then(() => {\n if (this.openState()) {\n this.store.setPanelOpen(true);\n }\n if (conversationId) {\n void this.store.openConversation(conversationId);\n }\n });\n }\n\n private showPanel(): void {\n if (this.openState()) {\n return;\n }\n\n const active = this.document.activeElement;\n this.returnFocusTo = active instanceof HTMLElement ? active : null;\n this.openState.set(true);\n this.attach();\n }\n\n close(): void {\n if (!this.openState()) {\n return;\n }\n\n this.openState.set(false);\n this.store.setPanelOpen(false);\n this.overlayRef?.detach();\n\n const target = this.returnFocusTo;\n this.returnFocusTo = null;\n if (target?.isConnected) {\n target.focus();\n }\n }\n\n toggle(): void {\n if (this.openState()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /** Called by `nh-assistant-panel`; hosts should place that component once instead. */\n registerPanel(portal: TemplatePortal): void {\n this.portal = portal;\n if (this.openState()) {\n this.attach();\n } else {\n void this.store.initialize().then(() => {\n if (this.portal === portal && this.store.enabled() && this.store.restorePanelOpen()) {\n this.showPanel();\n }\n });\n }\n }\n\n unregisterPanel(portal: TemplatePortal): void {\n if (this.portal !== portal) {\n return;\n }\n\n this.overlayRef?.detach();\n this.portal = undefined;\n }\n\n private attach(): void {\n if (!this.portal || this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.ensureOverlay();\n overlayRef.attach(this.portal);\n this.updateSize(this.breakpoints.isMatched(NH_ASSISTANT_PANEL_MOBILE_QUERY));\n\n afterNextRender(() => {\n const target = overlayRef.overlayElement.querySelector<HTMLElement>('[data-nh-assistant-autofocus]');\n target?.focus();\n }, { injector: this.injector });\n }\n\n private ensureOverlay(): OverlayRef {\n if (this.overlayRef) {\n return this.overlayRef;\n }\n\n const overlayRef = this.overlay.create({\n positionStrategy: this.overlay.position().global().top('0').right('0'),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: 'nh-assistant-overlay-pane',\n height: '100%',\n width: NH_ASSISTANT_PANEL_WIDTH,\n maxWidth: '100vw'\n });\n\n this.subscriptions.add(overlayRef.keydownEvents().subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }));\n this.subscriptions.add(this.breakpoints.observe(NH_ASSISTANT_PANEL_MOBILE_QUERY).subscribe(state => {\n this.updateSize(state.matches);\n }));\n\n this.overlayRef = overlayRef;\n return overlayRef;\n }\n\n private updateSize(mobile: boolean): void {\n this.overlayRef?.updateSize({ width: mobile ? '100vw' : NH_ASSISTANT_PANEL_WIDTH, height: '100%' });\n }\n\n private dispose(): void {\n this.subscriptions.unsubscribe();\n this.overlayRef?.dispose();\n this.overlayRef = undefined;\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';\nimport { NhAssistantTranslationMerger } from './i18n/nh-assistant-translations';\nimport {\n NH_ASSISTANT_ACCESS_POLICY,\n NH_ASSISTANT_CONFIG,\n NhAssistantAllowAllAccessPolicy,\n NhAssistantConfig\n} from './nh-assistant.config';\nimport { NhAssistantAdminApiService } from './services/nh-assistant-admin-api.service';\nimport { NhAssistantApiService } from './services/nh-assistant-api.service';\nimport { NhAssistantPanelService } from './services/nh-assistant-panel.service';\nimport { NhAssistantStore } from './services/nh-assistant.store';\nimport { NhAssistantUiState } from './services/nh-assistant-ui-state';\nimport { NhAssistantTransport } from './services/nh-assistant-transport';\n\n/**\n * Registers the assistant client, store and panel for one application or route scope.\n * Call it once in the root providers; a route may call it again to host an isolated\n * assistant with its own configuration.\n */\nexport function provideNhAssistant(config: NhAssistantConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NH_ASSISTANT_CONFIG, useValue: config },\n { provide: NH_ASSISTANT_ACCESS_POLICY, useClass: config.accessPolicy ?? NhAssistantAllowAllAccessPolicy },\n NhAssistantTransport,\n NhAssistantApiService,\n NhAssistantAdminApiService,\n NhAssistantStore,\n NhAssistantUiState,\n NhAssistantPanelService,\n ...(config.translations === 'host'\n ? []\n : [provideEnvironmentInitializer(() => inject(NhAssistantTranslationMerger).start())])\n ]);\n}\n","import { ChangeDetectionStrategy, Component, InjectionToken, computed, inject, input } from '@angular/core';\n\nexport type NhAssistantIconName =\n | 'assistant'\n | 'close'\n | 'send'\n | 'stop'\n | 'plus'\n | 'list'\n | 'trash'\n | 'tool'\n | 'check'\n | 'x'\n | 'warning'\n | 'chevron-down'\n | 'clock'\n | 'settings'\n | 'admin'\n | 'edit'\n | 'refresh'\n | 'link'\n | 'page';\n\n/**\n * Optional icon classes of the host's icon library, for example `{ close: 'ph ph-x' }`.\n * Icons without a class use the library's small built-in outline glyphs.\n */\nexport const NH_ASSISTANT_ICONS = new InjectionToken<Partial<Record<NhAssistantIconName, string>>>('NH_ASSISTANT_ICONS');\n\nconst builtInPaths: Record<NhAssistantIconName, string> = {\n assistant: 'M12 3l1.8 4.7 4.7 1.8-4.7 1.8L12 16l-1.8-4.7-4.7-1.8 4.7-1.8zM18.5 15l.8 2 2 .8-2 .8-.8 2-.8-2-2-.8 2-.8z',\n close: 'M6 6l12 12M18 6L6 18',\n send: 'M4 12l16-8-6 16-2.5-6.5zM11.5 13.5L20 4',\n stop: 'M7 7h10v10H7z',\n plus: 'M12 5v14M5 12h14',\n list: 'M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01',\n trash: 'M4 7h16M10 11v6M14 11v6M6 7l1 13h10l1-13M9 7V4h6v3',\n tool: 'M14.7 6.3a4 4 0 0 0-5.4 5.4L4 17l3 3 5.3-5.3a4 4 0 0 0 5.4-5.4l-2.5 2.5-2.1-.4-.4-2.1z',\n check: 'M5 12.5l4.5 4.5L19 7.5',\n x: 'M7 7l10 10M17 7L7 17',\n warning: 'M12 4L2.5 20h19zM12 10v4M12 17h.01',\n 'chevron-down': 'M6 9l6 6 6-6',\n clock: 'M12 3a9 9 0 1 0 0 18 9 9 0 1 0 0-18zM12 7v5l3 2',\n settings: 'M4 7h9M17 7h3M4 17h3M11 17h9M15 5v4M9 15v4',\n admin: 'M12 3l7 3v5c0 4.5-3 8.2-7 10-4-1.8-7-5.5-7-10V6zM9.5 12l2 2 3.5-3.5',\n edit: 'M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4',\n refresh: 'M20 11a8 8 0 0 0-14.3-4.9L4 8M4 4v4h4M4 13a8 8 0 0 0 14.3 4.9L20 16M20 20v-4h-4',\n link: 'M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1',\n page: 'M6 3h8l4 4v14H6zM14 3v4h4M9 12h6M9 16h6'\n};\n\n/** Decorative icon. The surrounding control provides the accessible name. */\n@Component({\n selector: 'nh-assistant-icon',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (iconClass(); as iconClass) {\n <i [class]=\"iconClass\" aria-hidden=\"true\"></i>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" aria-hidden=\"true\" focusable=\"false\">\n <path [attr.d]=\"path()\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n `,\n styles: [`\n :host { display: inline-flex; align-items: center; justify-content: center; line-height: 1; font-size: 1.15em; }\n svg { display: block; }\n `]\n})\nexport class NhAssistantIconComponent {\n private readonly icons = inject(NH_ASSISTANT_ICONS, { optional: true });\n\n readonly name = input.required<NhAssistantIconName>();\n readonly iconClass = computed(() => this.icons?.[this.name()] ?? null);\n readonly path = computed(() => builtInPaths[this.name()]);\n}\n","import { ChangeDetectionStrategy, Component, afterNextRender, computed, effect, inject, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantPanelService } from '../../services/nh-assistant-panel.service';\nimport { NhAssistantStore } from '../../services/nh-assistant.store';\n\n/**\n * Header button that opens the assistant panel. It renders nothing while the assistant is\n * disabled on the server or the access policy denies the user. A badge marks a conversation\n * that waits for approval. Projected content replaces the default icon.\n */\n@Component({\n selector: 'nh-assistant-launcher',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (store.enabled()) {\n <button\n class=\"launcher\"\n type=\"button\"\n [class.open]=\"panel.isOpen()\"\n [attr.aria-expanded]=\"panel.isOpen()\"\n [attr.aria-label]=\"label() | translate\"\n [attr.title]=\"label() | translate\"\n (click)=\"panel.toggle()\">\n <ng-content><nh-assistant-icon name=\"assistant\" /></ng-content>\n @if (waitingForApproval()) {\n <span class=\"badge\" aria-hidden=\"true\"></span>\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.pending-approval' | translate }}</span>\n }\n </button>\n }\n `,\n styleUrl: './nh-assistant-launcher.component.scss'\n})\nexport class NhAssistantLauncherComponent {\n readonly store = inject(NhAssistantStore);\n readonly panel = inject(NhAssistantPanelService);\n\n readonly waitingForApproval = computed(() =>\n this.store.pendingApproval() !== null ||\n this.store.conversations().some(conversation => conversation.status === 'waiting-for-approval')\n );\n readonly label = computed(() => this.panel.isOpen() ? 'nh-assistant.launcher.close' : 'nh-assistant.launcher.open');\n\n constructor() {\n // Browser only: the status request and access policy need the signed-in user.\n afterNextRender(() => {\n void this.store.initialize();\n });\n\n effect(() => {\n if (this.store.enabled()) {\n untracked(() => void this.store.refreshConversations());\n }\n });\n }\n}\n","import { ChangeDetectorRef, DestroyRef, Pipe, PipeTransform, inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { merge } from 'rxjs';\n\n/**\n * Translates the first key that has a translation and otherwise returns the fallback text.\n * Used for server-provided keys (agent names, error message keys, result codes) that the\n * host may or may not translate.\n */\n@Pipe({ name: 'nhAssistantTranslate', standalone: true, pure: false })\nexport class NhAssistantTranslatePipe implements PipeTransform {\n private readonly translate = inject(TranslateService);\n private lastKeys = '';\n private lastParams = '';\n private lastValue = '';\n private dirty = true;\n\n constructor() {\n const changeDetector = inject(ChangeDetectorRef);\n const subscription = merge(this.translate.onTranslationChange, this.translate.onLangChange).subscribe(() => {\n this.dirty = true;\n changeDetector.markForCheck();\n });\n inject(DestroyRef).onDestroy(() => subscription.unsubscribe());\n }\n\n transform(keys: string | readonly (string | null | undefined)[], fallback = '', params?: Record<string, unknown>): string {\n const candidates = (Array.isArray(keys) ? keys : [keys]).filter((key): key is string => !!key);\n const keySignature = candidates.join('|');\n const paramSignature = params ? JSON.stringify(params) : '';\n if (!this.dirty && keySignature === this.lastKeys && paramSignature === this.lastParams) {\n return this.lastValue;\n }\n\n this.lastKeys = keySignature;\n this.lastParams = paramSignature;\n this.dirty = false;\n this.lastValue = this.resolve(candidates, fallback, params);\n return this.lastValue;\n }\n\n private resolve(candidates: string[], fallback: string, params?: Record<string, unknown>): string {\n for (const key of candidates) {\n const value = this.translate.instant(key, params);\n if (typeof value === 'string' && value.length > 0 && value !== key) {\n return value;\n }\n }\n\n return fallback;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { AgentSummary } from '../../models/assistant-api.models';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\n\nlet nextId = 0;\n\n/**\n * Chooses the agent for new conversations. Agent names come from the host's translation\n * keys; agents created by an administrator carry literal text, which is shown as is.\n */\n@Component({\n selector: 'nh-assistant-agent-picker',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <label class=\"visually-hidden\" [for]=\"selectId\">{{ 'nh-assistant.agent-picker.label' | translate }}</label>\n <select\n [id]=\"selectId\"\n [disabled]=\"disabled() || agents().length < 2\"\n [attr.title]=\"selected() ? ([selected()!.descriptionKey] | nhAssistantTranslate: selected()!.descriptionKey) : null\"\n (change)=\"onChange($event)\">\n @for (agent of agents(); track agent.id) {\n <option [value]=\"agent.id\" [selected]=\"agent.id === selectedAgentId()\">\n {{ [agent.displayNameKey] | nhAssistantTranslate: agent.displayNameKey }}\n </option>\n }\n </select>\n @if (selected(); as agent) {\n <span class=\"capability\" [attr.data-can-mutate]=\"agent.canMutate\">\n {{ (agent.canMutate ? 'nh-assistant.agent-picker.can-mutate' : 'nh-assistant.agent-picker.read-only') | translate }}\n </span>\n }\n `,\n styleUrl: './nh-assistant-agent-picker.component.scss'\n})\nexport class NhAssistantAgentPickerComponent {\n readonly agents = input.required<readonly AgentSummary[]>();\n readonly selectedAgentId = input<string | null>(null);\n readonly disabled = input(false);\n readonly agentChange = output<string>();\n\n readonly selectId = `nh-assistant-agent-picker-${nextId++}`;\n readonly selected = computed(() => this.agents().find(agent => agent.id === this.selectedAgentId()) ?? null);\n\n onChange(event: Event): void {\n this.agentChange.emit((event.target as HTMLSelectElement).value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\n\nlet nextId = 0;\n\n/**\n * Message input. Enter sends when sending is available; Shift+Enter inserts a new line.\n * Drafting remains available while the assistant runs or waits for approval.\n */\n@Component({\n selector: 'nh-assistant-composer',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-composer.component.html',\n styleUrl: './nh-assistant-composer.component.scss'\n})\nexport class NhAssistantComposerComponent {\n /** Disables the editor only when the conversation itself cannot accept a draft. */\n readonly disabled = input(false);\n /** Blocks sending without disabling the editor or clearing its draft. */\n readonly sendDisabled = input(false);\n /** Shows the stop button instead of the send button. */\n readonly busy = input(false);\n /** Announces why sending is temporarily unavailable. */\n readonly status = input<'running' | 'waiting-for-approval' | null>(null);\n readonly maxLength = input<number | null>(null);\n /** Text to put back into the input, for example a message the server did not accept. */\n readonly restore = input<string | null>(null);\n\n readonly send = output<string>();\n readonly cancel = output<void>();\n readonly restored = output<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly textarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('textarea');\n private ownedFocus = false;\n private previousBusy = false;\n\n readonly inputId = `nh-assistant-composer-${nextId++}`;\n readonly hintId = `${this.inputId}-hint`;\n readonly text = signal('');\n readonly length = computed(() => this.text().trim().length);\n readonly tooLong = computed(() => {\n const max = this.maxLength();\n return max !== null && this.length() > max;\n });\n readonly showCounter = computed(() => {\n const max = this.maxLength();\n return max !== null && this.length() >= max * 0.8;\n });\n readonly canSend = computed(() =>\n !this.disabled() && !this.sendDisabled() && this.length() > 0 && !this.tooLong());\n\n constructor() {\n effect(() => {\n const draft = this.restore();\n if (draft !== null) {\n untracked(() => {\n this.text.set(draft);\n this.restored.emit();\n });\n }\n });\n\n effect(() => {\n const busy = this.busy();\n if (this.previousBusy && !busy) {\n queueMicrotask(() => this.restoreOwnedFocus());\n }\n this.previousBusy = busy;\n });\n }\n\n @HostListener('focusin')\n onFocusIn(): void {\n this.ownedFocus = true;\n }\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n if (next instanceof Node && !this.host.nativeElement.contains(next)) {\n this.ownedFocus = false;\n }\n }\n\n onInput(event: Event): void {\n this.text.set((event.target as HTMLTextAreaElement).value);\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.shiftKey || event.isComposing) {\n return;\n }\n\n event.preventDefault();\n this.submit();\n }\n\n onSubmit(event: SubmitEvent): void {\n event.preventDefault();\n this.submit();\n queueMicrotask(() => this.textarea().nativeElement.focus({ preventScroll: true }));\n }\n\n submit(): void {\n if (!this.canSend()) {\n return;\n }\n\n const text = this.text().trim();\n this.text.set('');\n this.send.emit(text);\n }\n\n private restoreOwnedFocus(): void {\n if (!this.ownedFocus || matchMedia('(pointer: coarse)').matches) {\n return;\n }\n\n const active = document.activeElement;\n if (active === document.body || active === null || !active.isConnected) {\n this.textarea().nativeElement.focus({ preventScroll: true });\n }\n }\n}\n","<form class=\"composer\" (submit)=\"onSubmit($event)\">\n <label class=\"visually-hidden\" [for]=\"inputId\">{{ 'nh-assistant.composer.label' | translate }}</label>\n <textarea\n #textarea\n data-nh-assistant-autofocus\n rows=\"2\"\n [id]=\"inputId\"\n [value]=\"text()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"'nh-assistant.composer.placeholder' | translate\"\n [attr.aria-describedby]=\"hintId\"\n [attr.aria-invalid]=\"tooLong() ? true : null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n\n <div class=\"actions\">\n @if (busy()) {\n <button\n class=\"stop\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.composer.stop' | translate\"\n [attr.title]=\"'nh-assistant.composer.stop' | translate\"\n (click)=\"cancel.emit()\">\n <nh-assistant-icon name=\"stop\" />\n </button>\n } @else {\n <button\n class=\"send\"\n type=\"submit\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"'nh-assistant.composer.send' | translate\"\n [attr.title]=\"'nh-assistant.composer.send' | translate\">\n <nh-assistant-icon name=\"send\" />\n </button>\n }\n </div>\n</form>\n\n@if (status(); as status) {\n <p class=\"composer-status\" role=\"status\" aria-live=\"polite\">\n {{ 'nh-assistant.composer.status.' + status | translate }}\n </p>\n}\n\n<p class=\"hint\" [id]=\"hintId\">\n @if (tooLong()) {\n <span class=\"error\">{{ 'nh-assistant.composer.too-long' | translate }}</span>\n } @else {\n <span>{{ 'nh-assistant.composer.hint' | translate }}</span>\n }\n @if (showCounter()) {\n <span class=\"counter\" [class.error]=\"tooLong()\">\n {{ 'nh-assistant.composer.characters' | translate: { count: length(), max: maxLength() } }}\n </span>\n }\n</p>\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ConversationSummary } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\n\n/** The user's conversations with loading and empty states; selecting one opens it. */\n@Component({\n selector: 'nh-assistant-conversation-list',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-conversation-list.component.html',\n styleUrl: './nh-assistant-conversation-list.component.scss'\n})\nexport class NhAssistantConversationListComponent {\n readonly conversations = input.required<readonly ConversationSummary[]>();\n readonly total = input(0);\n readonly activeConversationId = input<string | null>(null);\n readonly loading = input(false);\n readonly disabled = input(false);\n\n readonly conversationSelect = output<string>();\n readonly conversationDelete = output<string>();\n readonly conversationCreate = output<void>();\n}\n","<nav class=\"list\" [attr.aria-label]=\"'nh-assistant.conversation-list.title' | translate\" [attr.aria-busy]=\"loading()\">\n <header class=\"header\">\n <h3>{{ 'nh-assistant.conversation-list.title' | translate }}</h3>\n @if (conversations().length > 0 && total() > conversations().length) {\n <span class=\"count\">{{ 'nh-assistant.conversation-list.count' | translate: { count: conversations().length, total: total() } }}</span>\n }\n <button\n class=\"icon-button\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.panel.new-conversation' | translate\"\n [attr.title]=\"'nh-assistant.panel.new-conversation' | translate\"\n (click)=\"conversationCreate.emit()\">\n <nh-assistant-icon name=\"plus\" />\n </button>\n </header>\n\n @if (loading() && conversations().length === 0) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.conversation-list.loading' | translate }}</p>\n } @else if (conversations().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.conversation-list.empty' | translate }}</p>\n } @else {\n <ul>\n @for (conversation of conversations(); track conversation.id) {\n <li [class.active]=\"conversation.id === activeConversationId()\">\n <button\n class=\"item\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-current]=\"conversation.id === activeConversationId() ? 'true' : null\"\n (click)=\"conversationSelect.emit(conversation.id)\">\n <span class=\"title\">{{ conversation.title || ('nh-assistant.conversation-list.untitled' | translate) }}</span>\n <span class=\"meta\">\n <span class=\"status\" [attr.data-status]=\"conversation.status\">{{ 'nh-assistant.conversation-list.status.' + conversation.status | translate }}</span>\n <time [attr.datetime]=\"conversation.updatedAt\">{{ conversation.updatedAt | date: 'short' }}</time>\n </span>\n </button>\n <button\n class=\"icon-button delete\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"('nh-assistant.conversation-list.delete' | translate) + ': ' + (conversation.title || ('nh-assistant.conversation-list.untitled' | translate))\"\n [attr.title]=\"'nh-assistant.conversation-list.delete' | translate\"\n (click)=\"conversationDelete.emit(conversation.id)\">\n <nh-assistant-icon name=\"trash\" />\n </button>\n </li>\n }\n </ul>\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, output, signal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AssistantAddressForm,\n AssistantPreferences,\n AssistantResponseLength,\n AssistantStyle\n} from '../../models/assistant-admin.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NhAssistantApiService } from '../../services/nh-assistant-api.service';\nimport { NhAssistantError } from '../../services/nh-assistant.store';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../../services/nh-assistant-transport';\n\n/** Maximum length of the user's own instructions. */\nexport const NH_ASSISTANT_MAX_CUSTOM_INSTRUCTIONS = 1_000;\n\nlet nextId = 0;\n\n/**\n * The user's own assistant preferences: style, form of address, answer length and\n * optional instructions. Preferences steer style only; the server keeps them below the\n * application context and agent instructions.\n */\n@Component({\n selector: 'nh-assistant-preferences',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-preferences.component.html',\n styleUrl: './nh-assistant-preferences.component.scss'\n})\nexport class NhAssistantPreferencesComponent {\n private readonly api = inject(NhAssistantApiService);\n private subscription?: Subscription;\n\n /** Emitted when the user leaves the preferences. */\n readonly closed = output<void>();\n /** Emitted with the stored preferences after a successful save. */\n readonly saved = output<AssistantPreferences>();\n\n readonly id = `nh-assistant-preferences-${nextId++}`;\n readonly styles: readonly AssistantStyle[] = ['default', 'direct', 'personal', 'detailed'];\n readonly addressForms: readonly AssistantAddressForm[] = ['informal', 'formal'];\n readonly responseLengths: readonly AssistantResponseLength[] = ['short', 'normal', 'long'];\n readonly maxInstructions = NH_ASSISTANT_MAX_CUSTOM_INSTRUCTIONS;\n\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly saving = signal(false);\n readonly savedMessage = signal(false);\n readonly error = signal<NhAssistantError | null>(null);\n\n readonly style = signal<AssistantStyle>('default');\n readonly addressForm = signal<AssistantAddressForm>('informal');\n readonly responseLength = signal<AssistantResponseLength>('normal');\n readonly customInstructions = signal('');\n private readonly stored = signal<AssistantPreferences | null>(null);\n\n readonly instructionsLength = computed(() => this.customInstructions().length);\n readonly tooLong = computed(() => this.instructionsLength() > this.maxInstructions);\n readonly dirty = computed(() => {\n const stored = this.stored();\n return !stored || stored.style !== this.style() || stored.addressForm !== this.addressForm() ||\n stored.responseLength !== this.responseLength() || (stored.customInstructions ?? '') !== this.customInstructions();\n });\n readonly canSave = computed(() => !this.loading() && !this.saving() && !this.tooLong() && this.dirty());\n readonly errorKeys = computed(() => {\n const error = this.error();\n return error ? [error.messageKey, nhAssistantErrorMessageKey(error.code), 'nh-assistant.errors.generic'] : [];\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n this.load();\n }\n\n load(): void {\n this.loading.set(true);\n this.loadFailed.set(false);\n this.subscription?.unsubscribe();\n this.subscription = this.api.getPreferences().subscribe({\n next: preferences => {\n this.apply(preferences);\n this.loading.set(false);\n },\n error: () => {\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n\n onInstructionsInput(event: Event): void {\n this.customInstructions.set((event.target as HTMLTextAreaElement).value);\n this.savedMessage.set(false);\n }\n\n choose<T>(target: { set(value: T): void }, value: T): void {\n target.set(value);\n this.savedMessage.set(false);\n }\n\n save(): void {\n if (!this.canSave()) {\n return;\n }\n\n const instructions = this.customInstructions().trim();\n const preferences: AssistantPreferences = {\n style: this.style(),\n addressForm: this.addressForm(),\n responseLength: this.responseLength(),\n customInstructions: instructions.length > 0 ? instructions : null\n };\n\n this.saving.set(true);\n this.error.set(null);\n this.savedMessage.set(false);\n this.subscription?.unsubscribe();\n this.subscription = this.api.updatePreferences(preferences).subscribe({\n next: stored => {\n this.apply(stored);\n this.saving.set(false);\n this.savedMessage.set(true);\n this.saved.emit(stored);\n },\n error: (error: unknown) => {\n this.saving.set(false);\n this.error.set(error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : { code: 'assistant-server', messageKey: nhAssistantErrorMessageKey('assistant-server') });\n }\n });\n }\n\n private apply(preferences: AssistantPreferences): void {\n this.stored.set(preferences);\n this.style.set(preferences.style);\n this.addressForm.set(preferences.addressForm);\n this.responseLength.set(preferences.responseLength);\n this.customInstructions.set(preferences.customInstructions ?? '');\n }\n}\n","<section class=\"preferences\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"loading() || saving()\">\n <header class=\"header\">\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.preferences.title' | translate }}</h3>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.preferences.back' | translate\"\n [attr.title]=\"'nh-assistant.preferences.back' | translate\"\n (click)=\"closed.emit()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </header>\n\n @if (loading()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.preferences.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.preferences.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.preferences.retry' | translate }}</button>\n </div>\n } @else {\n <form class=\"form\" (submit)=\"$event.preventDefault(); save()\">\n <p class=\"description\">{{ 'nh-assistant.preferences.description' | translate }}</p>\n\n <fieldset>\n <legend>{{ 'nh-assistant.preferences.style-label' | translate }}</legend>\n <div class=\"options styles\">\n @for (option of styles; track option) {\n <label class=\"option\" [class.selected]=\"style() === option\">\n <input type=\"radio\" [name]=\"id + '-style'\" [value]=\"option\" [checked]=\"style() === option\" (change)=\"choose(style, option)\" />\n <span>\n <strong>{{ 'nh-assistant.preferences.style.' + option | translate }}</strong>\n <small>{{ 'nh-assistant.preferences.style.' + option + '-description' | translate }}</small>\n </span>\n </label>\n }\n </div>\n </fieldset>\n\n <fieldset>\n <legend>{{ 'nh-assistant.preferences.address-form-label' | translate }}</legend>\n <div class=\"options segmented\">\n @for (option of addressForms; track option) {\n <label class=\"option\" [class.selected]=\"addressForm() === option\">\n <input type=\"radio\" [name]=\"id + '-address'\" [value]=\"option\" [checked]=\"addressForm() === option\" (change)=\"choose(addressForm, option)\" />\n <span><strong>{{ 'nh-assistant.preferences.address-form.' + option | translate }}</strong></span>\n </label>\n }\n </div>\n </fieldset>\n\n <fieldset>\n <legend>{{ 'nh-assistant.preferences.response-length-label' | translate }}</legend>\n <div class=\"options segmented\">\n @for (option of responseLengths; track option) {\n <label class=\"option\" [class.selected]=\"responseLength() === option\">\n <input type=\"radio\" [name]=\"id + '-length'\" [value]=\"option\" [checked]=\"responseLength() === option\" (change)=\"choose(responseLength, option)\" />\n <span><strong>{{ 'nh-assistant.preferences.response-length.' + option | translate }}</strong></span>\n </label>\n }\n </div>\n </fieldset>\n\n <div class=\"field\">\n <label [for]=\"id + '-instructions'\">{{ 'nh-assistant.preferences.custom-instructions-label' | translate }}</label>\n <textarea\n rows=\"4\"\n [id]=\"id + '-instructions'\"\n [value]=\"customInstructions()\"\n [attr.aria-describedby]=\"id + '-instructions-hint'\"\n [attr.aria-invalid]=\"tooLong() ? true : null\"\n (input)=\"onInstructionsInput($event)\"></textarea>\n <p class=\"hint\" [id]=\"id + '-instructions-hint'\">\n @if (tooLong()) {\n <span class=\"error-text\">{{ 'nh-assistant.preferences.too-long' | translate }}</span>\n } @else {\n <span>{{ 'nh-assistant.preferences.custom-instructions-hint' | translate }}</span>\n }\n <span class=\"counter\" [class.error-text]=\"tooLong()\">\n {{ 'nh-assistant.preferences.characters' | translate: { count: instructionsLength(), max: maxInstructions } }}\n </span>\n </p>\n </div>\n\n @if (error(); as error) {\n <p class=\"message error\" role=\"alert\">\n <nh-assistant-icon name=\"warning\" />\n {{ errorKeys() | nhAssistantTranslate: error.code }}\n </p>\n }\n @if (savedMessage()) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />\n {{ 'nh-assistant.preferences.saved' | translate }}\n </p>\n }\n\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" (click)=\"closed.emit()\">{{ 'nh-assistant.preferences.back' | translate }}</button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"!canSave()\">\n {{ (saving() ? 'nh-assistant.preferences.saving' : 'nh-assistant.preferences.save') | translate }}\n </button>\n </div>\n </form>\n }\n</section>\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\nimport createDOMPurify, { DOMPurify } from 'dompurify';\nimport { Marked, Tokens } from 'marked';\n\nconst allowedTags = [\n 'p', 'br', 'strong', 'em', 'del', 'code', 'pre', 'blockquote', 'ul', 'ol', 'li', 'a',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'table', 'thead', 'tbody', 'tr', 'th', 'td'\n];\nconst allowedAttributes = ['href', 'title', 'start', 'align'];\nconst allowedUris = /^(?:https?:|mailto:|\\/(?!\\/)|#)/i;\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Renders model text as Markdown into a strict HTML subset. Inline HTML in the model text\n * is shown as literal text, images render as their alt text, and the result is sanitized\n * with DOMPurify. Links open in a new tab with `rel=\"noopener noreferrer\"`.\n */\n@Injectable({ providedIn: 'root' })\nexport class NhAssistantMarkdownRenderer {\n private readonly document = inject(DOCUMENT);\n private readonly marked = new Marked({\n gfm: true,\n breaks: true,\n async: false,\n renderer: {\n html(token: Tokens.HTML | Tokens.Tag): string {\n return escapeHtml(token.text);\n },\n image(token: Tokens.Image): string {\n return escapeHtml(token.text);\n }\n }\n });\n private purifier: DOMPurify | null = null;\n\n render(text: string): string {\n const purifier = this.getPurifier();\n if (!purifier) {\n return `<p>${escapeHtml(text)}</p>`;\n }\n\n const html = this.marked.parse(text, { async: false });\n return purifier.sanitize(html, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttributes,\n ALLOWED_URI_REGEXP: allowedUris,\n ALLOW_DATA_ATTR: false,\n ALLOW_ARIA_ATTR: false\n });\n }\n\n private getPurifier(): DOMPurify | null {\n if (this.purifier) {\n return this.purifier;\n }\n\n const view = this.document.defaultView;\n if (!view) {\n return null;\n }\n\n const purifier = createDOMPurify(view);\n if (!purifier.isSupported) {\n return null;\n }\n\n purifier.addHook('afterSanitizeAttributes', node => {\n if (node.tagName === 'A') {\n node.setAttribute('target', '_blank');\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n\n this.purifier = purifier;\n return purifier;\n }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { NhAssistantMarkdownRenderer } from './nh-assistant-markdown';\n\n/** Renders model text into sanitized HTML. Pure, so unchanged text is not rendered again. */\n@Pipe({ name: 'nhAssistantMarkdown', standalone: true })\nexport class NhAssistantMarkdownPipe implements PipeTransform {\n private readonly renderer = inject(NhAssistantMarkdownRenderer);\n\n transform(text: string): string {\n return this.renderer.render(text);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, ApprovalPart } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\n\n/** Formats remaining milliseconds as `m:ss`, or `h:mm:ss` above one hour. */\nexport function formatNhAssistantCountdown(milliseconds: number): string {\n const totalSeconds = Math.max(0, Math.ceil(milliseconds / 1000));\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const paddedSeconds = seconds.toString().padStart(2, '0');\n\n return hours > 0\n ? `${hours}:${minutes.toString().padStart(2, '0')}:${paddedSeconds}`\n : `${minutes}:${paddedSeconds}`;\n}\n\n/**\n * Asks the user to approve or reject a proposed mutation. Shows the summary, targets,\n * proposed arguments and a countdown to expiry. A decision is emitted at most once until\n * the host reports that it is no longer deciding.\n */\n@Component({\n selector: 'nh-assistant-approval-card',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-approval-card.component.html',\n styleUrl: './nh-assistant-approval-card.component.scss',\n host: {\n '[attr.data-status]': 'effectiveStatus()'\n }\n})\nexport class NhAssistantApprovalCardComponent {\n readonly approval = input.required<ApprovalPart>();\n /** True while the host submits a decision; disables both buttons. */\n readonly deciding = input(false);\n readonly decide = output<ApprovalDecision>();\n\n private readonly now = signal(Date.now());\n private readonly submitted = signal(false);\n\n readonly remainingMs = computed(() => Date.parse(this.approval().expiresAt) - this.now());\n readonly expired = computed(() => this.approval().status === 'expired' ||\n (this.approval().status === 'pending' && this.remainingMs() <= 0));\n readonly effectiveStatus = computed(() => this.expired() ? 'expired' : this.approval().status);\n readonly actionable = computed(() => this.effectiveStatus() === 'pending');\n readonly disabled = computed(() => !this.actionable() || this.deciding() || this.submitted());\n readonly countdown = computed(() => formatNhAssistantCountdown(this.remainingMs()));\n readonly presentedSummary = computed(() => this.approval().presentation?.summary ?? null);\n\n constructor() {\n // Tick only while the approval is pending and not yet expired.\n effect(onCleanup => {\n if (this.approval().status !== 'pending') {\n return;\n }\n\n const expiresAt = Date.parse(this.approval().expiresAt);\n const timer = setInterval(() => {\n this.now.set(Date.now());\n if (Date.now() >= expiresAt) {\n clearInterval(timer);\n }\n }, 1000);\n onCleanup(() => clearInterval(timer));\n });\n\n // Allow a new attempt once the host finished deciding and the approval is still pending.\n effect(() => {\n if (!this.deciding() && this.approval().status === 'pending') {\n this.submitted.set(false);\n }\n });\n }\n\n choose(decision: ApprovalDecision): void {\n if (this.disabled()) {\n return;\n }\n\n this.submitted.set(true);\n this.decide.emit(decision);\n }\n}\n","<section class=\"card\" [attr.aria-label]=\"'nh-assistant.approval.title' | translate\">\n <header class=\"header\">\n <nh-assistant-icon [name]=\"actionable() ? 'warning' : effectiveStatus() === 'approved' ? 'check' : 'x'\" />\n <h3>{{ 'nh-assistant.approval.title' | translate }}</h3>\n <span class=\"status\">{{ 'nh-assistant.approval.status.' + effectiveStatus() | translate }}</span>\n </header>\n\n @if (approval().presentation; as presentation) {\n <p class=\"tool-name\">{{ presentation.toolDisplayName }}</p>\n <p class=\"summary\">{{ presentation.summary }}</p>\n @if (presentation.fields.length > 0) {\n <dl class=\"presentation-fields\">\n @for (field of presentation.fields; track $index) {\n <div>\n <dt>{{ field.label }}</dt>\n <dd>{{ field.value }}</dd>\n </div>\n }\n </dl>\n }\n @if (presentation.notice) {\n <p class=\"notice\">{{ presentation.notice }}</p>\n }\n } @else {\n <p class=\"summary\">{{ 'nh-assistant.approval.fallback-summary' | translate }}</p>\n }\n\n <details class=\"technical-details\">\n <summary>{{ 'nh-assistant.approval.technical-details' | translate }}</summary>\n <p class=\"label\">{{ 'nh-assistant.approval.tool-id' | translate }}</p>\n <code>{{ approval().toolId }}</code>\n @if (approval().targets.length > 0) {\n <p class=\"label\">{{ 'nh-assistant.approval.targets' | translate }}</p>\n <ul class=\"targets\">\n @for (target of approval().targets; track $index) {\n <li>{{ target }}</li>\n }\n </ul>\n }\n @if (approval().argumentsPreview) {\n <p class=\"label\">{{ 'nh-assistant.approval.arguments' | translate }}</p>\n <pre>{{ approval().argumentsPreview }}</pre>\n }\n </details>\n\n @if (actionable()) {\n <p class=\"expiry\" aria-live=\"off\">\n <nh-assistant-icon name=\"clock\" />\n {{ 'nh-assistant.approval.expires-in' | translate: { time: countdown() } }}\n </p>\n <div class=\"actions\">\n <button\n class=\"reject\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.approval.reject-label' | translate: { summary: presentedSummary() ?? ('nh-assistant.approval.fallback-summary' | translate) }\"\n (click)=\"choose('reject')\">\n {{ 'nh-assistant.approval.reject' | translate }}\n </button>\n <button\n class=\"approve\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.approval.approve-label' | translate: { summary: presentedSummary() ?? ('nh-assistant.approval.fallback-summary' | translate) }\"\n (click)=\"choose('approve')\">\n {{ 'nh-assistant.approval.approve' | translate }}\n </button>\n </div>\n @if (deciding()) {\n <p class=\"deciding\" role=\"status\">{{ 'nh-assistant.approval.deciding' | translate }}</p>\n }\n } @else if (expired()) {\n <p class=\"expiry\">{{ 'nh-assistant.approval.expired' | translate }}</p>\n }\n</section>\n","import { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ToolCallPart } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent, NhAssistantIconName } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\n\nlet nextId = 0;\n\nconst statusIcons: Record<ToolCallPart['status'], NhAssistantIconName> = {\n running: 'tool',\n succeeded: 'check',\n failed: 'warning',\n 'awaiting-approval': 'clock',\n rejected: 'x'\n};\n\n/** Shows one tool invocation with its status and expandable input and result previews. */\n@Component({\n selector: 'nh-assistant-tool-call-card',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-tool-call-card.component.html',\n styleUrl: './nh-assistant-tool-call-card.component.scss',\n host: {\n '[attr.data-status]': 'part().status'\n }\n})\nexport class NhAssistantToolCallCardComponent {\n readonly part = input.required<ToolCallPart>();\n\n readonly detailsId = `nh-assistant-tool-call-${nextId++}`;\n readonly expanded = signal(false);\n readonly statusIcon = computed(() => statusIcons[this.part().status]);\n readonly hasDetails = computed(() => !!this.part().toolId);\n\n toggle(): void {\n this.expanded.update(expanded => !expanded);\n }\n}\n","<article class=\"card\" [attr.aria-label]=\"'nh-assistant.tool-call.label' | translate: { name: part().displayName }\">\n <header class=\"header\">\n <span class=\"status-icon\" [class.spinning]=\"part().status === 'running'\">\n <nh-assistant-icon [name]=\"statusIcon()\" />\n </span>\n <span class=\"title\">{{ part().displayName }}</span>\n <span class=\"status\">{{ 'nh-assistant.tool-call.status.' + part().status | translate }}</span>\n @if (hasDetails()) {\n <button\n class=\"toggle\"\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"detailsId\"\n [attr.aria-label]=\"(expanded() ? 'nh-assistant.tool-call.hide-details' : 'nh-assistant.tool-call.show-details') | translate\"\n [attr.title]=\"(expanded() ? 'nh-assistant.tool-call.hide-details' : 'nh-assistant.tool-call.show-details') | translate\"\n (click)=\"toggle()\">\n <nh-assistant-icon name=\"chevron-down\" [class.rotated]=\"expanded()\" />\n </button>\n }\n </header>\n\n @if (part().resultCode; as resultCode) {\n <p class=\"result-code\">\n {{ ['nh-assistant.result-codes.' + resultCode, 'nh-assistant.errors.' + resultCode] | nhAssistantTranslate: resultCode }}\n </p>\n }\n\n @if (hasDetails()) {\n <div class=\"details\" [id]=\"detailsId\" [hidden]=\"!expanded()\">\n <p class=\"label\">{{ 'nh-assistant.tool-call.tool-id' | translate }}</p>\n <code>{{ part().toolId }}</code>\n @if (part().argumentsPreview; as argumentsPreview) {\n <p class=\"label\">{{ 'nh-assistant.tool-call.arguments' | translate }}</p>\n <pre>{{ argumentsPreview }}</pre>\n }\n @if (part().resultPreview; as resultPreview) {\n <p class=\"label\">{{ 'nh-assistant.tool-call.result' | translate }}</p>\n <pre>{{ resultPreview }}</pre>\n }\n </div>\n }\n</article>\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, Message } from '../../models/assistant-api.models';\nimport { NhAssistantMarkdownPipe } from '../../internal/nh-assistant-markdown.pipe';\nimport { NhAssistantApprovalCardComponent } from '../approval-card/nh-assistant-approval-card.component';\nimport { NhAssistantToolCallCardComponent } from '../tool-call-card/nh-assistant-tool-call-card.component';\n\n/** Above this number of messages the thread renders through CDK virtual scrolling. */\nexport const NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD = 200;\n\n/** Distance from the bottom, in pixels, within which new content keeps the thread pinned to the end. */\nconst stickToBottomDistance = 120;\n\n/**\n * The messages of a conversation as a live log. Assistant text renders as sanitized\n * Markdown, tool calls and approvals as cards. The thread follows new content while the\n * user is at the bottom.\n */\n@Component({\n selector: 'nh-assistant-thread',\n standalone: true,\n imports: [\n NgTemplateOutlet,\n ScrollingModule,\n TranslatePipe,\n NhAssistantMarkdownPipe,\n NhAssistantToolCallCardComponent,\n NhAssistantApprovalCardComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-thread.component.html',\n styleUrl: './nh-assistant-thread.component.scss'\n})\nexport class NhAssistantThreadComponent {\n private readonly injector = inject(Injector);\n\n readonly messages = input.required<readonly Message[]>();\n readonly streaming = input(false);\n readonly deciding = input(false);\n readonly markdown = input(true);\n readonly approvalDecision = output<ApprovalDecision>();\n\n readonly virtualThreshold = NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD;\n readonly virtual = computed(() => this.messages().length > NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD);\n readonly working = computed(() => {\n if (!this.streaming()) {\n return false;\n }\n\n const last = this.messages()[this.messages().length - 1];\n return !last || last.role === 'user' || last.parts.length === 0;\n });\n\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n private readonly viewport = viewChild(CdkVirtualScrollViewport);\n\n constructor() {\n effect(() => {\n this.messages();\n this.working();\n const element = this.scrollElement();\n const pinned = !element || element.scrollHeight - element.scrollTop - element.clientHeight <= stickToBottomDistance;\n if (pinned) {\n afterNextRender(() => this.scrollToEnd(), { injector: this.injector });\n }\n });\n }\n\n trackMessage(_index: number, message: Message): string {\n return message.id;\n }\n\n private scrollElement(): HTMLElement | null {\n return this.viewport()?.elementRef.nativeElement ?? this.scroller()?.nativeElement ?? null;\n }\n\n private scrollToEnd(): void {\n const viewport = this.viewport();\n if (viewport) {\n viewport.scrollToIndex(this.messages().length - 1);\n viewport.scrollTo({ bottom: 0 });\n return;\n }\n\n const element = this.scroller()?.nativeElement;\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n }\n}\n","<div class=\"log\" role=\"log\" aria-live=\"polite\" [attr.aria-label]=\"'nh-assistant.thread.label' | translate\" [attr.aria-busy]=\"streaming()\">\n @if (virtual()) {\n <cdk-virtual-scroll-viewport class=\"scroller\" itemSize=\"120\" minBufferPx=\"1200\" maxBufferPx=\"2400\">\n <div class=\"row\" *cdkVirtualFor=\"let message of messages(); trackBy: trackMessage\">\n <ng-container [ngTemplateOutlet]=\"messageTemplate\" [ngTemplateOutletContext]=\"{ $implicit: message }\" />\n </div>\n @if (working()) {\n <ng-container [ngTemplateOutlet]=\"workingTemplate\" />\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n <div class=\"scroller\" #scroller tabindex=\"0\">\n @for (message of messages(); track message.id) {\n <div class=\"row\">\n <ng-container [ngTemplateOutlet]=\"messageTemplate\" [ngTemplateOutletContext]=\"{ $implicit: message }\" />\n </div>\n }\n @if (working()) {\n <ng-container [ngTemplateOutlet]=\"workingTemplate\" />\n }\n </div>\n }\n</div>\n\n<ng-template #messageTemplate let-message>\n <article class=\"message\" [attr.data-role]=\"message.role\">\n <p class=\"author\">{{ 'nh-assistant.thread.' + (message.role === 'user' ? 'you' : message.role) | translate }}</p>\n @for (part of message.parts; track $index) {\n @switch (part.type) {\n @case ('text') {\n @if (message.role === 'assistant' && markdown()) {\n <div class=\"bubble markdown\" [innerHTML]=\"part.text | nhAssistantMarkdown\"></div>\n } @else {\n <div class=\"bubble plain\">{{ part.text }}</div>\n }\n }\n @case ('tool-call') {\n <nh-assistant-tool-call-card class=\"part\" [part]=\"part\" />\n }\n @case ('approval') {\n <nh-assistant-approval-card class=\"part\" [approval]=\"part\" [deciding]=\"deciding()\" (decide)=\"approvalDecision.emit($event)\" />\n }\n }\n }\n </article>\n</ng-template>\n\n<ng-template #workingTemplate>\n <p class=\"working\" role=\"status\">\n <span class=\"dots\" aria-hidden=\"true\"><span></span><span></span><span></span></span>\n {{ 'nh-assistant.thread.working' | translate }}\n </p>\n</ng-template>\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { NavigationEnd, Router, RouterLink } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, ClientContext } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NH_ASSISTANT_CONFIG } from '../../nh-assistant.config';\nimport { NhAssistantPanelService } from '../../services/nh-assistant-panel.service';\nimport { NhAssistantStore } from '../../services/nh-assistant.store';\nimport { describeNhAssistantClientContext } from '../../services/nh-assistant-page-context';\nimport { NhAssistantAgentPickerComponent } from '../agent-picker/nh-assistant-agent-picker.component';\nimport { NhAssistantComposerComponent } from '../composer/nh-assistant-composer.component';\nimport { NhAssistantConversationListComponent } from '../conversation-list/nh-assistant-conversation-list.component';\nimport { NhAssistantPreferencesComponent } from '../preferences/nh-assistant-preferences.component';\nimport { NhAssistantThreadComponent } from '../thread/nh-assistant-thread.component';\n\nlet nextId = 0;\n\n/**\n * The assistant drawer. Place it once in the application layout; it renders nothing in\n * place and appears as an overlay when `NhAssistantPanelService.open()` is called.\n */\n@Component({\n selector: 'nh-assistant-panel',\n standalone: true,\n imports: [\n RouterLink,\n TranslatePipe,\n NhAssistantTranslatePipe,\n NhAssistantIconComponent,\n NhAssistantAgentPickerComponent,\n NhAssistantComposerComponent,\n NhAssistantConversationListComponent,\n NhAssistantPreferencesComponent,\n NhAssistantThreadComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-panel.component.html',\n styleUrl: './nh-assistant-panel.component.scss'\n})\nexport class NhAssistantPanelComponent implements AfterViewInit, OnDestroy {\n readonly store = inject(NhAssistantStore);\n readonly panel = inject(NhAssistantPanelService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly router = inject(Router, { optional: true });\n private readonly drawer = viewChild.required<TemplateRef<unknown>>('drawer');\n private portal?: TemplatePortal;\n\n readonly titleId = `nh-assistant-panel-title-${nextId++}`;\n readonly markdown = this.config.markdown?.enabled ?? true;\n readonly showConversations = signal(false);\n readonly showPreferences = signal(false);\n readonly adminRoute = this.config.adminRoute ?? null;\n readonly conversation = this.store.activeConversation;\n private readonly conversationId = computed(() => this.conversation()?.id ?? null);\n readonly messages = computed(() => this.conversation()?.messages ?? []);\n readonly closed = computed(() => {\n const status = this.conversation()?.status;\n return status === 'failed' || status === 'archived';\n });\n readonly busy = computed(() => this.store.streaming() || this.conversation()?.status === 'running');\n readonly composerDisabled = computed(() => !this.store.canSend());\n readonly composerStatus = computed<'running' | 'waiting-for-approval' | null>(() => {\n if (this.store.streaming() || this.conversation()?.status === 'running') {\n return 'running';\n }\n return this.conversation()?.status === 'waiting-for-approval' ? 'waiting-for-approval' : null;\n });\n readonly errorKeys = computed(() => {\n const error = this.store.error();\n return error ? [error.messageKey, `nh-assistant.errors.${error.code}`, 'nh-assistant.errors.generic'] : [];\n });\n readonly noticeKeys = computed(() => {\n const notice = this.store.notice();\n return notice ? [notice.messageKey, `nh-assistant.errors.${notice.code}`, 'nh-assistant.errors.generic'] : [];\n });\n\n constructor() {\n // Opening, creating or leaving a conversation returns from the list to the thread.\n effect(() => {\n if (this.conversationId() !== undefined) {\n untracked(() => {\n this.showConversations.set(false);\n this.showPreferences.set(false);\n });\n }\n });\n\n effect(() => {\n if (this.panel.isOpen()) {\n untracked(() => {\n void this.store.initialize().then(() => this.store.refreshConversations());\n this.refreshPageContext();\n });\n }\n });\n\n // The drawer stays open while the user navigates; keep the page-context chip current.\n const navigation = this.router?.events.subscribe(event => {\n if (event instanceof NavigationEnd && this.panel.isOpen()) {\n this.refreshPageContext();\n }\n });\n inject(DestroyRef).onDestroy(() => navigation?.unsubscribe());\n }\n\n ngAfterViewInit(): void {\n this.portal = new TemplatePortal(this.drawer(), this.viewContainerRef);\n this.panel.registerPanel(this.portal);\n }\n\n ngOnDestroy(): void {\n if (this.portal) {\n this.panel.unregisterPanel(this.portal);\n }\n }\n\n refreshPageContext(): void {\n void this.store.refreshPageContext();\n }\n\n describeContext(context: ClientContext): string {\n return describeNhAssistantClientContext(context);\n }\n\n toggleConversations(): void {\n this.showPreferences.set(false);\n this.showConversations.update(show => !show);\n }\n\n togglePreferences(): void {\n this.showConversations.set(false);\n this.showPreferences.update(show => !show);\n }\n\n newConversation(): void {\n this.store.startNewConversation();\n this.showConversations.set(false);\n }\n\n openConversation(conversationId: string): void {\n void this.store.openConversation(conversationId);\n this.showConversations.set(false);\n }\n\n deleteConversation(conversationId: string): void {\n void this.store.deleteConversation(conversationId);\n }\n\n send(text: string): void {\n this.showConversations.set(false);\n this.showPreferences.set(false);\n void this.store.send(text);\n }\n\n decide(decision: ApprovalDecision): void {\n this.store.decide(decision);\n }\n\n cancel(): void {\n void this.store.cancel();\n }\n}\n","<ng-template #drawer>\n <section class=\"drawer\" role=\"dialog\" aria-modal=\"false\" [attr.aria-labelledby]=\"titleId\">\n <header class=\"header\">\n <div class=\"heading\">\n <h2 [id]=\"titleId\">{{ 'nh-assistant.panel.title' | translate }}</h2>\n @if (store.enabled()) {\n <nh-assistant-agent-picker\n [agents]=\"store.agents()\"\n [selectedAgentId]=\"store.selectedAgentId()\"\n [disabled]=\"store.streaming()\"\n (agentChange)=\"store.selectAgent($event)\" />\n }\n </div>\n <div class=\"header-actions\">\n @if (store.enabled()) {\n <button\n class=\"icon-button\"\n type=\"button\"\n [class.active]=\"showConversations()\"\n [attr.aria-expanded]=\"showConversations()\"\n [attr.aria-label]=\"(showConversations() ? 'nh-assistant.panel.hide-conversations' : 'nh-assistant.panel.show-conversations') | translate\"\n [attr.title]=\"(showConversations() ? 'nh-assistant.panel.hide-conversations' : 'nh-assistant.panel.show-conversations') | translate\"\n (click)=\"toggleConversations()\">\n <nh-assistant-icon name=\"list\" />\n </button>\n <button\n class=\"icon-button\"\n type=\"button\"\n [class.active]=\"showPreferences()\"\n [attr.aria-expanded]=\"showPreferences()\"\n [attr.aria-label]=\"'nh-assistant.panel.open-preferences' | translate\"\n [attr.title]=\"'nh-assistant.panel.open-preferences' | translate\"\n (click)=\"togglePreferences()\">\n <nh-assistant-icon name=\"settings\" />\n </button>\n @if (adminRoute && store.canAdminister()) {\n <a\n class=\"icon-button\"\n [routerLink]=\"adminRoute\"\n [attr.aria-label]=\"'nh-assistant.panel.open-admin' | translate\"\n [attr.title]=\"'nh-assistant.panel.open-admin' | translate\"\n (click)=\"panel.close()\">\n <nh-assistant-icon name=\"admin\" />\n </a>\n }\n <button\n class=\"icon-button\"\n type=\"button\"\n [disabled]=\"store.streaming()\"\n [attr.aria-label]=\"'nh-assistant.panel.new-conversation' | translate\"\n [attr.title]=\"'nh-assistant.panel.new-conversation' | translate\"\n (click)=\"newConversation()\">\n <nh-assistant-icon name=\"plus\" />\n </button>\n }\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.panel.close' | translate\"\n [attr.title]=\"'nh-assistant.panel.close' | translate\"\n (click)=\"panel.close()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </div>\n </header>\n\n <div class=\"body\">\n @if (store.statusLoading() && !store.enabled()) {\n <div class=\"state\" role=\"status\">\n <p class=\"state-title\">{{ 'nh-assistant.panel.loading' | translate }}</p>\n </div>\n } @else if (!store.enabled()) {\n <div class=\"state\">\n <nh-assistant-icon class=\"state-icon\" name=\"warning\" />\n <p class=\"state-title\">{{ 'nh-assistant.panel.unavailable-title' | translate }}</p>\n <p>{{ 'nh-assistant.panel.unavailable-description' | translate }}</p>\n </div>\n } @else {\n @if (showPreferences()) {\n <nh-assistant-preferences class=\"overlay-view\" (closed)=\"showPreferences.set(false)\" />\n }\n\n @if (showConversations()) {\n <nh-assistant-conversation-list\n class=\"overlay-view\"\n [conversations]=\"store.conversations()\"\n [total]=\"store.conversationsTotal()\"\n [activeConversationId]=\"conversation()?.id ?? null\"\n [loading]=\"store.conversationsLoading()\"\n [disabled]=\"store.streaming()\"\n (conversationSelect)=\"openConversation($event)\"\n (conversationDelete)=\"deleteConversation($event)\"\n (conversationCreate)=\"newConversation()\" />\n }\n\n @if (store.conversationLoading()) {\n <div class=\"state\" role=\"status\">\n <p class=\"state-title\">{{ 'nh-assistant.thread.loading' | translate }}</p>\n </div>\n } @else if (messages().length === 0 && !store.streaming()) {\n <div class=\"state\">\n <nh-assistant-icon class=\"state-icon\" name=\"assistant\" />\n <p class=\"state-title\">{{ 'nh-assistant.panel.empty-title' | translate }}</p>\n <p>{{ 'nh-assistant.panel.empty-description' | translate }}</p>\n </div>\n } @else {\n <nh-assistant-thread\n class=\"thread\"\n [messages]=\"messages()\"\n [streaming]=\"store.streaming()\"\n [deciding]=\"store.deciding()\"\n [markdown]=\"markdown\"\n (approvalDecision)=\"decide($event)\" />\n }\n }\n </div>\n\n @if (store.error(); as error) {\n <div class=\"error\" role=\"alert\">\n <nh-assistant-icon name=\"warning\" />\n <p>{{ errorKeys() | nhAssistantTranslate: error.code }}</p>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.panel.dismiss-error' | translate\"\n [attr.title]=\"'nh-assistant.panel.dismiss-error' | translate\"\n (click)=\"store.clearError()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </div>\n } @else if (store.notice(); as notice) {\n <div class=\"turn-notice\" role=\"status\">\n <nh-assistant-icon name=\"warning\" />\n <p>{{ noticeKeys() | nhAssistantTranslate: notice.code }}</p>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.panel.dismiss-error' | translate\"\n [attr.title]=\"'nh-assistant.panel.dismiss-error' | translate\"\n (click)=\"store.clearNotice()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </div>\n }\n\n @if (store.enabled() && !showPreferences()) {\n <footer class=\"footer\" (focusin)=\"refreshPageContext()\">\n @if (closed()) {\n <p class=\"notice\">{{ 'nh-assistant.panel.conversation-closed' | translate }}</p>\n }\n @if (store.pageContext(); as context) {\n <div class=\"context-chip\" [class.excluded]=\"store.pageContextExcluded()\" [attr.title]=\"context.route\">\n <nh-assistant-icon name=\"page\" />\n <span class=\"context-text\">\n {{ (store.pageContextExcluded() ? 'nh-assistant.page-context.excluded' : 'nh-assistant.page-context.included') | translate: { page: describeContext(context) } }}\n </span>\n <button\n class=\"icon-button small\"\n type=\"button\"\n [attr.aria-pressed]=\"store.pageContextExcluded()\"\n [attr.aria-label]=\"(store.pageContextExcluded() ? 'nh-assistant.page-context.include' : 'nh-assistant.page-context.exclude') | translate: { page: describeContext(context) }\"\n [attr.title]=\"(store.pageContextExcluded() ? 'nh-assistant.page-context.include' : 'nh-assistant.page-context.exclude') | translate: { page: describeContext(context) }\"\n (click)=\"store.setPageContextExcluded(!store.pageContextExcluded())\">\n <nh-assistant-icon [name]=\"store.pageContextExcluded() ? 'plus' : 'x'\" />\n </button>\n </div>\n }\n <nh-assistant-composer\n [disabled]=\"closed()\"\n [sendDisabled]=\"composerDisabled()\"\n [busy]=\"busy()\"\n [status]=\"composerStatus()\"\n [maxLength]=\"store.limits()?.maxMessageChars ?? null\"\n [restore]=\"store.restoredDraft()\"\n (restored)=\"store.consumeRestoredDraft()\"\n (send)=\"send($event)\"\n (cancel)=\"cancel()\" />\n </footer>\n }\n </section>\n</ng-template>\n","import { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantError } from '../services/nh-assistant.store';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../services/nh-assistant-transport';\n\n/** Converts any failure into a user-facing code and translation key, never raw text. */\nexport function toNhAssistantError(error: unknown): NhAssistantError {\n if (error instanceof NhAssistantApiError) {\n return { code: error.code, messageKey: error.messageKey };\n }\n\n return { code: NhAssistantClientErrorCodes.server, messageKey: nhAssistantErrorMessageKey(NhAssistantClientErrorCodes.server) };\n}\n\n/** Translation keys for an error, from the most to the least specific. */\nexport function nhAssistantErrorKeys(error: NhAssistantError | null): string[] {\n return error ? [error.messageKey, nhAssistantErrorMessageKey(error.code), 'nh-assistant.errors.generic'] : [];\n}\n\n/** Dash-case identifiers as the contract requires for agent and MCP server ids. */\nexport const NH_ASSISTANT_DASH_CASE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n","/*\n * Public API surface of @newheap/platform-ai-chat.\n */\nexport * from './lib/models/assistant-api.models';\nexport * from './lib/models/assistant-sse.models';\nexport * from './lib/models/assistant-admin.models';\nexport * from './lib/nh-assistant.config';\nexport * from './lib/provide-nh-assistant';\nexport * from './lib/i18n/nh-assistant-translations';\nexport * from './lib/services/nh-assistant-sse-parser';\nexport { NhAssistantStatusCodes } from './lib/services/nh-assistant-transport';\nexport * from './lib/services/nh-assistant-api.service';\nexport * from './lib/services/nh-assistant-admin-api.service';\nexport * from './lib/services/nh-assistant-reducer';\nexport * from './lib/services/nh-assistant-page-context';\nexport * from './lib/services/nh-assistant.store';\nexport * from './lib/services/nh-assistant-panel.service';\nexport { NH_ASSISTANT_ICONS, NhAssistantIconName } from './lib/internal/nh-assistant-icon.component';\nexport * from './lib/components/launcher/nh-assistant-launcher.component';\nexport * from './lib/components/panel/nh-assistant-panel.component';\nexport * from './lib/components/conversation-list/nh-assistant-conversation-list.component';\nexport * from './lib/components/thread/nh-assistant-thread.component';\nexport * from './lib/components/composer/nh-assistant-composer.component';\nexport * from './lib/components/tool-call-card/nh-assistant-tool-call-card.component';\nexport * from './lib/components/approval-card/nh-assistant-approval-card.component';\nexport * from './lib/components/agent-picker/nh-assistant-agent-picker.component';\nexport * from './lib/components/preferences/nh-assistant-preferences.component';\n\n/*\n * Internal building blocks shared with the secondary entry points. Not part of the public\n * API; they may change without notice.\n */\nexport { NhAssistantIconComponent as ɵNhAssistantIconComponent } from './lib/internal/nh-assistant-icon.component';\nexport { NhAssistantTranslatePipe as ɵNhAssistantTranslatePipe } from './lib/internal/nh-assistant-translate.pipe';\nexport {\n NH_ASSISTANT_DASH_CASE as ɵNH_ASSISTANT_DASH_CASE,\n nhAssistantErrorKeys as ɵnhAssistantErrorKeys,\n toNhAssistantError as ɵtoNhAssistantError\n} from './lib/internal/nh-assistant-errors';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId"],"mappings":"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"}