@memberjunction/ng-conversations 5.44.0 → 5.45.1

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 (109) hide show
  1. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +3 -1
  2. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  3. package/dist/lib/components/artifact/artifact-share-modal.component.js +16 -12
  4. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  5. package/dist/lib/components/collection/collection-share-modal.component.d.ts +3 -1
  6. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  7. package/dist/lib/components/collection/collection-share-modal.component.js +16 -12
  8. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  9. package/dist/lib/components/collection/collection-tree.component.d.ts +3 -1
  10. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  11. package/dist/lib/components/collection/collection-tree.component.js +10 -7
  12. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  13. package/dist/lib/components/collection/collection-view.component.d.ts +3 -1
  14. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  15. package/dist/lib/components/collection/collection-view.component.js +10 -8
  16. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  17. package/dist/lib/components/composer/ai-composer.component.d.ts +103 -0
  18. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -0
  19. package/dist/lib/components/composer/ai-composer.component.js +263 -0
  20. package/dist/lib/components/composer/ai-composer.component.js.map +1 -0
  21. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +3 -4
  22. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  23. package/dist/lib/components/conversation/conversation-chat-area.component.js +36 -36
  24. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  25. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +1 -1
  26. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  27. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  28. package/dist/lib/components/message/message-input.component.d.ts +5 -6
  29. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  30. package/dist/lib/components/message/message-input.component.js +35 -20
  31. package/dist/lib/components/message/message-input.component.js.map +1 -1
  32. package/dist/lib/components/message/message-item.component.d.ts +2 -3
  33. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  34. package/dist/lib/components/message/message-item.component.js +17 -17
  35. package/dist/lib/components/message/message-item.component.js.map +1 -1
  36. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  37. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  38. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  39. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +11 -3
  40. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  41. package/dist/lib/components/sidebar/conversation-sidebar.component.js +34 -10
  42. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  43. package/dist/lib/components/sidebar/routines-section.component.d.ts +73 -0
  44. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -0
  45. package/dist/lib/components/sidebar/routines-section.component.js +211 -0
  46. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -0
  47. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +12 -0
  48. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  49. package/dist/lib/components/tasks/tasks-dropdown.component.js +37 -1
  50. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  51. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -5
  52. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  53. package/dist/lib/components/workspace/conversation-workspace.component.js +35 -26
  54. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  55. package/dist/lib/composer-plugins/agent-mention.provider.d.ts +16 -0
  56. package/dist/lib/composer-plugins/agent-mention.provider.d.ts.map +1 -0
  57. package/dist/lib/composer-plugins/agent-mention.provider.js +28 -0
  58. package/dist/lib/composer-plugins/agent-mention.provider.js.map +1 -0
  59. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +20 -0
  60. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -0
  61. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +32 -0
  62. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -0
  63. package/dist/lib/composer-plugins/load-composer-plugins.d.ts +9 -0
  64. package/dist/lib/composer-plugins/load-composer-plugins.d.ts.map +1 -0
  65. package/dist/lib/composer-plugins/load-composer-plugins.js +17 -0
  66. package/dist/lib/composer-plugins/load-composer-plugins.js.map +1 -0
  67. package/dist/lib/composer-plugins/record-mention.provider.d.ts +14 -0
  68. package/dist/lib/composer-plugins/record-mention.provider.d.ts.map +1 -0
  69. package/dist/lib/composer-plugins/record-mention.provider.js +26 -0
  70. package/dist/lib/composer-plugins/record-mention.provider.js.map +1 -0
  71. package/dist/lib/composer-plugins/skill-command.provider.d.ts +15 -0
  72. package/dist/lib/composer-plugins/skill-command.provider.d.ts.map +1 -0
  73. package/dist/lib/composer-plugins/skill-command.provider.js +27 -0
  74. package/dist/lib/composer-plugins/skill-command.provider.js.map +1 -0
  75. package/dist/lib/conversations.module.d.ts +74 -73
  76. package/dist/lib/conversations.module.d.ts.map +1 -1
  77. package/dist/lib/conversations.module.js +33 -13
  78. package/dist/lib/conversations.module.js.map +1 -1
  79. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  80. package/dist/lib/services/active-tasks.service.js +4 -1
  81. package/dist/lib/services/active-tasks.service.js.map +1 -1
  82. package/dist/lib/services/conversation-agent.service.d.ts +7 -0
  83. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  84. package/dist/lib/services/conversation-agent.service.js +20 -0
  85. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  86. package/dist/lib/services/conversation-attachment.service.d.ts +1 -1
  87. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  88. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  89. package/dist/lib/services/mention-autocomplete.service.d.ts +27 -20
  90. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  91. package/dist/lib/services/mention-autocomplete.service.js +55 -16
  92. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  93. package/dist/public-api.d.ts +23 -3
  94. package/dist/public-api.d.ts.map +1 -1
  95. package/dist/public-api.js +38 -3
  96. package/dist/public-api.js.map +1 -1
  97. package/package.json +29 -27
  98. package/dist/lib/components/mention/mention-dropdown.component.d.ts +0 -53
  99. package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +0 -1
  100. package/dist/lib/components/mention/mention-dropdown.component.js +0 -297
  101. package/dist/lib/components/mention/mention-dropdown.component.js.map +0 -1
  102. package/dist/lib/components/mention/mention-editor.component.d.ts +0 -256
  103. package/dist/lib/components/mention/mention-editor.component.d.ts.map +0 -1
  104. package/dist/lib/components/mention/mention-editor.component.js +0 -1247
  105. package/dist/lib/components/mention/mention-editor.component.js.map +0 -1
  106. package/dist/lib/components/message/message-input-box.component.d.ts +0 -132
  107. package/dist/lib/components/message/message-input-box.component.d.ts.map +0 -1
  108. package/dist/lib/components/message/message-input-box.component.js +0 -327
  109. package/dist/lib/components/message/message-input-box.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chat-overlay.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/overlay/chat-overlay.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-overlay.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/overlay/chat-overlay.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEH,YAAY,EAEZ,SAAS,EACT,MAAM,EAIT,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAA+C,MAAM,+BAA+B,CAAC;AAEhI,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;;AAEhE,wCAAwC;AACxC,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtE,wEAAwE;AACxE,MAAM,WAAW,gCAAgC;IAC7C,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAYD,qBAMa,0BAA2B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC7F,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAAuB;IAGvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAO;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAO;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAO;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAO;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAG1C,uEAAuE;IACvE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAM;IAC5C,+DAA+D;IAC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAM;IAC5C,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IACrD,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAK;IAIrD,8EAA8E;IAC9E,OAAO,CAAC,UAAU,CAAQ;IAE1B,IACI,SAAS,CAAC,KAAK,EAAE,OAAO,EAO3B;IACD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,gHAAgH;IACvG,WAAW,EAAG,QAAQ,CAAC;IAEhC,4GAA4G;IACnG,aAAa,EAAG,MAAM,CAAC;IAEhC,8GAA8G;IACrG,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IAE3D,+EAA+E;IACtE,kBAAkB,EAAE,MAAM,CAAyB;IAE5D;;;;;OAKG;IACM,aAAa,EAAE,MAAM,CAAK;IAInC,kDAAkD;IACxC,iBAAiB,iCAAwC;IAEnE,iEAAiE;IACvD,YAAY,sCAA6C;IAEnE,kEAAkE;IACxD,oBAAoB,iDAAwD;IAEtF,qEAAqE;IAC3D,qBAAqB,8BAAqC;IAEpE,iEAAiE;IACvD,mBAAmB,kCAAyC;IAEtE,sDAAsD;IAC5C,gBAAgB;oBAAiC,MAAM;sBAAgB,YAAY;OAAK;IAElG,qCAAqC;IAC3B,WAAW,6BAAoC;IAIlD,KAAK,EAAE,gBAAgB,CAAe;IACtC,WAAW,SAAK;IAEvB,sDAAsD;IAC/C,UAAU,SAA4C;IACtD,WAAW,SAA6C;IAE/D;;;;OAIG;IACI,aAAa,SAAK;IAEzB,iGAAiG;IAC1F,gBAAgB,UAAS;IAEhC;;;;OAIG;IACI,eAAe,UAAS;IAE/B;;;;OAIG;IACI,QAAQ,UAAS;IAExB,6CAA6C;IAC7C,OAAO,CAAC,eAAe,CAAuB;IAC9C,IAAW,cAAc,IAAI,MAAM,GAAG,IAAI,CAEzC;IAED,iCAAiC;IAC1B,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAExD,wDAAwD;IACjD,iBAAiB,UAAQ;IAEhC,0DAA0D;IACnD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5C;wFACoF;IAC7E,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1D,8DAA8D;IACvD,kBAAkB,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAQ;IAE7D,wBAAwB;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAE9B,wBAAwB;IACxB,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,qBAAqB,CAAK;IAClC,oGAAoG;IACpG,OAAO,CAAC,eAAe,CAAS;IAChC,2FAA2F;IAC3F,OAAO,CAAC,qBAAqB,CAAuB;IACpD,kFAAkF;IAClF,OAAO,CAAC,mBAAmB,CAA4B;IAIvD,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IASnB,mDAAmD;IAC5C,MAAM,IAAI,IAAI;IAQrB,gDAAgD;IACzC,MAAM,IAAI,IAAI;IAcrB,kDAAkD;IAC3C,QAAQ,IAAI,IAAI;IAOvB,mDAAmD;IAC5C,cAAc,IAAI,IAAI;IAW7B,6DAA6D;IACtD,uBAAuB,IAAI,IAAI;IAMtC,sDAAsD;IAC/C,qBAAqB,CAAC,KAAK,EAAE;QAChC,YAAY,EAAE,oBAAoB,CAAC;QACnC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;KAC5C,GAAG,IAAI;IAaR,mDAAmD;IAC5C,wBAAwB,IAAI,IAAI;IAMvC,gDAAgD;IACzC,qBAAqB,CAAC,MAAM,EAAE;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAKvG,yCAAyC;IAClC,kBAAkB,CAAC,KAAK,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAC,GAAG,IAAI;IAIxF,oDAAoD;IAC7C,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAI1D,4CAA4C;IACrC,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI9C,8CAA8C;IACvC,oBAAoB,IAAI,IAAI;IAcnC;;;;;OAKG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAS/B,yFAAyF;IAClF,IAAI,IAAI,IAAI;IAOnB,sFAAsF;IAC/E,eAAe,IAAI,IAAI;IAS9B,4CAA4C;IACrC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,IAAI;IAchF,OAAO,CAAC,YAAY,CAalB;IAEF,OAAO,CAAC,WAAW,CAMjB;IAEF,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,WAAW;IAMnB;;;;;;;;OAQG;IACI,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAuBrD,OAAO,CAAC,gBAAgB,CAUtB;IAEF,OAAO,CAAC,eAAe,CAyBrB;IAEF,OAAO,CAAC,yBAAyB;IAMjC;;;OAGG;IACH,OAAO,KAAK,aAAa,GAExB;IAED,iFAAiF;IACjF,OAAO,CAAC,kBAAkB;IAU1B,wFAAwF;IACxF,IAAW,cAAc,IAAI,MAAM,CASlC;IAED;;;;;;OAMG;IACH,IAAW,aAAa,IAAI,MAAM,CASjC;IAID,2FAA2F;IAC3F,OAAO,CAAC,eAAe;IAUvB,oEAAoE;IACpE,OAAO,CAAC,eAAe;IAoBvB,2EAA2E;IAC3E,OAAO,CAAC,eAAe;IAavB,6DAA6D;IAC7D,OAAO,CAAC,uBAAuB;IAmC/B,sDAAsD;IACtD,OAAO,CAAC,qBAAqB;IAQ7B,2DAA2D;IAC3D,OAAO,CAAC,qBAAqB;IAS7B,yCAAyC;IACzC,OAAO,CAAC,wBAAwB;yCA5lBvB,0BAA0B;2CAA1B,0BAA0B;CAkmBtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-overlay.component.js","sourceRoot":"","sources":["../../../../src/lib/components/overlay/chat-overlay.component.ts","../../../../src/lib/components/overlay/chat-overlay.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Floating Chat Overlay Component\n *\n * A collapsible floating panel (bottom-right corner) that wraps the\n * conversation-chat-area component. Provides a persistent, minimizable chat\n * experience across the application.\n *\n * This component is GENERIC -- it does NOT know about NavigationService,\n * Knowledge Hub, or any Explorer-specific concepts. It raises events that\n * the consuming application handles.\n *\n * Coordinates with the full Conversations workspace view through\n * ConversationBridgeService so that switching between overlay and workspace\n * preserves conversation continuity.\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo, Metadata, CompositeKey } from '@memberjunction/core';\nimport { MJConversationEntity, MJTaskEntity, MJEnvironmentEntityExtended, UserInfoEngine } from '@memberjunction/core-entities';\nimport { AgentClientService } from '@memberjunction/ng-agent-client';\nimport { ClientToolResultEvent } from '@memberjunction/ai-agent-client';\nimport { ConversationBridgeService, ConversationSwitchEvent } from '../../services/conversation-bridge.service';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { PendingAttachment } from '../mention/mention-editor.component';\n\n/** Visual state of the overlay panel */\nexport type ChatOverlayState = 'collapsed' | 'expanded' | 'maximized';\n\n/** Event payload when the active conversation changes in the overlay */\nexport interface OverlayConversationSwitchedEvent {\n PreviousConversationID: string | null;\n NewConversationID: string | null;\n}\n\n/** Persisted overlay size and position preferences */\ninterface OverlayPrefs {\n width: number;\n height: number;\n /** Pixels the bubble has been dragged up from its default bottom position. Optional for back-compat with older saved prefs. */\n bubbleOffsetY?: number;\n /** When true, the bubble is hidden and only a thin sliver shows on the right edge. */\n bubbleHidden?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-chat-agents-overlay',\n templateUrl: './chat-overlay.component.html',\n styleUrls: ['./chat-overlay.component.css']\n})\nexport class ChatAgentsOverlayComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private bridge = inject(ConversationBridgeService);\n private agentClient = inject(AgentClientService);\n private destroy$ = new Subject<void>();\n\n // --- Settings persistence ---\n private static readonly SIZE_SETTING_KEY = 'ChatOverlay.Size';\n private static readonly DEFAULT_WIDTH = 420;\n private static readonly DEFAULT_HEIGHT = 600;\n private static readonly MIN_WIDTH = 320;\n private static readonly MIN_HEIGHT = 350;\n private static readonly MAX_WIDTH = 900;\n private static readonly MAX_HEIGHT = 1000;\n\n // --- Bubble drag constants ---\n /** Default `bottom` for both bubble and panel (matches CSS 1.5rem). */\n private static readonly BASE_BOTTOM_PX = 24;\n /** Floating bubble diameter in pixels (matches CSS 3.5rem). */\n private static readonly BUBBLE_SIZE_PX = 56;\n /** Minimum gap to keep between the overlay and the viewport top edge. */\n private static readonly VIEWPORT_TOP_PADDING_PX = 16;\n /** Mousedown-to-mousemove distance that promotes a click into a drag. */\n private static readonly BUBBLE_DRAG_THRESHOLD_PX = 5;\n\n // --- Inputs ---\n\n /** Controls external visibility (e.g., parent hides overlay on chat route) */\n private _IsVisible = true;\n\n @Input()\n set IsVisible(value: boolean) {\n const prev = this._IsVisible;\n this._IsVisible = value;\n if (!value && prev && this.State !== 'collapsed') {\n this.Collapse();\n }\n this.cdr.detectChanges();\n }\n get IsVisible(): boolean {\n return this._IsVisible;\n }\n\n /** Current user info, passed through to conversation-chat-area. Auto-resolved from Metadata if not provided. */\n @Input() CurrentUser!: UserInfo;\n\n /** Environment ID, passed through to conversation-chat-area. Auto-resolved from default if not provided. */\n @Input() EnvironmentId!: string;\n\n /** Application context snapshot for AI agent awareness. Updated by the host app on navigation transitions. */\n @Input() AppContext: Record<string, unknown> | null = null;\n\n /** Greeting message shown in the empty state when no conversation is active */\n @Input() EmptyStateGreeting: string = 'How can I help you?';\n\n /**\n * Pixels reserved at the top of the viewport that the bubble and panel must not\n * cross. Set this from the host app to the height of any fixed top chrome (e.g.\n * Explorer's shell-header). Defaults to 0 — generic apps without top chrome\n * keep the full viewport available.\n */\n @Input() TopBoundaryPx: number = 0;\n\n // --- Outputs ---\n\n /** Emitted when the overlay visibility changes */\n @Output() VisibilityChanged = new EventEmitter<ChatOverlayState>();\n\n /** Emitted when a tool finishes executing in the agent client */\n @Output() ToolExecuted = new EventEmitter<ClientToolResultEvent>();\n\n /** Emitted when the active conversation changes in the overlay */\n @Output() ConversationSwitched = new EventEmitter<OverlayConversationSwitchedEvent>();\n\n /** Emitted when the user requests opening the full chat workspace */\n @Output() OpenFullChatWorkspace = new EventEmitter<string | null>();\n\n /** Emitted when navigation is requested (entity record, etc.) */\n @Output() NavigationRequested = new EventEmitter<NavigationRequest>();\n\n /** Emitted when an entity record open is requested */\n @Output() OpenEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n\n /** Emitted when a task is clicked */\n @Output() TaskClicked = new EventEmitter<MJTaskEntity>();\n\n // --- Component State ---\n\n public State: ChatOverlayState = 'collapsed';\n public UnreadCount = 0;\n\n /** Panel dimensions (persisted via UserInfoEngine) */\n public PanelWidth = ChatAgentsOverlayComponent.DEFAULT_WIDTH;\n public PanelHeight = ChatAgentsOverlayComponent.DEFAULT_HEIGHT;\n\n /**\n * Pixels the floating bubble has been dragged up from its default\n * bottom-right corner position. Always >= 0; clamping at render time\n * keeps the bubble on-screen even after a viewport resize.\n */\n public BubbleOffsetY = 0;\n\n /** True while the user is actively dragging the bubble; used to swap cursor + suppress click. */\n public IsBubbleDragging = false;\n\n /**\n * True from mousedown until mouseup on the bubble, regardless of whether the\n * gesture became a drag. Used to give immediate \"I'm being held\" feedback so\n * the user can see drag is possible even before crossing the move threshold.\n */\n public IsBubblePressed = false;\n\n /**\n * When true, the floating bubble is hidden and replaced by a thin sliver\n * flush with the right edge of the viewport. Persisted across sessions via\n * OverlayPrefs.bubbleHidden. Clicking the sliver restores the bubble.\n */\n public IsHidden = false;\n\n /** Active conversation ID managed locally */\n private _conversationId: string | null = null;\n public get ConversationId(): string | null {\n return this._conversationId;\n }\n\n /** Active conversation entity */\n public Conversation: MJConversationEntity | null = null;\n\n /** Whether a new unsaved conversation is in progress */\n public IsNewConversation = true;\n\n /** Pending message to send after conversation creation */\n public PendingMessage: string | null = null;\n /** The conversation {@link PendingMessage} is destined for — pins the auto-send to that\n * conversation's input so a fast conversation-swap can't redirect it elsewhere. */\n public PendingMessageConversationId: string | null = null;\n\n /** Pending attachments to send after conversation creation */\n public PendingAttachments: PendingAttachment[] | null = null;\n\n /** Resize drag state */\n private isResizing = false;\n private resizeEdge: 'left' | 'top' | 'top-left' | null = null;\n private resizeStartX = 0;\n private resizeStartY = 0;\n private resizeStartWidth = 0;\n private resizeStartHeight = 0;\n\n /** Bubble drag state */\n private bubbleDragStartMouseY = 0;\n private bubbleDragStartOffset = 0;\n /** True once the pointer has moved past BUBBLE_DRAG_THRESHOLD_PX; suppresses the implicit click. */\n private bubbleDragMoved = false;\n /** ID of the pointer currently driving the drag — guards against multi-touch confusion. */\n private activeBubblePointerId: number | null = null;\n /** Element that captured the pointer; needed to release capture on end/cancel. */\n private bubbleCaptureTarget: HTMLElement | null = null;\n\n // --- Lifecycle ---\n\n ngOnInit(): void {\n this.resolveDefaults();\n this.loadPreferences();\n this.subscribeToBridgeEvents();\n this.subscribeToToolEvents();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.removeResizeListeners();\n this.removeBubbleDragListeners();\n }\n\n // --- Public Methods ---\n\n /** Toggle between collapsed and expanded states */\n public Toggle(): void {\n if (this.State === 'collapsed') {\n this.Expand();\n } else {\n this.Collapse();\n }\n }\n\n /** Expand the overlay to show the chat panel */\n public Expand(): void {\n // Expanding implies the user wants the chat visible — clear any hidden\n // state so collapse returns to the bubble, not back to the sliver.\n if (this.IsHidden) {\n this.IsHidden = false;\n this.savePreferences();\n }\n this.State = 'expanded';\n this.UnreadCount = 0;\n this.bridge.NotifyOverlayActive(true);\n this.VisibilityChanged.emit(this.State);\n this.cdr.detectChanges();\n }\n\n /** Collapse the overlay to the floating button */\n public Collapse(): void {\n this.State = 'collapsed';\n this.bridge.NotifyOverlayActive(false);\n this.VisibilityChanged.emit(this.State);\n this.cdr.detectChanges();\n }\n\n /** Toggle between expanded and maximized states */\n public ToggleMaximize(): void {\n if (this.State === 'maximized') {\n this.State = 'expanded';\n } else {\n this.State = 'maximized';\n }\n this.bridge.NotifyOverlayActive(true);\n this.VisibilityChanged.emit(this.State);\n this.cdr.detectChanges();\n }\n\n /** Handle the user requesting to open full chat workspace */\n public OnOpenFullChatWorkspace(): void {\n this.OpenFullChatWorkspace.emit(this._conversationId);\n this.bridge.SwitchToWorkspace(this._conversationId);\n this.Collapse();\n }\n\n /** Handle conversation creation from the chat area */\n public OnConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): void {\n // Set ALL state atomically before Angular change detection runs\n this.PendingMessage = event.pendingMessage || null;\n this.PendingAttachments = event.pendingAttachments || null;\n this.PendingMessageConversationId = event.conversation.ID;\n const prevId = this._conversationId;\n this._conversationId = event.conversation.ID;\n this.Conversation = event.conversation;\n this.IsNewConversation = false;\n this.bridge.SetActiveFromOverlay(event.conversation.ID);\n this.emitConversationSwitched(prevId, event.conversation.ID);\n }\n\n /** Handle pending message consumed by chat area */\n public OnPendingMessageConsumed(): void {\n this.PendingMessage = null;\n this.PendingAttachments = null;\n this.PendingMessageConversationId = null;\n }\n\n /** Handle conversation rename from chat area */\n public OnConversationRenamed(_event: {conversationId: string; name: string; description: string}): void {\n // The overlay doesn't need to do anything specific here;\n // the conversation entity is updated in-place by the chat area.\n }\n\n /** Handle entity record open requests */\n public OnOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.OpenEntityRecord.emit(event);\n }\n\n /** Handle navigation requests from the chat area */\n public OnNavigationRequest(event: NavigationRequest): void {\n this.NavigationRequested.emit(event);\n }\n\n /** Handle task clicks from the chat area */\n public OnTaskClicked(task: MJTaskEntity): void {\n this.TaskClicked.emit(task);\n }\n\n /** Start a new conversation in the overlay */\n public StartNewConversation(): void {\n const prevId = this._conversationId;\n this._conversationId = null;\n this.Conversation = null;\n // Force Angular change detection by toggling off then on\n // so the setter fires even if already in new-conversation state\n this.IsNewConversation = false;\n this.cdr.detectChanges();\n this.IsNewConversation = true;\n this.bridge.SetActiveFromOverlay(null);\n this.emitConversationSwitched(prevId, null);\n this.cdr.detectChanges();\n }\n\n /**\n * Hide the floating bubble — leaves a thin sliver on the right edge as the\n * only affordance to bring it back. Invoked from the small \"×\" pill that\n * appears on hover. Stops propagation so the bubble's own click handler\n * doesn't fire and toggle the panel open.\n */\n public Hide(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n if (this.IsHidden) return;\n this.IsHidden = true;\n this.savePreferences();\n this.cdr.detectChanges();\n }\n\n /** Restore the floating bubble after it was hidden. Triggered by clicking the sliver. */\n public Show(): void {\n if (!this.IsHidden) return;\n this.IsHidden = false;\n this.savePreferences();\n this.cdr.detectChanges();\n }\n\n /** Increment unread badge (called externally when messages arrive while collapsed) */\n public IncrementUnread(): void {\n if (this.State === 'collapsed') {\n this.UnreadCount++;\n this.cdr.detectChanges();\n }\n }\n\n // --- Resize Methods ---\n\n /** Start resizing from an edge or corner */\n public OnResizeStart(event: MouseEvent, edge: 'left' | 'top' | 'top-left'): void {\n event.preventDefault();\n event.stopPropagation();\n this.isResizing = true;\n this.resizeEdge = edge;\n this.resizeStartX = event.clientX;\n this.resizeStartY = event.clientY;\n this.resizeStartWidth = this.PanelWidth;\n this.resizeStartHeight = this.PanelHeight;\n\n document.addEventListener('mousemove', this.onResizeMove);\n document.addEventListener('mouseup', this.onResizeEnd);\n }\n\n private onResizeMove = (event: MouseEvent): void => {\n if (!this.isResizing || !this.resizeEdge) return;\n\n const deltaX = this.resizeStartX - event.clientX; // Inverted: dragging left increases width\n const deltaY = this.resizeStartY - event.clientY; // Inverted: dragging up increases height\n\n if (this.resizeEdge === 'left' || this.resizeEdge === 'top-left') {\n this.PanelWidth = this.clampWidth(this.resizeStartWidth + deltaX);\n }\n if (this.resizeEdge === 'top' || this.resizeEdge === 'top-left') {\n this.PanelHeight = this.clampHeight(this.resizeStartHeight + deltaY);\n }\n this.cdr.detectChanges();\n };\n\n private onResizeEnd = (): void => {\n if (!this.isResizing) return;\n this.isResizing = false;\n this.resizeEdge = null;\n this.removeResizeListeners();\n this.savePreferences();\n };\n\n private removeResizeListeners(): void {\n document.removeEventListener('mousemove', this.onResizeMove);\n document.removeEventListener('mouseup', this.onResizeEnd);\n }\n\n private clampWidth(value: number): number {\n return Math.max(ChatAgentsOverlayComponent.MIN_WIDTH, Math.min(ChatAgentsOverlayComponent.MAX_WIDTH, value));\n }\n\n private clampHeight(value: number): number {\n return Math.max(ChatAgentsOverlayComponent.MIN_HEIGHT, Math.min(ChatAgentsOverlayComponent.MAX_HEIGHT, value));\n }\n\n // --- Bubble Drag Methods (Pointer Events — unified mouse / touch / pen) ---\n\n /**\n * Start tracking a potential bubble drag. We don't enter drag mode until\n * the pointer moves past BUBBLE_DRAG_THRESHOLD_PX — releasing before that\n * threshold is treated as a normal click/tap and opens the chat (via Toggle()).\n *\n * Pointer Events (not mousedown) so the same code path serves desktop mouse,\n * touch on phones/tablets, and pen input. setPointerCapture keeps the gesture\n * tied to this element even if the finger or cursor strays off the bubble.\n */\n public OnBubblePointerDown(event: PointerEvent): void {\n // Mouse: respect primary-button only. Touch/pen: button is always 0, so this passes naturally.\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n // Don't start a second drag while one is in flight (e.g. second finger on touch).\n if (this.activeBubblePointerId !== null) return;\n event.preventDefault();\n\n const target = event.currentTarget as HTMLElement;\n target.setPointerCapture(event.pointerId);\n this.bubbleCaptureTarget = target;\n\n this.activeBubblePointerId = event.pointerId;\n this.bubbleDragStartMouseY = event.clientY;\n this.bubbleDragStartOffset = this.BubbleOffsetY;\n this.bubbleDragMoved = false;\n this.IsBubblePressed = true;\n this.cdr.detectChanges();\n\n document.addEventListener('pointermove', this.onBubbleDragMove);\n document.addEventListener('pointerup', this.onBubbleDragEnd);\n document.addEventListener('pointercancel', this.onBubbleDragEnd);\n }\n\n private onBubbleDragMove = (event: PointerEvent): void => {\n if (event.pointerId !== this.activeBubblePointerId) return;\n const deltaY = this.bubbleDragStartMouseY - event.clientY; // dragging up = positive\n if (!this.bubbleDragMoved) {\n if (Math.abs(deltaY) < ChatAgentsOverlayComponent.BUBBLE_DRAG_THRESHOLD_PX) return;\n this.bubbleDragMoved = true;\n this.IsBubbleDragging = true;\n }\n this.BubbleOffsetY = this.clampBubbleOffsetY(this.bubbleDragStartOffset + deltaY);\n this.cdr.detectChanges();\n };\n\n private onBubbleDragEnd = (event: PointerEvent): void => {\n if (event.pointerId !== this.activeBubblePointerId) return;\n this.removeBubbleDragListeners();\n\n if (this.bubbleCaptureTarget) {\n // Browser may have implicitly released capture on pointerup already (per the\n // Pointer Events spec). releasePointerCapture throws in that race; safe to ignore.\n try { this.bubbleCaptureTarget.releasePointerCapture(event.pointerId); } catch { /* noop */ }\n }\n this.bubbleCaptureTarget = null;\n this.activeBubblePointerId = null;\n\n const wasDragged = this.bubbleDragMoved;\n const wasCancelled = event.type === 'pointercancel';\n this.bubbleDragMoved = false;\n this.IsBubbleDragging = false;\n this.IsBubblePressed = false;\n if (wasDragged) {\n this.savePreferences();\n this.cdr.detectChanges();\n } else if (!wasCancelled) {\n this.Toggle();\n } else {\n this.cdr.detectChanges();\n }\n };\n\n private removeBubbleDragListeners(): void {\n document.removeEventListener('pointermove', this.onBubbleDragMove);\n document.removeEventListener('pointerup', this.onBubbleDragEnd);\n document.removeEventListener('pointercancel', this.onBubbleDragEnd);\n }\n\n /**\n * Reserved space at the top of the viewport — host-supplied chrome plus\n * the padding gap we always keep above the bubble/panel.\n */\n private get topReservedPx(): number {\n return Math.max(0, this.TopBoundaryPx) + ChatAgentsOverlayComponent.VIEWPORT_TOP_PADDING_PX;\n }\n\n /** Clamp the offset so the bubble stays fully visible below the top boundary. */\n private clampBubbleOffsetY(value: number): number {\n const maxOffset = window.innerHeight\n - ChatAgentsOverlayComponent.BUBBLE_SIZE_PX\n - ChatAgentsOverlayComponent.BASE_BOTTOM_PX\n - this.topReservedPx;\n return Math.max(0, Math.min(Math.max(0, maxOffset), value));\n }\n\n // --- Render Position Getters ---\n\n /** Effective `bottom` (px) for the floating bubble, clamped to the current viewport. */\n public get BubbleBottomPx(): number {\n const ideal = ChatAgentsOverlayComponent.BASE_BOTTOM_PX + this.BubbleOffsetY;\n const max = window.innerHeight\n - ChatAgentsOverlayComponent.BUBBLE_SIZE_PX\n - this.topReservedPx;\n return Math.max(\n ChatAgentsOverlayComponent.BASE_BOTTOM_PX,\n Math.min(ideal, Math.max(ChatAgentsOverlayComponent.BASE_BOTTOM_PX, max))\n );\n }\n\n /**\n * Effective `bottom` (px) for the expanded panel. Anchors to the bubble's\n * current bottom edge so the panel grows up from where the user parked the\n * bubble, but clamps downward whenever the panel would otherwise extend\n * past the viewport's top boundary — that's the \"reposition lower so the\n * chat interface stays visible\" behavior.\n */\n public get PanelBottomPx(): number {\n const ideal = ChatAgentsOverlayComponent.BASE_BOTTOM_PX + this.BubbleOffsetY;\n const maxBottomForVisibility = window.innerHeight\n - this.PanelHeight\n - this.topReservedPx;\n return Math.max(\n ChatAgentsOverlayComponent.BASE_BOTTOM_PX,\n Math.min(ideal, maxBottomForVisibility)\n );\n }\n\n // --- Private Methods ---\n\n /** Auto-resolve CurrentUser and EnvironmentId from Metadata when not provided as inputs */\n private resolveDefaults(): void {\n if (!this.CurrentUser) {\n const md = this.ProviderToUse;\n this.CurrentUser = md.CurrentUser;\n }\n if (!this.EnvironmentId) {\n this.EnvironmentId = MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n }\n\n /** Load saved panel size and bubble position from UserInfoEngine */\n private loadPreferences(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const raw = engine.GetSetting(ChatAgentsOverlayComponent.SIZE_SETTING_KEY);\n if (raw) {\n const prefs: OverlayPrefs = JSON.parse(raw);\n this.PanelWidth = this.clampWidth(prefs.width);\n this.PanelHeight = this.clampHeight(prefs.height);\n if (typeof prefs.bubbleOffsetY === 'number') {\n this.BubbleOffsetY = Math.max(0, prefs.bubbleOffsetY);\n }\n if (typeof prefs.bubbleHidden === 'boolean') {\n this.IsHidden = prefs.bubbleHidden;\n }\n }\n } catch {\n // Use defaults on error\n }\n }\n\n /** Persist panel size and bubble position to UserInfoEngine (debounced) */\n private savePreferences(): void {\n const prefs: OverlayPrefs = {\n width: this.PanelWidth,\n height: this.PanelHeight,\n bubbleOffsetY: this.BubbleOffsetY,\n bubbleHidden: this.IsHidden\n };\n UserInfoEngine.Instance.SetSettingDebounced(\n ChatAgentsOverlayComponent.SIZE_SETTING_KEY,\n JSON.stringify(prefs)\n );\n }\n\n /** Subscribe to bridge events for cross-view coordination */\n private subscribeToBridgeEvents(): void {\n this.bridge.SwitchEvent$\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: ConversationSwitchEvent) => {\n if (event.Target === 'overlay') {\n this.handleSwitchToOverlay(event);\n }\n });\n\n // Allow arbitrary callers (Form Builder cockpit, etc.) to ask the\n // overlay to expand. Idempotent if we're already expanded —\n // Expand() is safe to call in any state.\n this.bridge.ExpandOverlayRequested$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.State === 'collapsed') {\n this.Expand();\n }\n });\n\n this.bridge.ActiveConversationID$\n .pipe(takeUntil(this.destroy$))\n .subscribe((id: string | null) => {\n // Only update if the change came from outside (workspace)\n if (id !== this._conversationId && this.bridge.WorkspaceActive$.value) {\n const prevId = this._conversationId;\n this._conversationId = id;\n this.IsNewConversation = id === null;\n this.Conversation = null; // Will be loaded by chat area\n this.emitConversationSwitched(prevId, id);\n this.cdr.detectChanges();\n }\n });\n }\n\n /** Subscribe to agent client tool execution events */\n private subscribeToToolEvents(): void {\n this.agentClient.ToolExecuted$\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: ClientToolResultEvent) => {\n this.ToolExecuted.emit(event);\n });\n }\n\n /** Handle request to switch conversation to the overlay */\n private handleSwitchToOverlay(event: ConversationSwitchEvent): void {\n const prevId = this._conversationId;\n this._conversationId = event.ConversationID;\n this.IsNewConversation = event.ConversationID === null;\n this.Conversation = null; // Will be reloaded by chat area\n this.Expand();\n this.emitConversationSwitched(prevId, event.ConversationID);\n }\n\n /** Emit a conversation switched event */\n private emitConversationSwitched(prevId: string | null, newId: string | null): void {\n this.ConversationSwitched.emit({\n PreviousConversationID: prevId,\n NewConversationID: newId\n });\n }\n}\n","@if (IsVisible) {\n <!-- Floating Button (collapsed state, not hidden) -->\n @if (State === 'collapsed' && !IsHidden) {\n <div class=\"chat-overlay-bubble\"\n [class.is-pressed]=\"IsBubblePressed\"\n [class.is-dragging]=\"IsBubbleDragging\"\n [style.bottom.px]=\"BubbleBottomPx\"\n (pointerdown)=\"OnBubblePointerDown($event)\">\n <i class=\"fa-solid fa-chevron-up chat-overlay-bubble-arrow chat-overlay-bubble-arrow-up\" aria-hidden=\"true\"></i>\n <i class=\"fa-solid fa-chevron-down chat-overlay-bubble-arrow chat-overlay-bubble-arrow-down\" aria-hidden=\"true\"></i>\n <i class=\"fa-solid fa-comments chat-overlay-bubble-icon\"></i>\n @if (UnreadCount > 0) {\n <span class=\"chat-overlay-badge\">{{ UnreadCount > 9 ? '9+' : UnreadCount }}</span>\n }\n <!-- Hide affordance: revealed on hover. pointerdown stops drag from starting; click hides the bubble. -->\n <button type=\"button\"\n class=\"chat-overlay-bubble-close\"\n title=\"Hide chat — a thin sliver will remain on the right edge\"\n aria-label=\"Hide chat overlay\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"Hide($event)\">\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Collapsed sliver — flush with the right edge when the bubble is hidden.\n Click opens the chat directly; closing returns to the bubble (not the\n sliver). To re-enter hidden mode the user clicks the × pill again. -->\n @if (State === 'collapsed' && IsHidden) {\n <button type=\"button\"\n class=\"chat-overlay-sliver\"\n title=\"Open chat\"\n aria-label=\"Open chat\"\n [style.bottom.px]=\"BubbleBottomPx\"\n (click)=\"Expand()\">\n <i class=\"fa-solid fa-comments chat-overlay-sliver-icon\" aria-hidden=\"true\"></i>\n @if (UnreadCount > 0) {\n <span class=\"chat-overlay-badge chat-overlay-sliver-badge\">{{ UnreadCount > 9 ? '9+' : UnreadCount }}</span>\n }\n </button>\n }\n\n <!-- Expanded / Maximized Chat Panel -->\n @if (State === 'expanded' || State === 'maximized') {\n <div class=\"chat-overlay-panel\"\n [class.maximized]=\"State === 'maximized'\"\n [style.width.px]=\"State === 'maximized' ? null : PanelWidth\"\n [style.height.px]=\"State === 'maximized' ? null : PanelHeight\"\n [style.bottom.px]=\"State === 'maximized' ? null : PanelBottomPx\">\n\n <!-- Resize handles (only in expanded, not maximized) -->\n @if (State === 'expanded') {\n <div class=\"resize-handle resize-left\"\n (mousedown)=\"OnResizeStart($event, 'left')\"></div>\n <div class=\"resize-handle resize-top\"\n (mousedown)=\"OnResizeStart($event, 'top')\"></div>\n <div class=\"resize-handle resize-top-left\"\n (mousedown)=\"OnResizeStart($event, 'top-left')\"></div>\n }\n\n <!-- Panel Header -->\n <div class=\"chat-overlay-header\">\n <div class=\"chat-overlay-title\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>AI Assistant</span>\n </div>\n <div class=\"chat-overlay-header-actions\">\n <button\n class=\"chat-overlay-header-btn\"\n title=\"New conversation\"\n (click)=\"StartNewConversation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (ConversationId) {\n <button\n class=\"chat-overlay-header-btn\"\n title=\"Open in full chat workspace\"\n (click)=\"OnOpenFullChatWorkspace()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n }\n <button\n class=\"chat-overlay-header-btn\"\n [title]=\"State === 'maximized' ? 'Restore size' : 'Maximize'\"\n (click)=\"ToggleMaximize()\">\n <i class=\"fa-solid\" [class.fa-expand]=\"State !== 'maximized'\" [class.fa-compress]=\"State === 'maximized'\"></i>\n </button>\n <button\n class=\"chat-overlay-header-btn\"\n title=\"Minimize\"\n (click)=\"Collapse()\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n </div>\n </div>\n\n <!-- Chat Content — wraps conversation-chat-area -->\n <div class=\"chat-overlay-body\">\n <mj-conversation-chat-area\n [environmentId]=\"EnvironmentId\"\n [currentUser]=\"CurrentUser\"\n [conversationId]=\"ConversationId\"\n [conversation]=\"Conversation\"\n [isNewConversation]=\"IsNewConversation\"\n [pendingMessage]=\"PendingMessage\"\n [pendingAttachments]=\"PendingAttachments\"\n [pendingMessageConversationId]=\"PendingMessageConversationId\"\n [overlayMode]=\"true\"\n [showExportButton]=\"false\"\n [showShareButton]=\"false\"\n [showArtifactIndicator]=\"false\"\n [appContext]=\"AppContext\"\n [emptyStateGreeting]=\"EmptyStateGreeting\"\n (conversationCreated)=\"OnConversationCreated($event)\"\n (conversationRenamed)=\"OnConversationRenamed($event)\"\n (pendingMessageConsumed)=\"OnPendingMessageConsumed()\"\n (openEntityRecord)=\"OnOpenEntityRecord($event)\"\n (navigationRequest)=\"OnNavigationRequest($event)\"\n (taskClicked)=\"OnTaskClicked($event)\"\n ></mj-conversation-chat-area>\n </div>\n </div>\n }\n}\n"]}
