@newheap/platform-ai-chat 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -4,6 +4,271 @@ import { Observable } from 'rxjs';
4
4
  import { TranslationObject } from '@ngx-translate/core';
5
5
  import { TemplatePortal } from '@angular/cdk/portal';
6
6
 
7
+ /**
8
+ * Contracts of the agent-run endpoints of `NewHeap.Platform.AI.Chat.AspNet`: threads about a
9
+ * subject, runs, proposals, the approval inbox, working memory and artifacts.
10
+ */
11
+ /** The caller's role on the subject of a thread. */
12
+ type AgentSubjectRole = 'none' | 'reader' | 'participant' | 'approver';
13
+ type AgentRunStatus = 'queued' | 'running' | 'waiting-for-approval' | 'completed' | 'failed' | 'cancelled';
14
+ type AgentProposalStatus = 'pending' | 'approved' | 'rejected' | 'expired' | 'withdrawn' | 'stale' | 'executing' | 'executed' | 'execution-failed' | 'execution-unknown' | 'resolved' | 'shadow';
15
+ type AgentGrantSource = 'none' | 'delegated' | 'agent';
16
+ interface AgentRun {
17
+ id: string;
18
+ conversationId: string;
19
+ triggerId: string;
20
+ status: AgentRunStatus;
21
+ failureClass: string | null;
22
+ failureCode: string | null;
23
+ initiatorActorId: string | null;
24
+ accountableOwnerId: string;
25
+ attempt: number;
26
+ agentVersion: number;
27
+ toolCalls: number;
28
+ inputTokens: number;
29
+ outputTokens: number;
30
+ proposalCount: number;
31
+ summary: string | null;
32
+ shadow: boolean;
33
+ createdAt: string;
34
+ startedAt: string | null;
35
+ endedAt: string | null;
36
+ backgroundOperationId: string | null;
37
+ }
38
+ interface AgentRunList {
39
+ items: AgentRun[];
40
+ total: number;
41
+ }
42
+ interface AgentThread {
43
+ conversationId: string;
44
+ agentId: string;
45
+ subjectType: string;
46
+ subjectId: string;
47
+ subjectDisplayName: string | null;
48
+ accountability: string;
49
+ accountableOwnerId: string;
50
+ role: AgentSubjectRole;
51
+ activeRun: AgentRun | null;
52
+ waitingInputs: number;
53
+ }
54
+ interface AgentThreadLookup {
55
+ thread: AgentThread | null;
56
+ canStart: boolean;
57
+ role: AgentSubjectRole;
58
+ }
59
+ /** The caller's live right to decide one open proposal; the server checks every decision again. */
60
+ interface AgentProposalDecisionRight {
61
+ canDecide: boolean;
62
+ /**
63
+ * Why the caller may not decide, for example `assistant-four-eyes-required` or
64
+ * `assistant-approval-policy-denied`; `null` when they may.
65
+ */
66
+ reasonCode: string | null;
67
+ }
68
+ /** One agent on a subject: its thread, `null` before it worked on the subject, and whether the caller may start it. */
69
+ interface AgentSubjectWorkAgent {
70
+ agentId: string;
71
+ thread: AgentThread | null;
72
+ canStart: boolean;
73
+ }
74
+ /** An open proposal on a subject with the caller's live decision right. */
75
+ interface AgentSubjectWorkProposal extends AgentProposalDecisionRight {
76
+ proposal: AgentProposal;
77
+ }
78
+ /**
79
+ * All agent work on one subject as the caller may see it (`GET subjects/{type}/{id}/work`): every
80
+ * agent with a thread on the subject plus the requested agent, and the pending proposals of all
81
+ * those threads, the earliest expiry first.
82
+ */
83
+ interface AgentSubjectWork {
84
+ subjectType: string;
85
+ subjectId: string;
86
+ subjectDisplayName: string | null;
87
+ /** The caller's live role. Without a role the server answers `404 assistant-subject-not-found`. */
88
+ role: Exclude<AgentSubjectRole, 'none'>;
89
+ agents: AgentSubjectWorkAgent[];
90
+ openProposals: AgentSubjectWorkProposal[];
91
+ }
92
+ /** The agent work on one subject for a list view (`POST subjects/{type}/summary`). */
93
+ interface AgentSubjectSummary {
94
+ subjectId: string;
95
+ /** Proposals that wait for a decision on the subject. */
96
+ openProposals: number;
97
+ /** The open proposals the caller may decide, counted like the approval inbox. */
98
+ proposalsToDecide: number;
99
+ /** An agent works on the subject now. */
100
+ runActive: boolean;
101
+ }
102
+ /** One summary per requested subject, in request order; subjects without visible work count zero. */
103
+ interface AgentSubjectSummaryList {
104
+ subjectType: string;
105
+ items: AgentSubjectSummary[];
106
+ }
107
+ /** Maximum number of subjects one `POST subjects/{type}/summary` request accepts. */
108
+ declare const NH_ASSISTANT_MAX_SUBJECT_SUMMARY = 200;
109
+ interface StartAgentRequest {
110
+ agentId: string;
111
+ subjectType: string;
112
+ subjectId: string;
113
+ message?: string | null;
114
+ }
115
+ interface AgentTriggerReceipt {
116
+ triggerId: string;
117
+ outcome: 'started' | 'queued' | 'coalesced' | 'superseded' | 'ignored' | 'deduplicated' | 'rejected';
118
+ runId: string | null;
119
+ conversationId: string | null;
120
+ reasonCode: string | null;
121
+ }
122
+ interface AgentProposal {
123
+ approvalId: string;
124
+ proposalId: string;
125
+ proposalHash: string;
126
+ conversationId: string;
127
+ runId: string | null;
128
+ agentId: string;
129
+ subjectType: string;
130
+ subjectId: string;
131
+ subjectDisplayName: string | null;
132
+ toolId: string;
133
+ summary: string;
134
+ /**
135
+ * The application's localized explanation, written when the proposal was recorded. Show it
136
+ * instead of `argumentsPreview`; `null` when no presenter handled the tool.
137
+ */
138
+ presentation: ApprovalPresentation | null;
139
+ argumentsPreview: string;
140
+ targets: string[];
141
+ status: AgentProposalStatus;
142
+ mode: 'inline' | 'deferred';
143
+ policyId: string | null;
144
+ grantSource: AgentGrantSource;
145
+ createdAt: string;
146
+ expiresAt: string;
147
+ initiatorActorId: string | null;
148
+ decidedByActorId: string | null;
149
+ /**
150
+ * The name of `decidedByActorId` from the subject's member snapshot; `null` when the snapshot
151
+ * does not know the person. Show `decidedByActorId` then. Missing on older servers.
152
+ */
153
+ decidedByDisplayName?: string | null;
154
+ decidedAt: string | null;
155
+ executionResultCode: string | null;
156
+ executedAt: string | null;
157
+ /**
158
+ * The consultation that proposed it, when another assistant consulted the agent for
159
+ * `initiatorActorId`; it executes with that person's rights only.
160
+ */
161
+ consultationId?: string | null;
162
+ /** The caller's own feedback on the proposal; `null` when they gave none. Missing on older servers. */
163
+ feedback?: AgentProposalFeedback | null;
164
+ /**
165
+ * Whether the caller may give or change feedback: the proposal was rejected, expired, withdrawn or
166
+ * closed as stale, and the caller decided it or is an approver of the subject. Missing on older servers.
167
+ */
168
+ canGiveFeedback?: boolean;
169
+ }
170
+ /**
171
+ * Why a person rejected a proposal. `incorrect`, `wrong-value` and `not-needed` say the agent was
172
+ * wrong; `not-now` and `already-done` say it was right but not at this moment; `not-allowed` says
173
+ * it went beyond what the agent should do; `other` leaves the explanation to the text.
174
+ */
175
+ type AgentProposalFeedbackCategory = 'incorrect' | 'wrong-value' | 'not-needed' | 'not-now' | 'already-done' | 'not-allowed' | 'other';
176
+ /** The group of a feedback category. `right-but-not-now` never counts as "the agent was wrong". */
177
+ type AgentProposalFeedbackGroup = 'wrong' | 'right-but-not-now' | 'not-allowed' | 'other';
178
+ /** The feedback categories in the order people choose them. */
179
+ declare const NH_ASSISTANT_FEEDBACK_CATEGORIES: readonly AgentProposalFeedbackCategory[];
180
+ /** The group of each feedback category, as the server reports it. */
181
+ declare const NH_ASSISTANT_FEEDBACK_GROUPS: Readonly<Record<AgentProposalFeedbackCategory, AgentProposalFeedbackGroup>>;
182
+ /** Maximum length of the text of a feedback. */
183
+ declare const NH_ASSISTANT_MAX_FEEDBACK_TEXT = 1000;
184
+ /** Maximum number of proposals one `POST approvals/feedback` request accepts. */
185
+ declare const NH_ASSISTANT_MAX_BULK_FEEDBACK = 50;
186
+ /**
187
+ * One person's feedback on a rejected or otherwise closed proposal. It is separate from the
188
+ * decision's reason, arrives after the decision and can be changed by its author.
189
+ */
190
+ interface AgentProposalFeedback {
191
+ approvalId: string;
192
+ category: AgentProposalFeedbackCategory;
193
+ group: AgentProposalFeedbackGroup;
194
+ text: string | null;
195
+ /** Given once for several proposals that were rejected together. */
196
+ bulk: boolean;
197
+ createdAt: string;
198
+ updatedAt: string;
199
+ }
200
+ /** The outcome of the feedback on one proposal of `POST approvals/feedback`. */
201
+ interface AgentFeedbackOutcome {
202
+ approvalId: string;
203
+ succeeded: boolean;
204
+ /** For example `assistant-feedback-not-accepted`; `null` when it succeeded. */
205
+ code: string | null;
206
+ }
207
+ type AgentConsultationStatus = 'running' | 'completed' | 'failed';
208
+ /**
209
+ * One consultation of a thread's agent by another assistant. It names who asked and through which
210
+ * assistant; the question and the answer stay in the asking conversation.
211
+ */
212
+ interface AgentConsultation {
213
+ id: string;
214
+ askerActorId: string;
215
+ /** The asker's name from the subject's members, when known. */
216
+ askerDisplayName: string | null;
217
+ askingAgentId: string | null;
218
+ depth: number;
219
+ status: AgentConsultationStatus;
220
+ failureCode: string | null;
221
+ toolCalls: number;
222
+ inputTokens: number;
223
+ outputTokens: number;
224
+ proposalCount: number;
225
+ createdAt: string;
226
+ endedAt: string | null;
227
+ }
228
+ interface AgentConsultationList {
229
+ items: AgentConsultation[];
230
+ total: number;
231
+ }
232
+ interface AgentInbox {
233
+ items: AgentProposal[];
234
+ total: number;
235
+ }
236
+ interface AgentInboxFilter {
237
+ subjectType?: string;
238
+ agentId?: string;
239
+ divisionId?: string;
240
+ runId?: string;
241
+ page?: number;
242
+ itemsPerPage?: number;
243
+ }
244
+ type AgentProposalDecision = 'approve' | 'reject';
245
+ interface AgentDecisionOutcome {
246
+ approvalId: string;
247
+ succeeded: boolean;
248
+ code: string | null;
249
+ status: AgentProposalStatus | null;
250
+ }
251
+ interface AgentThreadMemory {
252
+ configured: boolean;
253
+ schemaVersion: number;
254
+ memory: unknown;
255
+ updatedAt: string | null;
256
+ }
257
+ interface AgentArtifact {
258
+ id: string;
259
+ name: string;
260
+ version: number;
261
+ contentType: string;
262
+ sizeBytes: number;
263
+ createdAt: string;
264
+ runId: string | null;
265
+ restricted: boolean;
266
+ }
267
+ /** `resume` continues the run from its last checkpoint; `restart` starts a new run in the thread. */
268
+ type AgentRunRetryMode = 'resume' | 'restart';
269
+ /** `re-execute` runs the proposal again; `mark-resolved` confirms its outcome without running it. */
270
+ type AgentExecutionResolution = 're-execute' | 'mark-resolved';
271
+
7
272
  interface AssistantStatus {
8
273
  enabled: boolean;
9
274
  agents: AgentSummary[];
@@ -63,6 +328,43 @@ interface Conversation extends ConversationSummary {
63
328
  shareToken?: string | null;
64
329
  /** The caller's actor id, to recognize the caller's own messages. */
65
330
  currentActorId?: string | null;
331
+ /** Default `chat` for servers without agent runs. */
332
+ kind?: ConversationKind;
333
+ /**
334
+ * The subject of an agent thread and the caller's standing in it, including who may decide its
335
+ * open proposals; `null` for a chat.
336
+ */
337
+ thread?: ConversationThread | null;
338
+ }
339
+ /** `chat` for a conversation people start; `thread` for the durable thread of an agent about one subject. */
340
+ type ConversationKind = 'chat' | 'thread';
341
+ /**
342
+ * The subject of an agent thread as the caller sees it. In a thread the subject's approvers decide
343
+ * the agent's proposals, not the author of a turn. The server checks the role on every request.
344
+ */
345
+ interface ConversationThread {
346
+ subjectType: string;
347
+ subjectId: string;
348
+ subjectDisplayName: string | null;
349
+ /** The caller's live role on the subject. */
350
+ role: AgentSubjectRole;
351
+ /** Each open proposal of the thread and whether the caller may decide it now, oldest first. */
352
+ decisions: ConversationThreadDecision[];
353
+ }
354
+ /**
355
+ * The caller's right to decide one open proposal of an agent thread, checked like the decision
356
+ * itself: the approval policy, four-eyes and the tool's approve policy.
357
+ */
358
+ interface ConversationThreadDecision {
359
+ approvalId: string;
360
+ /**
361
+ * The run that proposed it; such a proposal is decided with `POST approvals/{id}/decisions`.
362
+ * `null` for a proposal of a person's turn in the thread, decided in the conversation.
363
+ */
364
+ runId: string | null;
365
+ canDecide: boolean;
366
+ /** Why the caller may not decide, for example `assistant-four-eyes-required`; `null` when they may. */
367
+ reasonCode: string | null;
66
368
  }
67
369
  type ConversationStatus = 'idle' | 'running' | 'waiting-for-approval' | 'failed' | 'archived';
68
370
  /** The owner or a participant of a shared conversation. */
@@ -82,13 +384,23 @@ interface Message {
82
384
  sequence?: number;
83
385
  /** The writer of a user message. */
84
386
  authorActorId?: string | null;
387
+ /** Who wrote a user message: a person or a trigger of an agent; missing on old servers. */
388
+ authorKind?: MessageAuthorKind | null;
85
389
  }
390
+ /** `person` for a message a person wrote; `trigger` for one a trigger wrote into an agent thread. */
391
+ type MessageAuthorKind = 'person' | 'trigger';
86
392
  type MessagePart = TextPart | ToolCallPart | ApprovalPart;
87
393
  interface TextPart {
88
394
  type: 'text';
89
395
  text: string;
90
396
  }
91
- type ToolCallStatus = 'running' | 'succeeded' | 'failed' | 'awaiting-approval' | 'rejected';
397
+ /**
398
+ * `awaiting-approval` waits for a person. A call whose agent proposal closed without running ends
399
+ * as `rejected`, as `not-executed` when the proposal expired, was withdrawn or became stale, or as
400
+ * `failed` when its execution failed before it started; its `resultCode` is then
401
+ * `assistant-proposal-<approval status>`, for example `assistant-proposal-expired`.
402
+ */
403
+ type ToolCallStatus = 'running' | 'succeeded' | 'failed' | 'awaiting-approval' | 'rejected' | 'not-executed';
92
404
  interface ToolCallPart {
93
405
  type: 'tool-call';
94
406
  invocationId: string;
@@ -99,8 +411,17 @@ interface ToolCallPart {
99
411
  argumentsPreview: string | null;
100
412
  resultPreview: string | null;
101
413
  resultCode: string | null;
414
+ /** `delegated` or `agent` when an agent used rights beyond the caller's own. */
415
+ grantSource?: 'delegated' | 'agent' | null;
416
+ /** The result came from the agent's own grant and is shielded from this viewer. */
417
+ restricted?: boolean;
102
418
  }
103
- type ApprovalStatus = 'pending' | 'approved' | 'rejected' | 'expired';
419
+ /**
420
+ * Chat approvals are `pending`, `approved`, `rejected` or `expired`; proposals of agents that run on
421
+ * their own continue through execution (`executing`, `executed`, `execution-failed`,
422
+ * `execution-unknown`, `resolved`) or end as `withdrawn`, `stale` or `shadow`.
423
+ */
424
+ type ApprovalStatus = 'pending' | 'approved' | 'rejected' | 'expired' | 'withdrawn' | 'stale' | 'executing' | 'executed' | 'execution-failed' | 'execution-unknown' | 'resolved' | 'shadow';
104
425
  interface ApprovalPresentationField {
105
426
  label: string;
106
427
  value: string;
@@ -298,6 +619,23 @@ interface LiveConversationRead {
298
619
  interface LiveConversationRemoved {
299
620
  conversationId: string;
300
621
  }
622
+ /** What changed in an agent thread: a run, a proposal or the feedback on a proposal. */
623
+ type LiveAgentWorkReason = 'run' | 'proposal' | 'feedback';
624
+ /**
625
+ * `AgentWorkChanged`: a run of an agent thread started, waits, ended or was cancelled, a proposal
626
+ * was decided, resolved, executed, closed, escalated or expired, or feedback was given. Sent to the
627
+ * thread's participants and everyone on its subject. It carries no content: reload the agent-run
628
+ * endpoints that show the thread, which check access again. It names the thread's subject, so
629
+ * lists and pages of the application refresh by subject without knowing conversation ids.
630
+ */
631
+ interface LiveAgentWorkChanged {
632
+ conversationId: string;
633
+ reason: LiveAgentWorkReason;
634
+ approvalId: string | null;
635
+ runId: string | null;
636
+ subjectType: string;
637
+ subjectId: string;
638
+ }
301
639
  /**
302
640
  * `ConversationEvent`: one turn event with the same `type` and `data` as the server-sent events
303
641
  * of the starting request, or `message.created` with a `Message` when a participant's message
@@ -418,6 +756,107 @@ interface UpdateMcpToolRequest {
418
756
  effect: McpToolEffect;
419
757
  descriptionOverride: string | null;
420
758
  }
759
+ /**
760
+ * Filter of the feedback report of an agent. The server selects proposals by when they were made,
761
+ * defaults to the 30 days before `to` (now) and allows at most 366 days; it only reports scopes the
762
+ * caller administers.
763
+ */
764
+ interface AgentFeedbackFilter {
765
+ /** Start of the period as an ISO 8601 date-time. */
766
+ from?: string;
767
+ /** End of the period, exclusive, as an ISO 8601 date-time. */
768
+ to?: string;
769
+ scopeKey?: string;
770
+ toolId?: string;
771
+ agentVersion?: number;
772
+ }
773
+ /** Filter and page of `GET admin/agents/{id}/feedback`. */
774
+ interface AgentFeedbackListFilter extends AgentFeedbackFilter {
775
+ category?: AgentProposalFeedbackCategory;
776
+ page?: number;
777
+ /** At most 100. */
778
+ itemsPerPage?: number;
779
+ }
780
+ /** Filter of `GET admin/agents/{id}/feedback/export`. */
781
+ interface AgentFeedbackExportFilter extends AgentFeedbackFilter {
782
+ category?: AgentProposalFeedbackCategory;
783
+ /** Maximum number of records; the server defaults to 10,000 and allows at most 50,000. */
784
+ limit?: number;
785
+ }
786
+ interface AgentFeedbackCategoryCount {
787
+ category: AgentProposalFeedbackCategory;
788
+ group: AgentProposalFeedbackGroup;
789
+ count: number;
790
+ }
791
+ /** The proposals of one tool and agent version in the period and what people said about them. */
792
+ interface AgentFeedbackSummaryRow {
793
+ toolId: string;
794
+ /** The agent row version of the runs that proposed them; `null` for proposals of consultations. */
795
+ agentVersion: number | null;
796
+ pending: number;
797
+ /** Approved proposals, including those that executed, failed, closed as stale or were resolved. */
798
+ approved: number;
799
+ rejected: number;
800
+ expired: number;
801
+ withdrawn: number;
802
+ /** Approved proposals closed because the subject changed; part of `approved`. */
803
+ stale: number;
804
+ /** Approved proposals whose execution failed; part of `approved`. */
805
+ executionFailed: number;
806
+ /** Rejected divided by approved plus rejected (0..1); `null` before anyone decided. */
807
+ rejectionRate: number | null;
808
+ /** Rejected proposals with at least one feedback. */
809
+ rejectedWithFeedback: number;
810
+ /** Proposals of any status with at least one feedback. */
811
+ feedbackProposals: number;
812
+ /** Different people who gave feedback, so one critical approver counts as one. */
813
+ feedbackAuthors: number;
814
+ categories: AgentFeedbackCategoryCount[];
815
+ }
816
+ /** Response of `GET admin/agents/{id}/feedback/summary`. */
817
+ interface AgentFeedbackSummary {
818
+ agentId: string;
819
+ from: string;
820
+ /** Exclusive end of the period. */
821
+ to: string;
822
+ rows: AgentFeedbackSummaryRow[];
823
+ }
824
+ /** One feedback with the proposal it is about, as approvers read it. */
825
+ interface AgentFeedbackItem {
826
+ id: string;
827
+ approvalId: string;
828
+ proposalId: string;
829
+ conversationId: string;
830
+ runId: string | null;
831
+ scopeKey: string;
832
+ subjectType: string;
833
+ subjectId: string;
834
+ subjectDisplayName: string | null;
835
+ toolId: string;
836
+ agentVersion: number | null;
837
+ /** The proposal's status when the feedback was given. */
838
+ approvalStatus: AgentProposalStatus;
839
+ /** The proposal's summary as the agent recorded it. */
840
+ summary: string;
841
+ presentation: ApprovalPresentation | null;
842
+ category: AgentProposalFeedbackCategory;
843
+ group: AgentProposalFeedbackGroup;
844
+ text: string | null;
845
+ authorActorId: string;
846
+ /**
847
+ * The name of `authorActorId` from the member snapshots; `null` when no snapshot knows the
848
+ * person. Show `authorActorId` then. Missing on older servers.
849
+ */
850
+ authorDisplayName?: string | null;
851
+ bulk: boolean;
852
+ createdAt: string;
853
+ updatedAt: string;
854
+ }
855
+ /** Response of `GET admin/agents/{id}/feedback`, newest change first. */
856
+ interface AgentFeedbackList {
857
+ items: AgentFeedbackItem[];
858
+ total: number;
859
+ }
421
860
 
422
861
  /** Decides whether the current user may see and use the assistant. */
423
862
  interface NhAssistantAccessPolicy {
@@ -432,6 +871,29 @@ interface NhAssistantConfig {
432
871
  * `inject(...)`, for example `() => inject(MyAuthService).getAuthorization()?.token ?? null`.
433
872
  */
434
873
  getAccessToken: () => string | null | Promise<string | null>;
874
+ /**
875
+ * Returns extra headers for every assistant request, for example the NewHeap active division:
876
+ * `() => ({ 'X-NH-ActiveDivisionId': inject(MyAuthService).getAuthorization()?.activeDivision?.id ?? '' })`.
877
+ * Runs in the assistant's injection context before every request, like `getAccessToken`, and
878
+ * when the live-update connection starts. `Authorization`, `Accept`, `Accept-Language` and
879
+ * `Content-Type` stay under the library's control, and empty values are left out. Browsers send
880
+ * no custom headers with the WebSocket and server-sent event transports of the live connection;
881
+ * pass what the hub needs with `getHubQueryParameters`. Default: none.
882
+ */
883
+ getRequestHeaders?: () => Record<string, string> | null | Promise<Record<string, string> | null>;
884
+ /**
885
+ * Returns query parameters for the live-update hub URL: the values the hub needs that browsers
886
+ * cannot send as headers, because the WebSocket and server-sent event transports carry none.
887
+ * Without them a hub that requires such a value refuses those transports and the connection
888
+ * falls back to long polling. For example the NewHeap active division, which the platform's JWT
889
+ * handler copies from `divisionId` to `X-NH-ActiveDivisionId` on `/hub` paths:
890
+ * `() => ({ divisionId: inject(MyAuthService).getAuthorization()?.activeDivision?.id ?? '' })`.
891
+ * Runs in the assistant's injection context each time the connection starts. `access_token`,
892
+ * `id` and `negotiateVersion` stay under the control of the library and SignalR, empty values
893
+ * are left out and a failing getter only leaves the parameters out. Never return a secret: URLs
894
+ * appear in server and proxy logs. Default: none.
895
+ */
896
+ getHubQueryParameters?: () => Record<string, string> | null | Promise<Record<string, string> | null>;
435
897
  /**
436
898
  * Returns what the user has open, sent with each message as untrusted page context.
437
899
  * Runs in the assistant's injection context when the panel opens and before every
@@ -658,11 +1120,95 @@ declare class NhAssistantAdminApiService {
658
1120
  syncMcpServer(serverId: string): Observable<McpTool[]>;
659
1121
  getMcpTools(serverId: string): Observable<McpTool[]>;
660
1122
  updateMcpTool(serverId: string, remoteName: string, request: UpdateMcpToolRequest): Observable<McpTool>;
1123
+ /**
1124
+ * The agent's proposals per tool and agent version in the period: decisions, the rejection rate,
1125
+ * feedback per category and the number of different people who gave it.
1126
+ */
1127
+ getAgentFeedbackSummary(agentId: string, filter?: AgentFeedbackFilter): Observable<AgentFeedbackSummary>;
1128
+ /** The feedback on the agent's proposals with the proposal as approvers read it, newest change first. */
1129
+ getAgentFeedback(agentId: string, filter?: AgentFeedbackListFilter): Observable<AgentFeedbackList>;
1130
+ /**
1131
+ * Downloads the feedback as JSON Lines with the tool input of each proposal. The file holds
1132
+ * subject data and the server audits the export. Rejects with `NhAssistantApiError`.
1133
+ */
1134
+ exportAgentFeedback(agentId: string, filter?: AgentFeedbackExportFilter): Promise<Blob>;
661
1135
  private request;
662
1136
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantAdminApiService, never>;
663
1137
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NhAssistantAdminApiService>;
664
1138
  }
665
1139
 
1140
+ /**
1141
+ * Client for the agent-run endpoints: the agent thread about a subject, its runs, proposals,
1142
+ * working memory and artifacts, and the approval inbox. Access follows the caller's role on the
1143
+ * subject, which the server checks on every request; failures error with `NhAssistantApiError`.
1144
+ */
1145
+ declare class NhAssistantAgentRunApiService {
1146
+ private readonly transport;
1147
+ /** The agent's thread about the subject, the caller's role and whether the caller may start the agent. */
1148
+ getThread(agentId: string, subjectType: string, subjectId: string): Observable<AgentThreadLookup>;
1149
+ /**
1150
+ * The agent's thread about the subject, created without starting a run when it is missing, so
1151
+ * the caller can open the conversation and type there. Creating a thread needs the participant
1152
+ * role; readers may open an existing one. Errors with `assistant-subject-access-denied` otherwise.
1153
+ */
1154
+ openThread(agentId: string, subjectType: string, subjectId: string): Observable<AgentThreadLookup>;
1155
+ /** Starts the agent on the subject with the caller as initiator; needs the participant role. */
1156
+ startAgent(request: StartAgentRequest): Observable<AgentTriggerReceipt>;
1157
+ /**
1158
+ * All agent work on one subject: the caller's role, every agent with a thread on it plus
1159
+ * `agentId`, and the open proposals of all of them with the caller's live decision right. Errors
1160
+ * with `assistant-subject-not-found` when the caller has no role on the subject.
1161
+ */
1162
+ getSubjectWork(subjectType: string, subjectId: string, agentId?: string): Observable<AgentSubjectWork>;
1163
+ /**
1164
+ * Counts the agent work on at most `NH_ASSISTANT_MAX_SUBJECT_SUMMARY` subjects of one type in one
1165
+ * request, for badges in a list; one item per id in request order. `NhAssistantSubjectSummaryService`
1166
+ * batches and caches these requests for many badges.
1167
+ */
1168
+ summarizeSubjects(subjectType: string, subjectIds: readonly string[]): Observable<AgentSubjectSummaryList>;
1169
+ getRuns(conversationId: string): Observable<AgentRunList>;
1170
+ /** Who consulted the thread's agent through another assistant, newest first. */
1171
+ getConsultations(conversationId: string, page?: number, itemsPerPage?: number): Observable<AgentConsultationList>;
1172
+ getProposals(conversationId: string): Observable<AgentProposal[]>;
1173
+ getMemory(conversationId: string): Observable<AgentThreadMemory>;
1174
+ getArtifacts(conversationId: string): Observable<AgentArtifact[]>;
1175
+ /** Downloads one artifact version with the host's credentials. */
1176
+ downloadArtifact(conversationId: string, artifactId: string): Promise<Blob>;
1177
+ /** Cancels a run at its next safe point and withdraws its open proposals; needs the participant role. */
1178
+ cancelRun(runId: string): Observable<void>;
1179
+ /** Resumes or restarts a failed or cancelled run; needs the approver role. */
1180
+ retryRun(runId: string, mode: AgentRunRetryMode): Observable<AgentTriggerReceipt>;
1181
+ /** Pending proposals the caller may decide, sorted by expiry. */
1182
+ getInbox(filter?: AgentInboxFilter): Observable<AgentInbox>;
1183
+ /**
1184
+ * Decides one proposal, bound to the proposal hash the person saw; the server checks the approval
1185
+ * policy and the tool's approve policy again. Accepts an inbox proposal or the approval part of an
1186
+ * agent thread.
1187
+ */
1188
+ decide(proposal: Pick<AgentProposal, 'approvalId' | 'proposalHash'>, decision: AgentProposalDecision, reason?: string): Observable<AgentProposal>;
1189
+ /** Decides several proposals; each one is checked and decided on its own. */
1190
+ decideMany(approvalIds: string[], decision: AgentProposalDecision, reason?: string): Observable<{
1191
+ results: AgentDecisionOutcome[];
1192
+ }>;
1193
+ /** Resolves an execution whose outcome is unknown. */
1194
+ resolve(approvalId: string, action: AgentExecutionResolution, reason?: string): Observable<AgentProposal>;
1195
+ /**
1196
+ * Gives or changes the caller's feedback on a closed proposal (`canGiveFeedback`). Feedback is
1197
+ * optional and separate from the decision; an empty text is sent as `null`. Fails with
1198
+ * `assistant-feedback-not-accepted` while the proposal is pending or after it was approved.
1199
+ */
1200
+ giveFeedback(approvalId: string, category: AgentProposalFeedbackCategory, text?: string | null): Observable<AgentProposalFeedback>;
1201
+ /**
1202
+ * Gives the same feedback on at most `NH_ASSISTANT_MAX_BULK_FEEDBACK` proposals that were
1203
+ * rejected together. Each proposal is checked on its own and stored as bulk feedback.
1204
+ */
1205
+ giveFeedbackMany(approvalIds: readonly string[], category: AgentProposalFeedbackCategory, text?: string | null): Observable<{
1206
+ results: AgentFeedbackOutcome[];
1207
+ }>;
1208
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantAgentRunApiService, never>;
1209
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NhAssistantAgentRunApiService>;
1210
+ }
1211
+
666
1212
  /**
667
1213
  * Applies one assistant event to a conversation and returns the new conversation.
668
1214
  * The input is never mutated, so the result can be stored in a signal directly.
@@ -707,9 +1253,10 @@ declare function describeNhAssistantClientContext(context: ClientContext): strin
707
1253
 
708
1254
  type NhAssistantLiveState = 'off' | 'connecting' | 'connected' | 'reconnecting' | 'disconnected';
709
1255
  /**
710
- * Live updates of the assistant hub: conversation changes, read positions, removals and the
711
- * turn events of other sessions. Connects only while the store asks for it, reconnects on its
712
- * own and emits `resync` after every (re)connect, because updates sent while disconnected are lost.
1256
+ * Live updates of the assistant hub: conversation changes, read positions, removals, the turn
1257
+ * events of other sessions and changes to the work of agents that run on their own. Connects only
1258
+ * while the store asks for it, reconnects on its own and emits `resync` after every (re)connect,
1259
+ * because updates sent while disconnected are lost.
713
1260
  */
714
1261
  declare class NhAssistantLiveService {
715
1262
  private readonly config;
@@ -719,6 +1266,7 @@ declare class NhAssistantLiveService {
719
1266
  private readonly readSubject;
720
1267
  private readonly removedSubject;
721
1268
  private readonly eventSubject;
1269
+ private readonly agentWorkSubject;
722
1270
  private readonly resyncSubject;
723
1271
  private readonly stateSignal;
724
1272
  private connection?;
@@ -730,6 +1278,11 @@ declare class NhAssistantLiveService {
730
1278
  readonly read$: Observable<LiveConversationRead>;
731
1279
  readonly removed$: Observable<LiveConversationRemoved>;
732
1280
  readonly events$: Observable<LiveConversationEvent>;
1281
+ /**
1282
+ * A run, proposal or feedback of an agent thread changed. It carries no content; components
1283
+ * that show the thread reload it.
1284
+ */
1285
+ readonly agentWork$: Observable<LiveAgentWorkChanged>;
733
1286
  /** Reload snapshots: emitted after every (re)connect. */
734
1287
  readonly resync$: Observable<void>;
735
1288
  readonly state: _angular_core.Signal<NhAssistantLiveState>;
@@ -745,6 +1298,11 @@ declare class NhAssistantLiveService {
745
1298
  /** Starts over after the automatic reconnect gave up or the first start failed. */
746
1299
  private scheduleRestart;
747
1300
  private token;
1301
+ /**
1302
+ * The hub URL with the host's `getHubQueryParameters`, which reach the hub on every transport,
1303
+ * unlike headers on WebSockets and server-sent events.
1304
+ */
1305
+ private withQueryParameters;
748
1306
  /** `hubBaseUrl` + `hubPath`, or the hub path on the origin of `apiBaseUrl`. */
749
1307
  private resolveUrl;
750
1308
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantLiveService, never>;
@@ -770,6 +1328,25 @@ interface NhAssistantQueuedMessage {
770
1328
  }
771
1329
  /** Notice code for a completed turn that produced no answer text and no server code. */
772
1330
  declare const NH_ASSISTANT_NO_ANSWER_NOTICE_CODE = "assistant-no-answer";
1331
+ /**
1332
+ * Who decides an approval the current user cannot decide: `turn`, the person whose turn created
1333
+ * it in a chat; `approver`, an approver of the agent thread's subject; `other-approver`, another
1334
+ * approver, because the current user started the work and four-eyes applies.
1335
+ */
1336
+ type NhAssistantApprovalWaitingFor = 'turn' | 'approver' | 'other-approver';
1337
+ /** The current user's right to decide, or to give feedback on, one approval of the open conversation. */
1338
+ interface NhAssistantApprovalRight {
1339
+ canDecide: boolean;
1340
+ /** Who decides when the current user cannot. */
1341
+ waitingFor: NhAssistantApprovalWaitingFor;
1342
+ /** Name of the person who decides a `turn` approval; `null` when unknown. */
1343
+ decisionOwner: string | null;
1344
+ /**
1345
+ * True for an agent's proposal the current user rejected in this session, so the approval card
1346
+ * offers the optional feedback question. Chat approvals never offer feedback.
1347
+ */
1348
+ canGiveFeedback?: boolean;
1349
+ }
773
1350
  /**
774
1351
  * A conversation that needs attention outside the open thread: a turn runs, an approval waits or
775
1352
  * there is something unread.
@@ -794,6 +1371,7 @@ declare function nhAssistantIsUnread(summary: Pick<ConversationSummary, 'status'
794
1371
  */
795
1372
  declare class NhAssistantStore {
796
1373
  private readonly api;
1374
+ private readonly agentRuns;
797
1375
  private readonly config;
798
1376
  private readonly injector;
799
1377
  private readonly accessPolicy;
@@ -826,9 +1404,13 @@ declare class NhAssistantStore {
826
1404
  private readonly queueDispatchState;
827
1405
  private readonly steeringState;
828
1406
  private readonly submittingState;
1407
+ /** Agent proposals the current user rejected in this session and may give feedback on. */
1408
+ private readonly feedbackApprovalsState;
829
1409
  private destroyed;
830
1410
  private readonly streams;
831
1411
  private readonly cancelTimers;
1412
+ /** Pending reloads of agent threads after live agent-work updates, per conversation. */
1413
+ private readonly agentWorkTimers;
832
1414
  private readonly pendingSendResolves;
833
1415
  private readonly markingRead;
834
1416
  private readonly liveSubscription;
@@ -889,7 +1471,20 @@ declare class NhAssistantStore {
889
1471
  readonly members: _angular_core.Signal<ConversationMember[]>;
890
1472
  /** True when the current user owns the open conversation (or it is new). */
891
1473
  readonly isOwner: _angular_core.Signal<boolean>;
892
- /** True when the current user may decide the pending approval: it belongs to their own turn. */
1474
+ /** True when the open conversation is the durable thread of an agent about a subject. */
1475
+ readonly isAgentThread: _angular_core.Signal<boolean>;
1476
+ /**
1477
+ * The current user's right to decide each pending approval of the open conversation, by approval
1478
+ * id. In a chat only the author of the waiting turn decides. In an agent thread the subject's
1479
+ * approvers decide, as the server reports per proposal: the approval policy, four-eyes and the
1480
+ * tool's approve policy, checked live. Proposals the user rejected in this session carry
1481
+ * `canGiveFeedback`.
1482
+ */
1483
+ readonly approvalRights: _angular_core.Signal<ReadonlyMap<string, NhAssistantApprovalRight>>;
1484
+ /**
1485
+ * True when the current user may decide the pending approval: in a chat it belongs to their own
1486
+ * turn, in an agent thread the server allows them as an approver.
1487
+ */
893
1488
  readonly canDecide: _angular_core.Signal<boolean>;
894
1489
  /** The member whose turn runs or waits in the open conversation, when it is someone else. */
895
1490
  readonly activeMember: _angular_core.Signal<ConversationMember | null>;
@@ -937,8 +1532,19 @@ declare class NhAssistantStore {
937
1532
  steerQueuedMessage(id: string): Promise<void>;
938
1533
  private dispatchQueued;
939
1534
  private sendMessage;
940
- /** Approves or rejects the pending approval. Ignores repeated calls while a decision is in flight. */
941
- decide(decision: ApprovalDecision, reason?: string): void;
1535
+ /**
1536
+ * Approves or rejects an approval of the open conversation: `approvalId`, or the pending approval
1537
+ * when it is left out. A proposal of an agent's run is decided with its proposal hash through the
1538
+ * agent-run endpoint; other approvals resume their turn as a stream. Ignores calls the current
1539
+ * user may not make and repeated calls while a decision is in flight.
1540
+ */
1541
+ decide(decision: ApprovalDecision, reason?: string, approvalId?: string): void;
1542
+ /**
1543
+ * Decides a proposal of an agent's run with `POST approvals/{id}/decisions`. An approved deferred
1544
+ * proposal executes later as a background operation; an inline one wakes the waiting run. The
1545
+ * reloaded snapshot shows the outcome and the proposals that remain open.
1546
+ */
1547
+ private decideProposal;
942
1548
  /** Asks the server to stop the running turn or to abandon a waiting approval of the open conversation. */
943
1549
  cancel(): Promise<void>;
944
1550
  private cancelConversation;
@@ -991,6 +1597,13 @@ declare class NhAssistantStore {
991
1597
  private onLiveRead;
992
1598
  private onLiveRemoved;
993
1599
  private onLiveEvent;
1600
+ /**
1601
+ * A run or proposal of an agent thread changed, for example a colleague decided a proposal in the
1602
+ * inbox: reload the thread when this tab has it open, so its approval cards show the decision.
1603
+ * A burst of updates reloads once. Feedback does not change the thread.
1604
+ */
1605
+ private onLiveAgentWork;
1606
+ private clearAgentWorkTimers;
994
1607
  /** After a reconnect: updates sent while disconnected are lost, so reload what is shown. */
995
1608
  private resync;
996
1609
  private scheduleRefresh;
@@ -1083,6 +1696,7 @@ declare const NH_ASSISTANT_PANEL_MOBILE_QUERY = "(max-width: 599.98px)";
1083
1696
  declare class NhAssistantPanelService {
1084
1697
  private readonly overlay;
1085
1698
  private readonly store;
1699
+ private readonly agentRuns;
1086
1700
  private readonly injector;
1087
1701
  private readonly document;
1088
1702
  private readonly breakpoints;
@@ -1094,6 +1708,20 @@ declare class NhAssistantPanelService {
1094
1708
  readonly isOpen: Signal<boolean>;
1095
1709
  constructor();
1096
1710
  open(conversationId?: string): void;
1711
+ /**
1712
+ * Opens the panel on the conversation with an agent about a subject, for example the intake
1713
+ * reviewer about one project. The server returns the agent's thread about the subject and creates
1714
+ * it without starting a run when it is missing; people then type in the conversation, which runs
1715
+ * a turn. Creating needs the participant role, readers may open an existing thread.
1716
+ *
1717
+ * Resolves with the lookup once the panel opens the conversation. A failure, such as
1718
+ * `assistant-subject-access-denied`, rejects with `NhAssistantApiError` and leaves the panel as
1719
+ * it is, so the caller shows the localized `messageKey` where the person asked.
1720
+ */
1721
+ openSubject(agentId: string, subject: {
1722
+ type: string;
1723
+ id: string;
1724
+ }): Promise<AgentThreadLookup>;
1097
1725
  private showPanel;
1098
1726
  close(): void;
1099
1727
  toggle(): void;
@@ -1108,6 +1736,62 @@ declare class NhAssistantPanelService {
1108
1736
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NhAssistantPanelService>;
1109
1737
  }
1110
1738
 
1739
+ /**
1740
+ * Counts of agent work per subject for badges in lists and on pages. Every summary asked for in the
1741
+ * same tick becomes one `POST subjects/{type}/summary` per subject type, in chunks of
1742
+ * `NH_ASSISTANT_MAX_SUBJECT_SUMMARY`. Results are cached per subject and shared by everyone who
1743
+ * shows it. Live agent-work updates refetch only the subjects they name, batched; a reconnect of
1744
+ * the hub refetches every subject shown. Nothing is requested on the server or while the assistant
1745
+ * is disabled or denied, and the cache clears when it becomes unavailable, for example on sign-out.
1746
+ */
1747
+ declare class NhAssistantSubjectSummaryService {
1748
+ private readonly api;
1749
+ private readonly store;
1750
+ private readonly live;
1751
+ private readonly browser;
1752
+ private readonly entries;
1753
+ /** Subject ids per type that wait for the next request. */
1754
+ private readonly queue;
1755
+ /** Subjects named by live updates that wait for the end of the burst. */
1756
+ private readonly changed;
1757
+ private requests;
1758
+ private readonly liveSubscription;
1759
+ private flushScheduled;
1760
+ private changedTimer?;
1761
+ private requestRevision;
1762
+ private destroyed;
1763
+ constructor();
1764
+ /**
1765
+ * The agent work on one subject: `null` until it is known, then every update. Subscribing shows
1766
+ * the subject; summaries of subjects that are shown stay current with live updates. The request
1767
+ * starts in the next microtask, together with every other summary asked for until then.
1768
+ */
1769
+ summary(subjectType: string, subjectId: string): Observable<AgentSubjectSummary | null>;
1770
+ /**
1771
+ * Fetches the summaries of these subjects again, or of every subject of the type that is shown,
1772
+ * for example after the application changed them without an agent.
1773
+ */
1774
+ refresh(subjectType: string, subjectIds?: readonly string[]): void;
1775
+ private watch;
1776
+ private unwatch;
1777
+ private isCurrent;
1778
+ /** Drops a summary nobody shows; the next subscriber fetches it again. */
1779
+ private forget;
1780
+ private enqueue;
1781
+ private scheduleFlush;
1782
+ /** Sends the queued subjects: one request per type and chunk. Waits while the assistant is unavailable. */
1783
+ private flush;
1784
+ private send;
1785
+ private onAgentWork;
1786
+ /** Refetches the shown subjects of a burst of live updates, together. */
1787
+ private refetchChanged;
1788
+ /** After a reconnect updates may have been missed: refetch what is shown, forget the rest. */
1789
+ private refetchShown;
1790
+ private onAvailabilityChanged;
1791
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantSubjectSummaryService, never>;
1792
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NhAssistantSubjectSummaryService>;
1793
+ }
1794
+
1111
1795
  /** Fragment the panel reads to join a shared conversation: `#nh-assistant-join=<id>.<token>`. */
1112
1796
  declare const NH_ASSISTANT_JOIN_FRAGMENT = "nh-assistant-join";
1113
1797
  /** Fragment a clicked notification opens: `#nh-assistant-conversation=<id>`. */
@@ -1149,6 +1833,77 @@ declare class NhAssistantLauncherComponent {
1149
1833
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantLauncherComponent, "nh-assistant-launcher", never, {}, {}, never, ["*"], true, never>;
1150
1834
  }
1151
1835
 
1836
+ /** A decision about one approval of the thread. */
1837
+ interface NhAssistantApprovalChoice {
1838
+ approvalId: string;
1839
+ decision: ApprovalDecision;
1840
+ }
1841
+ /** Above this number of messages the thread renders through CDK virtual scrolling. */
1842
+ declare const NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD = 200;
1843
+ /**
1844
+ * The messages of a conversation as a live log. Assistant text renders as sanitized
1845
+ * Markdown, consecutive tool calls as one collapsible group that counts along, and
1846
+ * approvals as cards. Messages a trigger wrote into an agent thread read as events, not as
1847
+ * a person. While a turn runs without visible progress, a working indicator shows the
1848
+ * elapsed time. The thread follows new content while the user is at the bottom.
1849
+ */
1850
+ declare class NhAssistantThreadComponent {
1851
+ private readonly injector;
1852
+ readonly messages: _angular_core.InputSignal<readonly Message[]>;
1853
+ readonly streaming: _angular_core.InputSignal<boolean>;
1854
+ readonly deciding: _angular_core.InputSignal<boolean>;
1855
+ readonly markdown: _angular_core.InputSignal<boolean>;
1856
+ /** The owner and participants of a shared conversation; empty while it is not shared. */
1857
+ readonly members: _angular_core.InputSignal<readonly ConversationMember[]>;
1858
+ /** The current user, to tell their own messages from those of others. */
1859
+ readonly currentActorId: _angular_core.InputSignal<string | null>;
1860
+ /** False when the pending approval belongs to another participant's turn. */
1861
+ readonly canDecide: _angular_core.InputSignal<boolean>;
1862
+ /** Name of the participant who decides the pending approval, when it is someone else. */
1863
+ readonly decisionOwner: _angular_core.InputSignal<string | null>;
1864
+ /**
1865
+ * Who may decide each pending approval, by approval id, for example `NhAssistantStore.approvalRights`.
1866
+ * An agent thread can hold several open proposals that the subject's approvers decide. Approvals
1867
+ * without an entry use `canDecide` and `decisionOwner`. An entry with `canGiveFeedback` lets the
1868
+ * card of a rejected proposal ask what was wrong.
1869
+ */
1870
+ readonly approvalRights: _angular_core.InputSignal<ReadonlyMap<string, NhAssistantApprovalRight> | null>;
1871
+ /** The decision about an approval card, without the approval it belongs to. */
1872
+ readonly approvalDecision: _angular_core.OutputEmitterRef<ApprovalDecision>;
1873
+ /** The decision about an approval card together with its approval id. */
1874
+ readonly approvalChoice: _angular_core.OutputEmitterRef<NhAssistantApprovalChoice>;
1875
+ private readonly names;
1876
+ readonly virtualThreshold = 200;
1877
+ readonly virtual: _angular_core.Signal<boolean>;
1878
+ /**
1879
+ * True while the turn runs and nothing else shows progress: before the first part and
1880
+ * between tool calls while the model decides what to do next. Streaming text and a
1881
+ * running tool group show their own progress; an approval waits for the user.
1882
+ */
1883
+ readonly working: _angular_core.Signal<boolean>;
1884
+ /** Whole seconds since the running turn started. */
1885
+ readonly elapsedSeconds: _angular_core.Signal<number>;
1886
+ private readonly turnStartedAt;
1887
+ private readonly now;
1888
+ private readonly scroller;
1889
+ private readonly viewport;
1890
+ constructor();
1891
+ trackMessage(_index: number, message: Message): string;
1892
+ /** True for a user message a trigger wrote into an agent thread. */
1893
+ isTrigger(message: Message): boolean;
1894
+ /** True for a user message written by another person in a shared conversation. */
1895
+ isOthers(message: Message): boolean;
1896
+ /** Whether and why the current user may decide an approval card. */
1897
+ rightFor(approval: ApprovalPart): NhAssistantApprovalRight;
1898
+ choose(approval: ApprovalPart, decision: ApprovalDecision): void;
1899
+ /** Display name of another person's message, or `null` when the application provides none. */
1900
+ authorName(message: Message): string | null;
1901
+ private scrollElement;
1902
+ private scrollToEnd;
1903
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantThreadComponent, never>;
1904
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantThreadComponent, "nh-assistant-thread", never, { "messages": { "alias": "messages"; "required": true; "isSignal": true; }; "streaming": { "alias": "streaming"; "required": false; "isSignal": true; }; "deciding": { "alias": "deciding"; "required": false; "isSignal": true; }; "markdown": { "alias": "markdown"; "required": false; "isSignal": true; }; "members": { "alias": "members"; "required": false; "isSignal": true; }; "currentActorId": { "alias": "currentActorId"; "required": false; "isSignal": true; }; "canDecide": { "alias": "canDecide"; "required": false; "isSignal": true; }; "decisionOwner": { "alias": "decisionOwner"; "required": false; "isSignal": true; }; "approvalRights": { "alias": "approvalRights"; "required": false; "isSignal": true; }; }, { "approvalDecision": "approvalDecision"; "approvalChoice": "approvalChoice"; }, never, never, true, never>;
1905
+ }
1906
+
1152
1907
  /**
1153
1908
  * The assistant drawer. Place it once in the application layout; it renders nothing in
1154
1909
  * place and appears as an overlay when `NhAssistantPanelService.open()` is called. It opens
@@ -1215,6 +1970,8 @@ declare class NhAssistantPanelComponent implements AfterViewInit, OnDestroy {
1215
1970
  */
1216
1971
  private openFromLocation;
1217
1972
  decide(decision: ApprovalDecision): void;
1973
+ /** Decides the approval of a card; in an agent thread several proposals can be open. */
1974
+ decideApproval(choice: NhAssistantApprovalChoice): void;
1218
1975
  cancel(): void;
1219
1976
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantPanelComponent, never>;
1220
1977
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantPanelComponent, "nh-assistant-panel", never, {}, {}, never, never, true, never>;
@@ -1241,56 +1998,6 @@ declare class NhAssistantConversationListComponent {
1241
1998
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantConversationListComponent, "nh-assistant-conversation-list", never, { "conversations": { "alias": "conversations"; "required": true; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "activeConversationId": { "alias": "activeConversationId"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "conversationSelect": "conversationSelect"; "conversationDelete": "conversationDelete"; "conversationCreate": "conversationCreate"; }, never, never, true, never>;
1242
1999
  }
1243
2000
 
1244
- /** Above this number of messages the thread renders through CDK virtual scrolling. */
1245
- declare const NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD = 200;
1246
- /**
1247
- * The messages of a conversation as a live log. Assistant text renders as sanitized
1248
- * Markdown, consecutive tool calls as one collapsible group that counts along, and
1249
- * approvals as cards. While a turn runs without visible progress, a working indicator
1250
- * shows the elapsed time. The thread follows new content while the user is at the bottom.
1251
- */
1252
- declare class NhAssistantThreadComponent {
1253
- private readonly injector;
1254
- readonly messages: _angular_core.InputSignal<readonly Message[]>;
1255
- readonly streaming: _angular_core.InputSignal<boolean>;
1256
- readonly deciding: _angular_core.InputSignal<boolean>;
1257
- readonly markdown: _angular_core.InputSignal<boolean>;
1258
- /** The owner and participants of a shared conversation; empty while it is not shared. */
1259
- readonly members: _angular_core.InputSignal<readonly ConversationMember[]>;
1260
- /** The current user, to tell their own messages from those of others. */
1261
- readonly currentActorId: _angular_core.InputSignal<string | null>;
1262
- /** False when the pending approval belongs to another participant's turn. */
1263
- readonly canDecide: _angular_core.InputSignal<boolean>;
1264
- /** Name of the participant who decides the pending approval, when it is someone else. */
1265
- readonly decisionOwner: _angular_core.InputSignal<string | null>;
1266
- readonly approvalDecision: _angular_core.OutputEmitterRef<ApprovalDecision>;
1267
- private readonly names;
1268
- readonly virtualThreshold = 200;
1269
- readonly virtual: _angular_core.Signal<boolean>;
1270
- /**
1271
- * True while the turn runs and nothing else shows progress: before the first part and
1272
- * between tool calls while the model decides what to do next. Streaming text and a
1273
- * running tool group show their own progress; an approval waits for the user.
1274
- */
1275
- readonly working: _angular_core.Signal<boolean>;
1276
- /** Whole seconds since the running turn started. */
1277
- readonly elapsedSeconds: _angular_core.Signal<number>;
1278
- private readonly turnStartedAt;
1279
- private readonly now;
1280
- private readonly scroller;
1281
- private readonly viewport;
1282
- constructor();
1283
- trackMessage(_index: number, message: Message): string;
1284
- /** True for a user message written by another person in a shared conversation. */
1285
- isOthers(message: Message): boolean;
1286
- /** Display name of another person's message, or `null` when the application provides none. */
1287
- authorName(message: Message): string | null;
1288
- private scrollElement;
1289
- private scrollToEnd;
1290
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantThreadComponent, never>;
1291
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantThreadComponent, "nh-assistant-thread", never, { "messages": { "alias": "messages"; "required": true; "isSignal": true; }; "streaming": { "alias": "streaming"; "required": false; "isSignal": true; }; "deciding": { "alias": "deciding"; "required": false; "isSignal": true; }; "markdown": { "alias": "markdown"; "required": false; "isSignal": true; }; "members": { "alias": "members"; "required": false; "isSignal": true; }; "currentActorId": { "alias": "currentActorId"; "required": false; "isSignal": true; }; "canDecide": { "alias": "canDecide"; "required": false; "isSignal": true; }; "decisionOwner": { "alias": "decisionOwner"; "required": false; "isSignal": true; }; }, { "approvalDecision": "approvalDecision"; }, never, never, true, never>;
1292
- }
1293
-
1294
2001
  /**
1295
2002
  * Message input. Enter sends when sending is available; Shift+Enter inserts a new line.
1296
2003
  * Drafting remains available while the assistant runs or waits for approval.
@@ -1351,8 +2058,12 @@ declare class NhAssistantToolCallCardComponent {
1351
2058
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantToolCallCardComponent, "nh-assistant-tool-call-card", never, { "part": { "alias": "part"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1352
2059
  }
1353
2060
 
1354
- /** Overall state of a run of tool calls, from most to least urgent. */
1355
- type NhAssistantToolCallGroupState = 'awaiting-approval' | 'running' | 'failed' | 'succeeded';
2061
+ /**
2062
+ * Overall state of a run of tool calls, from most to least urgent. `not-executed` means that every
2063
+ * call finished and at least one ended without running, because its proposal expired, was
2064
+ * withdrawn or became stale.
2065
+ */
2066
+ type NhAssistantToolCallGroupState = 'awaiting-approval' | 'running' | 'failed' | 'not-executed' | 'succeeded';
1356
2067
  /**
1357
2068
  * Summarizes consecutive tool calls in one collapsed line that counts along live: the
1358
2069
  * tool that runs now while the assistant works, and how many tools were used and failed
@@ -1367,6 +2078,8 @@ declare class NhAssistantToolCallGroupComponent {
1367
2078
  readonly total: _angular_core.Signal<number>;
1368
2079
  readonly finished: _angular_core.Signal<number>;
1369
2080
  readonly failed: _angular_core.Signal<number>;
2081
+ /** Calls that finished without running; they never wait. */
2082
+ readonly notExecuted: _angular_core.Signal<number>;
1370
2083
  readonly state: _angular_core.Signal<NhAssistantToolCallGroupState>;
1371
2084
  readonly stateIcon: _angular_core.Signal<NhAssistantIconName>;
1372
2085
  toggle(): void;
@@ -1379,33 +2092,120 @@ declare function formatNhAssistantCountdown(milliseconds: number): string;
1379
2092
  /**
1380
2093
  * Asks the user to approve or reject a proposed mutation. Shows the summary, targets,
1381
2094
  * proposed arguments and a countdown to expiry. A decision is emitted at most once until
1382
- * the host reports that it is no longer deciding.
2095
+ * the host reports that it is no longer deciding. After the user rejected an agent's proposal
2096
+ * (`canGiveFeedback`), a low-key action asks what was wrong.
1383
2097
  */
1384
2098
  declare class NhAssistantApprovalCardComponent {
1385
2099
  readonly approval: _angular_core.InputSignal<ApprovalPart>;
1386
2100
  /** True while the host submits a decision; disables both buttons. */
1387
2101
  readonly deciding: _angular_core.InputSignal<boolean>;
1388
2102
  /**
1389
- * False when the approval belongs to another participant's turn: only the person whose
1390
- * permissions the action would use may decide it.
2103
+ * False when the current user may not decide: in a chat the approval belongs to another
2104
+ * participant's turn, in an agent thread the user is no approver of the proposal.
1391
2105
  */
1392
2106
  readonly canDecide: _angular_core.InputSignal<boolean>;
1393
- /** Name of the participant who decides, shown when the current user cannot. */
2107
+ /** Name of the participant who decides a `turn` approval, shown when the current user cannot. */
1394
2108
  readonly decisionOwner: _angular_core.InputSignal<string | null>;
2109
+ /**
2110
+ * Who decides when the current user cannot: the author of the turn (`turn`, the default), an
2111
+ * approver of the agent thread's subject (`approver`), or another approver because the current
2112
+ * user started the work (`other-approver`).
2113
+ */
2114
+ readonly waitingFor: _angular_core.InputSignal<NhAssistantApprovalWaitingFor>;
2115
+ /**
2116
+ * True when the current user rejected this agent proposal and may say what was wrong, for example
2117
+ * from `NhAssistantStore.approvalRights`. Chat approvals never offer feedback.
2118
+ */
2119
+ readonly canGiveFeedback: _angular_core.InputSignal<boolean>;
1395
2120
  readonly decide: _angular_core.OutputEmitterRef<ApprovalDecision>;
1396
2121
  private readonly now;
1397
2122
  private readonly submitted;
2123
+ /** The feedback question is expanded. */
2124
+ readonly feedbackOpen: _angular_core.WritableSignal<boolean>;
2125
+ /** The feedback was stored; the question thanks the person and the action disappears. */
2126
+ readonly feedbackSaved: _angular_core.WritableSignal<boolean>;
2127
+ private readonly feedbackToggle;
1398
2128
  readonly remainingMs: _angular_core.Signal<number>;
1399
2129
  readonly expired: _angular_core.Signal<boolean>;
1400
2130
  readonly effectiveStatus: _angular_core.Signal<ApprovalStatus>;
1401
2131
  readonly actionable: _angular_core.Signal<boolean>;
2132
+ readonly succeeded: _angular_core.Signal<boolean>;
1402
2133
  readonly disabled: _angular_core.Signal<boolean>;
1403
2134
  readonly countdown: _angular_core.Signal<string>;
1404
2135
  readonly presentedSummary: _angular_core.Signal<string | null>;
2136
+ readonly feedbackAvailable: _angular_core.Signal<boolean>;
2137
+ readonly feedbackIds: _angular_core.Signal<string[]>;
2138
+ readonly feedbackPanelId: string;
2139
+ /** Translation key of the text shown instead of the buttons when the current user cannot decide. */
2140
+ readonly waitingKey: _angular_core.Signal<"nh-assistant.approval.waiting-for-approver" | "nh-assistant.approval.waiting-for-other-approver" | "nh-assistant.approval.waiting-for" | "nh-assistant.approval.waiting-for-participant">;
1405
2141
  constructor();
1406
2142
  choose(decision: ApprovalDecision): void;
2143
+ toggleFeedback(): void;
2144
+ onFeedbackSaved(): void;
2145
+ /** Collapses the question and returns focus to the action that opened it. */
2146
+ onFeedbackDismissed(): void;
1407
2147
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantApprovalCardComponent, never>;
1408
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantApprovalCardComponent, "nh-assistant-approval-card", never, { "approval": { "alias": "approval"; "required": true; "isSignal": true; }; "deciding": { "alias": "deciding"; "required": false; "isSignal": true; }; "canDecide": { "alias": "canDecide"; "required": false; "isSignal": true; }; "decisionOwner": { "alias": "decisionOwner"; "required": false; "isSignal": true; }; }, { "decide": "decide"; }, never, never, true, never>;
2148
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantApprovalCardComponent, "nh-assistant-approval-card", never, { "approval": { "alias": "approval"; "required": true; "isSignal": true; }; "deciding": { "alias": "deciding"; "required": false; "isSignal": true; }; "canDecide": { "alias": "canDecide"; "required": false; "isSignal": true; }; "decisionOwner": { "alias": "decisionOwner"; "required": false; "isSignal": true; }; "waitingFor": { "alias": "waitingFor"; "required": false; "isSignal": true; }; "canGiveFeedback": { "alias": "canGiveFeedback"; "required": false; "isSignal": true; }; }, { "decide": "decide"; }, never, never, true, never>;
2149
+ }
2150
+
2151
+ /** What `nh-assistant-proposal-feedback` stored. */
2152
+ interface NhAssistantProposalFeedbackSaved {
2153
+ /** The proposals whose feedback the server stored. */
2154
+ approvalIds: string[];
2155
+ category: AgentProposalFeedbackCategory;
2156
+ text: string | null;
2157
+ }
2158
+ /**
2159
+ * Asks, after a rejection, what was wrong with one or more agent proposals: a category from a fixed
2160
+ * set and an optional text. It is optional and never blocks the decision; people skip it with one
2161
+ * action. One proposal is sent with `PUT approvals/{id}/feedback`, several rejected together with
2162
+ * `POST approvals/feedback` as bulk feedback. With `initial` it changes the caller's own feedback.
2163
+ * After saving it thanks the person in place of the form; hosts remove it after `dismissed`.
2164
+ */
2165
+ declare class NhAssistantProposalFeedbackComponent {
2166
+ private readonly api;
2167
+ private readonly host;
2168
+ private readonly document;
2169
+ private readonly injector;
2170
+ private readonly thanks;
2171
+ private subscription?;
2172
+ /** The proposals the feedback is about; several when they were rejected together. */
2173
+ readonly approvalIds: _angular_core.InputSignal<readonly string[]>;
2174
+ /** The caller's current feedback, to change it; `null` for new feedback. */
2175
+ readonly initial: _angular_core.InputSignal<AgentProposalFeedback | null>;
2176
+ /** Emits after the server stored the feedback. */
2177
+ readonly saved: _angular_core.OutputEmitterRef<NhAssistantProposalFeedbackSaved>;
2178
+ /** Emits when the person skips the question. */
2179
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
2180
+ readonly id: string;
2181
+ readonly categories: readonly AgentProposalFeedbackCategory[];
2182
+ readonly maxText = 1000;
2183
+ /** A new question when the host passes other proposals or other initial feedback. */
2184
+ private readonly question;
2185
+ readonly category: _angular_core.WritableSignal<AgentProposalFeedbackCategory | null>;
2186
+ readonly text: _angular_core.WritableSignal<string>;
2187
+ readonly busy: _angular_core.WritableSignal<boolean>;
2188
+ readonly done: _angular_core.WritableSignal<boolean>;
2189
+ /** Set when a bulk request stored the feedback for only part of the proposals. */
2190
+ readonly partial: _angular_core.WritableSignal<{
2191
+ stored: number;
2192
+ total: number;
2193
+ } | null>;
2194
+ readonly error: _angular_core.WritableSignal<NhAssistantError | null>;
2195
+ readonly errorKeys: _angular_core.Signal<string[]>;
2196
+ readonly count: _angular_core.Signal<number>;
2197
+ readonly textLength: _angular_core.Signal<number>;
2198
+ readonly tooLong: _angular_core.Signal<boolean>;
2199
+ readonly canSend: _angular_core.Signal<boolean>;
2200
+ constructor();
2201
+ choose(category: AgentProposalFeedbackCategory): void;
2202
+ onText(event: Event): void;
2203
+ dismiss(): void;
2204
+ send(): void;
2205
+ /** One proposal through its own endpoint; several in requests of at most the bulk limit. */
2206
+ private request;
2207
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantProposalFeedbackComponent, never>;
2208
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantProposalFeedbackComponent, "nh-assistant-proposal-feedback", never, { "approvalIds": { "alias": "approvalIds"; "required": true; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "dismissed": "dismissed"; }, never, never, true, never>;
1409
2209
  }
1410
2210
 
1411
2211
  /**
@@ -1533,6 +2333,30 @@ declare class NhAssistantActivityComponent {
1533
2333
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantActivityComponent, "nh-assistant-activity", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "conversationSelect": "conversationSelect"; }, never, never, true, never>;
1534
2334
  }
1535
2335
 
2336
+ /**
2337
+ * A compact count of the agent work on one subject, for example on each row of a project list.
2338
+ * It shows nothing while the subject has no work. Otherwise it shows the number of proposals the
2339
+ * viewer may decide in the accent color, or, when they may decide none, a neutral count of the
2340
+ * open proposals, and a small working indicator while an agent works on the subject. Its tooltip
2341
+ * and accessible name say both counts. Badges on one page share one summary request per tick and
2342
+ * refresh on live agent-work updates of their subject; see `NhAssistantSubjectSummaryService`.
2343
+ */
2344
+ declare class NhAssistantSubjectBadgeComponent {
2345
+ private readonly summaries;
2346
+ private readonly summary;
2347
+ /** The application's kind of subject, for example `project`. */
2348
+ readonly subjectType: _angular_core.InputSignal<string>;
2349
+ readonly subjectId: _angular_core.InputSignal<string>;
2350
+ /** The summary while the subject has work to show; `null` otherwise. */
2351
+ readonly work: _angular_core.Signal<AgentSubjectSummary | null>;
2352
+ readonly count: _angular_core.Signal<number>;
2353
+ readonly countLabel: _angular_core.Signal<string>;
2354
+ readonly proposalsKey: _angular_core.Signal<"nh-assistant.subject-badge.to-decide" | "nh-assistant.subject-badge.open" | null>;
2355
+ constructor();
2356
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NhAssistantSubjectBadgeComponent, never>;
2357
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NhAssistantSubjectBadgeComponent, "nh-assistant-subject-badge", never, { "subjectType": { "alias": "subjectType"; "required": true; "isSignal": true; }; "subjectId": { "alias": "subjectId"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
2358
+ }
2359
+
1536
2360
  /**
1537
2361
  * Translates the first key that has a translation and otherwise returns the fallback text.
1538
2362
  * Used for server-provided keys (agent names, error message keys, result codes) that the
@@ -1551,6 +2375,14 @@ declare class NhAssistantTranslatePipe implements PipeTransform {
1551
2375
  static ɵpipe: _angular_core.ɵɵPipeDeclaration<NhAssistantTranslatePipe, "nhAssistantTranslate", true>;
1552
2376
  }
1553
2377
 
2378
+ /**
2379
+ * Calls `reload` once a burst of live agent-work updates that `matches` has settled, and after
2380
+ * every (re)connect of the hub, because updates sent while it was disconnected are lost. Without a
2381
+ * live service or a connected hub nothing arrives and the view keeps its manual refresh. Call it in
2382
+ * an injection context, for example a component constructor; it stops when that context ends.
2383
+ */
2384
+ declare function nhAssistantReloadOnAgentWork(matches: (change: LiveAgentWorkChanged) => boolean, reload: () => void): void;
2385
+
1554
2386
  /** Converts any failure into a user-facing code and translation key, never raw text. */
1555
2387
  declare function toNhAssistantError(error: unknown): NhAssistantError;
1556
2388
  /** Translation keys for an error, from the most to the least specific. */
@@ -1558,5 +2390,5 @@ declare function nhAssistantErrorKeys(error: NhAssistantError | null): string[];
1558
2390
  /** Dash-case identifiers as the contract requires for agent and MCP server ids. */
1559
2391
  declare const NH_ASSISTANT_DASH_CASE: RegExp;
1560
2392
 
1561
- export { NH_ASSISTANT_ACCESS_POLICY, NH_ASSISTANT_CONFIG, NH_ASSISTANT_CONVERSATION_FRAGMENT, NH_ASSISTANT_FETCH, NH_ASSISTANT_ICONS, NH_ASSISTANT_JOIN_FRAGMENT, NH_ASSISTANT_MAX_CUSTOM_INSTRUCTIONS, NH_ASSISTANT_NO_ANSWER_NOTICE_CODE, NH_ASSISTANT_PAGE_CONTEXT_LIMITS, NH_ASSISTANT_PANEL_MOBILE_QUERY, NH_ASSISTANT_PANEL_WIDTH, NH_ASSISTANT_SSE_EVENT_TYPES, NH_ASSISTANT_TRANSLATIONS, NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD, NhAssistantActivityComponent, NhAssistantAdminApiService, NhAssistantAgentPickerComponent, NhAssistantAllowAllAccessPolicy, NhAssistantApiError, NhAssistantApiService, NhAssistantApprovalCardComponent, NhAssistantClientErrorCodes, NhAssistantComposerComponent, NhAssistantConversationListComponent, NhAssistantLauncherComponent, NhAssistantLiveService, NhAssistantPanelComponent, NhAssistantPanelService, NhAssistantPreferencesComponent, NhAssistantPushService, NhAssistantShareComponent, NhAssistantSseParser, NhAssistantStore, NhAssistantThreadComponent, NhAssistantToolCallCardComponent, NhAssistantToolCallGroupComponent, NhAssistantTranslationMerger, applyNhAssistantApprovalDecision, applyNhAssistantConversationChange, applyNhAssistantEvent, applyNhAssistantLiveEvent, describeNhAssistantClientContext, formatNhAssistantCountdown, nhAssistantCodeForStatus, nhAssistantErrorMessageKey, nhAssistantIsUnread, nhAssistantLatestTurnHasText, nhAssistantShareLink, normalizeNhAssistantClientContext, provideNhAssistant, NH_ASSISTANT_DASH_CASE as ɵNH_ASSISTANT_DASH_CASE, NhAssistantIconComponent as ɵNhAssistantIconComponent, NhAssistantTranslatePipe as ɵNhAssistantTranslatePipe, nhAssistantErrorKeys as ɵnhAssistantErrorKeys, toNhAssistantError as ɵtoNhAssistantError };
1562
- export type { AdminAgent, AdminAgentInput, AgentSummary, ApplicationContext, ApplicationContextVersion, ApprovalDecision, ApprovalPart, ApprovalPresentation, ApprovalPresentationField, ApprovalRequiredEvent, ApprovalStatus, AssistantAddressForm, AssistantAutonomy, AssistantCollaboration, AssistantErrorEvent, AssistantPreferences, AssistantResponseLength, AssistantStatus, AssistantStyle, ClientContext, ClientContextEntity, Conversation, ConversationMember, ConversationPage, ConversationRole, ConversationStatus, ConversationSummary, CreateConversationRequest, DecideApprovalRequest, DirectoryEntry, LiveConversationChanged, LiveConversationEvent, LiveConversationRead, LiveConversationRemoved, McpAuthMode, McpServer, McpServerInput, McpServerTestResult, McpTool, McpToolEffect, McpToolStatus, Message, MessageDeltaEvent, MessagePart, NhAssistantAccessPolicy, NhAssistantActivity, NhAssistantClientContext, NhAssistantClientErrorCode, NhAssistantConfig, NhAssistantError, NhAssistantFetch, NhAssistantIconName, NhAssistantLiveState, NhAssistantNotice, NhAssistantPushConfig, NhAssistantPushState, NhAssistantQueuedMessage, NhAssistantRawSseMessage, NhAssistantSseEvent, NhAssistantSseEventMap, NhAssistantSseEventType, NhAssistantStatusCodes, NhAssistantToolCallGroupState, NotificationSettings, PushSubscriptionRequest, SendMessageRequest, ShareLink, TextPart, ToolCallPart, ToolCallStatus, ToolCatalogEffect, ToolCatalogEntry, ToolCompletedEvent, ToolStartedEvent, TurnCompletedEvent, TurnCompletionStatus, TurnStartedEvent, TurnUsage, UpdateAdminAgentRequest, UpdateApplicationContextRequest, UpdateMcpToolRequest };
2393
+ export { NH_ASSISTANT_ACCESS_POLICY, NH_ASSISTANT_CONFIG, NH_ASSISTANT_CONVERSATION_FRAGMENT, NH_ASSISTANT_FEEDBACK_CATEGORIES, NH_ASSISTANT_FEEDBACK_GROUPS, NH_ASSISTANT_FETCH, NH_ASSISTANT_ICONS, NH_ASSISTANT_JOIN_FRAGMENT, NH_ASSISTANT_MAX_BULK_FEEDBACK, NH_ASSISTANT_MAX_CUSTOM_INSTRUCTIONS, NH_ASSISTANT_MAX_FEEDBACK_TEXT, NH_ASSISTANT_MAX_SUBJECT_SUMMARY, NH_ASSISTANT_NO_ANSWER_NOTICE_CODE, NH_ASSISTANT_PAGE_CONTEXT_LIMITS, NH_ASSISTANT_PANEL_MOBILE_QUERY, NH_ASSISTANT_PANEL_WIDTH, NH_ASSISTANT_SSE_EVENT_TYPES, NH_ASSISTANT_TRANSLATIONS, NH_ASSISTANT_VIRTUAL_SCROLL_THRESHOLD, NhAssistantActivityComponent, NhAssistantAdminApiService, NhAssistantAgentPickerComponent, NhAssistantAgentRunApiService, NhAssistantAllowAllAccessPolicy, NhAssistantApiError, NhAssistantApiService, NhAssistantApprovalCardComponent, NhAssistantClientErrorCodes, NhAssistantComposerComponent, NhAssistantConversationListComponent, NhAssistantLauncherComponent, NhAssistantLiveService, NhAssistantPanelComponent, NhAssistantPanelService, NhAssistantPreferencesComponent, NhAssistantProposalFeedbackComponent, NhAssistantPushService, NhAssistantShareComponent, NhAssistantSseParser, NhAssistantStore, NhAssistantSubjectBadgeComponent, NhAssistantSubjectSummaryService, NhAssistantThreadComponent, NhAssistantToolCallCardComponent, NhAssistantToolCallGroupComponent, NhAssistantTranslationMerger, applyNhAssistantApprovalDecision, applyNhAssistantConversationChange, applyNhAssistantEvent, applyNhAssistantLiveEvent, describeNhAssistantClientContext, formatNhAssistantCountdown, nhAssistantCodeForStatus, nhAssistantErrorMessageKey, nhAssistantIsUnread, nhAssistantLatestTurnHasText, nhAssistantShareLink, normalizeNhAssistantClientContext, provideNhAssistant, NH_ASSISTANT_DASH_CASE as ɵNH_ASSISTANT_DASH_CASE, NhAssistantIconComponent as ɵNhAssistantIconComponent, NhAssistantTranslatePipe as ɵNhAssistantTranslatePipe, nhAssistantErrorKeys as ɵnhAssistantErrorKeys, nhAssistantReloadOnAgentWork as ɵnhAssistantReloadOnAgentWork, toNhAssistantError as ɵtoNhAssistantError };
2394
+ export type { AdminAgent, AdminAgentInput, AgentArtifact, AgentConsultation, AgentConsultationList, AgentConsultationStatus, AgentDecisionOutcome, AgentExecutionResolution, AgentFeedbackCategoryCount, AgentFeedbackExportFilter, AgentFeedbackFilter, AgentFeedbackItem, AgentFeedbackList, AgentFeedbackListFilter, AgentFeedbackOutcome, AgentFeedbackSummary, AgentFeedbackSummaryRow, AgentGrantSource, AgentInbox, AgentInboxFilter, AgentProposal, AgentProposalDecision, AgentProposalDecisionRight, AgentProposalFeedback, AgentProposalFeedbackCategory, AgentProposalFeedbackGroup, AgentProposalStatus, AgentRun, AgentRunList, AgentRunRetryMode, AgentRunStatus, AgentSubjectRole, AgentSubjectSummary, AgentSubjectSummaryList, AgentSubjectWork, AgentSubjectWorkAgent, AgentSubjectWorkProposal, AgentSummary, AgentThread, AgentThreadLookup, AgentThreadMemory, AgentTriggerReceipt, ApplicationContext, ApplicationContextVersion, ApprovalDecision, ApprovalPart, ApprovalPresentation, ApprovalPresentationField, ApprovalRequiredEvent, ApprovalStatus, AssistantAddressForm, AssistantAutonomy, AssistantCollaboration, AssistantErrorEvent, AssistantPreferences, AssistantResponseLength, AssistantStatus, AssistantStyle, ClientContext, ClientContextEntity, Conversation, ConversationKind, ConversationMember, ConversationPage, ConversationRole, ConversationStatus, ConversationSummary, ConversationThread, ConversationThreadDecision, CreateConversationRequest, DecideApprovalRequest, DirectoryEntry, LiveAgentWorkChanged, LiveAgentWorkReason, LiveConversationChanged, LiveConversationEvent, LiveConversationRead, LiveConversationRemoved, McpAuthMode, McpServer, McpServerInput, McpServerTestResult, McpTool, McpToolEffect, McpToolStatus, Message, MessageAuthorKind, MessageDeltaEvent, MessagePart, NhAssistantAccessPolicy, NhAssistantActivity, NhAssistantApprovalChoice, NhAssistantApprovalRight, NhAssistantApprovalWaitingFor, NhAssistantClientContext, NhAssistantClientErrorCode, NhAssistantConfig, NhAssistantError, NhAssistantFetch, NhAssistantIconName, NhAssistantLiveState, NhAssistantNotice, NhAssistantProposalFeedbackSaved, NhAssistantPushConfig, NhAssistantPushState, NhAssistantQueuedMessage, NhAssistantRawSseMessage, NhAssistantSseEvent, NhAssistantSseEventMap, NhAssistantSseEventType, NhAssistantStatusCodes, NhAssistantToolCallGroupState, NotificationSettings, PushSubscriptionRequest, SendMessageRequest, ShareLink, StartAgentRequest, TextPart, ToolCallPart, ToolCallStatus, ToolCatalogEffect, ToolCatalogEntry, ToolCompletedEvent, ToolStartedEvent, TurnCompletedEvent, TurnCompletionStatus, TurnStartedEvent, TurnUsage, UpdateAdminAgentRequest, UpdateApplicationContextRequest, UpdateMcpToolRequest };