@memberjunction/ng-conversations 6.1.0-edge.2 → 6.1.0-edge.3

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 (39) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +32 -1
  3. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +159 -9
  4. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  5. package/dist/lib/components/conversation/conversation-chat-area.component.js +497 -106
  6. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  7. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +14 -2
  8. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  9. package/dist/lib/components/conversation/pinned-messages-panel.component.js +37 -19
  10. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  11. package/dist/lib/components/message/message-input.component.d.ts +7 -3
  12. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  13. package/dist/lib/components/message/message-input.component.js +78 -159
  14. package/dist/lib/components/message/message-input.component.js.map +1 -1
  15. package/dist/lib/components/message/message-list.component.d.ts +287 -7
  16. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  17. package/dist/lib/components/message/message-list.component.js +850 -56
  18. package/dist/lib/components/message/message-list.component.js.map +1 -1
  19. package/dist/lib/services/conversation-agent.service.d.ts +98 -16
  20. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  21. package/dist/lib/services/conversation-agent.service.js +218 -69
  22. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  23. package/dist/lib/services/conversation-detail-window.store.d.ts +206 -0
  24. package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -0
  25. package/dist/lib/services/conversation-detail-window.store.js +503 -0
  26. package/dist/lib/services/conversation-detail-window.store.js.map +1 -0
  27. package/dist/lib/utils/agent-artifact-summary.d.ts +54 -0
  28. package/dist/lib/utils/agent-artifact-summary.d.ts.map +1 -0
  29. package/dist/lib/utils/agent-artifact-summary.js +49 -0
  30. package/dist/lib/utils/agent-artifact-summary.js.map +1 -0
  31. package/dist/lib/utils/conversation-detail-window.d.ts +49 -0
  32. package/dist/lib/utils/conversation-detail-window.d.ts.map +1 -0
  33. package/dist/lib/utils/conversation-detail-window.js +86 -0
  34. package/dist/lib/utils/conversation-detail-window.js.map +1 -0
  35. package/dist/lib/utils/date-jump.d.ts +65 -0
  36. package/dist/lib/utils/date-jump.d.ts.map +1 -0
  37. package/dist/lib/utils/date-jump.js +106 -0
  38. package/dist/lib/utils/date-jump.js.map +1 -0
  39. package/package.json +32 -32
@@ -2,7 +2,19 @@ import { EventEmitter } from '@angular/core';
2
2
  import { MJConversationDetailEntity } from '@memberjunction/core-entities';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class PinnedMessagesPanelComponent {
5
- pinnedMessages: MJConversationDetailEntity[];
5
+ /**
6
+ * Readonly because the chat area hands over the window store's own pin array by reference —
7
+ * a stable reference between real changes is what keeps this input from re-firing every
8
+ * change detection cycle. The panel renders it; it never mutates it.
9
+ */
10
+ pinnedMessages: readonly MJConversationDetailEntity[];
11
+ /**
12
+ * True during the panel's first open, while its rows are being fetched.
13
+ *
14
+ * Pins are no longer loaded during conversation open — the open path reads only a count —
15
+ * so the panel can now render before its contents exist.
16
+ */
17
+ isLoading: boolean;
6
18
  closed: EventEmitter<void>;
7
19
  jumpRequested: EventEmitter<string>;
8
20
  unpinRequested: EventEmitter<MJConversationDetailEntity>;
@@ -19,6 +31,6 @@ export declare class PinnedMessagesPanelComponent {
19
31
  /** Display name for the message sender */
20
32
  GetSenderName(message: MJConversationDetailEntity): string;
21
33
  static ɵfac: i0.ɵɵFactoryDeclaration<PinnedMessagesPanelComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<PinnedMessagesPanelComponent, "mj-pinned-messages-panel", never, { "pinnedMessages": { "alias": "pinnedMessages"; "required": false; }; }, { "closed": "closed"; "jumpRequested": "jumpRequested"; "unpinRequested": "unpinRequested"; }, never, never, false, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<PinnedMessagesPanelComponent, "mj-pinned-messages-panel", never, { "pinnedMessages": { "alias": "pinnedMessages"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; }, { "closed": "closed"; "jumpRequested": "jumpRequested"; "unpinRequested": "unpinRequested"; }, never, never, false, never>;
23
35
  }
24
36
  //# sourceMappingURL=pinned-messages-panel.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pinned-messages-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/pinned-messages-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;;AAE3E,qBAMa,4BAA4B;IACvB,cAAc,EAAE,0BAA0B,EAAE,CAAM;IAEjD,MAAM,qBAA4B;IAClC,aAAa,uBAA8B;IAC3C,cAAc,2CAAkD;IAEjF,2DAA2D;IACpD,YAAY,cAAqB;IAEjC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAIjD,OAAO,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IASlD,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO;IAIhE,qDAAqD;IAC9C,cAAc,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM;IAgBlE,wCAAwC;IACjC,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM;IAenE,0CAA0C;IACnC,aAAa,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM;yCAjEtD,4BAA4B;2CAA5B,4BAA4B;CAqExC"}
1
+ {"version":3,"file":"pinned-messages-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/pinned-messages-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;;AAE3E,qBAMa,4BAA4B;IACvC;;;;OAIG;IACa,cAAc,EAAE,SAAS,0BAA0B,EAAE,CAAM;IAE3E;;;;;OAKG;IACa,SAAS,UAAS;IAEjB,MAAM,qBAA4B;IAClC,aAAa,uBAA8B;IAC3C,cAAc,2CAAkD;IAEjF,2DAA2D;IACpD,YAAY,cAAqB;IAEjC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAIjD,OAAO,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IASlD,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO;IAIhE,qDAAqD;IAC9C,cAAc,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM;IAgBlE,wCAAwC;IACjC,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM;IAenE,0CAA0C;IACnC,aAAa,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM;yCA9EtD,4BAA4B;2CAA5B,4BAA4B;CAkFxC"}
@@ -1,31 +1,35 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@memberjunction/ng-ui-components";
4
+ import * as i2 from "@memberjunction/ng-shared-generic";
4
5
  const _forTrack0 = ($index, $item) => $item.ID;
5
6
  function PinnedMessagesPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
6
- i0.ɵɵelement(0, "mj-empty-state", 8);
7
+ i0.ɵɵelement(0, "mj-loading", 8);
7
8
  } }