1
+ {"version":3,"file":"chat-overlay.component.js","sourceRoot":"","sources":["../../../../src/lib/components/overlay/chat-overlay.component.ts","../../../../src/lib/components/overlay/chat-overlay.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Floating Chat Overlay Component\n *\n * A collapsible floating panel (bottom-right corner) that wraps the\n * conversation-chat-area component. Provides a persistent, minimizable chat\n * experience across the application.\n *\n * This component is GENERIC -- it does NOT know about NavigationService,\n * Knowledge Hub, or any Explorer-specific concepts. It raises events that\n * the consuming application handles.\n *\n * Coordinates with the full Conversations workspace view through\n * ConversationBridgeService so that switching between overlay and workspace\n * preserves conversation continuity.\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo, Metadata, CompositeKey } from '@memberjunction/core';\nimport { MJConversationEntity, MJTaskEntity, MJEnvironmentEntityExtended, UserInfoEngine } from '@memberjunction/core-entities';\nimport { AgentClientService } from '@memberjunction/ng-agent-client';\nimport { ClientToolResultEvent } from '@memberjunction/ai-agent-client';\nimport { ConversationBridgeService, ConversationSwitchEvent } from '../../services/conversation-bridge.service';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { PendingAttachment } from '@memberjunction/ng-composer';\n\n/** Visual state of the overlay panel */\nexport type ChatOverlayState = 'collapsed' | 'expanded' | 'maximized';\n\n/** Event payload when the active conversation changes in the overlay */\nexport interface OverlayConversationSwitchedEvent {\n PreviousConversationID: string | null;\n NewConversationID: string | null;\n}\n\n/** Persisted overlay size and position preferences */\ninterface OverlayPrefs {\n width: number;\n height: number;\n /** Pixels the bubble has been dragged up from its default bottom position. Optional for back-compat with older saved prefs. */\n bubbleOffsetY?: number;\n /** When true, the bubble is hidden and only a thin sliver shows on the right edge. */\n bubbleHidden?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-chat-agents-overlay',\n templateUrl: './chat-overlay.component.html',\n styleUrls: ['./chat-overlay.component.css']\n})\nexport class ChatAgentsOverlayComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private bridge = inject(ConversationBridgeService);\n private agentClient = inject(AgentClientService);\n private destroy$ = new Subject<void>();\n\n // --- Settings persistence ---\n private static readonly SIZE_SETTING_KEY = 'ChatOverlay.Size';\n private static readonly DEFAULT_WIDTH = 420;\n private static readonly DEFAULT_HEIGHT = 600;\n private static readonly MIN_WIDTH = 320;\n private static readonly MIN_HEIGHT = 350;\n private static readonly MAX_WIDTH = 900;\n private static readonly MAX_HEIGHT = 1000;\n\n // --- Bubble drag constants ---\n /** Default `bottom` for both bubble and panel (matches CSS 1.5rem). */\n private static readonly BASE_BOTTOM_PX = 24;\n /** Floating bubble diameter in pixels (matches CSS 3.5rem). */\n private static readonly BUBBLE_SIZE_PX = 56;\n /** Minimum gap to keep between the overlay and the viewport top edge. */\n private static readonly VIEWPORT_TOP_PADDING_PX = 16;\n /** Mousedown-to-mousemove distance that promotes a click into a drag. */\n private static readonly BUBBLE_DRAG_THRESHOLD_PX = 5;\n\n // --- Inputs ---\n\n /** Controls external visibility (e.g., parent hides overlay on chat route) */\n private _IsVisible = true;\n\n @Input()\n set IsVisible(value: boolean) {\n const prev = this._IsVisible;\n this._IsVisible = value;\n if (!value && prev && this.State !== 'collapsed') {\n this.Collapse();\n }\n this.cdr.detectChanges();\n }\n get IsVisible(): boolean {\n return this._IsVisible;\n }\n\n /** Current user info, passed through to conversation-chat-area. Auto-resolved from Metadata if not provided. */\n @Input() CurrentUser!: UserInfo;\n\n /** Environment ID, passed through to conversation-chat-area. Auto-resolved from default if not provided. */\n @Input() EnvironmentId!: string;\n\n /** Application context snapshot for AI agent awareness. Updated by the host app on navigation transitions. */\n @Input() AppContext: Record<string, unknown> | null = null;\n\n /** Greeting message shown in the empty state when no conversation is active */\n @Input() EmptyStateGreeting: string = 'How can I help you?';\n\n /**\n * Pixels reserved at the top of the viewport that the bubble and panel must not\n * cross. Set this from the host app to the height of any fixed top chrome (e.g.\n * Explorer's shell-header). Defaults to 0 — generic apps without top chrome\n * keep the full viewport available.\n */\n @Input() TopBoundaryPx: number = 0;\n\n // --- Outputs ---\n\n /** Emitted when the overlay visibility changes */\n @Output() VisibilityChanged = new EventEmitter<ChatOverlayState>();\n\n /** Emitted when a tool finishes executing in the agent client */\n @Output() ToolExecuted = new EventEmitter<ClientToolResultEvent>();\n\n /** Emitted when the active conversation changes in the overlay */\n @Output() ConversationSwitched = new EventEmitter<OverlayConversationSwitchedEvent>();\n\n /** Emitted when the user requests opening the full chat workspace */\n @Output() OpenFullChatWorkspace = new EventEmitter<string | null>();\n\n /** Emitted when navigation is requested (entity record, etc.) */\n @Output() NavigationRequested = new EventEmitter<NavigationRequest>();\n\n /** Emitted when an entity record open is requested */\n @Output() OpenEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n\n /** Emitted when a task is clicked */\n @Output() TaskClicked = new EventEmitter<MJTaskEntity>();\n\n // --- Component State ---\n\n public State: ChatOverlayState = 'collapsed';\n public UnreadCount = 0;\n\n /** Panel dimensions (persisted via UserInfoEngine) */\n public PanelWidth = ChatAgentsOverlayComponent.DEFAULT_WIDTH;\n public PanelHeight = ChatAgentsOverlayComponent.DEFAULT_HEIGHT;\n\n /**\n * Pixels the floating bubble has been dragged up from its default\n * bottom-right corner position. Always >= 0; clamping at render time\n * keeps the bubble on-screen even after a viewport resize.\n */\n public BubbleOffsetY = 0;\n\n /** True while the user is actively dragging the bubble; used to swap cursor + suppress click. */\n public IsBubbleDragging = false;\n\n /**\n * True from mousedown until mouseup on the bubble, regardless of whether the\n * gesture became a drag. Used to give immediate \"I'm being held\" feedback so\n * the user can see drag is possible even before crossing the move threshold.\n */\n public IsBubblePressed = false;\n\n /**\n * When true, the floating bubble is hidden and replaced by a thin sliver\n * flush with the right edge of the viewport. Persisted across sessions via\n * OverlayPrefs.bubbleHidden. Clicking the sliver restores the bubble.\n */\n public IsHidden = false;\n\n /** Active conversation ID managed locally */\n private _conversationId: string | null = null;\n public get ConversationId(): string | null {\n return this._conversationId;\n }\n\n /** Active conversation entity */\n public Conversation: MJConversationEntity | null = null;\n\n /** Whether a new unsaved conversation is in progress */\n public IsNewConversation = true;\n\n /** Pending message to send after conversation creation */\n public PendingMessage: string | null = null;\n /** The conversation {@link PendingMessage} is destined for — pins the auto-send to that\n * conversation's input so a fast conversation-swap can't redirect it elsewhere. */\n public PendingMessageConversationId: string | null = null;\n\n /** Pending attachments to send after conversation creation */\n public PendingAttachments: PendingAttachment[] | null = null;\n\n /** Resize drag state */\n private isResizing = false;\n private resizeEdge: 'left' | 'top' | 'top-left' | null = null;\n private resizeStartX = 0;\n private resizeStartY = 0;\n private resizeStartWidth = 0;\n private resizeStartHeight = 0;\n\n /** Bubble drag state */\n private bubbleDragStartMouseY = 0;\n private bubbleDragStartOffset = 0;\n /** True once the pointer has moved past BUBBLE_DRAG_THRESHOLD_PX; suppresses the implicit click. */\n private bubbleDragMoved = false;\n /** ID of the pointer currently driving the drag — guards against multi-touch confusion. */\n private activeBubblePointerId: number | null = null;\n /** Element that captured the pointer; needed to release capture on end/cancel. */\n private bubbleCaptureTarget: HTMLElement | null = null;\n\n // --- Lifecycle ---\n\n ngOnInit(): void {\n this.resolveDefaults();\n this.loadPreferences();\n this.subscribeToBridgeEvents();\n this.subscribeToToolEvents();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.removeResizeListeners();\n this.removeBubbleDragListeners();\n }\n\n // --- Public Methods ---\n\n /** Toggle between collapsed and expanded states */\n public Toggle(): void {\n if (this.State === 'collapsed') {\n this.Expand();\n } else {\n this.Collapse();\n }\n }\n\n /** Expand the overlay to show the chat panel */\n public Expand(): void {\n // Expanding implies the user wants the chat visible — clear any hidden\n // state so collapse returns to the bubble, not back to the sliver.\n if (this.IsHidden) {\n this.IsHidden = false;\n this.savePreferences();\n }\n this.State = 'expanded';\n this.UnreadCount = 0;\n this.bridge.NotifyOverlayActive(true);\n this.VisibilityChanged.emit(this.State);\n this.cdr.detectChanges();\n }\n\n /** Collapse the overlay to the floating button */\n public Collapse(): void {\n this.State = 'collapsed';\n this.bridge.NotifyOverlayActive(false);\n this.VisibilityChanged.emit(this.State);\n this.cdr.detectChanges();\n }\n\n /** Toggle between expanded and maximized states */\n public ToggleMaximize(): void {\n if (this.State === 'maximized') {\n this.State = 'expanded';\n } else {\n this.State = 'maximized';\n }\n this.bridge.NotifyOverlayActive(true);\n this.VisibilityChanged.emit(this.State);\n this.cdr.detectChanges();\n }\n\n /** Handle the user requesting to open full chat workspace */\n public OnOpenFullChatWorkspace(): void {\n this.OpenFullChatWorkspace.emit(this._conversationId);\n this.bridge.SwitchToWorkspace(this._conversationId);\n this.Collapse();\n }\n\n /** Handle conversation creation from the chat area */\n public OnConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): void {\n // Set ALL state atomically before Angular change detection runs\n this.PendingMessage = event.pendingMessage || null;\n this.PendingAttachments = event.pendingAttachments || null;\n this.PendingMessageConversationId = event.conversation.ID;\n const prevId = this._conversationId;\n this._conversationId = event.conversation.ID;\n this.Conversation = event.conversation;\n this.IsNewConversation = false;\n this.bridge.SetActiveFromOverlay(event.conversation.ID);\n this.emitConversationSwitched(prevId, event.conversation.ID);\n }\n\n /** Handle pending message consumed by chat area */\n public OnPendingMessageConsumed(): void {\n this.PendingMessage = null;\n this.PendingAttachments = null;\n this.PendingMessageConversationId = null;\n }\n\n /** Handle conversation rename from chat area */\n public OnConversationRenamed(_event: {conversationId: string; name: string; description: string}): void {\n // The overlay doesn't need to do anything specific here;\n // the conversation entity is updated in-place by the chat area.\n }\n\n /** Handle entity record open requests */\n public OnOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.OpenEntityRecord.emit(event);\n }\n\n /** Handle navigation requests from the chat area */\n public OnNavigationRequest(event: NavigationRequest): void {\n this.NavigationRequested.emit(event);\n }\n\n /** Handle task clicks from the chat area */\n public OnTaskClicked(task: MJTaskEntity): void {\n this.TaskClicked.emit(task);\n }\n\n /** Start a new conversation in the overlay */\n public StartNewConversation(): void {\n const prevId = this._conversationId;\n this._conversationId = null;\n this.Conversation = null;\n // Force Angular change detection by toggling off then on\n // so the setter fires even if already in new-conversation state\n this.IsNewConversation = false;\n this.cdr.detectChanges();\n this.IsNewConversation = true;\n this.bridge.SetActiveFromOverlay(null);\n this.emitConversationSwitched(prevId, null);\n this.cdr.detectChanges();\n }\n\n /**\n * Hide the floating bubble — leaves a thin sliver on the right edge as the\n * only affordance to bring it back. Invoked from the small \"×\" pill that\n * appears on hover. Stops propagation so the bubble's own click handler\n * doesn't fire and toggle the panel open.\n */\n public Hide(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n if (this.IsHidden) return;\n this.IsHidden = true;\n this.savePreferences();\n this.cdr.detectChanges();\n }\n\n /** Restore the floating bubble after it was hidden. Triggered by clicking the sliver. */\n public Show(): void {\n if (!this.IsHidden) return;\n this.IsHidden = false;\n this.savePreferences();\n this.cdr.detectChanges();\n }\n\n /** Increment unread badge (called externally when messages arrive while collapsed) */\n public IncrementUnread(): void {\n if (this.State === 'collapsed') {\n this.UnreadCount++;\n this.cdr.detectChanges();\n }\n }\n\n // --- Resize Methods ---\n\n /** Start resizing from an edge or corner */\n public OnResizeStart(event: MouseEvent, edge: 'left' | 'top' | 'top-left'): void {\n event.preventDefault();\n event.stopPropagation();\n this.isResizing = true;\n this.resizeEdge = edge;\n this.resizeStartX = event.clientX;\n this.resizeStartY = event.clientY;\n this.resizeStartWidth = this.PanelWidth;\n this.resizeStartHeight = this.PanelHeight;\n\n document.addEventListener('mousemove', this.onResizeMove);\n document.addEventListener('mouseup', this.onResizeEnd);\n }\n\n private onResizeMove = (event: MouseEvent): void => {\n if (!this.isResizing || !this.resizeEdge) return;\n\n const deltaX = this.resizeStartX - event.clientX; // Inverted: dragging left increases width\n const deltaY = this.resizeStartY - event.clientY; // Inverted: dragging up increases height\n\n if (this.resizeEdge === 'left' || this.resizeEdge === 'top-left') {\n this.PanelWidth = this.clampWidth(this.resizeStartWidth + deltaX);\n }\n if (this.resizeEdge === 'top' || this.resizeEdge === 'top-left') {\n this.PanelHeight = this.clampHeight(this.resizeStartHeight + deltaY);\n }\n this.cdr.detectChanges();\n };\n\n private onResizeEnd = (): void => {\n if (!this.isResizing) return;\n this.isResizing = false;\n this.resizeEdge = null;\n this.removeResizeListeners();\n this.savePreferences();\n };\n\n private removeResizeListeners(): void {\n document.removeEventListener('mousemove', this.onResizeMove);\n document.removeEventListener('mouseup', this.onResizeEnd);\n }\n\n private clampWidth(value: number): number {\n return Math.max(ChatAgentsOverlayComponent.MIN_WIDTH, Math.min(ChatAgentsOverlayComponent.MAX_WIDTH, value));\n }\n\n private clampHeight(value: number): number {\n return Math.max(ChatAgentsOverlayComponent.MIN_HEIGHT, Math.min(ChatAgentsOverlayComponent.MAX_HEIGHT, value));\n }\n\n // --- Bubble Drag Methods (Pointer Events — unified mouse / touch / pen) ---\n\n /**\n * Start tracking a potential bubble drag. We don't enter drag mode until\n * the pointer moves past BUBBLE_DRAG_THRESHOLD_PX — releasing before that\n * threshold is treated as a normal click/tap and opens the chat (via Toggle()).\n *\n * Pointer Events (not mousedown) so the same code path serves desktop mouse,\n * touch on phones/tablets, and pen input. setPointerCapture keeps the gesture\n * tied to this element even if the finger or cursor strays off the bubble.\n */\n public OnBubblePointerDown(event: PointerEvent): void {\n // Mouse: respect primary-button only. Touch/pen: button is always 0, so this passes naturally.\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n // Don't start a second drag while one is in flight (e.g. second finger on touch).\n if (this.activeBubblePointerId !== null) return;\n event.preventDefault();\n\n const target = event.currentTarget as HTMLElement;\n target.setPointerCapture(event.pointerId);\n this.bubbleCaptureTarget = target;\n\n this.activeBubblePointerId = event.pointerId;\n this.bubbleDragStartMouseY = event.clientY;\n this.bubbleDragStartOffset = this.BubbleOffsetY;\n this.bubbleDragMoved = false;\n this.IsBubblePressed = true;\n this.cdr.detectChanges();\n\n document.addEventListener('pointermove', this.onBubbleDragMove);\n document.addEventListener('pointerup', this.onBubbleDragEnd);\n document.addEventListener('pointercancel', this.onBubbleDragEnd);\n }\n\n private onBubbleDragMove = (event: PointerEvent): void => {\n if (event.pointerId !== this.activeBubblePointerId) return;\n const deltaY = this.bubbleDragStartMouseY - event.clientY; // dragging up = positive\n if (!this.bubbleDragMoved) {\n if (Math.abs(deltaY) < ChatAgentsOverlayComponent.BUBBLE_DRAG_THRESHOLD_PX) return;\n this.bubbleDragMoved = true;\n this.IsBubbleDragging = true;\n }\n this.BubbleOffsetY = this.clampBubbleOffsetY(this.bubbleDragStartOffset + deltaY);\n this.cdr.detectChanges();\n };\n\n private onBubbleDragEnd = (event: PointerEvent): void => {\n if (event.pointerId !== this.activeBubblePointerId) return;\n this.removeBubbleDragListeners();\n\n if (this.bubbleCaptureTarget) {\n // Browser may have implicitly released capture on pointerup already (per the\n // Pointer Events spec). releasePointerCapture throws in that race; safe to ignore.\n try { this.bubbleCaptureTarget.releasePointerCapture(event.pointerId); } catch { /* noop */ }\n }\n this.bubbleCaptureTarget = null;\n this.activeBubblePointerId = null;\n\n const wasDragged = this.bubbleDragMoved;\n const wasCancelled = event.type === 'pointercancel';\n this.bubbleDragMoved = false;\n this.IsBubbleDragging = false;\n this.IsBubblePressed = false;\n if (wasDragged) {\n this.savePreferences();\n this.cdr.detectChanges();\n } else if (!wasCancelled) {\n this.Toggle();\n } else {\n this.cdr.detectChanges();\n }\n };\n\n private removeBubbleDragListeners(): void {\n document.removeEventListener('pointermove', this.onBubbleDragMove);\n document.removeEventListener('pointerup', this.onBubbleDragEnd);\n document.removeEventListener('pointercancel', this.onBubbleDragEnd);\n }\n\n /**\n * Reserved space at the top of the viewport — host-supplied chrome plus\n * the padding gap we always keep above the bubble/panel.\n */\n private get topReservedPx(): number {\n return Math.max(0, this.TopBoundaryPx) + ChatAgentsOverlayComponent.VIEWPORT_TOP_PADDING_PX;\n }\n\n /** Clamp the offset so the bubble stays fully visible below the top boundary. */\n private clampBubbleOffsetY(value: number): number {\n const maxOffset = window.innerHeight\n - ChatAgentsOverlayComponent.BUBBLE_SIZE_PX\n - ChatAgentsOverlayComponent.BASE_BOTTOM_PX\n - this.topReservedPx;\n return Math.max(0, Math.min(Math.max(0, maxOffset), value));\n }\n\n // --- Render Position Getters ---\n\n /** Effective `bottom` (px) for the floating bubble, clamped to the current viewport. */\n public get BubbleBottomPx(): number {\n const ideal = ChatAgentsOverlayComponent.BASE_BOTTOM_PX + this.BubbleOffsetY;\n const max = window.innerHeight\n - ChatAgentsOverlayComponent.BUBBLE_SIZE_PX\n - this.topReservedPx;\n return Math.max(\n ChatAgentsOverlayComponent.BASE_BOTTOM_PX,\n Math.min(ideal, Math.max(ChatAgentsOverlayComponent.BASE_BOTTOM_PX, max))\n );\n }\n\n /**\n * Effective `bottom` (px) for the expanded panel. Anchors to the bubble's\n * current bottom edge so the panel grows up from where the user parked the\n * bubble, but clamps downward whenever the panel would otherwise extend\n * past the viewport's top boundary — that's the \"reposition lower so the\n * chat interface stays visible\" behavior.\n */\n public get PanelBottomPx(): number {\n const ideal = ChatAgentsOverlayComponent.BASE_BOTTOM_PX + this.BubbleOffsetY;\n const maxBottomForVisibility = window.innerHeight\n - this.PanelHeight\n - this.topReservedPx;\n return Math.max(\n ChatAgentsOverlayComponent.BASE_BOTTOM_PX,\n Math.min(ideal, maxBottomForVisibility)\n );\n }\n\n // --- Private Methods ---\n\n /** Auto-resolve CurrentUser and EnvironmentId from Metadata when not provided as inputs */\n private resolveDefaults(): void {\n if (!this.CurrentUser) {\n const md = this.ProviderToUse;\n this.CurrentUser = md.CurrentUser;\n }\n if (!this.EnvironmentId) {\n this.EnvironmentId = MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n }\n\n /** Load saved panel size and bubble position from UserInfoEngine */\n private loadPreferences(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const raw = engine.GetSetting(ChatAgentsOverlayComponent.SIZE_SETTING_KEY);\n if (raw) {\n const prefs: OverlayPrefs = JSON.parse(raw);\n this.PanelWidth = this.clampWidth(prefs.width);\n this.PanelHeight = this.clampHeight(prefs.height);\n if (typeof prefs.bubbleOffsetY === 'number') {\n this.BubbleOffsetY = Math.max(0, prefs.bubbleOffsetY);\n }\n if (typeof prefs.bubbleHidden === 'boolean') {\n this.IsHidden = prefs.bubbleHidden;\n }\n }\n } catch {\n // Use defaults on error\n }\n }\n\n /** Persist panel size and bubble position to UserInfoEngine (debounced) */\n private savePreferences(): void {\n const prefs: OverlayPrefs = {\n width: this.PanelWidth,\n height: this.PanelHeight,\n bubbleOffsetY: this.BubbleOffsetY,\n bubbleHidden: this.IsHidden\n };\n UserInfoEngine.Instance.SetSettingDebounced(\n ChatAgentsOverlayComponent.SIZE_SETTING_KEY,\n JSON.stringify(prefs)\n );\n }\n\n /** Subscribe to bridge events for cross-view coordination */\n private subscribeToBridgeEvents(): void {\n this.bridge.SwitchEvent$\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: ConversationSwitchEvent) => {\n if (event.Target === 'overlay') {\n this.handleSwitchToOverlay(event);\n }\n });\n\n // Allow arbitrary callers (Form Builder cockpit, etc.) to ask the\n // overlay to expand. Idempotent if we're already expanded —\n // Expand() is safe to call in any state.\n this.bridge.ExpandOverlayRequested$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.State === 'collapsed') {\n this.Expand();\n }\n });\n\n this.bridge.ActiveConversationID$\n .pipe(takeUntil(this.destroy$))\n .subscribe((id: string | null) => {\n // Only update if the change came from outside (workspace)\n if (id !== this._conversationId && this.bridge.WorkspaceActive$.value) {\n const prevId = this._conversationId;\n this._conversationId = id;\n this.IsNewConversation = id === null;\n this.Conversation = null; // Will be loaded by chat area\n this.emitConversationSwitched(prevId, id);\n this.cdr.detectChanges();\n }\n });\n }\n\n /** Subscribe to agent client tool execution events */\n private subscribeToToolEvents(): void {\n this.agentClient.ToolExecuted$\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: ClientToolResultEvent) => {\n this.ToolExecuted.emit(event);\n });\n }\n\n /** Handle request to switch conversation to the overlay */\n private handleSwitchToOverlay(event: ConversationSwitchEvent): void {\n const prevId = this._conversationId;\n this._conversationId = event.ConversationID;\n this.IsNewConversation = event.ConversationID === null;\n this.Conversation = null; // Will be reloaded by chat area\n this.Expand();\n this.emitConversationSwitched(prevId, event.ConversationID);\n }\n\n /** Emit a conversation switched event */\n private emitConversationSwitched(prevId: string | null, newId: string | null): void {\n this.ConversationSwitched.emit({\n PreviousConversationID: prevId,\n NewConversationID: newId\n });\n }\n}\n","@if (IsVisible) {\n <!-- Floating Button (collapsed state, not hidden) -->\n @if (State === 'collapsed' && !IsHidden) {\n <div class=\"chat-overlay-bubble\"\n [class.is-pressed]=\"IsBubblePressed\"\n [class.is-dragging]=\"IsBubbleDragging\"\n [style.bottom.px]=\"BubbleBottomPx\"\n (pointerdown)=\"OnBubblePointerDown($event)\">\n <i class=\"fa-solid fa-chevron-up chat-overlay-bubble-arrow chat-overlay-bubble-arrow-up\" aria-hidden=\"true\"></i>\n <i class=\"fa-solid fa-chevron-down chat-overlay-bubble-arrow chat-overlay-bubble-arrow-down\" aria-hidden=\"true\"></i>\n <i class=\"fa-solid fa-comments chat-overlay-bubble-icon\"></i>\n @if (UnreadCount > 0) {\n <span class=\"chat-overlay-badge\">{{ UnreadCount > 9 ? '9+' : UnreadCount }}</span>\n }\n <!-- Hide affordance: revealed on hover. pointerdown stops drag from starting; click hides the bubble. -->\n <button type=\"button\"\n class=\"chat-overlay-bubble-close\"\n title=\"Hide chat — a thin sliver will remain on the right edge\"\n aria-label=\"Hide chat overlay\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"Hide($event)\">\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Collapsed sliver — flush with the right edge when the bubble is hidden.\n Click opens the chat directly; closing returns to the bubble (not the\n sliver). To re-enter hidden mode the user clicks the × pill again. -->\n @if (State === 'collapsed' && IsHidden) {\n <button type=\"button\"\n class=\"chat-overlay-sliver\"\n title=\"Open chat\"\n aria-label=\"Open chat\"\n [style.bottom.px]=\"BubbleBottomPx\"\n (click)=\"Expand()\">\n <i class=\"fa-solid fa-comments chat-overlay-sliver-icon\" aria-hidden=\"true\"></i>\n @if (UnreadCount > 0) {\n <span class=\"chat-overlay-badge chat-overlay-sliver-badge\">{{ UnreadCount > 9 ? '9+' : UnreadCount }}</span>\n }\n </button>\n }\n\n <!-- Expanded / Maximized Chat Panel -->\n @if (State === 'expanded' || State === 'maximized') {\n <div class=\"chat-overlay-panel\"\n [class.maximized]=\"State === 'maximized'\"\n [style.width.px]=\"State === 'maximized' ? null : PanelWidth\"\n [style.height.px]=\"State === 'maximized' ? null : PanelHeight\"\n [style.bottom.px]=\"State === 'maximized' ? null : PanelBottomPx\">\n\n <!-- Resize handles (only in expanded, not maximized) -->\n @if (State === 'expanded') {\n <div class=\"resize-handle resize-left\"\n (mousedown)=\"OnResizeStart($event, 'left')\"></div>\n <div class=\"resize-handle resize-top\"\n (mousedown)=\"OnResizeStart($event, 'top')\"></div>\n <div class=\"resize-handle resize-top-left\"\n (mousedown)=\"OnResizeStart($event, 'top-left')\"></div>\n }\n\n <!-- Panel Header -->\n <div class=\"chat-overlay-header\">\n <div class=\"chat-overlay-title\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>AI Assistant</span>\n </div>\n <div class=\"chat-overlay-header-actions\">\n <button\n class=\"chat-overlay-header-btn\"\n title=\"New conversation\"\n (click)=\"StartNewConversation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (ConversationId) {\n <button\n class=\"chat-overlay-header-btn\"\n title=\"Open in full chat workspace\"\n (click)=\"OnOpenFullChatWorkspace()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n }\n <button\n class=\"chat-overlay-header-btn\"\n [title]=\"State === 'maximized' ? 'Restore size' : 'Maximize'\"\n (click)=\"ToggleMaximize()\">\n <i class=\"fa-solid\" [class.fa-expand]=\"State !== 'maximized'\" [class.fa-compress]=\"State === 'maximized'\"></i>\n </button>\n <button\n class=\"chat-overlay-header-btn\"\n title=\"Minimize\"\n (click)=\"Collapse()\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n </div>\n </div>\n\n <!-- Chat Content — wraps conversation-chat-area -->\n <div class=\"chat-overlay-body\">\n <mj-conversation-chat-area\n [environmentId]=\"EnvironmentId\"\n [currentUser]=\"CurrentUser\"\n [conversationId]=\"ConversationId\"\n [conversation]=\"Conversation\"\n [isNewConversation]=\"IsNewConversation\"\n [pendingMessage]=\"PendingMessage\"\n [pendingAttachments]=\"PendingAttachments\"\n [pendingMessageConversationId]=\"PendingMessageConversationId\"\n [overlayMode]=\"true\"\n [showExportButton]=\"false\"\n [showShareButton]=\"false\"\n [showArtifactIndicator]=\"false\"\n [appContext]=\"AppContext\"\n [emptyStateGreeting]=\"EmptyStateGreeting\"\n (conversationCreated)=\"OnConversationCreated($event)\"\n (conversationRenamed)=\"OnConversationRenamed($event)\"\n (pendingMessageConsumed)=\"OnPendingMessageConsumed()\"\n (openEntityRecord)=\"OnOpenEntityRecord($event)\"\n (navigationRequest)=\"OnNavigationRequest($event)\"\n (taskClicked)=\"OnTaskClicked($event)\"\n ></mj-conversation-chat-area>\n </div>\n </div>\n }\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import { EventEmitter } from '@angular/core';
2
- import { UserInfo } from '@memberjunction/core';
2
+ import { CompositeKey, UserInfo } from '@memberjunction/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import { NavigationTab } from '../../models/conversation-state.model';
4
5
  import * as i0 from "@angular/core";
5
- export declare class ConversationSidebarComponent {
6
+ export declare class ConversationSidebarComponent extends BaseAngularComponent {
6
7
  activeTab: NavigationTab;
7
8
  environmentId: string;
8
9
  currentUser: UserInfo;
@@ -10,13 +11,20 @@ export declare class ConversationSidebarComponent {
10
11
  renamedConversationId: string | null;
11
12
  isSidebarPinned: boolean;
12
13
  isMobileView: boolean;
14
+ /** Show the Routines section at the bottom of the sidebar (bubbled from the workspace; default true). */
15
+ ShowRoutines: boolean;
13
16
  conversationSelected: EventEmitter<string>;
17
+ /** Forwarded from the routines section — a run's linked execution record was clicked. */
18
+ openEntityRecord: EventEmitter<{
19
+ entityName: string;
20
+ compositeKey: CompositeKey;
21
+ }>;
14
22
  newConversationRequested: EventEmitter<void>;
15
23
  pinSidebarRequested: EventEmitter<void>;
16
24
  unpinSidebarRequested: EventEmitter<void>;
17
25
  onPinSidebarRequested(): void;
18
26
  onUnpinSidebarRequested(): void;
19
27
  static ɵfac: i0.ɵɵFactoryDeclaration<ConversationSidebarComponent, never>;
20
- static ɵcmp: i0.ɵɵComponentDeclaration<ConversationSidebarComponent, "mj-conversation-sidebar", never, { "activeTab": { "alias": "activeTab"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "selectedConversationId": { "alias": "selectedConversationId"; "required": false; }; "renamedConversationId": { "alias": "renamedConversationId"; "required": false; }; "isSidebarPinned": { "alias": "isSidebarPinned"; "required": false; }; "isMobileView": { "alias": "isMobileView"; "required": false; }; }, { "conversationSelected": "conversationSelected"; "newConversationRequested": "newConversationRequested"; "pinSidebarRequested": "pinSidebarRequested"; "unpinSidebarRequested": "unpinSidebarRequested"; }, never, never, false, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConversationSidebarComponent, "mj-conversation-sidebar", never, { "activeTab": { "alias": "activeTab"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "selectedConversationId": { "alias": "selectedConversationId"; "required": false; }; "renamedConversationId": { "alias": "renamedConversationId"; "required": false; }; "isSidebarPinned": { "alias": "isSidebarPinned"; "required": false; }; "isMobileView": { "alias": "isMobileView"; "required": false; }; "ShowRoutines": { "alias": "ShowRoutines"; "required": false; }; }, { "conversationSelected": "conversationSelected"; "openEntityRecord": "openEntityRecord"; "newConversationRequested": "newConversationRequested"; "pinSidebarRequested": "pinSidebarRequested"; "unpinSidebarRequested": "unpinSidebarRequested"; }, never, never, false, never>;
21
29
  }
22
30
  //# sourceMappingURL=conversation-sidebar.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-sidebar.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/conversation-sidebar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;;AAEtE,qBAyDa,4BAA4B;IAC9B,SAAS,EAAE,aAAa,CAAmB;IAC3C,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7C,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5C,eAAe,EAAE,OAAO,CAAQ;IAChC,YAAY,EAAE,OAAO,CAAS;IAE7B,oBAAoB,uBAA8B;IAClD,wBAAwB,qBAA4B;IACpD,mBAAmB,qBAA4B;IAC/C,qBAAqB,qBAA4B;IAE3D,qBAAqB,IAAI,IAAI;IAI7B,uBAAuB,IAAI,IAAI;yCAlBpB,4BAA4B;2CAA5B,4BAA4B;CAqBxC"}
1
+ {"version":3,"file":"conversation-sidebar.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/conversation-sidebar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;;AAEtE,qBAmEa,4BAA6B,SAAQ,oBAAoB;IAC3D,SAAS,EAAE,aAAa,CAAmB;IAC3C,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7C,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5C,eAAe,EAAE,OAAO,CAAQ;IAChC,YAAY,EAAE,OAAO,CAAS;IACvC,yGAAyG;IAChG,YAAY,EAAE,OAAO,CAAQ;IAE5B,oBAAoB,uBAA8B;IAC5D,yFAAyF;IAC/E,gBAAgB;oBAAkC,MAAM;sBAAgB,YAAY;OAAM;IAC1F,wBAAwB,qBAA4B;IACpD,mBAAmB,qBAA4B;IAC/C,qBAAqB,qBAA4B;IAE3D,qBAAqB,IAAI,IAAI;IAI7B,uBAAuB,IAAI,IAAI;yCAtBpB,4BAA4B;2CAA5B,4BAA4B;CAyBxC"}
@@ -1,10 +1,12 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import * as i0 from "@angular/core";
3
- import * as i1 from "../conversation/conversation-list.component";
4
- import * as i2 from "../collection/collection-tree.component";
4
+ import * as i1 from "./routines-section.component";
5
+ import * as i2 from "../conversation/conversation-list.component";
6
+ import * as i3 from "../collection/collection-tree.component";
5
7
  function ConversationSidebarComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
6
8
  const _r1 = i0.ɵɵgetCurrentView();
7
- i0.ɵɵelementStart(0, "div", 1)(1, "mj-conversation-list", 2);
9
+ i0.ɵɵelementStart(0, "div", 1)(1, "mj-conversation-list", 3);
8
10
  i0.ɵɵlistener("conversationSelected", function ConversationSidebarComponent_Conditional_1_Template_mj_conversation_list_conversationSelected_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.conversationSelected.emit($event)); })("newConversationRequested", function ConversationSidebarComponent_Conditional_1_Template_mj_conversation_list_newConversationRequested_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.newConversationRequested.emit()); })("pinSidebarRequested", function ConversationSidebarComponent_Conditional_1_Template_mj_conversation_list_pinSidebarRequested_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onPinSidebarRequested()); })("unpinSidebarRequested", function ConversationSidebarComponent_Conditional_1_Template_mj_conversation_list_unpinSidebarRequested_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUnpinSidebarRequested()); });
