@memberjunction/ng-conversations 6.2.0-edge.5 → 6.2.0-edge.7

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.
Files changed (164) hide show
  1. package/dist/lib/components/attachment/image-viewer.component.d.ts +3 -1
  2. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  3. package/dist/lib/components/attachment/image-viewer.component.js +5 -1
  4. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  5. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  6. package/dist/lib/components/collection/collection-view.component.js +1 -0
  7. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  8. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +188 -9
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  10. package/dist/lib/components/conversation/conversation-chat-area.component.js +1333 -464
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  12. package/dist/lib/components/conversation/conversation-mode-picker.component.js +2 -2
  13. package/dist/lib/components/conversation/conversation-mode-picker.component.js.map +1 -1
  14. package/dist/lib/components/conversation/conversation-remote-browser-controller.d.ts +109 -0
  15. package/dist/lib/components/conversation/conversation-remote-browser-controller.d.ts.map +1 -0
  16. package/dist/lib/components/conversation/conversation-remote-browser-controller.js +298 -0
  17. package/dist/lib/components/conversation/conversation-remote-browser-controller.js.map +1 -0
  18. package/dist/lib/components/message/agent-handoff-card.component.d.ts +102 -0
  19. package/dist/lib/components/message/agent-handoff-card.component.d.ts.map +1 -0
  20. package/dist/lib/components/message/agent-handoff-card.component.js +439 -0
  21. package/dist/lib/components/message/agent-handoff-card.component.js.map +1 -0
  22. package/dist/lib/components/message/message-input.component.d.ts +126 -59
  23. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  24. package/dist/lib/components/message/message-input.component.js +559 -554
  25. package/dist/lib/components/message/message-input.component.js.map +1 -1
  26. package/dist/lib/components/message/message-item.component.d.ts +34 -2
  27. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  28. package/dist/lib/components/message/message-item.component.js +678 -520
  29. package/dist/lib/components/message/message-item.component.js.map +1 -1
  30. package/dist/lib/components/message/message-list.component.d.ts +13 -1
  31. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  32. package/dist/lib/components/message/message-list.component.js +92 -39
  33. package/dist/lib/components/message/message-list.component.js.map +1 -1
  34. package/dist/lib/components/overlay/chat-overlay.component.d.ts +19 -0
  35. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  36. package/dist/lib/components/overlay/chat-overlay.component.js +125 -13
  37. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  38. package/dist/lib/components/project/project-form-modal.component.js +2 -2
  39. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  40. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +1 -1
  41. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -1
  42. package/dist/lib/components/realtime/media/media-channel-state.d.ts +5 -0
  43. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -1
  44. package/dist/lib/components/realtime/media/media-channel-state.js +27 -1
  45. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -1
  46. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  47. package/dist/lib/components/realtime/media/media-channel.js +7 -2
  48. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  49. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +19 -2
  50. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -1
  51. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +59 -10
  52. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -1
  53. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +22 -6
  54. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  55. package/dist/lib/components/realtime/realtime-agent-banner.component.js +160 -98
  56. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  57. package/dist/lib/components/realtime/realtime-call-failure-notice.d.ts +13 -0
  58. package/dist/lib/components/realtime/realtime-call-failure-notice.d.ts.map +1 -0
  59. package/dist/lib/components/realtime/realtime-call-failure-notice.js +21 -0
  60. package/dist/lib/components/realtime/realtime-call-failure-notice.js.map +1 -0
  61. package/dist/lib/components/realtime/realtime-composer.component.d.ts +26 -3
  62. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  63. package/dist/lib/components/realtime/realtime-composer.component.js +226 -120
  64. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  65. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +73 -16
  66. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  67. package/dist/lib/components/realtime/realtime-session-overlay.component.js +219 -108
  68. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  69. package/dist/lib/components/realtime/realtime-ui-config.d.ts +9 -12
  70. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  71. package/dist/lib/components/realtime/realtime-ui-config.js +38 -18
  72. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  73. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  74. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +34 -5
  75. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  76. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +8 -2
  77. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -1
  78. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +51 -10
  79. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -1
  80. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.d.ts +46 -0
  81. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.d.ts.map +1 -0
  82. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.js +64 -0
  83. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.js.map +1 -0
  84. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +131 -9
  85. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  86. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +347 -38
  87. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  88. package/dist/lib/conversations.module.d.ts +2 -1
  89. package/dist/lib/conversations.module.d.ts.map +1 -1
  90. package/dist/lib/conversations.module.js +9 -4
  91. package/dist/lib/conversations.module.js.map +1 -1
  92. package/dist/lib/events/chat-events.d.ts +5 -4
  93. package/dist/lib/events/chat-events.d.ts.map +1 -1
  94. package/dist/lib/events/chat-events.js +2 -2
  95. package/dist/lib/events/chat-events.js.map +1 -1
  96. package/dist/lib/models/agent-turn.model.d.ts +11 -7
  97. package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
  98. package/dist/lib/models/agent-turn.model.js.map +1 -1
  99. package/dist/lib/services/active-tasks.service.d.ts +5 -0
  100. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  101. package/dist/lib/services/active-tasks.service.js +16 -0
  102. package/dist/lib/services/active-tasks.service.js.map +1 -1
  103. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  104. package/dist/lib/services/agent-state.service.js +7 -1
  105. package/dist/lib/services/agent-state.service.js.map +1 -1
  106. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  107. package/dist/lib/services/artifact-permission.service.js +2 -0
  108. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  109. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  110. package/dist/lib/services/artifact-state.service.js +1 -0
  111. package/dist/lib/services/artifact-state.service.js.map +1 -1
  112. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  113. package/dist/lib/services/collection-permission.service.js +1 -0
  114. package/dist/lib/services/collection-permission.service.js.map +1 -1
  115. package/dist/lib/services/conversation-agent.service.d.ts +38 -16
  116. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  117. package/dist/lib/services/conversation-agent.service.js +57 -71
  118. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  119. package/dist/lib/services/conversation-detail-window.store.d.ts +5 -0
  120. package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
  121. package/dist/lib/services/conversation-detail-window.store.js +52 -5
  122. package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
  123. package/dist/lib/services/realtime-session-review.service.d.ts +2 -1
  124. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  125. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  126. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  127. package/dist/lib/services/realtime-session.service.js +2 -1
  128. package/dist/lib/services/realtime-session.service.js.map +1 -1
  129. package/dist/lib/services/search.service.d.ts.map +1 -1
  130. package/dist/lib/services/search.service.js +1 -0
  131. package/dist/lib/services/search.service.js.map +1 -1
  132. package/dist/lib/utils/agent-failure-display.d.ts +14 -0
  133. package/dist/lib/utils/agent-failure-display.d.ts.map +1 -0
  134. package/dist/lib/utils/agent-failure-display.js +26 -0
  135. package/dist/lib/utils/agent-failure-display.js.map +1 -0
  136. package/dist/lib/utils/agent-handoff-map.d.ts +52 -0
  137. package/dist/lib/utils/agent-handoff-map.d.ts.map +1 -0
  138. package/dist/lib/utils/agent-handoff-map.js +270 -0
  139. package/dist/lib/utils/agent-handoff-map.js.map +1 -0
  140. package/dist/lib/utils/agent-turn-routing.d.ts +62 -7
  141. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -1
  142. package/dist/lib/utils/agent-turn-routing.js +147 -6
  143. package/dist/lib/utils/agent-turn-routing.js.map +1 -1
  144. package/dist/lib/utils/decision-routing.d.ts +17 -9
  145. package/dist/lib/utils/decision-routing.d.ts.map +1 -1
  146. package/dist/lib/utils/decision-routing.js +23 -14
  147. package/dist/lib/utils/decision-routing.js.map +1 -1
  148. package/dist/lib/utils/message-list-order.d.ts +13 -0
  149. package/dist/lib/utils/message-list-order.d.ts.map +1 -0
  150. package/dist/lib/utils/message-list-order.js +31 -0
  151. package/dist/lib/utils/message-list-order.js.map +1 -0
  152. package/dist/lib/utils/pin-state.d.ts +11 -0
  153. package/dist/lib/utils/pin-state.d.ts.map +1 -0
  154. package/dist/lib/utils/pin-state.js +9 -0
  155. package/dist/lib/utils/pin-state.js.map +1 -0
  156. package/dist/lib/utils/thread-replies.d.ts +34 -0
  157. package/dist/lib/utils/thread-replies.d.ts.map +1 -0
  158. package/dist/lib/utils/thread-replies.js +49 -0
  159. package/dist/lib/utils/thread-replies.js.map +1 -0
  160. package/dist/public-api.d.ts +6 -0
  161. package/dist/public-api.d.ts.map +1 -1
  162. package/dist/public-api.js +6 -0
  163. package/dist/public-api.js.map +1 -1
  164. package/package.json +36 -36
