@newheap/platform-ai-chat 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +185 -3
- package/admin/index.d.ts +79 -4
- package/agent-runs/index.d.ts +342 -0
- package/fesm2022/newheap-platform-ai-chat-admin.mjs +231 -12
- package/fesm2022/newheap-platform-ai-chat-admin.mjs.map +1 -1
- package/fesm2022/newheap-platform-ai-chat-agent-runs.mjs +905 -0
- package/fesm2022/newheap-platform-ai-chat-agent-runs.mjs.map +1 -0
- package/fesm2022/newheap-platform-ai-chat-testing.mjs +30 -1
- package/fesm2022/newheap-platform-ai-chat-testing.mjs.map +1 -1
- package/fesm2022/newheap-platform-ai-chat.mjs +1746 -80
- package/fesm2022/newheap-platform-ai-chat.mjs.map +1 -1
- package/i18n/en.json +304 -8
- package/i18n/nl.json +304 -8
- package/index.d.ts +899 -67
- package/package.json +5 -1
- package/testing/index.d.ts +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newheap-platform-ai-chat-agent-runs.mjs","sources":["../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-proposals.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-proposals.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-inbox.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-inbox.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-artifacts.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-artifacts.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-consultations.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-consultations.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-memory.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-memory.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-run-timeline.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-run-timeline.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-thread-view.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-agent-thread-view.component.html","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-subject-suggestions.component.ts","../../../projects/nh-ai-chat/agent-runs/src/nh-assistant-subject-suggestions.component.html","../../../projects/nh-ai-chat/agent-runs/src/public-api.ts","../../../projects/nh-ai-chat/agent-runs/src/newheap-platform-ai-chat-agent-runs.ts"],"sourcesContent":["import { DatePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n afterNextRender,\n computed,\n inject,\n input,\n output,\n signal\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable, Subscription } from 'rxjs';\nimport {\n AgentExecutionResolution,\n AgentProposal,\n AgentProposalDecision,\n AgentProposalDecisionRight,\n AgentProposalFeedback,\n NhAssistantAgentRunApiService,\n NhAssistantError,\n NhAssistantProposalFeedbackComponent,\n ɵnhAssistantErrorKeys as nhAssistantErrorKeys,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵNhAssistantTranslatePipe as NhAssistantTranslatePipe,\n ɵtoNhAssistantError as toNhAssistantError\n} from '@newheap/platform-ai-chat';\n\n/** A feedback question: after a rejection above the list, or from a card's own action. */\ninterface NhAssistantFeedbackRequest {\n approvalIds: string[];\n initial: AgentProposalFeedback | null;\n placement: 'prompt' | 'card';\n /** What was rejected, for a single rejection. */\n summary: string | null;\n /** The feedback was stored; the panel thanks the person until the next action. */\n saved: boolean;\n}\n\n/**\n * A list of agent proposals with their decision and execution state. People who may decide see\n * approve and reject on pending proposals and the resolution of an execution with an unknown\n * outcome; the server checks every decision again. With `selectable`, pending proposals can be\n * approved or rejected together. Deciding takes one action. After a rejection the list asks,\n * optionally and above the list, what was wrong; closed proposals keep a low-key action to give or\n * change that feedback later. With `decisionRights` each proposal has its own right, for example\n * from the agent work on a subject, and a pending proposal the viewer may not decide says who does.\n */\n@Component({\n selector: 'nh-assistant-agent-proposals',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent, NhAssistantProposalFeedbackComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-agent-proposals.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantAgentProposalsComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private subscription?: Subscription;\n\n readonly proposals = input.required<AgentProposal[]>();\n /** Whether the caller may decide: an approver of the subjects or the inbox owner. */\n readonly canDecide = input(false);\n /**\n * The caller's live right per proposal, by approval id, for example from\n * `AgentSubjectWork.openProposals`. A proposal with a right uses it instead of `canDecide`.\n */\n readonly decisionRights = input<ReadonlyMap<string, AgentProposalDecisionRight> | null>(null);\n readonly selectable = input(false);\n /** Emits after a proposal or its feedback changed, so the host reloads its list. */\n readonly changed = output<void>();\n\n readonly busy = signal(false);\n readonly selected = signal<ReadonlySet<string>>(new Set());\n readonly error = signal<NhAssistantError | null>(null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n /** Pending proposals the caller may decide. */\n readonly pending = computed(() =>\n this.proposals().filter(proposal => proposal.status === 'pending' && this.mayDecide(proposal)));\n readonly allSelected = computed(() =>\n this.pending().length > 0 && this.pending().every(proposal => this.selected().has(proposal.approvalId)));\n /** The feedback question. It does not depend on `proposals`, which drop rejected proposals in the inbox. */\n readonly feedback = signal<NhAssistantFeedbackRequest | null>(null);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n }\n\n /** Whether the caller may decide this proposal: its own right when one was given, otherwise `canDecide`. */\n mayDecide(proposal: AgentProposal): boolean {\n const right = this.decisionRights()?.get(proposal.approvalId);\n return right ? right.canDecide : this.canDecide();\n }\n\n /**\n * Who decides a pending proposal that has a right the caller lacks: another approver when\n * four-eyes keeps out the person who started the work, otherwise an approver.\n */\n waitingForKey(proposal: AgentProposal): string | null {\n const right = this.decisionRights()?.get(proposal.approvalId);\n if (!right || right.canDecide || proposal.status !== 'pending') {\n return null;\n }\n\n return right.reasonCode === 'assistant-four-eyes-required'\n ? 'nh-assistant.approval.waiting-for-other-approver'\n : 'nh-assistant.approval.waiting-for-approver';\n }\n\n toggle(proposal: AgentProposal): void {\n const next = new Set(this.selected());\n if (next.has(proposal.approvalId)) {\n next.delete(proposal.approvalId);\n } else {\n next.add(proposal.approvalId);\n }\n this.selected.set(next);\n }\n\n toggleAll(): void {\n this.selected.set(this.allSelected() ? new Set() : new Set(this.pending().map(proposal => proposal.approvalId)));\n }\n\n decide(proposal: AgentProposal, decision: AgentProposalDecision): void {\n this.run(this.api.decide(proposal, decision), result => {\n if (decision === 'reject' && result.status === 'rejected' && result.canGiveFeedback === true) {\n this.ask([proposal.approvalId], summaryOf(proposal));\n }\n });\n }\n\n decideSelected(decision: AgentProposalDecision): void {\n const ids = [...this.selected()];\n if (ids.length === 0) {\n return;\n }\n\n const proposals = this.proposals();\n this.run(this.api.decideMany(ids, decision), response => {\n this.selected.set(new Set());\n if (decision !== 'reject') {\n return;\n }\n\n const rejected = response.results\n .filter(outcome => outcome.succeeded && outcome.status === 'rejected')\n .map(outcome => outcome.approvalId);\n if (rejected.length > 0) {\n const single = rejected.length === 1 ? proposals.find(proposal => proposal.approvalId === rejected[0]) : undefined;\n this.ask(rejected, single ? summaryOf(single) : null);\n }\n });\n }\n\n resolve(proposal: AgentProposal, action: AgentExecutionResolution): void {\n this.run(this.api.resolve(proposal.approvalId, action));\n }\n\n /** Opens the feedback question in the card of a closed proposal, with the caller's own feedback. */\n giveFeedback(proposal: AgentProposal): void {\n this.feedback.set({\n approvalIds: [proposal.approvalId],\n initial: proposal.feedback ?? null,\n placement: 'card',\n summary: null,\n saved: false\n });\n }\n\n /** True while the feedback question for this proposal is open, above the list or in its card. */\n isAsking(proposal: AgentProposal): boolean {\n const request = this.feedback();\n return request !== null && !request.saved && request.approvalIds.includes(proposal.approvalId);\n }\n\n /** True when the card of this proposal shows the feedback question or its thanks. */\n inCard(proposal: AgentProposal): boolean {\n const request = this.feedback();\n return request?.placement === 'card' && request.approvalIds[0] === proposal.approvalId;\n }\n\n /** Keeps the panel, which now thanks the person, and lets the host reload the proposals. */\n onFeedbackSaved(): void {\n this.feedback.update(request => request ? { ...request, saved: true } : request);\n this.changed.emit();\n }\n\n /** Closes the question; from a card, focus returns to the card's feedback action. */\n onFeedbackDismissed(): void {\n const request = this.feedback();\n this.feedback.set(null);\n if (request?.placement !== 'card') {\n return;\n }\n\n const [approvalId] = request.approvalIds;\n afterNextRender(() => {\n const action = Array.from(this.host.nativeElement.querySelectorAll<HTMLButtonElement>('[data-feedback-approval]'))\n .find(item => item.dataset['feedbackApproval'] === approvalId);\n action?.focus();\n }, { injector: this.injector });\n }\n\n private ask(approvalIds: string[], summary: string | null): void {\n this.feedback.set({ approvalIds, initial: null, placement: 'prompt', summary, saved: false });\n }\n\n private run<T>(request: Observable<T>, done?: (result: T) => void): void {\n this.busy.set(true);\n this.error.set(null);\n if (this.feedback()?.saved) {\n this.feedback.set(null);\n }\n this.subscription?.unsubscribe();\n this.subscription = request.subscribe({\n next: result => {\n this.busy.set(false);\n done?.(result);\n this.changed.emit();\n },\n error: failure => {\n this.busy.set(false);\n this.error.set(toNhAssistantError(failure));\n this.changed.emit();\n }\n });\n }\n}\n\n/** The application's words for a proposal, falling back to its subject and tool. */\nfunction summaryOf(proposal: AgentProposal): string {\n return proposal.presentation?.summary\n ?? `${proposal.subjectDisplayName ?? proposal.subjectId} · ${proposal.presentation?.toolDisplayName ?? proposal.toolId}`;\n}\n","<div class=\"proposal-list\">\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 @if (feedback(); as request) {\n @if (request.placement === 'prompt') {\n <div class=\"feedback-prompt\">\n @if (request.summary && !request.saved) {\n <p class=\"muted\">{{ 'nh-assistant.agent-runs.proposal.rejected-one' | translate: { summary: request.summary } }}</p>\n }\n <nh-assistant-proposal-feedback\n [approvalIds]=\"request.approvalIds\"\n [initial]=\"request.initial\"\n (saved)=\"onFeedbackSaved()\"\n (dismissed)=\"onFeedbackDismissed()\" />\n </div>\n }\n }\n\n @if (selectable() && pending().length > 0) {\n <div class=\"toolbar\">\n <label class=\"select\">\n <input type=\"checkbox\" [checked]=\"allSelected()\" [disabled]=\"busy()\" (change)=\"toggleAll()\" />\n {{ 'nh-assistant.agent-runs.inbox.select-all' | translate }}\n </label>\n <button class=\"primary\" type=\"button\" [disabled]=\"busy() || selected().size === 0\" (click)=\"decideSelected('approve')\">\n <nh-assistant-icon name=\"check\" />{{ 'nh-assistant.agent-runs.inbox.approve-selected' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy() || selected().size === 0\" (click)=\"decideSelected('reject')\">\n <nh-assistant-icon name=\"x\" />{{ 'nh-assistant.agent-runs.inbox.reject-selected' | translate }}\n </button>\n </div>\n }\n\n @if (proposals().length > 0) {\n <ul class=\"cards\" [attr.aria-busy]=\"busy()\">\n @for (proposal of proposals(); track proposal.approvalId) {\n <li class=\"card\" [class.selected]=\"selected().has(proposal.approvalId)\">\n <div class=\"card-header\">\n @if (selectable() && proposal.status === 'pending' && mayDecide(proposal)) {\n <input\n type=\"checkbox\"\n [checked]=\"selected().has(proposal.approvalId)\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"'nh-assistant.agent-runs.inbox.select' | translate\"\n (change)=\"toggle(proposal)\" />\n }\n <strong>{{ proposal.subjectDisplayName ?? proposal.subjectId }}</strong>\n <span class=\"muted\">{{ proposal.presentation?.toolDisplayName ?? proposal.toolId }}</span>\n <span\n class=\"badge\"\n [class.success]=\"proposal.status === 'executed' || proposal.status === 'resolved'\"\n [class.warning]=\"proposal.status === 'pending' || proposal.status === 'execution-unknown' || proposal.status === 'stale'\"\n [class.danger]=\"proposal.status === 'execution-failed' || proposal.status === 'rejected'\">\n {{ 'nh-assistant.agent-runs.proposal.status.' + proposal.status | translate }}\n </span>\n <span class=\"badge\">{{ 'nh-assistant.agent-runs.proposal.mode.' + proposal.mode | translate }}</span>\n @if (proposal.grantSource !== 'none') {\n <span class=\"badge\" [attr.title]=\"'nh-assistant.tool-call.grant-source.' + proposal.grantSource + '-hint' | translate\">\n {{ 'nh-assistant.tool-call.grant-source.' + proposal.grantSource | translate }}\n </span>\n }\n @if (proposal.consultationId) {\n <span class=\"badge\" [attr.title]=\"'nh-assistant.agent-runs.proposal.from-consultation-hint' | translate\">\n {{ 'nh-assistant.agent-runs.proposal.from-consultation' | translate }}\n </span>\n }\n </div>\n @if (proposal.presentation; as presentation) {\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=\"message warning\">{{ presentation.notice }}</p>\n }\n } @else {\n <p class=\"summary\">{{ 'nh-assistant.approval.fallback-summary' | translate }}</p>\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>{{ proposal.toolId }}</code>\n @if (proposal.targets.length > 0) {\n <p class=\"label\">{{ 'nh-assistant.approval.targets' | translate }}</p>\n <ul class=\"targets\">\n @for (target of proposal.targets; track $index) {\n <li>{{ target }}</li>\n }\n </ul>\n }\n @if (proposal.argumentsPreview) {\n <p class=\"label\">{{ 'nh-assistant.approval.arguments' | translate }}</p>\n <pre>{{ proposal.argumentsPreview }}</pre>\n }\n </details>\n <div class=\"meta\">\n @if (proposal.status === 'pending') {\n <span>{{ 'nh-assistant.agent-runs.proposal.expires' | translate: { date: (proposal.expiresAt | date: 'short') } }}</span>\n }\n @if (proposal.decidedByActorId) {\n <span>{{ 'nh-assistant.agent-runs.proposal.decided-by' | translate: { actor: proposal.decidedByDisplayName || proposal.decidedByActorId } }}</span>\n }\n @if (proposal.executionResultCode; as code) {\n <span class=\"mono\">{{ code }}</span>\n }\n @if (proposal.feedback; as given) {\n <span>\n {{ 'nh-assistant.agent-runs.proposal.your-feedback' | translate: { category: ('nh-assistant.proposal-feedback.categories.' + given.category | translate) } }}\n </span>\n }\n @if (proposal.canGiveFeedback && !isAsking(proposal)) {\n <button\n class=\"text-button\"\n type=\"button\"\n [attr.data-feedback-approval]=\"proposal.approvalId\"\n [disabled]=\"busy()\"\n (click)=\"giveFeedback(proposal)\">\n {{ (proposal.feedback ? 'nh-assistant.agent-runs.proposal.change-feedback' : 'nh-assistant.agent-runs.proposal.give-feedback') | translate }}\n </button>\n }\n </div>\n @if (inCard(proposal) && feedback(); as request) {\n <nh-assistant-proposal-feedback\n [approvalIds]=\"request.approvalIds\"\n [initial]=\"request.initial\"\n (saved)=\"onFeedbackSaved()\"\n (dismissed)=\"onFeedbackDismissed()\" />\n }\n @if (waitingForKey(proposal); as waitingFor) {\n <p class=\"waiting-for\"><nh-assistant-icon name=\"users\" />{{ waitingFor | translate }}</p>\n }\n @if (proposal.status === 'pending' && mayDecide(proposal)) {\n <div class=\"card-actions\">\n <button class=\"primary\" type=\"button\" [disabled]=\"busy()\" (click)=\"decide(proposal, 'approve')\">\n <nh-assistant-icon name=\"check\" />{{ 'nh-assistant.agent-runs.proposal.approve' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"decide(proposal, 'reject')\">\n <nh-assistant-icon name=\"x\" />{{ 'nh-assistant.agent-runs.proposal.reject' | translate }}\n </button>\n </div>\n }\n @if (proposal.status === 'execution-unknown' && mayDecide(proposal)) {\n <p class=\"message warning\"><nh-assistant-icon name=\"warning\" />{{ 'nh-assistant.agent-runs.proposal.unknown-hint' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"resolve(proposal, 'mark-resolved')\">\n <nh-assistant-icon name=\"check\" />{{ 'nh-assistant.agent-runs.proposal.mark-resolved' | translate }}\n </button>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"resolve(proposal, 're-execute')\">\n <nh-assistant-icon name=\"refresh\" />{{ 'nh-assistant.agent-runs.proposal.re-execute' | translate }}\n </button>\n </div>\n }\n </li>\n }\n </ul>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AgentProposal,\n NhAssistantAgentRunApiService,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork\n} from '@newheap/platform-ai-chat';\nimport { NhAssistantAgentProposalsComponent } from './nh-assistant-agent-proposals.component';\n\n/**\n * The approval inbox: pending agent proposals across subjects that the signed-in person may\n * decide, earliest expiry first. Proposals are decided in place, one by one or together; the\n * server checks each decision against the proposal's approval policy again. After a rejection the\n * inbox asks, optionally, what was wrong, also when the rejected proposals have left the list.\n * With live updates the inbox reloads by itself when agent work changes, for example when a\n * colleague decided a proposal or a run proposed a new one.\n */\n@Component({\n selector: 'nh-assistant-agent-inbox',\n standalone: true,\n imports: [TranslatePipe, NhAssistantIconComponent, NhAssistantAgentProposalsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-agent-inbox.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantAgentInboxComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly proposalList = viewChild(NhAssistantAgentProposalsComponent);\n private subscription?: Subscription;\n\n /** Limits the inbox to one agent. */\n readonly agentId = input<string | undefined>(undefined);\n /** Limits the inbox to one kind of subject, for example `project`. */\n readonly subjectType = input<string | undefined>(undefined);\n readonly itemsPerPage = input(20);\n\n readonly page = signal(1);\n readonly loading = signal(true);\n /** True after the first successful load; later loads keep the list, and an open feedback question, in place. */\n readonly loaded = signal(false);\n readonly loadFailed = signal(false);\n readonly items = signal<AgentProposal[]>([]);\n readonly total = signal(0);\n readonly pages = computed(() => Math.max(1, Math.ceil(this.total() / this.itemsPerPage())));\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n effect(() => {\n this.agentId();\n this.subjectType();\n untracked(() => {\n this.page.set(1);\n this.load();\n });\n });\n // Any agent's work may add, decide or close a proposal of this inbox.\n nhAssistantReloadOnAgentWork(() => true, () => this.refresh());\n }\n\n load(): void {\n this.fetch(false);\n }\n\n goTo(page: number): void {\n this.page.set(Math.min(Math.max(1, page), this.pages()));\n this.load();\n }\n\n /**\n * Reloads after a live update. Once the inbox is shown it reloads quietly: no loading state, and\n * a failure keeps the list and an open feedback question in place. While a decision of the list\n * is in flight it waits, because the decision reloads the inbox when it ends.\n */\n private refresh(): void {\n if (this.proposalList()?.busy()) {\n return;\n }\n\n this.fetch(this.loaded() && !this.loading() && !this.loadFailed());\n }\n\n private fetch(quiet: boolean): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api\n .getInbox({\n agentId: this.agentId(),\n subjectType: this.subjectType(),\n page: this.page(),\n itemsPerPage: this.itemsPerPage()\n })\n .subscribe({\n next: inbox => {\n const lastPage = Math.max(1, Math.ceil(inbox.total / this.itemsPerPage()));\n if (inbox.items.length === 0 && this.page() > lastPage) {\n // Proposals were decided elsewhere and this page no longer exists.\n this.page.set(lastPage);\n this.fetch(quiet);\n return;\n }\n\n this.items.set(inbox.items);\n this.total.set(inbox.total);\n this.loading.set(false);\n this.loadFailed.set(false);\n this.loaded.set(true);\n },\n error: () => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n}\n","<section class=\"section\" aria-labelledby=\"nh-assistant-agent-inbox-title\" [attr.aria-busy]=\"loading()\">\n <header class=\"section-header\">\n <div>\n <h3 id=\"nh-assistant-agent-inbox-title\">{{ 'nh-assistant.agent-runs.inbox.title' | translate }}</h3>\n <p class=\"muted\">{{ 'nh-assistant.agent-runs.inbox.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" [disabled]=\"loading()\" (click)=\"load()\">\n <nh-assistant-icon name=\"refresh\" />{{ 'nh-assistant.agent-runs.refresh' | translate }}\n </button>\n </header>\n\n @if (loading() && items().length === 0 && !loaded()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n } @else {\n <!-- Stays rendered when the list empties, so the optional feedback after a rejection remains. -->\n <nh-assistant-agent-proposals [proposals]=\"items()\" [canDecide]=\"true\" [selectable]=\"true\" (changed)=\"load()\" />\n @if (items().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.inbox.empty' | translate }}</p>\n }\n @if (pages() > 1) {\n <nav class=\"toolbar\" [attr.aria-label]=\"'nh-assistant.agent-runs.inbox.pages' | translate\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"page() <= 1 || loading()\" (click)=\"goTo(page() - 1)\">\n {{ 'nh-assistant.agent-runs.inbox.previous' | translate }}\n </button>\n <span class=\"muted\">{{ 'nh-assistant.agent-runs.inbox.page' | translate: { page: page(), pages: pages() } }}</span>\n <button class=\"secondary\" type=\"button\" [disabled]=\"page() >= pages() || loading()\" (click)=\"goTo(page() + 1)\">\n {{ 'nh-assistant.agent-runs.inbox.next' | translate }}\n </button>\n </nav>\n }\n }\n</section>\n","import { DatePipe, DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AgentArtifact,\n NhAssistantAgentRunApiService,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork\n} from '@newheap/platform-ai-chat';\n\n/**\n * The files the agent's tools saved in a thread, every version newest first. Files of the\n * agent's own grant that the viewer may not read are listed as shielded and cannot be downloaded.\n * With live updates the list reloads by itself when a run or proposal of the thread changes.\n */\n@Component({\n selector: 'nh-assistant-agent-artifacts',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-agent-artifacts.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantAgentArtifactsComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly document = inject(DOCUMENT);\n private subscription?: Subscription;\n\n readonly conversationId = input.required<string>();\n\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly downloadFailed = signal(false);\n readonly artifacts = signal<AgentArtifact[]>([]);\n readonly downloadingId = signal<string | null>(null);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n effect(() => {\n this.conversationId();\n untracked(() => this.load());\n });\n nhAssistantReloadOnAgentWork(\n change => change.conversationId === this.conversationId() && change.reason !== 'feedback',\n () => this.fetch(!this.loading() && !this.loadFailed())\n );\n }\n\n load(): void {\n this.fetch(false);\n }\n\n async download(artifact: AgentArtifact): Promise<void> {\n this.downloadingId.set(artifact.id);\n this.downloadFailed.set(false);\n try {\n const blob = await this.api.downloadArtifact(this.conversationId(), artifact.id);\n const url = URL.createObjectURL(blob);\n const link = this.document.createElement('a');\n link.href = url;\n link.download = `${artifact.name}-v${artifact.version}`;\n link.click();\n URL.revokeObjectURL(url);\n } catch {\n this.downloadFailed.set(true);\n } finally {\n this.downloadingId.set(null);\n }\n }\n\n /** A quiet load, after a live update, shows no loading state and keeps the files when it fails. */\n private fetch(quiet: boolean): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api.getArtifacts(this.conversationId()).subscribe({\n next: artifacts => {\n this.artifacts.set(artifacts);\n this.loading.set(false);\n this.loadFailed.set(false);\n },\n error: () => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n}\n","@if (downloadFailed()) {\n <p class=\"message error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ 'nh-assistant.agent-runs.artifacts.download-failed' | translate }}</p>\n}\n\n@if (loading()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n} @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n} @else if (artifacts().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.artifacts.empty' | translate }}</p>\n} @else {\n <ul class=\"cards\">\n @for (artifact of artifacts(); track artifact.id) {\n <li class=\"card\">\n <div class=\"card-header\">\n <strong>{{ artifact.name }}</strong>\n <span class=\"badge\">{{ 'nh-assistant.agent-runs.artifacts.version' | translate: { version: artifact.version } }}</span>\n @if (artifact.restricted) {\n <span class=\"badge warning\">{{ 'nh-assistant.agent-runs.artifacts.restricted' | translate }}</span>\n }\n </div>\n <div class=\"meta\">\n <span class=\"mono\">{{ artifact.contentType }}</span>\n <span>{{ 'nh-assistant.agent-runs.artifacts.size' | translate: { size: artifact.sizeBytes } }}</span>\n <span>{{ artifact.createdAt | date: 'short' }}</span>\n </div>\n @if (!artifact.restricted) {\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"downloadingId() !== null\" (click)=\"download(artifact)\">\n <nh-assistant-icon name=\"page\" />{{ 'nh-assistant.agent-runs.artifacts.download' | translate }}\n </button>\n </div>\n }\n </li>\n }\n </ul>\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AgentConsultation,\n NhAssistantAgentRunApiService,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork,\n ɵNhAssistantTranslatePipe as NhAssistantTranslatePipe\n} from '@newheap/platform-ai-chat';\n\n/**\n * Who consulted the thread's agent through another assistant, newest first: the person whose rights\n * were used, the asking assistant, the outcome, the usage and the proposals left for approvers. The\n * question and the answer stay in the asking conversation and are never shown here. With live\n * updates the list reloads by itself when a run or proposal of the thread changes.\n */\n@Component({\n selector: 'nh-assistant-agent-consultations',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-agent-consultations.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantAgentConsultationsComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private subscription?: Subscription;\n\n readonly conversationId = input.required<string>();\n\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly consultations = signal<AgentConsultation[]>([]);\n readonly total = signal(0);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n effect(() => {\n this.conversationId();\n untracked(() => this.load());\n });\n nhAssistantReloadOnAgentWork(\n change => change.conversationId === this.conversationId() && change.reason !== 'feedback',\n () => this.fetch(!this.loading() && !this.loadFailed())\n );\n }\n\n load(): void {\n this.fetch(false);\n }\n\n /** A quiet load, after a live update, shows no loading state and keeps the list when it fails. */\n private fetch(quiet: boolean): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api.getConsultations(this.conversationId()).subscribe({\n next: list => {\n this.consultations.set(list.items);\n this.total.set(list.total);\n this.loading.set(false);\n this.loadFailed.set(false);\n },\n error: () => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n}\n","@if (loading() && consultations().length === 0) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n} @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n} @else if (consultations().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.consultation.empty' | translate }}</p>\n} @else {\n <p class=\"muted\">{{ 'nh-assistant.agent-runs.consultation.private' | translate }}</p>\n <ol class=\"cards\" [attr.aria-label]=\"'nh-assistant.agent-runs.thread.tabs.consultations' | translate\">\n @for (consultation of consultations(); track consultation.id) {\n <li class=\"card\">\n <div class=\"card-header\">\n <strong>{{ consultation.createdAt | date: 'short' }}</strong>\n <span\n class=\"badge\"\n [class.success]=\"consultation.status === 'completed'\"\n [class.warning]=\"consultation.status === 'running'\"\n [class.danger]=\"consultation.status === 'failed'\">\n {{ 'nh-assistant.agent-runs.consultation.status.' + consultation.status | translate }}\n </span>\n <span>\n {{ 'nh-assistant.agent-runs.consultation.asked-by' | translate: { name: consultation.askerDisplayName ?? consultation.askerActorId } }}\n @if (consultation.askingAgentId; as agentId) {\n {{ 'nh-assistant.agent-runs.consultation.through' | translate: { agent: (['nh-assistant.agents.' + agentId + '.name'] | nhAssistantTranslate: agentId) } }}\n }\n </span>\n @if (consultation.depth > 1) {\n <span class=\"badge\">{{ 'nh-assistant.agent-runs.consultation.depth' | translate: { depth: consultation.depth } }}</span>\n }\n </div>\n <div class=\"meta\">\n <span>{{ 'nh-assistant.agent-runs.run.tool-calls' | translate: { count: consultation.toolCalls } }}</span>\n <span>{{ 'nh-assistant.agent-runs.run.tokens' | translate: { count: consultation.inputTokens + consultation.outputTokens } }}</span>\n <span>{{ 'nh-assistant.agent-runs.run.proposals' | translate: { count: consultation.proposalCount } }}</span>\n @if (consultation.failureCode; as code) {\n <span><nh-assistant-icon name=\"warning\" />{{ ['nh-assistant.errors.' + code] | nhAssistantTranslate: code }}</span>\n }\n </div>\n </li>\n }\n </ol>\n @if (total() > consultations().length) {\n <p class=\"muted\">{{ 'nh-assistant.agent-runs.consultation.more' | translate: { count: total() - consultations().length } }}</p>\n }\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AgentThreadMemory,\n NhAssistantAgentRunApiService,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork\n} from '@newheap/platform-ai-chat';\n\n/**\n * The working memory of an agent about the subject of a thread, read-only. The agent keeps it\n * up to date itself; it is shown so that people can see what the agent remembers. With live\n * updates it reloads by itself when a run of the thread changes.\n */\n@Component({\n selector: 'nh-assistant-agent-memory',\n standalone: true,\n imports: [DatePipe, TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-agent-memory.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantAgentMemoryComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private subscription?: Subscription;\n\n readonly conversationId = input.required<string>();\n\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly memory = signal<AgentThreadMemory | null>(null);\n readonly formatted = computed(() => {\n const value = this.memory()?.memory;\n return value === null || value === undefined ? null : JSON.stringify(value, null, 2);\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());\n effect(() => {\n this.conversationId();\n untracked(() => this.load());\n });\n // Only runs write the working memory.\n nhAssistantReloadOnAgentWork(\n change => change.conversationId === this.conversationId() && change.reason === 'run',\n () => this.fetch(!this.loading() && !this.loadFailed())\n );\n }\n\n load(): void {\n this.fetch(false);\n }\n\n /** A quiet load, after a live update, shows no loading state and keeps the memory when it fails. */\n private fetch(quiet: boolean): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api.getMemory(this.conversationId()).subscribe({\n next: memory => {\n this.memory.set(memory);\n this.loading.set(false);\n this.loadFailed.set(false);\n },\n error: () => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n}\n","@if (loading()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n} @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n} @else if (!memory()?.configured) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.memory.not-configured' | translate }}</p>\n} @else if (formatted(); as json) {\n <div class=\"section\">\n <div class=\"meta\">\n <span>{{ 'nh-assistant.agent-runs.memory.version' | translate: { version: memory()!.schemaVersion } }}</span>\n @if (memory()!.updatedAt; as updatedAt) {\n <span>{{ 'nh-assistant.agent-runs.memory.updated' | translate: { date: (updatedAt | date: 'short') } }}</span>\n }\n </div>\n <pre [attr.aria-label]=\"'nh-assistant.agent-runs.thread.tabs.memory' | translate\">{{ json }}</pre>\n </div>\n} @else {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.memory.empty' | translate }}</p>\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable, Subscription } from 'rxjs';\nimport {\n AgentRun,\n AgentRunRetryMode,\n AgentSubjectRole,\n NhAssistantAgentRunApiService,\n NhAssistantError,\n ɵnhAssistantErrorKeys as nhAssistantErrorKeys,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork,\n ɵNhAssistantTranslatePipe as NhAssistantTranslatePipe,\n ɵtoNhAssistantError as toNhAssistantError\n} from '@newheap/platform-ai-chat';\n\nconst endedStatuses = new Set(['completed', 'failed', 'cancelled']);\n\n/**\n * The runs of an agent thread, newest first: trigger, status, failure, usage, proposals and the\n * summary the next run starts from. Participants cancel an open run; approvers resume or restart\n * a failed or cancelled one. With live updates it reloads by itself when a run or proposal of the\n * thread changes.\n */\n@Component({\n selector: 'nh-assistant-run-timeline',\n standalone: true,\n imports: [DatePipe, TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-run-timeline.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantRunTimelineComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private subscription?: Subscription;\n private actionSubscription?: Subscription;\n\n readonly conversationId = input.required<string>();\n readonly role = input<AgentSubjectRole>('reader');\n /** Emits after a run was cancelled or retried. */\n readonly changed = output<void>();\n\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly runs = signal<AgentRun[]>([]);\n readonly busyRunId = signal<string | null>(null);\n readonly error = signal<NhAssistantError | null>(null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n readonly canCancel = computed(() => this.role() === 'participant' || this.role() === 'approver');\n readonly canRetry = computed(() => this.role() === 'approver');\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.subscription?.unsubscribe();\n this.actionSubscription?.unsubscribe();\n });\n effect(() => {\n this.conversationId();\n untracked(() => this.load());\n });\n nhAssistantReloadOnAgentWork(\n change => change.conversationId === this.conversationId() && change.reason !== 'feedback',\n () => this.fetch(!this.loading() && !this.loadFailed())\n );\n }\n\n load(): void {\n this.fetch(false);\n }\n\n isOpen(run: AgentRun): boolean {\n return !endedStatuses.has(run.status);\n }\n\n canRetryRun(run: AgentRun): boolean {\n return this.canRetry() && (run.status === 'failed' || run.status === 'cancelled');\n }\n\n cancel(run: AgentRun): void {\n this.act(run, this.api.cancelRun(run.id));\n }\n\n retry(run: AgentRun, mode: AgentRunRetryMode): void {\n this.act(run, this.api.retryRun(run.id, mode));\n }\n\n private act(run: AgentRun, request: Observable<unknown>): void {\n this.busyRunId.set(run.id);\n this.error.set(null);\n this.actionSubscription?.unsubscribe();\n this.actionSubscription = request.subscribe({\n next: () => {\n this.busyRunId.set(null);\n this.changed.emit();\n this.load();\n },\n error: failure => {\n this.busyRunId.set(null);\n this.error.set(toNhAssistantError(failure));\n }\n });\n }\n\n /** A quiet load, after a live update, shows no loading state and keeps the runs when it fails. */\n private fetch(quiet: boolean): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api.getRuns(this.conversationId()).subscribe({\n next: list => {\n this.runs.set(list.items);\n this.loading.set(false);\n this.loadFailed.set(false);\n },\n error: () => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\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@if (loading() && runs().length === 0) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n} @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n} @else if (runs().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.run.empty' | translate }}</p>\n} @else {\n <ol class=\"cards\" [attr.aria-label]=\"'nh-assistant.agent-runs.thread.tabs.runs' | translate\">\n @for (run of runs(); track run.id) {\n <li class=\"card\" [attr.aria-busy]=\"busyRunId() === run.id\">\n <div class=\"card-header\">\n <strong>{{ run.createdAt | date: 'short' }}</strong>\n <span\n class=\"badge\"\n [class.success]=\"run.status === 'completed'\"\n [class.warning]=\"run.status === 'waiting-for-approval' || run.status === 'queued' || run.status === 'running'\"\n [class.danger]=\"run.status === 'failed'\">\n {{ 'nh-assistant.agent-runs.run.status.' + run.status | translate }}\n </span>\n @if (run.shadow) {\n <span class=\"badge\">{{ 'nh-assistant.agent-runs.run.shadow' | translate }}</span>\n }\n <span class=\"mono muted\">{{ 'nh-assistant.agent-runs.run.trigger' | translate: { trigger: run.triggerId } }}</span>\n </div>\n <div class=\"meta\">\n <span>{{ 'nh-assistant.agent-runs.run.tool-calls' | translate: { count: run.toolCalls } }}</span>\n <span>{{ 'nh-assistant.agent-runs.run.tokens' | translate: { count: run.inputTokens + run.outputTokens } }}</span>\n <span>{{ 'nh-assistant.agent-runs.run.proposals' | translate: { count: run.proposalCount } }}</span>\n @if (run.attempt > 1) {\n <span>{{ 'nh-assistant.agent-runs.run.attempt' | translate: { attempt: run.attempt } }}</span>\n }\n @if (run.failureCode; as code) {\n <span>{{ ['nh-assistant.errors.' + code] | nhAssistantTranslate: code }}</span>\n }\n </div>\n @if (run.summary) {\n <p class=\"summary\">{{ run.summary }}</p>\n }\n @if ((isOpen(run) && canCancel()) || canRetryRun(run)) {\n <div class=\"card-actions\">\n @if (isOpen(run) && canCancel()) {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busyRunId() !== null\" (click)=\"cancel(run)\">\n <nh-assistant-icon name=\"stop\" />{{ 'nh-assistant.agent-runs.run.cancel' | translate }}\n </button>\n }\n @if (canRetryRun(run)) {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busyRunId() !== null\" (click)=\"retry(run, 'resume')\">\n <nh-assistant-icon name=\"refresh\" />{{ 'nh-assistant.agent-runs.run.resume' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [disabled]=\"busyRunId() !== null\" (click)=\"retry(run, 'restart')\">\n <nh-assistant-icon name=\"refresh\" />{{ 'nh-assistant.agent-runs.run.restart' | translate }}\n </button>\n }\n </div>\n }\n </li>\n }\n </ol>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AgentProposal,\n AgentThreadLookup,\n AgentTriggerReceipt,\n LiveAgentWorkChanged,\n NhAssistantAgentRunApiService,\n NhAssistantError,\n ɵnhAssistantErrorKeys as nhAssistantErrorKeys,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork,\n ɵNhAssistantTranslatePipe as NhAssistantTranslatePipe,\n ɵtoNhAssistantError as toNhAssistantError\n} from '@newheap/platform-ai-chat';\nimport { NhAssistantAgentArtifactsComponent } from './nh-assistant-agent-artifacts.component';\nimport { NhAssistantAgentConsultationsComponent } from './nh-assistant-agent-consultations.component';\nimport { NhAssistantAgentMemoryComponent } from './nh-assistant-agent-memory.component';\nimport { NhAssistantAgentProposalsComponent } from './nh-assistant-agent-proposals.component';\nimport { NhAssistantRunTimelineComponent } from './nh-assistant-run-timeline.component';\n\nexport type NhAssistantAgentThreadTab = 'proposals' | 'runs' | 'consultations' | 'memory' | 'artifacts';\n\n/**\n * The agent's work on one subject, for example an \"Intake review\" tab on a project page: the\n * caller's role, a start action for participants, and the thread's proposals, runs, consultations\n * by other assistants, working memory and files. Everything follows the caller's live role on the\n * subject. With live updates the view reloads by itself when the thread's runs, proposals or\n * feedback change, also when a colleague decided elsewhere.\n */\n@Component({\n selector: 'nh-assistant-agent-thread-view',\n standalone: true,\n imports: [\n TranslatePipe,\n NhAssistantTranslatePipe,\n NhAssistantIconComponent,\n NhAssistantAgentProposalsComponent,\n NhAssistantRunTimelineComponent,\n NhAssistantAgentMemoryComponent,\n NhAssistantAgentArtifactsComponent,\n NhAssistantAgentConsultationsComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-agent-thread-view.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantAgentThreadViewComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly proposalList = viewChild(NhAssistantAgentProposalsComponent);\n private subscription?: Subscription;\n private proposalSubscription?: Subscription;\n private startSubscription?: Subscription;\n\n readonly agentId = input.required<string>();\n readonly subjectType = input.required<string>();\n readonly subjectId = input.required<string>();\n /** Emits the thread's conversation id, so the host can open it in the assistant panel. */\n readonly openConversation = output<string>();\n\n readonly tab = signal<NhAssistantAgentThreadTab>('proposals');\n readonly loading = signal(true);\n readonly loadFailed = signal(false);\n readonly lookup = signal<AgentThreadLookup | null>(null);\n readonly proposals = signal<AgentProposal[]>([]);\n readonly message = signal('');\n readonly starting = signal(false);\n readonly receipt = signal<AgentTriggerReceipt | null>(null);\n readonly error = signal<NhAssistantError | null>(null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n readonly thread = computed(() => this.lookup()?.thread ?? null);\n readonly role = computed(() => this.lookup()?.role ?? 'none');\n readonly tabs: readonly NhAssistantAgentThreadTab[] = ['proposals', 'runs', 'consultations', 'memory', 'artifacts'];\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.subscription?.unsubscribe();\n this.proposalSubscription?.unsubscribe();\n this.startSubscription?.unsubscribe();\n });\n effect(() => {\n this.agentId();\n this.subjectType();\n this.subjectId();\n untracked(() => this.load());\n });\n nhAssistantReloadOnAgentWork(change => this.concerns(change), () => this.refresh());\n }\n\n load(): void {\n this.fetch(false);\n }\n\n loadProposals(): void {\n this.fetchProposals(false);\n }\n\n onMessage(event: Event): void {\n this.message.set((event.target as HTMLTextAreaElement).value);\n }\n\n start(): void {\n this.starting.set(true);\n this.error.set(null);\n this.receipt.set(null);\n this.startSubscription?.unsubscribe();\n this.startSubscription = this.api\n .startAgent({\n agentId: this.agentId(),\n subjectType: this.subjectType(),\n subjectId: this.subjectId(),\n message: this.message().trim() || null\n })\n .subscribe({\n next: receipt => {\n this.starting.set(false);\n this.receipt.set(receipt);\n this.message.set('');\n this.load();\n },\n error: failure => {\n this.starting.set(false);\n this.error.set(toNhAssistantError(failure));\n }\n });\n }\n\n /**\n * Whether a live update is about this view: its own thread, or, before the subject has a thread,\n * a run that may have started it.\n */\n private concerns(change: LiveAgentWorkChanged): boolean {\n const thread = this.thread();\n return thread ? change.conversationId === thread.conversationId : change.reason === 'run';\n }\n\n /**\n * Reloads after a live update. Once the thread is shown it reloads quietly: no loading state, and\n * a failure keeps what is shown, including an open feedback question. While a decision of the\n * proposal list is in flight only the thread reloads, because the decision reloads the proposals\n * when it ends.\n */\n private refresh(): void {\n const withProposals = this.proposalList()?.busy() !== true;\n this.fetch(this.lookup() !== null && !this.loading() && !this.loadFailed(), withProposals);\n }\n\n private fetch(quiet: boolean, withProposals = true): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api.getThread(this.agentId(), this.subjectType(), this.subjectId()).subscribe({\n next: lookup => {\n this.lookup.set(lookup);\n if (!lookup.thread?.activeRun && this.receipt()?.runId) {\n // The run the receipt announced has ended; the run timeline shows how.\n this.receipt.set(null);\n }\n this.loading.set(false);\n this.loadFailed.set(false);\n if (withProposals) {\n this.fetchProposals(quiet);\n }\n },\n error: () => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n this.loadFailed.set(true);\n }\n });\n }\n\n private fetchProposals(quiet: boolean): void {\n const thread = this.thread();\n this.proposalSubscription?.unsubscribe();\n if (!thread) {\n this.proposals.set([]);\n return;\n }\n\n this.proposalSubscription = this.api.getProposals(thread.conversationId).subscribe({\n next: proposals => this.proposals.set(proposals),\n error: () => {\n if (!quiet) {\n this.proposals.set([]);\n }\n }\n });\n }\n}\n","<section class=\"section\" aria-labelledby=\"nh-assistant-agent-thread-title\" [attr.aria-busy]=\"loading()\">\n <header class=\"section-header\">\n <div>\n <h3 id=\"nh-assistant-agent-thread-title\">{{ thread()?.subjectDisplayName ?? ('nh-assistant.agent-runs.thread.title' | translate) }}</h3>\n <p class=\"muted\">\n {{ 'nh-assistant.agent-runs.role.' + role() | translate }}\n @if (thread()?.activeRun; as activeRun) {\n · {{ 'nh-assistant.agent-runs.run.status.' + activeRun.status | translate }}\n }\n @if (thread()?.waitingInputs) {\n · {{ 'nh-assistant.agent-runs.thread.waiting-inputs' | translate: { count: thread()!.waitingInputs } }}\n }\n </p>\n </div>\n <div class=\"toolbar\">\n @if (thread(); as current) {\n <button class=\"secondary\" type=\"button\" (click)=\"openConversation.emit(current.conversationId)\">\n <nh-assistant-icon name=\"link\" />{{ 'nh-assistant.agent-runs.thread.open-conversation' | translate }}\n </button>\n }\n <button class=\"secondary\" type=\"button\" [disabled]=\"loading()\" (click)=\"load()\">\n <nh-assistant-icon name=\"refresh\" />{{ 'nh-assistant.agent-runs.refresh' | translate }}\n </button>\n </div>\n </header>\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 @if (receipt(); as started) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />{{ 'nh-assistant.agent-runs.thread.outcome.' + started.outcome | translate }}\n </p>\n }\n\n @if (loading() && !lookup()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n } @else {\n @if (lookup()?.canStart) {\n <form class=\"toolbar\" (submit)=\"$event.preventDefault(); start()\">\n <textarea\n class=\"reason\"\n rows=\"2\"\n maxlength=\"4000\"\n [value]=\"message()\"\n [attr.aria-label]=\"'nh-assistant.agent-runs.thread.start-message' | translate\"\n [placeholder]=\"'nh-assistant.agent-runs.thread.start-message' | translate\"\n (input)=\"onMessage($event)\"></textarea>\n <button class=\"primary\" type=\"submit\" [disabled]=\"starting()\">\n <nh-assistant-icon name=\"send\" />{{ (starting() ? 'nh-assistant.agent-runs.thread.starting' : 'nh-assistant.agent-runs.thread.start') | translate }}\n </button>\n </form>\n }\n\n @if (thread(); as current) {\n <div class=\"tabs\" role=\"tablist\">\n @for (item of tabs; track item) {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"tab() === item\"\n (click)=\"tab.set(item)\">\n {{ 'nh-assistant.agent-runs.thread.tabs.' + item | translate }}\n </button>\n }\n </div>\n <div role=\"tabpanel\">\n @switch (tab()) {\n @case ('proposals') {\n @if (proposals().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.thread.no-proposals' | translate }}</p>\n } @else {\n <nh-assistant-agent-proposals [proposals]=\"proposals()\" [canDecide]=\"role() === 'approver'\" (changed)=\"loadProposals()\" />\n }\n }\n @case ('runs') {\n <nh-assistant-run-timeline [conversationId]=\"current.conversationId\" [role]=\"role()\" (changed)=\"load()\" />\n }\n @case ('consultations') {\n <nh-assistant-agent-consultations [conversationId]=\"current.conversationId\" />\n }\n @case ('memory') {\n <nh-assistant-agent-memory [conversationId]=\"current.conversationId\" />\n }\n @case ('artifacts') {\n <nh-assistant-agent-artifacts [conversationId]=\"current.conversationId\" />\n }\n }\n </div>\n } @else {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.thread.no-thread' | translate }}</p>\n }\n }\n</section>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport {\n AgentProposalDecisionRight,\n AgentSubjectWork,\n AgentSubjectWorkAgent,\n AgentThreadLookup,\n AgentTriggerReceipt,\n NhAssistantAgentRunApiService,\n NhAssistantApiError,\n NhAssistantError,\n NhAssistantPanelService,\n NhAssistantStore,\n ɵnhAssistantErrorKeys as nhAssistantErrorKeys,\n ɵNhAssistantIconComponent as NhAssistantIconComponent,\n ɵnhAssistantReloadOnAgentWork as nhAssistantReloadOnAgentWork,\n ɵNhAssistantTranslatePipe as NhAssistantTranslatePipe,\n ɵtoNhAssistantError as toNhAssistantError\n} from '@newheap/platform-ai-chat';\nimport { NhAssistantAgentProposalsComponent } from './nh-assistant-agent-proposals.component';\n\nlet nextSuggestionsId = 0;\n\n/** The outcome of starting one agent on the subject. */\ninterface NhAssistantStartedAgent {\n agentId: string;\n receipt: AgentTriggerReceipt;\n}\n\n/**\n * The agent work on one subject of the application, for example in a project's dialog: the open\n * proposals of every agent on the subject with the viewer's own decision right, including who\n * decides when the viewer may not and the optional question after a rejection, and per agent the\n * conversation about the subject and, for participants, a start action. `agentId` names the agent\n * whose conversation the host offers also before it worked on the subject. With live updates the\n * view reloads by itself when agent work on its subject changes. Opening a conversation uses\n * `NhAssistantPanelService.openSubject` and emits `conversationOpened` afterwards.\n */\n@Component({\n selector: 'nh-assistant-subject-suggestions',\n standalone: true,\n imports: [TranslatePipe, NhAssistantTranslatePipe, NhAssistantIconComponent, NhAssistantAgentProposalsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nh-assistant-subject-suggestions.component.html',\n styleUrl: './nh-assistant-agent-runs.scss'\n})\nexport class NhAssistantSubjectSuggestionsComponent {\n private readonly api = inject(NhAssistantAgentRunApiService);\n private readonly panel = inject(NhAssistantPanelService);\n private readonly store = inject(NhAssistantStore);\n private readonly proposalList = viewChild(NhAssistantAgentProposalsComponent);\n private subscription?: Subscription;\n private startSubscription?: Subscription;\n private destroyed = false;\n\n /** The application's kind of subject, for example `project`. */\n readonly subjectType = input.required<string>();\n readonly subjectId = input.required<string>();\n /** The agent whose conversation about the subject the host offers, also before it worked on it. */\n readonly agentId = input<string | undefined>(undefined);\n /** Emits once the panel opens the conversation, so a host in a dialog can make room for it. */\n readonly conversationOpened = output<AgentThreadLookup>();\n\n readonly headingId = `nh-assistant-subject-suggestions-${++nextSuggestionsId}`;\n readonly loading = signal(true);\n /** True after the first successful load; later loads keep the list, and an open feedback question, in place. */\n readonly loaded = signal(false);\n readonly loadFailed = signal(false);\n /** The caller has no role on the subject, or it no longer exists. */\n readonly unavailable = signal(false);\n readonly work = signal<AgentSubjectWork | null>(null);\n /** The agent whose conversation is opening or which is starting. */\n readonly opening = signal<string | null>(null);\n readonly starting = signal<string | null>(null);\n readonly started = signal<NhAssistantStartedAgent | null>(null);\n readonly error = signal<NhAssistantError | null>(null);\n readonly errorKeys = computed(() => nhAssistantErrorKeys(this.error()));\n /** True while the assistant panel can show a conversation. */\n readonly assistantEnabled = this.store.enabled;\n readonly agents = computed<AgentSubjectWorkAgent[]>(() => this.work()?.agents ?? []);\n readonly proposals = computed(() => this.work()?.openProposals.map(item => item.proposal) ?? []);\n readonly decisionRights = computed<ReadonlyMap<string, AgentProposalDecisionRight>>(() =>\n new Map((this.work()?.openProposals ?? []).map(item => [\n item.proposal.approvalId,\n { canDecide: item.canDecide, reasonCode: item.reasonCode }\n ])));\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.subscription?.unsubscribe();\n this.startSubscription?.unsubscribe();\n });\n // Browser only: the access policy and the status need the signed-in user.\n afterNextRender(() => {\n void this.store.initialize();\n });\n effect(() => {\n this.subjectType();\n this.subjectId();\n this.agentId();\n untracked(() => {\n this.work.set(null);\n this.loaded.set(false);\n this.started.set(null);\n this.error.set(null);\n this.load();\n });\n });\n nhAssistantReloadOnAgentWork(\n change => change.subjectType === this.subjectType() && change.subjectId === this.subjectId(),\n () => this.refresh()\n );\n }\n\n load(): void {\n this.fetch(false);\n }\n\n /** The translation keys of an agent's name: from the server's status, then the convention. */\n agentNameKeys(agentId: string): string[] {\n const known = this.store.agents().find(agent => agent.id === agentId)?.displayNameKey;\n return known ? [known, `nh-assistant.agents.${agentId}.name`] : [`nh-assistant.agents.${agentId}.name`];\n }\n\n /** Readers may open an existing conversation; creating one needs the participant role. */\n canOpen(agent: AgentSubjectWorkAgent): boolean {\n return agent.thread !== null || this.work()?.role !== 'reader';\n }\n\n async open(agent: AgentSubjectWorkAgent): Promise<void> {\n this.opening.set(agent.agentId);\n this.error.set(null);\n try {\n const lookup = await this.panel.openSubject(agent.agentId, { type: this.subjectType(), id: this.subjectId() });\n if (!this.destroyed) {\n this.conversationOpened.emit(lookup);\n if (!agent.thread) {\n // The conversation now exists; show it as the agent's thread.\n this.fetch(true);\n }\n }\n } catch (failure) {\n if (!this.destroyed) {\n this.error.set(toNhAssistantError(failure));\n }\n } finally {\n if (!this.destroyed) {\n this.opening.set(null);\n }\n }\n }\n\n start(agent: AgentSubjectWorkAgent): void {\n this.starting.set(agent.agentId);\n this.error.set(null);\n this.started.set(null);\n this.startSubscription?.unsubscribe();\n this.startSubscription = this.api\n .startAgent({ agentId: agent.agentId, subjectType: this.subjectType(), subjectId: this.subjectId() })\n .subscribe({\n next: receipt => {\n this.starting.set(null);\n this.started.set({ agentId: agent.agentId, receipt });\n this.fetch(true);\n },\n error: failure => {\n this.starting.set(null);\n this.error.set(toNhAssistantError(failure));\n }\n });\n }\n\n /**\n * Reloads after a live update. Once the work is shown it reloads quietly: no loading state, and\n * a failure keeps what is shown, including an open feedback question. While a decision of the\n * list is in flight it waits, because the decision reloads the list when it ends.\n */\n private refresh(): void {\n if (this.proposalList()?.busy()) {\n return;\n }\n\n this.fetch(this.loaded() && !this.loading() && !this.loadFailed());\n }\n\n private fetch(quiet: boolean): void {\n if (!quiet) {\n this.loading.set(true);\n this.loadFailed.set(false);\n this.unavailable.set(false);\n }\n\n this.subscription?.unsubscribe();\n this.subscription = this.api.getSubjectWork(this.subjectType(), this.subjectId(), this.agentId()).subscribe({\n next: work => {\n this.work.set(work);\n const started = this.started();\n const startedAgent = started ? work.agents.find(agent => agent.agentId === started.agentId) : undefined;\n if (started?.receipt.runId && !startedAgent?.thread?.activeRun) {\n // The run the start announced has ended; its proposals are in the list.\n this.started.set(null);\n }\n this.loading.set(false);\n this.loadFailed.set(false);\n this.unavailable.set(false);\n this.loaded.set(true);\n },\n error: failure => {\n if (quiet) {\n return;\n }\n\n this.loading.set(false);\n if (failure instanceof NhAssistantApiError && failure.status === 404) {\n this.unavailable.set(true);\n } else {\n this.loadFailed.set(true);\n }\n }\n });\n }\n}\n","<section class=\"section\" [attr.aria-labelledby]=\"headingId\" [attr.aria-busy]=\"loading()\">\n <header class=\"section-header\">\n <div>\n <h3 [id]=\"headingId\">{{ 'nh-assistant.agent-runs.subject.title' | translate }}</h3>\n <p class=\"muted\">{{ 'nh-assistant.agent-runs.subject.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" [disabled]=\"loading()\" (click)=\"load()\">\n <nh-assistant-icon name=\"refresh\" />{{ 'nh-assistant.agent-runs.refresh' | translate }}\n </button>\n </header>\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 @if (started(); as start) {\n <p class=\"message success\" role=\"status\">\n <nh-assistant-icon name=\"check\" />{{ 'nh-assistant.agent-runs.thread.outcome.' + start.receipt.outcome | translate }}\n </p>\n }\n\n @if (loading() && !loaded()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.agent-runs.loading' | translate }}</p>\n } @else if (unavailable()) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.subject.unavailable' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.agent-runs.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.agent-runs.retry' | translate }}</button>\n </div>\n } @else {\n @if (agents().length > 0) {\n <ul class=\"subject-agents\" [attr.aria-label]=\"'nh-assistant.agent-runs.subject.agents' | translate\">\n @for (agent of agents(); track agent.agentId) {\n @let name = agentNameKeys(agent.agentId) | nhAssistantTranslate: agent.agentId;\n <li class=\"subject-agent\">\n <div class=\"subject-agent-text\">\n <strong>{{ name }}</strong>\n <span class=\"muted\">\n @if (agent.thread?.activeRun; as activeRun) {\n {{ 'nh-assistant.agent-runs.run.status.' + activeRun.status | translate }}\n } @else if (!agent.thread) {\n {{ 'nh-assistant.agent-runs.thread.no-thread' | translate }}\n } @else {\n {{ 'nh-assistant.agent-runs.subject.idle' | translate }}\n }\n </span>\n </div>\n <div class=\"card-actions\">\n @if (canOpen(agent)) {\n <button\n class=\"secondary\"\n type=\"button\"\n [disabled]=\"opening() !== null || !assistantEnabled()\"\n [attr.aria-label]=\"'nh-assistant.agent-runs.subject.open-conversation-label' | translate: { agent: name }\"\n [attr.title]=\"assistantEnabled() ? null : ('nh-assistant.agent-runs.subject.assistant-unavailable' | translate)\"\n (click)=\"open(agent)\">\n <nh-assistant-icon name=\"assistant\" />{{ (opening() === agent.agentId ? 'nh-assistant.agent-runs.subject.opening' : 'nh-assistant.agent-runs.thread.open-conversation') | translate }}\n </button>\n }\n @if (agent.canStart) {\n <button\n class=\"secondary\"\n type=\"button\"\n [disabled]=\"starting() !== null\"\n [attr.aria-label]=\"'nh-assistant.agent-runs.subject.start-label' | translate: { agent: name }\"\n (click)=\"start(agent)\">\n <nh-assistant-icon name=\"send\" />{{ (starting() === agent.agentId ? 'nh-assistant.agent-runs.thread.starting' : 'nh-assistant.agent-runs.thread.start') | translate }}\n </button>\n }\n </div>\n </li>\n }\n </ul>\n }\n\n <!-- Stays rendered when the list empties, so the optional feedback after a rejection remains. -->\n <nh-assistant-agent-proposals [proposals]=\"proposals()\" [decisionRights]=\"decisionRights()\" (changed)=\"load()\" />\n @if (proposals().length === 0) {\n <p class=\"state\">{{ 'nh-assistant.agent-runs.subject.empty' | translate }}</p>\n }\n }\n</section>\n","/*\n * Public API surface of @newheap/platform-ai-chat/agent-runs.\n *\n * Agents that run on their own are a separate entry point, so hosts load the inbox and the\n * subject views only on the routes that show them and the chat panel stays small. The\n * components use `NhAssistantAgentRunApiService` from the `provideNhAssistant` scope and reload\n * by themselves on the agent-work updates of its `NhAssistantLiveService`.\n */\nexport * from './nh-assistant-agent-inbox.component';\nexport * from './nh-assistant-agent-thread-view.component';\nexport * from './nh-assistant-agent-proposals.component';\nexport * from './nh-assistant-run-timeline.component';\nexport * from './nh-assistant-agent-memory.component';\nexport * from './nh-assistant-agent-artifacts.component';\nexport * from './nh-assistant-agent-consultations.component';\nexport * from './nh-assistant-subject-suggestions.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nhAssistantErrorKeys","toNhAssistantError","NhAssistantIconComponent","NhAssistantTranslatePipe","nhAssistantReloadOnAgentWork"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, signal, Injectable, DestroyRef, makeEnvironmentProviders } from '@angular/core';
|
|
3
3
|
import { NH_ASSISTANT_CONFIG, applyNhAssistantEvent, normalizeNhAssistantClientContext, applyNhAssistantApprovalDecision, NH_ASSISTANT_FETCH, NhAssistantLiveService } from '@newheap/platform-ai-chat';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
4
|
+
import { Subject, NEVER } from 'rxjs';
|
|
5
5
|
|
|
6
6
|
const dashCase = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
7
7
|
const styles = ['default', 'direct', 'personal', 'detailed'];
|
|
@@ -115,6 +115,9 @@ class NhAssistantMockAdmin {
|
|
|
115
115
|
case 'tools':
|
|
116
116
|
return method === 'GET' && segments.length === 2 ? { status: 200, body: this.toolCatalog() } : failure(404, 'assistant-not-found');
|
|
117
117
|
case 'agents':
|
|
118
|
+
if (id !== undefined && action === 'feedback') {
|
|
119
|
+
return this.agentFeedback(method, id, child, segments.length);
|
|
120
|
+
}
|
|
118
121
|
return this.agentsEndpoint(method, id, action, body, segments.length);
|
|
119
122
|
case 'mcp-servers':
|
|
120
123
|
return this.serversEndpoint(method, id, action, child, body, segments.length);
|
|
@@ -217,6 +220,30 @@ class NhAssistantMockAdmin {
|
|
|
217
220
|
}
|
|
218
221
|
return { status: 405 };
|
|
219
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* The feedback report of an agent. The mock runs no agents on their own and records no proposals,
|
|
225
|
+
* so the summary, the list and the JSON Lines export are empty.
|
|
226
|
+
*/
|
|
227
|
+
agentFeedback(method, agentId, child, length) {
|
|
228
|
+
if (!this.agents.has(agentId)) {
|
|
229
|
+
return failure(404, 'assistant-agent-not-found');
|
|
230
|
+
}
|
|
231
|
+
if (method !== 'GET') {
|
|
232
|
+
return { status: 405 };
|
|
233
|
+
}
|
|
234
|
+
if (length === 4) {
|
|
235
|
+
return { status: 200, body: { items: [], total: 0 } };
|
|
236
|
+
}
|
|
237
|
+
if (length === 5 && child === 'summary') {
|
|
238
|
+
const to = Date.parse(this.now());
|
|
239
|
+
const from = to - 30 * 24 * 60 * 60 * 1000;
|
|
240
|
+
return { status: 200, body: { agentId, from: new Date(from).toISOString(), to: new Date(to).toISOString(), rows: [] } };
|
|
241
|
+
}
|
|
242
|
+
if (length === 5 && child === 'export') {
|
|
243
|
+
return { status: 200 };
|
|
244
|
+
}
|
|
245
|
+
return failure(404, 'assistant-not-found');
|
|
246
|
+
}
|
|
220
247
|
serversEndpoint(method, id, action, child, body, length) {
|
|
221
248
|
if (id === undefined) {
|
|
222
249
|
if (method === 'GET') {
|
|
@@ -1149,6 +1176,8 @@ class NhAssistantMockLiveService {
|
|
|
1149
1176
|
this.read$ = this.readSubject.asObservable();
|
|
1150
1177
|
this.removed$ = this.removedSubject.asObservable();
|
|
1151
1178
|
this.events$ = this.eventSubject.asObservable();
|
|
1179
|
+
/** Agents of the mock never run on their own, so their work never changes. */
|
|
1180
|
+
this.agentWork$ = NEVER;
|
|
1152
1181
|
this.resync$ = this.resyncSubject.asObservable();
|
|
1153
1182
|
this.state = this.stateSignal.asReadonly();
|
|
1154
1183
|
inject(DestroyRef).onDestroy(() => this.subscription?.unsubscribe());
|