9
11
  i0.ɵɵelementEnd()();
10
12
  } if (rf & 2) {
@@ -14,14 +16,14 @@ function ConversationSidebarComponent_Conditional_1_Template(rf, ctx) { if (rf &
14
16
  } }
15
17
  function ConversationSidebarComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
16
18
  i0.ɵɵelementStart(0, "div", 1);
17
- i0.ɵɵelement(1, "mj-collection-tree", 3);
19
+ i0.ɵɵelement(1, "mj-collection-tree", 4);
18
20
  i0.ɵɵelementEnd();
19
21
  } if (rf & 2) {
20
22
  const ctx_r1 = i0.ɵɵnextContext();
21
23
  i0.ɵɵadvance();
22
24
  i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser);
23
25
  } }
24
- export class ConversationSidebarComponent {
26
+ export class ConversationSidebarComponent extends BaseAngularComponent {
25
27
  activeTab = 'conversations';
26
28
  environmentId;
27
29
  currentUser;
@@ -29,7 +31,11 @@ export class ConversationSidebarComponent {
29
31
  renamedConversationId = null;
30
32
  isSidebarPinned = true;
31
33
  isMobileView = false;
34
+ /** Show the Routines section at the bottom of the sidebar (bubbled from the workspace; default true). */
35
+ ShowRoutines = true;
32
36
  conversationSelected = new EventEmitter();
37
+ /** Forwarded from the routines section — a run's linked execution record was clicked. */
38
+ openEntityRecord = new EventEmitter();
33
39
  newConversationRequested = new EventEmitter();
34
40
  pinSidebarRequested = new EventEmitter();
35
41
  unpinSidebarRequested = new EventEmitter();
@@ -39,18 +45,22 @@ export class ConversationSidebarComponent {
39
45
  onUnpinSidebarRequested() {
40
46
  this.unpinSidebarRequested.emit();
41
47
  }
42
- static ɵfac = function ConversationSidebarComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationSidebarComponent)(); };
43
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationSidebarComponent, selectors: [["mj-conversation-sidebar"]], inputs: { activeTab: "activeTab", environmentId: "environmentId", currentUser: "currentUser", selectedConversationId: "selectedConversationId", renamedConversationId: "renamedConversationId", isSidebarPinned: "isSidebarPinned", isMobileView: "isMobileView" }, outputs: { conversationSelected: "conversationSelected", newConversationRequested: "newConversationRequested", pinSidebarRequested: "pinSidebarRequested", unpinSidebarRequested: "unpinSidebarRequested" }, standalone: false, decls: 3, vars: 2, consts: [[1, "conversation-sidebar"], [1, "sidebar-content"], [3, "conversationSelected", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "environmentId", "currentUser"]], template: function ConversationSidebarComponent_Template(rf, ctx) { if (rf & 1) {
48
+ static ɵfac = /*@__PURE__*/ (() => { let ɵConversationSidebarComponent_BaseFactory; return function ConversationSidebarComponent_Factory(__ngFactoryType__) { return (ɵConversationSidebarComponent_BaseFactory || (ɵConversationSidebarComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ConversationSidebarComponent)))(__ngFactoryType__ || ConversationSidebarComponent); }; })();
49
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationSidebarComponent, selectors: [["mj-conversation-sidebar"]], inputs: { activeTab: "activeTab", environmentId: "environmentId", currentUser: "currentUser", selectedConversationId: "selectedConversationId", renamedConversationId: "renamedConversationId", isSidebarPinned: "isSidebarPinned", isMobileView: "isMobileView", ShowRoutines: "ShowRoutines" }, outputs: { conversationSelected: "conversationSelected", openEntityRecord: "openEntityRecord", newConversationRequested: "newConversationRequested", pinSidebarRequested: "pinSidebarRequested", unpinSidebarRequested: "unpinSidebarRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 4, consts: [[1, "conversation-sidebar"], [1, "sidebar-content"], [3, "openEntityRecord", "openConversation", "Provider", "ShowRoutines"], [3, "conversationSelected", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "environmentId", "currentUser"]], template: function ConversationSidebarComponent_Template(rf, ctx) { if (rf & 1) {
44
50
  i0.ɵɵelementStart(0, "div", 0);
45
51
  i0.ɵɵconditionalCreate(1, ConversationSidebarComponent_Conditional_1_Template, 2, 6, "div", 1);
46
52
  i0.ɵɵconditionalCreate(2, ConversationSidebarComponent_Conditional_2_Template, 2, 2, "div", 1);
47
- i0.ɵɵelementEnd();
53
+ i0.ɵɵelementStart(3, "mj-conversation-routines-section", 2);
54
+ i0.ɵɵlistener("openEntityRecord", function ConversationSidebarComponent_Template_mj_conversation_routines_section_openEntityRecord_3_listener($event) { return ctx.openEntityRecord.emit($event); })("openConversation", function ConversationSidebarComponent_Template_mj_conversation_routines_section_openConversation_3_listener($event) { return ctx.conversationSelected.emit($event); });
55
+ i0.ɵɵelementEnd()();
48
56
  } if (rf & 2) {
49
57
  i0.ɵɵadvance();
50
58
  i0.ɵɵconditional(ctx.activeTab === "conversations" ? 1 : -1);
51
59
  i0.ɵɵadvance();
52
60
  i0.ɵɵconditional(ctx.activeTab === "collections" ? 2 : -1);
53
- } }, dependencies: [i1.ConversationListComponent, i2.CollectionTreeComponent], styles: [".conversation-sidebar[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .sidebar-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n }\n .placeholder[_ngcontent-%COMP%] {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n }\n .placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }"] });
61
+ i0.ɵɵadvance();
62
+ i0.ɵɵproperty("Provider", ctx.Provider)("ShowRoutines", ctx.ShowRoutines);
63
+ } }, dependencies: [i1.RoutinesSectionComponent, i2.ConversationListComponent, i3.CollectionTreeComponent], styles: [".conversation-sidebar[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .sidebar-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n }\n .placeholder[_ngcontent-%COMP%] {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n }\n .placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }"] });
54
64
  }