8
- function PinnedMessagesPanelComponent_For_13_Template(rf, ctx) { if (rf & 1) {
9
+ function PinnedMessagesPanelComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
10
+ i0.ɵɵelement(0, "mj-empty-state", 9);
11
+ } }
12
+ function PinnedMessagesPanelComponent_For_14_Template(rf, ctx) { if (rf & 1) {
9
13
  const _r1 = i0.ɵɵgetCurrentView();
10
- i0.ɵɵelementStart(0, "div", 10)(1, "div", 11)(2, "div", 12)(3, "div", 13);
11
- i0.ɵɵelement(4, "i", 14);
14
+ i0.ɵɵelementStart(0, "div", 11)(1, "div", 12)(2, "div", 13)(3, "div", 14);
15
+ i0.ɵɵelement(4, "i", 15);
12
16
  i0.ɵɵelementEnd();
13
- i0.ɵɵelementStart(5, "span", 15);
17
+ i0.ɵɵelementStart(5, "span", 16);
14
18
  i0.ɵɵtext(6);
15
19
  i0.ɵɵelementEnd()();
16
- i0.ɵɵelementStart(7, "span", 16);
20
+ i0.ɵɵelementStart(7, "span", 17);
17
21
  i0.ɵɵtext(8);
18
22
  i0.ɵɵelementEnd()();
19
- i0.ɵɵelementStart(9, "p", 17);
23
+ i0.ɵɵelementStart(9, "p", 18);
20
24
  i0.ɵɵtext(10);
21
25
  i0.ɵɵelementEnd();
22
- i0.ɵɵelementStart(11, "div", 18)(12, "button", 19);
23
- i0.ɵɵlistener("click", function PinnedMessagesPanelComponent_For_13_Template_button_click_12_listener() { const message_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnJump(message_r2)); });
24
- i0.ɵɵelement(13, "i", 20);
26
+ i0.ɵɵelementStart(11, "div", 19)(12, "button", 20);
27
+ i0.ɵɵlistener("click", function PinnedMessagesPanelComponent_For_14_Template_button_click_12_listener() { const message_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnJump(message_r2)); });
28
+ i0.ɵɵelement(13, "i", 21);
25
29
  i0.ɵɵtext(14, " Jump to message ");
26
30
  i0.ɵɵelementEnd();
27
- i0.ɵɵelementStart(15, "button", 21);
28
- i0.ɵɵlistener("click", function PinnedMessagesPanelComponent_For_13_Template_button_click_15_listener() { const message_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnUnpin(message_r2)); });
31
+ i0.ɵɵelementStart(15, "button", 22);
32
+ i0.ɵɵlistener("click", function PinnedMessagesPanelComponent_For_14_Template_button_click_15_listener() { const message_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnUnpin(message_r2)); });
29
33
  i0.ɵɵelement(16, "i", 3);
30
34
  i0.ɵɵtext(17, " Unpin ");
31
35
  i0.ɵɵelementEnd()()();
