@newheap/platform-ai-chat 0.16.0 → 0.17.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-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-sse-parser.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-transport.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-api.service.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-live.service.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-errors.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-mcp-authorization.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-mcp-connect.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-push.service.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-files.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/i18n/nh-assistant-error-codes.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-mcp-connections.component.ts","../../../projects/nh-ai-chat/src/lib/components/preferences/nh-assistant-mcp-connections.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/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/connection-required/nh-assistant-connection-required.component.ts","../../../projects/nh-ai-chat/src/lib/components/connection-required/nh-assistant-connection-required.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/lib/internal/nh-assistant-picker.component.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-picker.component.html","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-subject-link.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 * What people may attach to a message to this agent; `null` or missing when they can attach\n * nothing: the application keeps no files for the assistant, accepts no uploads, or the agent\n * accepts no files.\n */\n uploads?: AgentUploads | null;\n}\n\n/** What people may upload with `POST conversations/{id}/files` and attach to one message to an agent. */\nexport interface AgentUploads {\n /** Lowercase media types, for example `application/pdf`. */\n acceptedMediaTypes: string[];\n /** The largest file in bytes. */\n maxFileBytes: number;\n /** The most files of one message. */\n maxFiles: number;\n}\n\n/**\n * A file the application keeps, as the upload endpoint returns it and a message names it in\n * `files`. It never carries content.\n */\nexport interface FileReference {\n id: string;\n name: string;\n mediaType: string;\n size: number;\n /** The application's hash of the content, when it keeps one. */\n hash?: string | null;\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 /** The name of the subject type in the caller's language, when the application named it. */\n subjectTypeName?: string | null;\n /** Where the application shows the subject, when the type has a link template. */\n subjectLink?: string | null;\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 /**\n * Who wrote the message: a person or a trigger of an agent for user messages, `rule` for the\n * summary an agent's rules wrote instead of the model; missing on old servers.\n */\n authorKind?: MessageAuthorKind | null;\n}\n\n/**\n * `person` for a message a person wrote; `trigger` for one a trigger wrote into an agent thread;\n * `rule` for an assistant message the agent's rules wrote without a model.\n */\nexport type MessageAuthorKind = 'person' | 'trigger' | 'rule';\n\nexport type MessagePart = TextPart | ToolCallPart | ApprovalPart | ConnectionRequiredPart | FilePart;\n\n/**\n * A file a person attached to a message: its name, media type and size in bytes, never its content.\n * The application keeps the file; a later turn opens it again with the rights of that turn.\n */\nexport interface FilePart {\n type: 'file';\n name: string;\n mediaType: string;\n size: number;\n}\n\n/**\n * Why a turn asks the person to connect an MCP server: never connected, the connection ended, or\n * the server asked for permissions the connection lacks.\n */\nexport type ConnectionRequiredReason = 'not-connected' | 'reauthorization-required' | 'insufficient-scope';\n\n/**\n * An MCP server, which each person connects to with their own account, that the person who asked had\n * to connect before the agent could use it. The turn went on without its tools; the card connects\n * the viewer's own account.\n */\nexport interface ConnectionRequiredPart {\n type: 'connection-required';\n serverId: string;\n displayName: string;\n reason: ConnectionRequiredReason;\n}\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 /**\n * `delegated`, `agent` or `delegated-read` when an agent used rights beyond the caller's own:\n * the initiator's, its own grant, or a person's through a gateway read.\n */\n grantSource?: 'delegated' | 'agent' | 'delegated-read' | 'accountable' | null;\n /** The result came from rights this viewer does not have and is shielded from them. */\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\n/**\n * Why a stale proposal no longer fits: the work was already done another way, what it was based on\n * changed, or it no longer applies.\n */\nexport type StaleKind = 'already-done' | 'changed' | 'not-applicable';\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 /** Why a stale proposal no longer fits. Only sent for stale proposals; missing on older servers. */\n staleKind?: StaleKind;\n /** The application's explanation of a stale proposal in the reader's language, such as who did the work. */\n staleExplanation?: string;\n /** Why the agent's rules proposed it, in the reader's language. Only sent for rule proposals. */\n rationale?: string;\n /** The newer proposal for the same objects that replaced this withdrawn one. Only sent then. */\n supersededByApprovalId?: string;\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 /** Files the person attaches, as `POST conversations/{id}/files` returned them. */\n files?: FileReference[];\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 { AgentTriggerReceipt } from './assistant-agent-run.models';\nimport { ApprovalPart, ConnectionRequiredReason } 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\n/** The person who asked has to connect an MCP server before the agent can use it. */\nexport interface ConnectionRequiredEvent {\n serverId: string;\n displayName: string;\n reason: ConnectionRequiredReason;\n}\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/**\n * The server accepted a message for the next run of the agent that works in the thread, with its\n * files, instead of starting a turn: it answered `202` with the trigger receipt. The client emits it\n * in place of a stream, which then ends; a server never streams it.\n */\nexport type MessageQueuedEvent = AgentTriggerReceipt;\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 'connection.required': ConnectionRequiredEvent;\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\n/**\n * What `NhAssistantApiService.sendMessage` emits: the events of the turn it started, or, when the\n * message waits for the next run of the agent working in the thread, one `message.queued` event.\n */\nexport type NhAssistantMessageEvent = NhAssistantSseEvent | { type: 'message.queued'; data: MessageQueuedEvent };\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 'connection.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 /** The person closed the authorization window of an MCP connection before it finished. */\n mcpAuthorizationCancelled: 'assistant-mcp-authorization-cancelled',\n /** The browser blocked the authorization window of an MCP connection. */\n mcpPopupBlocked: 'assistant-mcp-popup-blocked'\n} as const;\n\nexport type NhAssistantClientErrorCode = typeof NhAssistantClientErrorCodes[keyof typeof NhAssistantClientErrorCodes];\n","import { ApprovalPresentation, StaleKind } 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' | 'delegated-read' | 'accountable';\n\n/**\n * How a run worked: `model` through the language model, `rule` through the agent's rules without a\n * model, `rule-then-model` when the rules handed the run over to the model.\n */\nexport type AgentRunKind = 'model' | 'rule' | 'rule-then-model';\n\n/**\n * Who chose the skill a run worked in; `follow-up` continues in the skill of the run whose\n * proposal people decided.\n */\nexport type AgentSkillChooser = 'trigger' | 'rules' | 'triage' | 'model' | 'follow-up';\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 /** How the run worked. Missing on older servers, which only ran the model. */\n kind?: AgentRunKind;\n /** The skill of the agent the run worked in; missing or null for the agent's own tools. */\n skill?: string | null;\n skillChosenBy?: AgentSkillChooser | null;\n /** The version of a skill defined as data the run worked in; absent for a skill in code. */\n skillVersion?: number | null;\n /** The run evaluated a candidate version of its skill in the shadow thread. */\n skillCandidate?: boolean;\n /** The agent that handed the run's work off; missing or null for a run no agent asked for. */\n requestedByAgentId?: string | null;\n /**\n * The thread of the run that handed the work off, only in a thread's run list and only when the\n * reader may open it.\n */\n requestedByConversationId?: string | null;\n /** How many hand-offs led to the run; 0 or missing for a run no agent asked for. */\n handOffDepth?: number;\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 * The thread holds the agent's shadow work about the subject: only administrators see it,\n * nobody is notified and nothing proposed in it executes.\n */\n shadow?: boolean;\n /**\n * The name of the subject type in the caller's language, such as \"Project\", when the application\n * named the type; `null` or missing otherwise.\n */\n subjectTypeName?: string | null;\n /**\n * Where the application shows the subject, from the type's link template; `null` or missing\n * without one. `provideNhAssistant({ subjectLinks })` may replace it with a router link.\n */\n subjectLink?: string | null;\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 /**\n * The agent's name: a translation key for an agent in code, the text itself for an agent created in\n * the administration. It names an agent kept out of the chat as well, which the status does not list;\n * missing from servers before it was added.\n */\n displayNameKey?: string | null;\n thread: AgentThread | null;\n canStart: boolean;\n /**\n * For administrators, the agent's shadow thread about the subject while the agent or one of its\n * skills works in shadow; missing or `null` otherwise.\n */\n shadowThread?: AgentThread | null;\n}\n\n/**\n * A proposal on a subject with the caller's live decision right. Only a pending proposal can be\n * decided; for every other status `canDecide` is `false` and `reasonCode` is `null`.\n */\nexport interface AgentSubjectWorkProposal extends AgentProposalDecisionRight {\n proposal: AgentProposal;\n}\n\n/** The most proposals one `POST approvals/lookup` reads. */\nexport const NH_ASSISTANT_MAX_PROPOSAL_LOOKUP = 100;\n\n/**\n * Response of `POST approvals/lookup`: the requested proposals the caller may see, in the order of\n * the request. Ids the caller may not see, or that do not exist, are left out.\n */\nexport interface AgentProposalLookup {\n items: AgentSubjectWorkProposal[];\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 /**\n * The name of the subject type in the caller's language, such as \"Project\", when the application\n * named the type; `null` or missing otherwise.\n */\n subjectTypeName?: string | null;\n /**\n * Where the application shows the subject, from the type's link template; `null` or missing\n * without one. `provideNhAssistant({ subjectLinks })` may replace it with a router link.\n */\n subjectLink?: 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\n/** One subject a search found (`GET subjects/{type}/search`). */\nexport interface AgentSubjectSearchResult {\n type: string;\n id: string;\n /** The name the application gives the subject; show the id without one. */\n displayName: string | null;\n /** The subject's isolation key: `tenant:…`, `division:…` or `global`. */\n scopeKey: string;\n divisionId: string | null;\n /** Where the application shows the subject; `null` without a link template. */\n link?: string | null;\n}\n\n/** The subjects of one type a search found that the caller may read, in the application's order. */\nexport interface AgentSubjectSearch {\n subjectType: string;\n items: AgentSubjectSearchResult[];\n}\n\n/** The shortest and longest text `searchSubjects` accepts, and the most results it returns. */\nexport const NH_ASSISTANT_SUBJECT_SEARCH = { minQueryLength: 2, maxQueryLength: 100, maxLimit: 50 } as const;\n\n/** The platform's subject type of the whole application, which the server registers itself. */\nexport const NH_ASSISTANT_SYSTEM_SUBJECT_TYPE = 'nh-system';\n\n/** The whole application as one subject, for an agent that works app-wide. */\nexport const NH_ASSISTANT_SYSTEM_GLOBAL_ID = 'global';\n\n/** The most characters of a run's result that `getObjectAgents` returns for its latest run. */\nexport const NH_ASSISTANT_RESULT_PREVIEW_LENGTH = 300;\n\n/** The newest run of an agent on a subject, with the beginning of its result. */\nexport interface AgentLatestRun {\n runId: string;\n conversationId: string;\n triggerId: string;\n status: AgentRunStatus;\n failureCode: string | null;\n /** When the run ended, or started, or was queued. */\n at: string;\n /**\n * The first `NH_ASSISTANT_RESULT_PREVIEW_LENGTH` characters of the run's stored answer: model\n * output, to show as text. For a run without one, such as a run that ended before runs kept their\n * answer, the summary it ended with; `null` while the run has none. `getRunResult` returns all of it.\n */\n result: string | null;\n /** The result is longer than `result`. */\n resultTruncated: boolean;\n /** The run worked in the agent's shadow thread, which only administrators see. */\n shadow: boolean;\n}\n\n/** One agent that works on a subject, as `getObjectAgents` lists it. */\nexport interface AgentObjectAgent {\n agentId: string;\n /** A translation key for an agent in code, the text itself for one created in the administration. */\n displayNameKey: string;\n descriptionKey: string;\n /** Whether the caller may run the agent on the subject now. */\n canStart: boolean;\n /** The agent's thread about the subject that people open; `null` before it worked on it. */\n conversationId: string | null;\n /** The agent's newest run on the subject; `null` before its first. */\n latestRun: AgentLatestRun | null;\n /** The agent's proposals on the subject that wait for a decision. */\n openProposals: number;\n}\n\n/**\n * The agents that work on one subject and that the caller may use (`GET subjects/{type}/{id}/agents`),\n * ordered by id. The subject is an object or the whole application.\n */\nexport interface AgentObjectAgents {\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n subjectTypeName?: string | null;\n subjectLink?: 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: AgentObjectAgent[];\n}\n\n/** The most characters of a run's answer that `getRunResult` returns; a longer answer is cut. */\nexport const NH_ASSISTANT_RUN_RESULT_MAX_LENGTH = 20_000;\n\n/** The most runs one page of a run history holds. */\nexport const NH_ASSISTANT_RUN_HISTORY_MAX_PAGE = 50;\n\n/**\n * Which runs a run history lists. Every part is optional: an agent, a subject type (`nh-system` for\n * the whole application) or one subject of it, a status, and a period by when runs were created\n * (`from` inclusive, `to` exclusive, ISO 8601). `page` starts at 1; `itemsPerPage` is 1 to\n * `NH_ASSISTANT_RUN_HISTORY_MAX_PAGE` (default 20).\n */\nexport interface AgentRunFilter {\n agentId?: string;\n subjectType?: string;\n subjectId?: string;\n status?: AgentRunStatus;\n from?: string;\n to?: string;\n page?: number;\n itemsPerPage?: number;\n}\n\n/**\n * A personal MCP server a background run left out, and why: `assistant-mcp-consent-required` (the\n * person has not allowed background use), `assistant-mcp-connection-required` or\n * `assistant-mcp-reauthorization-required` (the person's connection is missing or ended), or\n * `assistant-mcp-initiator-only` (the run acted for someone other than the person who asked). The\n * person whose consent or connection is missing is told once a day.\n */\nexport interface AgentRunMcpSkip {\n serverId: string;\n /** The server's name when the run left it out. */\n serverDisplayName: string;\n code: string;\n}\n\n/** One run in a run history: its agent, subject, trigger, status, usage, times and result preview. */\nexport interface AgentRunHistoryItem {\n id: string;\n conversationId: string;\n agentId: string;\n /**\n * The agent's name: a translation key for an agent in code, the text itself for one created in the\n * administration; `null` for an agent that no longer exists.\n */\n agentDisplayNameKey?: string | null;\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n subjectTypeName?: string | null;\n subjectLink?: string | null;\n triggerId: string;\n status: AgentRunStatus;\n failureClass: string | null;\n failureCode: string | null;\n kind: AgentRunKind;\n skill: string | null;\n initiatorActorId: string | null;\n toolCalls: number;\n modelCalls: number;\n inputTokens: number;\n outputTokens: number;\n proposalCount: number;\n /**\n * The first `NH_ASSISTANT_RESULT_PREVIEW_LENGTH` characters of the run's answer, model output to\n * show as text; for a run without a stored answer, the summary it ended with.\n */\n result: string | null;\n /** The answer is longer than `result`. */\n resultTruncated: boolean;\n /** The run worked in the agent's shadow thread: nothing it proposed executes. */\n shadow: boolean;\n createdAt: string;\n startedAt: string | null;\n endedAt: string | null;\n /** The personal MCP servers the run left out; missing on older servers. */\n mcpConnectionSkips?: AgentRunMcpSkip[];\n}\n\n/**\n * A page of a run history, newest first (`getRunHistory` for people, the administration's\n * `getAgentRuns` for every run of an agent).\n */\nexport interface AgentRunHistory {\n items: AgentRunHistoryItem[];\n /** The runs that match the filter and that the caller may see. */\n total: number;\n /**\n * People's history considered only the agent threads with the most recent matching runs; a\n * narrower filter, such as one object or a period, reaches older ones.\n */\n limited: boolean;\n}\n\n/** One run with its whole result, its proposals and its files (`getRunResult`). */\nexport interface AgentRunResult {\n run: AgentRunHistoryItem;\n /**\n * The run's whole answer as Markdown, at most `NH_ASSISTANT_RUN_RESULT_MAX_LENGTH` characters:\n * model output, untrusted. Render it only with the assistant's safe Markdown rendering\n * (`nh-assistant-run-result` does), never as HTML. `null` while the run has none.\n */\n result: string | null;\n /** The answer was longer and `result` is its beginning. */\n resultTruncated: boolean;\n /** The bounded summary the run ended with, which the agent's next runs start from. */\n summary: string | null;\n /** The proposals the caller may see: in the run's own thread and placed at objects the caller reads. */\n proposals: AgentProposal[];\n /** The proposals the run placed at objects the caller may not read. */\n hiddenProposals: number;\n /** The files the run saved; `restricted` ones cannot be downloaded by the caller. */\n artifacts: AgentArtifact[];\n /** Whether the caller may open the run's thread conversation. */\n canOpenConversation: boolean;\n}\n\nexport interface StartAgentRequest {\n agentId: string;\n subjectType: string;\n subjectId: string;\n message?: string | null;\n}\n\n/**\n * What became of a start by hand (`POST threads/start`, `POST runs/{id}/retry` with `restart`):\n * `started`, `queued`, `coalesced` with a run about to start, `superseded` the current run,\n * `ignored` or `deduplicated`; `waiting` while the agent or its skill is paused (`reasonCode`\n * `assistant-agent-paused` or `assistant-skill-paused`), so the run starts when it resumes; and\n * `deferred` until the application's transaction commits, without a run or thread yet. A refused\n * start is an HTTP error with its code, never a receipt.\n */\nexport type AgentTriggerOutcome =\n | 'started'\n | 'queued'\n | 'coalesced'\n | 'superseded'\n | 'ignored'\n | 'deduplicated'\n | 'waiting'\n | 'deferred';\n\nexport interface AgentTriggerReceipt {\n triggerId: string;\n outcome: AgentTriggerOutcome;\n runId: string | null;\n conversationId: string | null;\n /** Why the run did not start yet, such as `assistant-agent-paused` with `waiting`; `null` otherwise. */\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 /**\n * The name of the subject type in the caller's language, such as \"Project\", when the application\n * named the type; `null` or missing otherwise.\n */\n subjectTypeName?: string | null;\n /**\n * Where the application shows the subject, from the type's link template; `null` or missing\n * without one. `provideNhAssistant({ subjectLinks })` may replace it with a router link.\n */\n subjectLink?: 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 * Why a stale proposal no longer fits; `null` for other statuses. Its reason code is\n * `executionResultCode`. Missing on older servers.\n */\n staleKind?: StaleKind | null;\n /**\n * The application's explanation of a stale proposal in the caller's language, such as who already\n * did the work; `null` when it gave none. Missing on older servers.\n */\n staleExplanation?: string | null;\n /**\n * Who made the proposal stale, when the application's guard named them; `null` otherwise.\n * Missing on older servers.\n */\n staleByActorId?: string | null;\n /** The name of `staleByActorId` from the subject's member snapshot; `null` when unknown. */\n staleByDisplayName?: string | null;\n /**\n * The application objects the proposal changes, as its guards named them, so lists can group\n * proposals by object. `targets` holds execution scopes instead. Missing on older servers.\n */\n objects?: AgentProposalObject[];\n /**\n * The newer proposal for the same objects that replaced this withdrawn one; `null` otherwise.\n * Missing on older servers.\n */\n supersededByApprovalId?: string | null;\n /**\n * Why the agent's rules proposed it, in the caller's language; `null` for proposals of the model.\n * Missing on older servers.\n */\n rationale?: string | null;\n /**\n * The run that placed this proposal here from another subject, such as a run for the whole\n * application; `null` for a proposal made in this thread. Missing on older servers.\n */\n placedBy?: AgentProposalOrigin | null;\n}\n\n/**\n * The run that placed a proposal at another object than its own, and the thread it ran in. Its subject\n * is named only for the whole application (`subjectType` `nh-system`); for another object only its kind\n * is known, because a reader of this object may not read that one.\n */\nexport interface AgentProposalOrigin {\n /** The thread of the run that placed the proposal; opening it checks the reader's access. */\n conversationId: string;\n runId: string | null;\n /** The run's subject type; `null` when its thread no longer exists. */\n subjectType: string | null;\n /** The run's subject id for the whole application (`global` or `division-…`); `null` otherwise. */\n subjectId?: string | null;\n /** The name of the whole application or its division in the caller's language; `null` otherwise. */\n subjectDisplayName?: string | null;\n /** The name of the run's subject type in the caller's language, when the application named it. */\n subjectTypeName?: string | null;\n}\n\n/** An application object a proposal changes, such as `{ type: 'project-task', id: '4711' }`. */\nexport interface AgentProposalObject {\n type: string;\n id: string;\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\n/** A board of a group of agents the caller may open (`getBoards`). */\nexport interface AgentBoardSummary {\n /** The group id, such as `project-management`. */\n id: string;\n /** The group's name in the request's language. */\n name: string;\n /** What the group's agents do, when the application described it. */\n description: string | null;\n /** How many of the group's agents the caller sees on its board. */\n agentCount: number;\n}\n\n/** The boards the caller may open, ordered by name. */\nexport interface AgentBoardList {\n items: AgentBoardSummary[];\n}\n\n/** A kind of object as a board names it. */\nexport interface AgentBoardSubjectType {\n id: string;\n /** The name of one object in the request's language; the id without a name. */\n name: string;\n /** The name of several objects, when the application gave one. */\n pluralName: string | null;\n}\n\n/** What an agent on a board works on. */\nexport interface AgentBoardWorksOn {\n /** Every kind of object. */\n allObjects: boolean;\n /** The whole application. */\n application: boolean;\n /** Per division instead of app-wide. */\n perDivision: boolean;\n /** The kinds of objects it names, by id. */\n subjectTypes: AgentBoardSubjectType[];\n}\n\n/** One agent on a board. */\nexport interface AgentBoardAgent {\n agentId: string;\n /** A translation key for an agent in code, the text itself for one created in the administration. */\n displayNameKey: string;\n descriptionKey: string;\n worksOn: AgentBoardWorksOn;\n /**\n * `nh-system` when the agent works on the whole application in the board's scope; `null` for an\n * agent without such work there, which the board shows without a result or a start.\n */\n subjectType: string | null;\n /** `global` for an app-wide agent, `division-…` for a per-division agent on a division's board. */\n subjectId: string | null;\n /** The name of that subject in the request's language. */\n subjectDisplayName: string | null;\n /** Whether the caller may run the agent for that subject now. */\n canStart: boolean;\n /** The agent's thread of that subject, when the caller may open it. */\n conversationId: string | null;\n /** The agent's newest run for that subject; `null` before its first. */\n latestRun: AgentLatestRun | null;\n /** The open proposals of that thread. */\n openProposals: number;\n /**\n * Whether the latest run ended, or a proposal was made, after the caller's last visit of the board\n * in this scope; before the first visit everything shown is new.\n */\n isNew: boolean;\n}\n\n/** The board of one group in one scope (`getBoard`). */\nexport interface AgentBoard {\n id: string;\n name: string;\n description: string | null;\n /** `global`, or `division:{id}` for the board of one division. */\n scopeKey: string;\n divisionId: string | null;\n /** When the caller last looked at this board in this scope, before this read; `null` before the first visit. */\n lastVisitedAt: string | null;\n /** The group's agents the caller sees, ordered by id. */\n agents: AgentBoardAgent[];\n}\n\n/** A recorded visit of a board (`visitBoard`). */\nexport interface AgentBoardVisit {\n groupId: string;\n scopeKey: string;\n visitedAt: string;\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 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 * Replaces the server's links to subjects, which come from the link template of the subject type\n * (`AddSubjectType(...).OpenAt(\"/projects/{id}\")`), with the host's own routes, per subject type:\n * for example `{ project: subject => ['/projects', subject.id] }`. Return router commands or a URL\n * within the application, `null` to show no link, or `undefined` to keep the server's link.\n * Runs in the assistant's injection context. Default: the server's links.\n */\n subjectLinks?: Record<string, NhAssistantSubjectLinkBuilder>;\n /**\n * How MCP authorizations open. `popup` (default) opens a window from the click and stays on the\n * page. `redirect` sends the page to the authorization server and back to `mcpConnectReturnUrl`,\n * where the assistant completes the connection; its origin must be in\n * `NewHeap:AI:Assistant:Mcp:OAuth:ReturnOrigins`.\n */\n mcpConnectMode?: 'popup' | 'redirect';\n /** The page a redirect-mode authorization returns to. Default: the current address without its fragment. */\n mcpConnectReturnUrl?: () => string;\n}\n\n/** A subject an agent works on, by its type and id. */\nexport interface NhAssistantSubjectRef {\n type: string;\n id: string;\n}\n\n/**\n * Builds the link to one subject in the host application: router commands such as\n * `['/projects', subject.id]`, a URL such as `/projects/7`, `null` for no link, or `undefined` to keep\n * the server's link.\n */\nexport type NhAssistantSubjectLinkBuilder = (subject: NhAssistantSubjectRef) => readonly unknown[] | string | null | undefined;\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/** One file upload of the assistant client, which reports how much of the body was sent. */\nexport interface NhAssistantUploadRequest {\n url: string;\n /** The request headers; never `Content-Type`, which the browser sets with the multipart boundary. */\n headers: Record<string, string>;\n body: FormData;\n signal: AbortSignal;\n /** Called while the body is sent, with the bytes sent so far and the total. */\n onProgress: (loaded: number, total: number) => void;\n}\n\n/** Sends an upload and resolves with the server's response; rejects when the request did not reach the server. */\nexport type NhAssistantUpload = (request: NhAssistantUploadRequest) => Promise<Response>;\n\n/**\n * Sends the uploads of the assistant client. The default uses `XMLHttpRequest`, because `fetch` does\n * not report upload progress. The mock API from `@newheap/platform-ai-chat/testing` replaces it.\n */\nexport const NH_ASSISTANT_UPLOAD = new InjectionToken<NhAssistantUpload>('NH_ASSISTANT_UPLOAD', {\n providedIn: 'root',\n factory: () => nhAssistantXhrUpload\n});\n\n/** The default upload: `XMLHttpRequest` with upload progress, answered as a `Response`. */\nexport function nhAssistantXhrUpload(request: NhAssistantUploadRequest): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n if (request.signal.aborted) {\n reject(new DOMException('The upload was aborted.', 'AbortError'));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n const abort = () => xhr.abort();\n request.signal.addEventListener('abort', abort, { once: true });\n const finish = () => request.signal.removeEventListener('abort', abort);\n\n xhr.open('POST', request.url);\n for (const [name, value] of Object.entries(request.headers)) {\n xhr.setRequestHeader(name, value);\n }\n xhr.upload.onprogress = event => {\n if (event.lengthComputable) {\n request.onProgress(event.loaded, event.total);\n }\n };\n xhr.onload = () => {\n finish();\n const contentType = xhr.getResponseHeader('content-type');\n resolve(new Response(xhr.status === 204 ? null : xhr.responseText, {\n status: xhr.status,\n headers: contentType ? { 'content-type': contentType } : {}\n }));\n };\n xhr.onerror = () => {\n finish();\n reject(new TypeError('The upload did not reach the server.'));\n };\n xhr.onabort = () => {\n finish();\n reject(new DOMException('The upload was aborted.', 'AbortError'));\n };\n xhr.send(request.body);\n });\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\n/**\n * The bundle of a language: its own, else that of its base language, so a regional tag such as\n * `nl-NL`, `nl_BE` or `en-GB` gets the `nl` or `en` texts, else English.\n */\nfunction bundleOf(language: string): TranslationTree {\n for (const candidate of [language, language.split(/[-_]/)[0]].map(tag => tag.toLowerCase())) {\n if (Object.hasOwn(NH_ASSISTANT_TRANSLATIONS, candidate)) {\n return NH_ASSISTANT_TRANSLATIONS[candidate as keyof typeof NH_ASSISTANT_TRANSLATIONS] as TranslationTree;\n }\n }\n return NH_ASSISTANT_TRANSLATIONS.en as TranslationTree;\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. A regional language such as `nl-NL` receives the texts of its base\n * language; 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 bundleRoot = bundleOf(language)[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","/** 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 { 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, NH_ASSISTANT_UPLOAD, NhAssistantConfig } from '../nh-assistant.config';\n\n/**\n * The request header every upload carries. A browser cannot send it with a cross-site form, so the\n * upload endpoint keeps the posture of the JSON endpoints.\n */\nexport const NH_ASSISTANT_UPLOAD_HEADER = 'X-NH-Assistant-Upload';\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 * The field errors of the error body, whatever its code (for example `assistant-validation` or\n * `assistant-run-filter-invalid`): camelCase field names, dotted for nested settings such as\n * `oauth.clientId`, with stable values such as `required`, `invalid`, `too-long` or `not-found`.\n * Empty when the body names none.\n */\n readonly fieldErrors: Readonly<Record<string, readonly 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}$/;\nconst safeField = /^[a-zA-Z][a-zA-Z0-9.]{0,63}$/;\n/** A field of one item of a list, such as `readers[0].toolName`. */\nconst safeItemField = /^[a-zA-Z][a-zA-Z0-9]{0,31}\\[\\d{1,4}\\](\\.[a-zA-Z][a-zA-Z0-9]{0,31})?$/;\n\n/**\n * Whether a value the server or a callback page sent is a code the library may show: lowercase\n * letters, digits, dots and dashes, at most 80 characters. Every reader of untrusted codes uses this\n * one check, so a code never carries free text into a translation key.\n */\nexport function nhAssistantIsSafeCode(value: unknown): value is string {\n return typeof value === 'string' && safeCode.test(value);\n}\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 uploadFn = inject(NH_ASSISTANT_UPLOAD);\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 * Uploads `form` with progress and resolves with the parsed JSON answer. Rejects with\n * `NhAssistantApiError`, never with raw text: the code of a refused upload's error body, the\n * generic status mapping without one and `assistant-network` when it did not reach the server.\n * An aborted upload rejects with an `AbortError`.\n */\n async upload<T>(path: string, form: FormData, onProgress: (loaded: number, total: number) => void, signal: AbortSignal): Promise<T> {\n const headers = await this.headers('application/json');\n headers[NH_ASSISTANT_UPLOAD_HEADER] = '1';\n let response: Response;\n try {\n response = await this.uploadFn({ url: this.url(path), headers, body: form, signal, onProgress });\n } catch (error) {\n if (signal.aborted) {\n throw error;\n }\n throw createApiError(0, nhAssistantCodeForStatus(0));\n }\n\n if (!response.ok) {\n const failure = await this.failure(response, {});\n throw createApiError(response.status, failure.code, failure.fieldErrors);\n }\n\n try {\n return JSON.parse(await response.text()) as T;\n } catch {\n throw createApiError(response.status, NhAssistantClientErrorCodes.invalidResponse);\n }\n }\n\n /**\n * Downloads a file of the assistant API. Rejects with `NhAssistantApiError`, never with raw text:\n * the code and field errors of a refused request's error body (whatever its content type), the\n * endpoint's status mapping without one, `assistant-network` when the request did not reach the\n * server and `assistant-stream-interrupted` when the file broke off while it was read.\n */\n async download(path: string, accept: string, statusCodes: NhAssistantStatusCodes = {}): Promise<Blob> {\n let response: Response;\n try {\n response = await this.fetch('GET', path, accept, undefined, new AbortController().signal);\n } catch {\n throw createApiError(0, nhAssistantCodeForStatus(0));\n }\n\n if (!response.ok) {\n const failure = await this.failure(response, statusCodes);\n throw createApiError(response.status, failure.code, failure.fieldErrors);\n }\n\n try {\n return await response.blob();\n } catch {\n throw createApiError(response.status, NhAssistantClientErrorCodes.streamInterrupted);\n }\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 return (await this.failure(response, statusCodes)).code;\n }\n\n /**\n * The failure code of a response and the field errors of its body, both checked against safe\n * patterns. Response text is never used.\n */\n private async failure(\n response: Response,\n statusCodes: NhAssistantStatusCodes\n ): Promise<{ code: string; fieldErrors: Record<string, string[]> }> {\n const fieldErrors: Record<string, string[]> = {};\n try {\n const text = await response.text();\n const body = text.length > 0 ? JSON.parse(text) as unknown : null;\n const record = body && typeof body === 'object' ? body as Record<string, unknown> : null;\n const errors = record?.['errors'];\n if (errors && typeof errors === 'object' && !Array.isArray(errors)) {\n for (const [field, values] of Object.entries(errors as Record<string, unknown>)) {\n const safe = Array.isArray(values) ? values.filter(nhAssistantIsSafeCode) : [];\n if ((safeField.test(field) || safeItemField.test(field)) && safe.length > 0) {\n fieldErrors[field] = safe;\n }\n }\n }\n const code = record?.['code'];\n if (nhAssistantIsSafeCode(code)) {\n return { code, fieldErrors };\n }\n } catch {\n // A non-JSON error body carries no code.\n }\n\n return { code: statusCodes[response.status] ?? nhAssistantCodeForStatus(response.status), fieldErrors };\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 failure = await this.failure(response, statusCodes);\n subscriber.error(createApiError(response.status, failure.code, failure.fieldErrors));\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 = await this.headers(accept);\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 /** The host's extra headers, `Accept`, the bearer token and the current language. */\n private async headers(accept: string): Promise<Record<string, string>> {\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 return headers;\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, fieldErrors: Record<string, string[]> = {}): NhAssistantApiError {\n return new NhAssistantApiError(status, code, nhAssistantErrorMessageKey(code), fieldErrors);\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, Subscriber } from 'rxjs';\nimport {\n AssistantPreferences,\n McpAuthorizationStart,\n McpAuthorizeRequest,\n McpCompleteRequest,\n McpCompletion,\n McpConnection,\n UpdateMcpConnectionRequest\n} from '../models/assistant-admin.models';\nimport { AgentTriggerOutcome, AgentTriggerReceipt } from '../models/assistant-agent-run.models';\nimport {\n AgentSummary,\n AssistantStatus,\n Conversation,\n ConversationPage,\n CreateConversationRequest,\n DecideApprovalRequest,\n DirectoryEntry,\n FileReference,\n NotificationSettings,\n PushSubscriptionRequest,\n SendMessageRequest,\n ShareLink\n} from '../models/assistant-api.models';\nimport {\n NH_ASSISTANT_SSE_EVENT_TYPES,\n NhAssistantClientErrorCodes,\n NhAssistantMessageEvent,\n NhAssistantSseEvent,\n NhAssistantSseEventType\n} from '../models/assistant-sse.models';\nimport { NhAssistantSseParser } from './nh-assistant-sse-parser';\nimport { NhAssistantTransport, nhAssistantErrorMessageKey, nhAssistantIsSafeCode } from './nh-assistant-transport';\n\nexport {\n NH_ASSISTANT_UPLOAD_HEADER,\n NhAssistantApiError,\n nhAssistantCodeForStatus,\n nhAssistantErrorMessageKey\n} from './nh-assistant-transport';\n\nconst knownEventTypes = new Set<string>(NH_ASSISTANT_SSE_EVENT_TYPES);\n\n/** The outcomes of a trigger receipt with which the next run takes a waiting message. */\nconst queuedOutcomes = new Set<string>(['started', 'queued', 'coalesced', 'superseded', 'waiting', 'deferred'] satisfies AgentTriggerOutcome[]);\n\n/** The progress of one upload, then the file the application stored. */\nexport type NhAssistantUploadEvent =\n | { type: 'progress'; loaded: number; total: number }\n | { type: 'uploaded'; file: FileReference };\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<NhAssistantMessageEvent> {\n return this.requestStream(`conversations/${encodeURIComponent(conversationId)}/messages`, request, true);\n }\n\n /**\n * Uploads one file to a conversation as `multipart/form-data` (`POST conversations/{id}/files`):\n * emits the progress while the file is sent and then the stored file, whose reference a message\n * carries in `files`. Fails with `NhAssistantApiError`; unsubscribing aborts the upload. The\n * media type of `file` is the one the upload declares.\n */\n uploadFile(conversationId: string, file: Blob, name: string): Observable<NhAssistantUploadEvent> {\n return new Observable<NhAssistantUploadEvent>(subscriber => {\n const abort = new AbortController();\n const form = new FormData();\n form.append('file', file, name);\n\n this.transport.upload<FileReference>(\n `conversations/${encodeURIComponent(conversationId)}/files`,\n form,\n (loaded, total) => subscriber.next({ type: 'progress', loaded, total }),\n abort.signal\n ).then(\n reference => {\n subscriber.next({ type: 'uploaded', file: reference });\n subscriber.complete();\n },\n error => {\n if (!abort.signal.aborted) {\n subscriber.error(error);\n }\n }\n );\n\n return () => abort.abort();\n });\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, false);\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 /** MCP servers that agents may use in background runs with the caller's own account. */\n getMcpConnections(): Observable<McpConnection[]> {\n return this.transport.json<McpConnection[]>('GET', 'mcp-connections');\n }\n\n /** Allows or withdraws background use of an MCP server with the caller's own account. */\n updateMcpConnection(serverId: string, request: UpdateMcpConnectionRequest): Observable<McpConnection> {\n return this.transport.json<McpConnection>('PUT', `mcp-connections/${encodeURIComponent(serverId)}`, request);\n }\n\n /**\n * Starts the caller's authorization of a server each person connects to. Prefer\n * `NhAssistantMcpConnectService.connect`, which opens and completes it.\n */\n authorizeMcpConnection(serverId: string, request: McpAuthorizeRequest = {}): Observable<McpAuthorizationStart> {\n return this.transport.json<McpAuthorizationStart>('POST', `mcp-connections/${encodeURIComponent(serverId)}/authorize`, request);\n }\n\n /** Removes the caller's own connection of a server and revokes its tokens. */\n disconnectMcpConnection(serverId: string): Observable<void> {\n return this.transport.json<void>('DELETE', `mcp-connections/${encodeURIComponent(serverId)}`);\n }\n\n /** Activates the connection of an authorization the caller started, with the callback's completion code. */\n completeMcpAuthorization(request: McpCompleteRequest): Observable<McpCompletion> {\n return this.transport.json<McpCompletion>('POST', 'mcp-connections/complete', request);\n }\n\n /**\n * Streams a turn. With `queuedReceipt` a `202` answer with a trigger receipt becomes\n * `message.queued`; without it, a stream is required.\n */\n private requestStream(path: string, body: unknown, queuedReceipt: true): Observable<NhAssistantMessageEvent>;\n private requestStream(path: string, body: unknown, queuedReceipt: false): Observable<NhAssistantSseEvent>;\n private requestStream(path: string, body: unknown, queuedReceipt: boolean): Observable<NhAssistantMessageEvent> {\n return new Observable<NhAssistantMessageEvent>(subscriber => {\n const abort = new AbortController();\n\n void this.executeStream(path, body, queuedReceipt, abort.signal, subscriber);\n\n return () => abort.abort();\n });\n }\n\n private async executeStream(\n path: string,\n body: unknown,\n queuedReceipt: boolean,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantMessageEvent>\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 if (queuedReceipt && response.status === 202) {\n await this.readQueuedReceipt(response, signal, subscriber);\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 /**\n * A message to an agent's thread whose run works waits for the next run: the server answers `202`\n * with the trigger receipt instead of a stream. A receipt the run takes the message with becomes\n * `message.queued`; one that refused it becomes an `error` with its code.\n */\n private async readQueuedReceipt(\n response: Response,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantMessageEvent>\n ): Promise<void> {\n let receipt: AgentTriggerReceipt | null;\n try {\n receipt = JSON.parse(await response.text()) as AgentTriggerReceipt | null;\n } catch {\n receipt = null;\n }\n if (signal.aborted || subscriber.closed) {\n return;\n }\n if (!receipt || typeof receipt.outcome !== 'string') {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.invalidResponse);\n return;\n }\n if (!queuedOutcomes.has(receipt.outcome)) {\n this.emitClientError(\n subscriber,\n signal,\n nhAssistantIsSafeCode(receipt.reasonCode) ? receipt.reasonCode : NhAssistantClientErrorCodes.conversationBusy);\n return;\n }\n\n subscriber.next({ type: 'message.queued', data: receipt });\n subscriber.complete();\n }\n\n private async readStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantMessageEvent>\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<NhAssistantMessageEvent>, 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 { Injectable, inject } from '@angular/core';\nimport { Observable, forkJoin, map, of } from 'rxjs';\nimport {\n AdminAgent,\n AdminAgentGroups,\n AdminAgentInput,\n AgentRunConfiguration,\n AgentRunSettings,\n AgentRunSettingsRequest,\n AgentEvaluation,\n AgentEvaluationFilter,\n AgentFeedbackExportFilter,\n AgentFeedbackFilter,\n AgentFeedbackList,\n AgentFeedbackListFilter,\n AgentFeedbackSummary,\n AgentReplay,\n AgentReplayList,\n AgentReplayRequest,\n AgentSkillState,\n AgentState,\n ApplicationContext,\n DataSkill,\n DataSkillRequest,\n DataSkillVersion,\n DataTrigger,\n DataTriggerRequest,\n DataTriggerShadowRequest,\n ApplicationContextVersion,\n McpAuthorizationStart,\n McpAuthorizeRequest,\n McpCompleteRequest,\n McpCompletion,\n McpConnectionsSummary,\n McpDiscovery,\n McpOrganizationConnection,\n McpCustomAuthMode,\n McpServer,\n McpServerInput,\n McpServerTestResult,\n McpTool,\n AssistantAccount,\n RunCatalog,\n RunConfigurationRemoval,\n SetAgentServiceAccountRequest,\n SetAgentShadowRequest,\n SetAgentStateRequest,\n SkillCandidateRequest,\n SkillComparison,\n SkillComparisonFilter,\n ToolCatalogEntry,\n UpdateAdminAgentRequest,\n UpdateApplicationContextRequest,\n UpdateMcpToolRequest\n} from '../models/assistant-admin.models';\nimport { AgentRunFilter, AgentRunHistory } from '../models/assistant-agent-run.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantApiService } from './nh-assistant-api.service';\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/** The most account ids one `GET admin/accounts?ids=` reads; `getAccounts` asks for more in parts. */\nconst maxAccountIds = 50;\n\n/** The longest account id the server reads; a longer id names no account. */\nconst maxAccountIdLength = 256;\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 private readonly api = inject(NhAssistantApiService);\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. The run state stays as it is. */\n resetAgent(agentId: string): Observable<AdminAgent> {\n return this.request<AdminAgent>('POST', `admin/agents/${encodeURIComponent(agentId)}/reset`);\n }\n\n getAgentState(agentId: string): Observable<AgentState> {\n return this.request<AgentState>('GET', `admin/agents/${encodeURIComponent(agentId)}/state`);\n }\n\n /**\n * Pauses, stops or resumes an agent without changing its definition. A code-disabled agent\n * cannot be resumed (`assistant-agent-configured-off`).\n */\n setAgentState(agentId: string, request: SetAgentStateRequest): Observable<AgentState> {\n return this.request<AgentState>('POST', `admin/agents/${encodeURIComponent(agentId)}/state`, request);\n }\n\n /**\n * Pauses, stops or resumes one skill of an agent; its other skills keep working.\n */\n setSkillState(agentId: string, skillId: string, request: SetAgentStateRequest): Observable<AgentSkillState> {\n return this.request<AgentSkillState>(\n 'POST',\n `admin/agents/${encodeURIComponent(agentId)}/skills/${encodeURIComponent(skillId)}/state`,\n request);\n }\n\n /**\n * Puts an agent in shadow, live, or back to the mode in code. A shadow variant cannot change\n * (`assistant-shadow-variant`).\n */\n setAgentShadow(agentId: string, request: SetAgentShadowRequest): Observable<AgentState> {\n return this.request<AgentState>('POST', `admin/agents/${encodeURIComponent(agentId)}/shadow`, request);\n }\n\n /** Puts one skill of an agent in shadow, live, or back to the mode in code. */\n setSkillShadow(agentId: string, skillId: string, request: SetAgentShadowRequest): Observable<AgentSkillState> {\n return this.request<AgentSkillState>(\n 'POST',\n `admin/agents/${encodeURIComponent(agentId)}/skills/${encodeURIComponent(skillId)}/shadow`,\n request);\n }\n\n /**\n * Changes the technical account that answers for the agent's new runs, or with `actorId: null`\n * uses the account in code again. Fails with `assistant-service-account-not-found` for an\n * account that does not exist or may not sign in.\n */\n setServiceAccount(agentId: string, request: SetAgentServiceAccountRequest): Observable<AgentState> {\n return this.request<AgentState>('POST', `admin/agents/${encodeURIComponent(agentId)}/service-account`, request);\n }\n\n /**\n * Puts an agent, in code or created here, in exactly `groups` of the run catalog's `agentGroups`\n * and out of the others. The choice wins over the agent's `InGroup` in code. Fails with a field error\n * on `groups` for an unknown group and with `assistant-shadow-variant` for a shadow variant.\n */\n setAgentGroups(agentId: string, groups: readonly string[]): Observable<AdminAgentGroups> {\n return this.request<AdminAgentGroups>('PUT', `admin/agents/${encodeURIComponent(agentId)}/groups`, { groups });\n }\n\n /** Deletes an admin agent. Code agents cannot be deleted; stop 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 /**\n * The authentication modes the application registered in code (`GET admin/mcp-auth-modes`), which\n * administrators choose next to the built-in modes.\n */\n getMcpAuthModes(): Observable<McpCustomAuthMode[]> {\n return this.request<McpCustomAuthMode[]>('GET', 'admin/mcp-auth-modes');\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 /**\n * Reads the protected resource metadata of a server address and its authorization server without\n * storing anything. Save the server with `oauth.confirmAuthorization` to pin what was found.\n */\n discoverMcpServer(url: string): Observable<McpDiscovery> {\n return this.request<McpDiscovery>('POST', 'admin/mcp-servers/discover', { url });\n }\n\n /** The organization's OAuth connection of a server, without tokens. */\n getMcpOrganizationConnection(serverId: string): Observable<McpOrganizationConnection> {\n return this.request<McpOrganizationConnection>('GET', `${mcpServerPath(serverId)}/connection`);\n }\n\n /**\n * Starts the administrator's authorization of the organization connection. Open\n * `authorizationUrl` in the administrator's browser, then complete with `completeMcpAuthorization`.\n */\n authorizeMcpOrganizationConnection(serverId: string, request: McpAuthorizeRequest = {}): Observable<McpAuthorizationStart> {\n return this.request<McpAuthorizationStart>('POST', `${mcpServerPath(serverId)}/connection/authorize`, request);\n }\n\n /** Removes the organization connection and revokes its tokens. */\n disconnectMcpOrganizationConnection(serverId: string): Observable<void> {\n return this.request<void>('DELETE', `${mcpServerPath(serverId)}/connection`);\n }\n\n /** The personal connections of a server per status. */\n getMcpConnectionsSummary(serverId: string): Observable<McpConnectionsSummary> {\n return this.request<McpConnectionsSummary>('GET', `${mcpServerPath(serverId)}/connections/summary`);\n }\n\n /** Revokes every person's connection of a server; each person connects again. */\n revokeMcpConnections(serverId: string): Observable<void> {\n return this.request<void>('DELETE', `${mcpServerPath(serverId)}/connections`);\n }\n\n /**\n * Activates the connection of an authorization the caller started with the completion code the\n * callback handed to the browser. An organization connection also needs the admin policy. The same\n * call as `NhAssistantApiService.completeMcpAuthorization`, with the same failure codes.\n */\n completeMcpAuthorization(request: McpCompleteRequest): Observable<McpCompletion> {\n return this.api.completeMcpAuthorization(request);\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 exportAgentFeedback(agentId: string, filter: AgentFeedbackExportFilter = {}): Promise<Blob> {\n return this.download(withQuery(`${feedbackPath(agentId)}/export`, filter));\n }\n\n /**\n * Compares a shadow variant with its live agent over a period: the runs that handled the same\n * events, the proposals per tool with what people decided about the live ones, cost and routing.\n */\n getAgentEvaluation(agentId: string, filter: AgentEvaluationFilter): Observable<AgentEvaluation> {\n return this.request<AgentEvaluation>('GET', withQuery(`${agentPath(agentId)}/evaluation`, filter));\n }\n\n /**\n * Downloads the paired runs of the comparison as JSON Lines: identifiers, statuses, usage and\n * proposal identities, no content. The server audits the export. Rejects with `NhAssistantApiError`.\n */\n exportAgentEvaluation(agentId: string, filter: AgentEvaluationFilter): Promise<Blob> {\n return this.download(withQuery(`${agentPath(agentId)}/evaluation/export`, filter));\n }\n\n /**\n * Replays the recorded runs of another agent in a period into a shadow variant, against today's\n * state of each subject. One replay runs per variant (`assistant-replay-active`).\n */\n startAgentReplay(variantId: string, request: AgentReplayRequest): Observable<AgentReplay> {\n return this.request<AgentReplay>('POST', `${agentPath(variantId)}/replay`, request);\n }\n\n /** The latest replays into a shadow variant, newest first. */\n getAgentReplays(variantId: string): Observable<AgentReplayList> {\n return this.request<AgentReplayList>('GET', `${agentPath(variantId)}/replays`);\n }\n\n /** The building blocks in code that run settings, skills and triggers defined as data can name. */\n getRunCatalog(): Observable<RunCatalog> {\n return this.request<RunCatalog>('GET', 'admin/run-catalog');\n }\n\n /**\n * Accounts whose name or e-mail address contains `query` (2 to 100 characters), at most `limit`.\n * Fails with `assistant-account-search-unavailable` when the application offers no search; the\n * run catalog's `accountSearch` tells beforehand.\n */\n searchAccounts(query: string, limit?: number): Observable<AssistantAccount[]> {\n return this.request<AssistantAccount[]>('GET', withQuery('admin/accounts', { query, limit }));\n }\n\n /**\n * The names the application knows for these account ids; unknown ids are left out. The server reads\n * at most 50 ids per request, so more ids are asked for in parts of 50 and the answers merged in\n * the order of the ids. Fails with `NhAssistantApiError` when any part fails.\n */\n getAccounts(actorIds: readonly string[]): Observable<AssistantAccount[]> {\n // An empty id or one longer than the server reads names no account.\n const ids = [...new Set(actorIds.filter(id => id.trim().length > 0 && id.length <= maxAccountIdLength))];\n if (ids.length === 0) {\n return of([]);\n }\n\n const parts: Observable<AssistantAccount[]>[] = [];\n for (let start = 0; start < ids.length; start += maxAccountIds) {\n const part = ids.slice(start, start + maxAccountIds);\n parts.push(this.request<AssistantAccount[]>('GET', withQuery('admin/accounts', { ids: part.join(',') })));\n }\n\n return forkJoin(parts).pipe(map(answers => answers.flat()));\n }\n\n /**\n * The agent's run settings, skills and triggers, in code and as data, and the data that no longer\n * fits the code. An agent in code without a run configuration answers `assistant-agent-not-found`.\n */\n getAgentConfiguration(agentId: string): Observable<AgentRunConfiguration> {\n return this.request<AgentRunConfiguration>('GET', `${agentPath(agentId)}/configuration`);\n }\n\n /**\n * Adds or changes the run settings of an agent created in the administration. An agent in code\n * fails with `assistant-run-settings-in-code`; an unknown technical account with\n * `assistant-service-account-not-found`.\n */\n saveRunSettings(agentId: string, request: AgentRunSettingsRequest): Observable<AgentRunSettings> {\n return this.request<AgentRunSettings>('PUT', `${agentPath(agentId)}/run-settings`, request);\n }\n\n /**\n * Every run of the agent, live and shadow, newest first, for its runs view. Read one run's whole\n * result with `NhAssistantAgentRunApiService.getRunResult`. The server checks the filter first:\n * `assistant-run-filter-invalid` with the refused parts in `fieldErrors`, then\n * `assistant-agent-not-found` for an unknown agent.\n */\n getAgentRuns(agentId: string, filter: Omit<AgentRunFilter, 'agentId'> = {}): Observable<AgentRunHistory> {\n return this.request<AgentRunHistory>('GET', withQuery(`${agentPath(agentId)}/runs`, filter));\n }\n\n /** Removes the run settings; while data skills or triggers belong to the agent, `assistant-run-settings-in-use`. */\n removeRunSettings(agentId: string, removal: RunConfigurationRemoval = {}): Observable<void> {\n return this.request<void>('DELETE', withQuery(`${agentPath(agentId)}/run-settings`, removal));\n }\n\n /**\n * Adds a skill defined as data, which starts in shadow, or stores its next version: with `apply`\n * `live` at once, with `shadow` as the candidate that runs in shadow next to the live version.\n */\n saveDataSkill(agentId: string, skillId: string, request: DataSkillRequest): Observable<DataSkill> {\n return this.request<DataSkill>('PUT', skillPath(agentId, skillId), request);\n }\n\n /** Takes a skill defined as data out of effect; while a data trigger names it, `assistant-skill-in-use`. */\n removeDataSkill(agentId: string, skillId: string, removal: RunConfigurationRemoval = {}): Observable<void> {\n return this.request<void>('DELETE', withQuery(skillPath(agentId, skillId), removal));\n }\n\n /** Every version of a skill defined as data, newest first. */\n getDataSkillVersions(agentId: string, skillId: string): Observable<DataSkillVersion[]> {\n return this.request<DataSkillVersion[]>('GET', `${skillPath(agentId, skillId)}/versions`);\n }\n\n /** Makes the candidate the live version of its skill. */\n promoteSkillCandidate(agentId: string, skillId: string, request: SkillCandidateRequest): Observable<DataSkill> {\n return this.request<DataSkill>('POST', `${skillPath(agentId, skillId)}/candidate/promote`, request);\n }\n\n /** Discards the candidate; it stays as history. */\n discardSkillCandidate(agentId: string, skillId: string, request: SkillCandidateRequest): Observable<void> {\n return this.request<void>('POST', `${skillPath(agentId, skillId)}/candidate/discard`, request);\n }\n\n /** Compares the candidate with the live version on the runs they made in the period. */\n compareSkillCandidate(agentId: string, skillId: string, filter: SkillComparisonFilter = {}): Observable<SkillComparison> {\n return this.request<SkillComparison>('GET', withQuery(`${skillPath(agentId, skillId)}/candidate/comparison`, filter));\n }\n\n /** Adds a trigger defined as data, which starts in shadow, or changes one in the mode it has. */\n saveDataTrigger(agentId: string, triggerId: string, request: DataTriggerRequest): Observable<DataTrigger> {\n return this.request<DataTrigger>('PUT', triggerPath(agentId, triggerId), request);\n }\n\n removeDataTrigger(agentId: string, triggerId: string, removal: RunConfigurationRemoval = {}): Observable<void> {\n return this.request<void>('DELETE', withQuery(triggerPath(agentId, triggerId), removal));\n }\n\n /** Puts a trigger defined as data in shadow or live. */\n setDataTriggerShadow(agentId: string, triggerId: string, request: DataTriggerShadowRequest): Observable<DataTrigger> {\n return this.request<DataTrigger>('POST', `${triggerPath(agentId, triggerId)}/shadow`, request);\n }\n\n private download(path: string): Promise<Blob> {\n return this.transport.download(path, 'application/x-ndjson', adminStatusCodes);\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 mcpServerPath(serverId: string): string {\n return `admin/mcp-servers/${encodeURIComponent(serverId)}`;\n}\n\nfunction feedbackPath(agentId: string): string {\n return `${agentPath(agentId)}/feedback`;\n}\n\nfunction agentPath(agentId: string): string {\n return `admin/agents/${encodeURIComponent(agentId)}`;\n}\n\nfunction skillPath(agentId: string, skillId: string): string {\n return `${agentPath(agentId)}/skills/${encodeURIComponent(skillId)}`;\n}\n\nfunction triggerPath(agentId: string, triggerId: string): string {\n return `${agentPath(agentId)}/triggers/${encodeURIComponent(triggerId)}`;\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 AgentBoard,\n AgentBoardList,\n AgentBoardVisit,\n AgentConsultationList,\n AgentDecisionOutcome,\n AgentExecutionResolution,\n AgentFeedbackOutcome,\n AgentInbox,\n AgentInboxFilter,\n AgentObjectAgents,\n AgentProposal,\n AgentProposalDecision,\n AgentProposalFeedback,\n AgentProposalFeedbackCategory,\n AgentProposalLookup,\n AgentRunFilter,\n AgentRunHistory,\n AgentRunList,\n AgentRunResult,\n AgentRunRetryMode,\n AgentSubjectSearch,\n AgentSubjectSummaryList,\n AgentSubjectWork,\n AgentSubjectWorkProposal,\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 /**\n * Runs the agent now on the subject with the caller as initiator. On an object it needs the\n * participant role; on the whole application (`nh-system`) the agent's run policy, by default the\n * administration policy. The receipt says what became of the start (`AgentTriggerOutcome`), for\n * example `waiting` while the agent is paused. A refusal errors with `NhAssistantApiError`:\n * `assistant-agent-does-not-work-on`, `assistant-agent-stopped`, `assistant-trigger-rate-limited`\n * and the other conflicts (409), `assistant-subject-access-denied` or `assistant-agent-forbidden`\n * (403), `assistant-agent-not-found` or `assistant-subject-not-found` (404),\n * `assistant-subject-invalid` (400) and `assistant-trigger-rolled-back` (503).\n */\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 * The agents that work on the subject and that the caller may use, with whether the caller may run\n * each now, its newest run with the beginning of its result and its open proposals. The subject is\n * an object or the whole application (`nh-system`, `global` or `division-…`). Errors with\n * `assistant-subject-not-found` when the caller has no role on the subject.\n */\n getObjectAgents(subjectType: string, subjectId: string): Observable<AgentObjectAgents> {\n return this.transport.json<AgentObjectAgents>(\n 'GET',\n `subjects/${encodeURIComponent(subjectType)}/${encodeURIComponent(subjectId)}/agents`\n );\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 /**\n * Finds subjects of one type by name, at most `limit` (default 20, at most 50), among those the\n * caller may read; `query` has 2 to 100 characters. Errors with `assistant-subject-search-unavailable`\n * for a type the application does not search (people then give the subject's id), with\n * `assistant-subject-type-unknown` for an unknown type and with `assistant-validation` for a\n * query of the wrong length.\n */\n searchSubjects(subjectType: string, query: string, limit?: number): Observable<AgentSubjectSearch> {\n const parameters = new URLSearchParams({ query });\n if (limit !== undefined) {\n parameters.set('limit', String(limit));\n }\n return this.transport.json<AgentSubjectSearch>(\n 'GET',\n `subjects/${encodeURIComponent(subjectType)}/search?${parameters.toString()}`\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 /**\n * One proposal of an agent thread in any status, with the caller's live right to decide it, for\n * example the one an `AgentWorkChanged` update names. Fails with `assistant-approval-not-found`\n * for an unknown proposal and for one the caller may not see.\n */\n getProposal(approvalId: string): Observable<AgentSubjectWorkProposal> {\n return this.transport.json<AgentSubjectWorkProposal>('GET', `approvals/${encodeURIComponent(approvalId)}`);\n }\n\n /**\n * The proposals among at most `NH_ASSISTANT_MAX_PROPOSAL_LOOKUP` ids that the caller may see, in\n * the order of the ids, each with the caller's live right to decide it. The others are left out.\n */\n lookupProposals(approvalIds: readonly string[]): Observable<AgentProposalLookup> {\n return this.transport.json<AgentProposalLookup>('POST', 'approvals/lookup', { approvalIds });\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 /**\n * Downloads one artifact version with the host's credentials. Rejects with `NhAssistantApiError`,\n * for example `assistant-artifact-not-found` or `assistant-network`.\n */\n downloadArtifact(conversationId: string, artifactId: string): Promise<Blob> {\n const path = `threads/${encodeURIComponent(conversationId)}/artifacts/${encodeURIComponent(artifactId)}/content`;\n return this.transport.download(path, '*/*');\n }\n\n /**\n * The agent runs the caller may see, newest first: runs on objects the caller reads and runs for\n * the whole application whose agent's view policy the caller passes. Errors with\n * `assistant-run-filter-invalid` for an invalid filter, with the refused parts in `fieldErrors`\n * (`page`, `itemsPerPage`, `agentId`, `subjectType`, `subjectId`, `status`, `to`).\n */\n getRunHistory(filter: AgentRunFilter = {}): Observable<AgentRunHistory> {\n return this.transport.json<AgentRunHistory>('GET', withQuery('runs', filter));\n }\n\n /**\n * The boards of the groups of agents the caller sees at least one agent of, ordered by name: an\n * agent that works on the whole application by its view policy, another by its required policy.\n */\n getBoards(): Observable<AgentBoardList> {\n return this.transport.json<AgentBoardList>('GET', 'boards');\n }\n\n /**\n * The board of one group: per agent what it works on, its latest result for the whole application,\n * its open proposals, whether the caller may run it now and whether something is new since the\n * caller's last visit. `divisionId` opens the board of one division the caller may work in. Fails\n * with `assistant-board-not-found` for an unknown group or one the caller sees no agent of, and with\n * `assistant-board-scope-invalid` for a malformed division id.\n */\n getBoard(groupId: string, divisionId?: string | null): Observable<AgentBoard> {\n return this.transport.json<AgentBoard>('GET', withQuery(`boards/${encodeURIComponent(groupId)}`, { divisionId }));\n }\n\n /** Records that the caller looked at the board now, so it marks what is new after this visit. */\n visitBoard(groupId: string, divisionId?: string | null): Observable<AgentBoardVisit> {\n return this.transport.json<AgentBoardVisit>('POST', withQuery(`boards/${encodeURIComponent(groupId)}/visit`, { divisionId }));\n }\n\n /**\n * One run with its whole result, its proposals and its files. Fails with `assistant-run-not-found`\n * for an unknown run and for one the caller may not see.\n */\n getRunResult(runId: string): Observable<AgentRunResult> {\n return this.transport.json<AgentRunResult>('GET', `runs/${encodeURIComponent(runId)}`);\n }\n\n /**\n * Downloads one file a run saved, with the host's credentials. Rejects with `NhAssistantApiError`,\n * for example `assistant-artifact-not-found`, `assistant-run-not-found` or `assistant-network`.\n */\n downloadRunArtifact(runId: string, artifactId: string): Promise<Blob> {\n const path = `runs/${encodeURIComponent(runId)}/artifacts/${encodeURIComponent(artifactId)}/content`;\n return this.transport.download(path, '*/*');\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 /**\n * Resumes or restarts a failed or cancelled run; needs the approver role. A restart starts the agent\n * again like `startAgent`, with the same outcomes and refusals; a resume answers `queued`.\n */\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\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 { 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 LiveAgentWorkWatch,\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/** How long a watch of the whole application's agent work lasts when the server does not say. */\nconst defaultWatchRenewalSeconds = 300;\n/** The shortest renewal of a watch, whatever the server says. */\nconst minimumWatchRenewalSeconds = 30;\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. The work of agents for the whole application\n * lists no members, so it arrives only while a screen watches it (`watchAgentWork`).\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 /** The screens that watch the work of agents for the whole application. */\n private agentWorkWatchers = 0;\n private watchTimer?: 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 this.agentWorkWatchers = 0;\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 void this.renewAgentWorkWatch();\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 /**\n * Follows the work of agents for the whole application, such as their proposals and runs, while the\n * returned function has not been called; a screen that shows it, such as the approval inbox or a\n * board, watches it while it is shown. The whole application lists no members, so the hub sends its\n * agents' work only to connections that watch it: it joins the work the server decides the person\n * may read, the agent's view policy included, renews the watch when the server says and after every\n * reconnect, and so checks the person's rights again. The watch ends when the last screen releases\n * it. Without a connection nothing arrives and screens keep their own reload.\n */\n watchAgentWork(): () => void {\n this.agentWorkWatchers++;\n if (this.agentWorkWatchers === 1) {\n void this.renewAgentWorkWatch();\n }\n\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n this.agentWorkWatchers = Math.max(0, this.agentWorkWatchers - 1);\n if (this.agentWorkWatchers === 0) {\n clearTimeout(this.watchTimer);\n const connection = this.connection;\n if (connection && this.stateSignal() === 'connected') {\n connection.invoke('UnwatchAgentWork').catch(() => undefined);\n }\n }\n };\n }\n\n async stop(): Promise<void> {\n this.revision++;\n this.hubUrl = null;\n clearTimeout(this.restartTimer);\n clearTimeout(this.watchTimer);\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 // A new connection belongs to no watch yet.\n void this.renewAgentWorkWatch();\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 /**\n * Asks the hub to watch the work of agents for the whole application for the screens that watch it,\n * and schedules the renewal the server asks for. An older server without watching, or a failed call,\n * is tried again later; live updates stay optional.\n */\n private async renewAgentWorkWatch(): Promise<void> {\n clearTimeout(this.watchTimer);\n const connection = this.connection;\n if (this.agentWorkWatchers === 0 || !connection || this.stateSignal() !== 'connected') {\n return;\n }\n\n let seconds = defaultWatchRenewalSeconds;\n try {\n const watch = await connection.invoke<LiveAgentWorkWatch | null>('WatchAgentWork');\n if (typeof watch?.refreshAfterSeconds === 'number' && Number.isFinite(watch.refreshAfterSeconds)) {\n seconds = Math.max(minimumWatchRenewalSeconds, watch.refreshAfterSeconds);\n }\n } catch {\n // Tried again at the next renewal or reconnect.\n }\n\n if (connection === this.connection && this.agentWorkWatchers > 0) {\n clearTimeout(this.watchTimer);\n this.watchTimer = setTimeout(() => void this.renewAgentWorkWatch(), seconds * 1_000);\n }\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 { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantError } from '../services/nh-assistant.store';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../services/nh-assistant-transport';\n\n/** The text every error falls back to when neither its key nor its code has one. */\nconst genericErrorKey = 'nh-assistant.errors.generic';\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 Object.keys(error.fieldErrors).length > 0\n ? { code: error.code, messageKey: error.messageKey, fieldErrors: error.fieldErrors }\n : { code: error.code, messageKey: error.messageKey };\n }\n\n return nhAssistantErrorOf(NhAssistantClientErrorCodes.server);\n}\n\n/** The error of a code without a message key of its own, such as a code a callback page reported. */\nexport function nhAssistantErrorOf(code: string): NhAssistantError {\n return { code, messageKey: nhAssistantErrorMessageKey(code) };\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), genericErrorKey] : [];\n}\n\n/**\n * Translation keys for a bare failure code, such as a run's `failureCode`: the registered text of\n * the code, then the generic text. Empty without a code.\n */\nexport function nhAssistantCodeKeys(code: string | null | undefined): string[] {\n return code ? [nhAssistantErrorMessageKey(code), genericErrorKey] : [];\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 { InjectionToken, inject } from '@angular/core';\nimport { Observable, catchError, switchMap, throwError } from 'rxjs';\nimport { McpAuthorizationStart, McpCompleteRequest, McpCompletion } from '../models/assistant-admin.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey, nhAssistantIsSafeCode } from './nh-assistant-transport';\n\n/** The `type` of the message the assistant's OAuth callback page posts to its opener. */\nexport const NH_ASSISTANT_MCP_AUTHORIZATION_MESSAGE = 'nh-assistant-mcp-authorization';\n\n/**\n * What an authorization window reports: the flow and its one-time completion code, which\n * `POST mcp-connections/complete` turns into the connection with the caller's own session, or the\n * failure code of the callback (for example `assistant-mcp-authorization-failed`).\n */\nexport type NhAssistantMcpAuthorizationOutcome =\n | { flowId: string; completionCode: string; code?: undefined }\n | { flowId: string | null; code: string; completionCode?: undefined };\n\n/** A window opened for one authorization. */\nexport interface NhAssistantMcpAuthorizationHandle {\n /** Shows the authorization and emits its outcome once, then completes. */\n authorize(start: McpAuthorizationStart): Observable<NhAssistantMcpAuthorizationOutcome>;\n /** Closes the window, for example when starting the authorization failed. */\n close(): void;\n}\n\n/**\n * Opens MCP authorizations in the person's browser. `open()` runs in the click handler, before the\n * authorization URL is known, so popup blockers allow the window.\n */\nexport interface NhAssistantMcpAuthorizationWindow {\n open(): NhAssistantMcpAuthorizationHandle;\n}\n\n/**\n * The authorization window of the assistant components. The default opens a popup and waits for the\n * callback page's message; the testing package replaces it for the mock back-end.\n */\nexport const NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW = new InjectionToken<NhAssistantMcpAuthorizationWindow>(\n 'NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW',\n { providedIn: 'root', factory: () => new NhAssistantMcpPopupAuthorizationWindow(inject(DOCUMENT)) }\n);\n\nconst safeToken = /^[A-Za-z0-9_-]{16,128}$/;\n/** The code of a callback whose own code cannot be shown. */\nconst authorizationFailed = 'assistant-mcp-authorization-failed';\nconst flowPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Opens the authorization in a popup. Only a message from that popup, sent by the assistant's\n * callback page (`callbackOrigin`), with the started flow is accepted; the completion code is useless\n * without the starter's own session. A closed popup\n * without a message reports `assistant-mcp-authorization-cancelled`, a blocked one\n * `assistant-mcp-popup-blocked`.\n */\nexport class NhAssistantMcpPopupAuthorizationWindow implements NhAssistantMcpAuthorizationWindow {\n constructor(private readonly document: Document) {}\n\n open(): NhAssistantMcpAuthorizationHandle {\n const view = this.document.defaultView;\n // The callback page needs window.opener, so the popup cannot be opened with noopener.\n const popup = view?.open('about:blank', '_blank', 'popup=yes,width=560,height=720') ?? null;\n return new PopupHandle(view, popup);\n }\n}\n\nclass PopupHandle implements NhAssistantMcpAuthorizationHandle {\n constructor(\n private readonly view: Window | null,\n private readonly popup: Window | null\n ) {}\n\n authorize(start: McpAuthorizationStart): Observable<NhAssistantMcpAuthorizationOutcome> {\n return new Observable<NhAssistantMcpAuthorizationOutcome>(subscriber => {\n const view = this.view;\n const popup = this.popup;\n if (!view || !popup || popup.closed) {\n subscriber.next({ flowId: start.flowId, code: NhAssistantClientErrorCodes.mcpPopupBlocked });\n subscriber.complete();\n return undefined;\n }\n\n let finished = false;\n const finish = (outcome: NhAssistantMcpAuthorizationOutcome): void => {\n if (finished) {\n return;\n }\n finished = true;\n subscriber.next(outcome);\n subscriber.complete();\n };\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== popup || event.origin !== start.callbackOrigin) {\n return;\n }\n const outcome = readMessage(event.data, start.flowId);\n if (outcome) {\n finish(outcome);\n }\n };\n view.addEventListener('message', onMessage);\n const closedCheck = view.setInterval(() => {\n if (popup.closed) {\n // The message is dispatched before the page closes itself; a later check finds nothing.\n finish({ flowId: start.flowId, code: NhAssistantClientErrorCodes.mcpAuthorizationCancelled });\n }\n }, 500);\n popup.location.replace(start.authorizationUrl);\n\n return () => {\n view.removeEventListener('message', onMessage);\n view.clearInterval(closedCheck);\n };\n });\n }\n\n close(): void {\n if (this.popup && !this.popup.closed) {\n this.popup.close();\n }\n }\n}\n\n/**\n * The outcome in a callback message for the started flow, or null for any other message. The message\n * is `{ type, flowId, completionCode, code, messageKey }`; the text of a failure comes from its code,\n * so the message key the page sends along is not needed.\n */\nfunction readMessage(data: unknown, flowId: string): NhAssistantMcpAuthorizationOutcome | null {\n if (!data || typeof data !== 'object') {\n return null;\n }\n const message = data as Record<string, unknown>;\n if (message['type'] !== NH_ASSISTANT_MCP_AUTHORIZATION_MESSAGE) {\n return null;\n }\n const messageFlow = message['flowId'];\n if (messageFlow !== null && messageFlow !== flowId) {\n return null;\n }\n const completionCode = message['completionCode'];\n if (messageFlow === flowId && typeof completionCode === 'string' && safeToken.test(completionCode)) {\n return { flowId, completionCode };\n }\n const code = message['code'];\n return { flowId, code: nhAssistantIsSafeCode(code) ? code : authorizationFailed };\n}\n\n/**\n * Reads the outcome of a redirect-mode authorization from a URL fragment\n * (`#nh-mcp-flow=…&nh-mcp-code=…` or `#nh-mcp-error=…&nh-mcp-message-key=…`); null when the fragment\n * has none. The text of a failure comes from its code. Remove the fragment from the address bar after\n * reading it.\n */\nexport function nhAssistantMcpAuthorizationFromFragment(fragment: string): NhAssistantMcpAuthorizationOutcome | null {\n const values = new URLSearchParams(fragment.startsWith('#') ? fragment.slice(1) : fragment);\n const flowId = values.get('nh-mcp-flow');\n const completionCode = values.get('nh-mcp-code');\n const error = values.get('nh-mcp-error');\n if (flowId && flowPattern.test(flowId) && completionCode && safeToken.test(completionCode)) {\n return { flowId, completionCode };\n }\n if (error) {\n return { flowId: flowId && flowPattern.test(flowId) ? flowId : null, code: nhAssistantIsSafeCode(error) ? error : authorizationFailed };\n }\n return null;\n}\n\n/**\n * Runs one authorization: starts it, shows it in the window opened before, and completes it with\n * the caller's own session. Errors with `NhAssistantApiError`, also for the window's failure codes.\n */\nexport function nhAssistantConnectMcp(\n handle: NhAssistantMcpAuthorizationHandle,\n start: Observable<McpAuthorizationStart>,\n complete: (request: McpCompleteRequest) => Observable<McpCompletion>\n): Observable<McpCompletion> {\n return start.pipe(\n catchError((error: unknown) => {\n handle.close();\n return throwError(() => error);\n }),\n switchMap(started => handle.authorize(started)),\n switchMap(outcome => outcome.completionCode !== undefined\n ? complete({ flowId: outcome.flowId, completionCode: outcome.completionCode })\n : throwError(() => new NhAssistantApiError(0, outcome.code, nhAssistantErrorMessageKey(outcome.code)))));\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { NEVER, Observable, catchError, map, of, switchMap } from 'rxjs';\nimport { toNhAssistantError } from '../internal/nh-assistant-errors';\nimport { McpAuthorizationStart, McpAuthorizeRequest, McpCompletion } from '../models/assistant-admin.models';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantApiService } from './nh-assistant-api.service';\nimport {\n NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW,\n nhAssistantConnectMcp,\n nhAssistantMcpAuthorizationFromFragment\n} from './nh-assistant-mcp-authorization';\n\n/**\n * The outcome of an authorization the page returned from in redirect mode: the activated connection,\n * or the failure code to show. `serverId` names the server whose connection the page left for, when\n * this browser tab remembered it, so a screen shows the outcome at that server only.\n */\nexport type NhAssistantMcpReturnOutcome =\n | { completion: McpCompletion; code?: undefined; serverId?: string | null }\n | { code: string; completion?: undefined; serverId?: string | null };\n\n/** Where this tab remembers the server whose connection it left for, until it returns. */\nconst leftForKey = 'nh-assistant.mcp-connect.server';\n\n/**\n * Connects MCP accounts the way the host configured (`mcpConnectMode`): in a popup that the click\n * opens, or by sending the page to the authorization server and back. Every authorization completes\n * with the caller's own session.\n */\n@Injectable()\nexport class NhAssistantMcpConnectService {\n private readonly api = inject(NhAssistantApiService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly authorizationWindow = inject(NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW);\n private readonly document = inject(DOCUMENT);\n\n /**\n * The outcome of the redirect-mode authorization this page opened with, until a screen showed it.\n * `nh-assistant-connection-required` shows the outcome of its server without taking it; the\n * connection lists of the preferences and the administration show it and take it.\n */\n readonly returned = signal<NhAssistantMcpReturnOutcome | null>(null);\n\n /** Whether authorizations leave the page instead of opening a popup. */\n get redirects(): boolean {\n return this.config.mcpConnectMode === 'redirect';\n }\n\n /**\n * Connects the caller's own account to a server each person connects to. Call it in the click\n * handler, so the popup is allowed. In redirect mode the page leaves and the observable never\n * emits; the page completes the authorization when it returns.\n */\n connect(serverId: string, options: { allowBackgroundUse?: boolean } = {}): Observable<McpCompletion> {\n return this.run(\n request => this.api.authorizeMcpConnection(serverId, { ...request, allowBackgroundUse: options.allowBackgroundUse ?? null }),\n serverId);\n }\n\n /**\n * Runs any authorization start, for example an administrator's organization connection, in the\n * configured mode. `serverId` lets the page show the outcome at that server after a redirect.\n */\n run(start: (request: McpAuthorizeRequest) => Observable<McpAuthorizationStart>, serverId?: string): Observable<McpCompletion> {\n if (!this.redirects) {\n return nhAssistantConnectMcp(this.authorizationWindow.open(), start({}), request => this.api.completeMcpAuthorization(request));\n }\n\n const returnUrl = this.config.mcpConnectReturnUrl?.() ?? withoutFragment(this.document.location.href);\n return start({ returnUrl }).pipe(switchMap(started => {\n this.rememberLeftFor(serverId ?? null);\n this.navigate(started.authorizationUrl);\n return NEVER;\n }));\n }\n\n /** Leaves the page for an authorization in redirect mode. */\n navigate(url: string): void {\n this.document.location.assign(url);\n }\n\n /**\n * Completes a redirect-mode authorization when the page opened with its fragment, removes the\n * fragment from the address and records the outcome in `returned`: the connection, or the code of\n * whatever failed, also when completing it failed. Emits null without a fragment and never errors.\n */\n completeReturn(): Observable<NhAssistantMcpReturnOutcome | null> {\n const outcome = nhAssistantMcpAuthorizationFromFragment(this.document.location.hash);\n if (!outcome) {\n return of(null);\n }\n\n // The fragment carries a one-time code; it leaves the address before anything else happens.\n this.removeFragment();\n const serverId = this.takeLeftFor();\n\n if (outcome.completionCode === undefined) {\n return of(this.record({ code: outcome.code, serverId }));\n }\n\n const request = { flowId: outcome.flowId, completionCode: outcome.completionCode };\n return this.api.completeMcpAuthorization(request).pipe(\n map(completion => this.record({ completion, serverId: completion.serverId })),\n catchError((error: unknown) => of(this.record({ code: toNhAssistantError(error).code, serverId }))));\n }\n\n private record(outcome: NhAssistantMcpReturnOutcome): NhAssistantMcpReturnOutcome {\n this.returned.set(outcome);\n return outcome;\n }\n\n private removeFragment(): void {\n const view = this.document.defaultView;\n try {\n view?.history.replaceState(view.history.state, '', withoutFragment(this.document.location.href));\n } catch {\n // A page that may not change its history keeps the fragment; the code inside works only once.\n }\n }\n\n /** Remembers in this tab which server's connection the page leaves for. */\n private rememberLeftFor(serverId: string | null): void {\n try {\n const storage = this.document.defaultView?.sessionStorage;\n if (serverId) {\n storage?.setItem(leftForKey, serverId);\n } else {\n storage?.removeItem(leftForKey);\n }\n } catch {\n // Without session storage the outcome shows in the connection lists only.\n }\n }\n\n /** The server this tab left for, forgotten once read. */\n private takeLeftFor(): string | null {\n try {\n const storage = this.document.defaultView?.sessionStorage;\n const serverId = storage?.getItem(leftForKey) ?? null;\n storage?.removeItem(leftForKey);\n return serverId;\n } catch {\n return null;\n }\n }\n}\n\nfunction withoutFragment(url: string): string {\n const index = url.indexOf('#');\n return index < 0 ? url : url.slice(0, index);\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 { AgentUploads } from '../models/assistant-api.models';\n\n/** The longest file name a file reference takes. */\nexport const NH_ASSISTANT_MAX_FILE_NAME_LENGTH = 256;\n\nconst unknownMediaType = 'application/octet-stream';\n\n/** The media types the platform names, with the extensions a file picker offers and a short label. */\nconst knownTypes: Record<string, { extensions: string[]; label: string }> = {\n 'application/pdf': { extensions: ['.pdf'], label: 'PDF' },\n 'image/png': { extensions: ['.png'], label: 'PNG' },\n 'image/jpeg': { extensions: ['.jpg', '.jpeg'], label: 'JPEG' },\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': { extensions: ['.docx'], label: 'Word' },\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': { extensions: ['.xlsx'], label: 'Excel' }\n};\n\n/**\n * The media type of a chosen file, lowercase and without parameters. A browser that does not know\n * the type, as happens for Office documents, gives none; the extension of a known type then names\n * it. Otherwise `application/octet-stream`.\n */\nexport function nhAssistantMediaTypeOf(file: Pick<File, 'name' | 'type'>): string {\n const declared = file.type.split(';')[0].trim().toLowerCase();\n if (declared.length > 0 && declared !== unknownMediaType) {\n return declared;\n }\n\n const name = file.name.toLowerCase();\n for (const [mediaType, known] of Object.entries(knownTypes)) {\n if (known.extensions.some(extension => name.endsWith(extension))) {\n return mediaType;\n }\n }\n\n return unknownMediaType;\n}\n\n/**\n * The failure code of a file before it is uploaded, or `null` when it may be: the most files of one\n * message, an accepted media type, content and a usable name, and the largest size. `attached` counts\n * the files the message already carries.\n */\nexport function nhAssistantFileProblem(\n file: Pick<File, 'name' | 'size'>,\n mediaType: string,\n uploads: AgentUploads,\n attached: number\n): string | null {\n if (attached >= uploads.maxFiles) {\n return 'assistant-file-count-limit';\n }\n if (!uploads.acceptedMediaTypes.includes(mediaType)) {\n return 'assistant-file-type-not-accepted';\n }\n if (file.size === 0 || file.name.trim().length === 0 || file.name.length > NH_ASSISTANT_MAX_FILE_NAME_LENGTH) {\n return 'assistant-file-upload-invalid';\n }\n if (file.size > uploads.maxFileBytes) {\n return 'assistant-file-too-large';\n }\n\n return null;\n}\n\n/** The `accept` attribute of a file input for these media types: each type and its known extensions. */\nexport function nhAssistantAcceptAttribute(mediaTypes: readonly string[]): string {\n return mediaTypes\n .flatMap(mediaType => [mediaType, ...(knownTypes[mediaType]?.extensions ?? [])])\n .join(',');\n}\n\n/** A short name of a media type, such as `PDF` or `Word`; otherwise its subtype in capitals. */\nexport function nhAssistantFileTypeLabel(mediaType: string): string {\n const known = knownTypes[mediaType];\n if (known) {\n return known.label;\n }\n\n const subtype = mediaType.split('/')[1] ?? mediaType;\n return subtype.split(/[.+]/).pop()!.toUpperCase();\n}\n\n/** A size in bytes as people read it, such as `820 KB` or `1.4 MB`, in the given language. */\nexport function nhAssistantFormatFileSize(bytes: number, language?: string | null): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = Math.max(0, bytes);\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit++;\n }\n\n let format: Intl.NumberFormat;\n try {\n format = new Intl.NumberFormat(language || undefined, { maximumFractionDigits: unit === 0 || value >= 10 ? 0 : 1 });\n } catch {\n format = new Intl.NumberFormat(undefined, { maximumFractionDigits: unit === 0 || value >= 10 ? 0 : 1 });\n }\n return `${format.format(value)} ${units[unit]}`;\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 'connection.required': {\n const data = event.data;\n // One card per server and answer, also when a live update repeats the event.\n const current = [...conversation.messages].reverse().find(message => message.role === 'assistant');\n if (current?.parts.some(part => part.type === 'connection-required' && part.serverId === data.serverId)) {\n return conversation;\n }\n return appendToCurrentAssistantMessage(conversation, {\n type: 'connection-required',\n serverId: data.serverId,\n displayName: data.displayName,\n reason: data.reason\n });\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 if (part.type === 'connection-required') {\n return `connection-${part.serverId}`;\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 AgentUploads,\n ApprovalDecision,\n ApprovalPart,\n ApprovalStatus,\n AssistantStatus,\n ClientContext,\n Conversation,\n ConversationMember,\n ConversationStatus,\n ConversationSummary,\n DirectoryEntry,\n FileReference,\n MessagePart\n} from '../models/assistant-api.models';\nimport { nhAssistantFileProblem, nhAssistantMediaTypeOf } from '../internal/nh-assistant-files';\nimport {\n LiveAgentWorkChanged,\n LiveConversationChanged,\n LiveConversationEvent,\n LiveConversationRead,\n LiveConversationRemoved\n} from '../models/assistant-live.models';\nimport { NhAssistantClientErrorCodes, NhAssistantMessageEvent, 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 /** The field errors of an `assistant-validation` failure, by camelCase field name. */\n fieldErrors?: Readonly<Record<string, readonly 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 /** The files the message carries, uploaded before it was queued. */\n files?: readonly FileReference[];\n}\n\n/**\n * A file the person attaches to the next message of the open conversation: while it uploads, once\n * the application stored it, or why it cannot be attached. Attachments live only in this tab's\n * memory.\n */\nexport interface NhAssistantAttachment {\n /** The attachment's id in this tab. */\n id: string;\n name: string;\n /** The media type the upload declares, lowercase. */\n mediaType: string;\n /** The size in bytes. */\n size: number;\n state: 'uploading' | 'uploaded' | 'failed';\n /** The share of the file sent so far, from 0 to 1. */\n progress: number;\n /** The stored file, once uploaded; the message carries its reference. */\n file: FileReference | null;\n /** Why the file is not attached, for a failed attachment. */\n error: NhAssistantError | null;\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 * Notice code for a message that waits for the next run of the agent working in its thread: the\n * server answered `202` with the trigger receipt, and the run adds the message, with its files.\n */\nexport const NH_ASSISTANT_MESSAGE_QUEUED_NOTICE_CODE = 'assistant-message-queued';\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\n/**\n * True when the server accepts a new message in a conversation with this status. A failed turn\n * leaves the conversation open: the person can ask again in the same conversation or agent thread.\n */\nfunction acceptsMessage(status: ConversationStatus | undefined): boolean {\n return status === 'idle' || status === 'failed';\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 /** The attachments of the next message per conversation; `''` for a new conversation. */\n private readonly attachmentsState = signal<ReadonlyMap<string, readonly NhAssistantAttachment[]>>(new Map());\n private destroyed = false;\n private readonly uploadSubscriptions = new Map<string, Subscription>();\n /** The conversation an attachment of a new conversation creates, once for every file chosen meanwhile. */\n private attachmentConversation: Promise<Conversation | null> | null = null;\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 /**\n * True while the user can send: enabled, an agent is chosen and no turn runs or waits. A\n * conversation whose last turn failed accepts a new message; an archived one does not.\n */\n readonly canSend = computed(() => {\n const conversation = this.activeConversation();\n const blocked = conversation !== null && !acceptsMessage(conversation.status);\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', 'failed', '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 /**\n * What the person may attach to the next message: the uploads of the open conversation's agent, or\n * of the selected agent for a new conversation. `null` when nothing can be attached: the server\n * offers no uploads for the agent, the conversation is archived, or the person only reads the\n * agent's thread.\n */\n readonly uploads = computed<AgentUploads | null>(() => {\n const conversation = this.activeConversation();\n const thread = conversation?.thread;\n if (!this.enabled() || conversation?.status === 'archived'\n || (thread && thread.role !== 'participant' && thread.role !== 'approver')) {\n return null;\n }\n\n const agentId = conversation?.agentId ?? this.selectedAgentIdState();\n const uploads = this.agents().find(agent => agent.id === agentId)?.uploads ?? null;\n return uploads && uploads.acceptedMediaTypes.length > 0 && uploads.maxFiles > 0 ? uploads : null;\n });\n /** The attachments of the next message of the open conversation, in the order they were chosen. */\n readonly attachments = computed<readonly NhAssistantAttachment[]>(() =>\n this.attachmentsState().get(this.activeIdState() ?? newConversationKey) ?? []);\n /** The stored files of the open conversation's next message, for `submit`. */\n readonly attachedFiles = computed<FileReference[]>(() => this.attachments()\n .filter(attachment => attachment.state === 'uploaded' && attachment.file !== null)\n .map(attachment => attachment.file!));\n /** True while a file of the next message still uploads; the message waits for it. */\n readonly uploading = computed(() => this.attachments().some(attachment => attachment.state === 'uploading'));\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 for (const upload of this.uploadSubscriptions.values()) {\n upload.unsubscribe();\n }\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 && acceptsMessage(session?.conversation.status) && !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. `files` are uploaded\n * attachments, such as `attachedFiles()`; once the message is accepted, the attachments of the\n * conversation leave the composer.\n */\n async send(text: string, files: readonly FileReference[] = []): 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, undefined, files);\n }\n\n /**\n * Sends immediately when the conversation accepts a message, otherwise appends to the\n * conversation's FIFO queue. A shown error alone does not hold a message back while nothing is\n * queued: the person asks again, for example after a failed turn. Queued messages still wait\n * for an explicit `resumeQueue` after Stop or a failure. A queued message keeps its `files`.\n */\n async submit(text: string, files: readonly FileReference[] = []): Promise<boolean> {\n const stopped = this.pausedQueuesState().has(this.activeIdState() ?? newConversationKey);\n if (this.canSend() && this.queuedMessages().length === 0 && !stopped && !this.submittingState()) {\n const revision = this.accountRevision;\n this.submittingState.set(true);\n try {\n return await this.send(text, files);\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 = {\n id: createClientMessageId(),\n conversationId,\n text: trimmed,\n state: 'preparing',\n ...(files.length > 0 ? { files: [...files] } : {})\n };\n this.queuedState.update(items => [...items, item]);\n this.releaseAttachments(conversationId, files);\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, item.files ?? []);\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 | undefined, files: readonly FileReference[]): 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 && acceptsMessage(conversation?.status) && !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 const parts: MessagePart[] = [\n { type: 'text', text: trimmed },\n ...files.map(file => ({ type: 'file' as const, name: file.name, mediaType: file.mediaType, size: file.size }))\n ];\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,\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 let waitsForRun = false;\n\n this.runStream(conversationId, this.api.sendMessage(conversationId, {\n text: trimmed,\n clientMessageId,\n ...(clientContext === undefined ? {} : { clientContext }),\n ...(files.length > 0 ? { files: [...files] } : {})\n }), {\n next: event => {\n if (event.type === 'message.queued') {\n // An agent's run works in the thread: the message, with its files, waits for the next run,\n // which adds it to the thread. Until then the notice says so.\n waitsForRun = true;\n this.removeMessage(conversationId, clientMessageId, previousStatus);\n this.releaseAttachments(conversationId, files);\n this.patchSession(conversationId, session => ({ ...session, notice: messageQueuedNotice(files.length) }));\n resolve(true);\n return;\n }\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 // The message carries the files now; they leave the composer.\n this.releaseAttachments(conversationId, files);\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 || waitsForRun);\n // A waiting message started no turn here: the thread's own state comes from the server.\n this.afterTurn(conversationId, failedAfterStart || waitsForRun);\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 /**\n * Attaches files to the next message of the open conversation and uploads them at once. Each\n * file is checked first against `uploads()`: the most files of one message, the accepted media\n * types and the largest size; a file that fails stays as a failed attachment with its code and\n * is never uploaded. A new conversation is created first, because an upload belongs to one.\n */\n async attach(files: readonly File[]): Promise<void> {\n const uploads = this.uploads();\n if (!uploads || files.length === 0) {\n return;\n }\n\n const revision = this.accountRevision;\n const key = this.activeIdState() ?? newConversationKey;\n let attached = this.attachmentsOf(key).filter(attachment => attachment.state !== 'failed').length;\n const added: NhAssistantAttachment[] = [];\n const pending: { attachment: NhAssistantAttachment; content: Blob }[] = [];\n for (const file of files) {\n const mediaType = nhAssistantMediaTypeOf(file);\n const problem = nhAssistantFileProblem(file, mediaType, uploads, attached);\n const attachment: NhAssistantAttachment = {\n id: createClientMessageId(),\n name: file.name,\n mediaType,\n size: file.size,\n state: problem ? 'failed' : 'uploading',\n progress: 0,\n file: null,\n error: problem ? clientError(problem) : null\n };\n added.push(attachment);\n if (!problem) {\n attached++;\n // The upload declares the media type the check accepted, also when the browser gave none.\n pending.push({ attachment, content: file.slice(0, file.size, mediaType) });\n }\n }\n this.patchAttachments(key, attachments => [...attachments, ...added]);\n if (pending.length === 0) {\n return;\n }\n\n let conversationId = this.activeIdState();\n if (conversationId === null) {\n this.attachmentConversation ??= this.createConversation().finally(() => {\n this.attachmentConversation = null;\n });\n const conversation = await this.attachmentConversation;\n if (revision !== this.accountRevision || this.destroyed) {\n return;\n }\n if (!conversation) {\n const error = this.draftErrorState() ?? clientError(NhAssistantClientErrorCodes.server);\n this.patchAttachments(key, attachments => attachments.map(attachment => pending.some(item => item.attachment.id === attachment.id)\n ? { ...attachment, state: 'failed', error }\n : attachment));\n return;\n }\n conversationId = conversation.id;\n this.moveAttachments(key, conversationId);\n }\n\n for (const { attachment, content } of pending) {\n this.startUpload(conversationId, attachment, content);\n }\n }\n\n /** Removes an attachment of the next message; an upload in progress stops. */\n removeAttachment(attachmentId: string): void {\n this.uploadSubscriptions.get(attachmentId)?.unsubscribe();\n this.uploadSubscriptions.delete(attachmentId);\n this.attachmentsState.update(all => {\n const next = new Map<string, readonly NhAssistantAttachment[]>();\n for (const [key, attachments] of all) {\n const kept = attachments.filter(attachment => attachment.id !== attachmentId);\n if (kept.length > 0) {\n next.set(key, kept);\n }\n }\n return next;\n });\n }\n\n private startUpload(conversationId: string, attachment: NhAssistantAttachment, content: Blob): void {\n const revision = this.accountRevision;\n const update = (change: Partial<NhAssistantAttachment>) => {\n if (revision === this.accountRevision) {\n this.patchAttachments(conversationId, attachments => attachments.map(item => item.id === attachment.id ? { ...item, ...change } : item));\n }\n };\n const subscription = this.api.uploadFile(conversationId, content, attachment.name).subscribe({\n next: event => {\n if (event.type === 'progress') {\n update({ progress: event.total > 0 ? Math.min(1, event.loaded / event.total) : 0 });\n return;\n }\n update({ state: 'uploaded', progress: 1, file: event.file });\n },\n error: error => {\n this.uploadSubscriptions.delete(attachment.id);\n update({ state: 'failed', error: error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : clientError(NhAssistantClientErrorCodes.server) });\n },\n complete: () => this.uploadSubscriptions.delete(attachment.id)\n });\n if (!subscription.closed) {\n this.uploadSubscriptions.set(attachment.id, subscription);\n }\n }\n\n private attachmentsOf(key: string): readonly NhAssistantAttachment[] {\n return this.attachmentsState().get(key) ?? [];\n }\n\n private patchAttachments(\n key: string,\n update: (attachments: readonly NhAssistantAttachment[]) => readonly NhAssistantAttachment[]\n ): void {\n this.attachmentsState.update(all => {\n const next = new Map(all);\n const attachments = update(all.get(key) ?? []);\n if (attachments.length > 0) {\n next.set(key, attachments);\n } else {\n next.delete(key);\n }\n return next;\n });\n }\n\n /** Moves the attachments of a new conversation to the conversation that was created for them. */\n private moveAttachments(from: string, to: string): void {\n const moving = this.attachmentsOf(from);\n this.patchAttachments(from, () => []);\n this.patchAttachments(to, attachments => [...attachments, ...moving]);\n }\n\n /**\n * The attachments a message took leave the composer, and with them the failed ones; files that\n * still upload stay for the next message.\n */\n private releaseAttachments(conversationId: string, files: readonly FileReference[]): void {\n const sent = new Set(files.map(file => file.id));\n this.patchAttachments(conversationId, attachments => attachments.filter(attachment =>\n attachment.state === 'uploading' || (attachment.state === 'uploaded' && !sent.has(attachment.file?.id ?? ''))));\n }\n\n /** Stops the uploads of a conversation, or of every conversation, and forgets their attachments. */\n private dropAttachments(conversationId?: string): void {\n for (const [key, attachments] of this.attachmentsState()) {\n if (conversationId !== undefined && key !== conversationId) {\n continue;\n }\n for (const attachment of attachments) {\n this.uploadSubscriptions.get(attachment.id)?.unsubscribe();\n this.uploadSubscriptions.delete(attachment.id);\n }\n }\n if (conversationId === undefined) {\n this.attachmentsState.set(new Map());\n } else {\n this.patchAttachments(conversationId, () => []);\n }\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 const offered = this.agents().some(agent => agent.id === session.conversation.agentId);\n this.setActive(conversationId, offered ? session.conversation.agentId : undefined);\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 // An agent's thread about a subject opens for whoever the server lets read it, also for an\n // agent kept out of the chat, such as one run by hand; it is never chosen for a new chat.\n const offered = this.agents().some(agent => agent.id === conversation.agentId);\n if (!offered && conversation.kind !== 'thread') {\n this.uiState.update({ conversationId: null });\n return;\n }\n this.upsertSession(conversation);\n this.setActive(conversationId, offered ? conversation.agentId : undefined);\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.dropAttachments();\n this.attachmentConversation = null;\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<TEvent extends NhAssistantMessageEvent>(\n conversationId: string,\n stream: Observable<TEvent>,\n handlers: { next: (event: TEvent) => 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.dropAttachments(conversationId);\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/**\n * The notice of a message that waits for the next run of the agent working in the thread, with its\n * files when it carries any; the run adds the message to the thread when it takes it.\n */\nfunction messageQueuedNotice(fileCount: number): NhAssistantNotice {\n return {\n code: NH_ASSISTANT_MESSAGE_QUEUED_NOTICE_CODE,\n messageKey: fileCount > 0 ? 'nh-assistant.notices.message-queued-with-files' : 'nh-assistant.notices.message-queued'\n };\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 * Watches the work of agents for the whole application while the calling component lives, so their\n * proposals and runs arrive as live agent-work updates although the whole application lists no\n * members (see `NhAssistantLiveService.watchAgentWork`). Call it in an injection context, for example\n * a component constructor, of a screen that shows that work, such as the approval inbox or a board.\n */\nexport function nhAssistantWatchAgentWork(): void {\n const live = inject(NhAssistantLiveService, { optional: true });\n if (!live || typeof live.watchAgentWork !== 'function') {\n return;\n }\n\n const release = live.watchAgentWork();\n inject(DestroyRef).onDestroy(() => release());\n}\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 { NhAssistantMcpConnectService } from './services/nh-assistant-mcp-connect.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 NhAssistantMcpConnectService,\n // A redirect-mode MCP authorization returns to the page with its outcome in the fragment. Every\n // outcome, a failure to complete it included, arrives in `NhAssistantMcpConnectService.returned`,\n // where the connection screens show it.\n ...(config.mcpConnectMode === 'redirect'\n ? [provideEnvironmentInitializer(() => {\n inject(NhAssistantMcpConnectService).completeReturn().subscribe();\n })]\n : []),\n ...(config.translations === 'host'\n ? []\n : [provideEnvironmentInitializer(() => inject(NhAssistantTranslationMerger).start())])\n ]);\n}\n","import { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\n\n/**\n * Failure codes the assistant back-end sends in error bodies, SSE `error` events and tool\n * result codes (`NhAssistantErrorCodes`, `NhAssistantAdminErrorCodes` and the runtime codes\n * of `NewHeap.Platform.AI.Chat`). Every code needs a text under `nh-assistant.errors.<code>`\n * in each bundled language; the translation tests enforce that.\n */\nexport const NH_ASSISTANT_SERVER_ERROR_CODES: readonly string[] = [\n // Chat endpoints and turns\n 'assistant-disabled',\n 'assistant-conversation-not-found',\n 'assistant-conversation-busy',\n 'assistant-agent-not-found',\n 'assistant-agent-forbidden',\n 'assistant-message-invalid',\n 'assistant-message-too-long',\n 'assistant-message-duplicate',\n 'assistant-title-invalid',\n 'assistant-approval-not-found',\n 'assistant-approval-not-pending',\n 'assistant-approval-decision-invalid',\n 'assistant-proposal-hash-mismatch',\n 'assistant-approval-expired',\n 'assistant-approval-invalid',\n 'assistant-approval-rejected',\n 'assistant-budget-exhausted',\n 'assistant-tool-call-limit-reached',\n 'assistant-tools-disabled',\n 'assistant-turn-timeout',\n 'assistant-model-unavailable',\n 'assistant-classification-not-permitted',\n 'assistant-files-unavailable',\n 'assistant-files-not-accepted',\n 'assistant-file-reference-invalid',\n 'assistant-file-not-found',\n 'assistant-file-forbidden',\n 'assistant-file-unavailable',\n 'assistant-file-reader-failed',\n 'assistant-file-too-large',\n 'assistant-file-too-many-pages',\n 'assistant-file-count-limit',\n 'assistant-file-token-limit',\n 'assistant-file-type-not-supported',\n 'assistant-file-upload-invalid',\n 'assistant-file-type-not-accepted',\n 'assistant-file-upload-refused',\n 'assistant-file-upload-failed',\n 'assistant-file-scan-refused',\n 'assistant-turn-failed',\n 'assistant-context-unavailable',\n 'assistant-actor-mismatch',\n // Sharing and notifications\n 'assistant-owner-required',\n 'assistant-approval-forbidden',\n 'assistant-turn-forbidden',\n 'assistant-share-link-invalid',\n 'assistant-participant-not-found',\n 'assistant-participant-limit-reached',\n 'assistant-directory-unavailable',\n 'assistant-push-unavailable',\n 'assistant-push-subscription-invalid',\n // Agent runs\n 'assistant-subject-not-found',\n 'assistant-subject-invalid',\n 'assistant-subject-type-unknown',\n 'assistant-subject-search-unavailable',\n 'assistant-agent-does-not-work-on',\n 'assistant-subject-access-denied',\n 'assistant-no-accountable-owner',\n 'assistant-agent-disabled',\n 'assistant-agent-stopped',\n 'assistant-agent-paused',\n 'assistant-agent-configured-off',\n 'assistant-run-token-limit',\n 'assistant-skill-stopped',\n 'assistant-skill-paused',\n 'assistant-agent-off',\n 'assistant-skill-off',\n 'assistant-skill-not-found',\n 'assistant-skill-not-available',\n 'assistant-skill-switch-limit',\n 'assistant-moved-to-shadow',\n 'assistant-shadow-variant',\n 'assistant-service-account-not-used',\n 'assistant-service-account-not-found',\n 'assistant-skill-in-code',\n 'assistant-trigger-in-code',\n 'assistant-skill-in-use',\n 'assistant-configuration-limit',\n 'assistant-run-settings-in-code',\n 'assistant-run-settings-in-use',\n 'assistant-skill-candidate-not-found',\n 'assistant-skill-version-gone',\n 'assistant-account-search-unavailable',\n 'assistant-handoff-unavailable',\n 'assistant-handoff-not-accepted',\n 'assistant-handoff-subject-unavailable',\n 'assistant-handoff-shadow-to-live',\n 'assistant-handoff-chain-limit',\n 'assistant-handoff-limit-reached',\n 'assistant-replay-not-shadow',\n 'assistant-replay-active',\n 'assistant-evaluation-not-variant',\n 'assistant-agent-not-configured',\n 'assistant-run-not-found',\n 'assistant-run-not-retryable',\n 'assistant-run-filter-invalid',\n 'assistant-run-operation-cancelled',\n 'assistant-run-operation-stalled',\n 'assistant-run-operation-ended',\n 'assistant-board-not-found',\n 'assistant-board-scope-invalid',\n 'assistant-approval-policy-denied',\n 'assistant-four-eyes-required',\n 'assistant-execution-not-uncertain',\n 'assistant-proposal-stale',\n 'assistant-proposal-check-failed',\n 'assistant-proposal-already-open',\n 'assistant-proposal-recently-rejected',\n 'assistant-proposal-superseded',\n 'assistant-proposal-refused',\n 'assistant-proposal-placed',\n 'assistant-proposal-not-placed',\n 'assistant-proposal-not-needed',\n 'assistant-trigger-not-found',\n 'assistant-trigger-rate-limited',\n 'assistant-trigger-rolled-back',\n 'assistant-webhook-signature-invalid',\n 'assistant-webhook-payload-invalid',\n 'assistant-webhook-payload-too-large',\n 'assistant-memory-not-configured',\n 'assistant-memory-invalid',\n 'assistant-memory-conflict',\n 'assistant-artifact-invalid',\n 'assistant-artifact-outside-turn',\n 'assistant-artifact-not-found',\n // Feedback on proposals\n 'assistant-feedback-invalid',\n 'assistant-feedback-not-accepted',\n // Consultations of other agents\n 'assistant-consult-subject-unavailable',\n 'assistant-consult-agent-unavailable',\n 'assistant-consult-depth-exceeded',\n 'assistant-consult-budget-exhausted',\n 'assistant-consult-limit-reached',\n 'assistant-consult-timeout',\n 'assistant-consult-failed',\n 'assistant-consult-read-only',\n // Preferences and administration\n 'assistant-validation',\n 'assistant-instructions-too-long',\n 'assistant-forbidden',\n 'assistant-not-found',\n 'assistant-context-not-found',\n 'assistant-version-conflict',\n 'assistant-agent-exists',\n 'assistant-code-agent-not-deletable',\n 'assistant-agent-not-code',\n 'assistant-mcp-server-not-found',\n 'assistant-mcp-server-exists',\n 'assistant-mcp-tool-not-found',\n 'assistant-mcp-unreachable',\n 'assistant-mcp-unauthorized',\n 'assistant-mcp-host-blocked',\n 'assistant-mcp-schema-changed',\n 'assistant-mcp-tool-disabled',\n 'assistant-mcp-insufficient-scope',\n 'assistant-mcp-headless-not-allowed',\n 'assistant-mcp-credential-mismatch',\n 'assistant-mcp-consent-required',\n 'assistant-mcp-initiator-only',\n 'assistant-mcp-delegated-token-unavailable',\n 'assistant-mcp-secret-reference-invalid',\n 'assistant-mcp-certificate-reference-invalid',\n 'assistant-mcp-secret-unreadable',\n 'assistant-mcp-secret-unavailable',\n // MCP OAuth connections\n 'assistant-mcp-connection-required',\n 'assistant-mcp-reauthorization-required',\n 'assistant-mcp-scope-not-allowed',\n 'assistant-mcp-authorization-failed',\n 'assistant-mcp-authorization-expired',\n 'assistant-mcp-authorization-invalid',\n 'assistant-mcp-discovery-failed',\n 'assistant-mcp-pkce-unsupported',\n 'assistant-mcp-client-registration-required',\n 'assistant-mcp-token-request-failed',\n 'assistant-mcp-issuer-changed',\n 'assistant-mcp-authorization-not-confirmed',\n 'assistant-mcp-oauth-not-configured',\n 'assistant-mcp-too-many-authorizations',\n 'assistant-mcp-connection-not-supported'\n];\n\n/** Every code the assistant UI can show: server codes and client-side transport codes. */\nexport const NH_ASSISTANT_ERROR_CODES: readonly string[] = [\n ...new Set([...NH_ASSISTANT_SERVER_ERROR_CODES, ...Object.values(NhAssistantClientErrorCodes)])\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 | 'attach'\n | 'file';\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 attach: 'M19 11.5l-7.6 7.6a4.6 4.6 0 0 1-6.5-6.5l8.3-8.3a3 3 0 0 1 4.3 4.3l-8.2 8.2a1.5 1.5 0 0 1-2.1-2.1l7.4-7.4',\n file: 'M6 3h8l4 4v14H6zM14 3v4h4'\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, TranslateService } from '@ngx-translate/core';\nimport { AgentUploads } from '../../models/assistant-api.models';\nimport {\n nhAssistantAcceptAttribute,\n nhAssistantFileTypeLabel,\n nhAssistantFormatFileSize\n} from '../../internal/nh-assistant-files';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport type { NhAssistantAttachment } from '../../services/nh-assistant.store';\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. With `uploads`, an\n * attach button chooses files for the next message; the host uploads them and passes them back as\n * `attachments`, which show their progress, or why they cannot be attached, at the control. Sending\n * waits while a file uploads.\n */\n@Component({\n selector: 'nh-assistant-composer',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent, NhAssistantTranslatePipe],\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 * What the person may attach, for example `NhAssistantStore.uploads()`; `null` hides the attach\n * button.\n */\n readonly uploads = input<AgentUploads | null>(null);\n /** The attachments of the next message, for example `NhAssistantStore.attachments()`. */\n readonly attachments = input<readonly NhAssistantAttachment[]>([]);\n\n readonly send = output<string>();\n readonly cancel = output<void>();\n readonly restored = output<void>();\n /** Files the person chose to attach, for example for `NhAssistantStore.attach`. */\n readonly attach = output<File[]>();\n /** The id of an attachment the person removed, for example for `NhAssistantStore.removeAttachment`. */\n readonly removeAttachment = output<string>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly textarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('textarea');\n private readonly attachButton = viewChild<ElementRef<HTMLButtonElement>>('attachButton');\n private ownedFocus = false;\n private previousBusy = false;\n\n readonly inputId = `nh-assistant-composer-${nextId++}`;\n readonly hintId = `${this.inputId}-hint`;\n readonly attachHintId = `${this.inputId}-attach-hint`;\n readonly attachmentsId = `${this.inputId}-attachments`;\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 /** True while a file of the next message still uploads. */\n readonly uploading = computed(() => this.attachments().some(attachment => attachment.state === 'uploading'));\n readonly canSend = computed(() =>\n !this.disabled() && !this.sendDisabled() && this.length() > 0 && !this.tooLong() && !this.uploading());\n /** The `accept` attribute of the file input. */\n readonly accept = computed(() => nhAssistantAcceptAttribute(this.uploads()?.acceptedMediaTypes ?? []));\n /** The values the attachment texts name: the accepted types, the largest size and the most files. */\n readonly uploadParams = computed(() => {\n const uploads = this.uploads();\n return {\n types: (uploads?.acceptedMediaTypes ?? []).map(nhAssistantFileTypeLabel).join(', '),\n max: uploads ? this.size(uploads.maxFileBytes) : '',\n count: uploads?.maxFiles ?? 0\n };\n });\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 /** Hands the chosen files to the host and empties the input, so the same file can be chosen again. */\n onFilesChosen(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n input.value = '';\n if (files.length > 0) {\n this.attach.emit(files);\n }\n }\n\n /** Removes an attachment and keeps the keyboard in the composer, on the attach button. */\n remove(attachment: NhAssistantAttachment): void {\n this.removeAttachment.emit(attachment.id);\n queueMicrotask(() => (this.attachButton()?.nativeElement ?? this.textarea().nativeElement).focus({ preventScroll: true }));\n }\n\n /** The translation keys of why an attachment failed, from the composer's own text to the generic one. */\n errorKeys(attachment: NhAssistantAttachment): string[] {\n const error = attachment.error;\n if (!error) {\n return [];\n }\n\n return [\n `nh-assistant.composer.attachment-errors.${error.code}`,\n error.messageKey,\n `nh-assistant.errors.${error.code}`,\n 'nh-assistant.errors.generic'\n ];\n }\n\n percent(attachment: NhAssistantAttachment): number {\n return Math.round(attachment.progress * 100);\n }\n\n /** A size in bytes in the current language, such as `1.4 MB`. */\n size(bytes: number): string {\n return nhAssistantFormatFileSize(bytes, this.translate?.getCurrentLang());\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 @if (attachments().length > 0) {\n <ul class=\"attachments\" [id]=\"attachmentsId\" [attr.aria-label]=\"'nh-assistant.composer.attachments' | translate\">\n @for (attachment of attachments(); track attachment.id) {\n <li class=\"attachment\" [attr.data-state]=\"attachment.state\">\n <nh-assistant-icon class=\"attachment-icon\" [name]=\"attachment.state === 'failed' ? 'warning' : 'file'\" />\n <div class=\"attachment-body\">\n <span class=\"attachment-name\" [attr.title]=\"attachment.name\">{{ attachment.name }}</span>\n @switch (attachment.state) {\n @case ('uploading') {\n <progress\n class=\"attachment-progress\"\n max=\"100\"\n [value]=\"percent(attachment)\"\n [attr.aria-label]=\"'nh-assistant.composer.uploading' | translate: { name: attachment.name }\"></progress>\n }\n @case ('failed') {\n <span class=\"attachment-error\" role=\"alert\">\n {{ errorKeys(attachment) | nhAssistantTranslate: (attachment.error?.code ?? '') : uploadParams() }}\n </span>\n }\n @default {\n <span class=\"attachment-meta\">{{ size(attachment.size) }}</span>\n }\n }\n </div>\n <button\n class=\"attachment-remove\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.composer.remove-attachment' | translate: { name: attachment.name }\"\n [attr.title]=\"'nh-assistant.composer.remove-attachment' | translate: { name: attachment.name }\"\n (click)=\"remove(attachment)\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </li>\n }\n </ul>\n }\n\n <div class=\"prompt-bar\">\n @if (uploads()) {\n <button\n #attachButton\n class=\"attach\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.composer.attach' | translate\"\n [attr.title]=\"'nh-assistant.composer.attach-hint' | translate: uploadParams()\"\n [attr.aria-describedby]=\"attachHintId\"\n (click)=\"fileInput.click()\">\n <nh-assistant-icon name=\"attach\" />\n </button>\n <span class=\"visually-hidden\" [id]=\"attachHintId\">{{ 'nh-assistant.composer.attach-hint' | translate: uploadParams() }}</span>\n <input\n #fileInput\n class=\"visually-hidden\"\n type=\"file\"\n multiple\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n (change)=\"onFilesChosen($event)\" />\n }\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 if (uploading()) {\n <span>{{ 'nh-assistant.composer.uploading-hint' | 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 { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport { McpConnection } from '../../models/assistant-admin.models';\nimport { nhAssistantErrorKeys, nhAssistantErrorOf, toNhAssistantError } from '../../internal/nh-assistant-errors';\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 { NhAssistantMcpConnectService } from '../../services/nh-assistant-mcp-connect.service';\nimport { NhAssistantError, NhAssistantStore } from '../../services/nh-assistant.store';\n\nlet nextId = 0;\n\n/**\n * The caller's own MCP accounts: servers each person connects to with OAuth, with Connect,\n * Connect again and Disconnect, and the consent to background use of servers that run with the\n * caller's own account. Each change applies at once. Renders nothing while no server asks for it,\n * so most applications never show it.\n */\n@Component({\n selector: 'nh-assistant-mcp-connections',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-mcp-connections.component.html',\n styleUrl: './nh-assistant-mcp-connections.component.scss'\n})\nexport class NhAssistantMcpConnectionsComponent {\n private readonly api = inject(NhAssistantApiService);\n private readonly connector = inject(NhAssistantMcpConnectService);\n private readonly store = inject(NhAssistantStore, { optional: true });\n private loadSubscription?: Subscription;\n private updateSubscription?: Subscription;\n\n readonly id = `nh-assistant-mcp-connections-${nextId++}`;\n readonly connections = signal<McpConnection[]>([]);\n readonly loadFailed = signal(false);\n /** The server whose consent or connection is being changed. */\n readonly busy = signal<string | null>(null);\n readonly confirmingDisconnect = signal<string | null>(null);\n /** The latest change to announce, per server. */\n readonly notice = signal<{ serverId: string; key: string } | null>(null);\n readonly error = signal<NhAssistantError | null>(null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n /** Whether any listed server is one the caller connects with OAuth. */\n readonly connectsAccounts = computed(() => this.connections().some(connection => connection.connectionStatus !== null));\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.loadSubscription?.unsubscribe();\n this.updateSubscription?.unsubscribe();\n });\n this.load();\n // A redirect-mode authorization that returned to this page.\n effect(() => {\n const returned = this.connector.returned();\n if (returned) {\n untracked(() => {\n this.connector.returned.set(null);\n if (returned.completion) {\n this.notice.set({ serverId: returned.completion.serverId, key: 'nh-assistant.preferences.mcp.connect-done' });\n this.load();\n } else {\n this.error.set(nhAssistantErrorOf(returned.code));\n }\n });\n }\n });\n }\n\n load(): void {\n this.loadFailed.set(false);\n this.loadSubscription?.unsubscribe();\n this.loadSubscription = this.api.getMcpConnections().subscribe({\n next: connections => this.connections.set(connections),\n error: () => this.loadFailed.set(true)\n });\n }\n\n /** The agents' names as the chat shows them; an agent the chat does not list shows its id. */\n agentKeys(connection: McpConnection): string[] {\n const agents = this.store?.agents() ?? [];\n return connection.agentIds.map(agentId => agents.find(agent => agent.id === agentId)?.displayNameKey ?? agentId);\n }\n\n toggle(connection: McpConnection, event: Event): void {\n const allow = (event.target as HTMLInputElement).checked;\n this.busy.set(connection.serverId);\n this.error.set(null);\n this.notice.set(null);\n this.updateSubscription?.unsubscribe();\n this.updateSubscription = this.api.updateMcpConnection(connection.serverId, { allowBackgroundUse: allow }).subscribe({\n next: updated => {\n this.connections.update(items => items.map(item => item.serverId === updated.serverId ? updated : item));\n this.busy.set(null);\n },\n error: (error: unknown) => {\n // Show the stored decision again.\n this.connections.update(items => [...items]);\n (event.target as HTMLInputElement).checked = connection.allowBackgroundUse;\n this.busy.set(null);\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n\n /** Connects the caller's own account; call from the click, so the popup is allowed. */\n connect(connection: McpConnection): void {\n this.busy.set(connection.serverId);\n this.error.set(null);\n this.notice.set(null);\n this.updateSubscription?.unsubscribe();\n this.updateSubscription = this.connector.connect(connection.serverId).subscribe({\n next: () => {\n this.busy.set(null);\n this.notice.set({ serverId: connection.serverId, key: 'nh-assistant.preferences.mcp.connect-done' });\n this.load();\n },\n error: (error: unknown) => {\n this.busy.set(null);\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n\n disconnect(connection: McpConnection): void {\n this.confirmingDisconnect.set(null);\n this.busy.set(connection.serverId);\n this.error.set(null);\n this.notice.set(null);\n this.updateSubscription?.unsubscribe();\n this.updateSubscription = this.api.disconnectMcpConnection(connection.serverId).subscribe({\n complete: () => {\n this.busy.set(null);\n this.notice.set({ serverId: connection.serverId, key: 'nh-assistant.preferences.mcp.disconnect-done' });\n this.load();\n },\n error: (error: unknown) => {\n this.busy.set(null);\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n}\n","@if (connections().length > 0) {\n <fieldset class=\"connections\" [attr.aria-busy]=\"busy() !== null\">\n <legend>{{ (connectsAccounts() ? 'nh-assistant.preferences.mcp.accounts-title' : 'nh-assistant.preferences.mcp.title') | translate }}</legend>\n <p class=\"hint\">{{ (connectsAccounts() ? 'nh-assistant.preferences.mcp.accounts-description' : 'nh-assistant.preferences.mcp.description') | translate }}</p>\n <ul class=\"list\">\n @for (connection of connections(); track connection.serverId) {\n <li class=\"item\" [attr.data-status]=\"connection.connectionStatus\">\n @if (connection.connectionStatus !== null) {\n <div class=\"account\">\n <strong class=\"name\">{{ connection.displayName }}</strong>\n <span\n class=\"badge\"\n [class.success]=\"connection.connectionStatus === 'active'\"\n [class.warning]=\"connection.connectionStatus === 'reauthorization-required' || connection.connectionStatus === 'issuer-changed'\">\n {{ 'nh-assistant.preferences.mcp.status.' + connection.connectionStatus | translate }}\n </span>\n </div>\n @if (connection.connectionStatus === 'active' && connection.connectedAt) {\n <p class=\"hint details\">{{ 'nh-assistant.preferences.mcp.connected-since' | translate: { date: (connection.connectedAt | date: 'medium') } }}</p>\n }\n @if (connection.requiredScopes; as scopes) {\n <p class=\"hint details\">{{ 'nh-assistant.preferences.mcp.more-permissions' | translate: { scopes: scopes } }}</p>\n }\n @if (connection.connectionStatus === 'issuer-changed') {\n <p class=\"hint details\">{{ 'nh-assistant.preferences.mcp.issuer-changed' | translate }}</p>\n }\n <div class=\"actions\">\n @if (connection.connectionStatus !== 'issuer-changed') {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy() !== null\" (click)=\"connect(connection)\">\n {{ (connection.connectionStatus === 'not-connected' ? 'nh-assistant.preferences.mcp.connect' : 'nh-assistant.preferences.mcp.connect-again') | translate }}\n </button>\n }\n @if (connection.connectionStatus !== 'not-connected') {\n @if (confirmingDisconnect() === connection.serverId) {\n <button class=\"secondary danger\" type=\"button\" [disabled]=\"busy() !== null\" (click)=\"disconnect(connection)\">\n {{ 'nh-assistant.preferences.mcp.confirm-disconnect' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirmingDisconnect.set(null)\">{{ 'nh-assistant.preferences.mcp.cancel' | translate }}</button>\n } @else {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy() !== null\" (click)=\"confirmingDisconnect.set(connection.serverId)\">\n {{ 'nh-assistant.preferences.mcp.disconnect' | translate }}\n </button>\n }\n }\n </div>\n }\n @if (connection.offersBackgroundUse) {\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [checked]=\"connection.allowBackgroundUse\"\n [disabled]=\"busy() !== null\"\n [attr.aria-describedby]=\"id + '-' + connection.serverId\"\n (change)=\"toggle(connection, $event)\" />\n <span>{{ 'nh-assistant.preferences.mcp.allow' | translate: { name: connection.displayName } }}</span>\n </label>\n }\n <p class=\"hint details\" [id]=\"id + '-' + connection.serverId\">\n <span class=\"host\">{{ connection.host }}</span>\n @if (connection.offersBackgroundUse) {\n <span>\n @if (connection.allowBackgroundUse && connection.consentedAt) {\n {{ 'nh-assistant.preferences.mcp.allowed-since' | translate: { date: (connection.consentedAt | date: 'medium') } }}\n } @else {\n {{ 'nh-assistant.preferences.mcp.not-allowed' | translate }}\n }\n </span>\n }\n <span>\n {{ 'nh-assistant.preferences.mcp.used-by' | translate }}\n @for (key of agentKeys(connection); track $index) {\n <span class=\"agent\">{{ [key] | nhAssistantTranslate: key }}</span>\n }\n </span>\n </p>\n @if (notice()?.serverId === connection.serverId) {\n <p class=\"message success\" role=\"status\"><nh-assistant-icon name=\"check\" />{{ notice()!.key | translate: { name: connection.displayName } }}</p>\n }\n </li>\n }\n </ul>\n @if (error(); as failure) {\n <p class=\"message error\" role=\"alert\">\n <nh-assistant-icon name=\"warning\" />\n {{ errorKeys() | nhAssistantTranslate: failure.code }}\n </p>\n }\n </fieldset>\n} @else if (loadFailed()) {\n <div class=\"load-failed\" role=\"alert\">\n <span>{{ 'nh-assistant.preferences.mcp.load-failed' | translate }}</span>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.preferences.retry' | translate }}</button>\n </div>\n}\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 { nhAssistantErrorKeys, toNhAssistantError } from '../../internal/nh-assistant-errors';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantMcpConnectionsComponent } from './nh-assistant-mcp-connections.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';\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, background use of MCP servers\n * with the user's own account, style, form of address, answer length and optional instructions.\n * Notifications and background use 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, NhAssistantMcpConnectionsComponent],\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(() => nhAssistantErrorKeys(this.error()));\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(toNhAssistantError(error));\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(toNhAssistantError(error));\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 <nh-assistant-mcp-connections />\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, ConnectionRequiredPart, FilePart, MessagePart, TextPart, ToolCallPart } from '../models/assistant-api.models';\n\n/**\n * A message part as the thread renders it: consecutive tool calls form one group, and so do\n * consecutive attached files.\n */\nexport type NhAssistantPartGroup =\n | { kind: 'text'; key: string; part: TextPart }\n | { kind: 'approval'; key: string; part: ApprovalPart }\n | { kind: 'connection'; key: string; part: ConnectionRequiredPart }\n | { kind: 'tools'; key: string; calls: ToolCallPart[] }\n | { kind: 'files'; key: string; files: FilePart[] };\n\n/**\n * Groups consecutive tool calls of a message, and consecutive files. Text and approvals break a\n * group, so an approval always stays visible. A tool group's key is its first invocation id, so it\n * keeps 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 let files: { kind: 'files'; key: string; files: FilePart[] } | null = null;\n\n parts.forEach((part, index) => {\n if (part.type === 'tool-call') {\n files = null;\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 === 'file') {\n if (!files) {\n files = { kind: 'files', key: `files:${index}`, files: [] };\n groups.push(files);\n }\n files.files.push(part);\n return;\n }\n\n files = null;\n if (part.type === 'approval') {\n groups.push({ kind: 'approval', key: `approval:${part.approvalId}`, part });\n } else if (part.type === 'connection-required') {\n groups.push({ kind: 'connection', key: `connection:${part.serverId}:${index}`, 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 { 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. A proposal that closed because it no\n * longer fits shows why, such as \"Already done\", with the application's explanation.\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 /**\n * Translation key of the status: the kind of a stale proposal, \"replaced\" for a superseded one,\n * otherwise the status itself.\n */\n readonly statusKey = computed(() => {\n const kind = this.approval().staleKind;\n if (this.effectiveStatus() === 'stale' && kind) {\n return `nh-assistant.approval.stale-kind.${kind}`;\n }\n\n return this.effectiveStatus() === 'withdrawn' && this.approval().supersededByApprovalId\n ? 'nh-assistant.approval.superseded'\n : `nh-assistant.approval.status.${this.effectiveStatus()}`;\n });\n /** Why the agent's rules proposed it; model proposals have none. */\n readonly rationale = computed(() => this.approval().rationale ?? null);\n /** The application's explanation of a stale proposal, such as who already did the work. */\n readonly staleExplanation = computed(() =>\n this.effectiveStatus() === 'stale' ? this.approval().staleExplanation ?? null : null);\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\">{{ statusKey() | translate }}</span>\n </header>\n\n @if (staleExplanation(); as explanation) {\n <p class=\"stale-explanation\">{{ explanation }}</p>\n }\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 @if (rationale(); as why) {\n <p class=\"rationale\">{{ 'nh-assistant.approval.rationale' | translate: { rationale: why } }}</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, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport { ConnectionRequiredPart } from '../../models/assistant-api.models';\nimport { nhAssistantErrorKeys, nhAssistantErrorOf, toNhAssistantError } from '../../internal/nh-assistant-errors';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NhAssistantMcpConnectService, NhAssistantMcpReturnOutcome } from '../../services/nh-assistant-mcp-connect.service';\nimport { NhAssistantError } from '../../services/nh-assistant.store';\n\nlet nextId = 0;\n\n/**\n * The card of a turn that went on without an MCP server the person who asked has to connect. It\n * connects the viewer's own account, in a popup or by redirect as the host configured, and then\n * offers to ask again. After a redirect the page returns to, the card of that server shows how the\n * connection ended: connected, or the failure with its translated code.\n */\n@Component({\n selector: 'nh-assistant-connection-required',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-connection-required.component.html',\n styleUrl: './nh-assistant-connection-required.component.scss',\n host: { '[attr.data-state]': 'state()' }\n})\nexport class NhAssistantConnectionRequiredComponent {\n private readonly connections = inject(NhAssistantMcpConnectService);\n private subscription?: Subscription;\n\n readonly part = input.required<ConnectionRequiredPart>();\n /** Whether \"Ask again\" is offered once the account is connected. */\n readonly canRetry = input(true);\n /** Asks the question of the turn again after the account was connected. */\n readonly retry = output<void>();\n\n readonly id = `nh-assistant-connection-${nextId++}`;\n readonly state = signal<'idle' | 'connecting' | 'connected' | 'failed'>('idle');\n /** Why connecting failed, as a code and translation key. */\n readonly error = signal<NhAssistantError | null>(null);\n /** The code of `error`. */\n readonly errorCode = computed(() => this.error()?.code ?? null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n /** The connect button names connecting again when the person had connected before. */\n readonly again = computed(() => this.part().reason !== 'not-connected');\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n // The page returned from connecting this card's server in redirect mode.\n effect(() => {\n const returned = this.connections.returned();\n const serverId = this.part().serverId;\n if (returned && serverOf(returned) === serverId) {\n untracked(() => this.showReturned(returned));\n }\n });\n }\n\n connect(): void {\n if (this.state() === 'connecting') {\n return;\n }\n this.state.set('connecting');\n this.error.set(null);\n this.subscription?.unsubscribe();\n this.subscription = this.connections.connect(this.part().serverId).subscribe({\n next: () => this.state.set('connected'),\n error: (error: unknown) => {\n this.state.set('failed');\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n\n private showReturned(returned: NhAssistantMcpReturnOutcome): void {\n if (this.state() === 'connecting') {\n return;\n }\n if (returned.completion) {\n this.state.set('connected');\n this.error.set(null);\n return;\n }\n\n this.state.set('failed');\n this.error.set(nhAssistantErrorOf(returned.code));\n }\n}\n\n/** The server a returned outcome belongs to: the connected one, or the one the page left for. */\nfunction serverOf(returned: NhAssistantMcpReturnOutcome): string | null {\n return returned.completion?.serverId ?? returned.serverId ?? null;\n}\n","<section class=\"card\" role=\"group\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"state() === 'connecting'\">\n <div class=\"header\">\n <nh-assistant-icon [name]=\"state() === 'connected' ? 'check' : 'link'\" />\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.connection.title' | translate: { name: part().displayName } }}</h3>\n </div>\n <p class=\"text\">{{ 'nh-assistant.connection.' + part().reason | translate: { name: part().displayName } }}</p>\n\n <div class=\"actions\" aria-live=\"polite\">\n @switch (state()) {\n @case ('connected') {\n <p class=\"done\" role=\"status\"><nh-assistant-icon name=\"check\" />{{ 'nh-assistant.connection.connected' | translate: { name: part().displayName } }}</p>\n @if (canRetry()) {\n <button class=\"primary\" type=\"button\" (click)=\"retry.emit()\">{{ 'nh-assistant.connection.retry' | translate }}</button>\n }\n }\n @case ('connecting') {\n <button class=\"primary\" type=\"button\" disabled>{{ 'nh-assistant.connection.connecting' | translate }}</button>\n }\n @default {\n <button class=\"primary\" type=\"button\" (click)=\"connect()\">\n {{ (again() ? 'nh-assistant.connection.connect-again' : 'nh-assistant.connection.connect') | translate }}\n </button>\n }\n }\n </div>\n\n @if (error(); as failure) {\n <p class=\"error\" role=\"alert\" data-connection-error><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: failure.code }}</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 // 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, TranslateService } from '@ngx-translate/core';\nimport { ApprovalDecision, ApprovalPart, ConversationMember, FilePart, Message } from '../../models/assistant-api.models';\nimport { nhAssistantFileTypeLabel, nhAssistantFormatFileSize } from '../../internal/nh-assistant-files';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\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 { NhAssistantConnectionRequiredComponent } from '../connection-required/nh-assistant-connection-required.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. The files a person attached show by name, type and size. Messages a\n * trigger wrote into an agent thread read as events, not as a person. While a turn runs\n * without visible progress, a working indicator shows the elapsed time. The thread follows\n * 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 NhAssistantIconComponent,\n NhAssistantMarkdownPipe,\n NhAssistantPartGroupsPipe,\n NhAssistantToolCallGroupComponent,\n NhAssistantApprovalCardComponent,\n NhAssistantConnectionRequiredComponent\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 private readonly translate = inject(TranslateService, { optional: true });\n\n /** The type and size of an attached file, in the current language. */\n fileMeta(file: FilePart): { type: string; size: string } {\n return {\n type: nhAssistantFileTypeLabel(file.mediaType),\n size: nhAssistantFormatFileSize(file.size, this.translate?.getCurrentLang())\n };\n }\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 * The question to ask again after the viewer connected an MCP server from a connection card: the\n * text of the user message the card answered. The panel sends it.\n */\n readonly retryMessage = output<string>();\n\n private readonly names = computed(() => new Map(this.members().map(member => [member.actorId, member.displayName])));\n\n /** Asks the question again that the assistant message with a connection card answered. */\n retryAfterConnect(message: Message): void {\n const messages = this.messages();\n const index = messages.findIndex(item => item.id === message.id);\n for (let position = index - 1; position >= 0; position--) {\n const candidate = messages[position];\n if (candidate.role !== 'user') {\n continue;\n }\n const text = candidate.parts.map(part => part.type === 'text' ? part.text : '').join('').trim();\n if (text.length > 0) {\n this.retryMessage.emit(text);\n }\n return;\n }\n }\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 an assistant message the agent's rules wrote without a model. */\n isRule(message: Message): boolean {\n return message.role === 'assistant' && message.authorKind === 'rule';\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' : isRule(message) ? 'rule' : null\">\n @if (isTrigger(message)) {\n <p class=\"author\">{{ 'nh-assistant.thread.trigger' | translate }}</p>\n } @else if (isRule(message)) {\n <p class=\"author\">{{ 'nh-assistant.thread.rule' | 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 ('files') {\n <ul class=\"files\" [attr.aria-label]=\"'nh-assistant.thread.files' | translate\">\n @for (file of group.files; track $index) {\n <li class=\"file\">\n <nh-assistant-icon class=\"file-icon\" name=\"file\" />\n <span class=\"file-name\" [attr.title]=\"file.name\">{{ file.name }}</span>\n <span class=\"file-meta\">{{ 'nh-assistant.thread.file-meta' | translate: fileMeta(file) }}</span>\n </li>\n }\n </ul>\n }\n @case ('connection') {\n <nh-assistant-connection-required\n class=\"part\"\n [part]=\"group.part\"\n [canRetry]=\"!streaming()\"\n (retry)=\"retryAfterConnect(message)\" />\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, FileReference } 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 { nhAssistantErrorKeys, toNhAssistantError } from '../../internal/nh-assistant-errors';\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 /** An archived conversation takes no new messages. A failed one does: the person asks again. */\n readonly closed = computed(() => this.conversation()?.status === 'archived');\n readonly busy = computed(() => this.store.streaming() || this.conversation()?.status === 'running');\n /**\n * The last turn failed and no error bar explains it, for example after the conversation was\n * reopened. The panel then says so, while the composer stays available.\n */\n readonly lastTurnFailed = computed(() => this.conversation()?.status === 'failed'\n && !this.busy() && this.store.error() === null);\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(() => nhAssistantErrorKeys(this.notificationError() ?? this.store.error()));\n readonly noticeKeys = computed(() => nhAssistantErrorKeys(this.store.notice()));\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(toNhAssistantError(error));\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, this.store.attachedFiles());\n }\n\n /** Uploads the files the person attached to the next message. */\n attach(files: File[]): void {\n void this.store.attach(files);\n }\n\n /** The names of the files a queued message carries, as the queue lists them. */\n fileNames(files: readonly FileReference[]): string {\n return files.map(file => file.name).join(', ');\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 (retryMessage)=\"store.send($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 } @else if (lastTurnFailed()) {\n <p class=\"notice\">{{ 'nh-assistant.panel.last-turn-failed' | 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.files?.length) {\n <span class=\"queue-state queue-files\" data-queue-files>{{ 'nh-assistant.queue.files' | translate: { count: item.files!.length, names: fileNames(item.files!) } }}</span>\n }\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 [uploads]=\"store.uploads()\"\n [attachments]=\"store.attachments()\"\n (restored)=\"store.consumeRestoredDraft()\"\n (send)=\"send($event)\"\n (attach)=\"attach($event)\"\n (removeAttachment)=\"store.removeAttachment($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","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { NhAssistantError } from '../services/nh-assistant.store';\nimport { nhAssistantErrorKeys, toNhAssistantError } from './nh-assistant-errors';\nimport { NhAssistantIconComponent } from './nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from './nh-assistant-translate.pipe';\n\n/** One choice of a picker: the stored value, its name and what it means. */\nexport interface NhAssistantPickerOption {\n value: string;\n label: string;\n description?: string | null;\n}\n\nlet nextId = 0;\nconst searchDelayMs = 250;\n\n/**\n * A searchable choice for the administration (internal): a combobox with a listbox popup in the ARIA\n * 1.2 pattern. Typing filters the options on name and description, the arrow keys move, Enter\n * chooses and Escape closes. With `search` it asks the server instead, after `minQueryLength`\n * characters; a failed search says why below the field, with its translated code, and offers to\n * search again instead of claiming that nothing was found. `noneLabel` adds an explicit empty\n * choice, emitted as `''`.\n */\n@Component({\n selector: 'nh-assistant-picker',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-picker.component.html',\n styleUrl: './nh-assistant-picker.component.scss'\n})\nexport class NhAssistantPickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private searchTimer?: ReturnType<typeof setTimeout>;\n private searchSubscription?: Subscription;\n /** The text of the latest search, for searching again after a failure. */\n private lastQuery = '';\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n /** The id of the text field, for the label's `for`. */\n readonly inputId = input.required<string>();\n readonly options = input<readonly NhAssistantPickerOption[]>([]);\n readonly value = input<string | null>(null);\n /** The name to show for a value that is not among the options, such as a found account. */\n readonly selectedLabel = input<string | null>(null);\n /** The label of the empty choice; without it there is none. */\n readonly noneLabel = input<string | null>(null);\n readonly placeholder = input<string | null>(null);\n /** Searches the server; the options are ignored while it is set. */\n readonly search = input<((query: string) => Observable<NhAssistantPickerOption[]>) | null>(null);\n readonly minQueryLength = input(2);\n readonly invalid = input(false);\n readonly describedBy = input<string | null>(null);\n readonly disabled = input(false);\n\n readonly valueChange = output<string>();\n /** The chosen option, also for a search result the options do not contain. */\n readonly optionChange = output<NhAssistantPickerOption | null>();\n\n readonly listId = `nh-assistant-picker-${nextId++}`;\n readonly open = signal(false);\n /** The text typed since the list opened; `null` shows the chosen option's name. */\n readonly query = signal<string | null>(null);\n readonly active = signal(-1);\n readonly searching = signal(false);\n readonly results = signal<NhAssistantPickerOption[]>([]);\n /** Why the latest search failed; `null` after a search that answered. */\n readonly searchError = signal<NhAssistantError | null>(null);\n readonly searchErrorKeys = computed(() => nhAssistantErrorKeys(this.searchError()));\n readonly searchErrorId = `${this.listId}-search-error`;\n /** The field describes itself with the host's ids and, after a failed search, with its reason. */\n readonly fieldDescribedBy = computed(() =>\n [this.describedBy(), this.searchError() ? this.searchErrorId : null].filter(Boolean).join(' ') || null);\n private readonly chosen = signal<NhAssistantPickerOption | null>(null);\n\n readonly selected = computed<NhAssistantPickerOption | null>(() => {\n const value = this.value();\n if (value === null || value === '') {\n return null;\n }\n const known = this.options().find(option => option.value === value)\n ?? this.results().find(option => option.value === value)\n ?? (this.chosen()?.value === value ? this.chosen() : null);\n return known ?? { value, label: this.selectedLabel() ?? value };\n });\n\n readonly inputText = computed(() => this.query() ?? this.selected()?.label ?? (this.value() === '' ? this.noneLabel() ?? '' : ''));\n\n readonly visible = computed<NhAssistantPickerOption[]>(() => {\n if (this.search()) {\n return this.results();\n }\n const none = this.noneLabel();\n const all = none === null ? [...this.options()] : [{ value: '', label: none }, ...this.options()];\n const text = this.query()?.trim().toLocaleLowerCase() ?? '';\n return text.length === 0\n ? all\n : all.filter(option =>\n option.label.toLocaleLowerCase().includes(text)\n || option.value.toLocaleLowerCase().includes(text)\n || (option.description ?? '').toLocaleLowerCase().includes(text));\n });\n\n /** Why the list is empty: still typing, searching, the search failed, or nothing found. */\n readonly emptyKey = computed(() => {\n if (this.searching()) {\n return 'nh-assistant.picker.searching';\n }\n if (this.searchError()) {\n return 'nh-assistant.picker.search-failed';\n }\n if (this.search() && (this.query()?.trim().length ?? 0) < this.minQueryLength()) {\n return 'nh-assistant.picker.type-more';\n }\n return 'nh-assistant.picker.no-results';\n });\n\n readonly activeId = computed(() => this.open() && this.active() >= 0 && this.active() < this.visible().length\n ? this.optionId(this.active())\n : null);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n clearTimeout(this.searchTimer);\n this.searchSubscription?.unsubscribe();\n });\n }\n\n optionId(index: number): string {\n return `${this.listId}-option-${index}`;\n }\n\n /** Moves the focus to the text field, for example after a refused save. */\n focus(): void {\n this.field().nativeElement.focus();\n }\n\n toggle(): void {\n if (this.open()) {\n this.close();\n } else {\n this.openList();\n this.focus();\n }\n }\n\n openList(): void {\n if (this.disabled() || this.open()) {\n return;\n }\n this.open.set(true);\n const index = this.visible().findIndex(option => option.value === (this.value() ?? ''));\n this.active.set(index);\n }\n\n onInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.query.set(text);\n this.open.set(true);\n this.active.set(this.search() ? -1 : 0);\n if (this.search()) {\n this.startSearch(text);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const count = this.visible().length;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.open()) {\n this.openList();\n }\n this.active.set(Math.min(this.active() + 1, count - 1));\n this.scrollActiveIntoView();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.active.set(Math.max(this.active() - 1, 0));\n this.scrollActiveIntoView();\n break;\n case 'Enter':\n if (this.open()) {\n event.preventDefault();\n const option = this.visible()[this.active()];\n if (option) {\n this.choose(option);\n } else {\n this.close();\n }\n }\n break;\n case 'Escape':\n if (this.open()) {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n }\n break;\n case 'Tab':\n this.close();\n break;\n }\n }\n\n onBlur(): void {\n this.close();\n }\n\n /** Searches the latest text again after a failed search and shows the list. */\n retrySearch(): void {\n if (!this.search() || this.disabled()) {\n return;\n }\n this.query.set(this.lastQuery);\n this.open.set(true);\n this.active.set(-1);\n this.startSearch(this.lastQuery);\n this.focus();\n }\n\n choose(option: NhAssistantPickerOption): void {\n this.searchError.set(null);\n this.chosen.set(option.value === '' ? null : option);\n this.valueChange.emit(option.value);\n this.optionChange.emit(option.value === '' ? null : option);\n this.close();\n }\n\n private close(): void {\n this.open.set(false);\n this.query.set(null);\n this.active.set(-1);\n }\n\n private startSearch(text: string): void {\n clearTimeout(this.searchTimer);\n this.searchSubscription?.unsubscribe();\n this.lastQuery = text;\n this.searchError.set(null);\n const search = this.search();\n const query = text.trim();\n if (!search || query.length < this.minQueryLength()) {\n this.results.set([]);\n this.searching.set(false);\n return;\n }\n this.searching.set(true);\n this.searchTimer = setTimeout(() => {\n this.searchSubscription = search(query).subscribe({\n next: results => {\n this.results.set(results);\n this.searching.set(false);\n this.active.set(results.length > 0 ? 0 : -1);\n },\n error: (error: unknown) => {\n this.results.set([]);\n this.searching.set(false);\n this.searchError.set(toNhAssistantError(error));\n }\n });\n }, searchDelayMs);\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n if (id) {\n queueMicrotask(() => this.host.nativeElement.querySelector(`#${id}`)?.scrollIntoView?.({ block: 'nearest' }));\n }\n }\n}\n","<div class=\"picker\" [class.open]=\"open()\">\n <div class=\"control\">\n <input\n #field\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n [id]=\"inputId()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [attr.aria-describedby]=\"fieldDescribedBy()\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (click)=\"openList()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\" />\n <button\n type=\"button\"\n class=\"toggle\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.picker.toggle' | translate\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"toggle()\">\n <nh-assistant-icon name=\"chevron-down\" />\n </button>\n </div>\n @if (searchError(); as failure) {\n <!-- A failed search says why and offers to search again; the list never claims nothing was found. -->\n <p class=\"field-error search-error\" role=\"alert\" data-search-error [id]=\"searchErrorId\">\n <nh-assistant-icon name=\"warning\" />\n <span>{{ searchErrorKeys() | nhAssistantTranslate: failure.code }}</span>\n <button\n type=\"button\"\n class=\"link\"\n data-search-retry\n [disabled]=\"disabled()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"retrySearch()\">{{ 'nh-assistant.picker.search-again' | translate }}</button>\n </p>\n }\n @if (open()) {\n <ul class=\"listbox\" role=\"listbox\" [id]=\"listId\">\n @for (option of visible(); track option.value; let index = $index) {\n <li\n role=\"option\"\n [id]=\"optionId(index)\"\n [class.active]=\"index === active()\"\n [attr.aria-selected]=\"option.value === (value() ?? '')\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"active.set(index)\"\n (click)=\"choose(option)\">\n <span class=\"label\">{{ option.label }}</span>\n @if (option.description) {\n <span class=\"description\">{{ option.description }}</span>\n }\n </li>\n } @empty {\n <li class=\"state\" role=\"presentation\">{{ emptyKey() | translate }}</li>\n }\n </ul>\n } @else if (selected()?.description; as description) {\n <p class=\"chosen\">{{ description }}</p>\n }\n</div>\n","import { LocationStrategy } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EnvironmentInjector,\n computed,\n inject,\n input,\n runInInjectionContext\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\n\n/** Where a subject link leads: a route of the host application or an `https` address elsewhere. */\nexport interface NhAssistantSubjectTarget {\n href: string;\n /** The URL the router navigates to; `null` for an address outside the application. */\n route: string | null;\n}\n\n/**\n * The name of a subject with the name of its type, linked to where the application shows the\n * subject (internal). The host's `subjectLinks` builder wins over the server's link; a link within\n * the application navigates through the router, an `https` link leaves it, and anything else shows\n * no link. Ctrl-, Cmd-, Shift- and middle-clicks keep the browser's behavior, such as a new tab.\n * A name that already says the type, as \"The whole application\" does for the application as a\n * whole, is shown once.\n */\n@Component({\n selector: 'nh-assistant-subject-link',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (shownTypeName(); as type) {\n <!-- The space keeps the type and the name apart for screen readers; the flex gap shows it. -->\n <span class=\"nh-assistant-subject-type\">{{ type }}</span>{{ ' ' }}\n }\n @if (target(); as link) {\n <a class=\"nh-assistant-subject-name\" [href]=\"link.href\" (click)=\"open($event, link)\">{{ label() }}</a>\n } @else {\n <span class=\"nh-assistant-subject-name\">{{ label() }}</span>\n }\n `,\n styleUrl: './nh-assistant-subject-link.component.scss'\n})\nexport class NhAssistantSubjectLinkComponent {\n private readonly config = inject(NH_ASSISTANT_CONFIG, { optional: true });\n private readonly router = inject(Router, { optional: true });\n private readonly locationStrategy = inject(LocationStrategy, { optional: true });\n private readonly injector = inject(EnvironmentInjector);\n\n readonly subjectType = input.required<string>();\n readonly subjectId = input.required<string>();\n /** The text people read, usually the subject's display name. */\n readonly label = input.required<string>();\n /** The name of the subject type, such as \"Project\"; nothing is shown without one. */\n readonly typeName = input<string | null | undefined>(null);\n /** The server's link to the subject. */\n readonly link = input<string | null | undefined>(null);\n\n /** The type's name, unless the subject's name is the type's name itself, as for the whole application. */\n readonly shownTypeName = computed(() => {\n const type = this.typeName()?.trim();\n if (!type) {\n return null;\n }\n\n return type.toLocaleLowerCase() === this.label().trim().toLocaleLowerCase() ? null : type;\n });\n\n readonly target = computed<NhAssistantSubjectTarget | null>(() => {\n const builder = this.config?.subjectLinks?.[this.subjectType()];\n const subject = { type: this.subjectType(), id: this.subjectId() };\n const custom = builder ? runInInjectionContext(this.injector, () => builder(subject)) : undefined;\n if (custom === null) {\n return null;\n }\n if (Array.isArray(custom)) {\n return this.routeTarget(this.router ? this.router.serializeUrl(this.router.createUrlTree([...custom])) : null);\n }\n\n return this.urlTarget(typeof custom === 'string' ? custom : this.link() ?? null);\n });\n\n open(event: MouseEvent, target: NhAssistantSubjectTarget): void {\n if (!target.route || !this.router || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return;\n }\n\n event.preventDefault();\n void this.router.navigateByUrl(target.route);\n }\n\n private urlTarget(url: string | null): NhAssistantSubjectTarget | null {\n if (!url) {\n return null;\n }\n if (url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\\\')) {\n return this.routeTarget(url);\n }\n\n return /^https:\\/\\/[^/\\\\\\s]+/i.test(url) ? { href: url, route: null } : null;\n }\n\n private routeTarget(url: string | null): NhAssistantSubjectTarget | null {\n if (!url) {\n return null;\n }\n\n return {\n href: this.locationStrategy ? this.locationStrategy.prepareExternalUrl(url) : url,\n route: this.router ? url : null\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/i18n/nh-assistant-error-codes';\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 * from './lib/services/nh-assistant-mcp-authorization';\nexport * from './lib/services/nh-assistant-mcp-connect.service';\nexport { toNhAssistantError } from './lib/internal/nh-assistant-errors';\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/preferences/nh-assistant-mcp-connections.component';\nexport * from './lib/components/connection-required/nh-assistant-connection-required.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 {\n nhAssistantReloadOnAgentWork as ɵnhAssistantReloadOnAgentWork,\n nhAssistantWatchAgentWork as ɵnhAssistantWatchAgentWork\n} from './lib/internal/nh-assistant-agent-work';\nexport {\n NhAssistantPickerComponent as ɵNhAssistantPickerComponent,\n type NhAssistantPickerOption as ɵNhAssistantPickerOption\n} from './lib/internal/nh-assistant-picker.component';\nexport { NhAssistantSubjectLinkComponent as ɵNhAssistantSubjectLinkComponent } from './lib/internal/nh-assistant-subject-link.component';\nexport { NhAssistantMarkdownPipe as ɵNhAssistantMarkdownPipe } from './lib/internal/nh-assistant-markdown.pipe';\nexport {\n NH_ASSISTANT_DASH_CASE as ɵNH_ASSISTANT_DASH_CASE,\n nhAssistantCodeKeys as ɵnhAssistantCodeKeys,\n nhAssistantErrorKeys as ɵnhAssistantErrorKeys,\n nhAssistantErrorOf as ɵnhAssistantErrorOf,\n // Kept for the secondary entry points and earlier callers; `toNhAssistantError` is public.\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":["withQuery","nextId","searchDelayMs"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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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-sse-parser.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-transport.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-api.service.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-live.service.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-errors.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-mcp-authorization.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-mcp-connect.service.ts","../../../projects/nh-ai-chat/src/lib/services/nh-assistant-push.service.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-files.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/i18n/nh-assistant-error-codes.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-mcp-connections.component.ts","../../../projects/nh-ai-chat/src/lib/components/preferences/nh-assistant-mcp-connections.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/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/connection-required/nh-assistant-connection-required.component.ts","../../../projects/nh-ai-chat/src/lib/components/connection-required/nh-assistant-connection-required.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/lib/internal/nh-assistant-picker.component.ts","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-picker.component.html","../../../projects/nh-ai-chat/src/lib/internal/nh-assistant-subject-link.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 * What people may attach to a message to this agent; `null` or missing when they can attach\n * nothing: the application keeps no files for the assistant, accepts no uploads, or the agent\n * accepts no files.\n */\n uploads?: AgentUploads | null;\n}\n\n/** What people may upload with `POST conversations/{id}/files` and attach to one message to an agent. */\nexport interface AgentUploads {\n /** Lowercase media types, for example `application/pdf`. */\n acceptedMediaTypes: string[];\n /** The largest file in bytes. */\n maxFileBytes: number;\n /** The most files of one message. */\n maxFiles: number;\n}\n\n/**\n * A file the application keeps, as the upload endpoint returns it and a message names it in\n * `files`. It never carries content.\n */\nexport interface FileReference {\n id: string;\n name: string;\n mediaType: string;\n size: number;\n /** The application's hash of the content, when it keeps one. */\n hash?: string | null;\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 /** The name of the subject type in the caller's language, when the application named it. */\n subjectTypeName?: string | null;\n /** Where the application shows the subject, when the type has a link template. */\n subjectLink?: string | null;\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 /**\n * Who wrote the message: a person or a trigger of an agent for user messages, `rule` for the\n * summary an agent's rules wrote instead of the model; missing on old servers.\n */\n authorKind?: MessageAuthorKind | null;\n}\n\n/**\n * `person` for a message a person wrote; `trigger` for one a trigger wrote into an agent thread;\n * `rule` for an assistant message the agent's rules wrote without a model.\n */\nexport type MessageAuthorKind = 'person' | 'trigger' | 'rule';\n\nexport type MessagePart = TextPart | ToolCallPart | ApprovalPart | ConnectionRequiredPart | FilePart;\n\n/**\n * A file a person attached to a message: its name, media type and size in bytes, never its content.\n * The application keeps the file; a later turn opens it again with the rights of that turn.\n */\nexport interface FilePart {\n type: 'file';\n name: string;\n mediaType: string;\n size: number;\n}\n\n/**\n * Why a turn asks the person to connect an MCP server: never connected, the connection ended, or\n * the server asked for permissions the connection lacks.\n */\nexport type ConnectionRequiredReason = 'not-connected' | 'reauthorization-required' | 'insufficient-scope';\n\n/**\n * An MCP server, which each person connects to with their own account, that the person who asked had\n * to connect before the agent could use it. The turn went on without its tools; the card connects\n * the viewer's own account.\n */\nexport interface ConnectionRequiredPart {\n type: 'connection-required';\n serverId: string;\n displayName: string;\n reason: ConnectionRequiredReason;\n}\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 /**\n * `delegated`, `agent` or `delegated-read` when an agent used rights beyond the caller's own:\n * the initiator's, its own grant, or a person's through a gateway read.\n */\n grantSource?: 'delegated' | 'agent' | 'delegated-read' | 'accountable' | null;\n /** The result came from rights this viewer does not have and is shielded from them. */\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\n/**\n * Why a stale proposal no longer fits: the work was already done another way, what it was based on\n * changed, or it no longer applies.\n */\nexport type StaleKind = 'already-done' | 'changed' | 'not-applicable';\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 /** Why a stale proposal no longer fits. Only sent for stale proposals; missing on older servers. */\n staleKind?: StaleKind;\n /** The application's explanation of a stale proposal in the reader's language, such as who did the work. */\n staleExplanation?: string;\n /** Why the agent's rules proposed it, in the reader's language. Only sent for rule proposals. */\n rationale?: string;\n /** The newer proposal for the same objects that replaced this withdrawn one. Only sent then. */\n supersededByApprovalId?: string;\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 /** Files the person attaches, as `POST conversations/{id}/files` returned them. */\n files?: FileReference[];\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 { AgentTriggerReceipt } from './assistant-agent-run.models';\nimport { ApprovalPart, ConnectionRequiredReason } 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\n/** The person who asked has to connect an MCP server before the agent can use it. */\nexport interface ConnectionRequiredEvent {\n serverId: string;\n displayName: string;\n reason: ConnectionRequiredReason;\n}\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/**\n * The server accepted a message for the next run of the agent that works in the thread, with its\n * files, instead of starting a turn: it answered `202` with the trigger receipt. The client emits it\n * in place of a stream, which then ends; a server never streams it.\n */\nexport type MessageQueuedEvent = AgentTriggerReceipt;\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 'connection.required': ConnectionRequiredEvent;\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\n/**\n * What `NhAssistantApiService.sendMessage` emits: the events of the turn it started, or, when the\n * message waits for the next run of the agent working in the thread, one `message.queued` event.\n */\nexport type NhAssistantMessageEvent = NhAssistantSseEvent | { type: 'message.queued'; data: MessageQueuedEvent };\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 'connection.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 /** The person closed the authorization window of an MCP connection before it finished. */\n mcpAuthorizationCancelled: 'assistant-mcp-authorization-cancelled',\n /** The browser blocked the authorization window of an MCP connection. */\n mcpPopupBlocked: 'assistant-mcp-popup-blocked'\n} as const;\n\nexport type NhAssistantClientErrorCode = typeof NhAssistantClientErrorCodes[keyof typeof NhAssistantClientErrorCodes];\n","import { ApprovalPresentation, StaleKind } 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' | 'delegated-read' | 'accountable';\n\n/**\n * How a run worked: `model` through the language model, `rule` through the agent's rules without a\n * model, `rule-then-model` when the rules handed the run over to the model.\n */\nexport type AgentRunKind = 'model' | 'rule' | 'rule-then-model';\n\n/**\n * Who chose the skill a run worked in; `follow-up` continues in the skill of the run whose\n * proposal people decided.\n */\nexport type AgentSkillChooser = 'trigger' | 'rules' | 'triage' | 'model' | 'follow-up';\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 /** How the run worked. Missing on older servers, which only ran the model. */\n kind?: AgentRunKind;\n /** The skill of the agent the run worked in; missing or null for the agent's own tools. */\n skill?: string | null;\n skillChosenBy?: AgentSkillChooser | null;\n /** The version of a skill defined as data the run worked in; absent for a skill in code. */\n skillVersion?: number | null;\n /** The run evaluated a candidate version of its skill in the shadow thread. */\n skillCandidate?: boolean;\n /** The agent that handed the run's work off; missing or null for a run no agent asked for. */\n requestedByAgentId?: string | null;\n /**\n * The thread of the run that handed the work off, only in a thread's run list and only when the\n * reader may open it.\n */\n requestedByConversationId?: string | null;\n /** How many hand-offs led to the run; 0 or missing for a run no agent asked for. */\n handOffDepth?: number;\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 * The thread holds the agent's shadow work about the subject: only administrators see it,\n * nobody is notified and nothing proposed in it executes.\n */\n shadow?: boolean;\n /**\n * The name of the subject type in the caller's language, such as \"Project\", when the application\n * named the type; `null` or missing otherwise.\n */\n subjectTypeName?: string | null;\n /**\n * Where the application shows the subject, from the type's link template; `null` or missing\n * without one. `provideNhAssistant({ subjectLinks })` may replace it with a router link.\n */\n subjectLink?: string | null;\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 /**\n * The agent's name: a translation key for an agent in code, the text itself for an agent created in\n * the administration. It names an agent kept out of the chat as well, which the status does not list;\n * missing from servers before it was added.\n */\n displayNameKey?: string | null;\n thread: AgentThread | null;\n canStart: boolean;\n /**\n * For administrators, the agent's shadow thread about the subject while the agent or one of its\n * skills works in shadow; missing or `null` otherwise.\n */\n shadowThread?: AgentThread | null;\n}\n\n/**\n * A proposal on a subject with the caller's live decision right. Only a pending proposal can be\n * decided; for every other status `canDecide` is `false` and `reasonCode` is `null`.\n */\nexport interface AgentSubjectWorkProposal extends AgentProposalDecisionRight {\n proposal: AgentProposal;\n}\n\n/** The most proposals one `POST approvals/lookup` reads. */\nexport const NH_ASSISTANT_MAX_PROPOSAL_LOOKUP = 100;\n\n/**\n * Response of `POST approvals/lookup`: the requested proposals the caller may see, in the order of\n * the request. Ids the caller may not see, or that do not exist, are left out.\n */\nexport interface AgentProposalLookup {\n items: AgentSubjectWorkProposal[];\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 /**\n * The name of the subject type in the caller's language, such as \"Project\", when the application\n * named the type; `null` or missing otherwise.\n */\n subjectTypeName?: string | null;\n /**\n * Where the application shows the subject, from the type's link template; `null` or missing\n * without one. `provideNhAssistant({ subjectLinks })` may replace it with a router link.\n */\n subjectLink?: 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\n/** One subject a search found (`GET subjects/{type}/search`). */\nexport interface AgentSubjectSearchResult {\n type: string;\n id: string;\n /** The name the application gives the subject; show the id without one. */\n displayName: string | null;\n /** The subject's isolation key: `tenant:…`, `division:…` or `global`. */\n scopeKey: string;\n divisionId: string | null;\n /** Where the application shows the subject; `null` without a link template. */\n link?: string | null;\n}\n\n/** The subjects of one type a search found that the caller may read, in the application's order. */\nexport interface AgentSubjectSearch {\n subjectType: string;\n items: AgentSubjectSearchResult[];\n}\n\n/** The shortest and longest text `searchSubjects` accepts, and the most results it returns. */\nexport const NH_ASSISTANT_SUBJECT_SEARCH = { minQueryLength: 2, maxQueryLength: 100, maxLimit: 50 } as const;\n\n/** The platform's subject type of the whole application, which the server registers itself. */\nexport const NH_ASSISTANT_SYSTEM_SUBJECT_TYPE = 'nh-system';\n\n/** The whole application as one subject, for an agent that works app-wide. */\nexport const NH_ASSISTANT_SYSTEM_GLOBAL_ID = 'global';\n\n/** The most characters of a run's result that `getObjectAgents` returns for its latest run. */\nexport const NH_ASSISTANT_RESULT_PREVIEW_LENGTH = 300;\n\n/** The newest run of an agent on a subject, with the beginning of its result. */\nexport interface AgentLatestRun {\n runId: string;\n conversationId: string;\n triggerId: string;\n status: AgentRunStatus;\n failureCode: string | null;\n /** When the run ended, or started, or was queued. */\n at: string;\n /**\n * The first `NH_ASSISTANT_RESULT_PREVIEW_LENGTH` characters of the run's stored answer: model\n * output, to show as text. For a run without one, such as a run that ended before runs kept their\n * answer, the summary it ended with; `null` while the run has none. `getRunResult` returns all of it.\n */\n result: string | null;\n /** The result is longer than `result`. */\n resultTruncated: boolean;\n /** The run worked in the agent's shadow thread, which only administrators see. */\n shadow: boolean;\n}\n\n/** One agent that works on a subject, as `getObjectAgents` lists it. */\nexport interface AgentObjectAgent {\n agentId: string;\n /** A translation key for an agent in code, the text itself for one created in the administration. */\n displayNameKey: string;\n descriptionKey: string;\n /** Whether the caller may run the agent on the subject now. */\n canStart: boolean;\n /** The agent's thread about the subject that people open; `null` before it worked on it. */\n conversationId: string | null;\n /** The agent's newest run on the subject; `null` before its first. */\n latestRun: AgentLatestRun | null;\n /** The agent's proposals on the subject that wait for a decision. */\n openProposals: number;\n}\n\n/**\n * The agents that work on one subject and that the caller may use (`GET subjects/{type}/{id}/agents`),\n * ordered by id. The subject is an object or the whole application.\n */\nexport interface AgentObjectAgents {\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n subjectTypeName?: string | null;\n subjectLink?: 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: AgentObjectAgent[];\n}\n\n/** The most characters of a run's answer that `getRunResult` returns; a longer answer is cut. */\nexport const NH_ASSISTANT_RUN_RESULT_MAX_LENGTH = 20_000;\n\n/** The most runs one page of a run history holds. */\nexport const NH_ASSISTANT_RUN_HISTORY_MAX_PAGE = 50;\n\n/**\n * Which runs a run history lists. Every part is optional: an agent, a subject type (`nh-system` for\n * the whole application) or one subject of it, a status, and a period by when runs were created\n * (`from` inclusive, `to` exclusive, ISO 8601). `page` starts at 1; `itemsPerPage` is 1 to\n * `NH_ASSISTANT_RUN_HISTORY_MAX_PAGE` (default 20).\n */\nexport interface AgentRunFilter {\n agentId?: string;\n subjectType?: string;\n subjectId?: string;\n status?: AgentRunStatus;\n from?: string;\n to?: string;\n page?: number;\n itemsPerPage?: number;\n}\n\n/**\n * A personal MCP server a background run left out, and why: `assistant-mcp-consent-required` (the\n * person has not allowed background use), `assistant-mcp-connection-required` or\n * `assistant-mcp-reauthorization-required` (the person's connection is missing or ended), or\n * `assistant-mcp-initiator-only` (the run acted for someone other than the person who asked). The\n * person whose consent or connection is missing is told once a day.\n */\nexport interface AgentRunMcpSkip {\n serverId: string;\n /** The server's name when the run left it out. */\n serverDisplayName: string;\n code: string;\n}\n\n/** One run in a run history: its agent, subject, trigger, status, usage, times and result preview. */\nexport interface AgentRunHistoryItem {\n id: string;\n conversationId: string;\n agentId: string;\n /**\n * The agent's name: a translation key for an agent in code, the text itself for one created in the\n * administration; `null` for an agent that no longer exists.\n */\n agentDisplayNameKey?: string | null;\n subjectType: string;\n subjectId: string;\n subjectDisplayName: string | null;\n subjectTypeName?: string | null;\n subjectLink?: string | null;\n triggerId: string;\n status: AgentRunStatus;\n failureClass: string | null;\n failureCode: string | null;\n kind: AgentRunKind;\n skill: string | null;\n initiatorActorId: string | null;\n toolCalls: number;\n modelCalls: number;\n inputTokens: number;\n outputTokens: number;\n proposalCount: number;\n /**\n * The first `NH_ASSISTANT_RESULT_PREVIEW_LENGTH` characters of the run's answer, model output to\n * show as text; for a run without a stored answer, the summary it ended with.\n */\n result: string | null;\n /** The answer is longer than `result`. */\n resultTruncated: boolean;\n /** The run worked in the agent's shadow thread: nothing it proposed executes. */\n shadow: boolean;\n createdAt: string;\n startedAt: string | null;\n endedAt: string | null;\n /** The personal MCP servers the run left out; missing on older servers. */\n mcpConnectionSkips?: AgentRunMcpSkip[];\n}\n\n/**\n * A page of a run history, newest first (`getRunHistory` for people, the administration's\n * `getAgentRuns` for every run of an agent).\n */\nexport interface AgentRunHistory {\n items: AgentRunHistoryItem[];\n /** The runs that match the filter and that the caller may see. */\n total: number;\n /**\n * People's history considered only the agent threads with the most recent matching runs; a\n * narrower filter, such as one object or a period, reaches older ones.\n */\n limited: boolean;\n}\n\n/** One run with its whole result, its proposals and its files (`getRunResult`). */\nexport interface AgentRunResult {\n run: AgentRunHistoryItem;\n /**\n * The run's whole answer as Markdown, at most `NH_ASSISTANT_RUN_RESULT_MAX_LENGTH` characters:\n * model output, untrusted. Render it only with the assistant's safe Markdown rendering\n * (`nh-assistant-run-result` does), never as HTML. `null` while the run has none.\n */\n result: string | null;\n /** The answer was longer and `result` is its beginning. */\n resultTruncated: boolean;\n /** The bounded summary the run ended with, which the agent's next runs start from. */\n summary: string | null;\n /** The proposals the caller may see: in the run's own thread and placed at objects the caller reads. */\n proposals: AgentProposal[];\n /** The proposals the run placed at objects the caller may not read. */\n hiddenProposals: number;\n /** The files the run saved; `restricted` ones cannot be downloaded by the caller. */\n artifacts: AgentArtifact[];\n /** Whether the caller may open the run's thread conversation. */\n canOpenConversation: boolean;\n}\n\nexport interface StartAgentRequest {\n agentId: string;\n subjectType: string;\n subjectId: string;\n message?: string | null;\n}\n\n/**\n * What became of a start by hand (`POST threads/start`, `POST runs/{id}/retry` with `restart`):\n * `started`, `queued`, `coalesced` with a run about to start, `superseded` the current run,\n * `ignored` or `deduplicated`; `waiting` while the agent or its skill is paused (`reasonCode`\n * `assistant-agent-paused` or `assistant-skill-paused`), so the run starts when it resumes; and\n * `deferred` until the application's transaction commits, without a run or thread yet. A refused\n * start is an HTTP error with its code, never a receipt.\n */\nexport type AgentTriggerOutcome =\n | 'started'\n | 'queued'\n | 'coalesced'\n | 'superseded'\n | 'ignored'\n | 'deduplicated'\n | 'waiting'\n | 'deferred';\n\nexport interface AgentTriggerReceipt {\n triggerId: string;\n outcome: AgentTriggerOutcome;\n runId: string | null;\n conversationId: string | null;\n /** Why the run did not start yet, such as `assistant-agent-paused` with `waiting`; `null` otherwise. */\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 /**\n * The name of the subject type in the caller's language, such as \"Project\", when the application\n * named the type; `null` or missing otherwise.\n */\n subjectTypeName?: string | null;\n /**\n * Where the application shows the subject, from the type's link template; `null` or missing\n * without one. `provideNhAssistant({ subjectLinks })` may replace it with a router link.\n */\n subjectLink?: 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 * Why a stale proposal no longer fits; `null` for other statuses. Its reason code is\n * `executionResultCode`. Missing on older servers.\n */\n staleKind?: StaleKind | null;\n /**\n * The application's explanation of a stale proposal in the caller's language, such as who already\n * did the work; `null` when it gave none. Missing on older servers.\n */\n staleExplanation?: string | null;\n /**\n * Who made the proposal stale, when the application's guard named them; `null` otherwise.\n * Missing on older servers.\n */\n staleByActorId?: string | null;\n /** The name of `staleByActorId` from the subject's member snapshot; `null` when unknown. */\n staleByDisplayName?: string | null;\n /**\n * The application objects the proposal changes, as its guards named them, so lists can group\n * proposals by object. `targets` holds execution scopes instead. Missing on older servers.\n */\n objects?: AgentProposalObject[];\n /**\n * The newer proposal for the same objects that replaced this withdrawn one; `null` otherwise.\n * Missing on older servers.\n */\n supersededByApprovalId?: string | null;\n /**\n * Why the agent's rules proposed it, in the caller's language; `null` for proposals of the model.\n * Missing on older servers.\n */\n rationale?: string | null;\n /**\n * The run that placed this proposal here from another subject, such as a run for the whole\n * application; `null` for a proposal made in this thread. Missing on older servers.\n */\n placedBy?: AgentProposalOrigin | null;\n /**\n * The subject the proposal's subject belonged to when the proposal was made, such as the project of\n * a task, as the application described it; `null` without one. The grouped inbox groups by it.\n * Missing on older servers.\n */\n parent?: AgentProposalParent | null;\n}\n\n/**\n * The subject a proposal's subject belonged to when the proposal was made. The name is the one recorded\n * then; the type's name and the link follow the application's registration of the type.\n */\nexport interface AgentProposalParent {\n subjectType: string;\n subjectId: string;\n displayName: string | null;\n /** The name of the parent's type in the caller's language, when the application named it. */\n subjectTypeName?: string | null;\n /** Where the application shows the parent; `null` without a link template. */\n subjectLink?: string | null;\n}\n\n/**\n * The run that placed a proposal at another object than its own, and the thread it ran in. Its subject\n * is named only for the whole application (`subjectType` `nh-system`); for another object only its kind\n * is known, because a reader of this object may not read that one.\n */\nexport interface AgentProposalOrigin {\n /** The thread of the run that placed the proposal; opening it checks the reader's access. */\n conversationId: string;\n runId: string | null;\n /** The run's subject type; `null` when its thread no longer exists. */\n subjectType: string | null;\n /** The run's subject id for the whole application (`global` or `division-…`); `null` otherwise. */\n subjectId?: string | null;\n /** The name of the whole application or its division in the caller's language; `null` otherwise. */\n subjectDisplayName?: string | null;\n /** The name of the run's subject type in the caller's language, when the application named it. */\n subjectTypeName?: string | null;\n}\n\n/** An application object a proposal changes, such as `{ type: 'project-task', id: '4711' }`. */\nexport interface AgentProposalObject {\n type: string;\n id: string;\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 * The scope whose visits mark what is new: `global`, or `division:{id}` for an inbox filtered on a\n * division. Missing on older servers.\n */\n scopeKey?: string;\n /**\n * When the caller last looked at the inbox in this scope (`visitInbox`), before this read; `null`\n * before the first visit. Missing on older servers.\n */\n lastVisitedAt?: string | null;\n /**\n * The proposals on this page made after `lastVisitedAt`; before the first visit all of them.\n * Missing on older servers, which mark nothing as new.\n */\n newApprovalIds?: string[];\n /**\n * With `grouped: true`, the groups on this page in order. The items are contiguous per group and\n * subject: the first `count` items belong to the first group, and so on. `null` or missing for the\n * flat inbox.\n */\n groups?: AgentInboxGroup[] | null;\n}\n\n/**\n * One group on a page of the grouped inbox: the parent its proposals recorded, or the subject of\n * proposals without a parent, which holds that subject's own proposals and those of its children.\n */\nexport interface AgentInboxGroup {\n subjectType: string;\n subjectId: string;\n /** The group's name: its subject's own name, or the name its proposals recorded for the parent. */\n displayName: string | null;\n /** The name of the group's type in the caller's language, when the application named it. */\n subjectTypeName?: string | null;\n /** Where the application shows the group's subject; `null` without a link template. */\n subjectLink?: string | null;\n /** How many of the page's items belong to the group. */\n count: number;\n /** How many proposals of the inbox, with its filters, belong to the group. */\n total: number;\n /** The group started on the page before. */\n continuesFromPreviousPage: boolean;\n /** The group goes on on the page after. */\n continuesOnNextPage: boolean;\n /** The group's subjects on this page in order, the group's own subject first. */\n subjects: AgentInboxSubjectGroup[];\n}\n\n/** One subject within a group on a page of the grouped inbox; its name and link are those of its items. */\nexport interface AgentInboxSubjectGroup {\n subjectType: string;\n subjectId: string;\n count: number;\n total: number;\n continuesFromPreviousPage: boolean;\n continuesOnNextPage: boolean;\n}\n\nexport interface AgentInboxFilter {\n subjectType?: string;\n agentId?: string;\n /** Only proposals on subjects of this division; the inbox's visits are then those of the division. */\n divisionId?: string;\n runId?: string;\n /** Groups the proposals by parent and subject (`AgentInbox.groups`) instead of by expiry alone. */\n grouped?: boolean;\n page?: number;\n itemsPerPage?: number;\n}\n\n/** A recorded visit of the inbox in one scope (`visitInbox`). */\nexport interface AgentInboxVisit {\n /** `global`, or `division:{id}` for the inbox of one division. */\n scopeKey: string;\n visitedAt: string;\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\n/** A board of a group of agents the caller may open (`getBoards`). */\nexport interface AgentBoardSummary {\n /** The group id, such as `project-management`. */\n id: string;\n /** The group's name in the request's language. */\n name: string;\n /** What the group's agents do, when the application described it. */\n description: string | null;\n /** How many of the group's agents the caller sees on its board. */\n agentCount: number;\n}\n\n/** The boards the caller may open, ordered by name. */\nexport interface AgentBoardList {\n items: AgentBoardSummary[];\n}\n\n/** A kind of object as a board names it. */\nexport interface AgentBoardSubjectType {\n id: string;\n /** The name of one object in the request's language; the id without a name. */\n name: string;\n /** The name of several objects, when the application gave one. */\n pluralName: string | null;\n}\n\n/** What an agent on a board works on. */\nexport interface AgentBoardWorksOn {\n /** Every kind of object. */\n allObjects: boolean;\n /** The whole application. */\n application: boolean;\n /** Per division instead of app-wide. */\n perDivision: boolean;\n /** The kinds of objects it names, by id. */\n subjectTypes: AgentBoardSubjectType[];\n}\n\n/** One agent on a board. */\nexport interface AgentBoardAgent {\n agentId: string;\n /** A translation key for an agent in code, the text itself for one created in the administration. */\n displayNameKey: string;\n descriptionKey: string;\n worksOn: AgentBoardWorksOn;\n /**\n * `nh-system` when the agent works on the whole application in the board's scope; `null` for an\n * agent without such work there, which the board shows without a result or a start.\n */\n subjectType: string | null;\n /** `global` for an app-wide agent, `division-…` for a per-division agent on a division's board. */\n subjectId: string | null;\n /** The name of that subject in the request's language. */\n subjectDisplayName: string | null;\n /** Whether the caller may run the agent for that subject now. */\n canStart: boolean;\n /** The agent's thread of that subject, when the caller may open it. */\n conversationId: string | null;\n /** The agent's newest run for that subject; `null` before its first. */\n latestRun: AgentLatestRun | null;\n /** The open proposals of that thread. */\n openProposals: number;\n /**\n * Whether the latest run ended, or a proposal was made, after the caller's last visit of the board\n * in this scope; before the first visit everything shown is new.\n */\n isNew: boolean;\n}\n\n/** The board of one group in one scope (`getBoard`). */\nexport interface AgentBoard {\n id: string;\n name: string;\n description: string | null;\n /** `global`, or `division:{id}` for the board of one division. */\n scopeKey: string;\n divisionId: string | null;\n /** When the caller last looked at this board in this scope, before this read; `null` before the first visit. */\n lastVisitedAt: string | null;\n /** The group's agents the caller sees, ordered by id. */\n agents: AgentBoardAgent[];\n}\n\n/** A recorded visit of a board (`visitBoard`). */\nexport interface AgentBoardVisit {\n groupId: string;\n scopeKey: string;\n visitedAt: string;\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 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 * Replaces the server's links to subjects, which come from the link template of the subject type\n * (`AddSubjectType(...).OpenAt(\"/projects/{id}\")`), with the host's own routes, per subject type:\n * for example `{ project: subject => ['/projects', subject.id] }`. Return router commands or a URL\n * within the application, `null` to show no link, or `undefined` to keep the server's link.\n * Runs in the assistant's injection context. Default: the server's links.\n */\n subjectLinks?: Record<string, NhAssistantSubjectLinkBuilder>;\n /**\n * How MCP authorizations open. `popup` (default) opens a window from the click and stays on the\n * page. `redirect` sends the page to the authorization server and back to `mcpConnectReturnUrl`,\n * where the assistant completes the connection; its origin must be in\n * `NewHeap:AI:Assistant:Mcp:OAuth:ReturnOrigins`.\n */\n mcpConnectMode?: 'popup' | 'redirect';\n /** The page a redirect-mode authorization returns to. Default: the current address without its fragment. */\n mcpConnectReturnUrl?: () => string;\n}\n\n/** A subject an agent works on, by its type and id. */\nexport interface NhAssistantSubjectRef {\n type: string;\n id: string;\n}\n\n/**\n * Builds the link to one subject in the host application: router commands such as\n * `['/projects', subject.id]`, a URL such as `/projects/7`, `null` for no link, or `undefined` to keep\n * the server's link.\n */\nexport type NhAssistantSubjectLinkBuilder = (subject: NhAssistantSubjectRef) => readonly unknown[] | string | null | undefined;\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/** One file upload of the assistant client, which reports how much of the body was sent. */\nexport interface NhAssistantUploadRequest {\n url: string;\n /** The request headers; never `Content-Type`, which the browser sets with the multipart boundary. */\n headers: Record<string, string>;\n body: FormData;\n signal: AbortSignal;\n /** Called while the body is sent, with the bytes sent so far and the total. */\n onProgress: (loaded: number, total: number) => void;\n}\n\n/** Sends an upload and resolves with the server's response; rejects when the request did not reach the server. */\nexport type NhAssistantUpload = (request: NhAssistantUploadRequest) => Promise<Response>;\n\n/**\n * Sends the uploads of the assistant client. The default uses `XMLHttpRequest`, because `fetch` does\n * not report upload progress. The mock API from `@newheap/platform-ai-chat/testing` replaces it.\n */\nexport const NH_ASSISTANT_UPLOAD = new InjectionToken<NhAssistantUpload>('NH_ASSISTANT_UPLOAD', {\n providedIn: 'root',\n factory: () => nhAssistantXhrUpload\n});\n\n/** The default upload: `XMLHttpRequest` with upload progress, answered as a `Response`. */\nexport function nhAssistantXhrUpload(request: NhAssistantUploadRequest): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n if (request.signal.aborted) {\n reject(new DOMException('The upload was aborted.', 'AbortError'));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n const abort = () => xhr.abort();\n request.signal.addEventListener('abort', abort, { once: true });\n const finish = () => request.signal.removeEventListener('abort', abort);\n\n xhr.open('POST', request.url);\n for (const [name, value] of Object.entries(request.headers)) {\n xhr.setRequestHeader(name, value);\n }\n xhr.upload.onprogress = event => {\n if (event.lengthComputable) {\n request.onProgress(event.loaded, event.total);\n }\n };\n xhr.onload = () => {\n finish();\n const contentType = xhr.getResponseHeader('content-type');\n resolve(new Response(xhr.status === 204 ? null : xhr.responseText, {\n status: xhr.status,\n headers: contentType ? { 'content-type': contentType } : {}\n }));\n };\n xhr.onerror = () => {\n finish();\n reject(new TypeError('The upload did not reach the server.'));\n };\n xhr.onabort = () => {\n finish();\n reject(new DOMException('The upload was aborted.', 'AbortError'));\n };\n xhr.send(request.body);\n });\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\n/**\n * The bundle of a language: its own, else that of its base language, so a regional tag such as\n * `nl-NL`, `nl_BE` or `en-GB` gets the `nl` or `en` texts, else English.\n */\nfunction bundleOf(language: string): TranslationTree {\n for (const candidate of [language, language.split(/[-_]/)[0]].map(tag => tag.toLowerCase())) {\n if (Object.hasOwn(NH_ASSISTANT_TRANSLATIONS, candidate)) {\n return NH_ASSISTANT_TRANSLATIONS[candidate as keyof typeof NH_ASSISTANT_TRANSLATIONS] as TranslationTree;\n }\n }\n return NH_ASSISTANT_TRANSLATIONS.en as TranslationTree;\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. A regional language such as `nl-NL` receives the texts of its base\n * language; 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 bundleRoot = bundleOf(language)[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","/** 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 { 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, NH_ASSISTANT_UPLOAD, NhAssistantConfig } from '../nh-assistant.config';\n\n/**\n * The request header every upload carries. A browser cannot send it with a cross-site form, so the\n * upload endpoint keeps the posture of the JSON endpoints.\n */\nexport const NH_ASSISTANT_UPLOAD_HEADER = 'X-NH-Assistant-Upload';\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 * The field errors of the error body, whatever its code (for example `assistant-validation` or\n * `assistant-run-filter-invalid`): camelCase field names, dotted for nested settings such as\n * `oauth.clientId`, with stable values such as `required`, `invalid`, `too-long` or `not-found`.\n * Empty when the body names none.\n */\n readonly fieldErrors: Readonly<Record<string, readonly 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}$/;\nconst safeField = /^[a-zA-Z][a-zA-Z0-9.]{0,63}$/;\n/** A field of one item of a list, such as `readers[0].toolName`. */\nconst safeItemField = /^[a-zA-Z][a-zA-Z0-9]{0,31}\\[\\d{1,4}\\](\\.[a-zA-Z][a-zA-Z0-9]{0,31})?$/;\n\n/**\n * Whether a value the server or a callback page sent is a code the library may show: lowercase\n * letters, digits, dots and dashes, at most 80 characters. Every reader of untrusted codes uses this\n * one check, so a code never carries free text into a translation key.\n */\nexport function nhAssistantIsSafeCode(value: unknown): value is string {\n return typeof value === 'string' && safeCode.test(value);\n}\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 uploadFn = inject(NH_ASSISTANT_UPLOAD);\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 * Uploads `form` with progress and resolves with the parsed JSON answer. Rejects with\n * `NhAssistantApiError`, never with raw text: the code of a refused upload's error body, the\n * generic status mapping without one and `assistant-network` when it did not reach the server.\n * An aborted upload rejects with an `AbortError`.\n */\n async upload<T>(path: string, form: FormData, onProgress: (loaded: number, total: number) => void, signal: AbortSignal): Promise<T> {\n const headers = await this.headers('application/json');\n headers[NH_ASSISTANT_UPLOAD_HEADER] = '1';\n let response: Response;\n try {\n response = await this.uploadFn({ url: this.url(path), headers, body: form, signal, onProgress });\n } catch (error) {\n if (signal.aborted) {\n throw error;\n }\n throw createApiError(0, nhAssistantCodeForStatus(0));\n }\n\n if (!response.ok) {\n const failure = await this.failure(response, {});\n throw createApiError(response.status, failure.code, failure.fieldErrors);\n }\n\n try {\n return JSON.parse(await response.text()) as T;\n } catch {\n throw createApiError(response.status, NhAssistantClientErrorCodes.invalidResponse);\n }\n }\n\n /**\n * Downloads a file of the assistant API. Rejects with `NhAssistantApiError`, never with raw text:\n * the code and field errors of a refused request's error body (whatever its content type), the\n * endpoint's status mapping without one, `assistant-network` when the request did not reach the\n * server and `assistant-stream-interrupted` when the file broke off while it was read.\n */\n async download(path: string, accept: string, statusCodes: NhAssistantStatusCodes = {}): Promise<Blob> {\n let response: Response;\n try {\n response = await this.fetch('GET', path, accept, undefined, new AbortController().signal);\n } catch {\n throw createApiError(0, nhAssistantCodeForStatus(0));\n }\n\n if (!response.ok) {\n const failure = await this.failure(response, statusCodes);\n throw createApiError(response.status, failure.code, failure.fieldErrors);\n }\n\n try {\n return await response.blob();\n } catch {\n throw createApiError(response.status, NhAssistantClientErrorCodes.streamInterrupted);\n }\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 return (await this.failure(response, statusCodes)).code;\n }\n\n /**\n * The failure code of a response and the field errors of its body, both checked against safe\n * patterns. Response text is never used.\n */\n private async failure(\n response: Response,\n statusCodes: NhAssistantStatusCodes\n ): Promise<{ code: string; fieldErrors: Record<string, string[]> }> {\n const fieldErrors: Record<string, string[]> = {};\n try {\n const text = await response.text();\n const body = text.length > 0 ? JSON.parse(text) as unknown : null;\n const record = body && typeof body === 'object' ? body as Record<string, unknown> : null;\n const errors = record?.['errors'];\n if (errors && typeof errors === 'object' && !Array.isArray(errors)) {\n for (const [field, values] of Object.entries(errors as Record<string, unknown>)) {\n const safe = Array.isArray(values) ? values.filter(nhAssistantIsSafeCode) : [];\n if ((safeField.test(field) || safeItemField.test(field)) && safe.length > 0) {\n fieldErrors[field] = safe;\n }\n }\n }\n const code = record?.['code'];\n if (nhAssistantIsSafeCode(code)) {\n return { code, fieldErrors };\n }\n } catch {\n // A non-JSON error body carries no code.\n }\n\n return { code: statusCodes[response.status] ?? nhAssistantCodeForStatus(response.status), fieldErrors };\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 failure = await this.failure(response, statusCodes);\n subscriber.error(createApiError(response.status, failure.code, failure.fieldErrors));\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 = await this.headers(accept);\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 /** The host's extra headers, `Accept`, the bearer token and the current language. */\n private async headers(accept: string): Promise<Record<string, string>> {\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 return headers;\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, fieldErrors: Record<string, string[]> = {}): NhAssistantApiError {\n return new NhAssistantApiError(status, code, nhAssistantErrorMessageKey(code), fieldErrors);\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, Subscriber } from 'rxjs';\nimport {\n AssistantPreferences,\n McpAuthorizationStart,\n McpAuthorizeRequest,\n McpCompleteRequest,\n McpCompletion,\n McpConnection,\n UpdateMcpConnectionRequest\n} from '../models/assistant-admin.models';\nimport { AgentTriggerOutcome, AgentTriggerReceipt } from '../models/assistant-agent-run.models';\nimport {\n AgentSummary,\n AssistantStatus,\n Conversation,\n ConversationPage,\n CreateConversationRequest,\n DecideApprovalRequest,\n DirectoryEntry,\n FileReference,\n NotificationSettings,\n PushSubscriptionRequest,\n SendMessageRequest,\n ShareLink\n} from '../models/assistant-api.models';\nimport {\n NH_ASSISTANT_SSE_EVENT_TYPES,\n NhAssistantClientErrorCodes,\n NhAssistantMessageEvent,\n NhAssistantSseEvent,\n NhAssistantSseEventType\n} from '../models/assistant-sse.models';\nimport { NhAssistantSseParser } from './nh-assistant-sse-parser';\nimport { NhAssistantTransport, nhAssistantErrorMessageKey, nhAssistantIsSafeCode } from './nh-assistant-transport';\n\nexport {\n NH_ASSISTANT_UPLOAD_HEADER,\n NhAssistantApiError,\n nhAssistantCodeForStatus,\n nhAssistantErrorMessageKey\n} from './nh-assistant-transport';\n\nconst knownEventTypes = new Set<string>(NH_ASSISTANT_SSE_EVENT_TYPES);\n\n/** The outcomes of a trigger receipt with which the next run takes a waiting message. */\nconst queuedOutcomes = new Set<string>(['started', 'queued', 'coalesced', 'superseded', 'waiting', 'deferred'] satisfies AgentTriggerOutcome[]);\n\n/** The progress of one upload, then the file the application stored. */\nexport type NhAssistantUploadEvent =\n | { type: 'progress'; loaded: number; total: number }\n | { type: 'uploaded'; file: FileReference };\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<NhAssistantMessageEvent> {\n return this.requestStream(`conversations/${encodeURIComponent(conversationId)}/messages`, request, true);\n }\n\n /**\n * Uploads one file to a conversation as `multipart/form-data` (`POST conversations/{id}/files`):\n * emits the progress while the file is sent and then the stored file, whose reference a message\n * carries in `files`. Fails with `NhAssistantApiError`; unsubscribing aborts the upload. The\n * media type of `file` is the one the upload declares.\n */\n uploadFile(conversationId: string, file: Blob, name: string): Observable<NhAssistantUploadEvent> {\n return new Observable<NhAssistantUploadEvent>(subscriber => {\n const abort = new AbortController();\n const form = new FormData();\n form.append('file', file, name);\n\n this.transport.upload<FileReference>(\n `conversations/${encodeURIComponent(conversationId)}/files`,\n form,\n (loaded, total) => subscriber.next({ type: 'progress', loaded, total }),\n abort.signal\n ).then(\n reference => {\n subscriber.next({ type: 'uploaded', file: reference });\n subscriber.complete();\n },\n error => {\n if (!abort.signal.aborted) {\n subscriber.error(error);\n }\n }\n );\n\n return () => abort.abort();\n });\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, false);\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 /** MCP servers that agents may use in background runs with the caller's own account. */\n getMcpConnections(): Observable<McpConnection[]> {\n return this.transport.json<McpConnection[]>('GET', 'mcp-connections');\n }\n\n /** Allows or withdraws background use of an MCP server with the caller's own account. */\n updateMcpConnection(serverId: string, request: UpdateMcpConnectionRequest): Observable<McpConnection> {\n return this.transport.json<McpConnection>('PUT', `mcp-connections/${encodeURIComponent(serverId)}`, request);\n }\n\n /**\n * Starts the caller's authorization of a server each person connects to. Prefer\n * `NhAssistantMcpConnectService.connect`, which opens and completes it.\n */\n authorizeMcpConnection(serverId: string, request: McpAuthorizeRequest = {}): Observable<McpAuthorizationStart> {\n return this.transport.json<McpAuthorizationStart>('POST', `mcp-connections/${encodeURIComponent(serverId)}/authorize`, request);\n }\n\n /** Removes the caller's own connection of a server and revokes its tokens. */\n disconnectMcpConnection(serverId: string): Observable<void> {\n return this.transport.json<void>('DELETE', `mcp-connections/${encodeURIComponent(serverId)}`);\n }\n\n /** Activates the connection of an authorization the caller started, with the callback's completion code. */\n completeMcpAuthorization(request: McpCompleteRequest): Observable<McpCompletion> {\n return this.transport.json<McpCompletion>('POST', 'mcp-connections/complete', request);\n }\n\n /**\n * Streams a turn. With `queuedReceipt` a `202` answer with a trigger receipt becomes\n * `message.queued`; without it, a stream is required.\n */\n private requestStream(path: string, body: unknown, queuedReceipt: true): Observable<NhAssistantMessageEvent>;\n private requestStream(path: string, body: unknown, queuedReceipt: false): Observable<NhAssistantSseEvent>;\n private requestStream(path: string, body: unknown, queuedReceipt: boolean): Observable<NhAssistantMessageEvent> {\n return new Observable<NhAssistantMessageEvent>(subscriber => {\n const abort = new AbortController();\n\n void this.executeStream(path, body, queuedReceipt, abort.signal, subscriber);\n\n return () => abort.abort();\n });\n }\n\n private async executeStream(\n path: string,\n body: unknown,\n queuedReceipt: boolean,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantMessageEvent>\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 if (queuedReceipt && response.status === 202) {\n await this.readQueuedReceipt(response, signal, subscriber);\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 /**\n * A message to an agent's thread whose run works waits for the next run: the server answers `202`\n * with the trigger receipt instead of a stream. A receipt the run takes the message with becomes\n * `message.queued`; one that refused it becomes an `error` with its code.\n */\n private async readQueuedReceipt(\n response: Response,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantMessageEvent>\n ): Promise<void> {\n let receipt: AgentTriggerReceipt | null;\n try {\n receipt = JSON.parse(await response.text()) as AgentTriggerReceipt | null;\n } catch {\n receipt = null;\n }\n if (signal.aborted || subscriber.closed) {\n return;\n }\n if (!receipt || typeof receipt.outcome !== 'string') {\n this.emitClientError(subscriber, signal, NhAssistantClientErrorCodes.invalidResponse);\n return;\n }\n if (!queuedOutcomes.has(receipt.outcome)) {\n this.emitClientError(\n subscriber,\n signal,\n nhAssistantIsSafeCode(receipt.reasonCode) ? receipt.reasonCode : NhAssistantClientErrorCodes.conversationBusy);\n return;\n }\n\n subscriber.next({ type: 'message.queued', data: receipt });\n subscriber.complete();\n }\n\n private async readStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n subscriber: Subscriber<NhAssistantMessageEvent>\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<NhAssistantMessageEvent>, 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 { Injectable, inject } from '@angular/core';\nimport { Observable, forkJoin, map, of } from 'rxjs';\nimport {\n AdminAgent,\n AdminAgentGroups,\n AdminAgentInput,\n AgentRunConfiguration,\n AgentRunSettings,\n AgentRunSettingsRequest,\n AgentEvaluation,\n AgentEvaluationFilter,\n AgentFeedbackExportFilter,\n AgentFeedbackFilter,\n AgentFeedbackList,\n AgentFeedbackListFilter,\n AgentFeedbackSummary,\n AgentReplay,\n AgentReplayList,\n AgentReplayRequest,\n AgentSkillState,\n AgentState,\n ApplicationContext,\n DataSkill,\n DataSkillRequest,\n DataSkillVersion,\n DataTrigger,\n DataTriggerRequest,\n DataTriggerShadowRequest,\n ApplicationContextVersion,\n McpAuthorizationStart,\n McpAuthorizeRequest,\n McpCompleteRequest,\n McpCompletion,\n McpConnectionsSummary,\n McpDiscovery,\n McpOrganizationConnection,\n McpCustomAuthMode,\n McpServer,\n McpServerInput,\n McpServerTestResult,\n McpTool,\n AssistantAccount,\n RunCatalog,\n RunConfigurationRemoval,\n SetAgentServiceAccountRequest,\n SetAgentShadowRequest,\n SetAgentStateRequest,\n SkillCandidateRequest,\n SkillComparison,\n SkillComparisonFilter,\n ToolCatalogEntry,\n UpdateAdminAgentRequest,\n UpdateApplicationContextRequest,\n UpdateMcpToolRequest\n} from '../models/assistant-admin.models';\nimport { AgentRunFilter, AgentRunHistory } from '../models/assistant-agent-run.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantApiService } from './nh-assistant-api.service';\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/** The most account ids one `GET admin/accounts?ids=` reads; `getAccounts` asks for more in parts. */\nconst maxAccountIds = 50;\n\n/** The longest account id the server reads; a longer id names no account. */\nconst maxAccountIdLength = 256;\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 private readonly api = inject(NhAssistantApiService);\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. The run state stays as it is. */\n resetAgent(agentId: string): Observable<AdminAgent> {\n return this.request<AdminAgent>('POST', `admin/agents/${encodeURIComponent(agentId)}/reset`);\n }\n\n getAgentState(agentId: string): Observable<AgentState> {\n return this.request<AgentState>('GET', `admin/agents/${encodeURIComponent(agentId)}/state`);\n }\n\n /**\n * Pauses, stops or resumes an agent without changing its definition. A code-disabled agent\n * cannot be resumed (`assistant-agent-configured-off`).\n */\n setAgentState(agentId: string, request: SetAgentStateRequest): Observable<AgentState> {\n return this.request<AgentState>('POST', `admin/agents/${encodeURIComponent(agentId)}/state`, request);\n }\n\n /**\n * Pauses, stops or resumes one skill of an agent; its other skills keep working.\n */\n setSkillState(agentId: string, skillId: string, request: SetAgentStateRequest): Observable<AgentSkillState> {\n return this.request<AgentSkillState>(\n 'POST',\n `admin/agents/${encodeURIComponent(agentId)}/skills/${encodeURIComponent(skillId)}/state`,\n request);\n }\n\n /**\n * Puts an agent in shadow, live, or back to the mode in code. A shadow variant cannot change\n * (`assistant-shadow-variant`).\n */\n setAgentShadow(agentId: string, request: SetAgentShadowRequest): Observable<AgentState> {\n return this.request<AgentState>('POST', `admin/agents/${encodeURIComponent(agentId)}/shadow`, request);\n }\n\n /** Puts one skill of an agent in shadow, live, or back to the mode in code. */\n setSkillShadow(agentId: string, skillId: string, request: SetAgentShadowRequest): Observable<AgentSkillState> {\n return this.request<AgentSkillState>(\n 'POST',\n `admin/agents/${encodeURIComponent(agentId)}/skills/${encodeURIComponent(skillId)}/shadow`,\n request);\n }\n\n /**\n * Changes the technical account that answers for the agent's new runs, or with `actorId: null`\n * uses the account in code again. Fails with `assistant-service-account-not-found` for an\n * account that does not exist or may not sign in.\n */\n setServiceAccount(agentId: string, request: SetAgentServiceAccountRequest): Observable<AgentState> {\n return this.request<AgentState>('POST', `admin/agents/${encodeURIComponent(agentId)}/service-account`, request);\n }\n\n /**\n * Puts an agent, in code or created here, in exactly `groups` of the run catalog's `agentGroups`\n * and out of the others. The choice wins over the agent's `InGroup` in code. Fails with a field error\n * on `groups` for an unknown group and with `assistant-shadow-variant` for a shadow variant.\n */\n setAgentGroups(agentId: string, groups: readonly string[]): Observable<AdminAgentGroups> {\n return this.request<AdminAgentGroups>('PUT', `admin/agents/${encodeURIComponent(agentId)}/groups`, { groups });\n }\n\n /** Deletes an admin agent. Code agents cannot be deleted; stop 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 /**\n * The authentication modes the application registered in code (`GET admin/mcp-auth-modes`), which\n * administrators choose next to the built-in modes.\n */\n getMcpAuthModes(): Observable<McpCustomAuthMode[]> {\n return this.request<McpCustomAuthMode[]>('GET', 'admin/mcp-auth-modes');\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 /**\n * Reads the protected resource metadata of a server address and its authorization server without\n * storing anything. Save the server with `oauth.confirmAuthorization` to pin what was found.\n */\n discoverMcpServer(url: string): Observable<McpDiscovery> {\n return this.request<McpDiscovery>('POST', 'admin/mcp-servers/discover', { url });\n }\n\n /** The organization's OAuth connection of a server, without tokens. */\n getMcpOrganizationConnection(serverId: string): Observable<McpOrganizationConnection> {\n return this.request<McpOrganizationConnection>('GET', `${mcpServerPath(serverId)}/connection`);\n }\n\n /**\n * Starts the administrator's authorization of the organization connection. Open\n * `authorizationUrl` in the administrator's browser, then complete with `completeMcpAuthorization`.\n */\n authorizeMcpOrganizationConnection(serverId: string, request: McpAuthorizeRequest = {}): Observable<McpAuthorizationStart> {\n return this.request<McpAuthorizationStart>('POST', `${mcpServerPath(serverId)}/connection/authorize`, request);\n }\n\n /** Removes the organization connection and revokes its tokens. */\n disconnectMcpOrganizationConnection(serverId: string): Observable<void> {\n return this.request<void>('DELETE', `${mcpServerPath(serverId)}/connection`);\n }\n\n /** The personal connections of a server per status. */\n getMcpConnectionsSummary(serverId: string): Observable<McpConnectionsSummary> {\n return this.request<McpConnectionsSummary>('GET', `${mcpServerPath(serverId)}/connections/summary`);\n }\n\n /** Revokes every person's connection of a server; each person connects again. */\n revokeMcpConnections(serverId: string): Observable<void> {\n return this.request<void>('DELETE', `${mcpServerPath(serverId)}/connections`);\n }\n\n /**\n * Activates the connection of an authorization the caller started with the completion code the\n * callback handed to the browser. An organization connection also needs the admin policy. The same\n * call as `NhAssistantApiService.completeMcpAuthorization`, with the same failure codes.\n */\n completeMcpAuthorization(request: McpCompleteRequest): Observable<McpCompletion> {\n return this.api.completeMcpAuthorization(request);\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 exportAgentFeedback(agentId: string, filter: AgentFeedbackExportFilter = {}): Promise<Blob> {\n return this.download(withQuery(`${feedbackPath(agentId)}/export`, filter));\n }\n\n /**\n * Compares a shadow variant with its live agent over a period: the runs that handled the same\n * events, the proposals per tool with what people decided about the live ones, cost and routing.\n */\n getAgentEvaluation(agentId: string, filter: AgentEvaluationFilter): Observable<AgentEvaluation> {\n return this.request<AgentEvaluation>('GET', withQuery(`${agentPath(agentId)}/evaluation`, filter));\n }\n\n /**\n * Downloads the paired runs of the comparison as JSON Lines: identifiers, statuses, usage and\n * proposal identities, no content. The server audits the export. Rejects with `NhAssistantApiError`.\n */\n exportAgentEvaluation(agentId: string, filter: AgentEvaluationFilter): Promise<Blob> {\n return this.download(withQuery(`${agentPath(agentId)}/evaluation/export`, filter));\n }\n\n /**\n * Replays the recorded runs of another agent in a period into a shadow variant, against today's\n * state of each subject. One replay runs per variant (`assistant-replay-active`).\n */\n startAgentReplay(variantId: string, request: AgentReplayRequest): Observable<AgentReplay> {\n return this.request<AgentReplay>('POST', `${agentPath(variantId)}/replay`, request);\n }\n\n /** The latest replays into a shadow variant, newest first. */\n getAgentReplays(variantId: string): Observable<AgentReplayList> {\n return this.request<AgentReplayList>('GET', `${agentPath(variantId)}/replays`);\n }\n\n /** The building blocks in code that run settings, skills and triggers defined as data can name. */\n getRunCatalog(): Observable<RunCatalog> {\n return this.request<RunCatalog>('GET', 'admin/run-catalog');\n }\n\n /**\n * Accounts whose name or e-mail address contains `query` (2 to 100 characters), at most `limit`.\n * Fails with `assistant-account-search-unavailable` when the application offers no search; the\n * run catalog's `accountSearch` tells beforehand.\n */\n searchAccounts(query: string, limit?: number): Observable<AssistantAccount[]> {\n return this.request<AssistantAccount[]>('GET', withQuery('admin/accounts', { query, limit }));\n }\n\n /**\n * The names the application knows for these account ids; unknown ids are left out. The server reads\n * at most 50 ids per request, so more ids are asked for in parts of 50 and the answers merged in\n * the order of the ids. Fails with `NhAssistantApiError` when any part fails.\n */\n getAccounts(actorIds: readonly string[]): Observable<AssistantAccount[]> {\n // An empty id or one longer than the server reads names no account.\n const ids = [...new Set(actorIds.filter(id => id.trim().length > 0 && id.length <= maxAccountIdLength))];\n if (ids.length === 0) {\n return of([]);\n }\n\n const parts: Observable<AssistantAccount[]>[] = [];\n for (let start = 0; start < ids.length; start += maxAccountIds) {\n const part = ids.slice(start, start + maxAccountIds);\n parts.push(this.request<AssistantAccount[]>('GET', withQuery('admin/accounts', { ids: part.join(',') })));\n }\n\n return forkJoin(parts).pipe(map(answers => answers.flat()));\n }\n\n /**\n * The agent's run settings, skills and triggers, in code and as data, and the data that no longer\n * fits the code. An agent in code without a run configuration answers `assistant-agent-not-found`.\n */\n getAgentConfiguration(agentId: string): Observable<AgentRunConfiguration> {\n return this.request<AgentRunConfiguration>('GET', `${agentPath(agentId)}/configuration`);\n }\n\n /**\n * Adds or changes the run settings of an agent created in the administration. An agent in code\n * fails with `assistant-run-settings-in-code`; an unknown technical account with\n * `assistant-service-account-not-found`.\n */\n saveRunSettings(agentId: string, request: AgentRunSettingsRequest): Observable<AgentRunSettings> {\n return this.request<AgentRunSettings>('PUT', `${agentPath(agentId)}/run-settings`, request);\n }\n\n /**\n * Every run of the agent, live and shadow, newest first, for its runs view. Read one run's whole\n * result with `NhAssistantAgentRunApiService.getRunResult`. The server checks the filter first:\n * `assistant-run-filter-invalid` with the refused parts in `fieldErrors`, then\n * `assistant-agent-not-found` for an unknown agent.\n */\n getAgentRuns(agentId: string, filter: Omit<AgentRunFilter, 'agentId'> = {}): Observable<AgentRunHistory> {\n return this.request<AgentRunHistory>('GET', withQuery(`${agentPath(agentId)}/runs`, filter));\n }\n\n /** Removes the run settings; while data skills or triggers belong to the agent, `assistant-run-settings-in-use`. */\n removeRunSettings(agentId: string, removal: RunConfigurationRemoval = {}): Observable<void> {\n return this.request<void>('DELETE', withQuery(`${agentPath(agentId)}/run-settings`, removal));\n }\n\n /**\n * Adds a skill defined as data, which starts in shadow, or stores its next version: with `apply`\n * `live` at once, with `shadow` as the candidate that runs in shadow next to the live version.\n */\n saveDataSkill(agentId: string, skillId: string, request: DataSkillRequest): Observable<DataSkill> {\n return this.request<DataSkill>('PUT', skillPath(agentId, skillId), request);\n }\n\n /** Takes a skill defined as data out of effect; while a data trigger names it, `assistant-skill-in-use`. */\n removeDataSkill(agentId: string, skillId: string, removal: RunConfigurationRemoval = {}): Observable<void> {\n return this.request<void>('DELETE', withQuery(skillPath(agentId, skillId), removal));\n }\n\n /** Every version of a skill defined as data, newest first. */\n getDataSkillVersions(agentId: string, skillId: string): Observable<DataSkillVersion[]> {\n return this.request<DataSkillVersion[]>('GET', `${skillPath(agentId, skillId)}/versions`);\n }\n\n /** Makes the candidate the live version of its skill. */\n promoteSkillCandidate(agentId: string, skillId: string, request: SkillCandidateRequest): Observable<DataSkill> {\n return this.request<DataSkill>('POST', `${skillPath(agentId, skillId)}/candidate/promote`, request);\n }\n\n /** Discards the candidate; it stays as history. */\n discardSkillCandidate(agentId: string, skillId: string, request: SkillCandidateRequest): Observable<void> {\n return this.request<void>('POST', `${skillPath(agentId, skillId)}/candidate/discard`, request);\n }\n\n /** Compares the candidate with the live version on the runs they made in the period. */\n compareSkillCandidate(agentId: string, skillId: string, filter: SkillComparisonFilter = {}): Observable<SkillComparison> {\n return this.request<SkillComparison>('GET', withQuery(`${skillPath(agentId, skillId)}/candidate/comparison`, filter));\n }\n\n /** Adds a trigger defined as data, which starts in shadow, or changes one in the mode it has. */\n saveDataTrigger(agentId: string, triggerId: string, request: DataTriggerRequest): Observable<DataTrigger> {\n return this.request<DataTrigger>('PUT', triggerPath(agentId, triggerId), request);\n }\n\n removeDataTrigger(agentId: string, triggerId: string, removal: RunConfigurationRemoval = {}): Observable<void> {\n return this.request<void>('DELETE', withQuery(triggerPath(agentId, triggerId), removal));\n }\n\n /** Puts a trigger defined as data in shadow or live. */\n setDataTriggerShadow(agentId: string, triggerId: string, request: DataTriggerShadowRequest): Observable<DataTrigger> {\n return this.request<DataTrigger>('POST', `${triggerPath(agentId, triggerId)}/shadow`, request);\n }\n\n private download(path: string): Promise<Blob> {\n return this.transport.download(path, 'application/x-ndjson', adminStatusCodes);\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 mcpServerPath(serverId: string): string {\n return `admin/mcp-servers/${encodeURIComponent(serverId)}`;\n}\n\nfunction feedbackPath(agentId: string): string {\n return `${agentPath(agentId)}/feedback`;\n}\n\nfunction agentPath(agentId: string): string {\n return `admin/agents/${encodeURIComponent(agentId)}`;\n}\n\nfunction skillPath(agentId: string, skillId: string): string {\n return `${agentPath(agentId)}/skills/${encodeURIComponent(skillId)}`;\n}\n\nfunction triggerPath(agentId: string, triggerId: string): string {\n return `${agentPath(agentId)}/triggers/${encodeURIComponent(triggerId)}`;\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 AgentBoard,\n AgentBoardList,\n AgentBoardVisit,\n AgentConsultationList,\n AgentDecisionOutcome,\n AgentExecutionResolution,\n AgentFeedbackOutcome,\n AgentInbox,\n AgentInboxFilter,\n AgentInboxVisit,\n AgentObjectAgents,\n AgentProposal,\n AgentProposalDecision,\n AgentProposalFeedback,\n AgentProposalFeedbackCategory,\n AgentProposalLookup,\n AgentRunFilter,\n AgentRunHistory,\n AgentRunList,\n AgentRunResult,\n AgentRunRetryMode,\n AgentSubjectSearch,\n AgentSubjectSummaryList,\n AgentSubjectWork,\n AgentSubjectWorkProposal,\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 /**\n * Runs the agent now on the subject with the caller as initiator. On an object it needs the\n * participant role; on the whole application (`nh-system`) the agent's run policy, by default the\n * administration policy. The receipt says what became of the start (`AgentTriggerOutcome`), for\n * example `waiting` while the agent is paused. A refusal errors with `NhAssistantApiError`:\n * `assistant-agent-does-not-work-on`, `assistant-agent-stopped`, `assistant-trigger-rate-limited`\n * and the other conflicts (409), `assistant-subject-access-denied` or `assistant-agent-forbidden`\n * (403), `assistant-agent-not-found` or `assistant-subject-not-found` (404),\n * `assistant-subject-invalid` (400) and `assistant-trigger-rolled-back` (503).\n */\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 * The agents that work on the subject and that the caller may use, with whether the caller may run\n * each now, its newest run with the beginning of its result and its open proposals. The subject is\n * an object or the whole application (`nh-system`, `global` or `division-…`). Errors with\n * `assistant-subject-not-found` when the caller has no role on the subject.\n */\n getObjectAgents(subjectType: string, subjectId: string): Observable<AgentObjectAgents> {\n return this.transport.json<AgentObjectAgents>(\n 'GET',\n `subjects/${encodeURIComponent(subjectType)}/${encodeURIComponent(subjectId)}/agents`\n );\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 /**\n * Finds subjects of one type by name, at most `limit` (default 20, at most 50), among those the\n * caller may read; `query` has 2 to 100 characters. Errors with `assistant-subject-search-unavailable`\n * for a type the application does not search (people then give the subject's id), with\n * `assistant-subject-type-unknown` for an unknown type and with `assistant-validation` for a\n * query of the wrong length.\n */\n searchSubjects(subjectType: string, query: string, limit?: number): Observable<AgentSubjectSearch> {\n const parameters = new URLSearchParams({ query });\n if (limit !== undefined) {\n parameters.set('limit', String(limit));\n }\n return this.transport.json<AgentSubjectSearch>(\n 'GET',\n `subjects/${encodeURIComponent(subjectType)}/search?${parameters.toString()}`\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 /**\n * One proposal of an agent thread in any status, with the caller's live right to decide it, for\n * example the one an `AgentWorkChanged` update names. Fails with `assistant-approval-not-found`\n * for an unknown proposal and for one the caller may not see.\n */\n getProposal(approvalId: string): Observable<AgentSubjectWorkProposal> {\n return this.transport.json<AgentSubjectWorkProposal>('GET', `approvals/${encodeURIComponent(approvalId)}`);\n }\n\n /**\n * The proposals among at most `NH_ASSISTANT_MAX_PROPOSAL_LOOKUP` ids that the caller may see, in\n * the order of the ids, each with the caller's live right to decide it. The others are left out.\n */\n lookupProposals(approvalIds: readonly string[]): Observable<AgentProposalLookup> {\n return this.transport.json<AgentProposalLookup>('POST', 'approvals/lookup', { approvalIds });\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 /**\n * Downloads one artifact version with the host's credentials. Rejects with `NhAssistantApiError`,\n * for example `assistant-artifact-not-found` or `assistant-network`.\n */\n downloadArtifact(conversationId: string, artifactId: string): Promise<Blob> {\n const path = `threads/${encodeURIComponent(conversationId)}/artifacts/${encodeURIComponent(artifactId)}/content`;\n return this.transport.download(path, '*/*');\n }\n\n /**\n * The agent runs the caller may see, newest first: runs on objects the caller reads and runs for\n * the whole application whose agent's view policy the caller passes. Errors with\n * `assistant-run-filter-invalid` for an invalid filter, with the refused parts in `fieldErrors`\n * (`page`, `itemsPerPage`, `agentId`, `subjectType`, `subjectId`, `status`, `to`).\n */\n getRunHistory(filter: AgentRunFilter = {}): Observable<AgentRunHistory> {\n return this.transport.json<AgentRunHistory>('GET', withQuery('runs', filter));\n }\n\n /**\n * The boards of the groups of agents the caller sees at least one agent of, ordered by name: an\n * agent that works on the whole application by its view policy, another by its required policy.\n */\n getBoards(): Observable<AgentBoardList> {\n return this.transport.json<AgentBoardList>('GET', 'boards');\n }\n\n /**\n * The board of one group: per agent what it works on, its latest result for the whole application,\n * its open proposals, whether the caller may run it now and whether something is new since the\n * caller's last visit. `divisionId` opens the board of one division the caller may work in. Fails\n * with `assistant-board-not-found` for an unknown group or one the caller sees no agent of, and with\n * `assistant-board-scope-invalid` for a malformed division id.\n */\n getBoard(groupId: string, divisionId?: string | null): Observable<AgentBoard> {\n return this.transport.json<AgentBoard>('GET', withQuery(`boards/${encodeURIComponent(groupId)}`, { divisionId }));\n }\n\n /** Records that the caller looked at the board now, so it marks what is new after this visit. */\n visitBoard(groupId: string, divisionId?: string | null): Observable<AgentBoardVisit> {\n return this.transport.json<AgentBoardVisit>('POST', withQuery(`boards/${encodeURIComponent(groupId)}/visit`, { divisionId }));\n }\n\n /**\n * One run with its whole result, its proposals and its files. Fails with `assistant-run-not-found`\n * for an unknown run and for one the caller may not see.\n */\n getRunResult(runId: string): Observable<AgentRunResult> {\n return this.transport.json<AgentRunResult>('GET', `runs/${encodeURIComponent(runId)}`);\n }\n\n /**\n * Downloads one file a run saved, with the host's credentials. Rejects with `NhAssistantApiError`,\n * for example `assistant-artifact-not-found`, `assistant-run-not-found` or `assistant-network`.\n */\n downloadRunArtifact(runId: string, artifactId: string): Promise<Blob> {\n const path = `runs/${encodeURIComponent(runId)}/artifacts/${encodeURIComponent(artifactId)}/content`;\n return this.transport.download(path, '*/*');\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 /**\n * Resumes or restarts a failed or cancelled run; needs the approver role. A restart starts the agent\n * again like `startAgent`, with the same outcomes and refusals; a resume answers `queued`.\n */\n retryRun(runId: string, mode: AgentRunRetryMode): Observable<AgentTriggerReceipt> {\n return this.transport.json<AgentTriggerReceipt>('POST', `runs/${encodeURIComponent(runId)}/retry`, { mode });\n }\n\n /**\n * Pending proposals the caller may decide, sorted by expiry, or with `grouped` by parent and subject,\n * with what is new since the caller's last visit (`visitInbox`).\n */\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 * Records that the caller looked at the inbox now, so it marks the proposals made after this visit\n * as new. `divisionId` records the visit of the inbox of one division the caller may work in;\n * otherwise of the whole inbox. Fails with `assistant-subject-not-found` for a division the caller\n * may not work in.\n */\n visitInbox(divisionId?: string | null): Observable<AgentInboxVisit> {\n return this.transport.json<AgentInboxVisit>('POST', withQuery('approvals/inbox/visit', { divisionId }));\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\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 { 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 LiveAgentWorkWatch,\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/** How long a watch of the whole application's agent work lasts when the server does not say. */\nconst defaultWatchRenewalSeconds = 300;\n/** The shortest renewal of a watch, whatever the server says. */\nconst minimumWatchRenewalSeconds = 30;\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. The work of agents for the whole application\n * lists no members, so it arrives only while a screen watches it (`watchAgentWork`).\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 /** The screens that watch the work of agents for the whole application. */\n private agentWorkWatchers = 0;\n private watchTimer?: 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 this.agentWorkWatchers = 0;\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 void this.renewAgentWorkWatch();\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 /**\n * Follows the work of agents for the whole application, such as their proposals and runs, while the\n * returned function has not been called; a screen that shows it, such as the approval inbox or a\n * board, watches it while it is shown. The whole application lists no members, so the hub sends its\n * agents' work only to connections that watch it: it joins the work the server decides the person\n * may read, the agent's view policy included, renews the watch when the server says and after every\n * reconnect, and so checks the person's rights again. The watch ends when the last screen releases\n * it. Without a connection nothing arrives and screens keep their own reload.\n */\n watchAgentWork(): () => void {\n this.agentWorkWatchers++;\n if (this.agentWorkWatchers === 1) {\n void this.renewAgentWorkWatch();\n }\n\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n this.agentWorkWatchers = Math.max(0, this.agentWorkWatchers - 1);\n if (this.agentWorkWatchers === 0) {\n clearTimeout(this.watchTimer);\n const connection = this.connection;\n if (connection && this.stateSignal() === 'connected') {\n connection.invoke('UnwatchAgentWork').catch(() => undefined);\n }\n }\n };\n }\n\n async stop(): Promise<void> {\n this.revision++;\n this.hubUrl = null;\n clearTimeout(this.restartTimer);\n clearTimeout(this.watchTimer);\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 // A new connection belongs to no watch yet.\n void this.renewAgentWorkWatch();\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 /**\n * Asks the hub to watch the work of agents for the whole application for the screens that watch it,\n * and schedules the renewal the server asks for. An older server without watching, or a failed call,\n * is tried again later; live updates stay optional.\n */\n private async renewAgentWorkWatch(): Promise<void> {\n clearTimeout(this.watchTimer);\n const connection = this.connection;\n if (this.agentWorkWatchers === 0 || !connection || this.stateSignal() !== 'connected') {\n return;\n }\n\n let seconds = defaultWatchRenewalSeconds;\n try {\n const watch = await connection.invoke<LiveAgentWorkWatch | null>('WatchAgentWork');\n if (typeof watch?.refreshAfterSeconds === 'number' && Number.isFinite(watch.refreshAfterSeconds)) {\n seconds = Math.max(minimumWatchRenewalSeconds, watch.refreshAfterSeconds);\n }\n } catch {\n // Tried again at the next renewal or reconnect.\n }\n\n if (connection === this.connection && this.agentWorkWatchers > 0) {\n clearTimeout(this.watchTimer);\n this.watchTimer = setTimeout(() => void this.renewAgentWorkWatch(), seconds * 1_000);\n }\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 { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantError } from '../services/nh-assistant.store';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey } from '../services/nh-assistant-transport';\n\n/** The text every error falls back to when neither its key nor its code has one. */\nconst genericErrorKey = 'nh-assistant.errors.generic';\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 Object.keys(error.fieldErrors).length > 0\n ? { code: error.code, messageKey: error.messageKey, fieldErrors: error.fieldErrors }\n : { code: error.code, messageKey: error.messageKey };\n }\n\n return nhAssistantErrorOf(NhAssistantClientErrorCodes.server);\n}\n\n/** The error of a code without a message key of its own, such as a code a callback page reported. */\nexport function nhAssistantErrorOf(code: string): NhAssistantError {\n return { code, messageKey: nhAssistantErrorMessageKey(code) };\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), genericErrorKey] : [];\n}\n\n/**\n * Translation keys for a bare failure code, such as a run's `failureCode`: the registered text of\n * the code, then the generic text. Empty without a code.\n */\nexport function nhAssistantCodeKeys(code: string | null | undefined): string[] {\n return code ? [nhAssistantErrorMessageKey(code), genericErrorKey] : [];\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 { InjectionToken, inject } from '@angular/core';\nimport { Observable, catchError, switchMap, throwError } from 'rxjs';\nimport { McpAuthorizationStart, McpCompleteRequest, McpCompletion } from '../models/assistant-admin.models';\nimport { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\nimport { NhAssistantApiError, nhAssistantErrorMessageKey, nhAssistantIsSafeCode } from './nh-assistant-transport';\n\n/** The `type` of the message the assistant's OAuth callback page posts to its opener. */\nexport const NH_ASSISTANT_MCP_AUTHORIZATION_MESSAGE = 'nh-assistant-mcp-authorization';\n\n/**\n * What an authorization window reports: the flow and its one-time completion code, which\n * `POST mcp-connections/complete` turns into the connection with the caller's own session, or the\n * failure code of the callback (for example `assistant-mcp-authorization-failed`).\n */\nexport type NhAssistantMcpAuthorizationOutcome =\n | { flowId: string; completionCode: string; code?: undefined }\n | { flowId: string | null; code: string; completionCode?: undefined };\n\n/** A window opened for one authorization. */\nexport interface NhAssistantMcpAuthorizationHandle {\n /** Shows the authorization and emits its outcome once, then completes. */\n authorize(start: McpAuthorizationStart): Observable<NhAssistantMcpAuthorizationOutcome>;\n /** Closes the window, for example when starting the authorization failed. */\n close(): void;\n}\n\n/**\n * Opens MCP authorizations in the person's browser. `open()` runs in the click handler, before the\n * authorization URL is known, so popup blockers allow the window.\n */\nexport interface NhAssistantMcpAuthorizationWindow {\n open(): NhAssistantMcpAuthorizationHandle;\n}\n\n/**\n * The authorization window of the assistant components. The default opens a popup and waits for the\n * callback page's message; the testing package replaces it for the mock back-end.\n */\nexport const NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW = new InjectionToken<NhAssistantMcpAuthorizationWindow>(\n 'NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW',\n { providedIn: 'root', factory: () => new NhAssistantMcpPopupAuthorizationWindow(inject(DOCUMENT)) }\n);\n\nconst safeToken = /^[A-Za-z0-9_-]{16,128}$/;\n/** The code of a callback whose own code cannot be shown. */\nconst authorizationFailed = 'assistant-mcp-authorization-failed';\nconst flowPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Opens the authorization in a popup. Only a message from that popup, sent by the assistant's\n * callback page (`callbackOrigin`), with the started flow is accepted; the completion code is useless\n * without the starter's own session. A closed popup\n * without a message reports `assistant-mcp-authorization-cancelled`, a blocked one\n * `assistant-mcp-popup-blocked`.\n */\nexport class NhAssistantMcpPopupAuthorizationWindow implements NhAssistantMcpAuthorizationWindow {\n constructor(private readonly document: Document) {}\n\n open(): NhAssistantMcpAuthorizationHandle {\n const view = this.document.defaultView;\n // The callback page needs window.opener, so the popup cannot be opened with noopener.\n const popup = view?.open('about:blank', '_blank', 'popup=yes,width=560,height=720') ?? null;\n return new PopupHandle(view, popup);\n }\n}\n\nclass PopupHandle implements NhAssistantMcpAuthorizationHandle {\n constructor(\n private readonly view: Window | null,\n private readonly popup: Window | null\n ) {}\n\n authorize(start: McpAuthorizationStart): Observable<NhAssistantMcpAuthorizationOutcome> {\n return new Observable<NhAssistantMcpAuthorizationOutcome>(subscriber => {\n const view = this.view;\n const popup = this.popup;\n if (!view || !popup || popup.closed) {\n subscriber.next({ flowId: start.flowId, code: NhAssistantClientErrorCodes.mcpPopupBlocked });\n subscriber.complete();\n return undefined;\n }\n\n let finished = false;\n const finish = (outcome: NhAssistantMcpAuthorizationOutcome): void => {\n if (finished) {\n return;\n }\n finished = true;\n subscriber.next(outcome);\n subscriber.complete();\n };\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== popup || event.origin !== start.callbackOrigin) {\n return;\n }\n const outcome = readMessage(event.data, start.flowId);\n if (outcome) {\n finish(outcome);\n }\n };\n view.addEventListener('message', onMessage);\n const closedCheck = view.setInterval(() => {\n if (popup.closed) {\n // The message is dispatched before the page closes itself; a later check finds nothing.\n finish({ flowId: start.flowId, code: NhAssistantClientErrorCodes.mcpAuthorizationCancelled });\n }\n }, 500);\n popup.location.replace(start.authorizationUrl);\n\n return () => {\n view.removeEventListener('message', onMessage);\n view.clearInterval(closedCheck);\n };\n });\n }\n\n close(): void {\n if (this.popup && !this.popup.closed) {\n this.popup.close();\n }\n }\n}\n\n/**\n * The outcome in a callback message for the started flow, or null for any other message. The message\n * is `{ type, flowId, completionCode, code, messageKey }`; the text of a failure comes from its code,\n * so the message key the page sends along is not needed.\n */\nfunction readMessage(data: unknown, flowId: string): NhAssistantMcpAuthorizationOutcome | null {\n if (!data || typeof data !== 'object') {\n return null;\n }\n const message = data as Record<string, unknown>;\n if (message['type'] !== NH_ASSISTANT_MCP_AUTHORIZATION_MESSAGE) {\n return null;\n }\n const messageFlow = message['flowId'];\n if (messageFlow !== null && messageFlow !== flowId) {\n return null;\n }\n const completionCode = message['completionCode'];\n if (messageFlow === flowId && typeof completionCode === 'string' && safeToken.test(completionCode)) {\n return { flowId, completionCode };\n }\n const code = message['code'];\n return { flowId, code: nhAssistantIsSafeCode(code) ? code : authorizationFailed };\n}\n\n/**\n * Reads the outcome of a redirect-mode authorization from a URL fragment\n * (`#nh-mcp-flow=…&nh-mcp-code=…` or `#nh-mcp-error=…&nh-mcp-message-key=…`); null when the fragment\n * has none. The text of a failure comes from its code. Remove the fragment from the address bar after\n * reading it.\n */\nexport function nhAssistantMcpAuthorizationFromFragment(fragment: string): NhAssistantMcpAuthorizationOutcome | null {\n const values = new URLSearchParams(fragment.startsWith('#') ? fragment.slice(1) : fragment);\n const flowId = values.get('nh-mcp-flow');\n const completionCode = values.get('nh-mcp-code');\n const error = values.get('nh-mcp-error');\n if (flowId && flowPattern.test(flowId) && completionCode && safeToken.test(completionCode)) {\n return { flowId, completionCode };\n }\n if (error) {\n return { flowId: flowId && flowPattern.test(flowId) ? flowId : null, code: nhAssistantIsSafeCode(error) ? error : authorizationFailed };\n }\n return null;\n}\n\n/**\n * Runs one authorization: starts it, shows it in the window opened before, and completes it with\n * the caller's own session. Errors with `NhAssistantApiError`, also for the window's failure codes.\n */\nexport function nhAssistantConnectMcp(\n handle: NhAssistantMcpAuthorizationHandle,\n start: Observable<McpAuthorizationStart>,\n complete: (request: McpCompleteRequest) => Observable<McpCompletion>\n): Observable<McpCompletion> {\n return start.pipe(\n catchError((error: unknown) => {\n handle.close();\n return throwError(() => error);\n }),\n switchMap(started => handle.authorize(started)),\n switchMap(outcome => outcome.completionCode !== undefined\n ? complete({ flowId: outcome.flowId, completionCode: outcome.completionCode })\n : throwError(() => new NhAssistantApiError(0, outcome.code, nhAssistantErrorMessageKey(outcome.code)))));\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { NEVER, Observable, catchError, map, of, switchMap } from 'rxjs';\nimport { toNhAssistantError } from '../internal/nh-assistant-errors';\nimport { McpAuthorizationStart, McpAuthorizeRequest, McpCompletion } from '../models/assistant-admin.models';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\nimport { NhAssistantApiService } from './nh-assistant-api.service';\nimport {\n NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW,\n nhAssistantConnectMcp,\n nhAssistantMcpAuthorizationFromFragment\n} from './nh-assistant-mcp-authorization';\n\n/**\n * The outcome of an authorization the page returned from in redirect mode: the activated connection,\n * or the failure code to show. `serverId` names the server whose connection the page left for, when\n * this browser tab remembered it, so a screen shows the outcome at that server only.\n */\nexport type NhAssistantMcpReturnOutcome =\n | { completion: McpCompletion; code?: undefined; serverId?: string | null }\n | { code: string; completion?: undefined; serverId?: string | null };\n\n/** Where this tab remembers the server whose connection it left for, until it returns. */\nconst leftForKey = 'nh-assistant.mcp-connect.server';\n\n/**\n * Connects MCP accounts the way the host configured (`mcpConnectMode`): in a popup that the click\n * opens, or by sending the page to the authorization server and back. Every authorization completes\n * with the caller's own session.\n */\n@Injectable()\nexport class NhAssistantMcpConnectService {\n private readonly api = inject(NhAssistantApiService);\n private readonly config = inject(NH_ASSISTANT_CONFIG);\n private readonly authorizationWindow = inject(NH_ASSISTANT_MCP_AUTHORIZATION_WINDOW);\n private readonly document = inject(DOCUMENT);\n\n /**\n * The outcome of the redirect-mode authorization this page opened with, until a screen showed it.\n * `nh-assistant-connection-required` shows the outcome of its server without taking it; the\n * connection lists of the preferences and the administration show it and take it.\n */\n readonly returned = signal<NhAssistantMcpReturnOutcome | null>(null);\n\n /** Whether authorizations leave the page instead of opening a popup. */\n get redirects(): boolean {\n return this.config.mcpConnectMode === 'redirect';\n }\n\n /**\n * Connects the caller's own account to a server each person connects to. Call it in the click\n * handler, so the popup is allowed. In redirect mode the page leaves and the observable never\n * emits; the page completes the authorization when it returns.\n */\n connect(serverId: string, options: { allowBackgroundUse?: boolean } = {}): Observable<McpCompletion> {\n return this.run(\n request => this.api.authorizeMcpConnection(serverId, { ...request, allowBackgroundUse: options.allowBackgroundUse ?? null }),\n serverId);\n }\n\n /**\n * Runs any authorization start, for example an administrator's organization connection, in the\n * configured mode. `serverId` lets the page show the outcome at that server after a redirect.\n */\n run(start: (request: McpAuthorizeRequest) => Observable<McpAuthorizationStart>, serverId?: string): Observable<McpCompletion> {\n if (!this.redirects) {\n return nhAssistantConnectMcp(this.authorizationWindow.open(), start({}), request => this.api.completeMcpAuthorization(request));\n }\n\n const returnUrl = this.config.mcpConnectReturnUrl?.() ?? withoutFragment(this.document.location.href);\n return start({ returnUrl }).pipe(switchMap(started => {\n this.rememberLeftFor(serverId ?? null);\n this.navigate(started.authorizationUrl);\n return NEVER;\n }));\n }\n\n /** Leaves the page for an authorization in redirect mode. */\n navigate(url: string): void {\n this.document.location.assign(url);\n }\n\n /**\n * Completes a redirect-mode authorization when the page opened with its fragment, removes the\n * fragment from the address and records the outcome in `returned`: the connection, or the code of\n * whatever failed, also when completing it failed. Emits null without a fragment and never errors.\n */\n completeReturn(): Observable<NhAssistantMcpReturnOutcome | null> {\n const outcome = nhAssistantMcpAuthorizationFromFragment(this.document.location.hash);\n if (!outcome) {\n return of(null);\n }\n\n // The fragment carries a one-time code; it leaves the address before anything else happens.\n this.removeFragment();\n const serverId = this.takeLeftFor();\n\n if (outcome.completionCode === undefined) {\n return of(this.record({ code: outcome.code, serverId }));\n }\n\n const request = { flowId: outcome.flowId, completionCode: outcome.completionCode };\n return this.api.completeMcpAuthorization(request).pipe(\n map(completion => this.record({ completion, serverId: completion.serverId })),\n catchError((error: unknown) => of(this.record({ code: toNhAssistantError(error).code, serverId }))));\n }\n\n private record(outcome: NhAssistantMcpReturnOutcome): NhAssistantMcpReturnOutcome {\n this.returned.set(outcome);\n return outcome;\n }\n\n private removeFragment(): void {\n const view = this.document.defaultView;\n try {\n view?.history.replaceState(view.history.state, '', withoutFragment(this.document.location.href));\n } catch {\n // A page that may not change its history keeps the fragment; the code inside works only once.\n }\n }\n\n /** Remembers in this tab which server's connection the page leaves for. */\n private rememberLeftFor(serverId: string | null): void {\n try {\n const storage = this.document.defaultView?.sessionStorage;\n if (serverId) {\n storage?.setItem(leftForKey, serverId);\n } else {\n storage?.removeItem(leftForKey);\n }\n } catch {\n // Without session storage the outcome shows in the connection lists only.\n }\n }\n\n /** The server this tab left for, forgotten once read. */\n private takeLeftFor(): string | null {\n try {\n const storage = this.document.defaultView?.sessionStorage;\n const serverId = storage?.getItem(leftForKey) ?? null;\n storage?.removeItem(leftForKey);\n return serverId;\n } catch {\n return null;\n }\n }\n}\n\nfunction withoutFragment(url: string): string {\n const index = url.indexOf('#');\n return index < 0 ? url : url.slice(0, index);\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 { AgentUploads } from '../models/assistant-api.models';\n\n/** The longest file name a file reference takes. */\nexport const NH_ASSISTANT_MAX_FILE_NAME_LENGTH = 256;\n\nconst unknownMediaType = 'application/octet-stream';\n\n/** The media types the platform names, with the extensions a file picker offers and a short label. */\nconst knownTypes: Record<string, { extensions: string[]; label: string }> = {\n 'application/pdf': { extensions: ['.pdf'], label: 'PDF' },\n 'image/png': { extensions: ['.png'], label: 'PNG' },\n 'image/jpeg': { extensions: ['.jpg', '.jpeg'], label: 'JPEG' },\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': { extensions: ['.docx'], label: 'Word' },\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': { extensions: ['.xlsx'], label: 'Excel' }\n};\n\n/**\n * The media type of a chosen file, lowercase and without parameters. A browser that does not know\n * the type, as happens for Office documents, gives none; the extension of a known type then names\n * it. Otherwise `application/octet-stream`.\n */\nexport function nhAssistantMediaTypeOf(file: Pick<File, 'name' | 'type'>): string {\n const declared = file.type.split(';')[0].trim().toLowerCase();\n if (declared.length > 0 && declared !== unknownMediaType) {\n return declared;\n }\n\n const name = file.name.toLowerCase();\n for (const [mediaType, known] of Object.entries(knownTypes)) {\n if (known.extensions.some(extension => name.endsWith(extension))) {\n return mediaType;\n }\n }\n\n return unknownMediaType;\n}\n\n/**\n * The failure code of a file before it is uploaded, or `null` when it may be: the most files of one\n * message, an accepted media type, content and a usable name, and the largest size. `attached` counts\n * the files the message already carries.\n */\nexport function nhAssistantFileProblem(\n file: Pick<File, 'name' | 'size'>,\n mediaType: string,\n uploads: AgentUploads,\n attached: number\n): string | null {\n if (attached >= uploads.maxFiles) {\n return 'assistant-file-count-limit';\n }\n if (!uploads.acceptedMediaTypes.includes(mediaType)) {\n return 'assistant-file-type-not-accepted';\n }\n if (file.size === 0 || file.name.trim().length === 0 || file.name.length > NH_ASSISTANT_MAX_FILE_NAME_LENGTH) {\n return 'assistant-file-upload-invalid';\n }\n if (file.size > uploads.maxFileBytes) {\n return 'assistant-file-too-large';\n }\n\n return null;\n}\n\n/** The `accept` attribute of a file input for these media types: each type and its known extensions. */\nexport function nhAssistantAcceptAttribute(mediaTypes: readonly string[]): string {\n return mediaTypes\n .flatMap(mediaType => [mediaType, ...(knownTypes[mediaType]?.extensions ?? [])])\n .join(',');\n}\n\n/** A short name of a media type, such as `PDF` or `Word`; otherwise its subtype in capitals. */\nexport function nhAssistantFileTypeLabel(mediaType: string): string {\n const known = knownTypes[mediaType];\n if (known) {\n return known.label;\n }\n\n const subtype = mediaType.split('/')[1] ?? mediaType;\n return subtype.split(/[.+]/).pop()!.toUpperCase();\n}\n\n/** A size in bytes as people read it, such as `820 KB` or `1.4 MB`, in the given language. */\nexport function nhAssistantFormatFileSize(bytes: number, language?: string | null): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = Math.max(0, bytes);\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit++;\n }\n\n let format: Intl.NumberFormat;\n try {\n format = new Intl.NumberFormat(language || undefined, { maximumFractionDigits: unit === 0 || value >= 10 ? 0 : 1 });\n } catch {\n format = new Intl.NumberFormat(undefined, { maximumFractionDigits: unit === 0 || value >= 10 ? 0 : 1 });\n }\n return `${format.format(value)} ${units[unit]}`;\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 'connection.required': {\n const data = event.data;\n // One card per server and answer, also when a live update repeats the event.\n const current = [...conversation.messages].reverse().find(message => message.role === 'assistant');\n if (current?.parts.some(part => part.type === 'connection-required' && part.serverId === data.serverId)) {\n return conversation;\n }\n return appendToCurrentAssistantMessage(conversation, {\n type: 'connection-required',\n serverId: data.serverId,\n displayName: data.displayName,\n reason: data.reason\n });\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 if (part.type === 'connection-required') {\n return `connection-${part.serverId}`;\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 AgentUploads,\n ApprovalDecision,\n ApprovalPart,\n ApprovalStatus,\n AssistantStatus,\n ClientContext,\n Conversation,\n ConversationMember,\n ConversationStatus,\n ConversationSummary,\n DirectoryEntry,\n FileReference,\n MessagePart\n} from '../models/assistant-api.models';\nimport { nhAssistantFileProblem, nhAssistantMediaTypeOf } from '../internal/nh-assistant-files';\nimport {\n LiveAgentWorkChanged,\n LiveConversationChanged,\n LiveConversationEvent,\n LiveConversationRead,\n LiveConversationRemoved\n} from '../models/assistant-live.models';\nimport { NhAssistantClientErrorCodes, NhAssistantMessageEvent, 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 /** The field errors of an `assistant-validation` failure, by camelCase field name. */\n fieldErrors?: Readonly<Record<string, readonly 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 /** The files the message carries, uploaded before it was queued. */\n files?: readonly FileReference[];\n}\n\n/**\n * A file the person attaches to the next message of the open conversation: while it uploads, once\n * the application stored it, or why it cannot be attached. Attachments live only in this tab's\n * memory.\n */\nexport interface NhAssistantAttachment {\n /** The attachment's id in this tab. */\n id: string;\n name: string;\n /** The media type the upload declares, lowercase. */\n mediaType: string;\n /** The size in bytes. */\n size: number;\n state: 'uploading' | 'uploaded' | 'failed';\n /** The share of the file sent so far, from 0 to 1. */\n progress: number;\n /** The stored file, once uploaded; the message carries its reference. */\n file: FileReference | null;\n /** Why the file is not attached, for a failed attachment. */\n error: NhAssistantError | null;\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 * Notice code for a message that waits for the next run of the agent working in its thread: the\n * server answered `202` with the trigger receipt, and the run adds the message, with its files.\n */\nexport const NH_ASSISTANT_MESSAGE_QUEUED_NOTICE_CODE = 'assistant-message-queued';\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\n/**\n * True when the server accepts a new message in a conversation with this status. A failed turn\n * leaves the conversation open: the person can ask again in the same conversation or agent thread.\n */\nfunction acceptsMessage(status: ConversationStatus | undefined): boolean {\n return status === 'idle' || status === 'failed';\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 /** The attachments of the next message per conversation; `''` for a new conversation. */\n private readonly attachmentsState = signal<ReadonlyMap<string, readonly NhAssistantAttachment[]>>(new Map());\n private destroyed = false;\n private readonly uploadSubscriptions = new Map<string, Subscription>();\n /** The conversation an attachment of a new conversation creates, once for every file chosen meanwhile. */\n private attachmentConversation: Promise<Conversation | null> | null = null;\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 /**\n * True while the user can send: enabled, an agent is chosen and no turn runs or waits. A\n * conversation whose last turn failed accepts a new message; an archived one does not.\n */\n readonly canSend = computed(() => {\n const conversation = this.activeConversation();\n const blocked = conversation !== null && !acceptsMessage(conversation.status);\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', 'failed', '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 /**\n * What the person may attach to the next message: the uploads of the open conversation's agent, or\n * of the selected agent for a new conversation. `null` when nothing can be attached: the server\n * offers no uploads for the agent, the conversation is archived, or the person only reads the\n * agent's thread.\n */\n readonly uploads = computed<AgentUploads | null>(() => {\n const conversation = this.activeConversation();\n const thread = conversation?.thread;\n if (!this.enabled() || conversation?.status === 'archived'\n || (thread && thread.role !== 'participant' && thread.role !== 'approver')) {\n return null;\n }\n\n const agentId = conversation?.agentId ?? this.selectedAgentIdState();\n const uploads = this.agents().find(agent => agent.id === agentId)?.uploads ?? null;\n return uploads && uploads.acceptedMediaTypes.length > 0 && uploads.maxFiles > 0 ? uploads : null;\n });\n /** The attachments of the next message of the open conversation, in the order they were chosen. */\n readonly attachments = computed<readonly NhAssistantAttachment[]>(() =>\n this.attachmentsState().get(this.activeIdState() ?? newConversationKey) ?? []);\n /** The stored files of the open conversation's next message, for `submit`. */\n readonly attachedFiles = computed<FileReference[]>(() => this.attachments()\n .filter(attachment => attachment.state === 'uploaded' && attachment.file !== null)\n .map(attachment => attachment.file!));\n /** True while a file of the next message still uploads; the message waits for it. */\n readonly uploading = computed(() => this.attachments().some(attachment => attachment.state === 'uploading'));\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 for (const upload of this.uploadSubscriptions.values()) {\n upload.unsubscribe();\n }\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 && acceptsMessage(session?.conversation.status) && !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. `files` are uploaded\n * attachments, such as `attachedFiles()`; once the message is accepted, the attachments of the\n * conversation leave the composer.\n */\n async send(text: string, files: readonly FileReference[] = []): 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, undefined, files);\n }\n\n /**\n * Sends immediately when the conversation accepts a message, otherwise appends to the\n * conversation's FIFO queue. A shown error alone does not hold a message back while nothing is\n * queued: the person asks again, for example after a failed turn. Queued messages still wait\n * for an explicit `resumeQueue` after Stop or a failure. A queued message keeps its `files`.\n */\n async submit(text: string, files: readonly FileReference[] = []): Promise<boolean> {\n const stopped = this.pausedQueuesState().has(this.activeIdState() ?? newConversationKey);\n if (this.canSend() && this.queuedMessages().length === 0 && !stopped && !this.submittingState()) {\n const revision = this.accountRevision;\n this.submittingState.set(true);\n try {\n return await this.send(text, files);\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 = {\n id: createClientMessageId(),\n conversationId,\n text: trimmed,\n state: 'preparing',\n ...(files.length > 0 ? { files: [...files] } : {})\n };\n this.queuedState.update(items => [...items, item]);\n this.releaseAttachments(conversationId, files);\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, item.files ?? []);\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 | undefined, files: readonly FileReference[]): 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 && acceptsMessage(conversation?.status) && !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 const parts: MessagePart[] = [\n { type: 'text', text: trimmed },\n ...files.map(file => ({ type: 'file' as const, name: file.name, mediaType: file.mediaType, size: file.size }))\n ];\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,\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 let waitsForRun = false;\n\n this.runStream(conversationId, this.api.sendMessage(conversationId, {\n text: trimmed,\n clientMessageId,\n ...(clientContext === undefined ? {} : { clientContext }),\n ...(files.length > 0 ? { files: [...files] } : {})\n }), {\n next: event => {\n if (event.type === 'message.queued') {\n // An agent's run works in the thread: the message, with its files, waits for the next run,\n // which adds it to the thread. Until then the notice says so.\n waitsForRun = true;\n this.removeMessage(conversationId, clientMessageId, previousStatus);\n this.releaseAttachments(conversationId, files);\n this.patchSession(conversationId, session => ({ ...session, notice: messageQueuedNotice(files.length) }));\n resolve(true);\n return;\n }\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 // The message carries the files now; they leave the composer.\n this.releaseAttachments(conversationId, files);\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 || waitsForRun);\n // A waiting message started no turn here: the thread's own state comes from the server.\n this.afterTurn(conversationId, failedAfterStart || waitsForRun);\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 /**\n * Attaches files to the next message of the open conversation and uploads them at once. Each\n * file is checked first against `uploads()`: the most files of one message, the accepted media\n * types and the largest size; a file that fails stays as a failed attachment with its code and\n * is never uploaded. A new conversation is created first, because an upload belongs to one.\n */\n async attach(files: readonly File[]): Promise<void> {\n const uploads = this.uploads();\n if (!uploads || files.length === 0) {\n return;\n }\n\n const revision = this.accountRevision;\n const key = this.activeIdState() ?? newConversationKey;\n let attached = this.attachmentsOf(key).filter(attachment => attachment.state !== 'failed').length;\n const added: NhAssistantAttachment[] = [];\n const pending: { attachment: NhAssistantAttachment; content: Blob }[] = [];\n for (const file of files) {\n const mediaType = nhAssistantMediaTypeOf(file);\n const problem = nhAssistantFileProblem(file, mediaType, uploads, attached);\n const attachment: NhAssistantAttachment = {\n id: createClientMessageId(),\n name: file.name,\n mediaType,\n size: file.size,\n state: problem ? 'failed' : 'uploading',\n progress: 0,\n file: null,\n error: problem ? clientError(problem) : null\n };\n added.push(attachment);\n if (!problem) {\n attached++;\n // The upload declares the media type the check accepted, also when the browser gave none.\n pending.push({ attachment, content: file.slice(0, file.size, mediaType) });\n }\n }\n this.patchAttachments(key, attachments => [...attachments, ...added]);\n if (pending.length === 0) {\n return;\n }\n\n let conversationId = this.activeIdState();\n if (conversationId === null) {\n this.attachmentConversation ??= this.createConversation().finally(() => {\n this.attachmentConversation = null;\n });\n const conversation = await this.attachmentConversation;\n if (revision !== this.accountRevision || this.destroyed) {\n return;\n }\n if (!conversation) {\n const error = this.draftErrorState() ?? clientError(NhAssistantClientErrorCodes.server);\n this.patchAttachments(key, attachments => attachments.map(attachment => pending.some(item => item.attachment.id === attachment.id)\n ? { ...attachment, state: 'failed', error }\n : attachment));\n return;\n }\n conversationId = conversation.id;\n this.moveAttachments(key, conversationId);\n }\n\n for (const { attachment, content } of pending) {\n this.startUpload(conversationId, attachment, content);\n }\n }\n\n /** Removes an attachment of the next message; an upload in progress stops. */\n removeAttachment(attachmentId: string): void {\n this.uploadSubscriptions.get(attachmentId)?.unsubscribe();\n this.uploadSubscriptions.delete(attachmentId);\n this.attachmentsState.update(all => {\n const next = new Map<string, readonly NhAssistantAttachment[]>();\n for (const [key, attachments] of all) {\n const kept = attachments.filter(attachment => attachment.id !== attachmentId);\n if (kept.length > 0) {\n next.set(key, kept);\n }\n }\n return next;\n });\n }\n\n private startUpload(conversationId: string, attachment: NhAssistantAttachment, content: Blob): void {\n const revision = this.accountRevision;\n const update = (change: Partial<NhAssistantAttachment>) => {\n if (revision === this.accountRevision) {\n this.patchAttachments(conversationId, attachments => attachments.map(item => item.id === attachment.id ? { ...item, ...change } : item));\n }\n };\n const subscription = this.api.uploadFile(conversationId, content, attachment.name).subscribe({\n next: event => {\n if (event.type === 'progress') {\n update({ progress: event.total > 0 ? Math.min(1, event.loaded / event.total) : 0 });\n return;\n }\n update({ state: 'uploaded', progress: 1, file: event.file });\n },\n error: error => {\n this.uploadSubscriptions.delete(attachment.id);\n update({ state: 'failed', error: error instanceof NhAssistantApiError\n ? { code: error.code, messageKey: error.messageKey }\n : clientError(NhAssistantClientErrorCodes.server) });\n },\n complete: () => this.uploadSubscriptions.delete(attachment.id)\n });\n if (!subscription.closed) {\n this.uploadSubscriptions.set(attachment.id, subscription);\n }\n }\n\n private attachmentsOf(key: string): readonly NhAssistantAttachment[] {\n return this.attachmentsState().get(key) ?? [];\n }\n\n private patchAttachments(\n key: string,\n update: (attachments: readonly NhAssistantAttachment[]) => readonly NhAssistantAttachment[]\n ): void {\n this.attachmentsState.update(all => {\n const next = new Map(all);\n const attachments = update(all.get(key) ?? []);\n if (attachments.length > 0) {\n next.set(key, attachments);\n } else {\n next.delete(key);\n }\n return next;\n });\n }\n\n /** Moves the attachments of a new conversation to the conversation that was created for them. */\n private moveAttachments(from: string, to: string): void {\n const moving = this.attachmentsOf(from);\n this.patchAttachments(from, () => []);\n this.patchAttachments(to, attachments => [...attachments, ...moving]);\n }\n\n /**\n * The attachments a message took leave the composer, and with them the failed ones; files that\n * still upload stay for the next message.\n */\n private releaseAttachments(conversationId: string, files: readonly FileReference[]): void {\n const sent = new Set(files.map(file => file.id));\n this.patchAttachments(conversationId, attachments => attachments.filter(attachment =>\n attachment.state === 'uploading' || (attachment.state === 'uploaded' && !sent.has(attachment.file?.id ?? ''))));\n }\n\n /** Stops the uploads of a conversation, or of every conversation, and forgets their attachments. */\n private dropAttachments(conversationId?: string): void {\n for (const [key, attachments] of this.attachmentsState()) {\n if (conversationId !== undefined && key !== conversationId) {\n continue;\n }\n for (const attachment of attachments) {\n this.uploadSubscriptions.get(attachment.id)?.unsubscribe();\n this.uploadSubscriptions.delete(attachment.id);\n }\n }\n if (conversationId === undefined) {\n this.attachmentsState.set(new Map());\n } else {\n this.patchAttachments(conversationId, () => []);\n }\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 const offered = this.agents().some(agent => agent.id === session.conversation.agentId);\n this.setActive(conversationId, offered ? session.conversation.agentId : undefined);\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 // An agent's thread about a subject opens for whoever the server lets read it, also for an\n // agent kept out of the chat, such as one run by hand; it is never chosen for a new chat.\n const offered = this.agents().some(agent => agent.id === conversation.agentId);\n if (!offered && conversation.kind !== 'thread') {\n this.uiState.update({ conversationId: null });\n return;\n }\n this.upsertSession(conversation);\n this.setActive(conversationId, offered ? conversation.agentId : undefined);\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.dropAttachments();\n this.attachmentConversation = null;\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<TEvent extends NhAssistantMessageEvent>(\n conversationId: string,\n stream: Observable<TEvent>,\n handlers: { next: (event: TEvent) => 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.dropAttachments(conversationId);\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/**\n * The notice of a message that waits for the next run of the agent working in the thread, with its\n * files when it carries any; the run adds the message to the thread when it takes it.\n */\nfunction messageQueuedNotice(fileCount: number): NhAssistantNotice {\n return {\n code: NH_ASSISTANT_MESSAGE_QUEUED_NOTICE_CODE,\n messageKey: fileCount > 0 ? 'nh-assistant.notices.message-queued-with-files' : 'nh-assistant.notices.message-queued'\n };\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 * Watches the work of agents for the whole application while the calling component lives, so their\n * proposals and runs arrive as live agent-work updates although the whole application lists no\n * members (see `NhAssistantLiveService.watchAgentWork`). Call it in an injection context, for example\n * a component constructor, of a screen that shows that work, such as the approval inbox or a board.\n */\nexport function nhAssistantWatchAgentWork(): void {\n const live = inject(NhAssistantLiveService, { optional: true });\n if (!live || typeof live.watchAgentWork !== 'function') {\n return;\n }\n\n const release = live.watchAgentWork();\n inject(DestroyRef).onDestroy(() => release());\n}\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 { NhAssistantMcpConnectService } from './services/nh-assistant-mcp-connect.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 NhAssistantMcpConnectService,\n // A redirect-mode MCP authorization returns to the page with its outcome in the fragment. Every\n // outcome, a failure to complete it included, arrives in `NhAssistantMcpConnectService.returned`,\n // where the connection screens show it.\n ...(config.mcpConnectMode === 'redirect'\n ? [provideEnvironmentInitializer(() => {\n inject(NhAssistantMcpConnectService).completeReturn().subscribe();\n })]\n : []),\n ...(config.translations === 'host'\n ? []\n : [provideEnvironmentInitializer(() => inject(NhAssistantTranslationMerger).start())])\n ]);\n}\n","import { NhAssistantClientErrorCodes } from '../models/assistant-sse.models';\n\n/**\n * Failure codes the assistant back-end sends in error bodies, SSE `error` events and tool\n * result codes (`NhAssistantErrorCodes`, `NhAssistantAdminErrorCodes` and the runtime codes\n * of `NewHeap.Platform.AI.Chat`). Every code needs a text under `nh-assistant.errors.<code>`\n * in each bundled language; the translation tests enforce that.\n */\nexport const NH_ASSISTANT_SERVER_ERROR_CODES: readonly string[] = [\n // Chat endpoints and turns\n 'assistant-disabled',\n 'assistant-conversation-not-found',\n 'assistant-conversation-busy',\n 'assistant-agent-not-found',\n 'assistant-agent-forbidden',\n 'assistant-message-invalid',\n 'assistant-message-too-long',\n 'assistant-message-duplicate',\n 'assistant-title-invalid',\n 'assistant-approval-not-found',\n 'assistant-approval-not-pending',\n 'assistant-approval-decision-invalid',\n 'assistant-proposal-hash-mismatch',\n 'assistant-approval-expired',\n 'assistant-approval-invalid',\n 'assistant-approval-rejected',\n 'assistant-budget-exhausted',\n 'assistant-tool-call-limit-reached',\n 'assistant-tools-disabled',\n 'assistant-turn-timeout',\n 'assistant-model-unavailable',\n 'assistant-classification-not-permitted',\n 'assistant-files-unavailable',\n 'assistant-files-not-accepted',\n 'assistant-file-reference-invalid',\n 'assistant-file-not-found',\n 'assistant-file-forbidden',\n 'assistant-file-unavailable',\n 'assistant-file-reader-failed',\n 'assistant-file-too-large',\n 'assistant-file-too-many-pages',\n 'assistant-file-count-limit',\n 'assistant-file-token-limit',\n 'assistant-file-type-not-supported',\n 'assistant-file-upload-invalid',\n 'assistant-file-type-not-accepted',\n 'assistant-file-upload-refused',\n 'assistant-file-upload-failed',\n 'assistant-file-scan-refused',\n 'assistant-turn-failed',\n 'assistant-context-unavailable',\n 'assistant-actor-mismatch',\n // Sharing and notifications\n 'assistant-owner-required',\n 'assistant-approval-forbidden',\n 'assistant-turn-forbidden',\n 'assistant-share-link-invalid',\n 'assistant-participant-not-found',\n 'assistant-participant-limit-reached',\n 'assistant-directory-unavailable',\n 'assistant-push-unavailable',\n 'assistant-push-subscription-invalid',\n // Agent runs\n 'assistant-subject-not-found',\n 'assistant-subject-invalid',\n 'assistant-subject-type-unknown',\n 'assistant-subject-search-unavailable',\n 'assistant-agent-does-not-work-on',\n 'assistant-subject-access-denied',\n 'assistant-no-accountable-owner',\n 'assistant-agent-disabled',\n 'assistant-agent-stopped',\n 'assistant-agent-paused',\n 'assistant-agent-configured-off',\n 'assistant-run-token-limit',\n 'assistant-skill-stopped',\n 'assistant-skill-paused',\n 'assistant-agent-off',\n 'assistant-skill-off',\n 'assistant-skill-not-found',\n 'assistant-skill-not-available',\n 'assistant-skill-switch-limit',\n 'assistant-moved-to-shadow',\n 'assistant-shadow-variant',\n 'assistant-service-account-not-used',\n 'assistant-service-account-not-found',\n 'assistant-skill-in-code',\n 'assistant-trigger-in-code',\n 'assistant-trigger-filter-not-found',\n 'assistant-skill-in-use',\n 'assistant-configuration-limit',\n 'assistant-run-settings-in-code',\n 'assistant-run-settings-in-use',\n 'assistant-skill-candidate-not-found',\n 'assistant-skill-version-gone',\n 'assistant-account-search-unavailable',\n 'assistant-handoff-unavailable',\n 'assistant-handoff-not-accepted',\n 'assistant-handoff-subject-unavailable',\n 'assistant-handoff-shadow-to-live',\n 'assistant-handoff-chain-limit',\n 'assistant-handoff-limit-reached',\n 'assistant-replay-not-shadow',\n 'assistant-replay-active',\n 'assistant-evaluation-not-variant',\n 'assistant-agent-not-configured',\n 'assistant-run-not-found',\n 'assistant-run-not-retryable',\n 'assistant-run-filter-invalid',\n 'assistant-run-operation-cancelled',\n 'assistant-run-operation-stalled',\n 'assistant-run-operation-ended',\n 'assistant-board-not-found',\n 'assistant-board-scope-invalid',\n 'assistant-approval-policy-denied',\n 'assistant-four-eyes-required',\n 'assistant-execution-not-uncertain',\n 'assistant-proposal-stale',\n 'assistant-proposal-check-failed',\n 'assistant-proposal-already-open',\n 'assistant-proposal-recently-rejected',\n 'assistant-proposal-superseded',\n 'assistant-proposal-refused',\n 'assistant-proposal-placed',\n 'assistant-proposal-not-placed',\n 'assistant-proposal-not-needed',\n 'assistant-trigger-not-found',\n 'assistant-trigger-rate-limited',\n 'assistant-trigger-rolled-back',\n 'assistant-webhook-signature-invalid',\n 'assistant-webhook-payload-invalid',\n 'assistant-webhook-payload-too-large',\n 'assistant-memory-not-configured',\n 'assistant-memory-invalid',\n 'assistant-memory-conflict',\n 'assistant-artifact-invalid',\n 'assistant-artifact-outside-turn',\n 'assistant-artifact-not-found',\n // Feedback on proposals\n 'assistant-feedback-invalid',\n 'assistant-feedback-not-accepted',\n // Consultations of other agents\n 'assistant-consult-subject-unavailable',\n 'assistant-consult-agent-unavailable',\n 'assistant-consult-depth-exceeded',\n 'assistant-consult-budget-exhausted',\n 'assistant-consult-limit-reached',\n 'assistant-consult-timeout',\n 'assistant-consult-failed',\n 'assistant-consult-read-only',\n // Preferences and administration\n 'assistant-validation',\n 'assistant-instructions-too-long',\n 'assistant-forbidden',\n 'assistant-not-found',\n 'assistant-context-not-found',\n 'assistant-version-conflict',\n 'assistant-agent-exists',\n 'assistant-code-agent-not-deletable',\n 'assistant-agent-not-code',\n 'assistant-mcp-server-not-found',\n 'assistant-mcp-server-exists',\n 'assistant-mcp-tool-not-found',\n 'assistant-mcp-unreachable',\n 'assistant-mcp-unauthorized',\n 'assistant-mcp-host-blocked',\n 'assistant-mcp-schema-changed',\n 'assistant-mcp-tool-disabled',\n 'assistant-mcp-insufficient-scope',\n 'assistant-mcp-headless-not-allowed',\n 'assistant-mcp-credential-mismatch',\n 'assistant-mcp-consent-required',\n 'assistant-mcp-initiator-only',\n 'assistant-mcp-delegated-token-unavailable',\n 'assistant-mcp-secret-reference-invalid',\n 'assistant-mcp-certificate-reference-invalid',\n 'assistant-mcp-secret-unreadable',\n 'assistant-mcp-secret-unavailable',\n // MCP OAuth connections\n 'assistant-mcp-connection-required',\n 'assistant-mcp-reauthorization-required',\n 'assistant-mcp-scope-not-allowed',\n 'assistant-mcp-authorization-failed',\n 'assistant-mcp-authorization-expired',\n 'assistant-mcp-authorization-invalid',\n 'assistant-mcp-discovery-failed',\n 'assistant-mcp-pkce-unsupported',\n 'assistant-mcp-client-registration-required',\n 'assistant-mcp-token-request-failed',\n 'assistant-mcp-issuer-changed',\n 'assistant-mcp-authorization-not-confirmed',\n 'assistant-mcp-oauth-not-configured',\n 'assistant-mcp-too-many-authorizations',\n 'assistant-mcp-connection-not-supported'\n];\n\n/** Every code the assistant UI can show: server codes and client-side transport codes. */\nexport const NH_ASSISTANT_ERROR_CODES: readonly string[] = [\n ...new Set([...NH_ASSISTANT_SERVER_ERROR_CODES, ...Object.values(NhAssistantClientErrorCodes)])\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 | 'attach'\n | 'file';\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 attach: 'M19 11.5l-7.6 7.6a4.6 4.6 0 0 1-6.5-6.5l8.3-8.3a3 3 0 0 1 4.3 4.3l-8.2 8.2a1.5 1.5 0 0 1-2.1-2.1l7.4-7.4',\n file: 'M6 3h8l4 4v14H6zM14 3v4h4'\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, TranslateService } from '@ngx-translate/core';\nimport { AgentUploads } from '../../models/assistant-api.models';\nimport {\n nhAssistantAcceptAttribute,\n nhAssistantFileTypeLabel,\n nhAssistantFormatFileSize\n} from '../../internal/nh-assistant-files';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport type { NhAssistantAttachment } from '../../services/nh-assistant.store';\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. With `uploads`, an\n * attach button chooses files for the next message; the host uploads them and passes them back as\n * `attachments`, which show their progress, or why they cannot be attached, at the control. Sending\n * waits while a file uploads.\n */\n@Component({\n selector: 'nh-assistant-composer',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent, NhAssistantTranslatePipe],\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 * What the person may attach, for example `NhAssistantStore.uploads()`; `null` hides the attach\n * button.\n */\n readonly uploads = input<AgentUploads | null>(null);\n /** The attachments of the next message, for example `NhAssistantStore.attachments()`. */\n readonly attachments = input<readonly NhAssistantAttachment[]>([]);\n\n readonly send = output<string>();\n readonly cancel = output<void>();\n readonly restored = output<void>();\n /** Files the person chose to attach, for example for `NhAssistantStore.attach`. */\n readonly attach = output<File[]>();\n /** The id of an attachment the person removed, for example for `NhAssistantStore.removeAttachment`. */\n readonly removeAttachment = output<string>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly translate = inject(TranslateService, { optional: true });\n private readonly textarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('textarea');\n private readonly attachButton = viewChild<ElementRef<HTMLButtonElement>>('attachButton');\n private ownedFocus = false;\n private previousBusy = false;\n\n readonly inputId = `nh-assistant-composer-${nextId++}`;\n readonly hintId = `${this.inputId}-hint`;\n readonly attachHintId = `${this.inputId}-attach-hint`;\n readonly attachmentsId = `${this.inputId}-attachments`;\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 /** True while a file of the next message still uploads. */\n readonly uploading = computed(() => this.attachments().some(attachment => attachment.state === 'uploading'));\n readonly canSend = computed(() =>\n !this.disabled() && !this.sendDisabled() && this.length() > 0 && !this.tooLong() && !this.uploading());\n /** The `accept` attribute of the file input. */\n readonly accept = computed(() => nhAssistantAcceptAttribute(this.uploads()?.acceptedMediaTypes ?? []));\n /** The values the attachment texts name: the accepted types, the largest size and the most files. */\n readonly uploadParams = computed(() => {\n const uploads = this.uploads();\n return {\n types: (uploads?.acceptedMediaTypes ?? []).map(nhAssistantFileTypeLabel).join(', '),\n max: uploads ? this.size(uploads.maxFileBytes) : '',\n count: uploads?.maxFiles ?? 0\n };\n });\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 /** Hands the chosen files to the host and empties the input, so the same file can be chosen again. */\n onFilesChosen(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n input.value = '';\n if (files.length > 0) {\n this.attach.emit(files);\n }\n }\n\n /** Removes an attachment and keeps the keyboard in the composer, on the attach button. */\n remove(attachment: NhAssistantAttachment): void {\n this.removeAttachment.emit(attachment.id);\n queueMicrotask(() => (this.attachButton()?.nativeElement ?? this.textarea().nativeElement).focus({ preventScroll: true }));\n }\n\n /** The translation keys of why an attachment failed, from the composer's own text to the generic one. */\n errorKeys(attachment: NhAssistantAttachment): string[] {\n const error = attachment.error;\n if (!error) {\n return [];\n }\n\n return [\n `nh-assistant.composer.attachment-errors.${error.code}`,\n error.messageKey,\n `nh-assistant.errors.${error.code}`,\n 'nh-assistant.errors.generic'\n ];\n }\n\n percent(attachment: NhAssistantAttachment): number {\n return Math.round(attachment.progress * 100);\n }\n\n /** A size in bytes in the current language, such as `1.4 MB`. */\n size(bytes: number): string {\n return nhAssistantFormatFileSize(bytes, this.translate?.getCurrentLang());\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 @if (attachments().length > 0) {\n <ul class=\"attachments\" [id]=\"attachmentsId\" [attr.aria-label]=\"'nh-assistant.composer.attachments' | translate\">\n @for (attachment of attachments(); track attachment.id) {\n <li class=\"attachment\" [attr.data-state]=\"attachment.state\">\n <nh-assistant-icon class=\"attachment-icon\" [name]=\"attachment.state === 'failed' ? 'warning' : 'file'\" />\n <div class=\"attachment-body\">\n <span class=\"attachment-name\" [attr.title]=\"attachment.name\">{{ attachment.name }}</span>\n @switch (attachment.state) {\n @case ('uploading') {\n <progress\n class=\"attachment-progress\"\n max=\"100\"\n [value]=\"percent(attachment)\"\n [attr.aria-label]=\"'nh-assistant.composer.uploading' | translate: { name: attachment.name }\"></progress>\n }\n @case ('failed') {\n <span class=\"attachment-error\" role=\"alert\">\n {{ errorKeys(attachment) | nhAssistantTranslate: (attachment.error?.code ?? '') : uploadParams() }}\n </span>\n }\n @default {\n <span class=\"attachment-meta\">{{ size(attachment.size) }}</span>\n }\n }\n </div>\n <button\n class=\"attachment-remove\"\n type=\"button\"\n [attr.aria-label]=\"'nh-assistant.composer.remove-attachment' | translate: { name: attachment.name }\"\n [attr.title]=\"'nh-assistant.composer.remove-attachment' | translate: { name: attachment.name }\"\n (click)=\"remove(attachment)\">\n <nh-assistant-icon name=\"close\" />\n </button>\n </li>\n }\n </ul>\n }\n\n <div class=\"prompt-bar\">\n @if (uploads()) {\n <button\n #attachButton\n class=\"attach\"\n type=\"button\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.composer.attach' | translate\"\n [attr.title]=\"'nh-assistant.composer.attach-hint' | translate: uploadParams()\"\n [attr.aria-describedby]=\"attachHintId\"\n (click)=\"fileInput.click()\">\n <nh-assistant-icon name=\"attach\" />\n </button>\n <span class=\"visually-hidden\" [id]=\"attachHintId\">{{ 'nh-assistant.composer.attach-hint' | translate: uploadParams() }}</span>\n <input\n #fileInput\n class=\"visually-hidden\"\n type=\"file\"\n multiple\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n (change)=\"onFilesChosen($event)\" />\n }\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 if (uploading()) {\n <span>{{ 'nh-assistant.composer.uploading-hint' | 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 { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport { McpConnection } from '../../models/assistant-admin.models';\nimport { nhAssistantErrorKeys, nhAssistantErrorOf, toNhAssistantError } from '../../internal/nh-assistant-errors';\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 { NhAssistantMcpConnectService } from '../../services/nh-assistant-mcp-connect.service';\nimport { NhAssistantError, NhAssistantStore } from '../../services/nh-assistant.store';\n\nlet nextId = 0;\n\n/**\n * The caller's own MCP accounts: servers each person connects to with OAuth, with Connect,\n * Connect again and Disconnect, and the consent to background use of servers that run with the\n * caller's own account. Each change applies at once. Renders nothing while no server asks for it,\n * so most applications never show it.\n */\n@Component({\n selector: 'nh-assistant-mcp-connections',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-mcp-connections.component.html',\n styleUrl: './nh-assistant-mcp-connections.component.scss'\n})\nexport class NhAssistantMcpConnectionsComponent {\n private readonly api = inject(NhAssistantApiService);\n private readonly connector = inject(NhAssistantMcpConnectService);\n private readonly store = inject(NhAssistantStore, { optional: true });\n private loadSubscription?: Subscription;\n private updateSubscription?: Subscription;\n\n readonly id = `nh-assistant-mcp-connections-${nextId++}`;\n readonly connections = signal<McpConnection[]>([]);\n readonly loadFailed = signal(false);\n /** The server whose consent or connection is being changed. */\n readonly busy = signal<string | null>(null);\n readonly confirmingDisconnect = signal<string | null>(null);\n /** The latest change to announce, per server. */\n readonly notice = signal<{ serverId: string; key: string } | null>(null);\n readonly error = signal<NhAssistantError | null>(null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n /** Whether any listed server is one the caller connects with OAuth. */\n readonly connectsAccounts = computed(() => this.connections().some(connection => connection.connectionStatus !== null));\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.loadSubscription?.unsubscribe();\n this.updateSubscription?.unsubscribe();\n });\n this.load();\n // A redirect-mode authorization that returned to this page.\n effect(() => {\n const returned = this.connector.returned();\n if (returned) {\n untracked(() => {\n this.connector.returned.set(null);\n if (returned.completion) {\n this.notice.set({ serverId: returned.completion.serverId, key: 'nh-assistant.preferences.mcp.connect-done' });\n this.load();\n } else {\n this.error.set(nhAssistantErrorOf(returned.code));\n }\n });\n }\n });\n }\n\n load(): void {\n this.loadFailed.set(false);\n this.loadSubscription?.unsubscribe();\n this.loadSubscription = this.api.getMcpConnections().subscribe({\n next: connections => this.connections.set(connections),\n error: () => this.loadFailed.set(true)\n });\n }\n\n /** The agents' names as the chat shows them; an agent the chat does not list shows its id. */\n agentKeys(connection: McpConnection): string[] {\n const agents = this.store?.agents() ?? [];\n return connection.agentIds.map(agentId => agents.find(agent => agent.id === agentId)?.displayNameKey ?? agentId);\n }\n\n toggle(connection: McpConnection, event: Event): void {\n const allow = (event.target as HTMLInputElement).checked;\n this.busy.set(connection.serverId);\n this.error.set(null);\n this.notice.set(null);\n this.updateSubscription?.unsubscribe();\n this.updateSubscription = this.api.updateMcpConnection(connection.serverId, { allowBackgroundUse: allow }).subscribe({\n next: updated => {\n this.connections.update(items => items.map(item => item.serverId === updated.serverId ? updated : item));\n this.busy.set(null);\n },\n error: (error: unknown) => {\n // Show the stored decision again.\n this.connections.update(items => [...items]);\n (event.target as HTMLInputElement).checked = connection.allowBackgroundUse;\n this.busy.set(null);\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n\n /** Connects the caller's own account; call from the click, so the popup is allowed. */\n connect(connection: McpConnection): void {\n this.busy.set(connection.serverId);\n this.error.set(null);\n this.notice.set(null);\n this.updateSubscription?.unsubscribe();\n this.updateSubscription = this.connector.connect(connection.serverId).subscribe({\n next: () => {\n this.busy.set(null);\n this.notice.set({ serverId: connection.serverId, key: 'nh-assistant.preferences.mcp.connect-done' });\n this.load();\n },\n error: (error: unknown) => {\n this.busy.set(null);\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n\n disconnect(connection: McpConnection): void {\n this.confirmingDisconnect.set(null);\n this.busy.set(connection.serverId);\n this.error.set(null);\n this.notice.set(null);\n this.updateSubscription?.unsubscribe();\n this.updateSubscription = this.api.disconnectMcpConnection(connection.serverId).subscribe({\n complete: () => {\n this.busy.set(null);\n this.notice.set({ serverId: connection.serverId, key: 'nh-assistant.preferences.mcp.disconnect-done' });\n this.load();\n },\n error: (error: unknown) => {\n this.busy.set(null);\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n}\n","@if (connections().length > 0) {\n <fieldset class=\"connections\" [attr.aria-busy]=\"busy() !== null\">\n <legend>{{ (connectsAccounts() ? 'nh-assistant.preferences.mcp.accounts-title' : 'nh-assistant.preferences.mcp.title') | translate }}</legend>\n <p class=\"hint\">{{ (connectsAccounts() ? 'nh-assistant.preferences.mcp.accounts-description' : 'nh-assistant.preferences.mcp.description') | translate }}</p>\n <ul class=\"list\">\n @for (connection of connections(); track connection.serverId) {\n <li class=\"item\" [attr.data-status]=\"connection.connectionStatus\">\n @if (connection.connectionStatus !== null) {\n <div class=\"account\">\n <strong class=\"name\">{{ connection.displayName }}</strong>\n <span\n class=\"badge\"\n [class.success]=\"connection.connectionStatus === 'active'\"\n [class.warning]=\"connection.connectionStatus === 'reauthorization-required' || connection.connectionStatus === 'issuer-changed'\">\n {{ 'nh-assistant.preferences.mcp.status.' + connection.connectionStatus | translate }}\n </span>\n </div>\n @if (connection.connectionStatus === 'active' && connection.connectedAt) {\n <p class=\"hint details\">{{ 'nh-assistant.preferences.mcp.connected-since' | translate: { date: (connection.connectedAt | date: 'medium') } }}</p>\n }\n @if (connection.requiredScopes; as scopes) {\n <p class=\"hint details\">{{ 'nh-assistant.preferences.mcp.more-permissions' | translate: { scopes: scopes } }}</p>\n }\n @if (connection.connectionStatus === 'issuer-changed') {\n <p class=\"hint details\">{{ 'nh-assistant.preferences.mcp.issuer-changed' | translate }}</p>\n }\n <div class=\"actions\">\n @if (connection.connectionStatus !== 'issuer-changed') {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy() !== null\" (click)=\"connect(connection)\">\n {{ (connection.connectionStatus === 'not-connected' ? 'nh-assistant.preferences.mcp.connect' : 'nh-assistant.preferences.mcp.connect-again') | translate }}\n </button>\n }\n @if (connection.connectionStatus !== 'not-connected') {\n @if (confirmingDisconnect() === connection.serverId) {\n <button class=\"secondary danger\" type=\"button\" [disabled]=\"busy() !== null\" (click)=\"disconnect(connection)\">\n {{ 'nh-assistant.preferences.mcp.confirm-disconnect' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirmingDisconnect.set(null)\">{{ 'nh-assistant.preferences.mcp.cancel' | translate }}</button>\n } @else {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy() !== null\" (click)=\"confirmingDisconnect.set(connection.serverId)\">\n {{ 'nh-assistant.preferences.mcp.disconnect' | translate }}\n </button>\n }\n }\n </div>\n }\n @if (connection.offersBackgroundUse) {\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [checked]=\"connection.allowBackgroundUse\"\n [disabled]=\"busy() !== null\"\n [attr.aria-describedby]=\"id + '-' + connection.serverId\"\n (change)=\"toggle(connection, $event)\" />\n <span>{{ 'nh-assistant.preferences.mcp.allow' | translate: { name: connection.displayName } }}</span>\n </label>\n }\n <p class=\"hint details\" [id]=\"id + '-' + connection.serverId\">\n <span class=\"host\">{{ connection.host }}</span>\n @if (connection.offersBackgroundUse) {\n <span>\n @if (connection.allowBackgroundUse && connection.consentedAt) {\n {{ 'nh-assistant.preferences.mcp.allowed-since' | translate: { date: (connection.consentedAt | date: 'medium') } }}\n } @else {\n {{ 'nh-assistant.preferences.mcp.not-allowed' | translate }}\n }\n </span>\n }\n <span>\n {{ 'nh-assistant.preferences.mcp.used-by' | translate }}\n @for (key of agentKeys(connection); track $index) {\n <span class=\"agent\">{{ [key] | nhAssistantTranslate: key }}</span>\n }\n </span>\n </p>\n @if (notice()?.serverId === connection.serverId) {\n <p class=\"message success\" role=\"status\"><nh-assistant-icon name=\"check\" />{{ notice()!.key | translate: { name: connection.displayName } }}</p>\n }\n </li>\n }\n </ul>\n @if (error(); as failure) {\n <p class=\"message error\" role=\"alert\">\n <nh-assistant-icon name=\"warning\" />\n {{ errorKeys() | nhAssistantTranslate: failure.code }}\n </p>\n }\n </fieldset>\n} @else if (loadFailed()) {\n <div class=\"load-failed\" role=\"alert\">\n <span>{{ 'nh-assistant.preferences.mcp.load-failed' | translate }}</span>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.preferences.retry' | translate }}</button>\n </div>\n}\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 { nhAssistantErrorKeys, toNhAssistantError } from '../../internal/nh-assistant-errors';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantMcpConnectionsComponent } from './nh-assistant-mcp-connections.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';\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, background use of MCP servers\n * with the user's own account, style, form of address, answer length and optional instructions.\n * Notifications and background use 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, NhAssistantMcpConnectionsComponent],\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(() => nhAssistantErrorKeys(this.error()));\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(toNhAssistantError(error));\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(toNhAssistantError(error));\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 <nh-assistant-mcp-connections />\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, ConnectionRequiredPart, FilePart, MessagePart, TextPart, ToolCallPart } from '../models/assistant-api.models';\n\n/**\n * A message part as the thread renders it: consecutive tool calls form one group, and so do\n * consecutive attached files.\n */\nexport type NhAssistantPartGroup =\n | { kind: 'text'; key: string; part: TextPart }\n | { kind: 'approval'; key: string; part: ApprovalPart }\n | { kind: 'connection'; key: string; part: ConnectionRequiredPart }\n | { kind: 'tools'; key: string; calls: ToolCallPart[] }\n | { kind: 'files'; key: string; files: FilePart[] };\n\n/**\n * Groups consecutive tool calls of a message, and consecutive files. Text and approvals break a\n * group, so an approval always stays visible. A tool group's key is its first invocation id, so it\n * keeps 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 let files: { kind: 'files'; key: string; files: FilePart[] } | null = null;\n\n parts.forEach((part, index) => {\n if (part.type === 'tool-call') {\n files = null;\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 === 'file') {\n if (!files) {\n files = { kind: 'files', key: `files:${index}`, files: [] };\n groups.push(files);\n }\n files.files.push(part);\n return;\n }\n\n files = null;\n if (part.type === 'approval') {\n groups.push({ kind: 'approval', key: `approval:${part.approvalId}`, part });\n } else if (part.type === 'connection-required') {\n groups.push({ kind: 'connection', key: `connection:${part.serverId}:${index}`, 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 { 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. A proposal that closed because it no\n * longer fits shows why, such as \"Already done\", with the application's explanation.\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 /**\n * Translation key of the status: the kind of a stale proposal, \"replaced\" for a superseded one,\n * otherwise the status itself.\n */\n readonly statusKey = computed(() => {\n const kind = this.approval().staleKind;\n if (this.effectiveStatus() === 'stale' && kind) {\n return `nh-assistant.approval.stale-kind.${kind}`;\n }\n\n return this.effectiveStatus() === 'withdrawn' && this.approval().supersededByApprovalId\n ? 'nh-assistant.approval.superseded'\n : `nh-assistant.approval.status.${this.effectiveStatus()}`;\n });\n /** Why the agent's rules proposed it; model proposals have none. */\n readonly rationale = computed(() => this.approval().rationale ?? null);\n /** The application's explanation of a stale proposal, such as who already did the work. */\n readonly staleExplanation = computed(() =>\n this.effectiveStatus() === 'stale' ? this.approval().staleExplanation ?? null : null);\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\">{{ statusKey() | translate }}</span>\n </header>\n\n @if (staleExplanation(); as explanation) {\n <p class=\"stale-explanation\">{{ explanation }}</p>\n }\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 @if (rationale(); as why) {\n <p class=\"rationale\">{{ 'nh-assistant.approval.rationale' | translate: { rationale: why } }}</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, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport { ConnectionRequiredPart } from '../../models/assistant-api.models';\nimport { nhAssistantErrorKeys, nhAssistantErrorOf, toNhAssistantError } from '../../internal/nh-assistant-errors';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from '../../internal/nh-assistant-translate.pipe';\nimport { NhAssistantMcpConnectService, NhAssistantMcpReturnOutcome } from '../../services/nh-assistant-mcp-connect.service';\nimport { NhAssistantError } from '../../services/nh-assistant.store';\n\nlet nextId = 0;\n\n/**\n * The card of a turn that went on without an MCP server the person who asked has to connect. It\n * connects the viewer's own account, in a popup or by redirect as the host configured, and then\n * offers to ask again. After a redirect the page returns to, the card of that server shows how the\n * connection ended: connected, or the failure with its translated code.\n */\n@Component({\n selector: 'nh-assistant-connection-required',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-connection-required.component.html',\n styleUrl: './nh-assistant-connection-required.component.scss',\n host: { '[attr.data-state]': 'state()' }\n})\nexport class NhAssistantConnectionRequiredComponent {\n private readonly connections = inject(NhAssistantMcpConnectService);\n private subscription?: Subscription;\n\n readonly part = input.required<ConnectionRequiredPart>();\n /** Whether \"Ask again\" is offered once the account is connected. */\n readonly canRetry = input(true);\n /** Asks the question of the turn again after the account was connected. */\n readonly retry = output<void>();\n\n readonly id = `nh-assistant-connection-${nextId++}`;\n readonly state = signal<'idle' | 'connecting' | 'connected' | 'failed'>('idle');\n /** Why connecting failed, as a code and translation key. */\n readonly error = signal<NhAssistantError | null>(null);\n /** The code of `error`. */\n readonly errorCode = computed(() => this.error()?.code ?? null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n /** The connect button names connecting again when the person had connected before. */\n readonly again = computed(() => this.part().reason !== 'not-connected');\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n // The page returned from connecting this card's server in redirect mode.\n effect(() => {\n const returned = this.connections.returned();\n const serverId = this.part().serverId;\n if (returned && serverOf(returned) === serverId) {\n untracked(() => this.showReturned(returned));\n }\n });\n }\n\n connect(): void {\n if (this.state() === 'connecting') {\n return;\n }\n this.state.set('connecting');\n this.error.set(null);\n this.subscription?.unsubscribe();\n this.subscription = this.connections.connect(this.part().serverId).subscribe({\n next: () => this.state.set('connected'),\n error: (error: unknown) => {\n this.state.set('failed');\n this.error.set(toNhAssistantError(error));\n }\n });\n }\n\n private showReturned(returned: NhAssistantMcpReturnOutcome): void {\n if (this.state() === 'connecting') {\n return;\n }\n if (returned.completion) {\n this.state.set('connected');\n this.error.set(null);\n return;\n }\n\n this.state.set('failed');\n this.error.set(nhAssistantErrorOf(returned.code));\n }\n}\n\n/** The server a returned outcome belongs to: the connected one, or the one the page left for. */\nfunction serverOf(returned: NhAssistantMcpReturnOutcome): string | null {\n return returned.completion?.serverId ?? returned.serverId ?? null;\n}\n","<section class=\"card\" role=\"group\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"state() === 'connecting'\">\n <div class=\"header\">\n <nh-assistant-icon [name]=\"state() === 'connected' ? 'check' : 'link'\" />\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.connection.title' | translate: { name: part().displayName } }}</h3>\n </div>\n <p class=\"text\">{{ 'nh-assistant.connection.' + part().reason | translate: { name: part().displayName } }}</p>\n\n <div class=\"actions\" aria-live=\"polite\">\n @switch (state()) {\n @case ('connected') {\n <p class=\"done\" role=\"status\"><nh-assistant-icon name=\"check\" />{{ 'nh-assistant.connection.connected' | translate: { name: part().displayName } }}</p>\n @if (canRetry()) {\n <button class=\"primary\" type=\"button\" (click)=\"retry.emit()\">{{ 'nh-assistant.connection.retry' | translate }}</button>\n }\n }\n @case ('connecting') {\n <button class=\"primary\" type=\"button\" disabled>{{ 'nh-assistant.connection.connecting' | translate }}</button>\n }\n @default {\n <button class=\"primary\" type=\"button\" (click)=\"connect()\">\n {{ (again() ? 'nh-assistant.connection.connect-again' : 'nh-assistant.connection.connect') | translate }}\n </button>\n }\n }\n </div>\n\n @if (error(); as failure) {\n <p class=\"error\" role=\"alert\" data-connection-error><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: failure.code }}</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 // 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, TranslateService } from '@ngx-translate/core';\nimport { ApprovalDecision, ApprovalPart, ConversationMember, FilePart, Message } from '../../models/assistant-api.models';\nimport { nhAssistantFileTypeLabel, nhAssistantFormatFileSize } from '../../internal/nh-assistant-files';\nimport { NhAssistantIconComponent } from '../../internal/nh-assistant-icon.component';\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 { NhAssistantConnectionRequiredComponent } from '../connection-required/nh-assistant-connection-required.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. The files a person attached show by name, type and size. Messages a\n * trigger wrote into an agent thread read as events, not as a person. While a turn runs\n * without visible progress, a working indicator shows the elapsed time. The thread follows\n * 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 NhAssistantIconComponent,\n NhAssistantMarkdownPipe,\n NhAssistantPartGroupsPipe,\n NhAssistantToolCallGroupComponent,\n NhAssistantApprovalCardComponent,\n NhAssistantConnectionRequiredComponent\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 private readonly translate = inject(TranslateService, { optional: true });\n\n /** The type and size of an attached file, in the current language. */\n fileMeta(file: FilePart): { type: string; size: string } {\n return {\n type: nhAssistantFileTypeLabel(file.mediaType),\n size: nhAssistantFormatFileSize(file.size, this.translate?.getCurrentLang())\n };\n }\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 * The question to ask again after the viewer connected an MCP server from a connection card: the\n * text of the user message the card answered. The panel sends it.\n */\n readonly retryMessage = output<string>();\n\n private readonly names = computed(() => new Map(this.members().map(member => [member.actorId, member.displayName])));\n\n /** Asks the question again that the assistant message with a connection card answered. */\n retryAfterConnect(message: Message): void {\n const messages = this.messages();\n const index = messages.findIndex(item => item.id === message.id);\n for (let position = index - 1; position >= 0; position--) {\n const candidate = messages[position];\n if (candidate.role !== 'user') {\n continue;\n }\n const text = candidate.parts.map(part => part.type === 'text' ? part.text : '').join('').trim();\n if (text.length > 0) {\n this.retryMessage.emit(text);\n }\n return;\n }\n }\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 an assistant message the agent's rules wrote without a model. */\n isRule(message: Message): boolean {\n return message.role === 'assistant' && message.authorKind === 'rule';\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' : isRule(message) ? 'rule' : null\">\n @if (isTrigger(message)) {\n <p class=\"author\">{{ 'nh-assistant.thread.trigger' | translate }}</p>\n } @else if (isRule(message)) {\n <p class=\"author\">{{ 'nh-assistant.thread.rule' | 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 ('files') {\n <ul class=\"files\" [attr.aria-label]=\"'nh-assistant.thread.files' | translate\">\n @for (file of group.files; track $index) {\n <li class=\"file\">\n <nh-assistant-icon class=\"file-icon\" name=\"file\" />\n <span class=\"file-name\" [attr.title]=\"file.name\">{{ file.name }}</span>\n <span class=\"file-meta\">{{ 'nh-assistant.thread.file-meta' | translate: fileMeta(file) }}</span>\n </li>\n }\n </ul>\n }\n @case ('connection') {\n <nh-assistant-connection-required\n class=\"part\"\n [part]=\"group.part\"\n [canRetry]=\"!streaming()\"\n (retry)=\"retryAfterConnect(message)\" />\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, FileReference } 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 { nhAssistantErrorKeys, toNhAssistantError } from '../../internal/nh-assistant-errors';\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 /** An archived conversation takes no new messages. A failed one does: the person asks again. */\n readonly closed = computed(() => this.conversation()?.status === 'archived');\n readonly busy = computed(() => this.store.streaming() || this.conversation()?.status === 'running');\n /**\n * The last turn failed and no error bar explains it, for example after the conversation was\n * reopened. The panel then says so, while the composer stays available.\n */\n readonly lastTurnFailed = computed(() => this.conversation()?.status === 'failed'\n && !this.busy() && this.store.error() === null);\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(() => nhAssistantErrorKeys(this.notificationError() ?? this.store.error()));\n readonly noticeKeys = computed(() => nhAssistantErrorKeys(this.store.notice()));\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(toNhAssistantError(error));\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, this.store.attachedFiles());\n }\n\n /** Uploads the files the person attached to the next message. */\n attach(files: File[]): void {\n void this.store.attach(files);\n }\n\n /** The names of the files a queued message carries, as the queue lists them. */\n fileNames(files: readonly FileReference[]): string {\n return files.map(file => file.name).join(', ');\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 (retryMessage)=\"store.send($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 } @else if (lastTurnFailed()) {\n <p class=\"notice\">{{ 'nh-assistant.panel.last-turn-failed' | 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.files?.length) {\n <span class=\"queue-state queue-files\" data-queue-files>{{ 'nh-assistant.queue.files' | translate: { count: item.files!.length, names: fileNames(item.files!) } }}</span>\n }\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 [uploads]=\"store.uploads()\"\n [attachments]=\"store.attachments()\"\n (restored)=\"store.consumeRestoredDraft()\"\n (send)=\"send($event)\"\n (attach)=\"attach($event)\"\n (removeAttachment)=\"store.removeAttachment($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","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { NhAssistantError } from '../services/nh-assistant.store';\nimport { nhAssistantErrorKeys, toNhAssistantError } from './nh-assistant-errors';\nimport { NhAssistantIconComponent } from './nh-assistant-icon.component';\nimport { NhAssistantTranslatePipe } from './nh-assistant-translate.pipe';\n\n/** One choice of a picker: the stored value, its name and what it means. */\nexport interface NhAssistantPickerOption {\n value: string;\n label: string;\n description?: string | null;\n}\n\nlet nextId = 0;\nconst searchDelayMs = 250;\n\n/**\n * A searchable choice for the administration (internal): a combobox with a listbox popup in the ARIA\n * 1.2 pattern. Typing filters the options on name and description, the arrow keys move, Enter\n * chooses and Escape closes. With `search` it asks the server instead, after `minQueryLength`\n * characters; a failed search says why below the field, with its translated code, and offers to\n * search again instead of claiming that nothing was found. `noneLabel` adds an explicit empty\n * choice, emitted as `''`.\n */\n@Component({\n selector: 'nh-assistant-picker',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-picker.component.html',\n styleUrl: './nh-assistant-picker.component.scss'\n})\nexport class NhAssistantPickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private searchTimer?: ReturnType<typeof setTimeout>;\n private searchSubscription?: Subscription;\n /** The text of the latest search, for searching again after a failure. */\n private lastQuery = '';\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n /** The id of the text field, for the label's `for`. */\n readonly inputId = input.required<string>();\n readonly options = input<readonly NhAssistantPickerOption[]>([]);\n readonly value = input<string | null>(null);\n /** The name to show for a value that is not among the options, such as a found account. */\n readonly selectedLabel = input<string | null>(null);\n /** The label of the empty choice; without it there is none. */\n readonly noneLabel = input<string | null>(null);\n readonly placeholder = input<string | null>(null);\n /** Searches the server; the options are ignored while it is set. */\n readonly search = input<((query: string) => Observable<NhAssistantPickerOption[]>) | null>(null);\n readonly minQueryLength = input(2);\n readonly invalid = input(false);\n readonly describedBy = input<string | null>(null);\n readonly disabled = input(false);\n\n readonly valueChange = output<string>();\n /** The chosen option, also for a search result the options do not contain. */\n readonly optionChange = output<NhAssistantPickerOption | null>();\n\n readonly listId = `nh-assistant-picker-${nextId++}`;\n readonly open = signal(false);\n /** The text typed since the list opened; `null` shows the chosen option's name. */\n readonly query = signal<string | null>(null);\n readonly active = signal(-1);\n readonly searching = signal(false);\n readonly results = signal<NhAssistantPickerOption[]>([]);\n /** Why the latest search failed; `null` after a search that answered. */\n readonly searchError = signal<NhAssistantError | null>(null);\n readonly searchErrorKeys = computed(() => nhAssistantErrorKeys(this.searchError()));\n readonly searchErrorId = `${this.listId}-search-error`;\n /** The field describes itself with the host's ids and, after a failed search, with its reason. */\n readonly fieldDescribedBy = computed(() =>\n [this.describedBy(), this.searchError() ? this.searchErrorId : null].filter(Boolean).join(' ') || null);\n private readonly chosen = signal<NhAssistantPickerOption | null>(null);\n\n readonly selected = computed<NhAssistantPickerOption | null>(() => {\n const value = this.value();\n if (value === null || value === '') {\n return null;\n }\n const known = this.options().find(option => option.value === value)\n ?? this.results().find(option => option.value === value)\n ?? (this.chosen()?.value === value ? this.chosen() : null);\n return known ?? { value, label: this.selectedLabel() ?? value };\n });\n\n readonly inputText = computed(() => this.query() ?? this.selected()?.label ?? (this.value() === '' ? this.noneLabel() ?? '' : ''));\n\n readonly visible = computed<NhAssistantPickerOption[]>(() => {\n if (this.search()) {\n return this.results();\n }\n const none = this.noneLabel();\n const all = none === null ? [...this.options()] : [{ value: '', label: none }, ...this.options()];\n const text = this.query()?.trim().toLocaleLowerCase() ?? '';\n return text.length === 0\n ? all\n : all.filter(option =>\n option.label.toLocaleLowerCase().includes(text)\n || option.value.toLocaleLowerCase().includes(text)\n || (option.description ?? '').toLocaleLowerCase().includes(text));\n });\n\n /** Why the list is empty: still typing, searching, the search failed, or nothing found. */\n readonly emptyKey = computed(() => {\n if (this.searching()) {\n return 'nh-assistant.picker.searching';\n }\n if (this.searchError()) {\n return 'nh-assistant.picker.search-failed';\n }\n if (this.search() && (this.query()?.trim().length ?? 0) < this.minQueryLength()) {\n return 'nh-assistant.picker.type-more';\n }\n return 'nh-assistant.picker.no-results';\n });\n\n readonly activeId = computed(() => this.open() && this.active() >= 0 && this.active() < this.visible().length\n ? this.optionId(this.active())\n : null);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n clearTimeout(this.searchTimer);\n this.searchSubscription?.unsubscribe();\n });\n }\n\n optionId(index: number): string {\n return `${this.listId}-option-${index}`;\n }\n\n /** Moves the focus to the text field, for example after a refused save. */\n focus(): void {\n this.field().nativeElement.focus();\n }\n\n toggle(): void {\n if (this.open()) {\n this.close();\n } else {\n this.openList();\n this.focus();\n }\n }\n\n openList(): void {\n if (this.disabled() || this.open()) {\n return;\n }\n this.open.set(true);\n const index = this.visible().findIndex(option => option.value === (this.value() ?? ''));\n this.active.set(index);\n }\n\n onInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.query.set(text);\n this.open.set(true);\n this.active.set(this.search() ? -1 : 0);\n if (this.search()) {\n this.startSearch(text);\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const count = this.visible().length;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.open()) {\n this.openList();\n }\n this.active.set(Math.min(this.active() + 1, count - 1));\n this.scrollActiveIntoView();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.active.set(Math.max(this.active() - 1, 0));\n this.scrollActiveIntoView();\n break;\n case 'Enter':\n if (this.open()) {\n event.preventDefault();\n const option = this.visible()[this.active()];\n if (option) {\n this.choose(option);\n } else {\n this.close();\n }\n }\n break;\n case 'Escape':\n if (this.open()) {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n }\n break;\n case 'Tab':\n this.close();\n break;\n }\n }\n\n onBlur(): void {\n this.close();\n }\n\n /** Searches the latest text again after a failed search and shows the list. */\n retrySearch(): void {\n if (!this.search() || this.disabled()) {\n return;\n }\n this.query.set(this.lastQuery);\n this.open.set(true);\n this.active.set(-1);\n this.startSearch(this.lastQuery);\n this.focus();\n }\n\n choose(option: NhAssistantPickerOption): void {\n this.searchError.set(null);\n this.chosen.set(option.value === '' ? null : option);\n this.valueChange.emit(option.value);\n this.optionChange.emit(option.value === '' ? null : option);\n this.close();\n }\n\n private close(): void {\n this.open.set(false);\n this.query.set(null);\n this.active.set(-1);\n }\n\n private startSearch(text: string): void {\n clearTimeout(this.searchTimer);\n this.searchSubscription?.unsubscribe();\n this.lastQuery = text;\n this.searchError.set(null);\n const search = this.search();\n const query = text.trim();\n if (!search || query.length < this.minQueryLength()) {\n this.results.set([]);\n this.searching.set(false);\n return;\n }\n this.searching.set(true);\n this.searchTimer = setTimeout(() => {\n this.searchSubscription = search(query).subscribe({\n next: results => {\n this.results.set(results);\n this.searching.set(false);\n this.active.set(results.length > 0 ? 0 : -1);\n },\n error: (error: unknown) => {\n this.results.set([]);\n this.searching.set(false);\n this.searchError.set(toNhAssistantError(error));\n }\n });\n }, searchDelayMs);\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n if (id) {\n queueMicrotask(() => this.host.nativeElement.querySelector(`#${id}`)?.scrollIntoView?.({ block: 'nearest' }));\n }\n }\n}\n","<div class=\"picker\" [class.open]=\"open()\">\n <div class=\"control\">\n <input\n #field\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n [id]=\"inputId()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [attr.aria-describedby]=\"fieldDescribedBy()\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"inputText()\"\n (input)=\"onInput($event)\"\n (click)=\"openList()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\" />\n <button\n type=\"button\"\n class=\"toggle\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'nh-assistant.picker.toggle' | translate\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"toggle()\">\n <nh-assistant-icon name=\"chevron-down\" />\n </button>\n </div>\n @if (searchError(); as failure) {\n <!-- A failed search says why and offers to search again; the list never claims nothing was found. -->\n <p class=\"field-error search-error\" role=\"alert\" data-search-error [id]=\"searchErrorId\">\n <nh-assistant-icon name=\"warning\" />\n <span>{{ searchErrorKeys() | nhAssistantTranslate: failure.code }}</span>\n <button\n type=\"button\"\n class=\"link\"\n data-search-retry\n [disabled]=\"disabled()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"retrySearch()\">{{ 'nh-assistant.picker.search-again' | translate }}</button>\n </p>\n }\n @if (open()) {\n <ul class=\"listbox\" role=\"listbox\" [id]=\"listId\">\n @for (option of visible(); track option.value; let index = $index) {\n <li\n role=\"option\"\n [id]=\"optionId(index)\"\n [class.active]=\"index === active()\"\n [attr.aria-selected]=\"option.value === (value() ?? '')\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"active.set(index)\"\n (click)=\"choose(option)\">\n <span class=\"label\">{{ option.label }}</span>\n @if (option.description) {\n <span class=\"description\">{{ option.description }}</span>\n }\n </li>\n } @empty {\n <li class=\"state\" role=\"presentation\">{{ emptyKey() | translate }}</li>\n }\n </ul>\n } @else if (selected()?.description; as description) {\n <p class=\"chosen\">{{ description }}</p>\n }\n</div>\n","import { LocationStrategy } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EnvironmentInjector,\n computed,\n inject,\n input,\n runInInjectionContext\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { NH_ASSISTANT_CONFIG } from '../nh-assistant.config';\n\n/** Where a subject link leads: a route of the host application or an `https` address elsewhere. */\nexport interface NhAssistantSubjectTarget {\n href: string;\n /** The URL the router navigates to; `null` for an address outside the application. */\n route: string | null;\n}\n\n/**\n * The name of a subject with the name of its type, linked to where the application shows the\n * subject (internal). The host's `subjectLinks` builder wins over the server's link; a link within\n * the application navigates through the router, an `https` link leaves it, and anything else shows\n * no link. Ctrl-, Cmd-, Shift- and middle-clicks keep the browser's behavior, such as a new tab.\n * A name that already says the type, as \"The whole application\" does for the application as a\n * whole, is shown once.\n */\n@Component({\n selector: 'nh-assistant-subject-link',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (shownTypeName(); as type) {\n <!-- The space keeps the type and the name apart for screen readers; the flex gap shows it. -->\n <span class=\"nh-assistant-subject-type\">{{ type }}</span>{{ ' ' }}\n }\n @if (target(); as link) {\n <a class=\"nh-assistant-subject-name\" [href]=\"link.href\" (click)=\"open($event, link)\">{{ label() }}</a>\n } @else {\n <span class=\"nh-assistant-subject-name\">{{ label() }}</span>\n }\n `,\n styleUrl: './nh-assistant-subject-link.component.scss'\n})\nexport class NhAssistantSubjectLinkComponent {\n private readonly config = inject(NH_ASSISTANT_CONFIG, { optional: true });\n private readonly router = inject(Router, { optional: true });\n private readonly locationStrategy = inject(LocationStrategy, { optional: true });\n private readonly injector = inject(EnvironmentInjector);\n\n readonly subjectType = input.required<string>();\n readonly subjectId = input.required<string>();\n /** The text people read, usually the subject's display name. */\n readonly label = input.required<string>();\n /** The name of the subject type, such as \"Project\"; nothing is shown without one. */\n readonly typeName = input<string | null | undefined>(null);\n /** The server's link to the subject. */\n readonly link = input<string | null | undefined>(null);\n\n /** The type's name, unless the subject's name is the type's name itself, as for the whole application. */\n readonly shownTypeName = computed(() => {\n const type = this.typeName()?.trim();\n if (!type) {\n return null;\n }\n\n return type.toLocaleLowerCase() === this.label().trim().toLocaleLowerCase() ? null : type;\n });\n\n readonly target = computed<NhAssistantSubjectTarget | null>(() => {\n const builder = this.config?.subjectLinks?.[this.subjectType()];\n const subject = { type: this.subjectType(), id: this.subjectId() };\n const custom = builder ? runInInjectionContext(this.injector, () => builder(subject)) : undefined;\n if (custom === null) {\n return null;\n }\n if (Array.isArray(custom)) {\n return this.routeTarget(this.router ? this.router.serializeUrl(this.router.createUrlTree([...custom])) : null);\n }\n\n return this.urlTarget(typeof custom === 'string' ? custom : this.link() ?? null);\n });\n\n open(event: MouseEvent, target: NhAssistantSubjectTarget): void {\n if (!target.route || !this.router || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return;\n }\n\n event.preventDefault();\n void this.router.navigateByUrl(target.route);\n }\n\n private urlTarget(url: string | null): NhAssistantSubjectTarget | null {\n if (!url) {\n return null;\n }\n if (url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\\\')) {\n return this.routeTarget(url);\n }\n\n return /^https:\\/\\/[^/\\\\\\s]+/i.test(url) ? { href: url, route: null } : null;\n }\n\n private routeTarget(url: string | null): NhAssistantSubjectTarget | null {\n if (!url) {\n return null;\n }\n\n return {\n href: this.locationStrategy ? this.locationStrategy.prepareExternalUrl(url) : url,\n route: this.router ? url : null\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/i18n/nh-assistant-error-codes';\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 * from './lib/services/nh-assistant-mcp-authorization';\nexport * from './lib/services/nh-assistant-mcp-connect.service';\nexport { toNhAssistantError } from './lib/internal/nh-assistant-errors';\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/preferences/nh-assistant-mcp-connections.component';\nexport * from './lib/components/connection-required/nh-assistant-connection-required.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 {\n nhAssistantReloadOnAgentWork as ɵnhAssistantReloadOnAgentWork,\n nhAssistantWatchAgentWork as ɵnhAssistantWatchAgentWork\n} from './lib/internal/nh-assistant-agent-work';\nexport {\n NhAssistantPickerComponent as ɵNhAssistantPickerComponent,\n type NhAssistantPickerOption as ɵNhAssistantPickerOption\n} from './lib/internal/nh-assistant-picker.component';\nexport { NhAssistantSubjectLinkComponent as ɵNhAssistantSubjectLinkComponent } from './lib/internal/nh-assistant-subject-link.component';\nexport { NhAssistantMarkdownPipe as ɵNhAssistantMarkdownPipe } from './lib/internal/nh-assistant-markdown.pipe';\nexport {\n NH_ASSISTANT_DASH_CASE as ɵNH_ASSISTANT_DASH_CASE,\n nhAssistantCodeKeys as ɵnhAssistantCodeKeys,\n nhAssistantErrorKeys as ɵnhAssistantErrorKeys,\n nhAssistantErrorOf as ɵnhAssistantErrorOf,\n // Kept for the secondary entry points and earlier callers; `toNhAssistantError` is public.\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":["withQuery","nextId","searchDelayMs"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}