@@ -0,0 +1,102 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Six semantic agent accent families in `_tokens.scss` used for deterministic agent accents.
4
+ */
5
+ export declare const AGENT_ACCENT_FAMILIES: readonly ["brand", "accent", "indigo", "violet", "tertiary", "info"];
6
+ export type AgentAccentFamily = (typeof AGENT_ACCENT_FAMILIES)[number];
7
+ /**
8
+ * Deterministically maps a non-empty `agentId` to one of the six semantic agent accent tokens in
9
+ * `_tokens.scss`, returning `var(--mj-agent-accent-<family>)`. With no ID, returns
10
+ * `var(--mj-brand-primary)`.
11
+ */
12
+ export declare function AgentAccentVar(agentId?: string | null): string;
13
+ /**
14
+ * Status of an agent-to-agent conversation handoff.
15
+ */
16
+ export type AgentHandoffStatus = 'Transferring' | 'Transferred' | 'Failed';
17
+ /**
18
+ * Refusal codes produced by `ResolveHandoffTarget` on a failed `Handoff` step.
19
+ */
20
+ export type HandoffRefusalReason = 'NoRunPermission' | 'NotDiscoverable' | 'NotAllowedHere' | 'HopLimit' | 'AlreadyInThisTurn' | 'NotFound';
21
+ /**
22
+ * Identity summary for an agent participating in a handoff.
23
+ */
24
+ export interface AgentHandoffParticipant {
25
+ ID?: string | null;
26
+ Name: string;
27
+ AvatarUrl?: string | null;
28
+ IconClass?: string | null;
29
+ }
30
+ /**
31
+ * Handoff card model attached to the source agent's message row.
32
+ */
33
+ export interface MessageHandoffInfo {
34
+ SourceAgent: AgentHandoffParticipant;
35
+ TargetAgent: AgentHandoffParticipant;
36
+ PresetName?: string | null;
37
+ Brief?: string | null;
38
+ Reason?: string | null;
39
+ Status: AgentHandoffStatus;
40
+ FailureReason?: string | null;
41
+ HopChain?: readonly (AgentHandoffParticipant | string)[] | null;
42
+ TargetDetailId?: string | null;
43
+ }
44
+ /**
45
+ * Target-row provenance attached to the receiving agent's message row.
46
+ */
47
+ export interface MessageHandedOffFromInfo {
48
+ SourceAgent: AgentHandoffParticipant;
49
+ TargetAgent: AgentHandoffParticipant;
50
+ PresetName?: string | null;
51
+ Brief?: string | null;
52
+ Reason?: string | null;
53
+ HopChain?: readonly (AgentHandoffParticipant | string)[] | null;
54
+ SourceDetailId?: string | null;
55
+ }
56
+ export interface FailureCopy {
57
+ ReasonText: string;
58
+ NextStepText: string;
59
+ }
60
+ /**
61
+ * Maps a `RefusalReason` code (or fallback message) to user-facing explanation + next-step copy.
62
+ */
63
+ export declare function MapHandoffFailureCopy(failureReason: string | null | undefined, targetName: string, sourceName: string): FailureCopy;
64
+ /**
65
+ * Inline baton card rendered under the source agent's farewell message when a conversation
66
+ * handoff occurs (`MJ: AI Agent Run Steps` with `StepType = 'Handoff'`).
67
+ */
68
+ export declare class AgentHandoffCardComponent {
69
+ SourceAgent: AgentHandoffParticipant | string | null;
70
+ TargetAgent: AgentHandoffParticipant | string | null;
71
+ PresetName: string | null;
72
+ Brief: string | null;
73
+ Reason: string | null;
74
+ Status: AgentHandoffStatus;
75
+ FailureReason: string | null;
76
+ HopChain: readonly (AgentHandoffParticipant | string)[] | null;
77
+ set Handoff(value: MessageHandoffInfo | null | undefined);
78
+ get ResolvedSource(): AgentHandoffParticipant;
79
+ get ResolvedTarget(): AgentHandoffParticipant;
80
+ get SourceAgentName(): string;
81
+ get TargetAgentName(): string;
82
+ get SourceAvatarUrl(): string | null;
83
+ get TargetAvatarUrl(): string | null;
84
+ get SourceIconClass(): string | null;
85
+ get TargetIconClass(): string | null;
86
+ get SourceInitial(): string;
87
+ get TargetInitial(): string;
88
+ get SourceAccentVar(): string;
89
+ get TargetAccentVar(): string;
90
+ get FailureCopy(): FailureCopy;
91
+ get FailureReasonText(): string;
92
+ get FailureNextStepText(): string;
93
+ get NormalizedHopNames(): string[];
94
+ get HasMultiHopChain(): boolean;
95
+ get LastTwoHopsLabel(): string;
96
+ get ExtraHopCount(): number;
97
+ get FullHopChainTitle(): string;
98
+ get AnnouncedTitle(): string;
99
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentHandoffCardComponent, never>;
100
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgentHandoffCardComponent, "mj-agent-handoff-card", never, { "SourceAgent": { "alias": "SourceAgent"; "required": false; }; "TargetAgent": { "alias": "TargetAgent"; "required": false; }; "PresetName": { "alias": "PresetName"; "required": false; }; "Brief": { "alias": "Brief"; "required": false; }; "Reason": { "alias": "Reason"; "required": false; }; "Status": { "alias": "Status"; "required": false; }; "FailureReason": { "alias": "FailureReason"; "required": false; }; "HopChain": { "alias": "HopChain"; "required": false; }; "Handoff": { "alias": "Handoff"; "required": false; }; }, {}, never, never, true, never>;
101
+ }
102
+ //# sourceMappingURL=agent-handoff-card.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-handoff-card.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/agent-handoff-card.component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,439 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import { NormalizeUUID } from '@memberjunction/global';
3
+ import * as i0 from "@angular/core";
4
+ function AgentHandoffCardComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵdomElement(0, "img", 4);
6
+ } if (rf & 2) {
7
+ const ctx_r0 = i0.ɵɵnextContext();
8
+ i0.ɵɵdomProperty("src", ctx_r0.SourceAvatarUrl, i0.ɵɵsanitizeUrl);
9
+ } }
10
+ function AgentHandoffCardComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
11
+ i0.ɵɵdomElement(0, "i");
12
+ } if (rf & 2) {
13
+ const ctx_r0 = i0.ɵɵnextContext();
14
+ i0.ɵɵclassMap(ctx_r0.SourceIconClass);
15
+ } }
16
+ function AgentHandoffCardComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
17
+ i0.ɵɵdomElementStart(0, "span", 6);
18
+ i0.ɵɵtext(1);
19
+ i0.ɵɵdomElementEnd();
20
+ } if (rf & 2) {
21
+ const ctx_r0 = i0.ɵɵnextContext();
22
+ i0.ɵɵadvance();
23
+ i0.ɵɵtextInterpolate(ctx_r0.SourceInitial);
24
+ } }
25
+ function AgentHandoffCardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵdomElement(0, "span", 9);
27
+ } }
28
+ function AgentHandoffCardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵdomElement(0, "img", 4);
30
+ } if (rf & 2) {
31
+ const ctx_r0 = i0.ɵɵnextContext();
32
+ i0.ɵɵdomProperty("src", ctx_r0.TargetAvatarUrl, i0.ɵɵsanitizeUrl);
33
+ } }
34
+ function AgentHandoffCardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵdomElement(0, "i");
36
+ } if (rf & 2) {
37
+ const ctx_r0 = i0.ɵɵnextContext();
38
+ i0.ɵɵclassMap(ctx_r0.TargetIconClass);
39
+ } }
40
+ function AgentHandoffCardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
41
+ i0.ɵɵdomElementStart(0, "span", 6);
42
+ i0.ɵɵtext(1);
43
+ i0.ɵɵdomElementEnd();
44
+ } if (rf & 2) {
45
+ const ctx_r0 = i0.ɵɵnextContext();
46
+ i0.ɵɵadvance();
47
+ i0.ɵɵtextInterpolate(ctx_r0.TargetInitial);
48
+ } }
49
+ function AgentHandoffCardComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵdomElementStart(0, "strong");
51
+ i0.ɵɵtext(1);
52
+ i0.ɵɵdomElementEnd();
53
+ i0.ɵɵdomElementStart(2, "span", 17);
54
+ i0.ɵɵtext(3, "Starting its own run with your request");
55
+ i0.ɵɵdomElementEnd();
56
+ } if (rf & 2) {
57
+ const ctx_r0 = i0.ɵɵnextContext();
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵtextInterpolate1("Transferring to ", ctx_r0.TargetAgentName, "\u2026");
60
+ } }
61
+ function AgentHandoffCardComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵdomElementStart(0, "strong", 18);
63
+ i0.ɵɵtext(1);
64
+ i0.ɵɵdomElementEnd();
65
+ i0.ɵɵdomElementStart(2, "span", 17);
66
+ i0.ɵɵtext(3);
67
+ i0.ɵɵdomElementEnd();
68
+ } if (rf & 2) {
69
+ const ctx_r0 = i0.ɵɵnextContext();
70
+ i0.ɵɵadvance();
71
+ i0.ɵɵtextInterpolate1("Couldn't transfer to ", ctx_r0.TargetAgentName);
72
+ i0.ɵɵadvance(2);
73
+ i0.ɵɵtextInterpolate(ctx_r0.FailureReasonText);
74
+ } }
75
+ function AgentHandoffCardComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵdomElementStart(0, "strong");
77
+ i0.ɵɵtext(1);
78
+ i0.ɵɵdomElementEnd();
79
+ i0.ɵɵdomElementStart(2, "span", 17);
80
+ i0.ɵɵtext(3, "It now owns this request");
81
+ i0.ɵɵdomElementEnd();
82
+ } if (rf & 2) {
83
+ const ctx_r0 = i0.ɵɵnextContext();
84
+ i0.ɵɵadvance();
85
+ i0.ɵɵtextInterpolate1("Transferred to ", ctx_r0.TargetAgentName);
86
+ } }
87
+ function AgentHandoffCardComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
88
+ i0.ɵɵdomElementStart(0, "span", 15);
89
+ i0.ɵɵtext(1);
90
+ i0.ɵɵdomElementEnd();
91
+ } if (rf & 2) {
92
+ const ctx_r0 = i0.ɵɵnextContext();
93
+ i0.ɵɵadvance();
94
+ i0.ɵɵtextInterpolate(ctx_r0.FailureNextStepText);
95
+ } }
96
+ function AgentHandoffCardComponent_Conditional_25_Conditional_0_Template(rf, ctx) { if (rf & 1) {
97
+ i0.ɵɵdomElementStart(0, "span", 19);
98
+ i0.ɵɵtext(1);
99
+ i0.ɵɵdomElementEnd();
100
+ } if (rf & 2) {
101
+ const ctx_r0 = i0.ɵɵnextContext(2);
102
+ i0.ɵɵadvance();
103
+ i0.ɵɵtextInterpolate1("Power level \u00B7 ", ctx_r0.PresetName);
104
+ } }
105
+ function AgentHandoffCardComponent_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
106
+ i0.ɵɵdomElementStart(0, "span", 20);
107
+ i0.ɵɵtext(1, "Brief handed over");
108
+ i0.ɵɵdomElementEnd();
109
+ } }
110
+ function AgentHandoffCardComponent_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
111
+ i0.ɵɵdomElementStart(0, "span", 20);
112
+ i0.ɵɵtext(1);
113
+ i0.ɵɵdomElementEnd();
114
+ } if (rf & 2) {
115
+ const ctx_r0 = i0.ɵɵnextContext(2);
116
+ i0.ɵɵadvance();
117
+ i0.ɵɵtextInterpolate1("Next messages go to ", ctx_r0.TargetAgentName);
118
+ } }
119
+ function AgentHandoffCardComponent_Conditional_25_Conditional_3_Template(rf, ctx) { if (rf & 1) {
120
+ i0.ɵɵdomElementStart(0, "span", 21);
121
+ i0.ɵɵtext(1);
122
+ i0.ɵɵdomElementEnd();
123
+ } if (rf & 2) {
124
+ const ctx_r0 = i0.ɵɵnextContext(2);
125
+ i0.ɵɵadvance();
126
+ i0.ɵɵtextInterpolate(ctx_r0.Reason);
127
+ } }
128
+ function AgentHandoffCardComponent_Conditional_25_Conditional_4_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵdomElementStart(0, "span", 22)(1, "span", 23);
130
+ i0.ɵɵtext(2);
131
+ i0.ɵɵdomElementEnd();
132
+ i0.ɵɵdomElementStart(3, "span", 24);
133
+ i0.ɵɵtext(4);
134
+ i0.ɵɵdomElementEnd()();
135
+ } if (rf & 2) {
136
+ const ctx_r0 = i0.ɵɵnextContext(2);
137
+ i0.ɵɵattribute("title", ctx_r0.FullHopChainTitle);
138
+ i0.ɵɵadvance(2);
139
+ i0.ɵɵtextInterpolate(ctx_r0.LastTwoHopsLabel);
140
+ i0.ɵɵadvance(2);
141
+ i0.ɵɵtextInterpolate1("+", ctx_r0.ExtraHopCount);
142
+ } }
143
+ function AgentHandoffCardComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵconditionalCreate(0, AgentHandoffCardComponent_Conditional_25_Conditional_0_Template, 2, 1, "span", 19);
145
+ i0.ɵɵconditionalCreate(1, AgentHandoffCardComponent_Conditional_25_Conditional_1_Template, 2, 0, "span", 20);
146
+ i0.ɵɵconditionalCreate(2, AgentHandoffCardComponent_Conditional_25_Conditional_2_Template, 2, 1, "span", 20);
147
+ i0.ɵɵconditionalCreate(3, AgentHandoffCardComponent_Conditional_25_Conditional_3_Template, 2, 1, "span", 21);
148
+ i0.ɵɵconditionalCreate(4, AgentHandoffCardComponent_Conditional_25_Conditional_4_Template, 5, 3, "span", 22);
149
+ } if (rf & 2) {
150
+ const ctx_r0 = i0.ɵɵnextContext();
151
+ i0.ɵɵconditional(ctx_r0.PresetName ? 0 : -1);
152
+ i0.ɵɵadvance();
153
+ i0.ɵɵconditional(ctx_r0.Brief ? 1 : -1);
154
+ i0.ɵɵadvance();
155
+ i0.ɵɵconditional(ctx_r0.Status === "Transferred" ? 2 : -1);
156
+ i0.ɵɵadvance();
157
+ i0.ɵɵconditional(ctx_r0.Reason ? 3 : -1);
158
+ i0.ɵɵadvance();
159
+ i0.ɵɵconditional(ctx_r0.HasMultiHopChain ? 4 : -1);
160
+ } }
161
+ function AgentHandoffCardComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
162
+ i0.ɵɵdomElementStart(0, "details", 16)(1, "summary");
163
+ i0.ɵɵtext(2);
164
+ i0.ɵɵdomElementEnd();
165
+ i0.ɵɵdomElementStart(3, "div", 25);
166
+ i0.ɵɵtext(4);
167
+ i0.ɵɵdomElementEnd()();
168
+ } if (rf & 2) {
169
+ const ctx_r0 = i0.ɵɵnextContext();
170
+ i0.ɵɵadvance(2);
171
+ i0.ɵɵtextInterpolate1("Brief from ", ctx_r0.SourceAgentName);
172
+ i0.ɵɵadvance(2);
173
+ i0.ɵɵtextInterpolate(ctx_r0.Brief);
174
+ } }
175
+ /**
176
+ * Six semantic agent accent families in `_tokens.scss` used for deterministic agent accents.
177
+ */
178
+ export const AGENT_ACCENT_FAMILIES = [
179
+ 'brand',
180
+ 'accent',
181
+ 'indigo',
182
+ 'violet',
183
+ 'tertiary',
184
+ 'info',
185
+ ];
186
+ /**
187
+ * Deterministically maps a non-empty `agentId` to one of the six semantic agent accent tokens in
188
+ * `_tokens.scss`, returning `var(--mj-agent-accent-<family>)`. With no ID, returns
189
+ * `var(--mj-brand-primary)`.
190
+ */
191
+ export function AgentAccentVar(agentId) {
192
+ const normalized = agentId ? NormalizeUUID(agentId.trim()) : '';
193
+ if (!normalized) {
194
+ return 'var(--mj-brand-primary)';
195
+ }
196
+ let hash = 2166136261;
197
+ for (let i = 0; i < normalized.length; i++) {
198
+ hash ^= normalized.charCodeAt(i);
199
+ hash = Math.imul(hash, 16777619);
200
+ }
201
+ const index = (hash >>> 0) % AGENT_ACCENT_FAMILIES.length;
202
+ const family = AGENT_ACCENT_FAMILIES[index];
203
+ return `var(--mj-agent-accent-${family})`;
204
+ }
205
+ /**
206
+ * Maps a `RefusalReason` code (or fallback message) to user-facing explanation + next-step copy.
207
+ */
208
+ export function MapHandoffFailureCopy(failureReason, targetName, sourceName) {
209
+ const code = (failureReason || '').trim();
210
+ switch (code) {
211
+ case 'NoRunPermission':
212
+ return {
213
+ ReasonText: `You don't have access to ${targetName}. ${sourceName} will continue.`,
214
+ NextStepText: `Ask an admin for access to ${targetName}`,
215
+ };
216
+ case 'NotDiscoverable':
217
+ return {
218
+ ReasonText: `${targetName} isn't available for direct transfers. ${sourceName} will continue.`,
219
+ NextStepText: `Continue with ${sourceName} or mention another agent`,
220
+ };
221
+ case 'NotAllowedHere':
222
+ return {
223
+ ReasonText: `${targetName} is not available in this app. ${sourceName} will continue.`,
224
+ NextStepText: `Open a full workspace to use ${targetName}`,
225
+ };
226
+ case 'HopLimit':
227
+ return {
228
+ ReasonText: `Maximum transfer limit reached for this turn. ${sourceName} will continue.`,
229
+ NextStepText: 'Send a follow-up message to continue',
230
+ };
231
+ case 'AlreadyInThisTurn':
232
+ return {
233
+ ReasonText: `${targetName} already participated in this turn. ${sourceName} will continue.`,
234
+ NextStepText: `Mention @${targetName} in your next message`,
235
+ };
236
+ case 'NotFound':
237
+ return {
238
+ ReasonText: `Couldn't find an active agent named ${targetName}. ${sourceName} will continue.`,
239
+ NextStepText: 'Check the agent name or pick another agent',
240
+ };
241
+ default:
242
+ return {
243
+ ReasonText: code
244
+ ? `${code}. ${sourceName} will continue.`
245
+ : `Couldn't transfer to ${targetName}. ${sourceName} will continue.`,
246
+ NextStepText: `Continue with ${sourceName}`,
247
+ };
248
+ }
249
+ }
250
+ function normalizeParticipant(value, fallbackName) {
251
+ if (!value) {
252
+ return { Name: fallbackName };
253
+ }
254
+ if (typeof value === 'string') {
255
+ const trimmed = value.trim();
256
+ return { Name: trimmed || fallbackName };
257
+ }
258
+ return {
259
+ ID: value.ID ?? null,
260
+ Name: value.Name?.trim() || fallbackName,
261
+ AvatarUrl: value.AvatarUrl ?? null,
262
+ IconClass: value.IconClass ?? null,
263
+ };
264
+ }
265
+ /**
266
+ * Inline baton card rendered under the source agent's farewell message when a conversation
267
+ * handoff occurs (`MJ: AI Agent Run Steps` with `StepType = 'Handoff'`).
268
+ */
269
+ export class AgentHandoffCardComponent {
270
+ SourceAgent = null;
271
+ TargetAgent = null;
272
+ PresetName = null;
273
+ Brief = null;
274
+ Reason = null;
275
+ Status = 'Transferred';
276
+ FailureReason = null;
277
+ HopChain = null;
278
+ set Handoff(value) {
279
+ if (!value) {
280
+ return;
281
+ }
282
+ this.SourceAgent = value.SourceAgent;
283
+ this.TargetAgent = value.TargetAgent;
284
+ this.PresetName = value.PresetName ?? null;
285
+ this.Brief = value.Brief ?? null;
286
+ this.Reason = value.Reason ?? null;
287
+ this.Status = value.Status;
288
+ this.FailureReason = value.FailureReason ?? null;
289
+ this.HopChain = value.HopChain ?? null;
290
+ }
291
+ get ResolvedSource() {
292
+ return normalizeParticipant(this.SourceAgent, 'Sage');
293
+ }
294
+ get ResolvedTarget() {
295
+ return normalizeParticipant(this.TargetAgent, 'Agent');
296
+ }
297
+ get SourceAgentName() {
298
+ return this.ResolvedSource.Name;
299
+ }
300
+ get TargetAgentName() {
301
+ return this.ResolvedTarget.Name;
302
+ }
303
+ get SourceAvatarUrl() {
304
+ return this.ResolvedSource.AvatarUrl || null;
305
+ }
306
+ get TargetAvatarUrl() {
307
+ return this.ResolvedTarget.AvatarUrl || null;
308
+ }
309
+ get SourceIconClass() {
310
+ return this.ResolvedSource.IconClass || null;
311
+ }
312
+ get TargetIconClass() {
313
+ return this.ResolvedTarget.IconClass || null;
314
+ }
315
+ get SourceInitial() {
316
+ return this.SourceAgentName.charAt(0).toUpperCase() || 'S';
317
+ }
318
+ get TargetInitial() {
319
+ return this.TargetAgentName.charAt(0).toUpperCase() || 'A';
320
+ }
321
+ get SourceAccentVar() {
322
+ return AgentAccentVar(this.ResolvedSource.ID);
323
+ }
324
+ get TargetAccentVar() {
325
+ return AgentAccentVar(this.ResolvedTarget.ID);
326
+ }
327
+ get FailureCopy() {
328
+ return MapHandoffFailureCopy(this.FailureReason, this.TargetAgentName, this.SourceAgentName);
329
+ }
330
+ get FailureReasonText() {
331
+ return this.FailureCopy.ReasonText;
332
+ }
333
+ get FailureNextStepText() {
334
+ return this.FailureCopy.NextStepText;
335
+ }
336
+ get NormalizedHopNames() {
337
+ if (!this.HopChain || this.HopChain.length === 0) {
338
+ return [];
339
+ }
340
+ return this.HopChain.map((entry, idx) => normalizeParticipant(entry, `Hop ${idx + 1}`).Name);
341
+ }
342
+ get HasMultiHopChain() {
343
+ return this.NormalizedHopNames.length > 2;
344
+ }
345
+ get LastTwoHopsLabel() {
346
+ const names = this.NormalizedHopNames;
347
+ if (names.length < 2) {
348
+ return names.join(' → ');
349
+ }
350
+ return `${names[names.length - 2]} → ${names[names.length - 1]}`;
351
+ }
352
+ get ExtraHopCount() {
353
+ return Math.max(0, this.NormalizedHopNames.length - 2);
354
+ }
355
+ get FullHopChainTitle() {
356
+ return this.NormalizedHopNames.join(' → ');
357
+ }
358
+ get AnnouncedTitle() {
359
+ const target = this.TargetAgentName;
360
+ if (this.Status === 'Transferring') {
361
+ return `Transferring to ${target}`;
362
+ }
363
+ if (this.Status === 'Failed') {
364
+ return `Couldn't transfer to ${target}`;
365
+ }
366
+ return `Transferred to ${target}`;
367
+ }
368
+ static ɵfac = function AgentHandoffCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AgentHandoffCardComponent)(); };
369
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AgentHandoffCardComponent, selectors: [["mj-agent-handoff-card"]], inputs: { SourceAgent: "SourceAgent", TargetAgent: "TargetAgent", PresetName: "PresetName", Brief: "Brief", Reason: "Reason", Status: "Status", FailureReason: "FailureReason", HopChain: "HopChain", Handoff: "Handoff" }, decls: 27, vars: 20, consts: [["role", "status", "aria-live", "polite", 1, "handoff"], [1, "baton"], [1, "end", "end--from"], ["aria-hidden", "true", 1, "avatar", "avatar--source"], ["alt", "", 1, "end-img", 3, "src"], [3, "class"], [1, "end-initial"], [1, "name"], ["aria-hidden", "true", 1, "track"], [1, "spark"], [1, "arrow"], [1, "end", "end--to"], ["aria-hidden", "true", 1, "avatar", "avatar--target"], [1, "handoff-title"], [1, "handoff-meta"], [1, "pill", "pill--next-step"], [1, "handoff-details"], [1, "sub"], [1, "err"], [1, "pill", "pill--target"], [1, "pill"], [1, "pill", "handoff-reason"], [1, "hop-chain"], [1, "pill", "hop-chain-tail"], [1, "pill", "hop-chain-extra"], [1, "brief"]], template: function AgentHandoffCardComponent_Template(rf, ctx) { if (rf & 1) {
370
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
371
+ i0.ɵɵconditionalCreate(4, AgentHandoffCardComponent_Conditional_4_Template, 1, 1, "img", 4)(5, AgentHandoffCardComponent_Conditional_5_Template, 1, 2, "i", 5)(6, AgentHandoffCardComponent_Conditional_6_Template, 2, 1, "span", 6);
372
+ i0.ɵɵdomElementEnd();
373
+ i0.ɵɵdomElementStart(7, "span", 7);
374
+ i0.ɵɵtext(8);
375
+ i0.ɵɵdomElementEnd()();
376
+ i0.ɵɵdomElementStart(9, "div", 8);
377
+ i0.ɵɵconditionalCreate(10, AgentHandoffCardComponent_Conditional_10_Template, 1, 0, "span", 9);
378
+ i0.ɵɵdomElement(11, "span", 10);
379
+ i0.ɵɵdomElementEnd();
380
+ i0.ɵɵdomElementStart(12, "div", 11)(13, "span", 7);
381
+ i0.ɵɵtext(14);
382
+ i0.ɵɵdomElementEnd();
383
+ i0.ɵɵdomElementStart(15, "div", 12);
384
+ i0.ɵɵconditionalCreate(16, AgentHandoffCardComponent_Conditional_16_Template, 1, 1, "img", 4)(17, AgentHandoffCardComponent_Conditional_17_Template, 1, 2, "i", 5)(18, AgentHandoffCardComponent_Conditional_18_Template, 2, 1, "span", 6);
385
+ i0.ɵɵdomElementEnd()()();
386
+ i0.ɵɵdomElementStart(19, "div", 13);
387
+ i0.ɵɵconditionalCreate(20, AgentHandoffCardComponent_Conditional_20_Template, 4, 1)(21, AgentHandoffCardComponent_Conditional_21_Template, 4, 2)(22, AgentHandoffCardComponent_Conditional_22_Template, 4, 1);
388
+ i0.ɵɵdomElementEnd();
389
+ i0.ɵɵdomElementStart(23, "div", 14);
390
+ i0.ɵɵconditionalCreate(24, AgentHandoffCardComponent_Conditional_24_Template, 2, 1, "span", 15)(25, AgentHandoffCardComponent_Conditional_25_Template, 5, 5);
391
+ i0.ɵɵdomElementEnd();
392
+ i0.ɵɵconditionalCreate(26, AgentHandoffCardComponent_Conditional_26_Template, 5, 2, "details", 16);
393
+ i0.ɵɵdomElementEnd();
394
+ } if (rf & 2) {
395
+ i0.ɵɵstyleProp("--mj-handoff-source", ctx.SourceAccentVar)("--mj-handoff-target", ctx.TargetAccentVar);
396
+ i0.ɵɵclassProp("handoff--transferring", ctx.Status === "Transferring")("handoff--transferred", ctx.Status === "Transferred")("handoff--failed", ctx.Status === "Failed");
397
+ i0.ɵɵattribute("data-state", ctx.Status.toLowerCase())("aria-label", ctx.AnnouncedTitle);
398
+ i0.ɵɵadvance(4);
399
+ i0.ɵɵconditional(ctx.SourceAvatarUrl ? 4 : ctx.SourceIconClass ? 5 : 6);
400
+ i0.ɵɵadvance(4);
401
+ i0.ɵɵtextInterpolate(ctx.SourceAgentName);
402
+ i0.ɵɵadvance(2);
403
+ i0.ɵɵconditional(ctx.Status === "Transferring" ? 10 : -1);
404
+ i0.ɵɵadvance(4);
405
+ i0.ɵɵtextInterpolate(ctx.TargetAgentName);
406
+ i0.ɵɵadvance(2);
407
+ i0.ɵɵconditional(ctx.TargetAvatarUrl ? 16 : ctx.TargetIconClass ? 17 : 18);
408
+ i0.ɵɵadvance(4);
409
+ i0.ɵɵconditional(ctx.Status === "Transferring" ? 20 : ctx.Status === "Failed" ? 21 : 22);
410
+ i0.ɵɵadvance(4);
411
+ i0.ɵɵconditional(ctx.Status === "Failed" ? 24 : 25);
412
+ i0.ɵɵadvance(2);
413
+ i0.ɵɵconditional(ctx.Brief && ctx.Status !== "Failed" ? 26 : -1);
414
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.handoff[_ngcontent-%COMP%] {\n --mj-handoff-source: var(--mj-brand-primary);\n --mj-handoff-target: var(--mj-agent-accent-accent);\n position: relative;\n margin: var(--mj-space-2) 0 var(--mj-space-1) 0;\n padding: 14px 16px 12px;\n border-radius: var(--mj-radius-lg);\n background:\n linear-gradient(var(--mj-bg-surface), var(--mj-bg-surface)) padding-box,\n linear-gradient(100deg, var(--mj-handoff-source), var(--mj-handoff-target)) border-box;\n border: 1.5px solid transparent;\n box-shadow: var(--mj-shadow-md);\n display: grid;\n gap: 10px;\n}\n\n.handoff[_ngcontent-%COMP%]::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n background: linear-gradient(\n 100deg,\n color-mix(in srgb, var(--mj-handoff-source) 7%, transparent),\n color-mix(in srgb, var(--mj-handoff-target) 9%, transparent)\n );\n}\n\n.handoff--failed[_ngcontent-%COMP%] {\n background:\n linear-gradient(var(--mj-bg-surface), var(--mj-bg-surface)) padding-box,\n linear-gradient(var(--mj-status-error), var(--mj-status-error)) border-box;\n}\n\n.handoff--failed[_ngcontent-%COMP%]::before {\n background: color-mix(in srgb, var(--mj-status-error) 6%, transparent);\n}\n\n.baton[_ngcontent-%COMP%] {\n position: relative;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: 10px;\n}\n\n.baton[_ngcontent-%COMP%] .end[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.baton[_ngcontent-%COMP%] .end[_ngcontent-%COMP%] .avatar[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n border-radius: var(--mj-radius-full);\n display: grid;\n place-items: center;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-inverse);\n background: var(--mj-handoff-source);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.baton[_ngcontent-%COMP%] .end--to[_ngcontent-%COMP%] .avatar[_ngcontent-%COMP%] {\n background: var(--mj-handoff-target);\n}\n\n.handoff--transferring[_ngcontent-%COMP%] .baton[_ngcontent-%COMP%] .end--to[_ngcontent-%COMP%] .avatar[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_mj-handoff-arrive 1.25s ease-out infinite;\n}\n\n.handoff--failed[_ngcontent-%COMP%] .baton[_ngcontent-%COMP%] .end--to[_ngcontent-%COMP%] .avatar[_ngcontent-%COMP%] {\n filter: grayscale(1);\n opacity: 0.55;\n animation: none;\n}\n\n.end-img[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: var(--mj-radius-full);\n}\n\n.end-initial[_ngcontent-%COMP%] {\n line-height: 1;\n}\n\n.baton[_ngcontent-%COMP%] .end[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n}\n\n.track[_ngcontent-%COMP%] {\n position: relative;\n height: 2px;\n border-radius: 2px;\n background: linear-gradient(90deg, var(--mj-handoff-source), var(--mj-handoff-target));\n opacity: 0.55;\n min-width: 40px;\n}\n\n.handoff--failed[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] {\n background: var(--mj-border-default);\n opacity: 1;\n}\n\n.track[_ngcontent-%COMP%] .spark[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 0;\n width: 10px;\n height: 10px;\n margin-top: -5px;\n margin-left: -5px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-handoff-target);\n box-shadow:\n 0 0 0 4px color-mix(in srgb, var(--mj-handoff-target) 22%, transparent),\n 0 0 18px 2px color-mix(in srgb, var(--mj-handoff-target) 55%, transparent);\n opacity: 0;\n}\n\n.handoff--transferring[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] .spark[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_mj-handoff-travel 1.25s cubic-bezier(0.6, 0, 0.25, 1) infinite;\n}\n\n.track[_ngcontent-%COMP%] .arrow[_ngcontent-%COMP%] {\n position: absolute;\n right: -2px;\n top: 50%;\n width: 8px;\n height: 8px;\n margin-top: -4px;\n border-top: 2px solid var(--mj-handoff-target);\n border-right: 2px solid var(--mj-handoff-target);\n transform: rotate(45deg);\n}\n\n.handoff--failed[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] .arrow[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n@keyframes _ngcontent-%COMP%_mj-handoff-travel {\n 0% {\n left: 0;\n opacity: 0;\n }\n 12% {\n opacity: 1;\n }\n 85% {\n opacity: 1;\n }\n 100% {\n left: 100%;\n opacity: 0;\n }\n}\n\n@keyframes _ngcontent-%COMP%_mj-handoff-arrive {\n 0%,\n 70% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-handoff-target) 50%, transparent);\n }\n 100% {\n box-shadow: 0 0 0 10px color-mix(in srgb, var(--mj-handoff-target) 0%, transparent);\n }\n}\n\n.handoff-title[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 6px 10px;\n}\n\n.handoff-title[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-size: 14.5px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.handoff-title[_ngcontent-%COMP%] .err[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-weight: var(--mj-font-semibold);\n}\n\n.handoff-title[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%] {\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.handoff-meta[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11.5px;\n font-weight: var(--mj-font-medium);\n padding: 2px 8px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n font-variant-numeric: tabular-nums;\n}\n\n.pill--target[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-handoff-target) 35%, var(--mj-border-default));\n color: var(--mj-handoff-target);\n background: color-mix(in srgb, var(--mj-handoff-target) 8%, var(--mj-bg-surface));\n}\n\n.hop-chain[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.handoff[_ngcontent-%COMP%] details[_ngcontent-%COMP%] {\n position: relative;\n font-size: 13px;\n}\n\n.handoff[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] {\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-weight: var(--mj-font-medium);\n list-style: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n user-select: none;\n}\n\n.handoff[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::-webkit-details-marker {\n display: none;\n}\n\n.handoff[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n content: \"\";\n width: 6px;\n height: 6px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(-45deg);\n transition: transform 0.2s ease;\n}\n\n.handoff[_ngcontent-%COMP%] details[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n transform: rotate(45deg);\n}\n\n.handoff[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]:focus-visible {\n outline: var(--mj-ring-width) solid var(--mj-focus-ring-color);\n outline-offset: var(--mj-ring-offset);\n border-radius: var(--mj-radius-sm);\n}\n\n.brief[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding: 10px 12px;\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n white-space: pre-wrap;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .handoff--transferring[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] .spark[_ngcontent-%COMP%] {\n animation: none;\n opacity: 1;\n left: 60%;\n }\n\n .handoff--transferring[_ngcontent-%COMP%] .baton[_ngcontent-%COMP%] .end--to[_ngcontent-%COMP%] .avatar[_ngcontent-%COMP%], \n .handoff[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n animation: none;\n transition: none;\n }\n}"], changeDetection: 0 });
415
+ }
416
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AgentHandoffCardComponent, [{
417
+ type: Component,
418
+ args: [{ standalone: true, selector: 'mj-agent-handoff-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"handoff\"\n [class.handoff--transferring]=\"Status === 'Transferring'\"\n [class.handoff--transferred]=\"Status === 'Transferred'\"\n [class.handoff--failed]=\"Status === 'Failed'\"\n [attr.data-state]=\"Status.toLowerCase()\"\n [style.--mj-handoff-source]=\"SourceAccentVar\"\n [style.--mj-handoff-target]=\"TargetAccentVar\"\n role=\"status\"\n aria-live=\"polite\"\n [attr.aria-label]=\"AnnouncedTitle\"\n>\n <div class=\"baton\">\n <div class=\"end end--from\">\n <div class=\"avatar avatar--source\" aria-hidden=\"true\">\n @if (SourceAvatarUrl) {\n <img class=\"end-img\" [src]=\"SourceAvatarUrl\" alt=\"\" />\n } @else if (SourceIconClass) {\n <i [class]=\"SourceIconClass\"></i>\n } @else {\n <span class=\"end-initial\">{{ SourceInitial }}</span>\n }\n </div>\n <span class=\"name\">{{ SourceAgentName }}</span>\n </div>\n\n <div class=\"track\" aria-hidden=\"true\">\n @if (Status === 'Transferring') {\n <span class=\"spark\"></span>\n }\n <span class=\"arrow\"></span>\n </div>\n\n <div class=\"end end--to\">\n <span class=\"name\">{{ TargetAgentName }}</span>\n <div class=\"avatar avatar--target\" aria-hidden=\"true\">\n @if (TargetAvatarUrl) {\n <img class=\"end-img\" [src]=\"TargetAvatarUrl\" alt=\"\" />\n } @else if (TargetIconClass) {\n <i [class]=\"TargetIconClass\"></i>\n } @else {\n <span class=\"end-initial\">{{ TargetInitial }}</span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"handoff-title\">\n @if (Status === 'Transferring') {\n <strong>Transferring to {{ TargetAgentName }}\u2026</strong>\n <span class=\"sub\">Starting its own run with your request</span>\n } @else if (Status === 'Failed') {\n <strong class=\"err\">Couldn't transfer to {{ TargetAgentName }}</strong>\n <span class=\"sub\">{{ FailureReasonText }}</span>\n } @else {\n <strong>Transferred to {{ TargetAgentName }}</strong>\n <span class=\"sub\">It now owns this request</span>\n }\n </div>\n\n <div class=\"handoff-meta\">\n @if (Status === 'Failed') {\n <span class=\"pill pill--next-step\">{{ FailureNextStepText }}</span>\n } @else {\n @if (PresetName) {\n <span class=\"pill pill--target\">Power level \u00B7 {{ PresetName }}</span>\n }\n @if (Brief) {\n <span class=\"pill\">Brief handed over</span>\n }\n @if (Status === 'Transferred') {\n <span class=\"pill\">Next messages go to {{ TargetAgentName }}</span>\n }\n @if (Reason) {\n <span class=\"pill handoff-reason\">{{ Reason }}</span>\n }\n @if (HasMultiHopChain) {\n <span class=\"hop-chain\" [attr.title]=\"FullHopChainTitle\">\n <span class=\"pill hop-chain-tail\">{{ LastTwoHopsLabel }}</span>\n <span class=\"pill hop-chain-extra\">+{{ ExtraHopCount }}</span>\n </span>\n }\n }\n </div>\n\n @if (Brief && Status !== 'Failed') {\n <details class=\"handoff-details\">\n <summary>Brief from {{ SourceAgentName }}</summary>\n <div class=\"brief\">{{ Brief }}</div>\n </details>\n }\n</div>\n", styles: [":host {\n display: block;\n}\n\n.handoff {\n --mj-handoff-source: var(--mj-brand-primary);\n --mj-handoff-target: var(--mj-agent-accent-accent);\n position: relative;\n margin: var(--mj-space-2) 0 var(--mj-space-1) 0;\n padding: 14px 16px 12px;\n border-radius: var(--mj-radius-lg);\n background:\n linear-gradient(var(--mj-bg-surface), var(--mj-bg-surface)) padding-box,\n linear-gradient(100deg, var(--mj-handoff-source), var(--mj-handoff-target)) border-box;\n border: 1.5px solid transparent;\n box-shadow: var(--mj-shadow-md);\n display: grid;\n gap: 10px;\n}\n\n.handoff::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n background: linear-gradient(\n 100deg,\n color-mix(in srgb, var(--mj-handoff-source) 7%, transparent),\n color-mix(in srgb, var(--mj-handoff-target) 9%, transparent)\n );\n}\n\n.handoff--failed {\n background:\n linear-gradient(var(--mj-bg-surface), var(--mj-bg-surface)) padding-box,\n linear-gradient(var(--mj-status-error), var(--mj-status-error)) border-box;\n}\n\n.handoff--failed::before {\n background: color-mix(in srgb, var(--mj-status-error) 6%, transparent);\n}\n\n.baton {\n position: relative;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: 10px;\n}\n\n.baton .end {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.baton .end .avatar {\n width: 30px;\n height: 30px;\n border-radius: var(--mj-radius-full);\n display: grid;\n place-items: center;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-inverse);\n background: var(--mj-handoff-source);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.baton .end--to .avatar {\n background: var(--mj-handoff-target);\n}\n\n.handoff--transferring .baton .end--to .avatar {\n animation: mj-handoff-arrive 1.25s ease-out infinite;\n}\n\n.handoff--failed .baton .end--to .avatar {\n filter: grayscale(1);\n opacity: 0.55;\n animation: none;\n}\n\n.end-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: var(--mj-radius-full);\n}\n\n.end-initial {\n line-height: 1;\n}\n\n.baton .end .name {\n font-size: 13px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n}\n\n.track {\n position: relative;\n height: 2px;\n border-radius: 2px;\n background: linear-gradient(90deg, var(--mj-handoff-source), var(--mj-handoff-target));\n opacity: 0.55;\n min-width: 40px;\n}\n\n.handoff--failed .track {\n background: var(--mj-border-default);\n opacity: 1;\n}\n\n.track .spark {\n position: absolute;\n top: 50%;\n left: 0;\n width: 10px;\n height: 10px;\n margin-top: -5px;\n margin-left: -5px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-handoff-target);\n box-shadow:\n 0 0 0 4px color-mix(in srgb, var(--mj-handoff-target) 22%, transparent),\n 0 0 18px 2px color-mix(in srgb, var(--mj-handoff-target) 55%, transparent);\n opacity: 0;\n}\n\n.handoff--transferring .track .spark {\n animation: mj-handoff-travel 1.25s cubic-bezier(0.6, 0, 0.25, 1) infinite;\n}\n\n.track .arrow {\n position: absolute;\n right: -2px;\n top: 50%;\n width: 8px;\n height: 8px;\n margin-top: -4px;\n border-top: 2px solid var(--mj-handoff-target);\n border-right: 2px solid var(--mj-handoff-target);\n transform: rotate(45deg);\n}\n\n.handoff--failed .track .arrow {\n border-color: var(--mj-status-error);\n}\n\n@keyframes mj-handoff-travel {\n 0% {\n left: 0;\n opacity: 0;\n }\n 12% {\n opacity: 1;\n }\n 85% {\n opacity: 1;\n }\n 100% {\n left: 100%;\n opacity: 0;\n }\n}\n\n@keyframes mj-handoff-arrive {\n 0%,\n 70% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-handoff-target) 50%, transparent);\n }\n 100% {\n box-shadow: 0 0 0 10px color-mix(in srgb, var(--mj-handoff-target) 0%, transparent);\n }\n}\n\n.handoff-title {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 6px 10px;\n}\n\n.handoff-title strong {\n font-size: 14.5px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.handoff-title .err {\n color: var(--mj-status-error);\n font-weight: var(--mj-font-semibold);\n}\n\n.handoff-title .sub {\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.handoff-meta {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11.5px;\n font-weight: var(--mj-font-medium);\n padding: 2px 8px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n font-variant-numeric: tabular-nums;\n}\n\n.pill--target {\n border-color: color-mix(in srgb, var(--mj-handoff-target) 35%, var(--mj-border-default));\n color: var(--mj-handoff-target);\n background: color-mix(in srgb, var(--mj-handoff-target) 8%, var(--mj-bg-surface));\n}\n\n.hop-chain {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.handoff details {\n position: relative;\n font-size: 13px;\n}\n\n.handoff summary {\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-weight: var(--mj-font-medium);\n list-style: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n user-select: none;\n}\n\n.handoff summary::-webkit-details-marker {\n display: none;\n}\n\n.handoff summary::before {\n content: \"\";\n width: 6px;\n height: 6px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(-45deg);\n transition: transform 0.2s ease;\n}\n\n.handoff details[open] summary::before {\n transform: rotate(45deg);\n}\n\n.handoff summary:focus-visible {\n outline: var(--mj-ring-width) solid var(--mj-focus-ring-color);\n outline-offset: var(--mj-ring-offset);\n border-radius: var(--mj-radius-sm);\n}\n\n.brief {\n margin-top: 8px;\n padding: 10px 12px;\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n white-space: pre-wrap;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .handoff--transferring .track .spark {\n animation: none;\n opacity: 1;\n left: 60%;\n }\n\n .handoff--transferring .baton .end--to .avatar,\n .handoff summary::before {\n animation: none;\n transition: none;\n }\n}\n"] }]
419
+ }], null, { SourceAgent: [{
420
+ type: Input
421
+ }], TargetAgent: [{
422
+ type: Input
423
+ }], PresetName: [{
424
+ type: Input
425
+ }], Brief: [{
426
+ type: Input
427
+ }], Reason: [{
428
+ type: Input
429
+ }], Status: [{
430
+ type: Input
431
+ }], FailureReason: [{
432
+ type: Input
433
+ }], HopChain: [{
434
+ type: Input
435
+ }], Handoff: [{
436
+ type: Input
437
+ }] }); })();
438
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AgentHandoffCardComponent, { className: "AgentHandoffCardComponent", filePath: "src/lib/components/message/agent-handoff-card.component.ts", lineNumber: 177 }); })();
439
+ //# sourceMappingURL=agent-handoff-card.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-handoff-card.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/agent-handoff-card.component.ts","../../../../src/lib/components/message/agent-handoff-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Six semantic agent accent families in `_tokens.scss` used for deterministic agent accents.\n */\nexport const AGENT_ACCENT_FAMILIES = [\n 'brand',\n 'accent',\n 'indigo',\n 'violet',\n 'tertiary',\n 'info',\n] as const;\n\nexport type AgentAccentFamily = (typeof AGENT_ACCENT_FAMILIES)[number];\n\n/**\n * Deterministically maps a non-empty `agentId` to one of the six semantic agent accent tokens in\n * `_tokens.scss`, returning `var(--mj-agent-accent-<family>)`. With no ID, returns\n * `var(--mj-brand-primary)`.\n */\nexport function AgentAccentVar(agentId?: string | null): string {\n const normalized = agentId ? NormalizeUUID(agentId.trim()) : '';\n if (!normalized) {\n return 'var(--mj-brand-primary)';\n }\n let hash = 2166136261;\n for (let i = 0; i < normalized.length; i++) {\n hash ^= normalized.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n const index = (hash >>> 0) % AGENT_ACCENT_FAMILIES.length;\n const family = AGENT_ACCENT_FAMILIES[index];\n return `var(--mj-agent-accent-${family})`;\n}\n\n/**\n * Status of an agent-to-agent conversation handoff.\n */\nexport type AgentHandoffStatus = 'Transferring' | 'Transferred' | 'Failed';\n\n/**\n * Refusal codes produced by `ResolveHandoffTarget` on a failed `Handoff` step.\n */\nexport type HandoffRefusalReason =\n | 'NoRunPermission'\n | 'NotDiscoverable'\n | 'NotAllowedHere'\n | 'HopLimit'\n | 'AlreadyInThisTurn'\n | 'NotFound';\n\n/**\n * Identity summary for an agent participating in a handoff.\n */\nexport interface AgentHandoffParticipant {\n ID?: string | null;\n Name: string;\n AvatarUrl?: string | null;\n IconClass?: string | null;\n}\n\n/**\n * Handoff card model attached to the source agent's message row.\n */\nexport interface MessageHandoffInfo {\n SourceAgent: AgentHandoffParticipant;\n TargetAgent: AgentHandoffParticipant;\n PresetName?: string | null;\n Brief?: string | null;\n Reason?: string | null;\n Status: AgentHandoffStatus;\n FailureReason?: string | null;\n HopChain?: readonly (AgentHandoffParticipant | string)[] | null;\n TargetDetailId?: string | null;\n}\n\n/**\n * Target-row provenance attached to the receiving agent's message row.\n */\nexport interface MessageHandedOffFromInfo {\n SourceAgent: AgentHandoffParticipant;\n TargetAgent: AgentHandoffParticipant;\n PresetName?: string | null;\n Brief?: string | null;\n Reason?: string | null;\n HopChain?: readonly (AgentHandoffParticipant | string)[] | null;\n SourceDetailId?: string | null;\n}\n\nexport interface FailureCopy {\n ReasonText: string;\n NextStepText: string;\n}\n\n/**\n * Maps a `RefusalReason` code (or fallback message) to user-facing explanation + next-step copy.\n */\nexport function MapHandoffFailureCopy(\n failureReason: string | null | undefined,\n targetName: string,\n sourceName: string\n): FailureCopy {\n const code = (failureReason || '').trim();\n switch (code) {\n case 'NoRunPermission':\n return {\n ReasonText: `You don't have access to ${targetName}. ${sourceName} will continue.`,\n NextStepText: `Ask an admin for access to ${targetName}`,\n };\n case 'NotDiscoverable':\n return {\n ReasonText: `${targetName} isn't available for direct transfers. ${sourceName} will continue.`,\n NextStepText: `Continue with ${sourceName} or mention another agent`,\n };\n case 'NotAllowedHere':\n return {\n ReasonText: `${targetName} is not available in this app. ${sourceName} will continue.`,\n NextStepText: `Open a full workspace to use ${targetName}`,\n };\n case 'HopLimit':\n return {\n ReasonText: `Maximum transfer limit reached for this turn. ${sourceName} will continue.`,\n NextStepText: 'Send a follow-up message to continue',\n };\n case 'AlreadyInThisTurn':\n return {\n ReasonText: `${targetName} already participated in this turn. ${sourceName} will continue.`,\n NextStepText: `Mention @${targetName} in your next message`,\n };\n case 'NotFound':\n return {\n ReasonText: `Couldn't find an active agent named ${targetName}. ${sourceName} will continue.`,\n NextStepText: 'Check the agent name or pick another agent',\n };\n default:\n return {\n ReasonText: code\n ? `${code}. ${sourceName} will continue.`\n : `Couldn't transfer to ${targetName}. ${sourceName} will continue.`,\n NextStepText: `Continue with ${sourceName}`,\n };\n }\n}\n\nfunction normalizeParticipant(\n value: AgentHandoffParticipant | string | null | undefined,\n fallbackName: string\n): AgentHandoffParticipant {\n if (!value) {\n return { Name: fallbackName };\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return { Name: trimmed || fallbackName };\n }\n return {\n ID: value.ID ?? null,\n Name: value.Name?.trim() || fallbackName,\n AvatarUrl: value.AvatarUrl ?? null,\n IconClass: value.IconClass ?? null,\n };\n}\n\n/**\n * Inline baton card rendered under the source agent's farewell message when a conversation\n * handoff occurs (`MJ: AI Agent Run Steps` with `StepType = 'Handoff'`).\n */\n@Component({\n standalone: true,\n selector: 'mj-agent-handoff-card',\n templateUrl: './agent-handoff-card.component.html',\n styleUrls: ['./agent-handoff-card.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AgentHandoffCardComponent {\n @Input() SourceAgent: AgentHandoffParticipant | string | null = null;\n @Input() TargetAgent: AgentHandoffParticipant | string | null = null;\n @Input() PresetName: string | null = null;\n @Input() Brief: string | null = null;\n @Input() Reason: string | null = null;\n @Input() Status: AgentHandoffStatus = 'Transferred';\n @Input() FailureReason: string | null = null;\n @Input() HopChain: readonly (AgentHandoffParticipant | string)[] | null = null;\n\n @Input()\n public set Handoff(value: MessageHandoffInfo | null | undefined) {\n if (!value) {\n return;\n }\n this.SourceAgent = value.SourceAgent;\n this.TargetAgent = value.TargetAgent;\n this.PresetName = value.PresetName ?? null;\n this.Brief = value.Brief ?? null;\n this.Reason = value.Reason ?? null;\n this.Status = value.Status;\n this.FailureReason = value.FailureReason ?? null;\n this.HopChain = value.HopChain ?? null;\n }\n\n public get ResolvedSource(): AgentHandoffParticipant {\n return normalizeParticipant(this.SourceAgent, 'Sage');\n }\n\n public get ResolvedTarget(): AgentHandoffParticipant {\n return normalizeParticipant(this.TargetAgent, 'Agent');\n }\n\n public get SourceAgentName(): string {\n return this.ResolvedSource.Name;\n }\n\n public get TargetAgentName(): string {\n return this.ResolvedTarget.Name;\n }\n\n public get SourceAvatarUrl(): string | null {\n return this.ResolvedSource.AvatarUrl || null;\n }\n\n public get TargetAvatarUrl(): string | null {\n return this.ResolvedTarget.AvatarUrl || null;\n }\n\n public get SourceIconClass(): string | null {\n return this.ResolvedSource.IconClass || null;\n }\n\n public get TargetIconClass(): string | null {\n return this.ResolvedTarget.IconClass || null;\n }\n\n public get SourceInitial(): string {\n return this.SourceAgentName.charAt(0).toUpperCase() || 'S';\n }\n\n public get TargetInitial(): string {\n return this.TargetAgentName.charAt(0).toUpperCase() || 'A';\n }\n\n public get SourceAccentVar(): string {\n return AgentAccentVar(this.ResolvedSource.ID);\n }\n\n public get TargetAccentVar(): string {\n return AgentAccentVar(this.ResolvedTarget.ID);\n }\n\n public get FailureCopy(): FailureCopy {\n return MapHandoffFailureCopy(this.FailureReason, this.TargetAgentName, this.SourceAgentName);\n }\n\n public get FailureReasonText(): string {\n return this.FailureCopy.ReasonText;\n }\n\n public get FailureNextStepText(): string {\n return this.FailureCopy.NextStepText;\n }\n\n public get NormalizedHopNames(): string[] {\n if (!this.HopChain || this.HopChain.length === 0) {\n return [];\n }\n return this.HopChain.map((entry, idx) =>\n normalizeParticipant(entry, `Hop ${idx + 1}`).Name\n );\n }\n\n public get HasMultiHopChain(): boolean {\n return this.NormalizedHopNames.length > 2;\n }\n\n public get LastTwoHopsLabel(): string {\n const names = this.NormalizedHopNames;\n if (names.length < 2) {\n return names.join(' → ');\n }\n return `${names[names.length - 2]} → ${names[names.length - 1]}`;\n }\n\n public get ExtraHopCount(): number {\n return Math.max(0, this.NormalizedHopNames.length - 2);\n }\n\n public get FullHopChainTitle(): string {\n return this.NormalizedHopNames.join(' → ');\n }\n\n public get AnnouncedTitle(): string {\n const target = this.TargetAgentName;\n if (this.Status === 'Transferring') {\n return `Transferring to ${target}`;\n }\n if (this.Status === 'Failed') {\n return `Couldn't transfer to ${target}`;\n }\n return `Transferred to ${target}`;\n }\n}\n","<div\n class=\"handoff\"\n [class.handoff--transferring]=\"Status === 'Transferring'\"\n [class.handoff--transferred]=\"Status === 'Transferred'\"\n [class.handoff--failed]=\"Status === 'Failed'\"\n [attr.data-state]=\"Status.toLowerCase()\"\n [style.--mj-handoff-source]=\"SourceAccentVar\"\n [style.--mj-handoff-target]=\"TargetAccentVar\"\n role=\"status\"\n aria-live=\"polite\"\n [attr.aria-label]=\"AnnouncedTitle\"\n>\n <div class=\"baton\">\n <div class=\"end end--from\">\n <div class=\"avatar avatar--source\" aria-hidden=\"true\">\n @if (SourceAvatarUrl) {\n <img class=\"end-img\" [src]=\"SourceAvatarUrl\" alt=\"\" />\n } @else if (SourceIconClass) {\n <i [class]=\"SourceIconClass\"></i>\n } @else {\n <span class=\"end-initial\">{{ SourceInitial }}</span>\n }\n </div>\n <span class=\"name\">{{ SourceAgentName }}</span>\n </div>\n\n <div class=\"track\" aria-hidden=\"true\">\n @if (Status === 'Transferring') {\n <span class=\"spark\"></span>\n }\n <span class=\"arrow\"></span>\n </div>\n\n <div class=\"end end--to\">\n <span class=\"name\">{{ TargetAgentName }}</span>\n <div class=\"avatar avatar--target\" aria-hidden=\"true\">\n @if (TargetAvatarUrl) {\n <img class=\"end-img\" [src]=\"TargetAvatarUrl\" alt=\"\" />\n } @else if (TargetIconClass) {\n <i [class]=\"TargetIconClass\"></i>\n } @else {\n <span class=\"end-initial\">{{ TargetInitial }}</span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"handoff-title\">\n @if (Status === 'Transferring') {\n <strong>Transferring to {{ TargetAgentName }}…</strong>\n <span class=\"sub\">Starting its own run with your request</span>\n } @else if (Status === 'Failed') {\n <strong class=\"err\">Couldn't transfer to {{ TargetAgentName }}</strong>\n <span class=\"sub\">{{ FailureReasonText }}</span>\n } @else {\n <strong>Transferred to {{ TargetAgentName }}</strong>\n <span class=\"sub\">It now owns this request</span>\n }\n </div>\n\n <div class=\"handoff-meta\">\n @if (Status === 'Failed') {\n <span class=\"pill pill--next-step\">{{ FailureNextStepText }}</span>\n } @else {\n @if (PresetName) {\n <span class=\"pill pill--target\">Power level · {{ PresetName }}</span>\n }\n @if (Brief) {\n <span class=\"pill\">Brief handed over</span>\n }\n @if (Status === 'Transferred') {\n <span class=\"pill\">Next messages go to {{ TargetAgentName }}</span>\n }\n @if (Reason) {\n <span class=\"pill handoff-reason\">{{ Reason }}</span>\n }\n @if (HasMultiHopChain) {\n <span class=\"hop-chain\" [attr.title]=\"FullHopChainTitle\">\n <span class=\"pill hop-chain-tail\">{{ LastTwoHopsLabel }}</span>\n <span class=\"pill hop-chain-extra\">+{{ ExtraHopCount }}</span>\n </span>\n }\n }\n </div>\n\n @if (Brief && Status !== 'Failed') {\n <details class=\"handoff-details\">\n <summary>Brief from {{ SourceAgentName }}</summary>\n <div class=\"brief\">{{ Brief }}</div>\n </details>\n }\n</div>\n"]}