@@ -41,7 +45,19 @@ function PinnedMessagesPanelComponent_For_13_Template(rf, ctx) { if (rf & 1) {
41
45
  i0.ɵɵtextInterpolate(ctx_r2.GetPreviewText(message_r2));
42
46
  } }
43
47
  export class PinnedMessagesPanelComponent {
48
+ /**
49
+ * Readonly because the chat area hands over the window store's own pin array by reference —
50
+ * a stable reference between real changes is what keeps this input from re-firing every
51
+ * change detection cycle. The panel renders it; it never mutates it.
52
+ */
44
53
  pinnedMessages = [];
54
+ /**
55
+ * True during the panel's first open, while its rows are being fetched.
56
+ *
57
+ * Pins are no longer loaded during conversation open — the open path reads only a count —
58
+ * so the panel can now render before its contents exist.
59
+ */
60
+ isLoading = false;
45
61
  closed = new EventEmitter();
46
62
  jumpRequested = new EventEmitter(); // emits messageId
47
63
  unpinRequested = new EventEmitter();
@@ -108,7 +124,7 @@ export class PinnedMessagesPanelComponent {
108
124
  return 'AI Response';
109
125
  }
110
126
  static ɵfac = function PinnedMessagesPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PinnedMessagesPanelComponent)(); };
