@newheap/platform-ai-chat 0.8.1 → 0.9.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-live.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-push.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/services/nh-assistant-share-link.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/activity/nh-assistant-activity.component.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/components/share/nh-assistant-share.component.ts","../../../projects/nh-ai-chat/src/lib/components/share/nh-assistant-share.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/internal/nh-assistant-part-groups.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/tool-call-group/nh-assistant-tool-call-group.component.ts","../../../projects/nh-ai-chat/src/lib/components/tool-call-group/nh-assistant-tool-call-group.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 /** Sharing, live update and notification features; missing on servers without them. */\n collaboration?: AssistantCollaboration | null;\n}\n\nexport interface AssistantCollaboration {\n /** Owners can invite colleagues directly through the application's directory. */\n directory: boolean;\n /** Path of the SignalR hub for live updates, for example `/hub/assistant`; `null` when off. */\n hubPath: string | null;\n /** Web Push notifications are configured on the server. */\n push: boolean;\n /** Maximum participants per conversation, not counting the owner. */\n maxParticipants: number;\n}\n\n/** The caller's relation to a conversation. */\nexport type ConversationRole = 'owner' | 'participant';\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 /** Default `owner` for servers without sharing. */\n role?: ConversationRole;\n /** People the owner shared the conversation with. */\n participantCount?: number;\n /** Sequence of the latest message. */\n lastMessageSequence?: number;\n /** The caller's read position; the conversation is unread while it is lower than `lastMessageSequence`. */\n lastReadSequence?: number;\n /** The owner or participant whose turn runs or waits for approval. */\n activeActorId?: string | null;\n}\n\nexport interface Conversation extends ConversationSummary {\n agentVersion: number;\n messages: Message[];\n pendingApproval: ApprovalPart | null;\n /** The owner followed by the participants; empty while the conversation is not shared. */\n members?: ConversationMember[];\n /** The current invitation-link token; only for the owner. */\n shareToken?: string | null;\n /** The caller's actor id, to recognize the caller's own messages. */\n currentActorId?: string | null;\n}\n\nexport type ConversationStatus = 'idle' | 'running' | 'waiting-for-approval' | 'failed' | 'archived';\n\n/** The owner or a participant of a shared conversation. */\nexport interface ConversationMember {\n actorId: string;\n /** `null` when the application provides no name. */\n displayName: string | null;\n role: ConversationRole;\n joinedAt: string;\n}\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant' | 'tool';\n createdAt: string;\n parts: MessagePart[];\n /** Position in the conversation; missing on optimistic messages and old servers. */\n sequence?: number;\n /** The writer of a user message. */\n authorActorId?: string | null;\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\n/** Response of `POST conversations/{id}/share-link`. */\nexport interface ShareLink {\n token: string;\n}\n\n/** A person the owner may invite, from the application's directory. */\nexport interface DirectoryEntry {\n actorId: string;\n displayName: string;\n detail: string | null;\n}\n\n/** Response of `GET` and `PUT notifications`. */\nexport interface NotificationSettings {\n /** The caller's choice; on by default. */\n pushEnabled: boolean;\n /** The server has Web Push configured. */\n pushAvailable: boolean;\n /** The VAPID key browsers subscribe with. */\n publicKey: string | null;\n}\n\n/** Body of `PUT notifications/push-subscription`: `PushSubscription.toJSON()` plus the text language. */\nexport interface PushSubscriptionRequest {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n language?: 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 /** The open conversation was deleted by its owner, or the user left or was removed. */\n conversationRemoved: 'assistant-conversation-removed'\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 * Live updates of shared and parallel conversations through the server's SignalR hub, which\n * `GET status` reports. Uses `@microsoft/signalr`, loaded on first use. Default `true`; when off\n * or unavailable the assistant reloads snapshots instead.\n */\n liveUpdates?: boolean;\n /**\n * Base the server's hub path is appended to, for example `'/api'` when a proxy serves the API\n * below a prefix, as for the NewHeap background operation hub. Default: the origin of `apiBaseUrl`.\n */\n hubBaseUrl?: string;\n /**\n * Web Push notifications for people who are away. Copy the bundled worker from\n * `node_modules/@newheap/platform-ai-chat/push` into the application's assets and point\n * `serviceWorkerUrl` to it. Without this setting the assistant never subscribes the browser.\n */\n push?: NhAssistantPushConfig;\n /**\n * Builds the invitation link an owner copies. Default: the current page with\n * `#nh-assistant-join=<conversationId>.<token>`; the panel joins when the page opens with it.\n */\n buildShareLink?: (conversationId: string, token: string) => string;\n}\n\nexport interface NhAssistantPushConfig {\n /** URL of the bundled worker, for example `/nh-assistant/nh-assistant-push-worker.js`. */\n serviceWorkerUrl: string;\n /**\n * Scope of the worker. Default: the worker's folder. Keep it apart from an application service\n * worker; the assistant worker only shows notifications and never controls pages.\n */\n scope?: string;\n /** Page a notification opens when no window of the application is open. Default `/`. */\n openUrl?: string;\n /** Icon URL of the notifications. */\n icon?: string;\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 DirectoryEntry,\n NotificationSettings,\n PushSubscriptionRequest,\n SendMessageRequest,\n ShareLink\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 /** Raises the caller's read position to `sequence`, or to the latest message when omitted. */\n markRead(conversationId: string, sequence?: number): Observable<void> {\n return this.transport.json<void>(\n 'POST',\n `conversations/${encodeURIComponent(conversationId)}/read`,\n sequence === undefined ? {} : { sequence }\n );\n }\n\n /** Owner only: creates a new invitation link; an earlier link stops working. */\n createShareLink(conversationId: string): Observable<ShareLink> {\n return this.transport.json<ShareLink>('POST', `conversations/${encodeURIComponent(conversationId)}/share-link`);\n }\n\n /** Owner only: the invitation link stops working; people who joined stay. */\n revokeShareLink(conversationId: string): Observable<void> {\n return this.transport.json<void>('DELETE', `conversations/${encodeURIComponent(conversationId)}/share-link`);\n }\n\n /** Joins a shared conversation with the token of its invitation link. */\n joinConversation(conversationId: string, token: string): Observable<Conversation> {\n return this.transport.json<Conversation>('POST', `conversations/${encodeURIComponent(conversationId)}/join`, { token });\n }\n\n /** Owner only: searches the application's directory for people to invite. */\n searchParticipantCandidates(conversationId: string, query: string): Observable<DirectoryEntry[]> {\n const path = `conversations/${encodeURIComponent(conversationId)}/participant-candidates?query=${encodeURIComponent(query)}`;\n return this.transport.json<DirectoryEntry[]>('GET', path);\n }\n\n /** Owner only: invites a person the directory returned. */\n inviteParticipant(conversationId: string, actorId: string): Observable<void> {\n return this.transport.json<void>('POST', `conversations/${encodeURIComponent(conversationId)}/participants`, { actorId });\n }\n\n /** The owner removes a participant, or a participant passes their own id to leave. */\n removeParticipant(conversationId: string, actorId: string): Observable<void> {\n const path = `conversations/${encodeURIComponent(conversationId)}/participants/${encodeURIComponent(actorId)}`;\n return this.transport.json<void>('DELETE', path);\n }\n\n /** The caller's notification choice and the server's Web Push key. */\n getNotificationSettings(): Observable<NotificationSettings> {\n return this.transport.json<NotificationSettings>('GET', 'notifications');\n }\n\n /** Turns push notifications on or off for every browser of the caller. */\n updateNotificationSettings(pushEnabled: boolean): Observable<NotificationSettings> {\n return this.transport.json<NotificationSettings>('PUT', 'notifications', { pushEnabled });\n }\n\n /** Registers this browser's push subscription for the caller. */\n subscribePush(subscription: PushSubscriptionRequest): Observable<void> {\n return this.transport.json<void>('PUT', 'notifications/push-subscription', subscription);\n }\n\n /** Removes this browser's push subscription. */\n unsubscribePush(endpoint: string): Observable<void> {\n return this.transport.json<void>('DELETE', 'notifications/push-subscription', { endpoint });\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 { DestroyRef, EnvironmentInjector, Injectable, PLATFORM_ID, inject, runInInjectionContext, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { HubConnection } from '@microsoft/signalr';\nimport { Observable, Subject } from 'rxjs';\nimport {\n LiveConversationChanged,\n LiveConversationEvent,\n LiveConversationRead,\n LiveConversationRemoved\n} from '../models/assistant-live.models';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\n\nexport type NhAssistantLiveState = 'off' | 'connecting' | 'connected' | 'reconnecting' | 'disconnected';\n\nconst reconnectDelaysMs = [0, 2_000, 5_000, 10_000, 30_000];\nconst restartDelayMs = 30_000;\n\n/**\n * Live updates of the assistant hub: conversation changes, read positions, removals and the\n * turn events of other sessions. Connects only while the store asks for it, reconnects on its\n * own and emits `resync` after every (re)connect, because updates sent while disconnected are lost.\n */\n@Injectable()\nexport class NhAssistantLiveService {\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly injector = inject(EnvironmentInjector);\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly changedSubject = new Subject<LiveConversationChanged>();\n private readonly readSubject = new Subject<LiveConversationRead>();\n private readonly removedSubject = new Subject<LiveConversationRemoved>();\n private readonly eventSubject = new Subject<LiveConversationEvent>();\n private readonly resyncSubject = new Subject<void>();\n private readonly stateSignal = signal<NhAssistantLiveState>('off');\n\n private connection?: HubConnection;\n private hubPath: string | null = null;\n private hubUrl: string | null = null;\n private revision = 0;\n private restartTimer?: ReturnType<typeof setTimeout>;\n\n readonly changed$: Observable<LiveConversationChanged> = this.changedSubject.asObservable();\n readonly read$: Observable<LiveConversationRead> = this.readSubject.asObservable();\n readonly removed$: Observable<LiveConversationRemoved> = this.removedSubject.asObservable();\n readonly events$: Observable<LiveConversationEvent> = this.eventSubject.asObservable();\n /** Reload snapshots: emitted after every (re)connect. */\n readonly resync$: Observable<void> = this.resyncSubject.asObservable();\n readonly state = this.stateSignal.asReadonly();\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n void this.stop();\n this.changedSubject.complete();\n this.readSubject.complete();\n this.removedSubject.complete();\n this.eventSubject.complete();\n this.resyncSubject.complete();\n });\n }\n\n /**\n * Connects to the hub at `hubPath`, or disconnects when it is `null`. Calling it again with the\n * same path keeps the connection; another path or `restart` reconnects, for example after the\n * signed-in user changed.\n */\n async connect(hubPath: string | null, restart = false): Promise<void> {\n const url = this.browser && this.config.liveUpdates !== false && hubPath ? this.resolveUrl(hubPath) : null;\n if (!restart && url === this.hubUrl && this.connection) {\n return;\n }\n\n await this.stop();\n this.hubPath = url ? hubPath : null;\n this.hubUrl = url;\n if (!url) {\n return;\n }\n\n const revision = ++this.revision;\n this.stateSignal.set('connecting');\n try {\n const connection = await this.build(url);\n if (revision !== this.revision) {\n await connection.stop().catch(() => undefined);\n return;\n }\n this.connection = connection;\n await connection.start();\n if (revision === this.revision) {\n this.stateSignal.set('connected');\n this.resyncSubject.next();\n }\n } catch {\n // Live updates are optional; snapshots keep the assistant correct. Try again later.\n if (revision === this.revision) {\n this.stateSignal.set('disconnected');\n this.scheduleRestart(revision);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.revision++;\n this.hubUrl = null;\n clearTimeout(this.restartTimer);\n const connection = this.connection;\n this.connection = undefined;\n this.stateSignal.set('off');\n if (connection) {\n await connection.stop().catch(() => undefined);\n }\n }\n\n private async build(url: string): Promise<HubConnection> {\n const signalR = await import('@microsoft/signalr');\n const connection = new signalR.HubConnectionBuilder()\n .withUrl(url, {\n accessTokenFactory: async () => (await this.token()) ?? ''\n })\n .withAutomaticReconnect(reconnectDelaysMs)\n .configureLogging(signalR.LogLevel.None)\n .build();\n\n connection.on('ConversationChanged', (message: LiveConversationChanged) => this.changedSubject.next(message));\n connection.on('ConversationRead', (message: LiveConversationRead) => this.readSubject.next(message));\n connection.on('ConversationRemoved', (message: LiveConversationRemoved) => this.removedSubject.next(message));\n connection.on('ConversationEvent', (message: LiveConversationEvent) => this.eventSubject.next(message));\n connection.onreconnecting(() => this.stateSignal.set('reconnecting'));\n connection.onreconnected(() => {\n this.stateSignal.set('connected');\n this.resyncSubject.next();\n });\n connection.onclose(() => {\n if (this.connection === connection) {\n this.connection = undefined;\n this.stateSignal.set('disconnected');\n this.scheduleRestart(this.revision);\n }\n });\n return connection;\n }\n\n /** Starts over after the automatic reconnect gave up or the first start failed. */\n private scheduleRestart(revision: number): void {\n clearTimeout(this.restartTimer);\n this.restartTimer = setTimeout(() => {\n if (revision === this.revision && this.hubPath) {\n void this.connect(this.hubPath, true);\n }\n }, restartDelayMs);\n }\n\n private async token(): Promise<string | null> {\n try {\n return await runInInjectionContext(this.injector, () => this.config.getAccessToken());\n } catch {\n return null;\n }\n }\n\n /** `hubBaseUrl` + `hubPath`, or the hub path on the origin of `apiBaseUrl`. */\n private resolveUrl(hubPath: string): string {\n const page = globalThis.location?.href ?? 'http://localhost';\n if (this.config.hubBaseUrl) {\n const base = new URL(this.config.hubBaseUrl, page).toString().replace(/\\/+$/, '');\n return `${base}/${hubPath.replace(/^\\/+/, '')}`;\n }\n return new URL(hubPath, new URL(this.config.apiBaseUrl, page).origin).toString();\n }\n}\n","import { DestroyRef, Injectable, PLATFORM_ID, computed, inject, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable, Subject, firstValueFrom } from 'rxjs';\nimport { NotificationSettings } from '../models/assistant-api.models';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantApiService } from './nh-assistant-api.service';\n\n/**\n * Push state of this browser for the signed-in user:\n * - `unavailable`: the server, the browser or the host configuration does not support Web Push;\n * - `off`: the user turned notifications off;\n * - `prompt`: on, but the browser has not asked for permission yet (it asks on the next message sent);\n * - `blocked`: on, but the browser denied permission;\n * - `on`: this browser receives notifications.\n */\nexport type NhAssistantPushState = 'unavailable' | 'off' | 'prompt' | 'blocked' | 'on';\n\nconst openConversationMessage = 'nh-assistant.open-conversation';\n\n/**\n * Keeps this browser's Web Push subscription in line with the user's choice. Notifications are on\n * by default; because browsers only ask for permission after a user action, the assistant asks\n * when the user sends a message or turns notifications on. The bundled service worker shows a\n * notification only when no window of the application is focused.\n */\n@Injectable()\nexport class NhAssistantPushService {\n private readonly api = inject(NhAssistantApiService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly settingsState = signal<NotificationSettings | null>(null);\n private readonly permissionState = signal<NotificationPermission | 'unsupported'>('default');\n private readonly subscribedState = signal(false);\n private readonly busyState = signal(false);\n private readonly openSubject = new Subject<string>();\n private registration?: Promise<ServiceWorkerRegistration>;\n private revision = 0;\n private readonly onWorkerMessage = (event: MessageEvent) => {\n const data = event.data as { type?: unknown; conversationId?: unknown } | null;\n if (data?.type === openConversationMessage && typeof data.conversationId === 'string') {\n this.openSubject.next(data.conversationId);\n }\n };\n\n /** The caller's server-side choice, or `null` before it was loaded. */\n readonly settings = this.settingsState.asReadonly();\n readonly busy = this.busyState.asReadonly();\n /** Conversations a clicked notification asks to open. */\n readonly openConversation$: Observable<string> = this.openSubject.asObservable();\n readonly state = computed<NhAssistantPushState>(() => {\n const settings = this.settingsState();\n if (!settings?.pushAvailable || !this.isSupported()) {\n return 'unavailable';\n }\n if (!settings.pushEnabled) {\n return 'off';\n }\n const permission = this.permissionState();\n if (permission === 'denied' || permission === 'unsupported') {\n return 'blocked';\n }\n return permission === 'granted' && this.subscribedState() ? 'on' : 'prompt';\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n if (this.browser && this.isSupported()) {\n navigator.serviceWorker.removeEventListener('message', this.onWorkerMessage);\n }\n this.openSubject.complete();\n });\n if (this.browser && this.isSupported()) {\n navigator.serviceWorker.addEventListener('message', this.onWorkerMessage);\n navigator.serviceWorker.startMessages();\n }\n }\n\n /**\n * Loads the user's choice and, when permission was granted before, renews this browser's\n * subscription, which also moves it to the current user and to a rotated server key.\n */\n async activate(serverSupportsPush: boolean): Promise<void> {\n const revision = ++this.revision;\n if (!serverSupportsPush || !this.isSupported()) {\n this.settingsState.set(null);\n return;\n }\n\n try {\n const settings = await firstValueFrom(this.api.getNotificationSettings());\n if (revision !== this.revision) {\n return;\n }\n this.settingsState.set(settings);\n this.permissionState.set(Notification.permission);\n if (settings.pushEnabled && Notification.permission === 'granted') {\n await this.subscribe(settings);\n }\n } catch {\n // Notifications are optional; the assistant works without them.\n if (revision === this.revision) {\n this.settingsState.set(null);\n }\n }\n }\n\n /**\n * Forgets the user. The browser subscription is cancelled, so a previous user on a shared device\n * stops receiving notifications even when the server cannot be told.\n */\n async deactivate(): Promise<void> {\n this.revision++;\n this.settingsState.set(null);\n this.subscribedState.set(false);\n if (!this.isSupported()) {\n return;\n }\n try {\n const registration = await navigator.serviceWorker.getRegistration(this.scope());\n const subscription = await registration?.pushManager.getSubscription();\n await subscription?.unsubscribe();\n } catch {\n // Nothing to cancel.\n }\n }\n\n /** Asks for permission once, after a user action such as sending a message. */\n async onUserGesture(): Promise<void> {\n const settings = this.settingsState();\n if (!settings?.pushEnabled || !settings.pushAvailable || !this.isSupported() || Notification.permission !== 'default') {\n return;\n }\n const permission = await Notification.requestPermission();\n this.permissionState.set(permission);\n if (permission === 'granted') {\n await this.subscribe(settings);\n }\n }\n\n /** Turns notifications on or off for every browser of the user. Call it from a user action. */\n async setEnabled(enabled: boolean): Promise<void> {\n this.busyState.set(true);\n try {\n const settings = await firstValueFrom(this.api.updateNotificationSettings(enabled));\n this.settingsState.set(settings);\n if (!this.isSupported()) {\n return;\n }\n if (enabled) {\n if (Notification.permission === 'default') {\n this.permissionState.set(await Notification.requestPermission());\n }\n if (Notification.permission === 'granted') {\n await this.subscribe(settings);\n }\n return;\n }\n await this.unsubscribe();\n } finally {\n this.busyState.set(false);\n }\n }\n\n private async subscribe(settings: NotificationSettings): Promise<void> {\n if (!settings.publicKey) {\n return;\n }\n const revision = this.revision;\n const registration = await this.register();\n const key = decodeBase64Url(settings.publicKey);\n let subscription = await registration.pushManager.getSubscription();\n if (subscription && !sameKey(subscription.options.applicationServerKey, key)) {\n // The server rotated its key; a subscription for the old key would be refused.\n await subscription.unsubscribe();\n subscription = null;\n }\n subscription ??= await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n const json = subscription.toJSON();\n if (!json.endpoint || !json.keys?.['p256dh'] || !json.keys['auth'] || revision !== this.revision) {\n return;\n }\n await firstValueFrom(this.api.subscribePush({\n endpoint: json.endpoint,\n keys: { p256dh: json.keys['p256dh'], auth: json.keys['auth'] },\n language: this.translate?.getCurrentLang() ?? navigator.language\n }), { defaultValue: undefined });\n if (revision === this.revision) {\n this.subscribedState.set(true);\n }\n }\n\n private async unsubscribe(): Promise<void> {\n this.subscribedState.set(false);\n const registration = await navigator.serviceWorker.getRegistration(this.scope());\n const subscription = await registration?.pushManager.getSubscription();\n if (!subscription) {\n return;\n }\n await firstValueFrom(this.api.unsubscribePush(subscription.endpoint), { defaultValue: undefined }).catch(() => undefined);\n await subscription.unsubscribe();\n }\n\n private register(): Promise<ServiceWorkerRegistration> {\n const push = this.config.push!;\n this.registration ??= (async () => {\n const url = new URL(push.serviceWorkerUrl, location.href);\n url.searchParams.set('app', new URL(push.openUrl ?? '/', location.href).href);\n if (push.icon) {\n url.searchParams.set('icon', new URL(push.icon, location.href).href);\n }\n return navigator.serviceWorker.register(url.href, { scope: this.scope() });\n })();\n return this.registration;\n }\n\n private scope(): string {\n const push = this.config.push;\n if (!push) {\n return '/';\n }\n return push.scope ?? new URL('./', new URL(push.serviceWorkerUrl, location.href)).pathname;\n }\n\n private isSupported(): boolean {\n return this.browser\n && !!this.config.push?.serviceWorkerUrl\n && globalThis.isSecureContext === true\n && 'serviceWorker' in navigator\n && 'PushManager' in globalThis\n && 'Notification' in globalThis;\n }\n}\n\nfunction decodeBase64Url(value: string): Uint8Array<ArrayBuffer> {\n const base64 = value.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(value.length / 4) * 4, '=');\n const binary = atob(base64);\n const bytes = new Uint8Array(new ArrayBuffer(binary.length));\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction sameKey(current: ArrayBuffer | null, expected: Uint8Array): boolean {\n if (!current) {\n return false;\n }\n const bytes = new Uint8Array(current);\n return bytes.length === expected.length && bytes.every((byte, index) => byte === expected[index]);\n}\n","import {\n ApprovalPart,\n Conversation,\n ConversationStatus,\n Message,\n MessagePart,\n ToolCallPart\n} from '../models/assistant-api.models';\nimport { LiveConversationChanged, LiveConversationEvent } from '../models/assistant-live.models';\nimport { NH_ASSISTANT_SSE_EVENT_TYPES, 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 * Applies a live update of another session: `message.created` adds a participant's message,\n * the turn events behave exactly like the starting request's stream. Unknown types are ignored.\n */\nexport function applyNhAssistantLiveEvent(conversation: Conversation, event: LiveConversationEvent): Conversation {\n if (event.type === 'message.created') {\n const message = event.data as Message;\n if (!message?.id || conversation.messages.some(existing => existing.id === message.id)) {\n return conversation;\n }\n return { ...conversation, messages: [...conversation.messages, message] };\n }\n\n if (!(NH_ASSISTANT_SSE_EVENT_TYPES as readonly string[]).includes(event.type)) {\n return conversation;\n }\n return applyNhAssistantEvent(conversation, { type: event.type, data: event.data } as NhAssistantSseEvent);\n}\n\n/** Applies the shared state of a conversation that a live update announced. */\nexport function applyNhAssistantConversationChange(conversation: Conversation, change: LiveConversationChanged): Conversation {\n return {\n ...conversation,\n status: change.status,\n title: change.title,\n updatedAt: change.updatedAt,\n activeActorId: change.activeActorId,\n lastMessageSequence: change.lastMessageSequence,\n participantCount: change.participantCount,\n pendingApproval: change.status === 'waiting-for-approval' ? conversation.pendingApproval : null\n };\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 { DOCUMENT } from '@angular/common';\nimport {\n DestroyRef,\n EnvironmentInjector,\n Injectable,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n runInInjectionContext,\n signal,\n untracked\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Observable, Subscription, firstValueFrom, isObservable } from 'rxjs';\nimport {\n AgentSummary,\n ApprovalDecision,\n AssistantStatus,\n ClientContext,\n Conversation,\n ConversationMember,\n ConversationStatus,\n ConversationSummary,\n DirectoryEntry\n} from '../models/assistant-api.models';\nimport {\n LiveConversationChanged,\n LiveConversationEvent,\n LiveConversationRead,\n LiveConversationRemoved\n} from '../models/assistant-live.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 { NhAssistantLiveService } from './nh-assistant-live.service';\nimport { NhAssistantPushService } from './nh-assistant-push.service';\nimport {\n applyNhAssistantApprovalDecision,\n applyNhAssistantConversationChange,\n applyNhAssistantEvent,\n applyNhAssistantLiveEvent,\n nhAssistantLatestTurnHasText\n} 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/** An unsent message held in this tab, scoped to its original conversation. */\nexport interface NhAssistantQueuedMessage {\n id: string;\n conversationId: string;\n text: string;\n state: 'preparing' | 'queued' | 'sending' | 'failed';\n}\n\ninterface QueuedMessage extends NhAssistantQueuedMessage {\n clientContext?: ClientContext | null;\n}\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\n\n/**\n * A conversation that needs attention outside the open thread: a turn runs, an approval waits or\n * there is something unread.\n */\nexport interface NhAssistantActivity {\n id: string;\n title: string | null;\n status: ConversationStatus;\n unread: boolean;\n shared: boolean;\n /** True for the conversation shown in the panel. */\n active: boolean;\n updatedAt: string;\n}\n\n/** True when a conversation has messages the caller has not read. A running turn is not unread yet. */\nexport function nhAssistantIsUnread(summary: Pick<ConversationSummary, 'status' | 'lastMessageSequence' | 'lastReadSequence'>): boolean {\n if (summary.status === 'running' || summary.lastReadSequence === undefined) {\n return false;\n }\n return (summary.lastMessageSequence ?? 0) > summary.lastReadSequence;\n}\n\n/** The state of one conversation this tab has opened. */\ninterface NhAssistantSession {\n conversation: Conversation;\n /** A request of this tab streams a turn of the conversation. */\n streaming: boolean;\n deciding: boolean;\n error: NhAssistantError | null;\n notice: NhAssistantNotice | null;\n lastUsage: TurnUsage | null;\n}\n\nconst conversationPageSize = 50;\nconst cancelGracePeriodMs = 5_000;\nconst maxSessions = 20;\nconst refreshDelayMs = 300;\nconst newConversationKey = '';\n\n/**\n * Signal-based state of one assistant scope: availability, agents, the conversation list and\n * every conversation this tab has opened. Several conversations can run turns at the same time;\n * the public signals describe the conversation that is open in the panel. With live updates the\n * store follows turns of other people and of the user's other tabs.\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 private readonly live = inject(NhAssistantLiveService);\n private readonly push = inject(NhAssistantPushService);\n private readonly document = inject(DOCUMENT);\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\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 sessionsState = signal<ReadonlyMap<string, NhAssistantSession>>(new Map());\n private readonly activeIdState = signal<string | null>(null);\n private readonly conversationLoadingState = signal(false);\n /** The conversation a message is being prepared for; `''` while a new conversation is created. */\n private readonly sendingState = signal<string | null>(null);\n private readonly draftErrorState = signal<NhAssistantError | 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 private readonly viewingState = signal(false);\n private readonly pageVisibleState = signal(true);\n private readonly queuedState = signal<QueuedMessage[]>([]);\n private readonly pausedQueuesState = signal<ReadonlySet<string>>(new Set());\n private readonly queueDispatchState = signal<string | null>(null);\n private readonly steeringState = signal<string | null>(null);\n private readonly submittingState = signal(false);\n private destroyed = false;\n\n private readonly streams = new Map<string, Subscription>();\n private readonly cancelTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly pendingSendResolves = new Map<string, (accepted: boolean) => void>();\n private readonly markingRead = new Set<string>();\n private readonly liveSubscription = new Subscription();\n private accessSubscription?: Subscription;\n private refreshTimer?: ReturnType<typeof setTimeout>;\n private initialization?: Promise<void>;\n private statusRevision = 0;\n private accountRevision = 0;\n private collaborationKey: string | null = null;\n\n private readonly activeSession = computed(() => {\n const id = this.activeIdState();\n return id === null ? null : this.sessionsState().get(id) ?? null;\n });\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 /** Sharing, live update and notification features the server offers. */\n readonly collaboration = computed(() => this.statusState()?.collaboration ?? null);\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 /** The conversation open in the panel, or `null` for a new one. */\n readonly activeConversation = computed(() => this.activeSession()?.conversation ?? null);\n readonly conversationLoading = this.conversationLoadingState.asReadonly();\n /** True while this tab sends a message or streams a turn of the open conversation. */\n readonly streaming = computed(() => {\n const sending = this.sendingState();\n const activeId = this.activeIdState();\n return (sending !== null && sending === (activeId ?? newConversationKey)) || this.activeSession()?.streaming === true;\n });\n readonly pendingApproval = computed(() => this.activeConversation()?.pendingApproval ?? null);\n readonly deciding = computed(() => this.activeSession()?.deciding === true);\n readonly error = computed(() => this.activeIdState() === null ? this.draftErrorState() : this.activeSession()?.error ?? null);\n /** Non-blocking remark about the latest completed turn; shown only while no error is shown. */\n readonly notice = computed(() => this.activeSession()?.notice ?? null);\n readonly lastUsage = computed(() => this.activeSession()?.lastUsage ?? null);\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.activeConversation();\n const blocked = conversation !== null && conversation.status !== 'idle';\n return this.enabled() && this.selectedAgentIdState() !== null && !this.streaming() && !this.conversationLoadingState() && !blocked;\n });\n /** Messages not yet accepted by the server, for the open conversation. Never persisted. */\n readonly queuedMessages = computed<readonly NhAssistantQueuedMessage[]>(() =>\n this.queuedState().filter(item => item.conversationId === this.activeIdState()));\n /** Sending or queueing is available during a turn and while an approval waits. */\n readonly canSubmit = computed(() => (this.canSend() && !this.submittingState()) || (this.enabled()\n && !this.conversationLoading() && this.activeConversation() !== null\n && ['idle', 'running', 'waiting-for-approval'].includes(this.activeConversation()!.status)));\n readonly queuePaused = computed(() => this.pausedQueuesState().has(this.activeIdState() ?? '') || this.error() !== null);\n /** Steering cancels the active turn before sending the selected correction. */\n readonly canSteer = computed(() => {\n const conversation = this.activeConversation();\n const ownsTurn = conversation?.activeActorId && conversation.currentActorId\n ? conversation.activeActorId === conversation.currentActorId : this.activeSession()?.streaming === true;\n return this.enabled() && this.steeringState() === null && !this.submittingState()\n && this.queueDispatchState() === null\n && ['running', 'waiting-for-approval'].includes(conversation?.status ?? '')\n && (this.isOwner() || ownsTurn);\n });\n /** The owner and participants of the open conversation; empty while it is not shared. */\n readonly members = computed<ConversationMember[]>(() => this.activeConversation()?.members ?? []);\n /** True when the current user owns the open conversation (or it is new). */\n readonly isOwner = computed(() => (this.activeConversation()?.role ?? 'owner') === 'owner');\n /** True when the current user may decide the pending approval: it belongs to their own turn. */\n readonly canDecide = computed(() => {\n const conversation = this.activeConversation();\n if (!conversation?.pendingApproval) {\n return false;\n }\n return !conversation.activeActorId || !conversation.currentActorId || conversation.activeActorId === conversation.currentActorId;\n });\n /** The member whose turn runs or waits in the open conversation, when it is someone else. */\n readonly activeMember = computed<ConversationMember | null>(() => {\n const conversation = this.activeConversation();\n if (!conversation?.activeActorId || conversation.activeActorId === conversation.currentActorId) {\n return null;\n }\n return conversation.members?.find(member => member.actorId === conversation.activeActorId) ?? null;\n });\n /** Conversations that need attention: running, waiting for approval or unread. Most recent first. */\n readonly activity = computed<NhAssistantActivity[]>(() => {\n const sessions = this.sessionsState();\n const activeId = this.activeIdState();\n return this.conversationsState()\n .map(summary => {\n const session = sessions.get(summary.id);\n const status = session?.streaming ? session.conversation.status : summary.status;\n return {\n id: summary.id,\n title: summary.title,\n status,\n unread: nhAssistantIsUnread({ ...summary, status }),\n shared: (summary.participantCount ?? 0) > 0,\n active: summary.id === activeId,\n updatedAt: summary.updatedAt\n };\n })\n .filter(item => item.status === 'running' || item.status === 'waiting-for-approval' || item.unread);\n });\n readonly runningCount = computed(() => this.activity().filter(item => item.status === 'running').length);\n readonly waitingCount = computed(() => this.activity().filter(item => item.status === 'waiting-for-approval').length);\n readonly unreadCount = computed(() => this.activity().filter(item => item.unread).length);\n /** Live update connection state. */\n readonly liveState = this.live.state;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => {\n this.destroyed = true;\n this.accessSubscription?.unsubscribe();\n this.liveSubscription.unsubscribe();\n this.stopAllTurns();\n clearTimeout(this.refreshTimer);\n });\n\n effect(() => {\n const queued = this.queuedState();\n const sessions = this.sessionsState();\n const paused = this.pausedQueuesState();\n const steering = this.steeringState();\n const steeringItem = queued.find(item => item.id === steering);\n const steeringSession = steeringItem ? sessions.get(steeringItem.conversationId) : null;\n if (steering && (!steeringItem || steeringSession?.error\n || (steeringSession?.conversation.status === 'idle' && !steeringSession.streaming))) {\n untracked(() => this.steeringState.set(null));\n }\n if (!this.enabled() || this.queueDispatchState() !== null || this.sendingState() !== null || this.submittingState()) {\n return;\n }\n const next = queued.find((item, index) => {\n const session = sessions.get(item.conversationId);\n return item.state === 'queued' && !paused.has(item.conversationId)\n && !queued.slice(0, index).some(previous => previous.conversationId === item.conversationId)\n && session?.conversation.status === 'idle' && !session.streaming && !session.deciding && !session.error;\n });\n if (next) {\n untracked(() => void this.dispatchQueued(next));\n }\n });\n\n this.liveSubscription.add(this.live.changed$.subscribe(change => this.onLiveChanged(change)));\n this.liveSubscription.add(this.live.read$.subscribe(read => this.onLiveRead(read)));\n this.liveSubscription.add(this.live.removed$.subscribe(removed => this.onLiveRemoved(removed)));\n this.liveSubscription.add(this.live.events$.subscribe(event => this.onLiveEvent(event)));\n this.liveSubscription.add(this.live.resync$.subscribe(() => this.resync()));\n\n if (this.browser) {\n const update = () => this.pageVisibleState.set(this.document.visibilityState === 'visible' && this.document.hasFocus());\n const visible = () => {\n update();\n if (this.document.visibilityState === 'visible' && this.enabled()) {\n // Without live updates, or on another instance, coming back reloads the list.\n void this.refreshConversations();\n }\n };\n this.document.addEventListener('visibilitychange', visible);\n globalThis.addEventListener?.('focus', update);\n globalThis.addEventListener?.('blur', update);\n destroyRef.onDestroy(() => {\n this.document.removeEventListener('visibilitychange', visible);\n globalThis.removeEventListener?.('focus', update);\n globalThis.removeEventListener?.('blur', update);\n });\n update();\n }\n\n // Marks the open conversation as read while the user looks at it.\n effect(() => {\n this.activeIdState();\n this.viewingState();\n this.pageVisibleState();\n this.conversationsState();\n this.sessionsState();\n untracked(() => this.markActiveReadWhenSeen());\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.resetAccount();\n this.statusState.set(null);\n this.selectedAgentIdState.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.resetAccount();\n this.statusState.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 this.startCollaboration(status);\n if (this.activeIdState() === null && 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.map(item => this.withLocalState(item)));\n this.conversationsTotalState.set(page.total);\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(this.activeIdState(), 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 open 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.activeConversation();\n if (active && active.agentId !== agentId) {\n this.startNewConversation();\n }\n }\n\n /**\n * Leaves the open conversation; the next message creates a new one. Turns of other\n * conversations keep running in the background.\n */\n startNewConversation(): void {\n this.activeIdState.set(null);\n this.uiState.update({ conversationId: null });\n this.draftErrorState.set(null);\n }\n\n /** Opens a conversation; one that this tab already follows opens immediately. */\n async openConversation(conversationId: string): Promise<void> {\n await this.loadConversation(conversationId, false);\n }\n\n /** Tells the store whether the user can see the open thread, so it can mark it as read. */\n setViewing(viewing: boolean): void {\n this.viewingState.set(viewing);\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n if (this.sessionsState().get(conversationId)?.streaming) {\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.forget(conversationId);\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(this.activeIdState(), error);\n }\n }\n }\n\n /**\n * Sends a user message. Creates a conversation with the selected agent when none is open,\n * shows the message optimistically and applies the streamed events. Other conversations keep\n * their own turns. Resolves `false` when the message was not accepted.\n */\n async send(text: string): Promise<boolean> {\n // Browsers only ask for notification permission during a user action such as this one.\n void this.push.onUserGesture().catch(() => undefined);\n return this.sendMessage(text);\n }\n\n /** Sends immediately when idle, otherwise appends to the conversation's FIFO queue. */\n async submit(text: string): Promise<boolean> {\n if (this.canSend() && this.queuedMessages().length === 0 && !this.queuePaused() && !this.submittingState()) {\n const revision = this.accountRevision;\n this.submittingState.set(true);\n try {\n return await this.send(text);\n } finally {\n if (revision === this.accountRevision && !this.destroyed) {\n this.submittingState.set(false);\n }\n }\n }\n const conversationId = this.activeIdState();\n const trimmed = text.trim();\n if (!conversationId || !this.canSubmit() || !trimmed || trimmed.length > (this.limits()?.maxMessageChars ?? Infinity)) {\n return false;\n }\n void this.push.onUserGesture().catch(() => undefined);\n const revision = this.accountRevision;\n const item: QueuedMessage = { id: createClientMessageId(), conversationId, text: trimmed, state: 'preparing' };\n this.queuedState.update(items => [...items, item]);\n const clientContext = await this.contextForMessage();\n if (revision !== this.accountRevision || this.destroyed) {\n return false;\n }\n this.queuedState.update(items => items.map(current => current.id === item.id\n ? { ...current, state: 'queued', clientContext } : current));\n return true;\n }\n\n /** Edits an unsent queued message without replacing the composer's current draft. */\n updateQueuedMessage(id: string, text: string): boolean {\n const trimmed = text.trim();\n if (!trimmed || trimmed.length > (this.limits()?.maxMessageChars ?? Infinity)\n || !this.queuedMessages().some(item => item.id === id && item.state !== 'sending')) {\n return false;\n }\n this.queuedState.update(items => items.map(item => item.id === id ? { ...item, text: trimmed } : item));\n return true;\n }\n\n removeQueuedMessage(id: string): void {\n this.queuedState.update(items => items.filter(item => item.id !== id\n || item.conversationId !== this.activeIdState() || item.state === 'sending'));\n }\n\n /** Pauses automatic dispatch while keeping all unsent messages available. */\n pauseQueue(): void {\n const conversationId = this.activeIdState();\n if (conversationId) {\n this.pausedQueuesState.update(paused => new Set([...paused, conversationId]));\n }\n }\n\n /** Explicitly resumes after Stop or a failure; approval decisions remain separate. */\n resumeQueue(): void {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return;\n }\n this.pausedQueuesState.update(paused => new Set([...paused].filter(id => id !== conversationId)));\n this.patchSession(conversationId, session => ({ ...session, error: null }));\n this.queuedState.update(items => items.map(item => item.conversationId === conversationId && item.state === 'failed'\n ? { ...item, state: 'queued' } : item));\n }\n\n /** Prioritizes a queued correction and waits for confirmed cancellation before dispatch. */\n async steerQueuedMessage(id: string): Promise<void> {\n const item = this.queuedState().find(message => message.id === id && message.conversationId === this.activeIdState());\n if (!item || item.state !== 'queued' || !this.canSteer()) {\n return;\n }\n this.steeringState.set(id);\n this.queuedState.update(items => [item, ...items.filter(message => message.id !== id)]);\n this.resumeQueue();\n try {\n await this.cancelConversation(item.conversationId);\n } finally {\n if (this.steeringState() === id && this.sessionsState().get(item.conversationId)?.error) {\n this.steeringState.set(null);\n }\n }\n }\n\n private async dispatchQueued(item: QueuedMessage): Promise<void> {\n const revision = this.accountRevision;\n this.queueDispatchState.set(item.id);\n this.queuedState.update(items => items.map(current => current.id === item.id ? { ...current, state: 'sending' } : current));\n const accepted = await this.sendMessage(item.text, item);\n if (revision !== this.accountRevision || this.destroyed) {\n return;\n }\n this.queuedState.update(items => accepted ? items.filter(current => current.id !== item.id)\n : items.map(current => current.id === item.id ? { ...current, state: 'failed' } : current));\n if (!accepted) {\n this.pausedQueuesState.update(paused => new Set([...paused, item.conversationId]));\n }\n this.queueDispatchState.set(null);\n }\n\n private async sendMessage(text: string, queued?: QueuedMessage): Promise<boolean> {\n const trimmed = text.trim();\n const accountRevision = this.accountRevision;\n await this.initialize();\n await this.reloadStatus();\n if (accountRevision !== this.accountRevision || this.destroyed) {\n return false;\n }\n let conversation = queued ? this.sessionsState().get(queued.conversationId)?.conversation ?? null : this.activeConversation();\n const session = queued ? this.sessionsState().get(queued.conversationId) : null;\n const available = queued ? this.enabled() && !this.pausedQueuesState().has(queued.conversationId)\n && conversation?.status === 'idle' && !session?.streaming\n && !session?.deciding && this.agents().some(agent => agent.id === conversation?.agentId) : this.canSend();\n const maxChars = this.limits()?.maxMessageChars ?? Number.MAX_SAFE_INTEGER;\n if (trimmed.length === 0 || trimmed.length > maxChars || !available) {\n return false;\n }\n\n this.sendingState.set(conversation?.id ?? newConversationKey);\n if (!queued) {\n this.restoredDraftState.set(null);\n }\n this.draftErrorState.set(null);\n\n if (!conversation) {\n conversation = await this.createConversation();\n if (!conversation) {\n if (accountRevision === this.accountRevision) {\n this.sendingState.set(null);\n this.restoredDraftState.set(text);\n }\n return false;\n }\n this.sendingState.set(conversation.id);\n }\n\n const clientContext = queued ? queued.clientContext : await this.contextForMessage();\n if (accountRevision !== this.accountRevision) {\n return false;\n }\n const conversationId = conversation.id;\n const clientMessageId = createClientMessageId();\n const previousStatus = conversation.status;\n this.patchSession(conversationId, session => ({\n ...session,\n error: null,\n notice: null,\n conversation: {\n ...session.conversation,\n status: 'running',\n messages: [\n ...session.conversation.messages,\n {\n id: clientMessageId,\n role: 'user',\n createdAt: new Date().toISOString(),\n parts: [{ type: 'text', text: trimmed }],\n authorActorId: session.conversation.currentActorId ?? null\n }\n ]\n }\n }));\n this.patchSummary(conversationId, { status: 'running', updatedAt: new Date().toISOString() });\n\n return new Promise<boolean>(resolve => {\n this.pendingSendResolves.set(conversationId, resolve);\n let started = false;\n let failedAfterStart = false;\n\n this.runStream(conversationId, 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(conversationId, clientMessageId, previousStatus);\n if (!queued && this.activeIdState() === conversationId) {\n this.restoredDraftState.set(text);\n }\n this.patchSession(conversationId, session => ({ ...session, error: 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(conversationId, event, clientMessageId);\n },\n complete: () => {\n this.pendingSendResolves.delete(conversationId);\n resolve(started);\n this.afterTurn(conversationId, failedAfterStart);\n }\n });\n this.sendingState.set(null);\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 session = this.activeSession();\n const conversation = session?.conversation;\n const approval = conversation?.pendingApproval ?? null;\n if (!session || !conversation || !approval || session.deciding || session.streaming || !this.canDecide()) {\n return;\n }\n\n const conversationId = conversation.id;\n this.patchSession(conversationId, current => ({ ...current, deciding: true, error: null, notice: null }));\n\n let accepted = false;\n let failed = false;\n const request = { decision, expectedProposalHash: approval.proposalHash, ...(reason ? { reason } : {}) };\n\n this.runStream(conversationId, this.api.decideApproval(conversationId, approval.approvalId, request), {\n next: event => {\n if (!accepted && event.type !== 'error') {\n accepted = true;\n this.patchSession(conversationId, current => ({\n ...current,\n conversation: applyNhAssistantApprovalDecision(current.conversation, approval.approvalId, decision)\n }));\n }\n if (event.type === 'error') {\n failed = true;\n if (!accepted) {\n this.patchSession(conversationId, current => ({ ...current, error: event.data }));\n return;\n }\n }\n\n this.applyEvent(conversationId, event);\n },\n complete: () => {\n this.patchSession(conversationId, current => ({ ...current, deciding: false }));\n this.afterTurn(conversationId, failed);\n }\n });\n }\n\n /** Asks the server to stop the running turn or to abandon a waiting approval of the open conversation. */\n async cancel(): Promise<void> {\n const conversationId = this.activeIdState();\n if (conversationId) {\n this.pauseQueue();\n await this.cancelConversation(conversationId);\n }\n }\n\n private async cancelConversation(conversationId: string): Promise<void> {\n const session = this.sessionsState().get(conversationId);\n const conversation = session?.conversation;\n if (!session || !conversation || (conversation.status === 'idle' && !session.streaming)) {\n return;\n }\n\n const revision = this.accountRevision;\n try {\n await firstValueFrom(this.api.cancel(conversationId), { defaultValue: undefined });\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(conversationId, error);\n }\n return;\n }\n\n if (revision !== this.accountRevision) {\n return;\n }\n\n if (!this.sessionsState().get(conversationId)?.streaming) {\n await this.reloadSession(conversationId);\n return;\n }\n\n // The server ends the stream with turn.completed(cancelled); stop waiting if it does not.\n clearTimeout(this.cancelTimers.get(conversationId));\n this.cancelTimers.set(conversationId, setTimeout(() => {\n this.cancelTimers.delete(conversationId);\n if (this.sessionsState().get(conversationId)?.streaming) {\n this.streams.get(conversationId)?.unsubscribe();\n this.streams.delete(conversationId);\n this.patchSession(conversationId, current => ({ ...current, streaming: false, deciding: false }));\n void this.reloadSession(conversationId);\n }\n }, cancelGracePeriodMs));\n }\n\n /** Joins a shared conversation with an invitation link and opens it. Resolves `false` on failure. */\n async joinConversation(conversationId: string, token: string): Promise<boolean> {\n await this.initialize();\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.joinConversation(conversationId, token));\n if (revision !== this.accountRevision) {\n return false;\n }\n this.upsertSession(conversation);\n this.setActive(conversation.id, conversation.agentId);\n void this.refreshConversations();\n return true;\n } catch (error) {\n if (revision === this.accountRevision) {\n this.startNewConversation();\n this.setError(null, error);\n }\n return false;\n }\n }\n\n /** Owner only: creates a new invitation link for the open conversation and returns its token. */\n async createShareLink(): Promise<string | null> {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return null;\n }\n try {\n const link = await firstValueFrom(this.api.createShareLink(conversationId));\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: { ...session.conversation, shareToken: link.token }\n }));\n return link.token;\n } catch (error) {\n this.setError(conversationId, error);\n return null;\n }\n }\n\n /** Owner only: the invitation link of the open conversation stops working. */\n async revokeShareLink(): Promise<boolean> {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return false;\n }\n try {\n await firstValueFrom(this.api.revokeShareLink(conversationId), { defaultValue: undefined });\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: { ...session.conversation, shareToken: null }\n }));\n return true;\n } catch (error) {\n this.setError(conversationId, error);\n return false;\n }\n }\n\n /** Owner only: searches the application's directory for people to invite to the open conversation. */\n async searchParticipantCandidates(query: string): Promise<DirectoryEntry[]> {\n const conversationId = this.activeIdState();\n if (!conversationId || query.trim().length < 2) {\n return [];\n }\n try {\n return await firstValueFrom(this.api.searchParticipantCandidates(conversationId, query.trim()));\n } catch (error) {\n this.setError(conversationId, error);\n return [];\n }\n }\n\n /** Owner only: invites a person from the directory to the open conversation. */\n async inviteParticipant(actorId: string): Promise<boolean> {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return false;\n }\n try {\n await firstValueFrom(this.api.inviteParticipant(conversationId, actorId), { defaultValue: undefined });\n await this.reloadSession(conversationId);\n return true;\n } catch (error) {\n this.setError(conversationId, error);\n return false;\n }\n }\n\n /**\n * The owner removes a participant of the open conversation; with the current user's own id a\n * participant leaves it.\n */\n async removeParticipant(actorId: string): Promise<boolean> {\n const conversation = this.activeConversation();\n if (!conversation) {\n return false;\n }\n try {\n await firstValueFrom(this.api.removeParticipant(conversation.id, actorId), { defaultValue: undefined });\n if (actorId === conversation.currentActorId) {\n this.forget(conversation.id);\n } else {\n await this.reloadSession(conversation.id);\n }\n return true;\n } catch (error) {\n this.setError(conversation.id, error);\n return false;\n }\n }\n\n clearError(): void {\n const activeId = this.activeIdState();\n if (activeId === null) {\n this.draftErrorState.set(null);\n return;\n }\n this.patchSession(activeId, session => ({ ...session, error: null }));\n }\n\n clearNotice(): void {\n const activeId = this.activeIdState();\n if (activeId !== null) {\n this.patchSession(activeId, session => ({ ...session, notice: null }));\n }\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 private async loadConversation(conversationId: string, restoring: boolean): Promise<void> {\n if (this.sessionsState().has(conversationId)) {\n const session = this.sessionsState().get(conversationId)!;\n this.setActive(conversationId, session.conversation.agentId);\n return;\n }\n if (this.activeIdState() === conversationId) {\n return;\n }\n\n const revision = this.accountRevision;\n this.conversationLoadingState.set(true);\n this.draftErrorState.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.upsertSession(conversation);\n this.setActive(conversationId, 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(null, error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.conversationLoadingState.set(false);\n }\n }\n }\n\n private setActive(conversationId: string | null, agentId?: string): void {\n this.activeIdState.set(conversationId);\n if (agentId) {\n this.selectedAgentIdState.set(agentId);\n }\n this.uiState.update(agentId ? { conversationId, agentId } : { conversationId });\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 /** Connects live updates and notifications once per account and server configuration. */\n private startCollaboration(status: AssistantStatus): void {\n const collaboration = status.collaboration ?? null;\n const key = `${this.accountRevision}|${collaboration?.hubPath ?? ''}|${collaboration?.push === true}`;\n if (key === this.collaborationKey) {\n return;\n }\n const accountChanged = this.collaborationKey?.split('|')[0] !== String(this.accountRevision);\n this.collaborationKey = key;\n void this.live.connect(collaboration?.hubPath ?? null, accountChanged);\n void this.push.activate(collaboration?.push === true);\n }\n\n /** Forgets everything about the previous account: turns, conversations, live updates and push. */\n private resetAccount(): void {\n this.accountRevision++;\n this.collaborationKey = null;\n this.stopAllTurns();\n this.sessionsState.set(new Map());\n this.activeIdState.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.draftErrorState.set(null);\n this.sendingState.set(null);\n this.queuedState.set([]);\n this.pausedQueuesState.set(new Set());\n this.queueDispatchState.set(null);\n this.steeringState.set(null);\n this.submittingState.set(false);\n void this.live.stop();\n void this.push.deactivate().catch(() => undefined);\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.upsertSession(conversation);\n this.setActive(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(null, error);\n }\n return null;\n }\n }\n\n private runStream(\n conversationId: string,\n stream: Observable<NhAssistantSseEvent>,\n handlers: { next: (event: NhAssistantSseEvent) => void; complete: () => void }\n ): void {\n this.streams.get(conversationId)?.unsubscribe();\n this.patchSession(conversationId, session => ({ ...session, streaming: true }));\n\n const finish = () => {\n clearTimeout(this.cancelTimers.get(conversationId));\n this.cancelTimers.delete(conversationId);\n this.streams.delete(conversationId);\n this.patchSession(conversationId, session => ({ ...session, streaming: false }));\n handlers.complete();\n };\n\n const subscription = stream.subscribe({\n next: event => handlers.next(event),\n error: () => {\n this.patchSession(conversationId, session => ({ ...session, error: clientError(NhAssistantClientErrorCodes.network) }));\n finish();\n },\n complete: finish\n });\n if (!subscription.closed) {\n this.streams.set(conversationId, subscription);\n }\n }\n\n private stopAllTurns(): void {\n for (const subscription of this.streams.values()) {\n subscription.unsubscribe();\n }\n this.streams.clear();\n for (const resolve of this.pendingSendResolves.values()) {\n resolve(false);\n }\n this.pendingSendResolves.clear();\n for (const timer of this.cancelTimers.values()) {\n clearTimeout(timer);\n }\n this.cancelTimers.clear();\n }\n\n private applyEvent(conversationId: string, event: NhAssistantSseEvent, clientMessageId?: string): void {\n this.patchSession(conversationId, session => {\n const conversation = applyNhAssistantEvent(session.conversation, event, clientMessageId);\n let { error, notice, lastUsage } = session;\n if (event.type === 'error') {\n error = event.data;\n }\n if (event.type === 'turn.completed') {\n lastUsage = event.data.usage;\n if (event.data.status === 'failed') {\n error = clientError(event.data.errorCode ?? NhAssistantClientErrorCodes.server);\n } else if (event.data.status === 'completed') {\n notice = completionNotice(conversation, event.data.errorCode);\n }\n }\n return { ...session, conversation, error, notice, lastUsage };\n });\n }\n\n private afterTurn(conversationId: string, reload: boolean): void {\n const session = this.sessionsState().get(conversationId);\n if (session) {\n const status = session.conversation.status;\n this.patchSummary(conversationId, summary => ({\n ...summary,\n status,\n updatedAt: new Date().toISOString(),\n activeActorId: status === 'waiting-for-approval' ? summary.activeActorId ?? session.conversation.currentActorId ?? null : null\n }));\n }\n\n if (reload) {\n void this.reloadSession(conversationId);\n }\n // The list carries the exact title, latest message and read position of the finished turn.\n void this.refreshConversations();\n }\n\n private async reloadSession(conversationId: string): Promise<void> {\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.getConversation(conversationId));\n const session = this.sessionsState().get(conversationId);\n if (revision === this.accountRevision && session && !session.streaming) {\n this.upsertSession(conversation);\n }\n } catch (error) {\n if (error instanceof NhAssistantApiError && (error.status === 403 || error.status === 404)) {\n this.forget(conversationId);\n }\n // Otherwise keep the local state; the error of the turn is already shown.\n }\n }\n\n private markActiveReadWhenSeen(): void {\n const conversationId = this.activeIdState();\n if (!conversationId || !this.viewingState() || !this.pageVisibleState() || this.markingRead.has(conversationId)) {\n return;\n }\n const session = this.sessionsState().get(conversationId);\n const summary = this.conversationsState().find(item => item.id === conversationId);\n if (!session || session.streaming || !summary || !nhAssistantIsUnread(summary)) {\n return;\n }\n\n this.markingRead.add(conversationId);\n const revision = this.accountRevision;\n let request: Observable<void>;\n try {\n request = this.api.markRead(conversationId);\n } catch {\n this.markingRead.delete(conversationId);\n return;\n }\n firstValueFrom(request, { defaultValue: undefined })\n .then(() => {\n if (revision === this.accountRevision) {\n this.patchSummary(conversationId, item => ({ ...item, lastReadSequence: item.lastMessageSequence ?? item.lastReadSequence }));\n }\n })\n .catch(() => undefined)\n .finally(() => this.markingRead.delete(conversationId));\n }\n\n private onLiveChanged(change: LiveConversationChanged): void {\n const known = this.conversationsState().some(item => item.id === change.conversationId);\n if (!known) {\n this.scheduleRefresh();\n } else {\n this.patchSummary(change.conversationId, summary => ({\n ...summary,\n status: change.status,\n title: change.title,\n updatedAt: change.updatedAt,\n activeActorId: change.activeActorId,\n lastMessageSequence: Math.max(summary.lastMessageSequence ?? 0, change.lastMessageSequence),\n participantCount: change.participantCount\n }));\n }\n\n const session = this.sessionsState().get(change.conversationId);\n if (!session || session.streaming) {\n return;\n }\n const wasRunning = session.conversation.status === 'running';\n this.patchSession(change.conversationId, current => ({\n ...current,\n conversation: applyNhAssistantConversationChange(current.conversation, change)\n }));\n if (wasRunning && change.status !== 'running') {\n // Another session ended its turn; the snapshot holds the exact answer and approvals.\n void this.reloadSession(change.conversationId);\n } else if (session.conversation.participantCount !== change.participantCount) {\n void this.reloadSession(change.conversationId);\n }\n }\n\n private onLiveRead(read: LiveConversationRead): void {\n this.patchSummary(read.conversationId, summary => ({\n ...summary,\n lastReadSequence: Math.max(summary.lastReadSequence ?? 0, read.lastReadSequence)\n }));\n }\n\n private onLiveRemoved(removed: LiveConversationRemoved): void {\n const wasActive = this.activeIdState() === removed.conversationId;\n this.forget(removed.conversationId);\n if (wasActive) {\n this.draftErrorState.set(clientError(NhAssistantClientErrorCodes.conversationRemoved));\n }\n }\n\n private onLiveEvent(event: LiveConversationEvent): void {\n const session = this.sessionsState().get(event.conversationId);\n if (event.type === 'turn.started') {\n this.patchSummary(event.conversationId, summary => ({ ...summary, status: 'running', activeActorId: event.actorId }));\n }\n if (!session || session.streaming) {\n // This tab streams the turn itself, or does not show the conversation.\n return;\n }\n this.patchSession(event.conversationId, current => ({\n ...current,\n conversation: applyNhAssistantLiveEvent(current.conversation, event)\n }));\n }\n\n /** After a reconnect: updates sent while disconnected are lost, so reload what is shown. */\n private resync(): void {\n if (!this.enabled()) {\n return;\n }\n void this.refreshConversations();\n for (const [conversationId, session] of this.sessionsState()) {\n if (!session.streaming) {\n void this.reloadSession(conversationId);\n }\n }\n }\n\n private scheduleRefresh(): void {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = setTimeout(() => void this.refreshConversations(), refreshDelayMs);\n }\n\n /** Stores a snapshot, keeping at most `maxSessions` idle conversations in memory. */\n private upsertSession(conversation: Conversation): void {\n this.sessionsState.update(sessions => {\n const next = new Map(sessions);\n const existing = next.get(conversation.id);\n next.set(conversation.id, existing\n ? { ...existing, conversation }\n : { conversation, streaming: false, deciding: false, error: null, notice: null, lastUsage: null });\n if (next.size > maxSessions) {\n const activeId = this.activeIdState();\n for (const [id, session] of next) {\n if (next.size <= maxSessions) {\n break;\n }\n if (id !== activeId && id !== conversation.id && !session.streaming\n && !this.queuedState().some(item => item.conversationId === id)) {\n next.delete(id);\n }\n }\n }\n return next;\n });\n this.patchSummary(conversation.id, summary => ({\n ...summary,\n title: conversation.title,\n status: conversation.status,\n updatedAt: conversation.updatedAt,\n ...(conversation.lastMessageSequence === undefined ? {} : { lastMessageSequence: conversation.lastMessageSequence }),\n ...(conversation.lastReadSequence === undefined ? {} : { lastReadSequence: conversation.lastReadSequence }),\n ...(conversation.activeActorId === undefined ? {} : { activeActorId: conversation.activeActorId }),\n ...(conversation.members === undefined ? {} : { participantCount: Math.max(0, conversation.members.length - 1) })\n }));\n }\n\n private patchSession(conversationId: string, update: (session: NhAssistantSession) => NhAssistantSession): void {\n const session = this.sessionsState().get(conversationId);\n if (!session) {\n return;\n }\n this.sessionsState.update(sessions => new Map(sessions).set(conversationId, update(session)));\n }\n\n private patchSummary(\n conversationId: string,\n update: Partial<ConversationSummary> | ((summary: ConversationSummary) => ConversationSummary)\n ): void {\n this.conversationsState.update(items => items.map(item => {\n if (item.id !== conversationId) {\n return item;\n }\n return typeof update === 'function' ? update(item) : { ...item, ...update };\n }));\n }\n\n /**\n * Keeps local knowledge when the list is reloaded: the status of turns this tab streams, and a\n * read position the server already confirmed, which a list response sent earlier may not show.\n */\n private withLocalState(summary: ConversationSummary): ConversationSummary {\n const session = this.sessionsState().get(summary.id);\n const known = this.conversationsState().find(item => item.id === summary.id)?.lastReadSequence;\n const lastReadSequence = known !== undefined && summary.lastReadSequence !== undefined\n ? Math.max(known, summary.lastReadSequence)\n : summary.lastReadSequence;\n return {\n ...summary,\n lastReadSequence,\n status: session?.streaming ? session.conversation.status : summary.status\n };\n }\n\n /** Removes a deleted, left or inaccessible conversation everywhere. */\n private forget(conversationId: string): void {\n this.queuedState.update(items => items.filter(item => item.conversationId !== conversationId));\n this.pausedQueuesState.update(paused => new Set([...paused].filter(id => id !== conversationId)));\n this.streams.get(conversationId)?.unsubscribe();\n this.streams.delete(conversationId);\n this.sessionsState.update(sessions => {\n const next = new Map(sessions);\n next.delete(conversationId);\n return next;\n });\n const before = this.conversationsState().length;\n this.conversationsState.update(items => items.filter(item => item.id !== conversationId));\n if (this.conversationsState().length < before) {\n this.conversationsTotalState.update(total => Math.max(0, total - 1));\n }\n if (this.activeIdState() === conversationId) {\n this.activeIdState.set(null);\n this.uiState.update({ conversationId: null });\n }\n }\n\n private removeMessage(conversationId: string, messageId: string, status: Conversation['status']): void {\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: {\n ...session.conversation,\n status,\n messages: session.conversation.messages.filter(message => message.id !== messageId)\n }\n }));\n this.patchSummary(conversationId, { status });\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 /** Shows an error on a conversation, or on the new-conversation view for `null`. */\n private setError(conversationId: string | null, error: unknown): void {\n const value = error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : clientError(NhAssistantClientErrorCodes.server);\n if (conversationId === null || !this.sessionsState().has(conversationId)) {\n this.draftErrorState.set(value);\n return;\n }\n this.patchSession(conversationId, session => ({ ...session, error: value }));\n }\n}\n\nfunction clientError(code: string): NhAssistantError {\n return { code, messageKey: nhAssistantErrorMessageKey(code) };\n}\n\n/** A completed turn with a server code, or without any answer text, explains itself with a notice. */\nfunction completionNotice(conversation: Conversation, errorCode: string | null): NhAssistantNotice | null {\n if (errorCode) {\n return clientError(errorCode);\n }\n if (!nhAssistantLatestTurnHasText(conversation)) {\n return { code: NH_ASSISTANT_NO_ANSWER_NOTICE_CODE, messageKey: 'nh-assistant.notices.no-answer' };\n }\n\n return null;\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 role: conversation.role,\n participantCount: conversation.members ? Math.max(0, conversation.members.length - 1) : conversation.participantCount,\n lastMessageSequence: conversation.lastMessageSequence,\n lastReadSequence: conversation.lastReadSequence,\n activeActorId: conversation.activeActorId\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 { NhAssistantLiveService } from './services/nh-assistant-live.service';\nimport { NhAssistantPushService } from './services/nh-assistant-push.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 NhAssistantLiveService,\n NhAssistantPushService,\n NhAssistantStore,\n NhAssistantUiState,\n NhAssistantPanelService,\n ...(config.translations === 'host'\n ? []\n : [provideEnvironmentInitializer(() => inject(NhAssistantTranslationMerger).start())])\n ]);\n}\n","/** Fragment the panel reads to join a shared conversation: `#nh-assistant-join=<id>.<token>`. */\nexport const NH_ASSISTANT_JOIN_FRAGMENT = 'nh-assistant-join';\n\n/** Fragment a clicked notification opens: `#nh-assistant-conversation=<id>`. */\nexport const NH_ASSISTANT_CONVERSATION_FRAGMENT = 'nh-assistant-conversation';\n\n/** Builds the default invitation link: the current page with the join fragment. */\nexport function nhAssistantShareLink(conversationId: string, token: string): string {\n const location = globalThis.location;\n const page = location ? `${location.origin}${location.pathname}${location.search}` : '';\n return `${page}#${NH_ASSISTANT_JOIN_FRAGMENT}=${encodeURIComponent(conversationId)}.${encodeURIComponent(token)}`;\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 | 'users'\n | 'copy'\n | 'bell'\n | 'leave';\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 users: 'M9 11a3.5 3.5 0 1 0 0-7 3.5 3.5 0 1 0 0 7zM3 20c0-3.3 2.7-6 6-6s6 2.7 6 6M16 4.5a3.5 3.5 0 0 1 0 6.5M18 14.5c1.8.9 3 2.8 3 5',\n copy: 'M9 9h11v11H9zM5 15H4V4h11v1',\n bell: 'M6 16V11a6 6 0 0 1 12 0v5l2 2H4zM10 20a2 2 0 0 0 4 0',\n leave: 'M10 4H5v16h5M14 8l4 4-4 4M18 12H9'\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. One small badge shows what needs\n * attention, in this order: an approval that waits, the number of unread conversations, or a\n * turn that runs. 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 @switch (badge()) {\n @case ('waiting') {\n <span class=\"badge\" data-state=\"waiting\" aria-hidden=\"true\"></span>\n }\n @case ('unread') {\n <span class=\"badge count\" data-state=\"unread\" aria-hidden=\"true\">{{ unreadLabel() }}</span>\n }\n @case ('running') {\n <span class=\"badge\" data-state=\"running\" aria-hidden=\"true\"></span>\n }\n }\n @if (waitingForApproval()) {\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.pending-approval' | translate }}</span>\n }\n @if (store.unreadCount() > 0) {\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.unread' | translate: { count: store.unreadCount() } }}</span>\n }\n @if (store.runningCount() > 0) {\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.running' | translate: { count: store.runningCount() } }}</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 badge = computed<'waiting' | 'unread' | 'running' | null>(() => {\n if (this.waitingForApproval()) {\n return 'waiting';\n }\n if (this.store.unreadCount() > 0) {\n return 'unread';\n }\n return this.store.runningCount() > 0 || this.store.streaming() ? 'running' : null;\n });\n readonly unreadLabel = computed(() => this.store.unreadCount() > 9 ? '9+' : String(this.store.unreadCount()));\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 { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantActivity } from '../../services/nh-assistant.store';\n\n/**\n * One slim row of the other conversations that need attention: a running turn, an approval that\n * waits, or an unread answer. It renders nothing when there are none, so it costs no space in the\n * usual case. Selecting a chip opens that conversation; its turn keeps running meanwhile.\n */\n@Component({\n selector: 'nh-assistant-activity',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (others().length > 0) {\n <nav class=\"strip\" [attr.aria-label]=\"'nh-assistant.activity.label' | translate\">\n @for (item of others(); track item.id) {\n <button\n class=\"chip\"\n type=\"button\"\n [attr.data-state]=\"state(item)\"\n [attr.title]=\"(item.title || ('nh-assistant.conversation-list.untitled' | translate)) + ' — ' + ('nh-assistant.activity.' + state(item) | translate)\"\n (click)=\"conversationSelect.emit(item.id)\">\n <span class=\"indicator\" aria-hidden=\"true\"></span>\n <span class=\"title\">{{ item.title || ('nh-assistant.conversation-list.untitled' | translate) }}</span>\n @if (item.shared) {\n <nh-assistant-icon class=\"shared\" name=\"users\" />\n }\n <span class=\"visually-hidden\">{{ 'nh-assistant.activity.' + state(item) | translate }}</span>\n </button>\n }\n </nav>\n }\n `,\n styleUrl: './nh-assistant-activity.component.scss'\n})\nexport class NhAssistantActivityComponent {\n readonly items = input.required<readonly NhAssistantActivity[]>();\n readonly conversationSelect = output<string>();\n\n /** The open conversation already shows its own state. */\n readonly others = computed(() => this.items().filter(item => !item.active));\n\n state(item: NhAssistantActivity): 'running' | 'waiting' | 'unread' {\n if (item.status === 'running') {\n return 'running';\n }\n return item.status === 'waiting-for-approval' ? 'waiting' : 'unread';\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 host: { '[class.compact]': 'compact()' },\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.aria-describedby]=\"selected() ? selectId + '-capability' : null\"\n [attr.title]=\"selected() ? (([selected()!.descriptionKey] | nhAssistantTranslate: selected()!.descriptionKey) + (compact() ? ' · ' + ((selected()!.canMutate ? 'nh-assistant.agent-picker.can-mutate' : 'nh-assistant.agent-picker.read-only') | translate) : '')) : 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\" [id]=\"selectId + '-capability'\" [class.visually-hidden]=\"compact()\" [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 /** Compact prompt-bar control; capability information remains in the tooltip and accessible description. */\n readonly compact = 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 /** Keeps the send action available next to Stop so the host can queue messages. */\n readonly queueWhileBusy = input(false);\n /** Announces why sending is temporarily unavailable. */\n readonly status = input<'running' | 'waiting-for-approval' | null>(null);\n /** Name of the participant whose turn runs or waits, when it is someone else. */\n readonly statusActor = input<string | null>(null);\n /** False when the user may not stop the running turn, such as another participant's turn. */\n readonly canStop = input(true);\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=\"prompt-bar\">\n <div class=\"prompt-controls\">\n <ng-content select=\"[nhAssistantComposerControls]\" />\n </div>\n <div class=\"actions\">\n @if (busy() && canStop()) {\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 }\n @if (!busy() || !canStop() || queueWhileBusy()) {\n <button\n class=\"send\"\n type=\"submit\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"(busy() && queueWhileBusy() ? 'nh-assistant.queue.add' : 'nh-assistant.composer.send') | translate\"\n [attr.title]=\"(busy() && queueWhileBusy() ? 'nh-assistant.queue.add' : 'nh-assistant.composer.send') | translate\">\n <nh-assistant-icon name=\"send\" />\n </button>\n }\n </div>\n </div>\n</form>\n\n@if (status() === 'waiting-for-approval') {\n <p class=\"composer-status\" role=\"status\" aria-live=\"polite\">\n @if (statusActor(); as name) {\n {{ 'nh-assistant.composer.status.waiting-for-approval-by' | translate: { name } }}\n } @else {\n {{ 'nh-assistant.composer.status.waiting-for-approval' | translate }}\n }\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>{{ (busy() && queueWhileBusy() ? 'nh-assistant.queue.hint' : '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';\nimport { nhAssistantIsUnread } from '../../services/nh-assistant.store';\n\n/**\n * The user's own and shared conversations with loading and empty states; selecting one opens it.\n * Each row marks a running turn, a waiting approval and unread messages. A participant leaves a\n * shared conversation instead of deleting it.\n */\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 /** The owner deletes the conversation; a participant leaves it. */\n readonly conversationDelete = output<string>();\n readonly conversationCreate = output<void>();\n\n unread(conversation: ConversationSummary): boolean {\n return nhAssistantIsUnread(conversation);\n }\n\n indicator(conversation: ConversationSummary): 'running' | 'waiting' | 'unread' | null {\n if (conversation.status === 'running') {\n return 'running';\n }\n if (conversation.status === 'waiting-for-approval') {\n return 'waiting';\n }\n return this.unread(conversation) ? 'unread' : null;\n }\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()\" [class.unread]=\"unread(conversation)\">\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-row\">\n <span class=\"indicator\" [attr.data-state]=\"indicator(conversation)\" aria-hidden=\"true\"></span>\n <span class=\"title\">{{ conversation.title || ('nh-assistant.conversation-list.untitled' | translate) }}</span>\n @if ((conversation.participantCount ?? 0) > 0) {\n <nh-assistant-icon\n class=\"shared\"\n name=\"users\"\n [attr.title]=\"'nh-assistant.conversation-list.shared' | translate: { count: conversation.participantCount }\" />\n }\n </span>\n <span class=\"meta\">\n <span class=\"status\" [attr.data-status]=\"conversation.status\">{{ 'nh-assistant.conversation-list.status.' + conversation.status | translate }}</span>\n @if (unread(conversation)) {\n <span class=\"unread-label\">{{ 'nh-assistant.conversation-list.unread' | translate }}</span>\n }\n @if (conversation.role === 'participant') {\n <span>{{ 'nh-assistant.conversation-list.shared-with-you' | translate }}</span>\n }\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() || conversation.status === 'running'\"\n [attr.aria-label]=\"((conversation.role === 'participant' ? 'nh-assistant.conversation-list.leave' : 'nh-assistant.conversation-list.delete') | translate) + ': ' + (conversation.title || ('nh-assistant.conversation-list.untitled' | translate))\"\n [attr.title]=\"(conversation.role === 'participant' ? 'nh-assistant.conversation-list.leave' : 'nh-assistant.conversation-list.delete') | translate\"\n (click)=\"conversationDelete.emit(conversation.id)\">\n <nh-assistant-icon [name]=\"conversation.role === 'participant' ? 'leave' : '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 { NhAssistantPushService } from '../../services/nh-assistant-push.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: desktop notifications, style, form of address,\n * answer length and optional instructions. Notifications apply immediately; the other\n * preferences steer style only and are saved together, below the application context and\n * 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 readonly push = inject(NhAssistantPushService);\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 /** Turns desktop notifications on or off; turning them on asks the browser for permission. */\n async toggleNotifications(event: Event): Promise<void> {\n const enabled = (event.target as HTMLInputElement).checked;\n this.error.set(null);\n try {\n await this.push.setEnabled(enabled);\n } catch (error) {\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 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 @if (push.state() !== 'unavailable') {\n <fieldset class=\"notifications\">\n <legend>{{ 'nh-assistant.preferences.notifications-label' | translate }}</legend>\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [checked]=\"push.settings()?.pushEnabled === true\"\n [disabled]=\"push.busy()\"\n [attr.aria-describedby]=\"id + '-notifications-hint'\"\n (change)=\"toggleNotifications($event)\" />\n <span>{{ 'nh-assistant.preferences.notifications' | translate }}</span>\n </label>\n <p class=\"hint\" [id]=\"id + '-notifications-hint'\">\n <span>{{ 'nh-assistant.preferences.notifications-state.' + push.state() | translate }}</span>\n </p>\n </fieldset>\n }\n\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 { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ConversationMember, DirectoryEntry } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NH_ASSISTANT_CONFIG } from '../../nh-assistant.config';\nimport { NhAssistantStore } from '../../services/nh-assistant.store';\nimport { nhAssistantShareLink } from '../../services/nh-assistant-share-link';\n\nlet nextId = 0;\nconst searchDelayMs = 250;\n\n/**\n * Sharing of the open conversation. The owner creates, copies, renews or stops an invitation\n * link, invites colleagues through the application's directory when it offers one, and removes\n * participants. A participant sees who takes part and can leave.\n */\n@Component({\n selector: 'nh-assistant-share',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-share.component.html',\n styleUrl: './nh-assistant-share.component.scss'\n})\nexport class NhAssistantShareComponent {\n readonly store = inject(NhAssistantStore);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private searchTimer?: ReturnType<typeof setTimeout>;\n private searchRevision = 0;\n\n /** Emitted when the user leaves the view. */\n readonly closed = output<void>();\n /** Show the invitation link, participants, or both (the default for custom hosts). */\n readonly section = input<'all' | 'link' | 'members'>('all');\n\n readonly id = `nh-assistant-share-${nextId++}`;\n readonly conversation = this.store.activeConversation;\n readonly isOwner = this.store.isOwner;\n readonly busy = signal(false);\n readonly copied = signal(false);\n readonly query = signal('');\n readonly searching = signal(false);\n readonly candidates = signal<DirectoryEntry[]>([]);\n readonly invited = signal<string | null>(null);\n\n readonly directory = computed(() => this.store.collaboration()?.directory === true && this.isOwner());\n readonly maxParticipants = computed(() => this.store.collaboration()?.maxParticipants ?? null);\n readonly participants = computed(() => this.store.members().filter(member => member.role === 'participant'));\n readonly link = computed(() => {\n const conversation = this.conversation();\n if (!conversation?.shareToken) {\n return null;\n }\n return (this.config.buildShareLink ?? nhAssistantShareLink)(conversation.id, conversation.shareToken);\n });\n readonly full = computed(() => {\n const max = this.maxParticipants();\n return max !== null && this.participants().length >= max;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => clearTimeout(this.searchTimer));\n }\n\n async createLink(): Promise<void> {\n await this.run(() => this.store.createShareLink());\n this.copied.set(false);\n }\n\n async revokeLink(): Promise<void> {\n await this.run(() => this.store.revokeShareLink());\n this.copied.set(false);\n }\n\n async copy(input: HTMLInputElement): Promise<void> {\n const link = this.link();\n if (!link) {\n return;\n }\n try {\n await navigator.clipboard.writeText(link);\n } catch {\n // Without clipboard access the selected text can be copied by hand.\n input.select();\n }\n this.copied.set(true);\n }\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.query.set(value);\n this.invited.set(null);\n clearTimeout(this.searchTimer);\n const revision = ++this.searchRevision;\n if (value.trim().length < 2) {\n this.candidates.set([]);\n this.searching.set(false);\n return;\n }\n this.searching.set(true);\n this.searchTimer = setTimeout(async () => {\n const results = await this.store.searchParticipantCandidates(value);\n if (revision === this.searchRevision) {\n this.candidates.set(results);\n this.searching.set(false);\n }\n }, searchDelayMs);\n }\n\n async invite(entry: DirectoryEntry): Promise<void> {\n const invited = await this.run(() => this.store.inviteParticipant(entry.actorId));\n if (invited) {\n this.invited.set(entry.displayName);\n this.candidates.update(items => items.filter(item => item.actorId !== entry.actorId));\n }\n }\n\n async remove(member: ConversationMember): Promise<void> {\n await this.run(() => this.store.removeParticipant(member.actorId));\n }\n\n async leave(): Promise<void> {\n const actorId = this.conversation()?.currentActorId;\n if (!actorId) {\n return;\n }\n if (await this.run(() => this.store.removeParticipant(actorId))) {\n this.closed.emit();\n }\n }\n\n isCurrentUser(member: ConversationMember): boolean {\n return member.actorId === this.conversation()?.currentActorId;\n }\n\n private async run<T>(action: () => Promise<T>): Promise<T | undefined> {\n if (this.busy()) {\n return undefined;\n }\n this.busy.set(true);\n try {\n return await action();\n } finally {\n this.busy.set(false);\n }\n }\n}\n","<section class=\"share\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"busy()\">\n <header class=\"header\">\n <h3 [id]=\"id + '-title'\">\n {{ (isOwner() && section() !== 'members' ? 'nh-assistant.share.title' : 'nh-assistant.share.members-title') | translate }}\n </h3>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.share.back' | translate\"\n [attr.title]=\"'nh-assistant.share.back' | translate\"\n (click)=\"closed.emit()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </header>\n\n @if (conversation(); as conversation) {\n <div class=\"content\">\n @if (isOwner()) {\n <p class=\"description\">{{ 'nh-assistant.share.description' | translate }}</p>\n\n @if (section() !== 'members' || !directory()) {\n <section class=\"block\" [attr.aria-labelledby]=\"id + '-link'\">\n <h4 [id]=\"id + '-link'\">{{ 'nh-assistant.share.link-title' | translate }}</h4>\n @if (link(); as link) {\n <div class=\"link-row\">\n <label class=\"visually-hidden\" [for]=\"id + '-link-input'\">{{ 'nh-assistant.share.link-label' | translate }}</label>\n <input #linkInput type=\"text\" readonly [id]=\"id + '-link-input'\" [value]=\"link\" (focus)=\"linkInput.select()\" />\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.share.copy' | translate\"\n [attr.title]=\"'nh-assistant.share.copy' | translate\"\n (click)=\"copy(linkInput)\">\n <nh-assistant-icon name=\"copy\" />\n </button>\n </div>\n @if (copied()) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />\n {{ 'nh-assistant.share.copied' | translate }}\n </p>\n }\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"revokeLink()\">\n {{ 'nh-assistant.share.revoke' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"createLink()\">\n {{ 'nh-assistant.share.renew' | translate }}\n </button>\n </div>\n <p class=\"hint\">{{ 'nh-assistant.share.link-hint' | translate }}</p>\n } @else {\n <button class=\"primary\" type=\"button\" [disabled]=\"busy() || full()\" (click)=\"createLink()\">\n <nh-assistant-icon name=\"link\" />\n {{ 'nh-assistant.share.create' | translate }}\n </button>\n }\n </section>\n }\n\n @if (directory() && section() !== 'link') {\n <section class=\"block\" [attr.aria-labelledby]=\"id + '-invite'\">\n <h4 [id]=\"id + '-invite'\">{{ 'nh-assistant.share.invite-title' | translate }}</h4>\n <label class=\"visually-hidden\" [for]=\"id + '-search'\">{{ 'nh-assistant.share.search-label' | translate }}</label>\n <input\n type=\"search\"\n autocomplete=\"off\"\n [id]=\"id + '-search'\"\n [value]=\"query()\"\n [disabled]=\"full()\"\n [attr.placeholder]=\"'nh-assistant.share.search-placeholder' | translate\"\n (input)=\"onSearch($event)\" />\n @if (searching()) {\n <p class=\"hint\" role=\"status\">{{ 'nh-assistant.share.searching' | translate }}</p>\n } @else if (query().trim().length >= 2 && candidates().length === 0 && !invited()) {\n <p class=\"hint\">{{ 'nh-assistant.share.no-results' | translate }}</p>\n }\n @if (candidates().length > 0) {\n <ul class=\"people\">\n @for (entry of candidates(); track entry.actorId) {\n <li>\n <span class=\"person\">\n <strong>{{ entry.displayName }}</strong>\n @if (entry.detail) {\n <small>{{ entry.detail }}</small>\n }\n </span>\n <button class=\"secondary small\" type=\"button\" [disabled]=\"busy() || full()\" (click)=\"invite(entry)\">\n {{ 'nh-assistant.share.invite' | translate }}\n </button>\n </li>\n }\n </ul>\n }\n @if (invited(); as name) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />\n {{ 'nh-assistant.share.invited' | translate: { name } }}\n </p>\n }\n </section>\n }\n }\n\n @if (section() !== 'link') {\n <section class=\"block\" [attr.aria-labelledby]=\"id + '-members'\">\n <h4 [id]=\"id + '-members'\">\n {{ 'nh-assistant.share.members' | translate }}\n @if (maxParticipants() !== null && isOwner()) {\n <span class=\"count\">{{ 'nh-assistant.share.count' | translate: { count: participants().length, max: maxParticipants() } }}</span>\n }\n </h4>\n @if (store.members().length === 0) {\n <p class=\"hint\">{{ 'nh-assistant.share.not-shared' | translate }}</p>\n } @else {\n <ul class=\"people\">\n @for (member of store.members(); track member.actorId) {\n <li>\n <span class=\"person\">\n <strong>\n {{ member.displayName || ('nh-assistant.share.unnamed' | translate) }}\n @if (isCurrentUser(member)) {\n <small class=\"you\">{{ 'nh-assistant.share.you' | translate }}</small>\n }\n </strong>\n <small>{{ 'nh-assistant.share.role.' + member.role | translate }}</small>\n </span>\n @if (isOwner() && member.role === 'participant') {\n <button\n class=\"icon-button\"\n type=\"button\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"'nh-assistant.share.remove' | translate: { name: member.displayName || ('nh-assistant.share.unnamed' | translate) }\"\n [attr.title]=\"'nh-assistant.share.remove' | translate: { name: member.displayName || ('nh-assistant.share.unnamed' | translate) }\"\n (click)=\"remove(member)\">\n <nh-assistant-icon name=\"trash\" />\n </button>\n }\n </li>\n }\n </ul>\n }\n </section>\n }\n\n @if (!isOwner()) {\n <div class=\"actions\">\n <button class=\"secondary danger\" type=\"button\" [disabled]=\"busy() || conversation.status === 'running'\" (click)=\"leave()\">\n <nh-assistant-icon name=\"leave\" />\n {{ 'nh-assistant.share.leave' | translate }}\n </button>\n </div>\n }\n </div>\n } @else {\n <p class=\"state\">{{ 'nh-assistant.share.no-conversation' | translate }}</p>\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 { Pipe, PipeTransform } from '@angular/core';\nimport { ApprovalPart, MessagePart, TextPart, ToolCallPart } from '../models/assistant-api.models';\n\n/** A message part as the thread renders it: consecutive tool calls form one group. */\nexport type NhAssistantPartGroup =\n | { kind: 'text'; key: string; part: TextPart }\n | { kind: 'approval'; key: string; part: ApprovalPart }\n | { kind: 'tools'; key: string; calls: ToolCallPart[] };\n\n/**\n * Groups consecutive tool calls of a message. Text and approvals break a group, so an\n * approval always stays visible. A group's key is its first invocation id, so it keeps\n * its identity while later calls of the same run are appended.\n */\nexport function groupNhAssistantParts(parts: readonly MessagePart[]): NhAssistantPartGroup[] {\n const groups: NhAssistantPartGroup[] = [];\n let tools: { kind: 'tools'; key: string; calls: ToolCallPart[] } | null = null;\n\n parts.forEach((part, index) => {\n if (part.type === 'tool-call') {\n if (!tools) {\n tools = { kind: 'tools', key: `tools:${part.invocationId}`, calls: [] };\n groups.push(tools);\n }\n tools.calls.push(part);\n return;\n }\n\n tools = null;\n if (part.type === 'approval') {\n groups.push({ kind: 'approval', key: `approval:${part.approvalId}`, part });\n } else {\n groups.push({ kind: 'text', key: `text:${index}`, part });\n }\n });\n\n return groups;\n}\n\n/** Pure, so the groups are only rebuilt when the reducer replaces a message's parts. */\n@Pipe({ name: 'nhAssistantPartGroups', standalone: true })\nexport class NhAssistantPartGroupsPipe implements PipeTransform {\n transform(parts: readonly MessagePart[]): NhAssistantPartGroup[] {\n return groupNhAssistantParts(parts);\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 /**\n * False when the approval belongs to another participant's turn: only the person whose\n * permissions the action would use may decide it.\n */\n readonly canDecide = input(true);\n /** Name of the participant who decides, shown when the current user cannot. */\n readonly decisionOwner = input<string | null>(null);\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.canDecide() || 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() && !canDecide()) {\n <p class=\"waiting-for-other\" role=\"status\">\n <nh-assistant-icon name=\"users\" />\n {{ decisionOwner()\n ? ('nh-assistant.approval.waiting-for' | translate: { name: decisionOwner() })\n : ('nh-assistant.approval.waiting-for-participant' | translate) }}\n </p>\n } @else 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 { 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 { NhAssistantToolCallCardComponent } from '../tool-call-card/nh-assistant-tool-call-card.component';\n\nlet nextId = 0;\n\n/** Overall state of a run of tool calls, from most to least urgent. */\nexport type NhAssistantToolCallGroupState = 'awaiting-approval' | 'running' | 'failed' | 'succeeded';\n\nconst stateIcons: Record<NhAssistantToolCallGroupState, NhAssistantIconName> = {\n 'awaiting-approval': 'clock',\n running: 'tool',\n failed: 'warning',\n succeeded: 'check'\n};\n\n/**\n * Summarizes consecutive tool calls in one collapsed line that counts along live: the\n * tool that runs now while the assistant works, and how many tools were used and failed\n * afterwards. Expanding it shows every call as a card.\n */\n@Component({\n selector: 'nh-assistant-tool-call-group',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent, NhAssistantToolCallCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-tool-call-group.component.html',\n styleUrl: './nh-assistant-tool-call-group.component.scss',\n host: {\n '[attr.data-status]': 'state()'\n }\n})\nexport class NhAssistantToolCallGroupComponent {\n readonly calls = input.required<readonly ToolCallPart[]>();\n\n readonly callsId = `nh-assistant-tool-call-group-${nextId++}`;\n readonly expanded = signal(false);\n\n /** The call that currently needs attention or runs; the latest one when several do. */\n readonly current = computed(() => {\n const calls = this.calls();\n return findLast(calls, call => call.status === 'awaiting-approval')\n ?? findLast(calls, call => call.status === 'running')\n ?? null;\n });\n readonly total = computed(() => this.calls().length);\n readonly finished = computed(() => this.calls().filter(call => !isActive(call)).length);\n readonly failed = computed(() => this.calls().filter(call => call.status === 'failed').length);\n readonly state = computed<NhAssistantToolCallGroupState>(() => {\n const current = this.current();\n if (current) {\n return current.status === 'awaiting-approval' ? 'awaiting-approval' : 'running';\n }\n\n return this.failed() > 0 ? 'failed' : 'succeeded';\n });\n readonly stateIcon = computed(() => stateIcons[this.state()]);\n\n toggle(): void {\n this.expanded.update(expanded => !expanded);\n }\n}\n\nfunction isActive(call: ToolCallPart): boolean {\n return call.status === 'running' || call.status === 'awaiting-approval';\n}\n\nfunction findLast(calls: readonly ToolCallPart[], predicate: (call: ToolCallPart) => boolean): ToolCallPart | undefined {\n for (let index = calls.length - 1; index >= 0; index--) {\n if (predicate(calls[index])) {\n return calls[index];\n }\n }\n\n return undefined;\n}\n","<section class=\"group\">\n <button\n class=\"summary\"\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"callsId\"\n [attr.title]=\"(expanded() ? 'nh-assistant.tool-group.hide-calls' : 'nh-assistant.tool-group.show-calls') | translate\"\n (click)=\"toggle()\">\n <span class=\"status-icon\" [class.spinning]=\"state() === 'running'\">\n <nh-assistant-icon [name]=\"stateIcon()\" />\n </span>\n <span class=\"title\">\n @switch (state()) {\n @case ('running') {\n {{ 'nh-assistant.tool-group.running' | translate: { name: current()?.displayName } }}\n }\n @case ('awaiting-approval') {\n {{ 'nh-assistant.tool-group.awaiting-approval' | translate: { name: current()?.displayName } }}\n }\n @default {\n {{ (total() === 1 ? 'nh-assistant.tool-group.used-one' : 'nh-assistant.tool-group.used-many') | translate: { count: total() } }}\n }\n }\n </span>\n @if (state() === 'running' || state() === 'awaiting-approval') {\n <span class=\"count\">{{ 'nh-assistant.tool-group.progress' | translate: { finished: finished(), total: total() } }}</span>\n } @else if (failed() > 0) {\n <span class=\"count failed\">{{ 'nh-assistant.tool-group.failed' | translate: { count: failed() } }}</span>\n }\n <nh-assistant-icon class=\"chevron\" name=\"chevron-down\" [class.rotated]=\"expanded()\" />\n </button>\n\n <div class=\"calls\" [id]=\"callsId\" [hidden]=\"!expanded()\">\n @if (expanded()) {\n @for (call of calls(); track call.invocationId) {\n <nh-assistant-tool-call-card [part]=\"call\" />\n }\n }\n </div>\n</section>\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 signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, ConversationMember, Message } from '../../models/assistant-api.models';\nimport { NhAssistantMarkdownPipe } from '../../internal/nh-assistant-markdown.pipe';\nimport { NhAssistantPartGroupsPipe } from '../../internal/nh-assistant-part-groups';\nimport { NhAssistantApprovalCardComponent } from '../approval-card/nh-assistant-approval-card.component';\nimport { NhAssistantToolCallGroupComponent } from '../tool-call-group/nh-assistant-tool-call-group.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, consecutive tool calls as one collapsible group that counts along, and\n * approvals as cards. While a turn runs without visible progress, a working indicator\n * shows the elapsed time. The thread follows new content while the 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 NhAssistantPartGroupsPipe,\n NhAssistantToolCallGroupComponent,\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 /** The owner and participants of a shared conversation; empty while it is not shared. */\n readonly members = input<readonly ConversationMember[]>([]);\n /** The current user, to tell their own messages from those of others. */\n readonly currentActorId = input<string | null>(null);\n /** False when the pending approval belongs to another participant's turn. */\n readonly canDecide = input(true);\n /** Name of the participant who decides the pending approval, when it is someone else. */\n readonly decisionOwner = input<string | null>(null);\n readonly approvalDecision = output<ApprovalDecision>();\n\n private readonly names = computed(() => new Map(this.members().map(member => [member.actorId, member.displayName])));\n\n readonly virtualThreshold = NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD;\n readonly virtual = computed(() => this.messages().length > NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD);\n /**\n * True while the turn runs and nothing else shows progress: before the first part and\n * between tool calls while the model decides what to do next. Streaming text and a\n * running tool group show their own progress; an approval waits for the user.\n */\n readonly working = computed(() => {\n if (!this.streaming()) {\n return false;\n }\n\n const last = this.messages()[this.messages().length - 1];\n if (!last || last.role === 'user' || last.parts.length === 0) {\n return true;\n }\n\n const lastPart = last.parts[last.parts.length - 1];\n return lastPart.type === 'tool-call'\n && lastPart.status !== 'running'\n && lastPart.status !== 'awaiting-approval';\n });\n /** Whole seconds since the running turn started. */\n readonly elapsedSeconds = computed(() => {\n const startedAt = this.turnStartedAt();\n return startedAt === null ? 0 : Math.max(0, Math.floor((this.now() - startedAt) / 1000));\n });\n\n private readonly turnStartedAt = signal<number | null>(null);\n private readonly now = signal(Date.now());\n\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n private readonly viewport = viewChild(CdkVirtualScrollViewport);\n\n constructor() {\n effect(onCleanup => {\n if (!this.streaming()) {\n this.turnStartedAt.set(null);\n return;\n }\n\n untracked(() => {\n const now = Date.now();\n this.now.set(now);\n if (this.turnStartedAt() === null) {\n this.turnStartedAt.set(now);\n }\n });\n const timer = setInterval(() => this.now.set(Date.now()), 1000);\n onCleanup(() => clearInterval(timer));\n });\n\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 /** True for a user message written by another person in a shared conversation. */\n isOthers(message: Message): boolean {\n return message.role === 'user'\n && !!message.authorActorId\n && !!this.currentActorId()\n && message.authorActorId !== this.currentActorId();\n }\n\n /** Display name of another person's message, or `null` when the application provides none. */\n authorName(message: Message): string | null {\n return message.authorActorId ? this.names().get(message.authorActorId) ?? null : null;\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\" [attr.data-others]=\"isOthers(message) ? 'true' : null\">\n @if (isOthers(message)) {\n <p class=\"author\">{{ authorName(message) ?? ('nh-assistant.thread.participant' | translate) }}</p>\n } @else {\n <p class=\"author\">{{ 'nh-assistant.thread.' + (message.role === 'user' ? 'you' : message.role) | translate }}</p>\n }\n @for (group of message.parts | nhAssistantPartGroups; track group.key) {\n @switch (group.kind) {\n @case ('text') {\n @if (message.role === 'assistant' && markdown()) {\n <div class=\"bubble markdown\" [innerHTML]=\"group.part.text | nhAssistantMarkdown\"></div>\n } @else {\n <div class=\"bubble plain\">{{ group.part.text }}</div>\n }\n }\n @case ('tools') {\n <nh-assistant-tool-call-group class=\"part\" [calls]=\"group.calls\" />\n }\n @case ('approval') {\n <nh-assistant-approval-card\n class=\"part\"\n [approval]=\"group.part\"\n [deciding]=\"deciding()\"\n [canDecide]=\"canDecide()\"\n [decisionOwner]=\"decisionOwner()\"\n (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 @if (elapsedSeconds() > 0) {\n <span class=\"elapsed\">{{ 'nh-assistant.thread.elapsed' | translate: { seconds: elapsedSeconds() } }}</span>\n }\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 { NhAssistantError, NhAssistantStore } from '../../services/nh-assistant.store';\nimport { describeNhAssistantClientContext } from '../../services/nh-assistant-page-context';\nimport { NhAssistantPushService } from '../../services/nh-assistant-push.service';\nimport { NhAssistantActivityComponent } from '../activity/nh-assistant-activity.component';\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 { NhAssistantShareComponent } from '../share/nh-assistant-share.component';\nimport { NH_ASSISTANT_CONVERSATION_FRAGMENT, NH_ASSISTANT_JOIN_FRAGMENT } from '../../services/nh-assistant-share-link';\nimport { NhAssistantThreadComponent } from '../thread/nh-assistant-thread.component';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../../services/nh-assistant-transport';\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. It opens\n * by itself for an invitation link (`#nh-assistant-join=...`) and for a clicked notification.\n */\n@Component({\n selector: 'nh-assistant-panel',\n standalone: true,\n imports: [\n RouterLink,\n TranslatePipe,\n NhAssistantTranslatePipe,\n NhAssistantIconComponent,\n NhAssistantActivityComponent,\n NhAssistantAgentPickerComponent,\n NhAssistantComposerComponent,\n NhAssistantConversationListComponent,\n NhAssistantPreferencesComponent,\n NhAssistantShareComponent,\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 readonly push = inject(NhAssistantPushService);\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 showShare = signal(false);\n readonly shareSection = signal<'all' | 'link' | 'members'>('all');\n readonly notificationError = signal<NhAssistantError | null>(null);\n readonly notificationsLabel = computed(() => this.push.settings()?.pushEnabled\n ? 'nh-assistant.panel.notifications-off' : 'nh-assistant.panel.notifications-on');\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.canSubmit());\n readonly editingQueuedId = signal<string | null>(null);\n readonly queuedDraft = signal('');\n private resumeAfterEditing = false;\n readonly validQueuedDraft = computed(() => this.queuedDraft().trim().length > 0\n && this.queuedDraft().trim().length <= (this.store.limits()?.maxMessageChars ?? Infinity));\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 /** Name of another participant whose turn runs or waits, or `null`. */\n readonly activeMemberName = computed(() => {\n const member = this.store.activeMember();\n return member ? member.displayName ?? '' : null;\n });\n /** The owner and the person who started the turn may stop it. */\n readonly canStop = computed(() => this.store.isOwner() || this.store.activeMember() === null);\n readonly shared = computed(() => this.store.members().some(member => member.role === 'participant'));\n readonly canShare = computed(() => this.conversation() !== null && !!this.store.collaboration());\n readonly errorKeys = computed(() => {\n const error = this.notificationError() ?? 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 this.showShare.set(false);\n });\n }\n });\n\n // The open thread counts as seen only while the drawer shows it.\n effect(() => {\n const viewing = this.panel.isOpen() && !this.showConversations() && !this.showPreferences() && !this.showShare();\n untracked(() => this.store.setViewing(viewing));\n });\n\n // A clicked notification opens its conversation in this window.\n const notifications = this.push.openConversation$.subscribe(conversationId => this.panel.open(conversationId));\n inject(DestroyRef).onDestroy(() => notifications.unsubscribe());\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 control 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 this.openFromLocation();\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.showShare.set(false);\n this.showConversations.update(show => !show);\n }\n\n togglePreferences(): void {\n this.showConversations.set(false);\n this.showShare.set(false);\n this.showPreferences.update(show => !show);\n }\n\n toggleShare(section: 'all' | 'link' | 'members' = 'all'): void {\n this.showConversations.set(false);\n this.showPreferences.set(false);\n const close = this.showShare() && this.shareSection() === section;\n this.shareSection.set(section);\n this.showShare.set(!close);\n }\n\n /** Applies the notification choice immediately, including browser permission handling. */\n async toggleNotifications(): Promise<void> {\n if (this.push.busy() || this.push.state() === 'unavailable') {\n return;\n }\n this.notificationError.set(null);\n try {\n await this.push.setEnabled(!this.push.settings()?.pushEnabled);\n } catch (error) {\n this.notificationError.set(error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : { code: 'assistant-server', messageKey: nhAssistantErrorMessageKey('assistant-server') });\n }\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 this.showShare.set(false);\n void this.store.submit(text);\n }\n\n editQueuedMessage(id: string, text: string): void {\n this.resumeAfterEditing = !this.store.queuePaused();\n this.store.pauseQueue();\n this.editingQueuedId.set(id);\n this.queuedDraft.set(text);\n }\n\n changeQueuedDraft(event: Event): void {\n this.queuedDraft.set((event.target as HTMLTextAreaElement).value);\n }\n\n saveQueuedMessage(id: string): void {\n if (this.store.updateQueuedMessage(id, this.queuedDraft())) {\n this.cancelQueueEdit();\n }\n }\n\n cancelQueueEdit(): void {\n this.editingQueuedId.set(null);\n if (this.resumeAfterEditing && !this.store.error()) {\n this.store.resumeQueue();\n }\n }\n\n /**\n * Opens the panel for an invitation link or a clicked notification in the URL fragment and\n * removes the fragment, so a reload or a shared screenshot does not reuse the token.\n */\n private openFromLocation(): void {\n const location = globalThis.location;\n const hash = location?.hash?.replace(/^#/, '') ?? '';\n const separatorIndex = hash.indexOf('=');\n const name = separatorIndex < 0 ? hash : hash.slice(0, separatorIndex);\n const value = separatorIndex < 0 ? '' : hash.slice(separatorIndex + 1);\n if (!value || (name !== NH_ASSISTANT_JOIN_FRAGMENT && name !== NH_ASSISTANT_CONVERSATION_FRAGMENT)) {\n return;\n }\n\n globalThis.history?.replaceState(globalThis.history.state, '', location.pathname + location.search);\n if (name === NH_ASSISTANT_CONVERSATION_FRAGMENT) {\n this.panel.open(decodeURIComponent(value));\n return;\n }\n\n const tokenIndex = value.indexOf('.');\n if (tokenIndex <= 0) {\n return;\n }\n const conversationId = decodeURIComponent(value.slice(0, tokenIndex));\n const token = decodeURIComponent(value.slice(tokenIndex + 1));\n this.panel.open();\n void this.store.initialize().then(() => this.store.joinConversation(conversationId, token));\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 </div>\n <div class=\"header-actions\">\n @if (store.enabled()) {\n @if (push.state() !== 'unavailable') {\n <button\n class=\"icon-button notification-button\"\n type=\"button\"\n [class.active]=\"push.state() === 'on'\"\n [class.off]=\"!push.settings()?.pushEnabled\"\n [class.blocked]=\"push.state() === 'blocked'\"\n [disabled]=\"push.busy()\"\n [attr.aria-pressed]=\"push.settings()?.pushEnabled === true\"\n [attr.aria-label]=\"notificationsLabel() | translate\"\n [attr.title]=\"('nh-assistant.preferences.notifications-state.' + push.state() | translate) + ' · ' + (notificationsLabel() | translate)\"\n (click)=\"toggleNotifications()\">\n <nh-assistant-icon name=\"bell\" />\n </button>\n }\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 [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 @if (store.enabled()) {\n <nh-assistant-activity [items]=\"store.activity()\" (conversationSelect)=\"openConversation($event)\" />\n }\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 (showShare()) {\n <nh-assistant-share class=\"overlay-view\" [section]=\"shareSection()\" (closed)=\"showShare.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 (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 [attr.inert]=\"showPreferences() || showShare() || showConversations() ? '' : null\"\n [messages]=\"messages()\"\n [streaming]=\"busy()\"\n [deciding]=\"store.deciding()\"\n [markdown]=\"markdown\"\n [members]=\"store.members()\"\n [currentActorId]=\"conversation()?.currentActorId ?? null\"\n [canDecide]=\"store.canDecide()\"\n [decisionOwner]=\"activeMemberName()\"\n (approvalDecision)=\"decide($event)\" />\n }\n }\n </div>\n\n @if (notificationError() ?? 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(); notificationError.set(null)\">\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() && !showShare()) {\n <footer class=\"footer\" (focusin)=\"refreshPageContext()\">\n @if (closed()) {\n <p class=\"notice\">{{ 'nh-assistant.panel.conversation-closed' | translate }}</p>\n }\n @if (store.collaboration() || store.pageContext()) {\n <div class=\"conversation-actions\">\n @if (store.collaboration()) {\n @if (!conversation() || store.isOwner()) {\n <button class=\"icon-button\" type=\"button\" [disabled]=\"!canShare()\"\n [attr.aria-label]=\"'nh-assistant.panel.share' | translate\"\n [attr.title]=\"'nh-assistant.panel.share' | translate\"\n [attr.aria-expanded]=\"showShare() && shareSection() === 'link'\"\n (click)=\"toggleShare('link')\">\n <nh-assistant-icon name=\"link\" />\n </button>\n }\n <button class=\"icon-button\" type=\"button\" [disabled]=\"!canShare()\"\n [class.active]=\"shared()\"\n [attr.aria-label]=\"(store.isOwner() || !conversation() ? 'nh-assistant.panel.add-members' : 'nh-assistant.panel.members') | translate\"\n [attr.title]=\"(store.isOwner() || !conversation() ? 'nh-assistant.panel.add-members' : 'nh-assistant.panel.members') | translate\"\n [attr.aria-expanded]=\"showShare() && shareSection() === 'members'\"\n (click)=\"toggleShare('members')\">\n <nh-assistant-icon name=\"users\" />\n </button>\n }\n @if (store.pageContext(); as context) {\n <button\n class=\"icon-button page-context-button\"\n [class.active]=\"!store.pageContextExcluded()\"\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=\"page\" />\n </button>\n }\n </div>\n }\n @if (store.queuedMessages().length > 0) {\n <section class=\"message-queue\" [attr.aria-label]=\"'nh-assistant.queue.title' | translate: { count: store.queuedMessages().length }\">\n <div class=\"queue-heading\">\n <span aria-live=\"polite\">{{ 'nh-assistant.queue.title' | translate: { count: store.queuedMessages().length } }}</span>\n @if (store.queuePaused()) {\n <button type=\"button\" class=\"queue-resume\" [disabled]=\"editingQueuedId() !== null\" (click)=\"store.resumeQueue()\">\n {{ 'nh-assistant.queue.resume' | translate }}\n </button>\n }\n </div>\n <ol class=\"queue-items\">\n @for (item of store.queuedMessages(); track item.id) {\n <li class=\"queue-item\" [class.failed]=\"item.state === 'failed'\">\n @if (editingQueuedId() === item.id && item.state !== 'sending') {\n <div class=\"queue-edit\">\n <textarea rows=\"2\" [value]=\"queuedDraft()\" (input)=\"changeQueuedDraft($event)\"\n [attr.aria-label]=\"'nh-assistant.queue.edit' | translate\"></textarea>\n <div class=\"queue-buttons\">\n <button type=\"button\" class=\"icon-button\" [disabled]=\"!validQueuedDraft()\"\n [attr.aria-label]=\"'nh-assistant.queue.save' | translate\" [attr.title]=\"'nh-assistant.queue.save' | translate\"\n (click)=\"saveQueuedMessage(item.id)\"><nh-assistant-icon name=\"check\" /></button>\n <button type=\"button\" class=\"icon-button\" [attr.aria-label]=\"'nh-assistant.queue.cancel-edit' | translate\"\n [attr.title]=\"'nh-assistant.queue.cancel-edit' | translate\"\n (click)=\"cancelQueueEdit()\"><nh-assistant-icon name=\"close\" /></button>\n </div>\n </div>\n } @else {\n <div class=\"queue-message\">\n <p [title]=\"item.text\">{{ item.text }}</p>\n @if (item.state !== 'queued') {\n <span class=\"queue-state\">{{ 'nh-assistant.queue.state.' + item.state | translate }}</span>\n }\n </div>\n <div class=\"queue-buttons\">\n @if (store.canSteer() && item.state === 'queued') {\n <button type=\"button\" class=\"queue-steer\" [disabled]=\"editingQueuedId() !== null\"\n [attr.title]=\"'nh-assistant.queue.steer-hint' | translate\"\n (click)=\"store.steerQueuedMessage(item.id)\">{{ 'nh-assistant.queue.steer' | translate }}</button>\n }\n <button type=\"button\" class=\"icon-button\" [disabled]=\"item.state === 'sending'\"\n [attr.aria-label]=\"'nh-assistant.queue.edit' | translate\" [attr.title]=\"'nh-assistant.queue.edit' | translate\"\n (click)=\"editQueuedMessage(item.id, item.text)\"><nh-assistant-icon name=\"edit\" /></button>\n <button type=\"button\" class=\"icon-button\" [disabled]=\"item.state === 'sending'\"\n [attr.aria-label]=\"'nh-assistant.queue.remove' | translate\" [attr.title]=\"'nh-assistant.queue.remove' | translate\"\n (click)=\"store.removeQueuedMessage(item.id)\"><nh-assistant-icon name=\"close\" /></button>\n </div>\n }\n </li>\n }\n </ol>\n </section>\n }\n <nh-assistant-composer\n [disabled]=\"closed()\"\n [sendDisabled]=\"composerDisabled()\"\n [busy]=\"busy()\"\n [queueWhileBusy]=\"true\"\n [status]=\"composerStatus()\"\n [statusActor]=\"activeMemberName()\"\n [canStop]=\"canStop()\"\n [maxLength]=\"store.limits()?.maxMessageChars ?? null\"\n [restore]=\"store.restoredDraft()\"\n (restored)=\"store.consumeRestoredDraft()\"\n (send)=\"send($event)\"\n (cancel)=\"cancel()\">\n @if (store.agents().length > 1) {\n <nh-assistant-agent-picker\n nhAssistantComposerControls\n [compact]=\"true\"\n [agents]=\"store.agents()\"\n [selectedAgentId]=\"store.selectedAgentId()\"\n (agentChange)=\"store.selectAgent($event)\" />\n }\n </nh-assistant-composer>\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-live.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 { NhAssistantLiveService, NhAssistantLiveState } from './lib/services/nh-assistant-live.service';\nexport { NhAssistantPushService, NhAssistantPushState } from './lib/services/nh-assistant-push.service';\nexport * from './lib/services/nh-assistant-panel.service';\nexport * from './lib/services/nh-assistant-share-link';\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/tool-call-group/nh-assistant-tool-call-group.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';\nexport * from './lib/components/share/nh-assistant-share.component';\nexport * from './lib/components/activity/nh-assistant-activity.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-agent-run.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-agent-run-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-live.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-push.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/internal/nh-assistant-agent-work.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-subject-summary.service.ts","../../../projects/nh-ai-chat/src/lib/provide-nh-assistant.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-share-link.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/activity/nh-assistant-activity.component.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/components/share/nh-assistant-share.component.ts","../../../projects/nh-ai-chat/src/lib/components/share/nh-assistant-share.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/internal/nh-assistant-part-groups.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-errors.ts","../../../projects/nh-ai-chat/src/lib/components/proposal-feedback/nh-assistant-proposal-feedback.component.ts","../../../projects/nh-ai-chat/src/lib/components/proposal-feedback/nh-assistant-proposal-feedback.component.html","../../../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/tool-call-group/nh-assistant-tool-call-group.component.ts","../../../projects/nh-ai-chat/src/lib/components/tool-call-group/nh-assistant-tool-call-group.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/components/subject-badge/nh-assistant-subject-badge.component.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\nimport type { AgentSubjectRole } from './assistant-agent-run.models';\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 /** Sharing, live update and notification features; missing on servers without them. */\n collaboration?: AssistantCollaboration | null;\n}\n\nexport interface AssistantCollaboration {\n /** Owners can invite colleagues directly through the application's directory. */\n directory: boolean;\n /** Path of the SignalR hub for live updates, for example `/hub/assistant`; `null` when off. */\n hubPath: string | null;\n /** Web Push notifications are configured on the server. */\n push: boolean;\n /** Maximum participants per conversation, not counting the owner. */\n maxParticipants: number;\n}\n\n/** The caller's relation to a conversation. */\nexport type ConversationRole = 'owner' | 'participant';\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 /** Default `owner` for servers without sharing. */\n role?: ConversationRole;\n /** People the owner shared the conversation with. */\n participantCount?: number;\n /** Sequence of the latest message. */\n lastMessageSequence?: number;\n /** The caller's read position; the conversation is unread while it is lower than `lastMessageSequence`. */\n lastReadSequence?: number;\n /** The owner or participant whose turn runs or waits for approval. */\n activeActorId?: string | null;\n}\n\nexport interface Conversation extends ConversationSummary {\n agentVersion: number;\n messages: Message[];\n pendingApproval: ApprovalPart | null;\n /** The owner followed by the participants; empty while the conversation is not shared. */\n members?: ConversationMember[];\n /** The current invitation-link token; only for the owner. */\n shareToken?: string | null;\n /** The caller's actor id, to recognize the caller's own messages. */\n currentActorId?: string | null;\n /** Default `chat` for servers without agent runs. */\n kind?: ConversationKind;\n /**\n * The subject of an agent thread and the caller's standing in it, including who may decide its\n * open proposals; `null` for a chat.\n */\n thread?: ConversationThread | null;\n}\n\n/** `chat` for a conversation people start; `thread` for the durable thread of an agent about one subject. */\nexport type ConversationKind = 'chat' | 'thread';\n\n/**\n * The subject of an agent thread as the caller sees it. In a thread the subject's approvers decide\n * the agent's proposals, not the author of a turn. The server checks the role on every request.\n */\nexport interface ConversationThread {\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n /** The caller's live role on the subject. */\n role: AgentSubjectRole;\n /** Each open proposal of the thread and whether the caller may decide it now, oldest first. */\n decisions: ConversationThreadDecision[];\n}\n\n/**\n * The caller's right to decide one open proposal of an agent thread, checked like the decision\n * itself: the approval policy, four-eyes and the tool's approve policy.\n */\nexport interface ConversationThreadDecision {\n approvalId: string;\n /**\n * The run that proposed it; such a proposal is decided with `POST approvals/{id}/decisions`.\n * `null` for a proposal of a person's turn in the thread, decided in the conversation.\n */\n runId: string | null;\n canDecide: boolean;\n /** Why the caller may not decide, for example `assistant-four-eyes-required`; `null` when they may. */\n reasonCode: string | null;\n}\n\nexport type ConversationStatus = 'idle' | 'running' | 'waiting-for-approval' | 'failed' | 'archived';\n\n/** The owner or a participant of a shared conversation. */\nexport interface ConversationMember {\n actorId: string;\n /** `null` when the application provides no name. */\n displayName: string | null;\n role: ConversationRole;\n joinedAt: string;\n}\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant' | 'tool';\n createdAt: string;\n parts: MessagePart[];\n /** Position in the conversation; missing on optimistic messages and old servers. */\n sequence?: number;\n /** The writer of a user message. */\n authorActorId?: string | null;\n /** Who wrote a user message: a person or a trigger of an agent; missing on old servers. */\n authorKind?: MessageAuthorKind | null;\n}\n\n/** `person` for a message a person wrote; `trigger` for one a trigger wrote into an agent thread. */\nexport type MessageAuthorKind = 'person' | 'trigger';\n\nexport type MessagePart = TextPart | ToolCallPart | ApprovalPart;\n\nexport interface TextPart {\n type: 'text';\n text: string;\n}\n\n/**\n * `awaiting-approval` waits for a person. A call whose agent proposal closed without running ends\n * as `rejected`, as `not-executed` when the proposal expired, was withdrawn or became stale, or as\n * `failed` when its execution failed before it started; its `resultCode` is then\n * `assistant-proposal-<approval status>`, for example `assistant-proposal-expired`.\n */\nexport type ToolCallStatus = 'running' | 'succeeded' | 'failed' | 'awaiting-approval' | 'rejected' | 'not-executed';\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 /** `delegated` or `agent` when an agent used rights beyond the caller's own. */\n grantSource?: 'delegated' | 'agent' | null;\n /** The result came from the agent's own grant and is shielded from this viewer. */\n restricted?: boolean;\n}\n\n/**\n * Chat approvals are `pending`, `approved`, `rejected` or `expired`; proposals of agents that run on\n * their own continue through execution (`executing`, `executed`, `execution-failed`,\n * `execution-unknown`, `resolved`) or end as `withdrawn`, `stale` or `shadow`.\n */\nexport type ApprovalStatus =\n | 'pending'\n | 'approved'\n | 'rejected'\n | 'expired'\n | 'withdrawn'\n | 'stale'\n | 'executing'\n | 'executed'\n | 'execution-failed'\n | 'execution-unknown'\n | 'resolved'\n | 'shadow';\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\n/** Response of `POST conversations/{id}/share-link`. */\nexport interface ShareLink {\n token: string;\n}\n\n/** A person the owner may invite, from the application's directory. */\nexport interface DirectoryEntry {\n actorId: string;\n displayName: string;\n detail: string | null;\n}\n\n/** Response of `GET` and `PUT notifications`. */\nexport interface NotificationSettings {\n /** The caller's choice; on by default. */\n pushEnabled: boolean;\n /** The server has Web Push configured. */\n pushAvailable: boolean;\n /** The VAPID key browsers subscribe with. */\n publicKey: string | null;\n}\n\n/** Body of `PUT notifications/push-subscription`: `PushSubscription.toJSON()` plus the text language. */\nexport interface PushSubscriptionRequest {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n language?: 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 /** The open conversation was deleted by its owner, or the user left or was removed. */\n conversationRemoved: 'assistant-conversation-removed'\n} as const;\n\nexport type NhAssistantClientErrorCode = typeof NhAssistantClientErrorCodes[keyof typeof NhAssistantClientErrorCodes];\n","import { ApprovalPresentation } from './assistant-api.models';\n\n/**\n * Contracts of the agent-run endpoints of `NewHeap.Platform.AI.Chat.AspNet`: threads about a\n * subject, runs, proposals, the approval inbox, working memory and artifacts.\n */\n\n/** The caller's role on the subject of a thread. */\nexport type AgentSubjectRole = 'none' | 'reader' | 'participant' | 'approver';\n\nexport type AgentRunStatus = 'queued' | 'running' | 'waiting-for-approval' | 'completed' | 'failed' | 'cancelled';\n\nexport type AgentProposalStatus =\n | 'pending'\n | 'approved'\n | 'rejected'\n | 'expired'\n | 'withdrawn'\n | 'stale'\n | 'executing'\n | 'executed'\n | 'execution-failed'\n | 'execution-unknown'\n | 'resolved'\n | 'shadow';\n\nexport type AgentGrantSource = 'none' | 'delegated' | 'agent';\n\nexport interface AgentRun {\n id: string;\n conversationId: string;\n triggerId: string;\n status: AgentRunStatus;\n failureClass: string | null;\n failureCode: string | null;\n initiatorActorId: string | null;\n accountableOwnerId: string;\n attempt: number;\n agentVersion: number;\n toolCalls: number;\n inputTokens: number;\n outputTokens: number;\n proposalCount: number;\n summary: string | null;\n shadow: boolean;\n createdAt: string;\n startedAt: string | null;\n endedAt: string | null;\n backgroundOperationId: string | null;\n}\n\nexport interface AgentRunList {\n items: AgentRun[];\n total: number;\n}\n\nexport interface AgentThread {\n conversationId: string;\n agentId: string;\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n accountability: string;\n accountableOwnerId: string;\n role: AgentSubjectRole;\n activeRun: AgentRun | null;\n waitingInputs: number;\n}\n\nexport interface AgentThreadLookup {\n thread: AgentThread | null;\n canStart: boolean;\n role: AgentSubjectRole;\n}\n\n/** The caller's live right to decide one open proposal; the server checks every decision again. */\nexport interface AgentProposalDecisionRight {\n canDecide: boolean;\n /**\n * Why the caller may not decide, for example `assistant-four-eyes-required` or\n * `assistant-approval-policy-denied`; `null` when they may.\n */\n reasonCode: string | null;\n}\n\n/** One agent on a subject: its thread, `null` before it worked on the subject, and whether the caller may start it. */\nexport interface AgentSubjectWorkAgent {\n agentId: string;\n thread: AgentThread | null;\n canStart: boolean;\n}\n\n/** An open proposal on a subject with the caller's live decision right. */\nexport interface AgentSubjectWorkProposal extends AgentProposalDecisionRight {\n proposal: AgentProposal;\n}\n\n/**\n * All agent work on one subject as the caller may see it (`GET subjects/{type}/{id}/work`): every\n * agent with a thread on the subject plus the requested agent, and the pending proposals of all\n * those threads, the earliest expiry first.\n */\nexport interface AgentSubjectWork {\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n /** The caller's live role. Without a role the server answers `404 assistant-subject-not-found`. */\n role: Exclude<AgentSubjectRole, 'none'>;\n agents: AgentSubjectWorkAgent[];\n openProposals: AgentSubjectWorkProposal[];\n}\n\n/** The agent work on one subject for a list view (`POST subjects/{type}/summary`). */\nexport interface AgentSubjectSummary {\n subjectId: string;\n /** Proposals that wait for a decision on the subject. */\n openProposals: number;\n /** The open proposals the caller may decide, counted like the approval inbox. */\n proposalsToDecide: number;\n /** An agent works on the subject now. */\n runActive: boolean;\n}\n\n/** One summary per requested subject, in request order; subjects without visible work count zero. */\nexport interface AgentSubjectSummaryList {\n subjectType: string;\n items: AgentSubjectSummary[];\n}\n\n/** Maximum number of subjects one `POST subjects/{type}/summary` request accepts. */\nexport const NH_ASSISTANT_MAX_SUBJECT_SUMMARY = 200;\n\nexport interface StartAgentRequest {\n agentId: string;\n subjectType: string;\n subjectId: string;\n message?: string | null;\n}\n\nexport interface AgentTriggerReceipt {\n triggerId: string;\n outcome: 'started' | 'queued' | 'coalesced' | 'superseded' | 'ignored' | 'deduplicated' | 'rejected';\n runId: string | null;\n conversationId: string | null;\n reasonCode: string | null;\n}\n\nexport interface AgentProposal {\n approvalId: string;\n proposalId: string;\n proposalHash: string;\n conversationId: string;\n runId: string | null;\n agentId: string;\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n toolId: string;\n summary: string;\n /**\n * The application's localized explanation, written when the proposal was recorded. Show it\n * instead of `argumentsPreview`; `null` when no presenter handled the tool.\n */\n presentation: ApprovalPresentation | null;\n argumentsPreview: string;\n targets: string[];\n status: AgentProposalStatus;\n mode: 'inline' | 'deferred';\n policyId: string | null;\n grantSource: AgentGrantSource;\n createdAt: string;\n expiresAt: string;\n initiatorActorId: string | null;\n decidedByActorId: string | null;\n /**\n * The name of `decidedByActorId` from the subject's member snapshot; `null` when the snapshot\n * does not know the person. Show `decidedByActorId` then. Missing on older servers.\n */\n decidedByDisplayName?: string | null;\n decidedAt: string | null;\n executionResultCode: string | null;\n executedAt: string | null;\n /**\n * The consultation that proposed it, when another assistant consulted the agent for\n * `initiatorActorId`; it executes with that person's rights only.\n */\n consultationId?: string | null;\n /** The caller's own feedback on the proposal; `null` when they gave none. Missing on older servers. */\n feedback?: AgentProposalFeedback | null;\n /**\n * Whether the caller may give or change feedback: the proposal was rejected, expired, withdrawn or\n * closed as stale, and the caller decided it or is an approver of the subject. Missing on older servers.\n */\n canGiveFeedback?: boolean;\n}\n\n/**\n * Why a person rejected a proposal. `incorrect`, `wrong-value` and `not-needed` say the agent was\n * wrong; `not-now` and `already-done` say it was right but not at this moment; `not-allowed` says\n * it went beyond what the agent should do; `other` leaves the explanation to the text.\n */\nexport type AgentProposalFeedbackCategory =\n | 'incorrect'\n | 'wrong-value'\n | 'not-needed'\n | 'not-now'\n | 'already-done'\n | 'not-allowed'\n | 'other';\n\n/** The group of a feedback category. `right-but-not-now` never counts as \"the agent was wrong\". */\nexport type AgentProposalFeedbackGroup = 'wrong' | 'right-but-not-now' | 'not-allowed' | 'other';\n\n/** The feedback categories in the order people choose them. */\nexport const NH_ASSISTANT_FEEDBACK_CATEGORIES: readonly AgentProposalFeedbackCategory[] = [\n 'incorrect',\n 'wrong-value',\n 'not-needed',\n 'not-now',\n 'already-done',\n 'not-allowed',\n 'other'\n];\n\n/** The group of each feedback category, as the server reports it. */\nexport const NH_ASSISTANT_FEEDBACK_GROUPS: Readonly<Record<AgentProposalFeedbackCategory, AgentProposalFeedbackGroup>> = {\n incorrect: 'wrong',\n 'wrong-value': 'wrong',\n 'not-needed': 'wrong',\n 'not-now': 'right-but-not-now',\n 'already-done': 'right-but-not-now',\n 'not-allowed': 'not-allowed',\n other: 'other'\n};\n\n/** Maximum length of the text of a feedback. */\nexport const NH_ASSISTANT_MAX_FEEDBACK_TEXT = 1_000;\n\n/** Maximum number of proposals one `POST approvals/feedback` request accepts. */\nexport const NH_ASSISTANT_MAX_BULK_FEEDBACK = 50;\n\n/**\n * One person's feedback on a rejected or otherwise closed proposal. It is separate from the\n * decision's reason, arrives after the decision and can be changed by its author.\n */\nexport interface AgentProposalFeedback {\n approvalId: string;\n category: AgentProposalFeedbackCategory;\n group: AgentProposalFeedbackGroup;\n text: string | null;\n /** Given once for several proposals that were rejected together. */\n bulk: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n/** The outcome of the feedback on one proposal of `POST approvals/feedback`. */\nexport interface AgentFeedbackOutcome {\n approvalId: string;\n succeeded: boolean;\n /** For example `assistant-feedback-not-accepted`; `null` when it succeeded. */\n code: string | null;\n}\n\nexport type AgentConsultationStatus = 'running' | 'completed' | 'failed';\n\n/**\n * One consultation of a thread's agent by another assistant. It names who asked and through which\n * assistant; the question and the answer stay in the asking conversation.\n */\nexport interface AgentConsultation {\n id: string;\n askerActorId: string;\n /** The asker's name from the subject's members, when known. */\n askerDisplayName: string | null;\n askingAgentId: string | null;\n depth: number;\n status: AgentConsultationStatus;\n failureCode: string | null;\n toolCalls: number;\n inputTokens: number;\n outputTokens: number;\n proposalCount: number;\n createdAt: string;\n endedAt: string | null;\n}\n\nexport interface AgentConsultationList {\n items: AgentConsultation[];\n total: number;\n}\n\nexport interface AgentInbox {\n items: AgentProposal[];\n total: number;\n}\n\nexport interface AgentInboxFilter {\n subjectType?: string;\n agentId?: string;\n divisionId?: string;\n runId?: string;\n page?: number;\n itemsPerPage?: number;\n}\n\nexport type AgentProposalDecision = 'approve' | 'reject';\n\nexport interface AgentDecisionOutcome {\n approvalId: string;\n succeeded: boolean;\n code: string | null;\n status: AgentProposalStatus | null;\n}\n\nexport interface AgentThreadMemory {\n configured: boolean;\n schemaVersion: number;\n memory: unknown;\n updatedAt: string | null;\n}\n\nexport interface AgentArtifact {\n id: string;\n name: string;\n version: number;\n contentType: string;\n sizeBytes: number;\n createdAt: string;\n runId: string | null;\n restricted: boolean;\n}\n\n/** `resume` continues the run from its last checkpoint; `restart` starts a new run in the thread. */\nexport type AgentRunRetryMode = 'resume' | 'restart';\n\n/** `re-execute` runs the proposal again; `mark-resolved` confirms its outcome without running it. */\nexport type AgentExecutionResolution = 're-execute' | 'mark-resolved';\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 extra headers for every assistant request, for example the NewHeap active division:\n * `() => ({ 'X-NH-ActiveDivisionId': inject(MyAuthService).getAuthorization()?.activeDivision?.id ?? '' })`.\n * Runs in the assistant's injection context before every request, like `getAccessToken`, and\n * when the live-update connection starts. `Authorization`, `Accept`, `Accept-Language` and\n * `Content-Type` stay under the library's control, and empty values are left out. Browsers send\n * no custom headers with the WebSocket and server-sent event transports of the live connection;\n * pass what the hub needs with `getHubQueryParameters`. Default: none.\n */\n getRequestHeaders?: () => Record<string, string> | null | Promise<Record<string, string> | null>;\n /**\n * Returns query parameters for the live-update hub URL: the values the hub needs that browsers\n * cannot send as headers, because the WebSocket and server-sent event transports carry none.\n * Without them a hub that requires such a value refuses those transports and the connection\n * falls back to long polling. For example the NewHeap active division, which the platform's JWT\n * handler copies from `divisionId` to `X-NH-ActiveDivisionId` on `/hub` paths:\n * `() => ({ divisionId: inject(MyAuthService).getAuthorization()?.activeDivision?.id ?? '' })`.\n * Runs in the assistant's injection context each time the connection starts. `access_token`,\n * `id` and `negotiateVersion` stay under the control of the library and SignalR, empty values\n * are left out and a failing getter only leaves the parameters out. Never return a secret: URLs\n * appear in server and proxy logs. Default: none.\n */\n getHubQueryParameters?: () => Record<string, string> | null | Promise<Record<string, 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 * Live updates of shared and parallel conversations through the server's SignalR hub, which\n * `GET status` reports. Uses `@microsoft/signalr`, loaded on first use. Default `true`; when off\n * or unavailable the assistant reloads snapshots instead.\n */\n liveUpdates?: boolean;\n /**\n * Base the server's hub path is appended to, for example `'/api'` when a proxy serves the API\n * below a prefix, as for the NewHeap background operation hub. Default: the origin of `apiBaseUrl`.\n */\n hubBaseUrl?: string;\n /**\n * Web Push notifications for people who are away. Copy the bundled worker from\n * `node_modules/@newheap/platform-ai-chat/push` into the application's assets and point\n * `serviceWorkerUrl` to it. Without this setting the assistant never subscribes the browser.\n */\n push?: NhAssistantPushConfig;\n /**\n * Builds the invitation link an owner copies. Default: the current page with\n * `#nh-assistant-join=<conversationId>.<token>`; the panel joins when the page opens with it.\n */\n buildShareLink?: (conversationId: string, token: string) => string;\n}\n\nexport interface NhAssistantPushConfig {\n /** URL of the bundled worker, for example `/nh-assistant/nh-assistant-push-worker.js`. */\n serviceWorkerUrl: string;\n /**\n * Scope of the worker. Default: the worker's folder. Keep it apart from an application service\n * worker; the assistant worker only shows notifications and never controls pages.\n */\n scope?: string;\n /** Page a notification opens when no window of the application is open. Default `/`. */\n openUrl?: string;\n /** Icon URL of the notifications. */\n icon?: string;\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, NhAssistantConfig } 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> = await nhAssistantRequestHeaders(this.config, this.injector);\n headers['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\nconst reservedRequestHeaders = new Set(['authorization', 'accept', 'accept-language', 'content-type']);\n\n/**\n * The host's extra request headers from `NhAssistantConfig.getRequestHeaders`, without the\n * headers the library sets itself and without empty values.\n */\nexport async function nhAssistantRequestHeaders(\n config: NhAssistantConfig,\n injector: EnvironmentInjector\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n if (!config.getRequestHeaders) {\n return headers;\n }\n\n const extra = await runInInjectionContext(injector, () => config.getRequestHeaders!());\n for (const [name, value] of Object.entries(extra ?? {})) {\n if (typeof value === 'string' && value.length > 0 && !reservedRequestHeaders.has(name.toLowerCase())) {\n headers[name] = value;\n }\n }\n return headers;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n AdminAgent,\n AdminAgentInput,\n AgentFeedbackExportFilter,\n AgentFeedbackFilter,\n AgentFeedbackList,\n AgentFeedbackListFilter,\n AgentFeedbackSummary,\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 {\n NhAssistantApiError,\n NhAssistantStatusCodes,\n NhAssistantTransport,\n nhAssistantCodeForStatus,\n nhAssistantErrorMessageKey\n} 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 /**\n * The agent's proposals per tool and agent version in the period: decisions, the rejection rate,\n * feedback per category and the number of different people who gave it.\n */\n getAgentFeedbackSummary(agentId: string, filter: AgentFeedbackFilter = {}): Observable<AgentFeedbackSummary> {\n return this.request<AgentFeedbackSummary>('GET', withQuery(`${feedbackPath(agentId)}/summary`, filter));\n }\n\n /** The feedback on the agent's proposals with the proposal as approvers read it, newest change first. */\n getAgentFeedback(agentId: string, filter: AgentFeedbackListFilter = {}): Observable<AgentFeedbackList> {\n return this.request<AgentFeedbackList>('GET', withQuery(feedbackPath(agentId), filter));\n }\n\n /**\n * Downloads the feedback as JSON Lines with the tool input of each proposal. The file holds\n * subject data and the server audits the export. Rejects with `NhAssistantApiError`.\n */\n async exportAgentFeedback(agentId: string, filter: AgentFeedbackExportFilter = {}): Promise<Blob> {\n const path = withQuery(`${feedbackPath(agentId)}/export`, filter);\n let response: Response;\n try {\n response = await this.transport.fetch('GET', path, 'application/x-ndjson', undefined, new AbortController().signal);\n } catch {\n const code = nhAssistantCodeForStatus(0);\n throw new NhAssistantApiError(0, code, nhAssistantErrorMessageKey(code));\n }\n\n if (!response.ok) {\n const code = await this.transport.failureCode(response, adminStatusCodes);\n throw new NhAssistantApiError(response.status, code, nhAssistantErrorMessageKey(code));\n }\n return response.blob();\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\nfunction feedbackPath(agentId: string): string {\n return `admin/agents/${encodeURIComponent(agentId)}/feedback`;\n}\n\n/** Appends the filter values that are set as query parameters. */\nfunction withQuery(path: string, filter: object): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter)) {\n if (value !== undefined && value !== null && value !== '') {\n query.set(key, String(value));\n }\n }\n\n const suffix = query.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n AgentArtifact,\n AgentConsultationList,\n AgentDecisionOutcome,\n AgentExecutionResolution,\n AgentFeedbackOutcome,\n AgentInbox,\n AgentInboxFilter,\n AgentProposal,\n AgentProposalDecision,\n AgentProposalFeedback,\n AgentProposalFeedbackCategory,\n AgentRunList,\n AgentRunRetryMode,\n AgentSubjectSummaryList,\n AgentSubjectWork,\n AgentThreadLookup,\n AgentThreadMemory,\n AgentTriggerReceipt,\n StartAgentRequest\n} from '../models/assistant-agent-run.models';\nimport { NhAssistantTransport } from './nh-assistant-transport';\n\n/**\n * Client for the agent-run endpoints: the agent thread about a subject, its runs, proposals,\n * working memory and artifacts, and the approval inbox. Access follows the caller's role on the\n * subject, which the server checks on every request; failures error with `NhAssistantApiError`.\n */\n@Injectable()\nexport class NhAssistantAgentRunApiService {\n private readonly transport = inject(NhAssistantTransport);\n\n /** The agent's thread about the subject, the caller's role and whether the caller may start the agent. */\n getThread(agentId: string, subjectType: string, subjectId: string): Observable<AgentThreadLookup> {\n const query = new URLSearchParams({ agentId, subjectType, subjectId });\n return this.transport.json<AgentThreadLookup>('GET', `threads?${query.toString()}`);\n }\n\n /**\n * The agent's thread about the subject, created without starting a run when it is missing, so\n * the caller can open the conversation and type there. Creating a thread needs the participant\n * role; readers may open an existing one. Errors with `assistant-subject-access-denied` otherwise.\n */\n openThread(agentId: string, subjectType: string, subjectId: string): Observable<AgentThreadLookup> {\n return this.transport.json<AgentThreadLookup>('POST', 'threads/open', { agentId, subjectType, subjectId });\n }\n\n /** Starts the agent on the subject with the caller as initiator; needs the participant role. */\n startAgent(request: StartAgentRequest): Observable<AgentTriggerReceipt> {\n return this.transport.json<AgentTriggerReceipt>('POST', 'threads/start', request);\n }\n\n /**\n * All agent work on one subject: the caller's role, every agent with a thread on it plus\n * `agentId`, and the open proposals of all of them with the caller's live decision right. Errors\n * with `assistant-subject-not-found` when the caller has no role on the subject.\n */\n getSubjectWork(subjectType: string, subjectId: string, agentId?: string): Observable<AgentSubjectWork> {\n const path = `subjects/${encodeURIComponent(subjectType)}/${encodeURIComponent(subjectId)}/work`;\n const query = agentId ? `?${new URLSearchParams({ agentId }).toString()}` : '';\n return this.transport.json<AgentSubjectWork>('GET', path + query);\n }\n\n /**\n * Counts the agent work on at most `NH_ASSISTANT_MAX_SUBJECT_SUMMARY` subjects of one type in one\n * request, for badges in a list; one item per id in request order. `NhAssistantSubjectSummaryService`\n * batches and caches these requests for many badges.\n */\n summarizeSubjects(subjectType: string, subjectIds: readonly string[]): Observable<AgentSubjectSummaryList> {\n return this.transport.json<AgentSubjectSummaryList>('POST', `subjects/${encodeURIComponent(subjectType)}/summary`, {\n subjectIds\n });\n }\n\n getRuns(conversationId: string): Observable<AgentRunList> {\n return this.transport.json<AgentRunList>('GET', `threads/${encodeURIComponent(conversationId)}/runs`);\n }\n\n /** Who consulted the thread's agent through another assistant, newest first. */\n getConsultations(conversationId: string, page = 1, itemsPerPage = 20): Observable<AgentConsultationList> {\n const query = new URLSearchParams({ page: String(page), itemsPerPage: String(itemsPerPage) });\n return this.transport.json<AgentConsultationList>(\n 'GET',\n `threads/${encodeURIComponent(conversationId)}/consultations?${query.toString()}`\n );\n }\n\n getProposals(conversationId: string): Observable<AgentProposal[]> {\n return this.transport.json<AgentProposal[]>('GET', `threads/${encodeURIComponent(conversationId)}/proposals`);\n }\n\n getMemory(conversationId: string): Observable<AgentThreadMemory> {\n return this.transport.json<AgentThreadMemory>('GET', `threads/${encodeURIComponent(conversationId)}/memory`);\n }\n\n getArtifacts(conversationId: string): Observable<AgentArtifact[]> {\n return this.transport.json<AgentArtifact[]>('GET', `threads/${encodeURIComponent(conversationId)}/artifacts`);\n }\n\n /** Downloads one artifact version with the host's credentials. */\n downloadArtifact(conversationId: string, artifactId: string): Promise<Blob> {\n const path = `threads/${encodeURIComponent(conversationId)}/artifacts/${encodeURIComponent(artifactId)}/content`;\n return this.transport.fetch('GET', path, '*/*', undefined, new AbortController().signal).then(response => {\n if (!response.ok) {\n throw new Error(`Artifact download failed with status ${response.status}.`);\n }\n return response.blob();\n });\n }\n\n /** Cancels a run at its next safe point and withdraws its open proposals; needs the participant role. */\n cancelRun(runId: string): Observable<void> {\n return this.transport.json<void>('POST', `runs/${encodeURIComponent(runId)}/cancel`);\n }\n\n /** Resumes or restarts a failed or cancelled run; needs the approver role. */\n retryRun(runId: string, mode: AgentRunRetryMode): Observable<AgentTriggerReceipt> {\n return this.transport.json<AgentTriggerReceipt>('POST', `runs/${encodeURIComponent(runId)}/retry`, { mode });\n }\n\n /** Pending proposals the caller may decide, sorted by expiry. */\n getInbox(filter: AgentInboxFilter = {}): Observable<AgentInbox> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter)) {\n if (value !== undefined && value !== null && value !== '') {\n query.set(key, String(value));\n }\n }\n const suffix = query.toString();\n return this.transport.json<AgentInbox>('GET', suffix ? `approvals/inbox?${suffix}` : 'approvals/inbox');\n }\n\n /**\n * Decides one proposal, bound to the proposal hash the person saw; the server checks the approval\n * policy and the tool's approve policy again. Accepts an inbox proposal or the approval part of an\n * agent thread.\n */\n decide(\n proposal: Pick<AgentProposal, 'approvalId' | 'proposalHash'>,\n decision: AgentProposalDecision,\n reason?: string\n ): Observable<AgentProposal> {\n return this.transport.json<AgentProposal>('POST', `approvals/${encodeURIComponent(proposal.approvalId)}/decisions`, {\n decision,\n expectedProposalHash: proposal.proposalHash,\n reason: reason?.trim() || null\n });\n }\n\n /** Decides several proposals; each one is checked and decided on its own. */\n decideMany(approvalIds: string[], decision: AgentProposalDecision, reason?: string): Observable<{ results: AgentDecisionOutcome[] }> {\n return this.transport.json<{ results: AgentDecisionOutcome[] }>('POST', 'approvals/decisions', {\n approvalIds,\n decision,\n reason: reason?.trim() || null\n });\n }\n\n /** Resolves an execution whose outcome is unknown. */\n resolve(approvalId: string, action: AgentExecutionResolution, reason?: string): Observable<AgentProposal> {\n return this.transport.json<AgentProposal>('POST', `approvals/${encodeURIComponent(approvalId)}/resolve`, {\n action,\n reason: reason?.trim() || null\n });\n }\n\n /**\n * Gives or changes the caller's feedback on a closed proposal (`canGiveFeedback`). Feedback is\n * optional and separate from the decision; an empty text is sent as `null`. Fails with\n * `assistant-feedback-not-accepted` while the proposal is pending or after it was approved.\n */\n giveFeedback(\n approvalId: string,\n category: AgentProposalFeedbackCategory,\n text?: string | null\n ): Observable<AgentProposalFeedback> {\n return this.transport.json<AgentProposalFeedback>('PUT', `approvals/${encodeURIComponent(approvalId)}/feedback`, {\n category,\n text: text?.trim() || null\n });\n }\n\n /**\n * Gives the same feedback on at most `NH_ASSISTANT_MAX_BULK_FEEDBACK` proposals that were\n * rejected together. Each proposal is checked on its own and stored as bulk feedback.\n */\n giveFeedbackMany(\n approvalIds: readonly string[],\n category: AgentProposalFeedbackCategory,\n text?: string | null\n ): Observable<{ results: AgentFeedbackOutcome[] }> {\n return this.transport.json<{ results: AgentFeedbackOutcome[] }>('POST', 'approvals/feedback', {\n approvalIds,\n category,\n text: text?.trim() || null\n });\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 DirectoryEntry,\n NotificationSettings,\n PushSubscriptionRequest,\n SendMessageRequest,\n ShareLink\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 /** Raises the caller's read position to `sequence`, or to the latest message when omitted. */\n markRead(conversationId: string, sequence?: number): Observable<void> {\n return this.transport.json<void>(\n 'POST',\n `conversations/${encodeURIComponent(conversationId)}/read`,\n sequence === undefined ? {} : { sequence }\n );\n }\n\n /** Owner only: creates a new invitation link; an earlier link stops working. */\n createShareLink(conversationId: string): Observable<ShareLink> {\n return this.transport.json<ShareLink>('POST', `conversations/${encodeURIComponent(conversationId)}/share-link`);\n }\n\n /** Owner only: the invitation link stops working; people who joined stay. */\n revokeShareLink(conversationId: string): Observable<void> {\n return this.transport.json<void>('DELETE', `conversations/${encodeURIComponent(conversationId)}/share-link`);\n }\n\n /** Joins a shared conversation with the token of its invitation link. */\n joinConversation(conversationId: string, token: string): Observable<Conversation> {\n return this.transport.json<Conversation>('POST', `conversations/${encodeURIComponent(conversationId)}/join`, { token });\n }\n\n /** Owner only: searches the application's directory for people to invite. */\n searchParticipantCandidates(conversationId: string, query: string): Observable<DirectoryEntry[]> {\n const path = `conversations/${encodeURIComponent(conversationId)}/participant-candidates?query=${encodeURIComponent(query)}`;\n return this.transport.json<DirectoryEntry[]>('GET', path);\n }\n\n /** Owner only: invites a person the directory returned. */\n inviteParticipant(conversationId: string, actorId: string): Observable<void> {\n return this.transport.json<void>('POST', `conversations/${encodeURIComponent(conversationId)}/participants`, { actorId });\n }\n\n /** The owner removes a participant, or a participant passes their own id to leave. */\n removeParticipant(conversationId: string, actorId: string): Observable<void> {\n const path = `conversations/${encodeURIComponent(conversationId)}/participants/${encodeURIComponent(actorId)}`;\n return this.transport.json<void>('DELETE', path);\n }\n\n /** The caller's notification choice and the server's Web Push key. */\n getNotificationSettings(): Observable<NotificationSettings> {\n return this.transport.json<NotificationSettings>('GET', 'notifications');\n }\n\n /** Turns push notifications on or off for every browser of the caller. */\n updateNotificationSettings(pushEnabled: boolean): Observable<NotificationSettings> {\n return this.transport.json<NotificationSettings>('PUT', 'notifications', { pushEnabled });\n }\n\n /** Registers this browser's push subscription for the caller. */\n subscribePush(subscription: PushSubscriptionRequest): Observable<void> {\n return this.transport.json<void>('PUT', 'notifications/push-subscription', subscription);\n }\n\n /** Removes this browser's push subscription. */\n unsubscribePush(endpoint: string): Observable<void> {\n return this.transport.json<void>('DELETE', 'notifications/push-subscription', { endpoint });\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 { DestroyRef, EnvironmentInjector, Injectable, PLATFORM_ID, inject, runInInjectionContext, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { HubConnection } from '@microsoft/signalr';\nimport { Observable, Subject } from 'rxjs';\nimport {\n LiveAgentWorkChanged,\n LiveConversationChanged,\n LiveConversationEvent,\n LiveConversationRead,\n LiveConversationRemoved\n} from '../models/assistant-live.models';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { nhAssistantRequestHeaders } from './nh-assistant-transport';\n\nexport type NhAssistantLiveState = 'off' | 'connecting' | 'connected' | 'reconnecting' | 'disconnected';\n\nconst reconnectDelaysMs = [0, 2_000, 5_000, 10_000, 30_000];\nconst restartDelayMs = 30_000;\n/** Query parameters the library and SignalR set themselves. */\nconst reservedHubQueryParameters = new Set(['access_token', 'id', 'negotiateversion']);\n\n/**\n * Live updates of the assistant hub: conversation changes, read positions, removals, the turn\n * events of other sessions and changes to the work of agents that run on their own. Connects only\n * while the store asks for it, reconnects on its own and emits `resync` after every (re)connect,\n * because updates sent while disconnected are lost.\n */\n@Injectable()\nexport class NhAssistantLiveService {\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly injector = inject(EnvironmentInjector);\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly changedSubject = new Subject<LiveConversationChanged>();\n private readonly readSubject = new Subject<LiveConversationRead>();\n private readonly removedSubject = new Subject<LiveConversationRemoved>();\n private readonly eventSubject = new Subject<LiveConversationEvent>();\n private readonly agentWorkSubject = new Subject<LiveAgentWorkChanged>();\n private readonly resyncSubject = new Subject<void>();\n private readonly stateSignal = signal<NhAssistantLiveState>('off');\n\n private connection?: HubConnection;\n private hubPath: string | null = null;\n private hubUrl: string | null = null;\n private revision = 0;\n private restartTimer?: ReturnType<typeof setTimeout>;\n\n readonly changed$: Observable<LiveConversationChanged> = this.changedSubject.asObservable();\n readonly read$: Observable<LiveConversationRead> = this.readSubject.asObservable();\n readonly removed$: Observable<LiveConversationRemoved> = this.removedSubject.asObservable();\n readonly events$: Observable<LiveConversationEvent> = this.eventSubject.asObservable();\n /**\n * A run, proposal or feedback of an agent thread changed. It carries no content; components\n * that show the thread reload it.\n */\n readonly agentWork$: Observable<LiveAgentWorkChanged> = this.agentWorkSubject.asObservable();\n /** Reload snapshots: emitted after every (re)connect. */\n readonly resync$: Observable<void> = this.resyncSubject.asObservable();\n readonly state = this.stateSignal.asReadonly();\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n void this.stop();\n this.changedSubject.complete();\n this.readSubject.complete();\n this.removedSubject.complete();\n this.eventSubject.complete();\n this.agentWorkSubject.complete();\n this.resyncSubject.complete();\n });\n }\n\n /**\n * Connects to the hub at `hubPath`, or disconnects when it is `null`. Calling it again with the\n * same path keeps the connection; another path or `restart` reconnects, for example after the\n * signed-in user changed.\n */\n async connect(hubPath: string | null, restart = false): Promise<void> {\n const url = this.browser && this.config.liveUpdates !== false && hubPath ? this.resolveUrl(hubPath) : null;\n if (!restart && url === this.hubUrl && this.connection) {\n return;\n }\n\n await this.stop();\n this.hubPath = url ? hubPath : null;\n this.hubUrl = url;\n if (!url) {\n return;\n }\n\n const revision = ++this.revision;\n this.stateSignal.set('connecting');\n try {\n const connection = await this.build(url);\n if (revision !== this.revision) {\n await connection.stop().catch(() => undefined);\n return;\n }\n this.connection = connection;\n await connection.start();\n if (revision === this.revision) {\n this.stateSignal.set('connected');\n this.resyncSubject.next();\n }\n } catch {\n // Live updates are optional; snapshots keep the assistant correct. Try again later.\n if (revision === this.revision) {\n this.stateSignal.set('disconnected');\n this.scheduleRestart(revision);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.revision++;\n this.hubUrl = null;\n clearTimeout(this.restartTimer);\n const connection = this.connection;\n this.connection = undefined;\n this.stateSignal.set('off');\n if (connection) {\n await connection.stop().catch(() => undefined);\n }\n }\n\n private async build(url: string): Promise<HubConnection> {\n const signalR = await import('@microsoft/signalr');\n const headers = await nhAssistantRequestHeaders(this.config, this.injector);\n const hubUrl = await this.withQueryParameters(url);\n const connection = new signalR.HubConnectionBuilder()\n .withUrl(hubUrl, {\n accessTokenFactory: async () => (await this.token()) ?? '',\n headers\n })\n .withAutomaticReconnect(reconnectDelaysMs)\n .configureLogging(signalR.LogLevel.None)\n .build();\n\n connection.on('ConversationChanged', (message: LiveConversationChanged) => this.changedSubject.next(message));\n connection.on('ConversationRead', (message: LiveConversationRead) => this.readSubject.next(message));\n connection.on('ConversationRemoved', (message: LiveConversationRemoved) => this.removedSubject.next(message));\n connection.on('ConversationEvent', (message: LiveConversationEvent) => this.eventSubject.next(message));\n connection.on('AgentWorkChanged', (message: LiveAgentWorkChanged) => this.agentWorkSubject.next(message));\n connection.onreconnecting(() => this.stateSignal.set('reconnecting'));\n connection.onreconnected(() => {\n this.stateSignal.set('connected');\n this.resyncSubject.next();\n });\n connection.onclose(() => {\n if (this.connection === connection) {\n this.connection = undefined;\n this.stateSignal.set('disconnected');\n this.scheduleRestart(this.revision);\n }\n });\n return connection;\n }\n\n /** Starts over after the automatic reconnect gave up or the first start failed. */\n private scheduleRestart(revision: number): void {\n clearTimeout(this.restartTimer);\n this.restartTimer = setTimeout(() => {\n if (revision === this.revision && this.hubPath) {\n void this.connect(this.hubPath, true);\n }\n }, restartDelayMs);\n }\n\n private async token(): Promise<string | null> {\n try {\n return await runInInjectionContext(this.injector, () => this.config.getAccessToken());\n } catch {\n return null;\n }\n }\n\n /**\n * The hub URL with the host's `getHubQueryParameters`, which reach the hub on every transport,\n * unlike headers on WebSockets and server-sent events.\n */\n private async withQueryParameters(url: string): Promise<string> {\n const getter = this.config.getHubQueryParameters;\n if (!getter) {\n return url;\n }\n\n let parameters: Record<string, string> | null;\n try {\n parameters = await runInInjectionContext(this.injector, () => getter());\n } catch {\n return url;\n }\n\n const target = new URL(url);\n for (const [name, value] of Object.entries(parameters ?? {})) {\n if (typeof value === 'string' && value.length > 0 && !reservedHubQueryParameters.has(name.toLowerCase())) {\n target.searchParams.set(name, value);\n }\n }\n return target.toString();\n }\n\n /** `hubBaseUrl` + `hubPath`, or the hub path on the origin of `apiBaseUrl`. */\n private resolveUrl(hubPath: string): string {\n const page = globalThis.location?.href ?? 'http://localhost';\n if (this.config.hubBaseUrl) {\n const base = new URL(this.config.hubBaseUrl, page).toString().replace(/\\/+$/, '');\n return `${base}/${hubPath.replace(/^\\/+/, '')}`;\n }\n return new URL(hubPath, new URL(this.config.apiBaseUrl, page).origin).toString();\n }\n}\n","import { DestroyRef, Injectable, PLATFORM_ID, computed, inject, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable, Subject, firstValueFrom } from 'rxjs';\nimport { NotificationSettings } from '../models/assistant-api.models';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantApiService } from './nh-assistant-api.service';\n\n/**\n * Push state of this browser for the signed-in user:\n * - `unavailable`: the server, the browser or the host configuration does not support Web Push;\n * - `off`: the user turned notifications off;\n * - `prompt`: on, but the browser has not asked for permission yet (it asks on the next message sent);\n * - `blocked`: on, but the browser denied permission;\n * - `on`: this browser receives notifications.\n */\nexport type NhAssistantPushState = 'unavailable' | 'off' | 'prompt' | 'blocked' | 'on';\n\nconst openConversationMessage = 'nh-assistant.open-conversation';\n\n/**\n * Keeps this browser's Web Push subscription in line with the user's choice. Notifications are on\n * by default; because browsers only ask for permission after a user action, the assistant asks\n * when the user sends a message or turns notifications on. The bundled service worker shows a\n * notification only when no window of the application is focused.\n */\n@Injectable()\nexport class NhAssistantPushService {\n private readonly api = inject(NhAssistantApiService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly settingsState = signal<NotificationSettings | null>(null);\n private readonly permissionState = signal<NotificationPermission | 'unsupported'>('default');\n private readonly subscribedState = signal(false);\n private readonly busyState = signal(false);\n private readonly openSubject = new Subject<string>();\n private registration?: Promise<ServiceWorkerRegistration>;\n private revision = 0;\n private readonly onWorkerMessage = (event: MessageEvent) => {\n const data = event.data as { type?: unknown; conversationId?: unknown } | null;\n if (data?.type === openConversationMessage && typeof data.conversationId === 'string') {\n this.openSubject.next(data.conversationId);\n }\n };\n\n /** The caller's server-side choice, or `null` before it was loaded. */\n readonly settings = this.settingsState.asReadonly();\n readonly busy = this.busyState.asReadonly();\n /** Conversations a clicked notification asks to open. */\n readonly openConversation$: Observable<string> = this.openSubject.asObservable();\n readonly state = computed<NhAssistantPushState>(() => {\n const settings = this.settingsState();\n if (!settings?.pushAvailable || !this.isSupported()) {\n return 'unavailable';\n }\n if (!settings.pushEnabled) {\n return 'off';\n }\n const permission = this.permissionState();\n if (permission === 'denied' || permission === 'unsupported') {\n return 'blocked';\n }\n return permission === 'granted' && this.subscribedState() ? 'on' : 'prompt';\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n if (this.browser && this.isSupported()) {\n navigator.serviceWorker.removeEventListener('message', this.onWorkerMessage);\n }\n this.openSubject.complete();\n });\n if (this.browser && this.isSupported()) {\n navigator.serviceWorker.addEventListener('message', this.onWorkerMessage);\n navigator.serviceWorker.startMessages();\n }\n }\n\n /**\n * Loads the user's choice and, when permission was granted before, renews this browser's\n * subscription, which also moves it to the current user and to a rotated server key.\n */\n async activate(serverSupportsPush: boolean): Promise<void> {\n const revision = ++this.revision;\n if (!serverSupportsPush || !this.isSupported()) {\n this.settingsState.set(null);\n return;\n }\n\n try {\n const settings = await firstValueFrom(this.api.getNotificationSettings());\n if (revision !== this.revision) {\n return;\n }\n this.settingsState.set(settings);\n this.permissionState.set(Notification.permission);\n if (settings.pushEnabled && Notification.permission === 'granted') {\n await this.subscribe(settings);\n }\n } catch {\n // Notifications are optional; the assistant works without them.\n if (revision === this.revision) {\n this.settingsState.set(null);\n }\n }\n }\n\n /**\n * Forgets the user. The browser subscription is cancelled, so a previous user on a shared device\n * stops receiving notifications even when the server cannot be told.\n */\n async deactivate(): Promise<void> {\n this.revision++;\n this.settingsState.set(null);\n this.subscribedState.set(false);\n if (!this.isSupported()) {\n return;\n }\n try {\n const registration = await navigator.serviceWorker.getRegistration(this.scope());\n const subscription = await registration?.pushManager.getSubscription();\n await subscription?.unsubscribe();\n } catch {\n // Nothing to cancel.\n }\n }\n\n /** Asks for permission once, after a user action such as sending a message. */\n async onUserGesture(): Promise<void> {\n const settings = this.settingsState();\n if (!settings?.pushEnabled || !settings.pushAvailable || !this.isSupported() || Notification.permission !== 'default') {\n return;\n }\n const permission = await Notification.requestPermission();\n this.permissionState.set(permission);\n if (permission === 'granted') {\n await this.subscribe(settings);\n }\n }\n\n /** Turns notifications on or off for every browser of the user. Call it from a user action. */\n async setEnabled(enabled: boolean): Promise<void> {\n this.busyState.set(true);\n try {\n const settings = await firstValueFrom(this.api.updateNotificationSettings(enabled));\n this.settingsState.set(settings);\n if (!this.isSupported()) {\n return;\n }\n if (enabled) {\n if (Notification.permission === 'default') {\n this.permissionState.set(await Notification.requestPermission());\n }\n if (Notification.permission === 'granted') {\n await this.subscribe(settings);\n }\n return;\n }\n await this.unsubscribe();\n } finally {\n this.busyState.set(false);\n }\n }\n\n private async subscribe(settings: NotificationSettings): Promise<void> {\n if (!settings.publicKey) {\n return;\n }\n const revision = this.revision;\n const registration = await this.register();\n const key = decodeBase64Url(settings.publicKey);\n let subscription = await registration.pushManager.getSubscription();\n if (subscription && !sameKey(subscription.options.applicationServerKey, key)) {\n // The server rotated its key; a subscription for the old key would be refused.\n await subscription.unsubscribe();\n subscription = null;\n }\n subscription ??= await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n const json = subscription.toJSON();\n if (!json.endpoint || !json.keys?.['p256dh'] || !json.keys['auth'] || revision !== this.revision) {\n return;\n }\n await firstValueFrom(this.api.subscribePush({\n endpoint: json.endpoint,\n keys: { p256dh: json.keys['p256dh'], auth: json.keys['auth'] },\n language: this.translate?.getCurrentLang() ?? navigator.language\n }), { defaultValue: undefined });\n if (revision === this.revision) {\n this.subscribedState.set(true);\n }\n }\n\n private async unsubscribe(): Promise<void> {\n this.subscribedState.set(false);\n const registration = await navigator.serviceWorker.getRegistration(this.scope());\n const subscription = await registration?.pushManager.getSubscription();\n if (!subscription) {\n return;\n }\n await firstValueFrom(this.api.unsubscribePush(subscription.endpoint), { defaultValue: undefined }).catch(() => undefined);\n await subscription.unsubscribe();\n }\n\n private register(): Promise<ServiceWorkerRegistration> {\n const push = this.config.push!;\n this.registration ??= (async () => {\n const url = new URL(push.serviceWorkerUrl, location.href);\n url.searchParams.set('app', new URL(push.openUrl ?? '/', location.href).href);\n if (push.icon) {\n url.searchParams.set('icon', new URL(push.icon, location.href).href);\n }\n return navigator.serviceWorker.register(url.href, { scope: this.scope() });\n })();\n return this.registration;\n }\n\n private scope(): string {\n const push = this.config.push;\n if (!push) {\n return '/';\n }\n return push.scope ?? new URL('./', new URL(push.serviceWorkerUrl, location.href)).pathname;\n }\n\n private isSupported(): boolean {\n return this.browser\n && !!this.config.push?.serviceWorkerUrl\n && globalThis.isSecureContext === true\n && 'serviceWorker' in navigator\n && 'PushManager' in globalThis\n && 'Notification' in globalThis;\n }\n}\n\nfunction decodeBase64Url(value: string): Uint8Array<ArrayBuffer> {\n const base64 = value.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(value.length / 4) * 4, '=');\n const binary = atob(base64);\n const bytes = new Uint8Array(new ArrayBuffer(binary.length));\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction sameKey(current: ArrayBuffer | null, expected: Uint8Array): boolean {\n if (!current) {\n return false;\n }\n const bytes = new Uint8Array(current);\n return bytes.length === expected.length && bytes.every((byte, index) => byte === expected[index]);\n}\n","import {\n ApprovalPart,\n Conversation,\n ConversationStatus,\n Message,\n MessagePart,\n ToolCallPart\n} from '../models/assistant-api.models';\nimport { LiveConversationChanged, LiveConversationEvent } from '../models/assistant-live.models';\nimport { NH_ASSISTANT_SSE_EVENT_TYPES, 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 * Applies a live update of another session: `message.created` adds a participant's message,\n * the turn events behave exactly like the starting request's stream. Unknown types are ignored.\n */\nexport function applyNhAssistantLiveEvent(conversation: Conversation, event: LiveConversationEvent): Conversation {\n if (event.type === 'message.created') {\n const message = event.data as Message;\n if (!message?.id || conversation.messages.some(existing => existing.id === message.id)) {\n return conversation;\n }\n return { ...conversation, messages: [...conversation.messages, message] };\n }\n\n if (!(NH_ASSISTANT_SSE_EVENT_TYPES as readonly string[]).includes(event.type)) {\n return conversation;\n }\n return applyNhAssistantEvent(conversation, { type: event.type, data: event.data } as NhAssistantSseEvent);\n}\n\n/** Applies the shared state of a conversation that a live update announced. */\nexport function applyNhAssistantConversationChange(conversation: Conversation, change: LiveConversationChanged): Conversation {\n return {\n ...conversation,\n status: change.status,\n title: change.title,\n updatedAt: change.updatedAt,\n activeActorId: change.activeActorId,\n lastMessageSequence: change.lastMessageSequence,\n participantCount: change.participantCount,\n pendingApproval: change.status === 'waiting-for-approval' ? conversation.pendingApproval : null\n };\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 { DOCUMENT } from '@angular/common';\nimport {\n DestroyRef,\n EnvironmentInjector,\n Injectable,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n runInInjectionContext,\n signal,\n untracked\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Observable, Subscription, firstValueFrom, isObservable } from 'rxjs';\nimport {\n AgentSummary,\n ApprovalDecision,\n ApprovalPart,\n ApprovalStatus,\n AssistantStatus,\n ClientContext,\n Conversation,\n ConversationMember,\n ConversationStatus,\n ConversationSummary,\n DirectoryEntry\n} from '../models/assistant-api.models';\nimport {\n LiveAgentWorkChanged,\n LiveConversationChanged,\n LiveConversationEvent,\n LiveConversationRead,\n LiveConversationRemoved\n} from '../models/assistant-live.models';\nimport { NhAssistantClientErrorCodes, NhAssistantSseEvent, TurnUsage } from '../models/assistant-sse.models';\nimport { NH_ASSISTANT_ACCESS_POLICY, NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantAgentRunApiService } from './nh-assistant-agent-run-api.service';\nimport { NhAssistantApiError, NhAssistantApiService, nhAssistantErrorMessageKey } from './nh-assistant-api.service';\nimport { NhAssistantLiveService } from './nh-assistant-live.service';\nimport { NhAssistantPushService } from './nh-assistant-push.service';\nimport {\n applyNhAssistantApprovalDecision,\n applyNhAssistantConversationChange,\n applyNhAssistantEvent,\n applyNhAssistantLiveEvent,\n nhAssistantLatestTurnHasText\n} 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/** An unsent message held in this tab, scoped to its original conversation. */\nexport interface NhAssistantQueuedMessage {\n id: string;\n conversationId: string;\n text: string;\n state: 'preparing' | 'queued' | 'sending' | 'failed';\n}\n\ninterface QueuedMessage extends NhAssistantQueuedMessage {\n clientContext?: ClientContext | null;\n}\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\n/**\n * Who decides an approval the current user cannot decide: `turn`, the person whose turn created\n * it in a chat; `approver`, an approver of the agent thread's subject; `other-approver`, another\n * approver, because the current user started the work and four-eyes applies.\n */\nexport type NhAssistantApprovalWaitingFor = 'turn' | 'approver' | 'other-approver';\n\n/** The current user's right to decide, or to give feedback on, one approval of the open conversation. */\nexport interface NhAssistantApprovalRight {\n canDecide: boolean;\n /** Who decides when the current user cannot. */\n waitingFor: NhAssistantApprovalWaitingFor;\n /** Name of the person who decides a `turn` approval; `null` when unknown. */\n decisionOwner: string | null;\n /**\n * True for an agent's proposal the current user rejected in this session, so the approval card\n * offers the optional feedback question. Chat approvals never offer feedback.\n */\n canGiveFeedback?: boolean;\n}\n\nconst fourEyesRequiredCode = 'assistant-four-eyes-required';\n\n\n/**\n * A conversation that needs attention outside the open thread: a turn runs, an approval waits or\n * there is something unread.\n */\nexport interface NhAssistantActivity {\n id: string;\n title: string | null;\n status: ConversationStatus;\n unread: boolean;\n shared: boolean;\n /** True for the conversation shown in the panel. */\n active: boolean;\n updatedAt: string;\n}\n\n/** True when a conversation has messages the caller has not read. A running turn is not unread yet. */\nexport function nhAssistantIsUnread(summary: Pick<ConversationSummary, 'status' | 'lastMessageSequence' | 'lastReadSequence'>): boolean {\n if (summary.status === 'running' || summary.lastReadSequence === undefined) {\n return false;\n }\n return (summary.lastMessageSequence ?? 0) > summary.lastReadSequence;\n}\n\n/** The state of one conversation this tab has opened. */\ninterface NhAssistantSession {\n conversation: Conversation;\n /** A request of this tab streams a turn of the conversation. */\n streaming: boolean;\n deciding: boolean;\n error: NhAssistantError | null;\n notice: NhAssistantNotice | null;\n lastUsage: TurnUsage | null;\n}\n\nconst conversationPageSize = 50;\nconst cancelGracePeriodMs = 5_000;\nconst maxSessions = 20;\nconst refreshDelayMs = 300;\nconst newConversationKey = '';\n\n/**\n * Signal-based state of one assistant scope: availability, agents, the conversation list and\n * every conversation this tab has opened. Several conversations can run turns at the same time;\n * the public signals describe the conversation that is open in the panel. With live updates the\n * store follows turns of other people and of the user's other tabs.\n */\n@Injectable()\nexport class NhAssistantStore {\n private readonly api = inject(NhAssistantApiService);\n private readonly agentRuns = inject(NhAssistantAgentRunApiService);\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 private readonly live = inject(NhAssistantLiveService);\n private readonly push = inject(NhAssistantPushService);\n private readonly document = inject(DOCUMENT);\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\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 sessionsState = signal<ReadonlyMap<string, NhAssistantSession>>(new Map());\n private readonly activeIdState = signal<string | null>(null);\n private readonly conversationLoadingState = signal(false);\n /** The conversation a message is being prepared for; `''` while a new conversation is created. */\n private readonly sendingState = signal<string | null>(null);\n private readonly draftErrorState = signal<NhAssistantError | 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 private readonly viewingState = signal(false);\n private readonly pageVisibleState = signal(true);\n private readonly queuedState = signal<QueuedMessage[]>([]);\n private readonly pausedQueuesState = signal<ReadonlySet<string>>(new Set());\n private readonly queueDispatchState = signal<string | null>(null);\n private readonly steeringState = signal<string | null>(null);\n private readonly submittingState = signal(false);\n /** Agent proposals the current user rejected in this session and may give feedback on. */\n private readonly feedbackApprovalsState = signal<ReadonlySet<string>>(new Set());\n private destroyed = false;\n\n private readonly streams = new Map<string, Subscription>();\n private readonly cancelTimers = new Map<string, ReturnType<typeof setTimeout>>();\n /** Pending reloads of agent threads after live agent-work updates, per conversation. */\n private readonly agentWorkTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly pendingSendResolves = new Map<string, (accepted: boolean) => void>();\n private readonly markingRead = new Set<string>();\n private readonly liveSubscription = new Subscription();\n private accessSubscription?: Subscription;\n private refreshTimer?: ReturnType<typeof setTimeout>;\n private initialization?: Promise<void>;\n private statusRevision = 0;\n private accountRevision = 0;\n private collaborationKey: string | null = null;\n\n private readonly activeSession = computed(() => {\n const id = this.activeIdState();\n return id === null ? null : this.sessionsState().get(id) ?? null;\n });\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 /** Sharing, live update and notification features the server offers. */\n readonly collaboration = computed(() => this.statusState()?.collaboration ?? null);\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 /** The conversation open in the panel, or `null` for a new one. */\n readonly activeConversation = computed(() => this.activeSession()?.conversation ?? null);\n readonly conversationLoading = this.conversationLoadingState.asReadonly();\n /** True while this tab sends a message or streams a turn of the open conversation. */\n readonly streaming = computed(() => {\n const sending = this.sendingState();\n const activeId = this.activeIdState();\n return (sending !== null && sending === (activeId ?? newConversationKey)) || this.activeSession()?.streaming === true;\n });\n readonly pendingApproval = computed(() => this.activeConversation()?.pendingApproval ?? null);\n readonly deciding = computed(() => this.activeSession()?.deciding === true);\n readonly error = computed(() => this.activeIdState() === null ? this.draftErrorState() : this.activeSession()?.error ?? null);\n /** Non-blocking remark about the latest completed turn; shown only while no error is shown. */\n readonly notice = computed(() => this.activeSession()?.notice ?? null);\n readonly lastUsage = computed(() => this.activeSession()?.lastUsage ?? null);\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.activeConversation();\n const blocked = conversation !== null && conversation.status !== 'idle';\n return this.enabled() && this.selectedAgentIdState() !== null && !this.streaming() && !this.conversationLoadingState() && !blocked;\n });\n /** Messages not yet accepted by the server, for the open conversation. Never persisted. */\n readonly queuedMessages = computed<readonly NhAssistantQueuedMessage[]>(() =>\n this.queuedState().filter(item => item.conversationId === this.activeIdState()));\n /** Sending or queueing is available during a turn and while an approval waits. */\n readonly canSubmit = computed(() => (this.canSend() && !this.submittingState()) || (this.enabled()\n && !this.conversationLoading() && this.activeConversation() !== null\n && ['idle', 'running', 'waiting-for-approval'].includes(this.activeConversation()!.status)));\n readonly queuePaused = computed(() => this.pausedQueuesState().has(this.activeIdState() ?? '') || this.error() !== null);\n /** Steering cancels the active turn before sending the selected correction. */\n readonly canSteer = computed(() => {\n const conversation = this.activeConversation();\n const ownsTurn = conversation?.activeActorId && conversation.currentActorId\n ? conversation.activeActorId === conversation.currentActorId : this.activeSession()?.streaming === true;\n return this.enabled() && this.steeringState() === null && !this.submittingState()\n && this.queueDispatchState() === null\n && ['running', 'waiting-for-approval'].includes(conversation?.status ?? '')\n && (this.isOwner() || ownsTurn);\n });\n /** The owner and participants of the open conversation; empty while it is not shared. */\n readonly members = computed<ConversationMember[]>(() => this.activeConversation()?.members ?? []);\n /** True when the current user owns the open conversation (or it is new). */\n readonly isOwner = computed(() => (this.activeConversation()?.role ?? 'owner') === 'owner');\n /** True when the open conversation is the durable thread of an agent about a subject. */\n readonly isAgentThread = computed(() => this.activeConversation()?.kind === 'thread');\n /**\n * The current user's right to decide each pending approval of the open conversation, by approval\n * id. In a chat only the author of the waiting turn decides. In an agent thread the subject's\n * approvers decide, as the server reports per proposal: the approval policy, four-eyes and the\n * tool's approve policy, checked live. Proposals the user rejected in this session carry\n * `canGiveFeedback`.\n */\n readonly approvalRights = computed<ReadonlyMap<string, NhAssistantApprovalRight>>(() => {\n const conversation = this.activeConversation();\n const rights = new Map<string, NhAssistantApprovalRight>();\n if (!conversation) {\n return rights;\n }\n\n if (conversation.kind === 'thread') {\n const decisions = new Map((conversation.thread?.decisions ?? []).map(decision => [decision.approvalId, decision]));\n for (const approval of pendingApprovalParts(conversation)) {\n const decision = decisions.get(approval.approvalId);\n rights.set(approval.approvalId, {\n canDecide: decision?.canDecide === true,\n waitingFor: decision?.reasonCode === fourEyesRequiredCode ? 'other-approver' : 'approver',\n decisionOwner: null\n });\n }\n\n const feedbackApprovals = this.feedbackApprovalsState();\n for (const approval of approvalParts(conversation)) {\n if (approval.status === 'rejected' && feedbackApprovals.has(approval.approvalId)) {\n rights.set(approval.approvalId, {\n canDecide: false,\n waitingFor: 'approver',\n decisionOwner: null,\n canGiveFeedback: true\n });\n }\n }\n return rights;\n }\n\n if (conversation.pendingApproval) {\n rights.set(conversation.pendingApproval.approvalId, {\n canDecide: !conversation.activeActorId || !conversation.currentActorId\n || conversation.activeActorId === conversation.currentActorId,\n waitingFor: 'turn',\n decisionOwner: this.activeMember()?.displayName ?? null\n });\n }\n return rights;\n });\n /**\n * True when the current user may decide the pending approval: in a chat it belongs to their own\n * turn, in an agent thread the server allows them as an approver.\n */\n readonly canDecide = computed(() => {\n const approval = this.activeConversation()?.pendingApproval;\n return approval ? this.approvalRights().get(approval.approvalId)?.canDecide === true : false;\n });\n /** The member whose turn runs or waits in the open conversation, when it is someone else. */\n readonly activeMember = computed<ConversationMember | null>(() => {\n const conversation = this.activeConversation();\n if (!conversation?.activeActorId || conversation.activeActorId === conversation.currentActorId) {\n return null;\n }\n return conversation.members?.find(member => member.actorId === conversation.activeActorId) ?? null;\n });\n /** Conversations that need attention: running, waiting for approval or unread. Most recent first. */\n readonly activity = computed<NhAssistantActivity[]>(() => {\n const sessions = this.sessionsState();\n const activeId = this.activeIdState();\n return this.conversationsState()\n .map(summary => {\n const session = sessions.get(summary.id);\n const status = session?.streaming ? session.conversation.status : summary.status;\n return {\n id: summary.id,\n title: summary.title,\n status,\n unread: nhAssistantIsUnread({ ...summary, status }),\n shared: (summary.participantCount ?? 0) > 0,\n active: summary.id === activeId,\n updatedAt: summary.updatedAt\n };\n })\n .filter(item => item.status === 'running' || item.status === 'waiting-for-approval' || item.unread);\n });\n readonly runningCount = computed(() => this.activity().filter(item => item.status === 'running').length);\n readonly waitingCount = computed(() => this.activity().filter(item => item.status === 'waiting-for-approval').length);\n readonly unreadCount = computed(() => this.activity().filter(item => item.unread).length);\n /** Live update connection state. */\n readonly liveState = this.live.state;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => {\n this.destroyed = true;\n this.accessSubscription?.unsubscribe();\n this.liveSubscription.unsubscribe();\n this.stopAllTurns();\n this.clearAgentWorkTimers();\n clearTimeout(this.refreshTimer);\n });\n\n effect(() => {\n const queued = this.queuedState();\n const sessions = this.sessionsState();\n const paused = this.pausedQueuesState();\n const steering = this.steeringState();\n const steeringItem = queued.find(item => item.id === steering);\n const steeringSession = steeringItem ? sessions.get(steeringItem.conversationId) : null;\n if (steering && (!steeringItem || steeringSession?.error\n || (steeringSession?.conversation.status === 'idle' && !steeringSession.streaming))) {\n untracked(() => this.steeringState.set(null));\n }\n if (!this.enabled() || this.queueDispatchState() !== null || this.sendingState() !== null || this.submittingState()) {\n return;\n }\n const next = queued.find((item, index) => {\n const session = sessions.get(item.conversationId);\n return item.state === 'queued' && !paused.has(item.conversationId)\n && !queued.slice(0, index).some(previous => previous.conversationId === item.conversationId)\n && session?.conversation.status === 'idle' && !session.streaming && !session.deciding && !session.error;\n });\n if (next) {\n untracked(() => void this.dispatchQueued(next));\n }\n });\n\n this.liveSubscription.add(this.live.changed$.subscribe(change => this.onLiveChanged(change)));\n this.liveSubscription.add(this.live.read$.subscribe(read => this.onLiveRead(read)));\n this.liveSubscription.add(this.live.removed$.subscribe(removed => this.onLiveRemoved(removed)));\n this.liveSubscription.add(this.live.events$.subscribe(event => this.onLiveEvent(event)));\n this.liveSubscription.add(this.live.agentWork$.subscribe(change => this.onLiveAgentWork(change)));\n this.liveSubscription.add(this.live.resync$.subscribe(() => this.resync()));\n\n if (this.browser) {\n const update = () => this.pageVisibleState.set(this.document.visibilityState === 'visible' && this.document.hasFocus());\n const visible = () => {\n update();\n if (this.document.visibilityState === 'visible' && this.enabled()) {\n // Without live updates, or on another instance, coming back reloads the list.\n void this.refreshConversations();\n }\n };\n this.document.addEventListener('visibilitychange', visible);\n globalThis.addEventListener?.('focus', update);\n globalThis.addEventListener?.('blur', update);\n destroyRef.onDestroy(() => {\n this.document.removeEventListener('visibilitychange', visible);\n globalThis.removeEventListener?.('focus', update);\n globalThis.removeEventListener?.('blur', update);\n });\n update();\n }\n\n // Marks the open conversation as read while the user looks at it.\n effect(() => {\n this.activeIdState();\n this.viewingState();\n this.pageVisibleState();\n this.conversationsState();\n this.sessionsState();\n untracked(() => this.markActiveReadWhenSeen());\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.resetAccount();\n this.statusState.set(null);\n this.selectedAgentIdState.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.resetAccount();\n this.statusState.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 this.startCollaboration(status);\n if (this.activeIdState() === null && 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.map(item => this.withLocalState(item)));\n this.conversationsTotalState.set(page.total);\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(this.activeIdState(), 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 open 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.activeConversation();\n if (active && active.agentId !== agentId) {\n this.startNewConversation();\n }\n }\n\n /**\n * Leaves the open conversation; the next message creates a new one. Turns of other\n * conversations keep running in the background.\n */\n startNewConversation(): void {\n this.activeIdState.set(null);\n this.uiState.update({ conversationId: null });\n this.draftErrorState.set(null);\n }\n\n /** Opens a conversation; one that this tab already follows opens immediately. */\n async openConversation(conversationId: string): Promise<void> {\n await this.loadConversation(conversationId, false);\n }\n\n /** Tells the store whether the user can see the open thread, so it can mark it as read. */\n setViewing(viewing: boolean): void {\n this.viewingState.set(viewing);\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n if (this.sessionsState().get(conversationId)?.streaming) {\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.forget(conversationId);\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(this.activeIdState(), error);\n }\n }\n }\n\n /**\n * Sends a user message. Creates a conversation with the selected agent when none is open,\n * shows the message optimistically and applies the streamed events. Other conversations keep\n * their own turns. Resolves `false` when the message was not accepted.\n */\n async send(text: string): Promise<boolean> {\n // Browsers only ask for notification permission during a user action such as this one.\n void this.push.onUserGesture().catch(() => undefined);\n return this.sendMessage(text);\n }\n\n /** Sends immediately when idle, otherwise appends to the conversation's FIFO queue. */\n async submit(text: string): Promise<boolean> {\n if (this.canSend() && this.queuedMessages().length === 0 && !this.queuePaused() && !this.submittingState()) {\n const revision = this.accountRevision;\n this.submittingState.set(true);\n try {\n return await this.send(text);\n } finally {\n if (revision === this.accountRevision && !this.destroyed) {\n this.submittingState.set(false);\n }\n }\n }\n const conversationId = this.activeIdState();\n const trimmed = text.trim();\n if (!conversationId || !this.canSubmit() || !trimmed || trimmed.length > (this.limits()?.maxMessageChars ?? Infinity)) {\n return false;\n }\n void this.push.onUserGesture().catch(() => undefined);\n const revision = this.accountRevision;\n const item: QueuedMessage = { id: createClientMessageId(), conversationId, text: trimmed, state: 'preparing' };\n this.queuedState.update(items => [...items, item]);\n const clientContext = await this.contextForMessage();\n if (revision !== this.accountRevision || this.destroyed) {\n return false;\n }\n this.queuedState.update(items => items.map(current => current.id === item.id\n ? { ...current, state: 'queued', clientContext } : current));\n return true;\n }\n\n /** Edits an unsent queued message without replacing the composer's current draft. */\n updateQueuedMessage(id: string, text: string): boolean {\n const trimmed = text.trim();\n if (!trimmed || trimmed.length > (this.limits()?.maxMessageChars ?? Infinity)\n || !this.queuedMessages().some(item => item.id === id && item.state !== 'sending')) {\n return false;\n }\n this.queuedState.update(items => items.map(item => item.id === id ? { ...item, text: trimmed } : item));\n return true;\n }\n\n removeQueuedMessage(id: string): void {\n this.queuedState.update(items => items.filter(item => item.id !== id\n || item.conversationId !== this.activeIdState() || item.state === 'sending'));\n }\n\n /** Pauses automatic dispatch while keeping all unsent messages available. */\n pauseQueue(): void {\n const conversationId = this.activeIdState();\n if (conversationId) {\n this.pausedQueuesState.update(paused => new Set([...paused, conversationId]));\n }\n }\n\n /** Explicitly resumes after Stop or a failure; approval decisions remain separate. */\n resumeQueue(): void {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return;\n }\n this.pausedQueuesState.update(paused => new Set([...paused].filter(id => id !== conversationId)));\n this.patchSession(conversationId, session => ({ ...session, error: null }));\n this.queuedState.update(items => items.map(item => item.conversationId === conversationId && item.state === 'failed'\n ? { ...item, state: 'queued' } : item));\n }\n\n /** Prioritizes a queued correction and waits for confirmed cancellation before dispatch. */\n async steerQueuedMessage(id: string): Promise<void> {\n const item = this.queuedState().find(message => message.id === id && message.conversationId === this.activeIdState());\n if (!item || item.state !== 'queued' || !this.canSteer()) {\n return;\n }\n this.steeringState.set(id);\n this.queuedState.update(items => [item, ...items.filter(message => message.id !== id)]);\n this.resumeQueue();\n try {\n await this.cancelConversation(item.conversationId);\n } finally {\n if (this.steeringState() === id && this.sessionsState().get(item.conversationId)?.error) {\n this.steeringState.set(null);\n }\n }\n }\n\n private async dispatchQueued(item: QueuedMessage): Promise<void> {\n const revision = this.accountRevision;\n this.queueDispatchState.set(item.id);\n this.queuedState.update(items => items.map(current => current.id === item.id ? { ...current, state: 'sending' } : current));\n const accepted = await this.sendMessage(item.text, item);\n if (revision !== this.accountRevision || this.destroyed) {\n return;\n }\n this.queuedState.update(items => accepted ? items.filter(current => current.id !== item.id)\n : items.map(current => current.id === item.id ? { ...current, state: 'failed' } : current));\n if (!accepted) {\n this.pausedQueuesState.update(paused => new Set([...paused, item.conversationId]));\n }\n this.queueDispatchState.set(null);\n }\n\n private async sendMessage(text: string, queued?: QueuedMessage): Promise<boolean> {\n const trimmed = text.trim();\n const accountRevision = this.accountRevision;\n await this.initialize();\n await this.reloadStatus();\n if (accountRevision !== this.accountRevision || this.destroyed) {\n return false;\n }\n let conversation = queued ? this.sessionsState().get(queued.conversationId)?.conversation ?? null : this.activeConversation();\n const session = queued ? this.sessionsState().get(queued.conversationId) : null;\n const available = queued ? this.enabled() && !this.pausedQueuesState().has(queued.conversationId)\n && conversation?.status === 'idle' && !session?.streaming\n && !session?.deciding && this.agents().some(agent => agent.id === conversation?.agentId) : this.canSend();\n const maxChars = this.limits()?.maxMessageChars ?? Number.MAX_SAFE_INTEGER;\n if (trimmed.length === 0 || trimmed.length > maxChars || !available) {\n return false;\n }\n\n this.sendingState.set(conversation?.id ?? newConversationKey);\n if (!queued) {\n this.restoredDraftState.set(null);\n }\n this.draftErrorState.set(null);\n\n if (!conversation) {\n conversation = await this.createConversation();\n if (!conversation) {\n if (accountRevision === this.accountRevision) {\n this.sendingState.set(null);\n this.restoredDraftState.set(text);\n }\n return false;\n }\n this.sendingState.set(conversation.id);\n }\n\n const clientContext = queued ? queued.clientContext : await this.contextForMessage();\n if (accountRevision !== this.accountRevision) {\n return false;\n }\n const conversationId = conversation.id;\n const clientMessageId = createClientMessageId();\n const previousStatus = conversation.status;\n this.patchSession(conversationId, session => ({\n ...session,\n error: null,\n notice: null,\n conversation: {\n ...session.conversation,\n status: 'running',\n messages: [\n ...session.conversation.messages,\n {\n id: clientMessageId,\n role: 'user',\n createdAt: new Date().toISOString(),\n parts: [{ type: 'text', text: trimmed }],\n authorActorId: session.conversation.currentActorId ?? null\n }\n ]\n }\n }));\n this.patchSummary(conversationId, { status: 'running', updatedAt: new Date().toISOString() });\n\n return new Promise<boolean>(resolve => {\n this.pendingSendResolves.set(conversationId, resolve);\n let started = false;\n let failedAfterStart = false;\n\n this.runStream(conversationId, 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(conversationId, clientMessageId, previousStatus);\n if (!queued && this.activeIdState() === conversationId) {\n this.restoredDraftState.set(text);\n }\n this.patchSession(conversationId, session => ({ ...session, error: 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(conversationId, event, clientMessageId);\n },\n complete: () => {\n this.pendingSendResolves.delete(conversationId);\n resolve(started);\n this.afterTurn(conversationId, failedAfterStart);\n }\n });\n this.sendingState.set(null);\n });\n }\n\n /**\n * Approves or rejects an approval of the open conversation: `approvalId`, or the pending approval\n * when it is left out. A proposal of an agent's run is decided with its proposal hash through the\n * agent-run endpoint; other approvals resume their turn as a stream. Ignores calls the current\n * user may not make and repeated calls while a decision is in flight.\n */\n decide(decision: ApprovalDecision, reason?: string, approvalId?: string): void {\n const session = this.activeSession();\n const conversation = session?.conversation;\n if (!session || !conversation || session.deciding || session.streaming) {\n return;\n }\n const approval = approvalId\n ? pendingApprovalParts(conversation).find(part => part.approvalId === approvalId) ?? null\n : conversation.pendingApproval;\n if (!approval || this.approvalRights().get(approval.approvalId)?.canDecide !== true) {\n return;\n }\n\n const proposal = conversation.thread?.decisions.find(item => item.approvalId === approval.approvalId);\n if (proposal?.runId) {\n void this.decideProposal(conversation.id, approval, decision, reason);\n return;\n }\n if (conversation.pendingApproval?.approvalId !== approval.approvalId) {\n // Only the approval the conversation waits for resumes a turn.\n return;\n }\n\n const conversationId = conversation.id;\n this.patchSession(conversationId, current => ({ ...current, deciding: true, error: null, notice: null }));\n\n let accepted = false;\n let failed = false;\n const request = { decision, expectedProposalHash: approval.proposalHash, ...(reason ? { reason } : {}) };\n\n this.runStream(conversationId, this.api.decideApproval(conversationId, approval.approvalId, request), {\n next: event => {\n if (!accepted && event.type !== 'error') {\n accepted = true;\n this.patchSession(conversationId, current => ({\n ...current,\n conversation: applyNhAssistantApprovalDecision(current.conversation, approval.approvalId, decision)\n }));\n }\n if (event.type === 'error') {\n failed = true;\n if (!accepted) {\n this.patchSession(conversationId, current => ({ ...current, error: event.data }));\n return;\n }\n }\n\n this.applyEvent(conversationId, event);\n },\n complete: () => {\n this.patchSession(conversationId, current => ({ ...current, deciding: false }));\n this.afterTurn(conversationId, failed);\n }\n });\n }\n\n /**\n * Decides a proposal of an agent's run with `POST approvals/{id}/decisions`. An approved deferred\n * proposal executes later as a background operation; an inline one wakes the waiting run. The\n * reloaded snapshot shows the outcome and the proposals that remain open.\n */\n private async decideProposal(\n conversationId: string,\n approval: ApprovalPart,\n decision: ApprovalDecision,\n reason?: string\n ): Promise<void> {\n const revision = this.accountRevision;\n this.patchSession(conversationId, session => ({ ...session, deciding: true, error: null, notice: null }));\n try {\n const proposal = await firstValueFrom(this.agentRuns.decide(approval, decision, reason));\n if (revision === this.accountRevision) {\n if (decision === 'reject' && proposal.status === 'rejected' && proposal.canGiveFeedback === true) {\n this.feedbackApprovalsState.update(approvals => new Set(approvals).add(approval.approvalId));\n }\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: applyProposalDecision(session.conversation, approval.approvalId, proposal.status)\n }));\n }\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(conversationId, error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.patchSession(conversationId, session => ({ ...session, deciding: false }));\n await this.reloadSession(conversationId);\n }\n }\n }\n\n /** Asks the server to stop the running turn or to abandon a waiting approval of the open conversation. */\n async cancel(): Promise<void> {\n const conversationId = this.activeIdState();\n if (conversationId) {\n this.pauseQueue();\n await this.cancelConversation(conversationId);\n }\n }\n\n private async cancelConversation(conversationId: string): Promise<void> {\n const session = this.sessionsState().get(conversationId);\n const conversation = session?.conversation;\n if (!session || !conversation || (conversation.status === 'idle' && !session.streaming)) {\n return;\n }\n\n const revision = this.accountRevision;\n try {\n await firstValueFrom(this.api.cancel(conversationId), { defaultValue: undefined });\n } catch (error) {\n if (revision === this.accountRevision) {\n this.setError(conversationId, error);\n }\n return;\n }\n\n if (revision !== this.accountRevision) {\n return;\n }\n\n if (!this.sessionsState().get(conversationId)?.streaming) {\n await this.reloadSession(conversationId);\n return;\n }\n\n // The server ends the stream with turn.completed(cancelled); stop waiting if it does not.\n clearTimeout(this.cancelTimers.get(conversationId));\n this.cancelTimers.set(conversationId, setTimeout(() => {\n this.cancelTimers.delete(conversationId);\n if (this.sessionsState().get(conversationId)?.streaming) {\n this.streams.get(conversationId)?.unsubscribe();\n this.streams.delete(conversationId);\n this.patchSession(conversationId, current => ({ ...current, streaming: false, deciding: false }));\n void this.reloadSession(conversationId);\n }\n }, cancelGracePeriodMs));\n }\n\n /** Joins a shared conversation with an invitation link and opens it. Resolves `false` on failure. */\n async joinConversation(conversationId: string, token: string): Promise<boolean> {\n await this.initialize();\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.joinConversation(conversationId, token));\n if (revision !== this.accountRevision) {\n return false;\n }\n this.upsertSession(conversation);\n this.setActive(conversation.id, conversation.agentId);\n void this.refreshConversations();\n return true;\n } catch (error) {\n if (revision === this.accountRevision) {\n this.startNewConversation();\n this.setError(null, error);\n }\n return false;\n }\n }\n\n /** Owner only: creates a new invitation link for the open conversation and returns its token. */\n async createShareLink(): Promise<string | null> {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return null;\n }\n try {\n const link = await firstValueFrom(this.api.createShareLink(conversationId));\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: { ...session.conversation, shareToken: link.token }\n }));\n return link.token;\n } catch (error) {\n this.setError(conversationId, error);\n return null;\n }\n }\n\n /** Owner only: the invitation link of the open conversation stops working. */\n async revokeShareLink(): Promise<boolean> {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return false;\n }\n try {\n await firstValueFrom(this.api.revokeShareLink(conversationId), { defaultValue: undefined });\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: { ...session.conversation, shareToken: null }\n }));\n return true;\n } catch (error) {\n this.setError(conversationId, error);\n return false;\n }\n }\n\n /** Owner only: searches the application's directory for people to invite to the open conversation. */\n async searchParticipantCandidates(query: string): Promise<DirectoryEntry[]> {\n const conversationId = this.activeIdState();\n if (!conversationId || query.trim().length < 2) {\n return [];\n }\n try {\n return await firstValueFrom(this.api.searchParticipantCandidates(conversationId, query.trim()));\n } catch (error) {\n this.setError(conversationId, error);\n return [];\n }\n }\n\n /** Owner only: invites a person from the directory to the open conversation. */\n async inviteParticipant(actorId: string): Promise<boolean> {\n const conversationId = this.activeIdState();\n if (!conversationId) {\n return false;\n }\n try {\n await firstValueFrom(this.api.inviteParticipant(conversationId, actorId), { defaultValue: undefined });\n await this.reloadSession(conversationId);\n return true;\n } catch (error) {\n this.setError(conversationId, error);\n return false;\n }\n }\n\n /**\n * The owner removes a participant of the open conversation; with the current user's own id a\n * participant leaves it.\n */\n async removeParticipant(actorId: string): Promise<boolean> {\n const conversation = this.activeConversation();\n if (!conversation) {\n return false;\n }\n try {\n await firstValueFrom(this.api.removeParticipant(conversation.id, actorId), { defaultValue: undefined });\n if (actorId === conversation.currentActorId) {\n this.forget(conversation.id);\n } else {\n await this.reloadSession(conversation.id);\n }\n return true;\n } catch (error) {\n this.setError(conversation.id, error);\n return false;\n }\n }\n\n clearError(): void {\n const activeId = this.activeIdState();\n if (activeId === null) {\n this.draftErrorState.set(null);\n return;\n }\n this.patchSession(activeId, session => ({ ...session, error: null }));\n }\n\n clearNotice(): void {\n const activeId = this.activeIdState();\n if (activeId !== null) {\n this.patchSession(activeId, session => ({ ...session, notice: null }));\n }\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 private async loadConversation(conversationId: string, restoring: boolean): Promise<void> {\n if (this.sessionsState().has(conversationId)) {\n const session = this.sessionsState().get(conversationId)!;\n this.setActive(conversationId, session.conversation.agentId);\n return;\n }\n if (this.activeIdState() === conversationId) {\n return;\n }\n\n const revision = this.accountRevision;\n this.conversationLoadingState.set(true);\n this.draftErrorState.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.upsertSession(conversation);\n this.setActive(conversationId, 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(null, error);\n }\n } finally {\n if (revision === this.accountRevision) {\n this.conversationLoadingState.set(false);\n }\n }\n }\n\n private setActive(conversationId: string | null, agentId?: string): void {\n this.activeIdState.set(conversationId);\n if (agentId) {\n this.selectedAgentIdState.set(agentId);\n }\n this.uiState.update(agentId ? { conversationId, agentId } : { conversationId });\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 /** Connects live updates and notifications once per account and server configuration. */\n private startCollaboration(status: AssistantStatus): void {\n const collaboration = status.collaboration ?? null;\n const key = `${this.accountRevision}|${collaboration?.hubPath ?? ''}|${collaboration?.push === true}`;\n if (key === this.collaborationKey) {\n return;\n }\n const accountChanged = this.collaborationKey?.split('|')[0] !== String(this.accountRevision);\n this.collaborationKey = key;\n void this.live.connect(collaboration?.hubPath ?? null, accountChanged);\n void this.push.activate(collaboration?.push === true);\n }\n\n /** Forgets everything about the previous account: turns, conversations, live updates and push. */\n private resetAccount(): void {\n this.accountRevision++;\n this.collaborationKey = null;\n this.stopAllTurns();\n this.sessionsState.set(new Map());\n this.activeIdState.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.draftErrorState.set(null);\n this.sendingState.set(null);\n this.queuedState.set([]);\n this.pausedQueuesState.set(new Set());\n this.queueDispatchState.set(null);\n this.steeringState.set(null);\n this.submittingState.set(false);\n this.feedbackApprovalsState.set(new Set());\n this.clearAgentWorkTimers();\n void this.live.stop();\n void this.push.deactivate().catch(() => undefined);\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.upsertSession(conversation);\n this.setActive(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(null, error);\n }\n return null;\n }\n }\n\n private runStream(\n conversationId: string,\n stream: Observable<NhAssistantSseEvent>,\n handlers: { next: (event: NhAssistantSseEvent) => void; complete: () => void }\n ): void {\n this.streams.get(conversationId)?.unsubscribe();\n this.patchSession(conversationId, session => ({ ...session, streaming: true }));\n\n const finish = () => {\n clearTimeout(this.cancelTimers.get(conversationId));\n this.cancelTimers.delete(conversationId);\n this.streams.delete(conversationId);\n this.patchSession(conversationId, session => ({ ...session, streaming: false }));\n handlers.complete();\n };\n\n const subscription = stream.subscribe({\n next: event => handlers.next(event),\n error: () => {\n this.patchSession(conversationId, session => ({ ...session, error: clientError(NhAssistantClientErrorCodes.network) }));\n finish();\n },\n complete: finish\n });\n if (!subscription.closed) {\n this.streams.set(conversationId, subscription);\n }\n }\n\n private stopAllTurns(): void {\n for (const subscription of this.streams.values()) {\n subscription.unsubscribe();\n }\n this.streams.clear();\n for (const resolve of this.pendingSendResolves.values()) {\n resolve(false);\n }\n this.pendingSendResolves.clear();\n for (const timer of this.cancelTimers.values()) {\n clearTimeout(timer);\n }\n this.cancelTimers.clear();\n }\n\n private applyEvent(conversationId: string, event: NhAssistantSseEvent, clientMessageId?: string): void {\n this.patchSession(conversationId, session => {\n const conversation = applyNhAssistantEvent(session.conversation, event, clientMessageId);\n let { error, notice, lastUsage } = session;\n if (event.type === 'error') {\n error = event.data;\n }\n if (event.type === 'turn.completed') {\n lastUsage = event.data.usage;\n if (event.data.status === 'failed') {\n error = clientError(event.data.errorCode ?? NhAssistantClientErrorCodes.server);\n } else if (event.data.status === 'completed') {\n notice = completionNotice(conversation, event.data.errorCode);\n }\n }\n return { ...session, conversation, error, notice, lastUsage };\n });\n }\n\n private afterTurn(conversationId: string, reload: boolean): void {\n const session = this.sessionsState().get(conversationId);\n if (session) {\n const status = session.conversation.status;\n this.patchSummary(conversationId, summary => ({\n ...summary,\n status,\n updatedAt: new Date().toISOString(),\n activeActorId: status === 'waiting-for-approval' ? summary.activeActorId ?? session.conversation.currentActorId ?? null : null\n }));\n }\n\n if (reload) {\n void this.reloadSession(conversationId);\n }\n // The list carries the exact title, latest message and read position of the finished turn.\n void this.refreshConversations();\n }\n\n private async reloadSession(conversationId: string): Promise<void> {\n const revision = this.accountRevision;\n try {\n const conversation = await firstValueFrom(this.api.getConversation(conversationId));\n const session = this.sessionsState().get(conversationId);\n if (revision === this.accountRevision && session && !session.streaming) {\n this.upsertSession(conversation);\n }\n } catch (error) {\n if (error instanceof NhAssistantApiError && (error.status === 403 || error.status === 404)) {\n this.forget(conversationId);\n }\n // Otherwise keep the local state; the error of the turn is already shown.\n }\n }\n\n private markActiveReadWhenSeen(): void {\n const conversationId = this.activeIdState();\n if (!conversationId || !this.viewingState() || !this.pageVisibleState() || this.markingRead.has(conversationId)) {\n return;\n }\n const session = this.sessionsState().get(conversationId);\n const summary = this.conversationsState().find(item => item.id === conversationId);\n if (!session || session.streaming || !summary || !nhAssistantIsUnread(summary)) {\n return;\n }\n\n this.markingRead.add(conversationId);\n const revision = this.accountRevision;\n let request: Observable<void>;\n try {\n request = this.api.markRead(conversationId);\n } catch {\n this.markingRead.delete(conversationId);\n return;\n }\n firstValueFrom(request, { defaultValue: undefined })\n .then(() => {\n if (revision === this.accountRevision) {\n this.patchSummary(conversationId, item => ({ ...item, lastReadSequence: item.lastMessageSequence ?? item.lastReadSequence }));\n }\n })\n .catch(() => undefined)\n .finally(() => this.markingRead.delete(conversationId));\n }\n\n private onLiveChanged(change: LiveConversationChanged): void {\n const known = this.conversationsState().some(item => item.id === change.conversationId);\n if (!known) {\n this.scheduleRefresh();\n } else {\n this.patchSummary(change.conversationId, summary => ({\n ...summary,\n status: change.status,\n title: change.title,\n updatedAt: change.updatedAt,\n activeActorId: change.activeActorId,\n lastMessageSequence: Math.max(summary.lastMessageSequence ?? 0, change.lastMessageSequence),\n participantCount: change.participantCount\n }));\n }\n\n const session = this.sessionsState().get(change.conversationId);\n if (!session || session.streaming) {\n return;\n }\n const wasRunning = session.conversation.status === 'running';\n this.patchSession(change.conversationId, current => ({\n ...current,\n conversation: applyNhAssistantConversationChange(current.conversation, change)\n }));\n if (wasRunning && change.status !== 'running') {\n // Another session ended its turn; the snapshot holds the exact answer and approvals.\n void this.reloadSession(change.conversationId);\n } else if (session.conversation.participantCount !== change.participantCount) {\n void this.reloadSession(change.conversationId);\n }\n }\n\n private onLiveRead(read: LiveConversationRead): void {\n this.patchSummary(read.conversationId, summary => ({\n ...summary,\n lastReadSequence: Math.max(summary.lastReadSequence ?? 0, read.lastReadSequence)\n }));\n }\n\n private onLiveRemoved(removed: LiveConversationRemoved): void {\n const wasActive = this.activeIdState() === removed.conversationId;\n this.forget(removed.conversationId);\n if (wasActive) {\n this.draftErrorState.set(clientError(NhAssistantClientErrorCodes.conversationRemoved));\n }\n }\n\n private onLiveEvent(event: LiveConversationEvent): void {\n const session = this.sessionsState().get(event.conversationId);\n if (event.type === 'turn.started') {\n this.patchSummary(event.conversationId, summary => ({ ...summary, status: 'running', activeActorId: event.actorId }));\n }\n if (!session || session.streaming) {\n // This tab streams the turn itself, or does not show the conversation.\n return;\n }\n this.patchSession(event.conversationId, current => ({\n ...current,\n conversation: applyNhAssistantLiveEvent(current.conversation, event)\n }));\n }\n\n /**\n * A run or proposal of an agent thread changed, for example a colleague decided a proposal in the\n * inbox: reload the thread when this tab has it open, so its approval cards show the decision.\n * A burst of updates reloads once. Feedback does not change the thread.\n */\n private onLiveAgentWork(change: LiveAgentWorkChanged): void {\n const conversationId = change.conversationId;\n const session = this.sessionsState().get(conversationId);\n if (change.reason === 'feedback' || !session || session.streaming) {\n return;\n }\n\n clearTimeout(this.agentWorkTimers.get(conversationId));\n this.agentWorkTimers.set(conversationId, setTimeout(() => {\n this.agentWorkTimers.delete(conversationId);\n const current = this.sessionsState().get(conversationId);\n // A decision of this tab reloads the thread itself when it ends.\n if (current && !current.streaming && !current.deciding) {\n void this.reloadSession(conversationId);\n }\n }, refreshDelayMs));\n }\n\n private clearAgentWorkTimers(): void {\n for (const timer of this.agentWorkTimers.values()) {\n clearTimeout(timer);\n }\n this.agentWorkTimers.clear();\n }\n\n /** After a reconnect: updates sent while disconnected are lost, so reload what is shown. */\n private resync(): void {\n if (!this.enabled()) {\n return;\n }\n void this.refreshConversations();\n for (const [conversationId, session] of this.sessionsState()) {\n if (!session.streaming) {\n void this.reloadSession(conversationId);\n }\n }\n }\n\n private scheduleRefresh(): void {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = setTimeout(() => void this.refreshConversations(), refreshDelayMs);\n }\n\n /** Stores a snapshot, keeping at most `maxSessions` idle conversations in memory. */\n private upsertSession(conversation: Conversation): void {\n this.sessionsState.update(sessions => {\n const next = new Map(sessions);\n const existing = next.get(conversation.id);\n next.set(conversation.id, existing\n ? { ...existing, conversation }\n : { conversation, streaming: false, deciding: false, error: null, notice: null, lastUsage: null });\n if (next.size > maxSessions) {\n const activeId = this.activeIdState();\n for (const [id, session] of next) {\n if (next.size <= maxSessions) {\n break;\n }\n if (id !== activeId && id !== conversation.id && !session.streaming\n && !this.queuedState().some(item => item.conversationId === id)) {\n next.delete(id);\n }\n }\n }\n return next;\n });\n this.patchSummary(conversation.id, summary => ({\n ...summary,\n title: conversation.title,\n status: conversation.status,\n updatedAt: conversation.updatedAt,\n ...(conversation.lastMessageSequence === undefined ? {} : { lastMessageSequence: conversation.lastMessageSequence }),\n ...(conversation.lastReadSequence === undefined ? {} : { lastReadSequence: conversation.lastReadSequence }),\n ...(conversation.activeActorId === undefined ? {} : { activeActorId: conversation.activeActorId }),\n ...(conversation.members === undefined ? {} : { participantCount: Math.max(0, conversation.members.length - 1) })\n }));\n }\n\n private patchSession(conversationId: string, update: (session: NhAssistantSession) => NhAssistantSession): void {\n const session = this.sessionsState().get(conversationId);\n if (!session) {\n return;\n }\n this.sessionsState.update(sessions => new Map(sessions).set(conversationId, update(session)));\n }\n\n private patchSummary(\n conversationId: string,\n update: Partial<ConversationSummary> | ((summary: ConversationSummary) => ConversationSummary)\n ): void {\n this.conversationsState.update(items => items.map(item => {\n if (item.id !== conversationId) {\n return item;\n }\n return typeof update === 'function' ? update(item) : { ...item, ...update };\n }));\n }\n\n /**\n * Keeps local knowledge when the list is reloaded: the status of turns this tab streams, and a\n * read position the server already confirmed, which a list response sent earlier may not show.\n */\n private withLocalState(summary: ConversationSummary): ConversationSummary {\n const session = this.sessionsState().get(summary.id);\n const known = this.conversationsState().find(item => item.id === summary.id)?.lastReadSequence;\n const lastReadSequence = known !== undefined && summary.lastReadSequence !== undefined\n ? Math.max(known, summary.lastReadSequence)\n : summary.lastReadSequence;\n return {\n ...summary,\n lastReadSequence,\n status: session?.streaming ? session.conversation.status : summary.status\n };\n }\n\n /** Removes a deleted, left or inaccessible conversation everywhere. */\n private forget(conversationId: string): void {\n this.queuedState.update(items => items.filter(item => item.conversationId !== conversationId));\n this.pausedQueuesState.update(paused => new Set([...paused].filter(id => id !== conversationId)));\n this.streams.get(conversationId)?.unsubscribe();\n this.streams.delete(conversationId);\n this.sessionsState.update(sessions => {\n const next = new Map(sessions);\n next.delete(conversationId);\n return next;\n });\n const before = this.conversationsState().length;\n this.conversationsState.update(items => items.filter(item => item.id !== conversationId));\n if (this.conversationsState().length < before) {\n this.conversationsTotalState.update(total => Math.max(0, total - 1));\n }\n if (this.activeIdState() === conversationId) {\n this.activeIdState.set(null);\n this.uiState.update({ conversationId: null });\n }\n }\n\n private removeMessage(conversationId: string, messageId: string, status: Conversation['status']): void {\n this.patchSession(conversationId, session => ({\n ...session,\n conversation: {\n ...session.conversation,\n status,\n messages: session.conversation.messages.filter(message => message.id !== messageId)\n }\n }));\n this.patchSummary(conversationId, { status });\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 /** Shows an error on a conversation, or on the new-conversation view for `null`. */\n private setError(conversationId: string | null, error: unknown): void {\n const value = error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : clientError(NhAssistantClientErrorCodes.server);\n if (conversationId === null || !this.sessionsState().has(conversationId)) {\n this.draftErrorState.set(value);\n return;\n }\n this.patchSession(conversationId, session => ({ ...session, error: value }));\n }\n}\n\nfunction clientError(code: string): NhAssistantError {\n return { code, messageKey: nhAssistantErrorMessageKey(code) };\n}\n\n/** A completed turn with a server code, or without any answer text, explains itself with a notice. */\nfunction completionNotice(conversation: Conversation, errorCode: string | null): NhAssistantNotice | null {\n if (errorCode) {\n return clientError(errorCode);\n }\n if (!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/** The approvals of a conversation that still wait for a decision, each once. */\n/** Every approval of the conversation once, by approval id; later parts win. */\nfunction approvalParts(conversation: Conversation): ApprovalPart[] {\n const approvals = new Map<string, ApprovalPart>();\n for (const message of conversation.messages) {\n for (const part of message.parts) {\n if (part.type === 'approval') {\n approvals.set(part.approvalId, part);\n }\n }\n }\n return [...approvals.values()];\n}\n\nfunction pendingApprovalParts(conversation: Conversation): ApprovalPart[] {\n const approvals = new Map<string, ApprovalPart>();\n for (const message of conversation.messages) {\n for (const part of message.parts) {\n if (part.type === 'approval' && part.status === 'pending') {\n approvals.set(part.approvalId, part);\n }\n }\n }\n if (conversation.pendingApproval?.status === 'pending') {\n approvals.set(conversation.pendingApproval.approvalId, conversation.pendingApproval);\n }\n return [...approvals.values()];\n}\n\n/**\n * Shows the decision of an agent's proposal until the reloaded snapshot arrives: the approval's new\n * status, no open decision for it and, for the approval the conversation waited for, no pending one.\n */\nfunction applyProposalDecision(conversation: Conversation, approvalId: string, status: ApprovalStatus): Conversation {\n const messages = conversation.messages.map(message => ({\n ...message,\n parts: message.parts.map(part => part.type === 'approval' && part.approvalId === approvalId ? { ...part, status } : part)\n }));\n const thread = conversation.thread\n ? { ...conversation.thread, decisions: conversation.thread.decisions.filter(item => item.approvalId !== approvalId) }\n : conversation.thread;\n const pendingApproval = conversation.pendingApproval?.approvalId === approvalId ? null : conversation.pendingApproval;\n return { ...conversation, messages, thread, pendingApproval };\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 role: conversation.role,\n participantCount: conversation.members ? Math.max(0, conversation.members.length - 1) : conversation.participantCount,\n lastMessageSequence: conversation.lastMessageSequence,\n lastReadSequence: conversation.lastReadSequence,\n activeActorId: conversation.activeActorId\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, firstValueFrom } from 'rxjs';\nimport { AgentThreadLookup } from '../models/assistant-agent-run.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantAgentRunApiService } from './nh-assistant-agent-run-api.service';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from './nh-assistant-transport';\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 agentRuns = inject(NhAssistantAgentRunApiService);\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 /**\n * Opens the panel on the conversation with an agent about a subject, for example the intake\n * reviewer about one project. The server returns the agent's thread about the subject and creates\n * it without starting a run when it is missing; people then type in the conversation, which runs\n * a turn. Creating needs the participant role, readers may open an existing thread.\n *\n * Resolves with the lookup once the panel opens the conversation. A failure, such as\n * `assistant-subject-access-denied`, rejects with `NhAssistantApiError` and leaves the panel as\n * it is, so the caller shows the localized `messageKey` where the person asked.\n */\n async openSubject(agentId: string, subject: { type: string; id: string }): Promise<AgentThreadLookup> {\n const lookup = await firstValueFrom(this.agentRuns.openThread(agentId, subject.type, subject.id));\n const conversationId = lookup.thread?.conversationId;\n if (!conversationId) {\n const code = NhAssistantClientErrorCodes.invalidResponse;\n throw new NhAssistantApiError(200, code, nhAssistantErrorMessageKey(code));\n }\n\n this.open(conversationId);\n return lookup;\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 { DestroyRef, inject } from '@angular/core';\nimport { debounceTime, filter, merge } from 'rxjs';\nimport { LiveAgentWorkChanged } from '../models/assistant-live.models';\nimport { NhAssistantLiveService } from '../services/nh-assistant-live.service';\n\n/** How long a view waits for more agent-work updates before it reloads once. */\nexport const NH_ASSISTANT_AGENT_WORK_RELOAD_DELAY_MS = 300;\n\n/**\n * Calls `reload` once a burst of live agent-work updates that `matches` has settled, and after\n * every (re)connect of the hub, because updates sent while it was disconnected are lost. Without a\n * live service or a connected hub nothing arrives and the view keeps its manual refresh. Call it in\n * an injection context, for example a component constructor; it stops when that context ends.\n */\nexport function nhAssistantReloadOnAgentWork(\n matches: (change: LiveAgentWorkChanged) => boolean,\n reload: () => void\n): void {\n const live = inject(NhAssistantLiveService, { optional: true });\n if (!live) {\n return;\n }\n\n const subscription = merge(live.agentWork$.pipe(filter(matches)), live.resync$)\n .pipe(debounceTime(NH_ASSISTANT_AGENT_WORK_RELOAD_DELAY_MS))\n .subscribe(() => reload());\n inject(DestroyRef).onDestroy(() => subscription.unsubscribe());\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, Injectable, PLATFORM_ID, effect, inject, untracked } from '@angular/core';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { AgentSubjectSummary, NH_ASSISTANT_MAX_SUBJECT_SUMMARY } from '../models/assistant-agent-run.models';\nimport { LiveAgentWorkChanged } from '../models/assistant-live.models';\nimport { NH_ASSISTANT_AGENT_WORK_RELOAD_DELAY_MS } from '../internal/nh-assistant-agent-work';\nimport { NhAssistantAgentRunApiService } from './nh-assistant-agent-run-api.service';\nimport { NhAssistantLiveService } from './nh-assistant-live.service';\nimport { NhAssistantStore } from './nh-assistant.store';\n\n/** Summaries kept for subjects that nobody shows any more, so a list that re-renders needs no request. */\nconst maxUnwatchedSummaries = 500;\n\ninterface SummaryEntry {\n readonly subjectType: string;\n readonly subjectId: string;\n readonly value: BehaviorSubject<AgentSubjectSummary | null>;\n watchers: number;\n queued: boolean;\n loaded: boolean;\n failed: boolean;\n /** The request whose answer the entry takes; older answers are ignored. */\n request: number;\n}\n\n/**\n * Counts of agent work per subject for badges in lists and on pages. Every summary asked for in the\n * same tick becomes one `POST subjects/{type}/summary` per subject type, in chunks of\n * `NH_ASSISTANT_MAX_SUBJECT_SUMMARY`. Results are cached per subject and shared by everyone who\n * shows it. Live agent-work updates refetch only the subjects they name, batched; a reconnect of\n * the hub refetches every subject shown. Nothing is requested on the server or while the assistant\n * is disabled or denied, and the cache clears when it becomes unavailable, for example on sign-out.\n */\n@Injectable()\nexport class NhAssistantSubjectSummaryService {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly store = inject(NhAssistantStore);\n private readonly live = inject(NhAssistantLiveService, { optional: true });\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly entries = new Map<string, SummaryEntry>();\n /** Subject ids per type that wait for the next request. */\n private readonly queue = new Map<string, Set<string>>();\n /** Subjects named by live updates that wait for the end of the burst. */\n private readonly changed = new Set<string>();\n private requests = new Subscription();\n private readonly liveSubscription = new Subscription();\n private flushScheduled = false;\n private changedTimer?: ReturnType<typeof setTimeout>;\n private requestRevision = 0;\n private destroyed = false;\n\n constructor() {\n effect(() => {\n const enabled = this.store.enabled();\n untracked(() => this.onAvailabilityChanged(enabled));\n });\n\n if (this.live) {\n this.liveSubscription.add(this.live.agentWork$.subscribe(change => this.onAgentWork(change)));\n this.liveSubscription.add(this.live.resync$.subscribe(() => this.refetchShown()));\n }\n\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.liveSubscription.unsubscribe();\n this.requests.unsubscribe();\n clearTimeout(this.changedTimer);\n for (const entry of this.entries.values()) {\n entry.value.complete();\n }\n this.entries.clear();\n this.queue.clear();\n });\n }\n\n /**\n * The agent work on one subject: `null` until it is known, then every update. Subscribing shows\n * the subject; summaries of subjects that are shown stay current with live updates. The request\n * starts in the next microtask, together with every other summary asked for until then.\n */\n summary(subjectType: string, subjectId: string): Observable<AgentSubjectSummary | null> {\n return new Observable<AgentSubjectSummary | null>(subscriber => {\n const entry = this.watch(subjectType, subjectId);\n const subscription = entry.value.subscribe(subscriber);\n\n return () => {\n subscription.unsubscribe();\n this.unwatch(entry);\n };\n });\n }\n\n /**\n * Fetches the summaries of these subjects again, or of every subject of the type that is shown,\n * for example after the application changed them without an agent.\n */\n refresh(subjectType: string, subjectIds?: readonly string[]): void {\n const ids = subjectIds ? new Set(subjectIds) : null;\n for (const entry of [...this.entries.values()]) {\n if (entry.subjectType !== subjectType || (ids && !ids.has(entry.subjectId))) {\n continue;\n }\n\n if (entry.watchers > 0) {\n this.enqueue(entry);\n } else {\n this.forget(entry);\n }\n }\n }\n\n private watch(subjectType: string, subjectId: string): SummaryEntry {\n const key = summaryKey(subjectType, subjectId);\n let entry = this.entries.get(key);\n if (entry) {\n // The most recently shown summaries stay longest.\n this.entries.delete(key);\n } else {\n entry = {\n subjectType,\n subjectId,\n value: new BehaviorSubject<AgentSubjectSummary | null>(null),\n watchers: 0,\n queued: false,\n loaded: false,\n failed: false,\n request: 0\n };\n }\n\n this.entries.set(key, entry);\n entry.watchers++;\n if (!entry.loaded || entry.failed) {\n this.enqueue(entry);\n }\n if (this.browser) {\n void this.store.initialize();\n }\n return entry;\n }\n\n private unwatch(entry: SummaryEntry): void {\n entry.watchers = Math.max(0, entry.watchers - 1);\n if (entry.watchers > 0) {\n return;\n }\n\n let unwatched = 0;\n for (const item of this.entries.values()) {\n if (item.watchers === 0) {\n unwatched++;\n }\n }\n for (const item of [...this.entries.values()]) {\n if (unwatched <= maxUnwatchedSummaries) {\n break;\n }\n if (item.watchers === 0) {\n this.forget(item);\n unwatched--;\n }\n }\n }\n\n private isCurrent(entry: SummaryEntry): boolean {\n return this.entries.get(summaryKey(entry.subjectType, entry.subjectId)) === entry;\n }\n\n /** Drops a summary nobody shows; the next subscriber fetches it again. */\n private forget(entry: SummaryEntry): void {\n if (this.isCurrent(entry)) {\n this.entries.delete(summaryKey(entry.subjectType, entry.subjectId));\n }\n this.queue.get(entry.subjectType)?.delete(entry.subjectId);\n entry.value.complete();\n }\n\n private enqueue(entry: SummaryEntry): void {\n if (entry.queued) {\n return;\n }\n\n entry.queued = true;\n let ids = this.queue.get(entry.subjectType);\n if (!ids) {\n ids = new Set<string>();\n this.queue.set(entry.subjectType, ids);\n }\n ids.add(entry.subjectId);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.flushScheduled) {\n return;\n }\n\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.flushScheduled = false;\n this.flush();\n });\n }\n\n /** Sends the queued subjects: one request per type and chunk. Waits while the assistant is unavailable. */\n private flush(): void {\n if (this.destroyed || !this.browser || !this.store.enabled()) {\n return;\n }\n\n for (const [subjectType, ids] of [...this.queue]) {\n this.queue.delete(subjectType);\n const subjectIds = [...ids];\n for (let start = 0; start < subjectIds.length; start += NH_ASSISTANT_MAX_SUBJECT_SUMMARY) {\n this.send(subjectType, subjectIds.slice(start, start + NH_ASSISTANT_MAX_SUBJECT_SUMMARY));\n }\n }\n }\n\n private send(subjectType: string, subjectIds: string[]): void {\n const revision = ++this.requestRevision;\n const entries: SummaryEntry[] = [];\n for (const subjectId of subjectIds) {\n const entry = this.entries.get(summaryKey(subjectType, subjectId));\n if (entry) {\n entry.queued = false;\n entry.request = revision;\n entries.push(entry);\n }\n }\n if (entries.length === 0) {\n return;\n }\n\n const subscription = this.api.summarizeSubjects(subjectType, entries.map(entry => entry.subjectId)).subscribe({\n next: list => {\n const items = new Map(list.items.map(item => [item.subjectId, item]));\n for (const entry of entries) {\n if (entry.request !== revision || !this.isCurrent(entry)) {\n continue;\n }\n\n entry.loaded = true;\n entry.failed = false;\n entry.value.next(items.get(entry.subjectId) ?? emptySummary(entry.subjectId));\n }\n },\n error: () => {\n // A badge without a count is better than an error in a list; the next live update,\n // reconnect or subscriber tries again.\n for (const entry of entries) {\n if (entry.request === revision) {\n entry.failed = true;\n }\n }\n }\n });\n this.requests.add(subscription);\n }\n\n private onAgentWork(change: LiveAgentWorkChanged): void {\n if (!change.subjectType || !change.subjectId) {\n return;\n }\n\n const key = summaryKey(change.subjectType, change.subjectId);\n const entry = this.entries.get(key);\n if (!entry) {\n return;\n }\n if (entry.watchers === 0) {\n this.forget(entry);\n return;\n }\n\n this.changed.add(key);\n if (this.changedTimer === undefined) {\n this.changedTimer = setTimeout(() => this.refetchChanged(), NH_ASSISTANT_AGENT_WORK_RELOAD_DELAY_MS);\n }\n }\n\n /** Refetches the shown subjects of a burst of live updates, together. */\n private refetchChanged(): void {\n this.changedTimer = undefined;\n const keys = [...this.changed];\n this.changed.clear();\n for (const key of keys) {\n const entry = this.entries.get(key);\n if (entry && entry.watchers > 0) {\n this.enqueue(entry);\n }\n }\n }\n\n /** After a reconnect updates may have been missed: refetch what is shown, forget the rest. */\n private refetchShown(): void {\n for (const entry of [...this.entries.values()]) {\n if (entry.watchers > 0) {\n this.enqueue(entry);\n } else {\n this.forget(entry);\n }\n }\n }\n\n private onAvailabilityChanged(enabled: boolean): void {\n if (enabled) {\n for (const entry of this.entries.values()) {\n if (entry.watchers > 0 && (!entry.loaded || entry.failed)) {\n this.enqueue(entry);\n }\n }\n this.scheduleFlush();\n return;\n }\n\n // Signed out, denied or disabled: no counts of a previous account may remain.\n this.requests.unsubscribe();\n this.requests = new Subscription();\n clearTimeout(this.changedTimer);\n this.changedTimer = undefined;\n this.changed.clear();\n this.queue.clear();\n for (const entry of [...this.entries.values()]) {\n if (entry.watchers === 0) {\n this.forget(entry);\n continue;\n }\n\n entry.queued = false;\n entry.loaded = false;\n entry.failed = false;\n entry.request = 0;\n if (entry.value.value !== null) {\n entry.value.next(null);\n }\n }\n }\n}\n\nfunction summaryKey(subjectType: string, subjectId: string): string {\n return `${subjectType}\\u0000${subjectId}`;\n}\n\nfunction emptySummary(subjectId: string): AgentSubjectSummary {\n return { subjectId, openProposals: 0, proposalsToDecide: 0, runActive: false };\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 { NhAssistantAgentRunApiService } from './services/nh-assistant-agent-run-api.service';\nimport { NhAssistantApiService } from './services/nh-assistant-api.service';\nimport { NhAssistantLiveService } from './services/nh-assistant-live.service';\nimport { NhAssistantPushService } from './services/nh-assistant-push.service';\nimport { NhAssistantPanelService } from './services/nh-assistant-panel.service';\nimport { NhAssistantStore } from './services/nh-assistant.store';\nimport { NhAssistantSubjectSummaryService } from './services/nh-assistant-subject-summary.service';\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 NhAssistantAgentRunApiService,\n NhAssistantLiveService,\n NhAssistantPushService,\n NhAssistantStore,\n NhAssistantUiState,\n NhAssistantPanelService,\n NhAssistantSubjectSummaryService,\n ...(config.translations === 'host'\n ? []\n : [provideEnvironmentInitializer(() => inject(NhAssistantTranslationMerger).start())])\n ]);\n}\n","/** Fragment the panel reads to join a shared conversation: `#nh-assistant-join=<id>.<token>`. */\nexport const NH_ASSISTANT_JOIN_FRAGMENT = 'nh-assistant-join';\n\n/** Fragment a clicked notification opens: `#nh-assistant-conversation=<id>`. */\nexport const NH_ASSISTANT_CONVERSATION_FRAGMENT = 'nh-assistant-conversation';\n\n/** Builds the default invitation link: the current page with the join fragment. */\nexport function nhAssistantShareLink(conversationId: string, token: string): string {\n const location = globalThis.location;\n const page = location ? `${location.origin}${location.pathname}${location.search}` : '';\n return `${page}#${NH_ASSISTANT_JOIN_FRAGMENT}=${encodeURIComponent(conversationId)}.${encodeURIComponent(token)}`;\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 | 'users'\n | 'copy'\n | 'bell'\n | 'leave';\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 users: 'M9 11a3.5 3.5 0 1 0 0-7 3.5 3.5 0 1 0 0 7zM3 20c0-3.3 2.7-6 6-6s6 2.7 6 6M16 4.5a3.5 3.5 0 0 1 0 6.5M18 14.5c1.8.9 3 2.8 3 5',\n copy: 'M9 9h11v11H9zM5 15H4V4h11v1',\n bell: 'M6 16V11a6 6 0 0 1 12 0v5l2 2H4zM10 20a2 2 0 0 0 4 0',\n leave: 'M10 4H5v16h5M14 8l4 4-4 4M18 12H9'\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. One small badge shows what needs\n * attention, in this order: an approval that waits, the number of unread conversations, or a\n * turn that runs. 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 @switch (badge()) {\n @case ('waiting') {\n <span class=\"badge\" data-state=\"waiting\" aria-hidden=\"true\"></span>\n }\n @case ('unread') {\n <span class=\"badge count\" data-state=\"unread\" aria-hidden=\"true\">{{ unreadLabel() }}</span>\n }\n @case ('running') {\n <span class=\"badge\" data-state=\"running\" aria-hidden=\"true\"></span>\n }\n }\n @if (waitingForApproval()) {\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.pending-approval' | translate }}</span>\n }\n @if (store.unreadCount() > 0) {\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.unread' | translate: { count: store.unreadCount() } }}</span>\n }\n @if (store.runningCount() > 0) {\n <span class=\"visually-hidden\">{{ 'nh-assistant.launcher.running' | translate: { count: store.runningCount() } }}</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 badge = computed<'waiting' | 'unread' | 'running' | null>(() => {\n if (this.waitingForApproval()) {\n return 'waiting';\n }\n if (this.store.unreadCount() > 0) {\n return 'unread';\n }\n return this.store.runningCount() > 0 || this.store.streaming() ? 'running' : null;\n });\n readonly unreadLabel = computed(() => this.store.unreadCount() > 9 ? '9+' : String(this.store.unreadCount()));\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 { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantActivity } from '../../services/nh-assistant.store';\n\n/**\n * One slim row of the other conversations that need attention: a running turn, an approval that\n * waits, or an unread answer. It renders nothing when there are none, so it costs no space in the\n * usual case. Selecting a chip opens that conversation; its turn keeps running meanwhile.\n */\n@Component({\n selector: 'nh-assistant-activity',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (others().length > 0) {\n <nav class=\"strip\" [attr.aria-label]=\"'nh-assistant.activity.label' | translate\">\n @for (item of others(); track item.id) {\n <button\n class=\"chip\"\n type=\"button\"\n [attr.data-state]=\"state(item)\"\n [attr.title]=\"(item.title || ('nh-assistant.conversation-list.untitled' | translate)) + ' — ' + ('nh-assistant.activity.' + state(item) | translate)\"\n (click)=\"conversationSelect.emit(item.id)\">\n <span class=\"indicator\" aria-hidden=\"true\"></span>\n <span class=\"title\">{{ item.title || ('nh-assistant.conversation-list.untitled' | translate) }}</span>\n @if (item.shared) {\n <nh-assistant-icon class=\"shared\" name=\"users\" />\n }\n <span class=\"visually-hidden\">{{ 'nh-assistant.activity.' + state(item) | translate }}</span>\n </button>\n }\n </nav>\n }\n `,\n styleUrl: './nh-assistant-activity.component.scss'\n})\nexport class NhAssistantActivityComponent {\n readonly items = input.required<readonly NhAssistantActivity[]>();\n readonly conversationSelect = output<string>();\n\n /** The open conversation already shows its own state. */\n readonly others = computed(() => this.items().filter(item => !item.active));\n\n state(item: NhAssistantActivity): 'running' | 'waiting' | 'unread' {\n if (item.status === 'running') {\n return 'running';\n }\n return item.status === 'waiting-for-approval' ? 'waiting' : 'unread';\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 host: { '[class.compact]': 'compact()' },\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.aria-describedby]=\"selected() ? selectId + '-capability' : null\"\n [attr.title]=\"selected() ? (([selected()!.descriptionKey] | nhAssistantTranslate: selected()!.descriptionKey) + (compact() ? ' · ' + ((selected()!.canMutate ? 'nh-assistant.agent-picker.can-mutate' : 'nh-assistant.agent-picker.read-only') | translate) : '')) : 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\" [id]=\"selectId + '-capability'\" [class.visually-hidden]=\"compact()\" [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 /** Compact prompt-bar control; capability information remains in the tooltip and accessible description. */\n readonly compact = 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 /** Keeps the send action available next to Stop so the host can queue messages. */\n readonly queueWhileBusy = input(false);\n /** Announces why sending is temporarily unavailable. */\n readonly status = input<'running' | 'waiting-for-approval' | null>(null);\n /** Name of the participant whose turn runs or waits, when it is someone else. */\n readonly statusActor = input<string | null>(null);\n /** False when the user may not stop the running turn, such as another participant's turn. */\n readonly canStop = input(true);\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=\"prompt-bar\">\n <div class=\"prompt-controls\">\n <ng-content select=\"[nhAssistantComposerControls]\" />\n </div>\n <div class=\"actions\">\n @if (busy() && canStop()) {\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 }\n @if (!busy() || !canStop() || queueWhileBusy()) {\n <button\n class=\"send\"\n type=\"submit\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"(busy() && queueWhileBusy() ? 'nh-assistant.queue.add' : 'nh-assistant.composer.send') | translate\"\n [attr.title]=\"(busy() && queueWhileBusy() ? 'nh-assistant.queue.add' : 'nh-assistant.composer.send') | translate\">\n <nh-assistant-icon name=\"send\" />\n </button>\n }\n </div>\n </div>\n</form>\n\n@if (status() === 'waiting-for-approval') {\n <p class=\"composer-status\" role=\"status\" aria-live=\"polite\">\n @if (statusActor(); as name) {\n {{ 'nh-assistant.composer.status.waiting-for-approval-by' | translate: { name } }}\n } @else {\n {{ 'nh-assistant.composer.status.waiting-for-approval' | translate }}\n }\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>{{ (busy() && queueWhileBusy() ? 'nh-assistant.queue.hint' : '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';\nimport { nhAssistantIsUnread } from '../../services/nh-assistant.store';\n\n/**\n * The user's own and shared conversations with loading and empty states; selecting one opens it.\n * Each row marks a running turn, a waiting approval and unread messages. A participant leaves a\n * shared conversation instead of deleting it.\n */\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 /** The owner deletes the conversation; a participant leaves it. */\n readonly conversationDelete = output<string>();\n readonly conversationCreate = output<void>();\n\n unread(conversation: ConversationSummary): boolean {\n return nhAssistantIsUnread(conversation);\n }\n\n indicator(conversation: ConversationSummary): 'running' | 'waiting' | 'unread' | null {\n if (conversation.status === 'running') {\n return 'running';\n }\n if (conversation.status === 'waiting-for-approval') {\n return 'waiting';\n }\n return this.unread(conversation) ? 'unread' : null;\n }\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()\" [class.unread]=\"unread(conversation)\">\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-row\">\n <span class=\"indicator\" [attr.data-state]=\"indicator(conversation)\" aria-hidden=\"true\"></span>\n <span class=\"title\">{{ conversation.title || ('nh-assistant.conversation-list.untitled' | translate) }}</span>\n @if ((conversation.participantCount ?? 0) > 0) {\n <nh-assistant-icon\n class=\"shared\"\n name=\"users\"\n [attr.title]=\"'nh-assistant.conversation-list.shared' | translate: { count: conversation.participantCount }\" />\n }\n </span>\n <span class=\"meta\">\n <span class=\"status\" [attr.data-status]=\"conversation.status\">{{ 'nh-assistant.conversation-list.status.' + conversation.status | translate }}</span>\n @if (unread(conversation)) {\n <span class=\"unread-label\">{{ 'nh-assistant.conversation-list.unread' | translate }}</span>\n }\n @if (conversation.role === 'participant') {\n <span>{{ 'nh-assistant.conversation-list.shared-with-you' | translate }}</span>\n }\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() || conversation.status === 'running'\"\n [attr.aria-label]=\"((conversation.role === 'participant' ? 'nh-assistant.conversation-list.leave' : 'nh-assistant.conversation-list.delete') | translate) + ': ' + (conversation.title || ('nh-assistant.conversation-list.untitled' | translate))\"\n [attr.title]=\"(conversation.role === 'participant' ? 'nh-assistant.conversation-list.leave' : 'nh-assistant.conversation-list.delete') | translate\"\n (click)=\"conversationDelete.emit(conversation.id)\">\n <nh-assistant-icon [name]=\"conversation.role === 'participant' ? 'leave' : '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 { NhAssistantPushService } from '../../services/nh-assistant-push.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: desktop notifications, style, form of address,\n * answer length and optional instructions. Notifications apply immediately; the other\n * preferences steer style only and are saved together, below the application context and\n * 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 readonly push = inject(NhAssistantPushService);\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 /** Turns desktop notifications on or off; turning them on asks the browser for permission. */\n async toggleNotifications(event: Event): Promise<void> {\n const enabled = (event.target as HTMLInputElement).checked;\n this.error.set(null);\n try {\n await this.push.setEnabled(enabled);\n } catch (error) {\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 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 @if (push.state() !== 'unavailable') {\n <fieldset class=\"notifications\">\n <legend>{{ 'nh-assistant.preferences.notifications-label' | translate }}</legend>\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [checked]=\"push.settings()?.pushEnabled === true\"\n [disabled]=\"push.busy()\"\n [attr.aria-describedby]=\"id + '-notifications-hint'\"\n (change)=\"toggleNotifications($event)\" />\n <span>{{ 'nh-assistant.preferences.notifications' | translate }}</span>\n </label>\n <p class=\"hint\" [id]=\"id + '-notifications-hint'\">\n <span>{{ 'nh-assistant.preferences.notifications-state.' + push.state() | translate }}</span>\n </p>\n </fieldset>\n }\n\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 { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ConversationMember, DirectoryEntry } from '../../models/assistant-api.models';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NH_ASSISTANT_CONFIG } from '../../nh-assistant.config';\nimport { NhAssistantStore } from '../../services/nh-assistant.store';\nimport { nhAssistantShareLink } from '../../services/nh-assistant-share-link';\n\nlet nextId = 0;\nconst searchDelayMs = 250;\n\n/**\n * Sharing of the open conversation. The owner creates, copies, renews or stops an invitation\n * link, invites colleagues through the application's directory when it offers one, and removes\n * participants. A participant sees who takes part and can leave.\n */\n@Component({\n selector: 'nh-assistant-share',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-share.component.html',\n styleUrl: './nh-assistant-share.component.scss'\n})\nexport class NhAssistantShareComponent {\n readonly store = inject(NhAssistantStore);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private searchTimer?: ReturnType<typeof setTimeout>;\n private searchRevision = 0;\n\n /** Emitted when the user leaves the view. */\n readonly closed = output<void>();\n /** Show the invitation link, participants, or both (the default for custom hosts). */\n readonly section = input<'all' | 'link' | 'members'>('all');\n\n readonly id = `nh-assistant-share-${nextId++}`;\n readonly conversation = this.store.activeConversation;\n readonly isOwner = this.store.isOwner;\n readonly busy = signal(false);\n readonly copied = signal(false);\n readonly query = signal('');\n readonly searching = signal(false);\n readonly candidates = signal<DirectoryEntry[]>([]);\n readonly invited = signal<string | null>(null);\n\n readonly directory = computed(() => this.store.collaboration()?.directory === true && this.isOwner());\n readonly maxParticipants = computed(() => this.store.collaboration()?.maxParticipants ?? null);\n readonly participants = computed(() => this.store.members().filter(member => member.role === 'participant'));\n readonly link = computed(() => {\n const conversation = this.conversation();\n if (!conversation?.shareToken) {\n return null;\n }\n return (this.config.buildShareLink ?? nhAssistantShareLink)(conversation.id, conversation.shareToken);\n });\n readonly full = computed(() => {\n const max = this.maxParticipants();\n return max !== null && this.participants().length >= max;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => clearTimeout(this.searchTimer));\n }\n\n async createLink(): Promise<void> {\n await this.run(() => this.store.createShareLink());\n this.copied.set(false);\n }\n\n async revokeLink(): Promise<void> {\n await this.run(() => this.store.revokeShareLink());\n this.copied.set(false);\n }\n\n async copy(input: HTMLInputElement): Promise<void> {\n const link = this.link();\n if (!link) {\n return;\n }\n try {\n await navigator.clipboard.writeText(link);\n } catch {\n // Without clipboard access the selected text can be copied by hand.\n input.select();\n }\n this.copied.set(true);\n }\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.query.set(value);\n this.invited.set(null);\n clearTimeout(this.searchTimer);\n const revision = ++this.searchRevision;\n if (value.trim().length < 2) {\n this.candidates.set([]);\n this.searching.set(false);\n return;\n }\n this.searching.set(true);\n this.searchTimer = setTimeout(async () => {\n const results = await this.store.searchParticipantCandidates(value);\n if (revision === this.searchRevision) {\n this.candidates.set(results);\n this.searching.set(false);\n }\n }, searchDelayMs);\n }\n\n async invite(entry: DirectoryEntry): Promise<void> {\n const invited = await this.run(() => this.store.inviteParticipant(entry.actorId));\n if (invited) {\n this.invited.set(entry.displayName);\n this.candidates.update(items => items.filter(item => item.actorId !== entry.actorId));\n }\n }\n\n async remove(member: ConversationMember): Promise<void> {\n await this.run(() => this.store.removeParticipant(member.actorId));\n }\n\n async leave(): Promise<void> {\n const actorId = this.conversation()?.currentActorId;\n if (!actorId) {\n return;\n }\n if (await this.run(() => this.store.removeParticipant(actorId))) {\n this.closed.emit();\n }\n }\n\n isCurrentUser(member: ConversationMember): boolean {\n return member.actorId === this.conversation()?.currentActorId;\n }\n\n private async run<T>(action: () => Promise<T>): Promise<T | undefined> {\n if (this.busy()) {\n return undefined;\n }\n this.busy.set(true);\n try {\n return await action();\n } finally {\n this.busy.set(false);\n }\n }\n}\n","<section class=\"share\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"busy()\">\n <header class=\"header\">\n <h3 [id]=\"id + '-title'\">\n {{ (isOwner() && section() !== 'members' ? 'nh-assistant.share.title' : 'nh-assistant.share.members-title') | translate }}\n </h3>\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.share.back' | translate\"\n [attr.title]=\"'nh-assistant.share.back' | translate\"\n (click)=\"closed.emit()\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </header>\n\n @if (conversation(); as conversation) {\n <div class=\"content\">\n @if (isOwner()) {\n <p class=\"description\">{{ 'nh-assistant.share.description' | translate }}</p>\n\n @if (section() !== 'members' || !directory()) {\n <section class=\"block\" [attr.aria-labelledby]=\"id + '-link'\">\n <h4 [id]=\"id + '-link'\">{{ 'nh-assistant.share.link-title' | translate }}</h4>\n @if (link(); as link) {\n <div class=\"link-row\">\n <label class=\"visually-hidden\" [for]=\"id + '-link-input'\">{{ 'nh-assistant.share.link-label' | translate }}</label>\n <input #linkInput type=\"text\" readonly [id]=\"id + '-link-input'\" [value]=\"link\" (focus)=\"linkInput.select()\" />\n <button\n class=\"icon-button\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.share.copy' | translate\"\n [attr.title]=\"'nh-assistant.share.copy' | translate\"\n (click)=\"copy(linkInput)\">\n <nh-assistant-icon name=\"copy\" />\n </button>\n </div>\n @if (copied()) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />\n {{ 'nh-assistant.share.copied' | translate }}\n </p>\n }\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"revokeLink()\">\n {{ 'nh-assistant.share.revoke' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"createLink()\">\n {{ 'nh-assistant.share.renew' | translate }}\n </button>\n </div>\n <p class=\"hint\">{{ 'nh-assistant.share.link-hint' | translate }}</p>\n } @else {\n <button class=\"primary\" type=\"button\" [disabled]=\"busy() || full()\" (click)=\"createLink()\">\n <nh-assistant-icon name=\"link\" />\n {{ 'nh-assistant.share.create' | translate }}\n </button>\n }\n </section>\n }\n\n @if (directory() && section() !== 'link') {\n <section class=\"block\" [attr.aria-labelledby]=\"id + '-invite'\">\n <h4 [id]=\"id + '-invite'\">{{ 'nh-assistant.share.invite-title' | translate }}</h4>\n <label class=\"visually-hidden\" [for]=\"id + '-search'\">{{ 'nh-assistant.share.search-label' | translate }}</label>\n <input\n type=\"search\"\n autocomplete=\"off\"\n [id]=\"id + '-search'\"\n [value]=\"query()\"\n [disabled]=\"full()\"\n [attr.placeholder]=\"'nh-assistant.share.search-placeholder' | translate\"\n (input)=\"onSearch($event)\" />\n @if (searching()) {\n <p class=\"hint\" role=\"status\">{{ 'nh-assistant.share.searching' | translate }}</p>\n } @else if (query().trim().length >= 2 && candidates().length === 0 && !invited()) {\n <p class=\"hint\">{{ 'nh-assistant.share.no-results' | translate }}</p>\n }\n @if (candidates().length > 0) {\n <ul class=\"people\">\n @for (entry of candidates(); track entry.actorId) {\n <li>\n <span class=\"person\">\n <strong>{{ entry.displayName }}</strong>\n @if (entry.detail) {\n <small>{{ entry.detail }}</small>\n }\n </span>\n <button class=\"secondary small\" type=\"button\" [disabled]=\"busy() || full()\" (click)=\"invite(entry)\">\n {{ 'nh-assistant.share.invite' | translate }}\n </button>\n </li>\n }\n </ul>\n }\n @if (invited(); as name) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />\n {{ 'nh-assistant.share.invited' | translate: { name } }}\n </p>\n }\n </section>\n }\n }\n\n @if (section() !== 'link') {\n <section class=\"block\" [attr.aria-labelledby]=\"id + '-members'\">\n <h4 [id]=\"id + '-members'\">\n {{ 'nh-assistant.share.members' | translate }}\n @if (maxParticipants() !== null && isOwner()) {\n <span class=\"count\">{{ 'nh-assistant.share.count' | translate: { count: participants().length, max: maxParticipants() } }}</span>\n }\n </h4>\n @if (store.members().length === 0) {\n <p class=\"hint\">{{ 'nh-assistant.share.not-shared' | translate }}</p>\n } @else {\n <ul class=\"people\">\n @for (member of store.members(); track member.actorId) {\n <li>\n <span class=\"person\">\n <strong>\n {{ member.displayName || ('nh-assistant.share.unnamed' | translate) }}\n @if (isCurrentUser(member)) {\n <small class=\"you\">{{ 'nh-assistant.share.you' | translate }}</small>\n }\n </strong>\n <small>{{ 'nh-assistant.share.role.' + member.role | translate }}</small>\n </span>\n @if (isOwner() && member.role === 'participant') {\n <button\n class=\"icon-button\"\n type=\"button\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"'nh-assistant.share.remove' | translate: { name: member.displayName || ('nh-assistant.share.unnamed' | translate) }\"\n [attr.title]=\"'nh-assistant.share.remove' | translate: { name: member.displayName || ('nh-assistant.share.unnamed' | translate) }\"\n (click)=\"remove(member)\">\n <nh-assistant-icon name=\"trash\" />\n </button>\n }\n </li>\n }\n </ul>\n }\n </section>\n }\n\n @if (!isOwner()) {\n <div class=\"actions\">\n <button class=\"secondary danger\" type=\"button\" [disabled]=\"busy() || conversation.status === 'running'\" (click)=\"leave()\">\n <nh-assistant-icon name=\"leave\" />\n {{ 'nh-assistant.share.leave' | translate }}\n </button>\n </div>\n }\n </div>\n } @else {\n <p class=\"state\">{{ 'nh-assistant.share.no-conversation' | translate }}</p>\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 { Pipe, PipeTransform } from '@angular/core';\nimport { ApprovalPart, MessagePart, TextPart, ToolCallPart } from '../models/assistant-api.models';\n\n/** A message part as the thread renders it: consecutive tool calls form one group. */\nexport type NhAssistantPartGroup =\n | { kind: 'text'; key: string; part: TextPart }\n | { kind: 'approval'; key: string; part: ApprovalPart }\n | { kind: 'tools'; key: string; calls: ToolCallPart[] };\n\n/**\n * Groups consecutive tool calls of a message. Text and approvals break a group, so an\n * approval always stays visible. A group's key is its first invocation id, so it keeps\n * its identity while later calls of the same run are appended.\n */\nexport function groupNhAssistantParts(parts: readonly MessagePart[]): NhAssistantPartGroup[] {\n const groups: NhAssistantPartGroup[] = [];\n let tools: { kind: 'tools'; key: string; calls: ToolCallPart[] } | null = null;\n\n parts.forEach((part, index) => {\n if (part.type === 'tool-call') {\n if (!tools) {\n tools = { kind: 'tools', key: `tools:${part.invocationId}`, calls: [] };\n groups.push(tools);\n }\n tools.calls.push(part);\n return;\n }\n\n tools = null;\n if (part.type === 'approval') {\n groups.push({ kind: 'approval', key: `approval:${part.approvalId}`, part });\n } else {\n groups.push({ kind: 'text', key: `text:${index}`, part });\n }\n });\n\n return groups;\n}\n\n/** Pure, so the groups are only rebuilt when the reducer replaces a message's parts. */\n@Pipe({ name: 'nhAssistantPartGroups', standalone: true })\nexport class NhAssistantPartGroupsPipe implements PipeTransform {\n transform(parts: readonly MessagePart[]): NhAssistantPartGroup[] {\n return groupNhAssistantParts(parts);\n }\n}\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","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n afterNextRender,\n computed,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable, Subscription, forkJoin, map } from 'rxjs';\nimport {\n AgentFeedbackOutcome,\n AgentProposalFeedback,\n AgentProposalFeedbackCategory,\n NH_ASSISTANT_FEEDBACK_CATEGORIES,\n NH_ASSISTANT_MAX_BULK_FEEDBACK,\n NH_ASSISTANT_MAX_FEEDBACK_TEXT\n} from '../../models/assistant-agent-run.models';\nimport { nhAssistantErrorKeys, toNhAssistantError } from '../../internal/nh-assistant-errors';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NhAssistantAgentRunApiService } from '../../services/nh-assistant-agent-run-api.service';\nimport { nhAssistantErrorMessageKey } from '../../services/nh-assistant-transport';\nimport type { NhAssistantError } from '../../services/nh-assistant.store';\n\n/** What `nh-assistant-proposal-feedback` stored. */\nexport interface NhAssistantProposalFeedbackSaved {\n /** The proposals whose feedback the server stored. */\n approvalIds: string[];\n category: AgentProposalFeedbackCategory;\n text: string | null;\n}\n\nconst notAcceptedCode = 'assistant-feedback-not-accepted';\n\nlet nextId = 0;\n\n/**\n * Asks, after a rejection, what was wrong with one or more agent proposals: a category from a fixed\n * set and an optional text. It is optional and never blocks the decision; people skip it with one\n * action. One proposal is sent with `PUT approvals/{id}/feedback`, several rejected together with\n * `POST approvals/feedback` as bulk feedback. With `initial` it changes the caller's own feedback.\n * After saving it thanks the person in place of the form; hosts remove it after `dismissed`.\n */\n@Component({\n selector: 'nh-assistant-proposal-feedback',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-proposal-feedback.component.html',\n styleUrl: './nh-assistant-proposal-feedback.component.scss'\n})\nexport class NhAssistantProposalFeedbackComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(Injector);\n private readonly thanks = viewChild<ElementRef<HTMLElement>>('thanks');\n private subscription?: Subscription;\n\n /** The proposals the feedback is about; several when they were rejected together. */\n readonly approvalIds = input.required<readonly string[]>();\n /** The caller's current feedback, to change it; `null` for new feedback. */\n readonly initial = input<AgentProposalFeedback | null>(null);\n /** Emits after the server stored the feedback. */\n readonly saved = output<NhAssistantProposalFeedbackSaved>();\n /** Emits when the person skips the question. */\n readonly dismissed = output<void>();\n\n readonly id = `nh-assistant-proposal-feedback-${nextId++}`;\n readonly categories = NH_ASSISTANT_FEEDBACK_CATEGORIES;\n readonly maxText = NH_ASSISTANT_MAX_FEEDBACK_TEXT;\n\n /** A new question when the host passes other proposals or other initial feedback. */\n private readonly question = computed(() => ({ approvalIds: this.approvalIds(), initial: this.initial() }));\n\n readonly category = linkedSignal<AgentProposalFeedbackCategory | null>(() => this.question().initial?.category ?? null);\n readonly text = linkedSignal(() => this.question().initial?.text ?? '');\n readonly busy = signal(false);\n readonly done = linkedSignal({ source: this.question, computation: () => false });\n /** Set when a bulk request stored the feedback for only part of the proposals. */\n readonly partial = linkedSignal<unknown, { stored: number; total: number } | null>({\n source: this.question,\n computation: () => null\n });\n readonly error = linkedSignal<unknown, NhAssistantError | null>({ source: this.question, computation: () => null });\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n readonly count = computed(() => new Set(this.approvalIds()).size);\n readonly textLength = computed(() => this.text().length);\n readonly tooLong = computed(() => this.textLength() > this.maxText);\n readonly canSend = computed(() => this.category() !== null && this.count() > 0 && !this.busy() && !this.tooLong());\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n }\n\n choose(category: AgentProposalFeedbackCategory): void {\n this.category.set(category);\n this.error.set(null);\n }\n\n onText(event: Event): void {\n this.text.set((event.target as HTMLTextAreaElement).value);\n }\n\n dismiss(): void {\n this.subscription?.unsubscribe();\n this.busy.set(false);\n this.dismissed.emit();\n }\n\n send(): void {\n const category = this.category();\n if (!this.canSend() || category === null) {\n return;\n }\n\n const approvalIds = [...new Set(this.approvalIds())];\n const text = this.text().trim() || null;\n this.busy.set(true);\n this.error.set(null);\n this.subscription?.unsubscribe();\n this.subscription = this.request(approvalIds, category, text).subscribe({\n next: outcomes => {\n this.busy.set(false);\n const stored = outcomes.filter(outcome => outcome.succeeded).map(outcome => outcome.approvalId);\n if (stored.length === 0) {\n const code = outcomes.find(outcome => outcome.code)?.code ?? notAcceptedCode;\n this.error.set({ code, messageKey: nhAssistantErrorMessageKey(code) });\n return;\n }\n\n // The form disappears; keep keyboard focus on the confirmation instead of losing it.\n const focused = this.host.nativeElement.contains(this.document.activeElement);\n this.partial.set(stored.length < approvalIds.length ? { stored: stored.length, total: approvalIds.length } : null);\n this.done.set(true);\n if (focused) {\n afterNextRender(() => this.thanks()?.nativeElement.focus(), { injector: this.injector });\n }\n this.saved.emit({ approvalIds: stored, category, text });\n },\n error: failure => {\n this.busy.set(false);\n this.error.set(toNhAssistantError(failure));\n }\n });\n }\n\n /** One proposal through its own endpoint; several in requests of at most the bulk limit. */\n private request(\n approvalIds: string[],\n category: AgentProposalFeedbackCategory,\n text: string | null\n ): Observable<AgentFeedbackOutcome[]> {\n if (approvalIds.length === 1) {\n const [approvalId] = approvalIds;\n return this.api.giveFeedback(approvalId, category, text).pipe(\n map(() => [{ approvalId, succeeded: true, code: null }])\n );\n }\n\n const chunks: string[][] = [];\n for (let index = 0; index < approvalIds.length; index += NH_ASSISTANT_MAX_BULK_FEEDBACK) {\n chunks.push(approvalIds.slice(index, index + NH_ASSISTANT_MAX_BULK_FEEDBACK));\n }\n return forkJoin(chunks.map(chunk => this.api.giveFeedbackMany(chunk, category, text))).pipe(\n map(responses => responses.flatMap(response => response.results))\n );\n }\n}\n","@if (done()) {\n <div class=\"feedback done\" role=\"status\" tabindex=\"-1\" #thanks>\n <p class=\"thanks\"><nh-assistant-icon name=\"check\" />{{ 'nh-assistant.proposal-feedback.thanks' | translate }}</p>\n @if (partial(); as stored) {\n <p class=\"scope\">{{ 'nh-assistant.proposal-feedback.partial' | translate: { stored: stored.stored, total: stored.total } }}</p>\n }\n </div>\n} @else {\n <form class=\"feedback\" [attr.aria-busy]=\"busy()\" (submit)=\"$event.preventDefault(); send()\">\n <fieldset class=\"categories\" [disabled]=\"busy()\">\n <legend>{{ 'nh-assistant.proposal-feedback.legend' | translate }}</legend>\n @if (count() > 1) {\n <p class=\"scope\">{{ 'nh-assistant.proposal-feedback.bulk' | translate: { count: count() } }}</p>\n }\n <div class=\"chips\">\n @for (option of categories; track option) {\n <label class=\"chip\" [class.selected]=\"category() === option\">\n <input\n type=\"radio\"\n [name]=\"id + '-category'\"\n [value]=\"option\"\n [checked]=\"category() === option\"\n [attr.aria-describedby]=\"id + '-hint-' + option\"\n (change)=\"choose(option)\" />\n @if (category() === option) {\n <nh-assistant-icon name=\"check\" />\n }\n <span>{{ 'nh-assistant.proposal-feedback.categories.' + option | translate }}</span>\n </label>\n }\n </div>\n @for (option of categories; track option) {\n <span class=\"visually-hidden\" [id]=\"id + '-hint-' + option\">{{ 'nh-assistant.proposal-feedback.hints.' + option | translate }}</span>\n }\n @if (category(); as selected) {\n <p class=\"selected-hint\" aria-hidden=\"true\">{{ 'nh-assistant.proposal-feedback.hints.' + selected | translate }}</p>\n }\n\n <div class=\"field\">\n <label [for]=\"id + '-text'\">{{ 'nh-assistant.proposal-feedback.text-label' | translate }}</label>\n <textarea\n rows=\"2\"\n [id]=\"id + '-text'\"\n [attr.maxlength]=\"maxText\"\n [value]=\"text()\"\n [attr.aria-describedby]=\"id + '-text-hint'\"\n [attr.aria-invalid]=\"tooLong() ? true : null\"\n (input)=\"onText($event)\"></textarea>\n <p class=\"hint\" [id]=\"id + '-text-hint'\">\n <span>{{ 'nh-assistant.proposal-feedback.text-hint' | translate }}</span>\n <span class=\"counter\" [class.error-text]=\"tooLong()\">\n {{ 'nh-assistant.proposal-feedback.characters' | translate: { count: textLength(), max: maxText } }}\n </span>\n </p>\n </div>\n </fieldset>\n\n @if (error(); as failure) {\n <p class=\"message error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: failure.code }}</p>\n }\n\n <div class=\"actions\">\n <button class=\"text-button\" type=\"button\" (click)=\"dismiss()\">\n {{ (initial() ? 'nh-assistant.proposal-feedback.cancel' : 'nh-assistant.proposal-feedback.skip') | translate }}\n </button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"!canSend()\">\n {{ (busy() ? 'nh-assistant.proposal-feedback.sending' : 'nh-assistant.proposal-feedback.send') | translate }}\n </button>\n </div>\n </form>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild\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';\nimport type { NhAssistantApprovalWaitingFor } from '../../services/nh-assistant.store';\nimport { NhAssistantProposalFeedbackComponent } from '../proposal-feedback/nh-assistant-proposal-feedback.component';\n\nlet nextId = 0;\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. After the user rejected an agent's proposal\n * (`canGiveFeedback`), a low-key action asks what was wrong.\n */\n@Component({\n selector: 'nh-assistant-approval-card',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent, NhAssistantProposalFeedbackComponent],\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 /**\n * False when the current user may not decide: in a chat the approval belongs to another\n * participant's turn, in an agent thread the user is no approver of the proposal.\n */\n readonly canDecide = input(true);\n /** Name of the participant who decides a `turn` approval, shown when the current user cannot. */\n readonly decisionOwner = input<string | null>(null);\n /**\n * Who decides when the current user cannot: the author of the turn (`turn`, the default), an\n * approver of the agent thread's subject (`approver`), or another approver because the current\n * user started the work (`other-approver`).\n */\n readonly waitingFor = input<NhAssistantApprovalWaitingFor>('turn');\n /**\n * True when the current user rejected this agent proposal and may say what was wrong, for example\n * from `NhAssistantStore.approvalRights`. Chat approvals never offer feedback.\n */\n readonly canGiveFeedback = input(false);\n readonly decide = output<ApprovalDecision>();\n\n private readonly now = signal(Date.now());\n private readonly submitted = signal(false);\n /** The feedback question is expanded. */\n readonly feedbackOpen = signal(false);\n /** The feedback was stored; the question thanks the person and the action disappears. */\n readonly feedbackSaved = signal(false);\n private readonly feedbackToggle = viewChild<ElementRef<HTMLButtonElement>>('feedbackToggle');\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 succeeded = computed(() =>\n ['approved', 'executing', 'executed', 'resolved'].includes(this.effectiveStatus()));\n readonly disabled = computed(() => !this.actionable() || !this.canDecide() || this.deciding() || this.submitted());\n readonly countdown = computed(() => formatNhAssistantCountdown(this.remainingMs()));\n readonly presentedSummary = computed(() => this.approval().presentation?.summary ?? null);\n readonly feedbackAvailable = computed(() => this.canGiveFeedback() && this.effectiveStatus() === 'rejected');\n readonly feedbackIds = computed(() => [this.approval().approvalId]);\n readonly feedbackPanelId = `nh-assistant-approval-feedback-${nextId++}`;\n /** Translation key of the text shown instead of the buttons when the current user cannot decide. */\n readonly waitingKey = computed(() => {\n switch (this.waitingFor()) {\n case 'approver':\n return 'nh-assistant.approval.waiting-for-approver';\n case 'other-approver':\n return 'nh-assistant.approval.waiting-for-other-approver';\n default:\n return this.decisionOwner() ? 'nh-assistant.approval.waiting-for' : 'nh-assistant.approval.waiting-for-participant';\n }\n });\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 toggleFeedback(): void {\n this.feedbackOpen.update(open => !open);\n }\n\n onFeedbackSaved(): void {\n this.feedbackSaved.set(true);\n }\n\n /** Collapses the question and returns focus to the action that opened it. */\n onFeedbackDismissed(): void {\n this.feedbackOpen.set(false);\n this.feedbackToggle()?.nativeElement.focus();\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' : succeeded() ? '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() && !canDecide()) {\n <p class=\"waiting-for-other\" role=\"status\">\n <nh-assistant-icon name=\"users\" />\n {{ waitingKey() | translate: { name: decisionOwner() } }}\n </p>\n } @else 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\n @if (feedbackAvailable()) {\n @if (!feedbackSaved()) {\n <button\n #feedbackToggle\n class=\"feedback-toggle\"\n type=\"button\"\n [attr.aria-expanded]=\"feedbackOpen()\"\n [attr.aria-controls]=\"feedbackOpen() ? feedbackPanelId : null\"\n (click)=\"toggleFeedback()\">\n {{ 'nh-assistant.approval.give-feedback' | translate }}\n </button>\n }\n @if (feedbackOpen()) {\n <nh-assistant-proposal-feedback\n class=\"feedback\"\n [attr.id]=\"feedbackPanelId\"\n [approvalIds]=\"feedbackIds()\"\n (saved)=\"onFeedbackSaved()\"\n (dismissed)=\"onFeedbackDismissed()\" />\n }\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 // Ended without running: its proposal expired, was withdrawn or became stale.\n 'not-executed': 'stop'\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 @if (part().grantSource; as grantSource) {\n <span class=\"grant\" [attr.title]=\"'nh-assistant.tool-call.grant-source.' + grantSource + '-hint' | translate\">\n {{ 'nh-assistant.tool-call.grant-source.' + grantSource | translate }}\n </span>\n }\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 } @else if (part().restricted) {\n <p class=\"label\">{{ 'nh-assistant.tool-call.result' | translate }}</p>\n <p class=\"restricted\">{{ 'nh-assistant.tool-call.restricted' | translate }}</p>\n }\n </div>\n }\n</article>\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 { NhAssistantToolCallCardComponent } from '../tool-call-card/nh-assistant-tool-call-card.component';\n\nlet nextId = 0;\n\n/**\n * Overall state of a run of tool calls, from most to least urgent. `not-executed` means that every\n * call finished and at least one ended without running, because its proposal expired, was\n * withdrawn or became stale.\n */\nexport type NhAssistantToolCallGroupState = 'awaiting-approval' | 'running' | 'failed' | 'not-executed' | 'succeeded';\n\nconst stateIcons: Record<NhAssistantToolCallGroupState, NhAssistantIconName> = {\n 'awaiting-approval': 'clock',\n running: 'tool',\n failed: 'warning',\n 'not-executed': 'stop',\n succeeded: 'check'\n};\n\n/**\n * Summarizes consecutive tool calls in one collapsed line that counts along live: the\n * tool that runs now while the assistant works, and how many tools were used and failed\n * afterwards. Expanding it shows every call as a card.\n */\n@Component({\n selector: 'nh-assistant-tool-call-group',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent, NhAssistantToolCallCardComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-tool-call-group.component.html',\n styleUrl: './nh-assistant-tool-call-group.component.scss',\n host: {\n '[attr.data-status]': 'state()'\n }\n})\nexport class NhAssistantToolCallGroupComponent {\n readonly calls = input.required<readonly ToolCallPart[]>();\n\n readonly callsId = `nh-assistant-tool-call-group-${nextId++}`;\n readonly expanded = signal(false);\n\n /** The call that currently needs attention or runs; the latest one when several do. */\n readonly current = computed(() => {\n const calls = this.calls();\n return findLast(calls, call => call.status === 'awaiting-approval')\n ?? findLast(calls, call => call.status === 'running')\n ?? null;\n });\n readonly total = computed(() => this.calls().length);\n readonly finished = computed(() => this.calls().filter(call => !isActive(call)).length);\n readonly failed = computed(() => this.calls().filter(call => call.status === 'failed').length);\n /** Calls that finished without running; they never wait. */\n readonly notExecuted = computed(() => this.calls().filter(call => call.status === 'not-executed').length);\n readonly state = computed<NhAssistantToolCallGroupState>(() => {\n const current = this.current();\n if (current) {\n return current.status === 'awaiting-approval' ? 'awaiting-approval' : 'running';\n }\n\n if (this.failed() > 0) {\n return 'failed';\n }\n\n return this.notExecuted() > 0 ? 'not-executed' : 'succeeded';\n });\n readonly stateIcon = computed(() => stateIcons[this.state()]);\n\n toggle(): void {\n this.expanded.update(expanded => !expanded);\n }\n}\n\nfunction isActive(call: ToolCallPart): boolean {\n return call.status === 'running' || call.status === 'awaiting-approval';\n}\n\nfunction findLast(calls: readonly ToolCallPart[], predicate: (call: ToolCallPart) => boolean): ToolCallPart | undefined {\n for (let index = calls.length - 1; index >= 0; index--) {\n if (predicate(calls[index])) {\n return calls[index];\n }\n }\n\n return undefined;\n}\n","<section class=\"group\">\n <button\n class=\"summary\"\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"callsId\"\n [attr.title]=\"(expanded() ? 'nh-assistant.tool-group.hide-calls' : 'nh-assistant.tool-group.show-calls') | translate\"\n (click)=\"toggle()\">\n <span class=\"status-icon\" [class.spinning]=\"state() === 'running'\">\n <nh-assistant-icon [name]=\"stateIcon()\" />\n </span>\n <span class=\"title\">\n @switch (state()) {\n @case ('running') {\n {{ 'nh-assistant.tool-group.running' | translate: { name: current()?.displayName } }}\n }\n @case ('awaiting-approval') {\n {{ 'nh-assistant.tool-group.awaiting-approval' | translate: { name: current()?.displayName } }}\n }\n @default {\n {{ (total() === 1 ? 'nh-assistant.tool-group.used-one' : 'nh-assistant.tool-group.used-many') | translate: { count: total() } }}\n }\n }\n </span>\n @if (state() === 'running' || state() === 'awaiting-approval') {\n <span class=\"count\">{{ 'nh-assistant.tool-group.progress' | translate: { finished: finished(), total: total() } }}</span>\n } @else {\n @if (failed() > 0) {\n <span class=\"count failed\">{{ 'nh-assistant.tool-group.failed' | translate: { count: failed() } }}</span>\n }\n @if (notExecuted() > 0) {\n <span class=\"count not-executed\">{{ 'nh-assistant.tool-group.not-executed' | translate: { count: notExecuted() } }}</span>\n }\n }\n <nh-assistant-icon class=\"chevron\" name=\"chevron-down\" [class.rotated]=\"expanded()\" />\n </button>\n\n <div class=\"calls\" [id]=\"callsId\" [hidden]=\"!expanded()\">\n @if (expanded()) {\n @for (call of calls(); track call.invocationId) {\n <nh-assistant-tool-call-card [part]=\"call\" />\n }\n }\n </div>\n</section>\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 signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ApprovalDecision, ApprovalPart, ConversationMember, Message } from '../../models/assistant-api.models';\nimport { NhAssistantMarkdownPipe } from '../../internal/nh-assistant-markdown.pipe';\nimport { NhAssistantPartGroupsPipe } from '../../internal/nh-assistant-part-groups';\nimport { NhAssistantApprovalCardComponent } from '../approval-card/nh-assistant-approval-card.component';\nimport { NhAssistantToolCallGroupComponent } from '../tool-call-group/nh-assistant-tool-call-group.component';\nimport type { NhAssistantApprovalRight } from '../../services/nh-assistant.store';\n\n/** A decision about one approval of the thread. */\nexport interface NhAssistantApprovalChoice {\n approvalId: string;\n decision: ApprovalDecision;\n}\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, consecutive tool calls as one collapsible group that counts along, and\n * approvals as cards. Messages a trigger wrote into an agent thread read as events, not as\n * a person. While a turn runs without visible progress, a working indicator shows the\n * elapsed time. The thread follows new content while the 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 NhAssistantPartGroupsPipe,\n NhAssistantToolCallGroupComponent,\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 /** The owner and participants of a shared conversation; empty while it is not shared. */\n readonly members = input<readonly ConversationMember[]>([]);\n /** The current user, to tell their own messages from those of others. */\n readonly currentActorId = input<string | null>(null);\n /** False when the pending approval belongs to another participant's turn. */\n readonly canDecide = input(true);\n /** Name of the participant who decides the pending approval, when it is someone else. */\n readonly decisionOwner = input<string | null>(null);\n /**\n * Who may decide each pending approval, by approval id, for example `NhAssistantStore.approvalRights`.\n * An agent thread can hold several open proposals that the subject's approvers decide. Approvals\n * without an entry use `canDecide` and `decisionOwner`. An entry with `canGiveFeedback` lets the\n * card of a rejected proposal ask what was wrong.\n */\n readonly approvalRights = input<ReadonlyMap<string, NhAssistantApprovalRight> | null>(null);\n /** The decision about an approval card, without the approval it belongs to. */\n readonly approvalDecision = output<ApprovalDecision>();\n /** The decision about an approval card together with its approval id. */\n readonly approvalChoice = output<NhAssistantApprovalChoice>();\n\n private readonly names = computed(() => new Map(this.members().map(member => [member.actorId, member.displayName])));\n\n readonly virtualThreshold = NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD;\n readonly virtual = computed(() => this.messages().length > NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD);\n /**\n * True while the turn runs and nothing else shows progress: before the first part and\n * between tool calls while the model decides what to do next. Streaming text and a\n * running tool group show their own progress; an approval waits for the user.\n */\n readonly working = computed(() => {\n if (!this.streaming()) {\n return false;\n }\n\n const last = this.messages()[this.messages().length - 1];\n if (!last || last.role === 'user' || last.parts.length === 0) {\n return true;\n }\n\n const lastPart = last.parts[last.parts.length - 1];\n return lastPart.type === 'tool-call'\n && lastPart.status !== 'running'\n && lastPart.status !== 'awaiting-approval';\n });\n /** Whole seconds since the running turn started. */\n readonly elapsedSeconds = computed(() => {\n const startedAt = this.turnStartedAt();\n return startedAt === null ? 0 : Math.max(0, Math.floor((this.now() - startedAt) / 1000));\n });\n\n private readonly turnStartedAt = signal<number | null>(null);\n private readonly now = signal(Date.now());\n\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n private readonly viewport = viewChild(CdkVirtualScrollViewport);\n\n constructor() {\n effect(onCleanup => {\n if (!this.streaming()) {\n this.turnStartedAt.set(null);\n return;\n }\n\n untracked(() => {\n const now = Date.now();\n this.now.set(now);\n if (this.turnStartedAt() === null) {\n this.turnStartedAt.set(now);\n }\n });\n const timer = setInterval(() => this.now.set(Date.now()), 1000);\n onCleanup(() => clearInterval(timer));\n });\n\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 /** True for a user message a trigger wrote into an agent thread. */\n isTrigger(message: Message): boolean {\n return message.role === 'user' && message.authorKind === 'trigger';\n }\n\n /** True for a user message written by another person in a shared conversation. */\n isOthers(message: Message): boolean {\n return message.role === 'user'\n && !this.isTrigger(message)\n && !!message.authorActorId\n && !!this.currentActorId()\n && message.authorActorId !== this.currentActorId();\n }\n\n /** Whether and why the current user may decide an approval card. */\n rightFor(approval: ApprovalPart): NhAssistantApprovalRight {\n return this.approvalRights()?.get(approval.approvalId) ?? {\n canDecide: this.canDecide(),\n waitingFor: 'turn',\n decisionOwner: this.decisionOwner()\n };\n }\n\n choose(approval: ApprovalPart, decision: ApprovalDecision): void {\n this.approvalDecision.emit(decision);\n this.approvalChoice.emit({ approvalId: approval.approvalId, decision });\n }\n\n /** Display name of another person's message, or `null` when the application provides none. */\n authorName(message: Message): string | null {\n return message.authorActorId ? this.names().get(message.authorActorId) ?? null : null;\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\n class=\"message\"\n [attr.data-role]=\"message.role\"\n [attr.data-others]=\"isOthers(message) ? 'true' : null\"\n [attr.data-author]=\"isTrigger(message) ? 'trigger' : null\">\n @if (isTrigger(message)) {\n <p class=\"author\">{{ 'nh-assistant.thread.trigger' | translate }}</p>\n } @else if (isOthers(message)) {\n <p class=\"author\">{{ authorName(message) ?? ('nh-assistant.thread.participant' | translate) }}</p>\n } @else {\n <p class=\"author\">{{ 'nh-assistant.thread.' + (message.role === 'user' ? 'you' : message.role) | translate }}</p>\n }\n @for (group of message.parts | nhAssistantPartGroups; track group.key) {\n @switch (group.kind) {\n @case ('text') {\n @if (message.role === 'assistant' && markdown()) {\n <div class=\"bubble markdown\" [innerHTML]=\"group.part.text | nhAssistantMarkdown\"></div>\n } @else {\n <div class=\"bubble plain\">{{ group.part.text }}</div>\n }\n }\n @case ('tools') {\n <nh-assistant-tool-call-group class=\"part\" [calls]=\"group.calls\" />\n }\n @case ('approval') {\n <nh-assistant-approval-card\n class=\"part\"\n [approval]=\"group.part\"\n [deciding]=\"deciding()\"\n [canDecide]=\"rightFor(group.part).canDecide\"\n [decisionOwner]=\"rightFor(group.part).decisionOwner\"\n [waitingFor]=\"rightFor(group.part).waitingFor\"\n [canGiveFeedback]=\"rightFor(group.part).canGiveFeedback === true\"\n (decide)=\"choose(group.part, $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 @if (elapsedSeconds() > 0) {\n <span class=\"elapsed\">{{ 'nh-assistant.thread.elapsed' | translate: { seconds: elapsedSeconds() } }}</span>\n }\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 { NhAssistantError, NhAssistantStore } from '../../services/nh-assistant.store';\nimport { describeNhAssistantClientContext } from '../../services/nh-assistant-page-context';\nimport { NhAssistantPushService } from '../../services/nh-assistant-push.service';\nimport { NhAssistantActivityComponent } from '../activity/nh-assistant-activity.component';\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 { NhAssistantShareComponent } from '../share/nh-assistant-share.component';\nimport { NH_ASSISTANT_CONVERSATION_FRAGMENT, NH_ASSISTANT_JOIN_FRAGMENT } from '../../services/nh-assistant-share-link';\nimport { NhAssistantApprovalChoice, NhAssistantThreadComponent } from '../thread/nh-assistant-thread.component';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../../services/nh-assistant-transport';\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. It opens\n * by itself for an invitation link (`#nh-assistant-join=...`) and for a clicked notification.\n */\n@Component({\n selector: 'nh-assistant-panel',\n standalone: true,\n imports: [\n RouterLink,\n TranslatePipe,\n NhAssistantTranslatePipe,\n NhAssistantIconComponent,\n NhAssistantActivityComponent,\n NhAssistantAgentPickerComponent,\n NhAssistantComposerComponent,\n NhAssistantConversationListComponent,\n NhAssistantPreferencesComponent,\n NhAssistantShareComponent,\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 readonly push = inject(NhAssistantPushService);\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 showShare = signal(false);\n readonly shareSection = signal<'all' | 'link' | 'members'>('all');\n readonly notificationError = signal<NhAssistantError | null>(null);\n readonly notificationsLabel = computed(() => this.push.settings()?.pushEnabled\n ? 'nh-assistant.panel.notifications-off' : 'nh-assistant.panel.notifications-on');\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.canSubmit());\n readonly editingQueuedId = signal<string | null>(null);\n readonly queuedDraft = signal('');\n private resumeAfterEditing = false;\n readonly validQueuedDraft = computed(() => this.queuedDraft().trim().length > 0\n && this.queuedDraft().trim().length <= (this.store.limits()?.maxMessageChars ?? Infinity));\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 /** Name of another participant whose turn runs or waits, or `null`. */\n readonly activeMemberName = computed(() => {\n const member = this.store.activeMember();\n return member ? member.displayName ?? '' : null;\n });\n /** The owner and the person who started the turn may stop it. */\n readonly canStop = computed(() => this.store.isOwner() || this.store.activeMember() === null);\n readonly shared = computed(() => this.store.members().some(member => member.role === 'participant'));\n readonly canShare = computed(() => this.conversation() !== null && !!this.store.collaboration());\n readonly errorKeys = computed(() => {\n const error = this.notificationError() ?? 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 this.showShare.set(false);\n });\n }\n });\n\n // The open thread counts as seen only while the drawer shows it.\n effect(() => {\n const viewing = this.panel.isOpen() && !this.showConversations() && !this.showPreferences() && !this.showShare();\n untracked(() => this.store.setViewing(viewing));\n });\n\n // A clicked notification opens its conversation in this window.\n const notifications = this.push.openConversation$.subscribe(conversationId => this.panel.open(conversationId));\n inject(DestroyRef).onDestroy(() => notifications.unsubscribe());\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 control 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 this.openFromLocation();\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.showShare.set(false);\n this.showConversations.update(show => !show);\n }\n\n togglePreferences(): void {\n this.showConversations.set(false);\n this.showShare.set(false);\n this.showPreferences.update(show => !show);\n }\n\n toggleShare(section: 'all' | 'link' | 'members' = 'all'): void {\n this.showConversations.set(false);\n this.showPreferences.set(false);\n const close = this.showShare() && this.shareSection() === section;\n this.shareSection.set(section);\n this.showShare.set(!close);\n }\n\n /** Applies the notification choice immediately, including browser permission handling. */\n async toggleNotifications(): Promise<void> {\n if (this.push.busy() || this.push.state() === 'unavailable') {\n return;\n }\n this.notificationError.set(null);\n try {\n await this.push.setEnabled(!this.push.settings()?.pushEnabled);\n } catch (error) {\n this.notificationError.set(error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : { code: 'assistant-server', messageKey: nhAssistantErrorMessageKey('assistant-server') });\n }\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 this.showShare.set(false);\n void this.store.submit(text);\n }\n\n editQueuedMessage(id: string, text: string): void {\n this.resumeAfterEditing = !this.store.queuePaused();\n this.store.pauseQueue();\n this.editingQueuedId.set(id);\n this.queuedDraft.set(text);\n }\n\n changeQueuedDraft(event: Event): void {\n this.queuedDraft.set((event.target as HTMLTextAreaElement).value);\n }\n\n saveQueuedMessage(id: string): void {\n if (this.store.updateQueuedMessage(id, this.queuedDraft())) {\n this.cancelQueueEdit();\n }\n }\n\n cancelQueueEdit(): void {\n this.editingQueuedId.set(null);\n if (this.resumeAfterEditing && !this.store.error()) {\n this.store.resumeQueue();\n }\n }\n\n /**\n * Opens the panel for an invitation link or a clicked notification in the URL fragment and\n * removes the fragment, so a reload or a shared screenshot does not reuse the token.\n */\n private openFromLocation(): void {\n const location = globalThis.location;\n const hash = location?.hash?.replace(/^#/, '') ?? '';\n const separatorIndex = hash.indexOf('=');\n const name = separatorIndex < 0 ? hash : hash.slice(0, separatorIndex);\n const value = separatorIndex < 0 ? '' : hash.slice(separatorIndex + 1);\n if (!value || (name !== NH_ASSISTANT_JOIN_FRAGMENT && name !== NH_ASSISTANT_CONVERSATION_FRAGMENT)) {\n return;\n }\n\n globalThis.history?.replaceState(globalThis.history.state, '', location.pathname + location.search);\n if (name === NH_ASSISTANT_CONVERSATION_FRAGMENT) {\n this.panel.open(decodeURIComponent(value));\n return;\n }\n\n const tokenIndex = value.indexOf('.');\n if (tokenIndex <= 0) {\n return;\n }\n const conversationId = decodeURIComponent(value.slice(0, tokenIndex));\n const token = decodeURIComponent(value.slice(tokenIndex + 1));\n this.panel.open();\n void this.store.initialize().then(() => this.store.joinConversation(conversationId, token));\n }\n\n decide(decision: ApprovalDecision): void {\n this.store.decide(decision);\n }\n\n /** Decides the approval of a card; in an agent thread several proposals can be open. */\n decideApproval(choice: NhAssistantApprovalChoice): void {\n this.store.decide(choice.decision, undefined, choice.approvalId);\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 </div>\n <div class=\"header-actions\">\n @if (store.enabled()) {\n @if (push.state() !== 'unavailable') {\n <button\n class=\"icon-button notification-button\"\n type=\"button\"\n [class.active]=\"push.state() === 'on'\"\n [class.off]=\"!push.settings()?.pushEnabled\"\n [class.blocked]=\"push.state() === 'blocked'\"\n [disabled]=\"push.busy()\"\n [attr.aria-pressed]=\"push.settings()?.pushEnabled === true\"\n [attr.aria-label]=\"notificationsLabel() | translate\"\n [attr.title]=\"('nh-assistant.preferences.notifications-state.' + push.state() | translate) + ' · ' + (notificationsLabel() | translate)\"\n (click)=\"toggleNotifications()\">\n <nh-assistant-icon name=\"bell\" />\n </button>\n }\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 [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 @if (store.enabled()) {\n <nh-assistant-activity [items]=\"store.activity()\" (conversationSelect)=\"openConversation($event)\" />\n }\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 (showShare()) {\n <nh-assistant-share class=\"overlay-view\" [section]=\"shareSection()\" (closed)=\"showShare.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 (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 [attr.inert]=\"showPreferences() || showShare() || showConversations() ? '' : null\"\n [messages]=\"messages()\"\n [streaming]=\"busy()\"\n [deciding]=\"store.deciding()\"\n [markdown]=\"markdown\"\n [members]=\"store.members()\"\n [currentActorId]=\"conversation()?.currentActorId ?? null\"\n [canDecide]=\"store.canDecide()\"\n [decisionOwner]=\"activeMemberName()\"\n [approvalRights]=\"store.approvalRights()\"\n (approvalChoice)=\"decideApproval($event)\" />\n }\n }\n </div>\n\n @if (notificationError() ?? 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(); notificationError.set(null)\">\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() && !showShare()) {\n <footer class=\"footer\" (focusin)=\"refreshPageContext()\">\n @if (closed()) {\n <p class=\"notice\">{{ 'nh-assistant.panel.conversation-closed' | translate }}</p>\n }\n @if (store.collaboration() || store.pageContext()) {\n <div class=\"conversation-actions\">\n @if (store.collaboration()) {\n @if (!conversation() || store.isOwner()) {\n <button class=\"icon-button\" type=\"button\" [disabled]=\"!canShare()\"\n [attr.aria-label]=\"'nh-assistant.panel.share' | translate\"\n [attr.title]=\"'nh-assistant.panel.share' | translate\"\n [attr.aria-expanded]=\"showShare() && shareSection() === 'link'\"\n (click)=\"toggleShare('link')\">\n <nh-assistant-icon name=\"link\" />\n </button>\n }\n <button class=\"icon-button\" type=\"button\" [disabled]=\"!canShare()\"\n [class.active]=\"shared()\"\n [attr.aria-label]=\"(store.isOwner() || !conversation() ? 'nh-assistant.panel.add-members' : 'nh-assistant.panel.members') | translate\"\n [attr.title]=\"(store.isOwner() || !conversation() ? 'nh-assistant.panel.add-members' : 'nh-assistant.panel.members') | translate\"\n [attr.aria-expanded]=\"showShare() && shareSection() === 'members'\"\n (click)=\"toggleShare('members')\">\n <nh-assistant-icon name=\"users\" />\n </button>\n }\n @if (store.pageContext(); as context) {\n <button\n class=\"icon-button page-context-button\"\n [class.active]=\"!store.pageContextExcluded()\"\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=\"page\" />\n </button>\n }\n </div>\n }\n @if (store.queuedMessages().length > 0) {\n <section class=\"message-queue\" [attr.aria-label]=\"'nh-assistant.queue.title' | translate: { count: store.queuedMessages().length }\">\n <div class=\"queue-heading\">\n <span aria-live=\"polite\">{{ 'nh-assistant.queue.title' | translate: { count: store.queuedMessages().length } }}</span>\n @if (store.queuePaused()) {\n <button type=\"button\" class=\"queue-resume\" [disabled]=\"editingQueuedId() !== null\" (click)=\"store.resumeQueue()\">\n {{ 'nh-assistant.queue.resume' | translate }}\n </button>\n }\n </div>\n <ol class=\"queue-items\">\n @for (item of store.queuedMessages(); track item.id) {\n <li class=\"queue-item\" [class.failed]=\"item.state === 'failed'\">\n @if (editingQueuedId() === item.id && item.state !== 'sending') {\n <div class=\"queue-edit\">\n <textarea rows=\"2\" [value]=\"queuedDraft()\" (input)=\"changeQueuedDraft($event)\"\n [attr.aria-label]=\"'nh-assistant.queue.edit' | translate\"></textarea>\n <div class=\"queue-buttons\">\n <button type=\"button\" class=\"icon-button\" [disabled]=\"!validQueuedDraft()\"\n [attr.aria-label]=\"'nh-assistant.queue.save' | translate\" [attr.title]=\"'nh-assistant.queue.save' | translate\"\n (click)=\"saveQueuedMessage(item.id)\"><nh-assistant-icon name=\"check\" /></button>\n <button type=\"button\" class=\"icon-button\" [attr.aria-label]=\"'nh-assistant.queue.cancel-edit' | translate\"\n [attr.title]=\"'nh-assistant.queue.cancel-edit' | translate\"\n (click)=\"cancelQueueEdit()\"><nh-assistant-icon name=\"close\" /></button>\n </div>\n </div>\n } @else {\n <div class=\"queue-message\">\n <p [title]=\"item.text\">{{ item.text }}</p>\n @if (item.state !== 'queued') {\n <span class=\"queue-state\">{{ 'nh-assistant.queue.state.' + item.state | translate }}</span>\n }\n </div>\n <div class=\"queue-buttons\">\n @if (store.canSteer() && item.state === 'queued') {\n <button type=\"button\" class=\"queue-steer\" [disabled]=\"editingQueuedId() !== null\"\n [attr.title]=\"'nh-assistant.queue.steer-hint' | translate\"\n (click)=\"store.steerQueuedMessage(item.id)\">{{ 'nh-assistant.queue.steer' | translate }}</button>\n }\n <button type=\"button\" class=\"icon-button\" [disabled]=\"item.state === 'sending'\"\n [attr.aria-label]=\"'nh-assistant.queue.edit' | translate\" [attr.title]=\"'nh-assistant.queue.edit' | translate\"\n (click)=\"editQueuedMessage(item.id, item.text)\"><nh-assistant-icon name=\"edit\" /></button>\n <button type=\"button\" class=\"icon-button\" [disabled]=\"item.state === 'sending'\"\n [attr.aria-label]=\"'nh-assistant.queue.remove' | translate\" [attr.title]=\"'nh-assistant.queue.remove' | translate\"\n (click)=\"store.removeQueuedMessage(item.id)\"><nh-assistant-icon name=\"close\" /></button>\n </div>\n }\n </li>\n }\n </ol>\n </section>\n }\n <nh-assistant-composer\n [disabled]=\"closed()\"\n [sendDisabled]=\"composerDisabled()\"\n [busy]=\"busy()\"\n [queueWhileBusy]=\"true\"\n [status]=\"composerStatus()\"\n [statusActor]=\"activeMemberName()\"\n [canStop]=\"canStop()\"\n [maxLength]=\"store.limits()?.maxMessageChars ?? null\"\n [restore]=\"store.restoredDraft()\"\n (restored)=\"store.consumeRestoredDraft()\"\n (send)=\"send($event)\"\n (cancel)=\"cancel()\">\n @if (store.agents().length > 1) {\n <nh-assistant-agent-picker\n nhAssistantComposerControls\n [compact]=\"true\"\n [agents]=\"store.agents()\"\n [selectedAgentId]=\"store.selectedAgentId()\"\n (agentChange)=\"store.selectAgent($event)\" />\n }\n </nh-assistant-composer>\n </footer>\n }\n </section>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { AgentSubjectSummary } from '../../models/assistant-agent-run.models';\nimport { NhAssistantSubjectSummaryService } from '../../services/nh-assistant-subject-summary.service';\n\n/**\n * A compact count of the agent work on one subject, for example on each row of a project list.\n * It shows nothing while the subject has no work. Otherwise it shows the number of proposals the\n * viewer may decide in the accent color, or, when they may decide none, a neutral count of the\n * open proposals, and a small working indicator while an agent works on the subject. Its tooltip\n * and accessible name say both counts. Badges on one page share one summary request per tick and\n * refresh on live agent-work updates of their subject; see `NhAssistantSubjectSummaryService`.\n */\n@Component({\n selector: 'nh-assistant-subject-badge',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (work(); as summary) {\n @let proposals = proposalsKey() ? (proposalsKey()! | translate: { toDecide: summary.proposalsToDecide, open: summary.openProposals }) : '';\n @let working = summary.runActive ? ('nh-assistant.subject-badge.working' | translate) : '';\n @let label = proposals && working ? proposals + ' ' + working : proposals || working;\n <span\n class=\"subject-badge\"\n [attr.data-state]=\"summary.proposalsToDecide > 0 ? 'decide' : summary.openProposals > 0 ? 'open' : 'working'\"\n [attr.title]=\"label\">\n <nh-assistant-icon name=\"assistant\" />\n @if (count() > 0) {\n <span class=\"count\" aria-hidden=\"true\">{{ countLabel() }}</span>\n }\n @if (summary.runActive) {\n <span class=\"working\" aria-hidden=\"true\"></span>\n }\n <span class=\"visually-hidden\">{{ label }}</span>\n </span>\n }\n `,\n styleUrl: './nh-assistant-subject-badge.component.scss'\n})\nexport class NhAssistantSubjectBadgeComponent {\n private readonly summaries = inject(NhAssistantSubjectSummaryService);\n private readonly summary = signal<AgentSubjectSummary | null>(null);\n\n /** The application's kind of subject, for example `project`. */\n readonly subjectType = input.required<string>();\n readonly subjectId = input.required<string>();\n\n /** The summary while the subject has work to show; `null` otherwise. */\n readonly work = computed(() => {\n const summary = this.summary();\n return summary && (summary.openProposals > 0 || summary.runActive) ? summary : null;\n });\n readonly count = computed(() => {\n const summary = this.work();\n if (!summary) {\n return 0;\n }\n return summary.proposalsToDecide > 0 ? summary.proposalsToDecide : summary.openProposals;\n });\n readonly countLabel = computed(() => this.count() > 99 ? '99+' : String(this.count()));\n readonly proposalsKey = computed(() => {\n const summary = this.work();\n if (!summary || summary.openProposals === 0) {\n return null;\n }\n return summary.proposalsToDecide > 0 ? 'nh-assistant.subject-badge.to-decide' : 'nh-assistant.subject-badge.open';\n });\n\n constructor() {\n effect(onCleanup => {\n const subjectType = this.subjectType();\n const subjectId = this.subjectId();\n const subscription = untracked(() =>\n this.summaries.summary(subjectType, subjectId).subscribe(summary => this.summary.set(summary)));\n onCleanup(() => subscription.unsubscribe());\n });\n }\n}\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-live.models';\nexport * from './lib/models/assistant-admin.models';\nexport * from './lib/models/assistant-agent-run.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-agent-run-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 { NhAssistantLiveService, NhAssistantLiveState } from './lib/services/nh-assistant-live.service';\nexport { NhAssistantPushService, NhAssistantPushState } from './lib/services/nh-assistant-push.service';\nexport * from './lib/services/nh-assistant-panel.service';\nexport * from './lib/services/nh-assistant-subject-summary.service';\nexport * from './lib/services/nh-assistant-share-link';\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/tool-call-group/nh-assistant-tool-call-group.component';\nexport * from './lib/components/approval-card/nh-assistant-approval-card.component';\nexport * from './lib/components/proposal-feedback/nh-assistant-proposal-feedback.component';\nexport * from './lib/components/agent-picker/nh-assistant-agent-picker.component';\nexport * from './lib/components/preferences/nh-assistant-preferences.component';\nexport * from './lib/components/share/nh-assistant-share.component';\nexport * from './lib/components/activity/nh-assistant-activity.component';\nexport * from './lib/components/subject-badge/nh-assistant-subject-badge.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 { nhAssistantReloadOnAgentWork as ɵnhAssistantReloadOnAgentWork } from './lib/internal/nh-assistant-agent-work';\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":";;;;;;;;;;;;;;AAAA;;;;;;AAMG;;ACqEI,MAAM,4BAA4B,GAAuC;IAC9E,cAAc;IACd,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB;;AAGF;;;AAGG;AACI,MAAM,2BAA2B,GAAG;AACzC,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,eAAe,EAAE,2BAA2B;AAC5C,IAAA,SAAS,EAAE,qBAAqB;AAChC,IAAA,QAAQ,EAAE,qBAAqB;AAC/B,IAAA,gBAAgB,EAAE,6BAA6B;AAC/C,IAAA,UAAU,EAAE,sBAAsB;AAClC,IAAA,eAAe,EAAE,4BAA4B;AAC7C,IAAA,eAAe,EAAE,4BAA4B;AAC7C,IAAA,iBAAiB,EAAE,8BAA8B;AACjD,IAAA,MAAM,EAAE,kBAAkB;;AAE1B,IAAA,mBAAmB,EAAE;;;AC4BvB;AACO,MAAM,gCAAgC,GAAG;AAmFhD;AACO,MAAM,gCAAgC,GAA6C;IACxF,WAAW;IACX,aAAa;IACb,YAAY;IACZ,SAAS;IACT,cAAc;IACd,aAAa;IACb;;AAGF;AACO,MAAM,4BAA4B,GAAgF;AACvH,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,aAAa,EAAE,OAAO;AACtB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,SAAS,EAAE,mBAAmB;AAC9B,IAAA,cAAc,EAAE,mBAAmB;AACnC,IAAA,aAAa,EAAE,aAAa;AAC5B,IAAA,KAAK,EAAE;;AAGT;AACO,MAAM,8BAA8B,GAAG;AAE9C;AACO,MAAM,8BAA8B,GAAG;;MCtIjC,mBAAmB,GAAG,IAAI,cAAc,CAAoB,qBAAqB;MAEjF,0BAA0B,GAAG,IAAI,cAAc,CAA0B,4BAA4B;AAKlH;;;;;AAKG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAmB,oBAAoB,EAAE;AAC3F,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,CAAC,KAAa,EAAE,IAAiB,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI;AAClF,CAAA;AAED;MACa,+BAA+B,CAAA;IAC1C,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI;IACb;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}