55
65
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationSidebarComponent, [{
56
66
  type: Component,
@@ -80,6 +90,16 @@ export class ConversationSidebarComponent {
80
90
  </mj-collection-tree>
81
91
  </div>
82
92
  }
93
+
94
+ <!-- Routines — pinned at the very bottom of the sidebar. Gated by the
95
+ ShowRoutines opt-out AND the user's Read permission on
96
+ 'MJ: User Routines' (checked inside the section component). -->
97
+ <mj-conversation-routines-section
98
+ [Provider]="Provider"
99
+ [ShowRoutines]="ShowRoutines"
100
+ (openEntityRecord)="openEntityRecord.emit($event)"
101
+ (openConversation)="conversationSelected.emit($event)">
102
+ </mj-conversation-routines-section>
83
103
  </div>
84
104
  `, styles: ["\n .conversation-sidebar {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .sidebar-content {\n flex: 1;\n overflow-y: auto;\n }\n .placeholder {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n }\n .placeholder p {\n margin: 0;\n font-size: 14px;\n }\n "] }]
85
105
  }], null, { activeTab: [{
@@ -96,8 +116,12 @@ export class ConversationSidebarComponent {
96
116
  type: Input
97
117
  }], isMobileView: [{
98
118
  type: Input
119
+ }], ShowRoutines: [{
120
+ type: Input
99
121
  }], conversationSelected: [{
100
122
  type: Output
123
+ }], openEntityRecord: [{
124
+ type: Output
101
125
  }], newConversationRequested: [{
102
126
  type: Output
103
127
  }], pinSidebarRequested: [{
@@ -105,5 +129,5 @@ export class ConversationSidebarComponent {
105
129
  }], unpinSidebarRequested: [{
106
130
  type: Output
107
131
  }] }); })();
108
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationSidebarComponent, { className: "ConversationSidebarComponent", filePath: "src/lib/components/sidebar/conversation-sidebar.component.ts", lineNumber: 62 }); })();
132
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationSidebarComponent, { className: "ConversationSidebarComponent", filePath: "src/lib/components/sidebar/conversation-sidebar.component.ts", lineNumber: 73 }); })();
109
133
  //# sourceMappingURL=conversation-sidebar.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-sidebar.component.js","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/conversation-sidebar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;;;;;;IAW7D,AADF,8BAA6B,8BAW2B;IAApD,AADA,AADA,AADA,kPAAwB,wCAAiC,KAAC,uOAC9B,sCAA+B,KAAC,6NACrC,8BAAuB,KAAC,iOACtB,gCAAyB,KAAC;IAEvD,AADE,iBAAuB,EACnB;;;IAXF,cAA+B;IAK/B,AADA,AADA,AADA,AADA,AADA,oDAA+B,mCACJ,yDACsB,uDACF,2CACZ,qCACN;;;IASjC,8BAA6B;IAC3B,wCAGqB;IACvB,iBAAM;;;IAHF,cAA+B;IAC/B,AADA,oDAA+B,mCACJ;;AAgCvC,MAAM,OAAO,4BAA4B;IAC9B,SAAS,GAAkB,eAAe,CAAC;IAC3C,aAAa,CAAU;IACvB,WAAW,CAAY;IACvB,sBAAsB,GAAkB,IAAI,CAAC;IAC7C,qBAAqB,GAAkB,IAAI,CAAC;IAC5C,eAAe,GAAY,IAAI,CAAC;IAChC,YAAY,GAAY,KAAK,CAAC;IAE7B,oBAAoB,GAAG,IAAI,YAAY,EAAU,CAAC;IAClD,wBAAwB,GAAG,IAAI,YAAY,EAAQ,CAAC;IACpD,mBAAmB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC/C,qBAAqB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE3D,qBAAqB;QACnB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;sHApBU,4BAA4B;6DAA5B,4BAA4B;YArDrC,8BAAkC;YAChC,8FAAqC;YAgBrC,8FAAmC;YAQrC,iBAAM;;YAxBJ,cAeC;YAfD,4DAeC;YACD,cAOC;YAPD,0DAOC;;;iFA6BM,4BAA4B;cAzDxC,SAAS;6BACI,KAAK,YACP,yBAAyB,YACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2BP;;kBA4BF,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFAZI,4BAA4B","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { NavigationTab } from '../../models/conversation-state.model';\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-sidebar',\n template: `\n <div class=\"conversation-sidebar\">\n @if (activeTab === 'conversations') {\n <div class=\"sidebar-content\">\n <mj-conversation-list\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"conversationSelected.emit($event)\"\n (newConversationRequested)=\"newConversationRequested.emit()\"\n (pinSidebarRequested)=\"onPinSidebarRequested()\"\n (unpinSidebarRequested)=\"onUnpinSidebarRequested()\">\n </mj-conversation-list>\n </div>\n }\n @if (activeTab === 'collections') {\n <div class=\"sidebar-content\">\n <mj-collection-tree\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\">\n </mj-collection-tree>\n </div>\n }\n </div>\n `,\n styles: [`\n .conversation-sidebar {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .sidebar-content {\n flex: 1;\n overflow-y: auto;\n }\n .placeholder {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n }\n .placeholder p {\n margin: 0;\n font-size: 14px;\n }\n `]\n})\nexport class ConversationSidebarComponent {\n @Input() activeTab: NavigationTab = 'conversations';\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedConversationId: string | null = null;\n @Input() renamedConversationId: string | null = null;\n @Input() isSidebarPinned: boolean = true;\n @Input() isMobileView: boolean = false;\n\n @Output() conversationSelected = new EventEmitter<string>();\n @Output() newConversationRequested = new EventEmitter<void>();\n @Output() pinSidebarRequested = new EventEmitter<void>();\n @Output() unpinSidebarRequested = new EventEmitter<void>();\n\n onPinSidebarRequested(): void {\n this.pinSidebarRequested.emit();\n }\n\n onUnpinSidebarRequested(): void {\n this.unpinSidebarRequested.emit();\n }\n}"]}