111
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PinnedMessagesPanelComponent, selectors: [["mj-pinned-messages-panel"]], inputs: { pinnedMessages: "pinnedMessages" }, outputs: { closed: "closed", jumpRequested: "jumpRequested", unpinRequested: "unpinRequested" }, standalone: false, decls: 14, vars: 2, consts: [[1, "pins-panel"], [1, "pins-header"], [1, "pins-title"], [1, "fas", "fa-thumbtack"], [1, "pins-count"], ["title", "Close", 1, "pins-close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "pins-body"], ["Size", "compact", "Icon", "fa-solid fa-thumbtack", "Title", "No pinned messages", 1, "pins-empty"], [1, "pin-card", 3, "unpinning"], [1, "pin-card"], [1, "pin-card-meta"], [1, "pin-sender"], [1, "pin-avatar"], [1, "fas", "fa-robot"], [1, "pin-sender-name"], [1, "pin-time"], [1, "pin-preview"], [1, "pin-actions"], ["title", "Jump to message", 1, "pin-action-btn", "jump-btn", 3, "click"], [1, "fas", "fa-arrow-up-right-from-square"], ["title", "Unpin this message", 1, "pin-action-btn", "unpin-btn", 3, "click"]], template: function PinnedMessagesPanelComponent_Template(rf, ctx) { if (rf & 1) {
127
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PinnedMessagesPanelComponent, selectors: [["mj-pinned-messages-panel"]], inputs: { pinnedMessages: "pinnedMessages", isLoading: "isLoading" }, outputs: { closed: "closed", jumpRequested: "jumpRequested", unpinRequested: "unpinRequested" }, standalone: false, decls: 15, vars: 2, consts: [[1, "pins-panel"], [1, "pins-header"], [1, "pins-title"], [1, "fas", "fa-thumbtack"], [1, "pins-count"], ["title", "Close", 1, "pins-close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "pins-body"], ["text", "Loading pinned messages\u2026", "size", "small"], ["Size", "compact", "Icon", "fa-solid fa-thumbtack", "Title", "No pinned messages", 1, "pins-empty"], [1, "pin-card", 3, "unpinning"], [1, "pin-card"], [1, "pin-card-meta"], [1, "pin-sender"], [1, "pin-avatar"], [1, "fas", "fa-robot"], [1, "pin-sender-name"], [1, "pin-time"], [1, "pin-preview"], [1, "pin-actions"], ["title", "Jump to message", 1, "pin-action-btn", "jump-btn", 3, "click"], [1, "fas", "fa-arrow-up-right-from-square"], ["title", "Unpin this message", 1, "pin-action-btn", "unpin-btn", 3, "click"]], template: function PinnedMessagesPanelComponent_Template(rf, ctx) { if (rf & 1) {
112
128
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
113
129
  i0.ɵɵelement(3, "i", 3);
114
130
  i0.ɵɵelementStart(4, "span");
@@ -122,23 +138,25 @@ export class PinnedMessagesPanelComponent {
122
138
  i0.ɵɵelement(9, "i", 6);
123
139
  i0.ɵɵelementEnd()();
124
140
  i0.ɵɵelementStart(10, "div", 7);
125
- i0.ɵɵconditionalCreate(11, PinnedMessagesPanelComponent_Conditional_11_Template, 1, 0, "mj-empty-state", 8);
126
- i0.ɵɵrepeaterCreate(12, PinnedMessagesPanelComponent_For_13_Template, 18, 5, "div", 9, _forTrack0);
141
+ i0.ɵɵconditionalCreate(11, PinnedMessagesPanelComponent_Conditional_11_Template, 1, 0, "mj-loading", 8)(12, PinnedMessagesPanelComponent_Conditional_12_Template, 1, 0, "mj-empty-state", 9);
142
+ i0.ɵɵrepeaterCreate(13, PinnedMessagesPanelComponent_For_14_Template, 18, 5, "div", 10, _forTrack0);
127
143
  i0.ɵɵelementEnd()();
128
144
  } if (rf & 2) {
129
145
  i0.ɵɵadvance(7);
130
146
  i0.ɵɵtextInterpolate(ctx.pinnedMessages.length);
131
147
  i0.ɵɵadvance(4);
132
- i0.ɵɵconditional(ctx.pinnedMessages.length === 0 ? 11 : -1);
133
- i0.ɵɵadvance();
148
+ i0.ɵɵconditional(ctx.isLoading ? 11 : ctx.pinnedMessages.length === 0 ? 12 : -1);
149
+ i0.ɵɵadvance(2);
134
150
  i0.ɵɵrepeater(ctx.pinnedMessages);
135
- } }, dependencies: [i1.MJEmptyStateComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n z-index: 50;\n pointer-events: auto;\n animation: _ngcontent-%COMP%_slideInPanel 0.22s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes _ngcontent-%COMP%_slideInPanel {\n from {\n opacity: 0;\n transform: translateX(24px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.pins-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n\n\n.pins-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.pins-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.pins-title[_ngcontent-%COMP%] > i.fa-thumbtack[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.pins-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 11px;\n font-weight: 700;\n}\n\n.pins-close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pins-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.pins-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n\n\n.pins-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 12px;\n color: var(--mj-text-muted);\n}\n\n.pins-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n opacity: 0.4;\n}\n\n.pins-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n}\n\n\n\n.pin-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-left: 3px solid var(--mj-status-warning);\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.pin-card.unpinning[_ngcontent-%COMP%] {\n opacity: 0;\n transform: translateX(12px);\n}\n\n.pin-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n border-left-color: var(--mj-status-warning);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n}\n\n\n\n.pin-card-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.pin-sender[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pin-avatar[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.pin-avatar[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-brand-primary);\n}\n\n.pin-sender-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.pin-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n\n\n.pin-preview[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n\n.pin-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n margin-top: 2px;\n}\n\n.pin-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n border: 1px solid var(--mj-border-default);\n}\n\n.pin-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.jump-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.jump-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.unpin-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.unpin-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.pins-body[_ngcontent-%COMP%]::-webkit-scrollbar { width: 4px; }\n.pins-body[_ngcontent-%COMP%]::-webkit-scrollbar-track { background: transparent; }\n.pins-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 2px;\n}"] });
151
+ } }, dependencies: [i1.MJEmptyStateComponent, i2.LoadingComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n z-index: 50;\n pointer-events: auto;\n animation: _ngcontent-%COMP%_slideInPanel 0.22s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes _ngcontent-%COMP%_slideInPanel {\n from {\n opacity: 0;\n transform: translateX(24px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.pins-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n\n\n.pins-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.pins-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.pins-title[_ngcontent-%COMP%] > i.fa-thumbtack[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.pins-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 11px;\n font-weight: 700;\n}\n\n.pins-close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pins-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.pins-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n\n\n.pins-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 12px;\n color: var(--mj-text-muted);\n}\n\n.pins-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n opacity: 0.4;\n}\n\n.pins-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n}\n\n\n\n.pin-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-left: 3px solid var(--mj-status-warning);\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.pin-card.unpinning[_ngcontent-%COMP%] {\n opacity: 0;\n transform: translateX(12px);\n}\n\n.pin-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n border-left-color: var(--mj-status-warning);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n}\n\n\n\n.pin-card-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.pin-sender[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pin-avatar[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.pin-avatar[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-brand-primary);\n}\n\n.pin-sender-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.pin-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n\n\n.pin-preview[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n\n.pin-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n margin-top: 2px;\n}\n\n.pin-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n border: 1px solid var(--mj-border-default);\n}\n\n.pin-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.jump-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.jump-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.unpin-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.unpin-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.pins-body[_ngcontent-%COMP%]::-webkit-scrollbar { width: 4px; }\n.pins-body[_ngcontent-%COMP%]::-webkit-scrollbar-track { background: transparent; }\n.pins-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 2px;\n}"] });
136
152
  }
137
153
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PinnedMessagesPanelComponent, [{
138
154
  type: Component,
139
- args: [{ standalone: false, selector: 'mj-pinned-messages-panel', template: "<div class=\"pins-panel\">\n <div class=\"pins-header\">\n <div class=\"pins-title\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pinned Messages</span>\n <span class=\"pins-count\">{{ pinnedMessages.length }}</span>\n </div>\n <button class=\"pins-close-btn\" (click)=\"Close()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n <div class=\"pins-body\">\n @if (pinnedMessages.length === 0) {\n <mj-empty-state class=\"pins-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-thumbtack\"\n Title=\"No pinned messages\" />\n }\n\n @for (message of pinnedMessages; track message.ID) {\n <div class=\"pin-card\" [class.unpinning]=\"IsUnpinning(message)\">\n <div class=\"pin-card-meta\">\n <div class=\"pin-sender\">\n <div class=\"pin-avatar\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <span class=\"pin-sender-name\">{{ GetSenderName(message) }}</span>\n </div>\n <span class=\"pin-time\">{{ GetRelativeTime(message) }}</span>\n </div>\n\n <p class=\"pin-preview\">{{ GetPreviewText(message) }}</p>\n\n <div class=\"pin-actions\">\n <button class=\"pin-action-btn jump-btn\" (click)=\"OnJump(message)\" title=\"Jump to message\">\n <i class=\"fas fa-arrow-up-right-from-square\"></i>\n Jump to message\n </button>\n <button class=\"pin-action-btn unpin-btn\" (click)=\"OnUnpin(message)\" title=\"Unpin this message\">\n <i class=\"fas fa-thumbtack\"></i>\n Unpin\n </button>\n </div>\n </div>\n }\n </div>\n</div>\n", styles: ["/* ============================================================\n Pinned Messages Panel \u2014 overlays the right edge of the chat\n ============================================================ */\n\n:host {\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n z-index: 50;\n pointer-events: auto;\n animation: slideInPanel 0.22s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes slideInPanel {\n from {\n opacity: 0;\n transform: translateX(24px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.pins-panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n/* \u2500\u2500 Header \u2500\u2500 */\n.pins-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.pins-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.pins-title > i.fa-thumbtack {\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.pins-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 11px;\n font-weight: 700;\n}\n\n.pins-close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pins-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* \u2500\u2500 Body / Scrollable list \u2500\u2500 */\n.pins-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* \u2500\u2500 Empty state \u2500\u2500 */\n.pins-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 12px;\n color: var(--mj-text-muted);\n}\n\n.pins-empty i {\n font-size: 32px;\n opacity: 0.4;\n}\n\n.pins-empty p {\n font-size: 14px;\n margin: 0;\n}\n\n/* \u2500\u2500 Pin Card \u2500\u2500 */\n.pin-card {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-left: 3px solid var(--mj-status-warning);\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.pin-card.unpinning {\n opacity: 0;\n transform: translateX(12px);\n}\n\n.pin-card:hover {\n border-color: var(--mj-border-strong);\n border-left-color: var(--mj-status-warning);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n}\n\n/* Card meta row: avatar+name on left, time on right */\n.pin-card-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.pin-sender {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pin-avatar {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.pin-avatar i {\n font-size: 10px;\n color: var(--mj-brand-primary);\n}\n\n.pin-sender-name {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.pin-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n/* Preview text */\n.pin-preview {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Card action buttons */\n.pin-actions {\n display: flex;\n gap: 6px;\n margin-top: 2px;\n}\n\n.pin-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n border: 1px solid var(--mj-border-default);\n}\n\n.pin-action-btn i {\n font-size: 11px;\n}\n\n.jump-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.jump-btn:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.unpin-btn {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.unpin-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* \u2500\u2500 Scrollbar styling \u2500\u2500 */\n.pins-body::-webkit-scrollbar { width: 4px; }\n.pins-body::-webkit-scrollbar-track { background: transparent; }\n.pins-body::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 2px;\n}\n"] }]
155
+ args: [{ standalone: false, selector: 'mj-pinned-messages-panel', template: "<div class=\"pins-panel\">\n <div class=\"pins-header\">\n <div class=\"pins-title\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pinned Messages</span>\n <span class=\"pins-count\">{{ pinnedMessages.length }}</span>\n </div>\n <button class=\"pins-close-btn\" (click)=\"Close()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n <div class=\"pins-body\">\n <!-- Rows are fetched on first open now, so \"empty\" and \"not loaded yet\" are different\n states \u2014 showing the empty state during the fetch would claim there are no pins. -->\n @if (isLoading) {\n <mj-loading text=\"Loading pinned messages\u2026\" size=\"small\"></mj-loading>\n } @else if (pinnedMessages.length === 0) {\n <mj-empty-state class=\"pins-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-thumbtack\"\n Title=\"No pinned messages\" />\n }\n\n @for (message of pinnedMessages; track message.ID) {\n <div class=\"pin-card\" [class.unpinning]=\"IsUnpinning(message)\">\n <div class=\"pin-card-meta\">\n <div class=\"pin-sender\">\n <div class=\"pin-avatar\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <span class=\"pin-sender-name\">{{ GetSenderName(message) }}</span>\n </div>\n <span class=\"pin-time\">{{ GetRelativeTime(message) }}</span>\n </div>\n\n <p class=\"pin-preview\">{{ GetPreviewText(message) }}</p>\n\n <div class=\"pin-actions\">\n <button class=\"pin-action-btn jump-btn\" (click)=\"OnJump(message)\" title=\"Jump to message\">\n <i class=\"fas fa-arrow-up-right-from-square\"></i>\n Jump to message\n </button>\n <button class=\"pin-action-btn unpin-btn\" (click)=\"OnUnpin(message)\" title=\"Unpin this message\">\n <i class=\"fas fa-thumbtack\"></i>\n Unpin\n </button>\n </div>\n </div>\n }\n </div>\n</div>\n", styles: ["/* ============================================================\n Pinned Messages Panel \u2014 overlays the right edge of the chat\n ============================================================ */\n\n:host {\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n z-index: 50;\n pointer-events: auto;\n animation: slideInPanel 0.22s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes slideInPanel {\n from {\n opacity: 0;\n transform: translateX(24px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.pins-panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);\n}\n\n/* \u2500\u2500 Header \u2500\u2500 */\n.pins-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.pins-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.pins-title > i.fa-thumbtack {\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.pins-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 11px;\n font-weight: 700;\n}\n\n.pins-close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pins-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* \u2500\u2500 Body / Scrollable list \u2500\u2500 */\n.pins-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* \u2500\u2500 Empty state \u2500\u2500 */\n.pins-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 12px;\n color: var(--mj-text-muted);\n}\n\n.pins-empty i {\n font-size: 32px;\n opacity: 0.4;\n}\n\n.pins-empty p {\n font-size: 14px;\n margin: 0;\n}\n\n/* \u2500\u2500 Pin Card \u2500\u2500 */\n.pin-card {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-left: 3px solid var(--mj-status-warning);\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.pin-card.unpinning {\n opacity: 0;\n transform: translateX(12px);\n}\n\n.pin-card:hover {\n border-color: var(--mj-border-strong);\n border-left-color: var(--mj-status-warning);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n}\n\n/* Card meta row: avatar+name on left, time on right */\n.pin-card-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.pin-sender {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pin-avatar {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.pin-avatar i {\n font-size: 10px;\n color: var(--mj-brand-primary);\n}\n\n.pin-sender-name {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.pin-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n/* Preview text */\n.pin-preview {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Card action buttons */\n.pin-actions {\n display: flex;\n gap: 6px;\n margin-top: 2px;\n}\n\n.pin-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n border: 1px solid var(--mj-border-default);\n}\n\n.pin-action-btn i {\n font-size: 11px;\n}\n\n.jump-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.jump-btn:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.unpin-btn {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.unpin-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* \u2500\u2500 Scrollbar styling \u2500\u2500 */\n.pins-body::-webkit-scrollbar { width: 4px; }\n.pins-body::-webkit-scrollbar-track { background: transparent; }\n.pins-body::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 2px;\n}\n"] }]
140
156
  }], null, { pinnedMessages: [{
141
157
  type: Input
158
+ }], isLoading: [{
159
+ type: Input
142
160
  }], closed: [{
143
161
  type: Output
144
162
  }], jumpRequested: [{
@@ -1 +1 @@
1
- {"version":3,"file":"pinned-messages-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/pinned-messages-panel.component.ts","../../../../src/lib/components/conversation/pinned-messages-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\n@Component({\n standalone: false,\n selector: 'mj-pinned-messages-panel',\n templateUrl: './pinned-messages-panel.component.html',\n styleUrls: ['./pinned-messages-panel.component.css']\n})\nexport class PinnedMessagesPanelComponent {\n @Input() public pinnedMessages: MJConversationDetailEntity[] = [];\n\n @Output() public closed = new EventEmitter<void>();\n @Output() public jumpRequested = new EventEmitter<string>(); // emits messageId\n @Output() public unpinRequested = new EventEmitter<MJConversationDetailEntity>();\n\n /** IDs currently being removed (for fade-out animation) */\n public unpinningIds = new Set<string>();\n\n public Close(): void {\n this.closed.emit();\n }\n\n public OnJump(message: MJConversationDetailEntity): void {\n this.jumpRequested.emit(message.ID);\n }\n\n public OnUnpin(message: MJConversationDetailEntity): void {\n this.unpinningIds.add(message.ID);\n // Let the card animate out before the parent removes it from the list\n setTimeout(() => {\n this.unpinningIds.delete(message.ID);\n this.unpinRequested.emit(message);\n }, 200);\n }\n\n public IsUnpinning(message: MJConversationDetailEntity): boolean {\n return this.unpinningIds.has(message.ID);\n }\n\n /** Strip markdown to plain prose for card preview */\n public GetPreviewText(message: MJConversationDetailEntity): string {\n const raw = message.Message || '';\n const stripped = raw\n .replace(/```[\\s\\S]*?```/g, '[code]') // fenced code blocks\n .replace(/`[^`]*`/g, '[code]') // inline code\n .replace(/#{1,6}\\s+/g, '') // headings\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1') // bold\n .replace(/\\*(.+?)\\*/g, '$1') // italic\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // links\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '') // images\n .replace(/>\\s+/g, '') // blockquotes\n .replace(/\\n+/g, ' ') // newlines → spaces\n .trim();\n return stripped.length > 200 ? stripped.substring(0, 197) + '…' : stripped;\n }\n\n /** Human-readable relative timestamp */\n public GetRelativeTime(message: MJConversationDetailEntity): string {\n const created = message.__mj_CreatedAt;\n if (!created) return '';\n const diffMs = Date.now() - new Date(created).getTime();\n const mins = Math.floor(diffMs / 60_000);\n const hours = Math.floor(diffMs / 3_600_000);\n const days = Math.floor(diffMs / 86_400_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return new Date(created).toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n }\n\n /** Display name for the message sender */\n public GetSenderName(message: MJConversationDetailEntity): string {\n if (message.Role === 'User') return 'You';\n return 'AI Response';\n }\n}\n","<div class=\"pins-panel\">\n <div class=\"pins-header\">\n <div class=\"pins-title\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pinned Messages</span>\n <span class=\"pins-count\">{{ pinnedMessages.length }}</span>\n </div>\n <button class=\"pins-close-btn\" (click)=\"Close()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n <div class=\"pins-body\">\n @if (pinnedMessages.length === 0) {\n <mj-empty-state class=\"pins-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-thumbtack\"\n Title=\"No pinned messages\" />\n }\n\n @for (message of pinnedMessages; track message.ID) {\n <div class=\"pin-card\" [class.unpinning]=\"IsUnpinning(message)\">\n <div class=\"pin-card-meta\">\n <div class=\"pin-sender\">\n <div class=\"pin-avatar\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <span class=\"pin-sender-name\">{{ GetSenderName(message) }}</span>\n </div>\n <span class=\"pin-time\">{{ GetRelativeTime(message) }}</span>\n </div>\n\n <p class=\"pin-preview\">{{ GetPreviewText(message) }}</p>\n\n <div class=\"pin-actions\">\n <button class=\"pin-action-btn jump-btn\" (click)=\"OnJump(message)\" title=\"Jump to message\">\n <i class=\"fas fa-arrow-up-right-from-square\"></i>\n Jump to message\n </button>\n <button class=\"pin-action-btn unpin-btn\" (click)=\"OnUnpin(message)\" title=\"Unpin this message\">\n <i class=\"fas fa-thumbtack\"></i>\n Unpin\n </button>\n </div>\n </div>\n }\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"pinned-messages-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/pinned-messages-panel.component.ts","../../../../src/lib/components/conversation/pinned-messages-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\n@Component({\n standalone: false,\n selector: 'mj-pinned-messages-panel',\n templateUrl: './pinned-messages-panel.component.html',\n styleUrls: ['./pinned-messages-panel.component.css']\n})\nexport class PinnedMessagesPanelComponent {\n /**\n * Readonly because the chat area hands over the window store's own pin array by reference —\n * a stable reference between real changes is what keeps this input from re-firing every\n * change detection cycle. The panel renders it; it never mutates it.\n */\n @Input() public pinnedMessages: readonly MJConversationDetailEntity[] = [];\n\n /**\n * True during the panel's first open, while its rows are being fetched.\n *\n * Pins are no longer loaded during conversation open — the open path reads only a count —\n * so the panel can now render before its contents exist.\n */\n @Input() public isLoading = false;\n\n @Output() public closed = new EventEmitter<void>();\n @Output() public jumpRequested = new EventEmitter<string>(); // emits messageId\n @Output() public unpinRequested = new EventEmitter<MJConversationDetailEntity>();\n\n /** IDs currently being removed (for fade-out animation) */\n public unpinningIds = new Set<string>();\n\n public Close(): void {\n this.closed.emit();\n }\n\n public OnJump(message: MJConversationDetailEntity): void {\n this.jumpRequested.emit(message.ID);\n }\n\n public OnUnpin(message: MJConversationDetailEntity): void {\n this.unpinningIds.add(message.ID);\n // Let the card animate out before the parent removes it from the list\n setTimeout(() => {\n this.unpinningIds.delete(message.ID);\n this.unpinRequested.emit(message);\n }, 200);\n }\n\n public IsUnpinning(message: MJConversationDetailEntity): boolean {\n return this.unpinningIds.has(message.ID);\n }\n\n /** Strip markdown to plain prose for card preview */\n public GetPreviewText(message: MJConversationDetailEntity): string {\n const raw = message.Message || '';\n const stripped = raw\n .replace(/```[\\s\\S]*?```/g, '[code]') // fenced code blocks\n .replace(/`[^`]*`/g, '[code]') // inline code\n .replace(/#{1,6}\\s+/g, '') // headings\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1') // bold\n .replace(/\\*(.+?)\\*/g, '$1') // italic\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // links\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '') // images\n .replace(/>\\s+/g, '') // blockquotes\n .replace(/\\n+/g, ' ') // newlines → spaces\n .trim();\n return stripped.length > 200 ? stripped.substring(0, 197) + '…' : stripped;\n }\n\n /** Human-readable relative timestamp */\n public GetRelativeTime(message: MJConversationDetailEntity): string {\n const created = message.__mj_CreatedAt;\n if (!created) return '';\n const diffMs = Date.now() - new Date(created).getTime();\n const mins = Math.floor(diffMs / 60_000);\n const hours = Math.floor(diffMs / 3_600_000);\n const days = Math.floor(diffMs / 86_400_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return new Date(created).toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n }\n\n /** Display name for the message sender */\n public GetSenderName(message: MJConversationDetailEntity): string {\n if (message.Role === 'User') return 'You';\n return 'AI Response';\n }\n}\n","<div class=\"pins-panel\">\n <div class=\"pins-header\">\n <div class=\"pins-title\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pinned Messages</span>\n <span class=\"pins-count\">{{ pinnedMessages.length }}</span>\n </div>\n <button class=\"pins-close-btn\" (click)=\"Close()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n <div class=\"pins-body\">\n <!-- Rows are fetched on first open now, so \"empty\" and \"not loaded yet\" are different\n states — showing the empty state during the fetch would claim there are no pins. -->\n @if (isLoading) {\n <mj-loading text=\"Loading pinned messages…\" size=\"small\"></mj-loading>\n } @else if (pinnedMessages.length === 0) {\n <mj-empty-state class=\"pins-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-thumbtack\"\n Title=\"No pinned messages\" />\n }\n\n @for (message of pinnedMessages; track message.ID) {\n <div class=\"pin-card\" [class.unpinning]=\"IsUnpinning(message)\">\n <div class=\"pin-card-meta\">\n <div class=\"pin-sender\">\n <div class=\"pin-avatar\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <span class=\"pin-sender-name\">{{ GetSenderName(message) }}</span>\n </div>\n <span class=\"pin-time\">{{ GetRelativeTime(message) }}</span>\n </div>\n\n <p class=\"pin-preview\">{{ GetPreviewText(message) }}</p>\n\n <div class=\"pin-actions\">\n <button class=\"pin-action-btn jump-btn\" (click)=\"OnJump(message)\" title=\"Jump to message\">\n <i class=\"fas fa-arrow-up-right-from-square\"></i>\n Jump to message\n </button>\n <button class=\"pin-action-btn unpin-btn\" (click)=\"OnUnpin(message)\" title=\"Unpin this message\">\n <i class=\"fas fa-thumbtack\"></i>\n Unpin\n </button>\n </div>\n </div>\n }\n </div>\n</div>\n"]}
@@ -575,9 +575,13 @@ export declare class MessageInputComponent extends BaseAngularComponent implemen
575
575
  protected updateConversationDetail(convoDetail: MJConversationDetailEntity, message: string, status: 'In-Progress' | 'Complete' | 'Error', result?: ExecuteAgentResult): Promise<void>;
576
576
  /**
577
577
  * Load previous payload for an agent from its most recent OUTPUT artifact.
578
- * Searches backwards through all messages from this agent until an artifact is found.
579
- * This ensures payload continuity even after clarifying exchanges without artifacts.
580
- * Checks both user-visible and system artifacts to support agents like Agent Manager.
578
+ *
579
+ * Resolved by QUERY rather than by scanning `conversationHistory`. That array is now the
580
+ * loaded transcript WINDOW, not the full conversation, so a scan silently misses any
581
+ * artifact below the window's oldest row — and a null payload is a legal agent input, so
582
+ * the miss surfaces as the agent regenerating from scratch instead of modifying. Covers
583
+ * system-visibility artifacts (Agent Manager and friends) for free: the query filters on
584
+ * Direction, not on Visibility.
581
585
  */
582
586
  private loadPreviousPayloadForAgent;
583
587
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}