1
+ {"version":3,"file":"conversation-sidebar.component.js","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/conversation-sidebar.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;;;;;;IAU3D,AADF,8BAA6B,8BAW2B;IAApD,AADA,AADA,AADA,kPAAwB,wCAAiC,KAAC,uOAC9B,sCAA+B,KAAC,6NACrC,8BAAuB,KAAC,iOACtB,gCAAyB,KAAC;IAEvD,AADE,iBAAuB,EACnB;;;IAXF,cAA+B;IAK/B,AADA,AADA,AADA,AADA,AADA,oDAA+B,mCACJ,yDACsB,uDACF,2CACZ,qCACN;;;IASjC,8BAA6B;IAC3B,wCAGqB;IACvB,iBAAM;;;IAHF,cAA+B;IAC/B,AADA,oDAA+B,mCACJ;;AA0CvC,MAAM,OAAO,4BAA6B,SAAQ,oBAAoB;IAC3D,SAAS,GAAkB,eAAe,CAAC;IAC3C,aAAa,CAAU;IACvB,WAAW,CAAY;IACvB,sBAAsB,GAAkB,IAAI,CAAC;IAC7C,qBAAqB,GAAkB,IAAI,CAAC;IAC5C,eAAe,GAAY,IAAI,CAAC;IAChC,YAAY,GAAY,KAAK,CAAC;IACvC,yGAAyG;IAChG,YAAY,GAAY,IAAI,CAAC;IAE5B,oBAAoB,GAAG,IAAI,YAAY,EAAU,CAAC;IAC5D,yFAAyF;IAC/E,gBAAgB,GAAG,IAAI,YAAY,EAAsD,CAAC;IAC1F,wBAAwB,GAAG,IAAI,YAAY,EAAQ,CAAC;IACpD,mBAAmB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC/C,qBAAqB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE3D,qBAAqB;QACnB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;6RAxBU,4BAA4B,yBAA5B,4BAA4B;6DAA5B,4BAA4B;YA/DrC,8BAAkC;YAChC,8FAAqC;YAgBrC,8FAAmC;YAYnC,2DAIyD;YAAvD,AADA,+JAAoB,iCAA6B,IAAC,kJAC9B,qCAAiC,IAAC;YAE1D,AADE,iBAAmC,EAC/B;;YAlCJ,cAeC;YAfD,4DAeC;YACD,cAOC;YAPD,0DAOC;YAMC,cAAqB;YACrB,AADA,uCAAqB,kCACQ;;;iFAgCxB,4BAA4B;cAnExC,SAAS;6BACI,KAAK,YACP,yBAAyB,YACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqCP;;kBA4BF,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,KAAK;;kBAEL,MAAM;;kBAEN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFAhBI,4BAA4B","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CompositeKey, UserInfo } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { NavigationTab } from '../../models/conversation-state.model';\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-sidebar',\n template: `\n <div class=\"conversation-sidebar\">\n @if (activeTab === 'conversations') {\n <div class=\"sidebar-content\">\n <mj-conversation-list\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"conversationSelected.emit($event)\"\n (newConversationRequested)=\"newConversationRequested.emit()\"\n (pinSidebarRequested)=\"onPinSidebarRequested()\"\n (unpinSidebarRequested)=\"onUnpinSidebarRequested()\">\n </mj-conversation-list>\n </div>\n }\n @if (activeTab === 'collections') {\n <div class=\"sidebar-content\">\n <mj-collection-tree\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\">\n </mj-collection-tree>\n </div>\n }\n\n <!-- Routines — pinned at the very bottom of the sidebar. Gated by the\n ShowRoutines opt-out AND the user's Read permission on\n 'MJ: User Routines' (checked inside the section component). -->\n <mj-conversation-routines-section\n [Provider]=\"Provider\"\n [ShowRoutines]=\"ShowRoutines\"\n (openEntityRecord)=\"openEntityRecord.emit($event)\"\n (openConversation)=\"conversationSelected.emit($event)\">\n </mj-conversation-routines-section>\n </div>\n `,\n styles: [`\n .conversation-sidebar {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .sidebar-content {\n flex: 1;\n overflow-y: auto;\n }\n .placeholder {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n }\n .placeholder p {\n margin: 0;\n font-size: 14px;\n }\n `]\n})\nexport class ConversationSidebarComponent extends BaseAngularComponent {\n @Input() activeTab: NavigationTab = 'conversations';\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedConversationId: string | null = null;\n @Input() renamedConversationId: string | null = null;\n @Input() isSidebarPinned: boolean = true;\n @Input() isMobileView: boolean = false;\n /** Show the Routines section at the bottom of the sidebar (bubbled from the workspace; default true). */\n @Input() ShowRoutines: boolean = true;\n\n @Output() conversationSelected = new EventEmitter<string>();\n /** Forwarded from the routines section — a run's linked execution record was clicked. */\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; compositeKey: CompositeKey }>();\n @Output() newConversationRequested = new EventEmitter<void>();\n @Output() pinSidebarRequested = new EventEmitter<void>();\n @Output() unpinSidebarRequested = new EventEmitter<void>();\n\n onPinSidebarRequested(): void {\n this.pinSidebarRequested.emit();\n }\n\n onUnpinSidebarRequested(): void {\n this.unpinSidebarRequested.emit();\n }\n}"]}
@@ -0,0 +1,73 @@
1
+ import { CompositeKey } from '@memberjunction/core';
2
+ import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
+ import { ConversationOpenedEventArgs, HistoryRecordOpenedEventArgs } from '@memberjunction/ng-user-routines';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Compact "Routines" entry pinned at the very bottom of the conversations left
8
+ * sidebar: a single header row — mark, "Routines", the ACTIVE routine count, a "+"
9
+ * (straight into the New Routine editor) and a details chevron. No routine rows —
10
+ * the full command-center slide-in is one click away and owns all detail.
11
+ *
12
+ * Visibility gates (both must pass):
13
+ * 1. `ShowRoutines` — host opt-out input bubbled from the top-level conversations
14
+ * workspace (default true).
15
+ * 2. The current user must have Read permission on 'MJ: User Routines'
16
+ * (EntityInfo user-permission check) — hidden entirely otherwise.
17
+ */
18
+ export declare class RoutinesSectionComponent extends BaseAngularComponent implements OnInit, OnDestroy {
19
+ private cdr;
20
+ private destroy$;
21
+ private _showRoutines;
22
+ /** Host opt-out (bubbled from the top-level conversations component). Default true. */
23
+ set ShowRoutines(value: boolean);
24
+ get ShowRoutines(): boolean;
25
+ /** True when the current user may read routines (permission gate). */
26
+ CanRead: boolean;
27
+ /** Number of Active routines — the header badge. */
28
+ ActiveCount: number;
29
+ /** Total routines of any status (for the header tooltip). */
30
+ TotalCount: number;
31
+ /**
32
+ * A run history row's linked execution record (Agent Run / Prompt Run / Action Log)
33
+ * was clicked. Same shape as the chat area's openEntityRecord — the host (Explorer
34
+ * wrapper or workspace) routes it to navigation; this package never navigates itself.
35
+ */
36
+ openEntityRecord: EventEmitter<{
37
+ entityName: string;
38
+ compositeKey: CompositeKey;
39
+ }>;
40
+ /**
41
+ * The user asked to open a routine's dedicated conversation (the hidden,
42
+ * Application-scoped thread its runs append to). Emits the conversation ID;
43
+ * the host selects it in chat — this component closes the slide-in first.
44
+ */
45
+ openConversation: EventEmitter<string>;
46
+ /** Slide-in open state. */
47
+ SlideInVisible: boolean;
48
+ /** Routine to open the slide-in on (history view). */
49
+ SlideInRoutineID: string | null;
50
+ /** Whether the slide-in opens straight on the New Routine editor. */
51
+ SlideInNewRoutine: boolean;
52
+ private initialized;
53
+ /** Section renders only when the opt-out AND permission gates both pass. */
54
+ get IsVisible(): boolean;
55
+ /** Header tooltip: active/total breakdown. */
56
+ get HeaderTitle(): string;
57
+ ngOnInit(): Promise<void>;
58
+ ngOnDestroy(): void;
59
+ /** Opens the slide-in on the routines list (header / details click). */
60
+ OpenRoutines(): void;
61
+ /** Opens the slide-in straight on the New Routine editor ("+" affordance). */
62
+ NewRoutine(event: Event): void;
63
+ /** Opens the routine's conversation in the host chat surface (closing the slide-in). */
64
+ OnConversationOpened(args: ConversationOpenedEventArgs): void;
65
+ /** Bridges the slide-in's HistoryRecordOpened to the standard openEntityRecord chain. */
66
+ OnHistoryRecordOpened(args: HistoryRecordOpenedEventArgs): void;
67
+ OnSlideInClosed(): void;
68
+ private initialize;
69
+ private rebuildCounts;
70
+ static ɵfac: i0.ɵɵFactoryDeclaration<RoutinesSectionComponent, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<RoutinesSectionComponent, "mj-conversation-routines-section", never, { "ShowRoutines": { "alias": "ShowRoutines"; "required": false; }; }, { "openEntityRecord": "openEntityRecord"; "openConversation": "openConversation"; }, never, never, false, never>;
72
+ }
73
+ //# sourceMappingURL=routines-section.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routines-section.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/routines-section.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAgC,YAAY,EAAS,SAAS,EAAE,MAAM,EAAkB,MAAM,eAAe,CAAC;AAGrH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;;AAE7G;;;;;;;;;;;GAWG;AACH,qBAMa,wBAAyB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC3F,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,aAAa,CAAQ;IAC7B,uFAAuF;IACvF,IACW,YAAY,CAAC,KAAK,EAAE,OAAO,EAQrC;IACD,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED,sEAAsE;IAC/D,OAAO,UAAS;IACvB,oDAAoD;IAC7C,WAAW,SAAK;IACvB,6DAA6D;IACtD,UAAU,SAAK;IAEtB;;;;OAIG;IACO,gBAAgB;oBAAkC,MAAM;sBAAgB,YAAY;OAAM;IAEpG;;;;OAIG;IACO,gBAAgB,uBAA8B;IAExD,2BAA2B;IACpB,cAAc,UAAS;IAC9B,sDAAsD;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9C,qEAAqE;IAC9D,iBAAiB,UAAS;IAEjC,OAAO,CAAC,WAAW,CAAS;IAE5B,4EAA4E;IAC5E,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,8CAA8C;IAC9C,IAAW,WAAW,IAAI,MAAM,CAK/B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAKnB,wEAAwE;IACjE,YAAY,IAAI,IAAI;IAO3B,8EAA8E;IACvE,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAQrC,wFAAwF;IACjF,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI;IAKpE,yFAAyF;IAClF,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI;IAI/D,eAAe,IAAI,IAAI;YAUhB,UAAU;IAgCxB,OAAO,CAAC,aAAa;yCAhJZ,wBAAwB;2CAAxB,wBAAwB;CAsJpC"}