@memberjunction/ng-dashboards 6.2.0-edge.4 → 6.2.0-edge.5

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 (87) hide show
  1. package/dist/AI/components/vectors/sensitive-fields.d.ts +53 -0
  2. package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -0
  3. package/dist/AI/components/vectors/sensitive-fields.js +226 -0
  4. package/dist/AI/components/vectors/sensitive-fields.js.map +1 -0
  5. package/dist/AI/components/vectors/vector-document-rules.d.ts +126 -0
  6. package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -0
  7. package/dist/AI/components/vectors/vector-document-rules.js +168 -0
  8. package/dist/AI/components/vectors/vector-document-rules.js.map +1 -0
  9. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +49 -0
  10. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/vectors/vector-management-resource.component.js +428 -230
  12. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  13. package/dist/Communication/communication-agent-context.d.ts +11 -1
  14. package/dist/Communication/communication-agent-context.d.ts.map +1 -1
  15. package/dist/Communication/communication-agent-context.js +15 -0
  16. package/dist/Communication/communication-agent-context.js.map +1 -1
  17. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  18. package/dist/Communication/communication-dashboard.component.js +5 -0
  19. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  20. package/dist/Communication/communication-providers-resource.component.d.ts +27 -1
  21. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  22. package/dist/Communication/communication-providers-resource.component.js +722 -78
  23. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  24. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +25 -0
  25. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  26. package/dist/DataExplorer/data-explorer-dashboard.component.js +74 -5
  27. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  28. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  29. package/dist/DevTools/app-state-inspector.component.js +1 -0
  30. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  31. package/dist/DevTools/class-registry.component.d.ts.map +1 -1
  32. package/dist/DevTools/class-registry.component.js +1 -0
  33. package/dist/DevTools/class-registry.component.js.map +1 -1
  34. package/dist/DevTools/event-monitor.component.d.ts.map +1 -1
  35. package/dist/DevTools/event-monitor.component.js +2 -0
  36. package/dist/DevTools/event-monitor.component.js.map +1 -1
  37. package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
  38. package/dist/DevTools/graphql-console.component.js.map +1 -1
  39. package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -1
  40. package/dist/DevTools/grid-width-lab.component.js +1 -0
  41. package/dist/DevTools/grid-width-lab.component.js.map +1 -1
  42. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  43. package/dist/DevTools/layout-inspector.component.js +1 -0
  44. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  45. package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -1
  46. package/dist/DevTools/lazy-module-status.component.js +1 -0
  47. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  48. package/dist/DevTools/settings-explorer.component.d.ts.map +1 -1
  49. package/dist/DevTools/settings-explorer.component.js +1 -0
  50. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  51. package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -1
  52. package/dist/DevTools/tab-strip-lab.component.js +1 -0
  53. package/dist/DevTools/tab-strip-lab.component.js.map +1 -1
  54. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +5 -0
  55. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  56. package/dist/EntityAdmin/entity-admin-dashboard.component.js +8 -5
  57. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  58. package/dist/Integration/components/overview/overview.component.js +2 -2
  59. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +2 -2
  60. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  61. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts +11 -1
  62. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts.map +1 -1
  63. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js +24 -2
  64. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js.map +1 -1
  65. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +16 -2
  66. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
  67. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +87 -33
  68. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
  69. package/dist/LoginStudio/login-studio-inspector.component.d.ts +130 -0
  70. package/dist/LoginStudio/login-studio-inspector.component.d.ts.map +1 -0
  71. package/dist/LoginStudio/login-studio-inspector.component.js +781 -0
  72. package/dist/LoginStudio/login-studio-inspector.component.js.map +1 -0
  73. package/dist/LoginStudio/login-studio-resource.component.d.ts +153 -0
  74. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -0
  75. package/dist/LoginStudio/login-studio-resource.component.js +857 -0
  76. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -0
  77. package/dist/Workflows/components/workflow-runs-resource.component.js +4 -4
  78. package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -1
  79. package/dist/core-dashboards.module.d.ts +2 -1
  80. package/dist/core-dashboards.module.d.ts.map +1 -1
  81. package/dist/core-dashboards.module.js +11 -3
  82. package/dist/core-dashboards.module.js.map +1 -1
  83. package/dist/public-api.d.ts +1 -0
  84. package/dist/public-api.d.ts.map +1 -1
  85. package/dist/public-api.js +1 -0
  86. package/dist/public-api.js.map +1 -1
  87. package/package.json +72 -69
@@ -131,7 +131,7 @@ export interface CommunicationLogsContext extends CommunicationSelectedItem {
131
131
  /** Per-row summaries of the visible (filtered) log rows (bounded). */
132
132
  VisibleLogSummaries: string[];
133
133
  }
134
- /** Providers surface: the configured messaging-provider cards. */
134
+ /** Providers surface: the configured messaging-provider cards + enterprise mailbox governance + agent utility mailboxes. */
135
135
  export interface CommunicationProvidersContext extends CommunicationSelectedItem {
136
136
  Surface: 'providers';
137
137
  /** Total provider cards. */
@@ -140,6 +140,16 @@ export interface CommunicationProvidersContext extends CommunicationSelectedItem
140
140
  ActiveProviderCount: number;
141
141
  /** Provider display names (bounded). */
142
142
  ProviderNames: string[];
143
+ /** Names of providers with SupportsCalendar = true (bounded). */
144
+ CalendarCapableProviderNames?: string[];
145
+ /** Names of providers with SupportsFreeBusy = true (bounded). */
146
+ FreeBusyCapableProviderNames?: string[];
147
+ /** Per-provider EnterpriseScopeMode & AllowedEmailDomains summaries (bounded). */
148
+ EnterpriseScopeSummaries?: string[];
149
+ /** Total registered Agent Utility Mailboxes (MJ: AI Bridge Agent Identities with IdentityType='Email'). */
150
+ AgentUtilityMailboxCount?: number;
151
+ /** Bounded summary list of Agent Utility Mailboxes ("<email> · <agent> · <user|shared>"). */
152
+ AgentUtilityMailboxSummaries?: string[];
143
153
  }
144
154
  /** Templates surface: reusable message templates with a category filter + search. */
145
155
  export interface CommunicationTemplatesContext extends CommunicationSelectedItem {
@@ -1 +1 @@
1
- {"version":3,"file":"communication-agent-context.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-agent-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"communication-agent-context.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-agent-context.ts"],"names":[],"mappings":"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"}
@@ -149,6 +149,21 @@ function buildProvidersContext(s, context) {
149
149
  context['SelectedProviderId'] = s.SelectedItemId;
150
150
  context['SelectedProviderName'] = s.SelectedItemName;
151
151
  appendBoundedList(context, 'ProviderNames', 'ProviderNameCount', s.ProviderNames);
152
+ if (s.CalendarCapableProviderNames) {
153
+ appendBoundedList(context, 'CalendarCapableProviders', 'CalendarCapableProviderCount', s.CalendarCapableProviderNames);
154
+ }
155
+ if (s.FreeBusyCapableProviderNames) {
156
+ appendBoundedList(context, 'FreeBusyCapableProviders', 'FreeBusyCapableProviderCount', s.FreeBusyCapableProviderNames);
157
+ }
158
+ if (s.EnterpriseScopeSummaries) {
159
+ appendBoundedList(context, 'EnterpriseScopeSummaries', 'EnterpriseScopeSummaryCount', s.EnterpriseScopeSummaries);
160
+ }
161
+ if (typeof s.AgentUtilityMailboxCount === 'number') {
162
+ context['AgentUtilityMailboxCount'] = s.AgentUtilityMailboxCount;
163
+ }
164
+ if (s.AgentUtilityMailboxSummaries) {
165
+ appendBoundedList(context, 'AgentUtilityMailboxes', 'AgentUtilityMailboxTotalCount', s.AgentUtilityMailboxSummaries);
166
+ }
152
167
  }
153
168
  /** Shape the templates surface slice. */
154
169
  function buildTemplatesContext(s, context) {
@@ -1 +1 @@
1
- {"version":3,"file":"communication-agent-context.js","sourceRoot":"","sources":["../../src/Communication/communication-agent-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure helpers for the Communication dashboard's AI-agent integration.\n *\n * These functions are intentionally free of Angular / component dependencies so they\n * can be unit-tested in isolation. The dashboard component\n * ({@link CommunicationDashboardComponent}) supplies a plain snapshot of its current\n * state (its own active-tab state plus deep, per-surface state harvested from whichever\n * lazily-mounted child resource components exist) and these helpers shape it into the\n * key-value `AgentContext` object that flows to the async chat agent and the realtime\n * co-agent via `NavigationService.SetAgentContext`.\n *\n * The shape mirrors the \"hardcore\"/Data-Explorer-depth pattern: the active tab decides\n * which deep slice is published (mode-scoped context), every list is bounded, and the\n * selected item is reported by id AND name so the co-agent can refer to it the way a\n * user does.\n *\n * 🚨 SAFETY: these helpers only SHAPE read-only state into a context object. They\n * perform no mutation and have no side effects. Send-message / template-author /\n * provider-edit / test-send state is intentionally never surfaced here (see the\n * SAFETY BOUNDARY comment in the dashboard component). Nothing here exposes message\n * bodies, recipient lists, provider credentials, or template content — only aggregate\n * counts, the active filters/search, and the salient display names of visible rows.\n */\n\n/** The six navigation tabs the Communication dashboard exposes. */\nexport const COMMUNICATION_TABS = ['monitor', 'logs', 'providers', 'templates', 'runs', 'settings'] as const;\n\n/** A Communication-dashboard tab id. */\nexport type CommunicationTab = (typeof COMMUNICATION_TABS)[number];\n\n/** Human-readable label for each tab, in {@link COMMUNICATION_TABS} order. */\nexport const COMMUNICATION_TAB_LABELS: Record<CommunicationTab, string> = {\n monitor: 'Monitor',\n logs: 'Logs',\n providers: 'Providers',\n templates: 'Templates',\n runs: 'Runs',\n settings: 'Settings',\n};\n\n/**\n * The communication-log status values the agent may filter by. `''` clears the\n * filter (all statuses). These mirror the chip options the logs resource renders.\n */\nexport const COMMUNICATION_LOG_STATUSES = ['', 'Complete', 'Failed', 'Pending'] as const;\n\n/** A communication-log status filter value (empty string = no filter). */\nexport type CommunicationLogStatus = (typeof COMMUNICATION_LOG_STATUSES)[number];\n\n/**\n * Upper bound on how many display names / item summaries we publish in any one\n * context list field (visible logs, providers, templates, runs). Bounded so the\n * streamed note stays small even when a surface holds hundreds of rows; a companion\n * total-count field reports the true number when the list is truncated.\n */\nexport const COMMUNICATION_CONTEXT_LIST_CAP = 25;\n\n/**\n * Cap an array of names/summaries to {@link COMMUNICATION_CONTEXT_LIST_CAP} entries.\n * Pure + deterministic; returns a new array and never mutates the input.\n *\n * @param items - the full list (caller owns ordering / de-duplication)\n * @returns the first N entries, where N is the cap\n */\nexport function CapCommunicationList<T>(items: readonly T[]): T[] {\n return items.slice(0, COMMUNICATION_CONTEXT_LIST_CAP);\n}\n\n/** @deprecated Use {@link CapCommunicationList}. */\nexport function capCommunicationList<T>(items: readonly T[]): T[] {\n return CapCommunicationList(items);\n}\n\n/**\n * Type-guard / validator for a Communication tab id. Keeps the\n * `SwitchCommunicationTab` client tool tolerant of arbitrary agent input — only the\n * six known tab ids are accepted.\n */\nexport function IsValidCommunicationTab(tab: unknown): tab is CommunicationTab {\n return typeof tab === 'string' && (COMMUNICATION_TABS as readonly string[]).includes(tab);\n}\n\n/** @deprecated Use {@link IsValidCommunicationTab}. */\nexport function isValidCommunicationTab(tab: unknown): tab is CommunicationTab {\n return IsValidCommunicationTab(tab);\n}\n\n/** Resolve a tab id to its human-readable label, falling back to a default. */\nexport function CommunicationTabLabel(tab: string): string {\n return IsValidCommunicationTab(tab) ? COMMUNICATION_TAB_LABELS[tab] : 'Communication Management';\n}\n\n/** @deprecated Use {@link CommunicationTabLabel}. */\nexport function communicationTabLabel(tab: string): string {\n return CommunicationTabLabel(tab);\n}\n\n/**\n * A minimal id+name descriptor for a selectable item on a Communication surface\n * (a log row, provider card, template, or run). The component derives `Name` from\n * whatever the surface shows the user (provider name, template name, a short run id),\n * so the resolver matches the way a user refers to the row.\n */\nexport interface CommunicationItemCandidate {\n ID: string;\n Name: string;\n}\n\n/**\n * Resolve an agent-supplied item reference (by id or display name) to one of the\n * available items on a surface. Tries, in order:\n * 1. exact id (case-insensitive — handles SQL-Server-uppercase vs PG-lowercase UUIDs)\n * 2. exact display name (case-insensitive)\n * 3. first case-insensitive *contains* match on the display name\n *\n * Pure + deterministic over the supplied candidate list, so it's unit-testable in\n * isolation. Returns the matched candidate, or null on a miss.\n *\n * @param input - whatever the agent passed (an id or the on-screen name)\n * @param candidates - the items currently visible on the surface\n */\nexport function ResolveCommunicationItem<T extends CommunicationItemCandidate>(\n input: string,\n candidates: readonly T[],\n): T | null {\n const needle = (input ?? '').trim().toLowerCase();\n if (!needle) {\n return null;\n }\n const byId = candidates.find(c => c.ID.toLowerCase() === needle);\n if (byId) {\n return byId;\n }\n const byName = candidates.find(c => c.Name.toLowerCase() === needle);\n if (byName) {\n return byName;\n }\n const byContains = candidates.find(c => c.Name.toLowerCase().includes(needle));\n return byContains ?? null;\n}\n\n/** @deprecated Use {@link ResolveCommunicationItem}. */\nexport function resolveCommunicationItem<T extends CommunicationItemCandidate>(\n input: string,\n candidates: readonly T[],\n): T | null {\n return ResolveCommunicationItem(input, candidates);\n}\n\n/**\n * Selected-item context (id + name), shared by every surface that can have a\n * selected/opened row. Both are null when nothing is selected.\n */\nexport interface CommunicationSelectedItem {\n SelectedItemId: string | null;\n SelectedItemName: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Per-surface context inputs (a discriminated union keyed by the active tab).\n// Each surface carries everything visible on that screen, bounded lists, and the\n// selected id+name where applicable. Counts are non-nullable here — the component\n// only supplies a surface slice once its child is mounted; an unmounted surface\n// publishes the lean fallback (active tab only) instead.\n// ---------------------------------------------------------------------------\n\n/** Monitor surface: delivery KPIs + provider-health / channel breakdown. */\nexport interface CommunicationMonitorContext {\n Surface: 'monitor';\n /** Successfully-sent messages in the last 24h. */\n TotalSent: number;\n /** Delivery success rate (%). */\n DeliveryRate: number;\n /** Messages awaiting a provider. */\n Pending: number;\n /** Failed messages in the last 24h. */\n Failed: number;\n /** Provider names shown in the Provider Health panel (bounded). */\n ProviderHealthNames: string[];\n /** Total providers tracked in the health panel (for truncation reporting). */\n ProviderHealthCount: number;\n /** Channel names shown in the Channel Breakdown panel (e.g. Email, SMS). */\n ChannelNames: string[];\n /** Message-type / provider summary of the most-recent activity rows (bounded). */\n RecentActivityNames: string[];\n}\n\n/** Logs surface: the (read-only) message-log list with a status filter + search. */\nexport interface CommunicationLogsContext extends CommunicationSelectedItem {\n Surface: 'logs';\n /** Total log rows loaded. */\n LogCount: number;\n /** Log rows after the current status + search filters. */\n FilteredLogCount: number;\n /** Active status filter ('' = all). */\n StatusFilter: CommunicationLogStatus;\n /** Current free-text search applied to the log list. */\n SearchText: string;\n /** Per-row summaries of the visible (filtered) log rows (bounded). */\n VisibleLogSummaries: string[];\n}\n\n/** Providers surface: the configured messaging-provider cards. */\nexport interface CommunicationProvidersContext extends CommunicationSelectedItem {\n Surface: 'providers';\n /** Total provider cards. */\n ProviderCount: number;\n /** Count of providers whose Status is Active. */\n ActiveProviderCount: number;\n /** Provider display names (bounded). */\n ProviderNames: string[];\n}\n\n/** Templates surface: reusable message templates with a category filter + search. */\nexport interface CommunicationTemplatesContext extends CommunicationSelectedItem {\n Surface: 'templates';\n /** Total templates loaded. */\n TemplateCount: number;\n /** Templates after the current category + search filters. */\n FilteredTemplateCount: number;\n /** Active category filter ('' = all). */\n CategoryFilter: string;\n /** Current free-text search applied to the template list. */\n SearchText: string;\n /** The category names available to filter by (bounded). */\n AvailableCategories: string[];\n /** Visible (filtered) template names (bounded). */\n VisibleTemplateNames: string[];\n}\n\n/** Runs surface: bulk communication-run history (read-only timeline). */\nexport interface CommunicationRunsContext extends CommunicationSelectedItem {\n Surface: 'runs';\n /** Total runs loaded in the timeline. */\n RunCount: number;\n /** Currently-active (In-Progress) runs. */\n ActiveRunCount: number;\n /** Runs completed in the last 24h. */\n CompletedRunCount: number;\n /** Run success rate (%). */\n SuccessRate: number;\n /** Short summaries of the visible runs (\"<short-id> · <status>\") (bounded). */\n VisibleRunSummaries: string[];\n}\n\n/** A surface that the user has opened but whose child hasn't reported data yet. */\nexport interface CommunicationNoSurfaceContext {\n Surface: 'none';\n}\n\n/** The deep per-surface slice, discriminated on {@link CommunicationSurfaceContext.Surface}. */\nexport type CommunicationSurfaceContext =\n | CommunicationMonitorContext\n | CommunicationLogsContext\n | CommunicationProvidersContext\n | CommunicationTemplatesContext\n | CommunicationRunsContext\n | CommunicationNoSurfaceContext;\n\n/**\n * The plain, component-supplied snapshot used to build the agent context.\n *\n * The dashboard owns the active-tab / refresh state; the deep `Surface` slice is\n * harvested from the active tab's lazily-mounted child resource component. When that\n * child isn't mounted yet (the tab was restored from saved state but its content hasn't\n * loaded, or the active tab is \"settings\" which has no child), `Surface` is the lean\n * `{ Surface: 'none' }` and only the active-tab/refresh fields are published — truthfully\n * reporting \"not loaded yet\" rather than a misleading `0`.\n */\nexport interface CommunicationAgentContextInput {\n /** The currently-active tab. */\n ActiveTab: CommunicationTab;\n /** Human-readable label for the active tab (e.g. \"Logs\"). */\n ActiveTabLabel: string;\n /** The tab ids the user has visited this session (their child content is mounted). */\n VisitedTabs: readonly string[];\n /** Whether a manual refresh is currently in flight. */\n IsRefreshing: boolean;\n /** The deep state of whichever surface is active (or `none` when unmounted). */\n Surface: CommunicationSurfaceContext;\n}\n\n/** Append a bounded list field plus a companion total-count field when truncated. */\nfunction appendBoundedList(\n context: Record<string, unknown>,\n listKey: string,\n countKey: string,\n items: readonly string[],\n): void {\n if (items.length === 0) {\n return;\n }\n context[listKey] = CapCommunicationList(items);\n if (items.length > COMMUNICATION_CONTEXT_LIST_CAP) {\n context[countKey] = items.length;\n }\n}\n\n/** Shape the monitor surface slice. */\nfunction buildMonitorContext(s: CommunicationMonitorContext, context: Record<string, unknown>): void {\n context['TotalSent'] = s.TotalSent;\n context['DeliveryRate'] = s.DeliveryRate;\n context['Pending'] = s.Pending;\n context['Failed'] = s.Failed;\n context['ProviderHealthCount'] = s.ProviderHealthCount;\n appendBoundedList(context, 'ProviderHealthNames', 'ProviderHealthNameCount', s.ProviderHealthNames);\n appendBoundedList(context, 'ChannelNames', 'ChannelNameCount', s.ChannelNames);\n appendBoundedList(context, 'RecentActivity', 'RecentActivityCount', s.RecentActivityNames);\n}\n\n/** Shape the logs surface slice. */\nfunction buildLogsContext(s: CommunicationLogsContext, context: Record<string, unknown>): void {\n context['LogCount'] = s.LogCount;\n context['FilteredLogCount'] = s.FilteredLogCount;\n context['LogStatusFilter'] = s.StatusFilter;\n context['LogSearchText'] = s.SearchText;\n context['SelectedLogId'] = s.SelectedItemId;\n context['SelectedLogName'] = s.SelectedItemName;\n appendBoundedList(context, 'VisibleLogs', 'VisibleLogCount', s.VisibleLogSummaries);\n}\n\n/** Shape the providers surface slice. */\nfunction buildProvidersContext(s: CommunicationProvidersContext, context: Record<string, unknown>): void {\n context['ProviderCount'] = s.ProviderCount;\n context['ActiveProviderCount'] = s.ActiveProviderCount;\n context['SelectedProviderId'] = s.SelectedItemId;\n context['SelectedProviderName'] = s.SelectedItemName;\n appendBoundedList(context, 'ProviderNames', 'ProviderNameCount', s.ProviderNames);\n}\n\n/** Shape the templates surface slice. */\nfunction buildTemplatesContext(s: CommunicationTemplatesContext, context: Record<string, unknown>): void {\n context['TemplateCount'] = s.TemplateCount;\n context['FilteredTemplateCount'] = s.FilteredTemplateCount;\n context['TemplateCategoryFilter'] = s.CategoryFilter;\n context['TemplateSearchText'] = s.SearchText;\n context['SelectedTemplateId'] = s.SelectedItemId;\n context['SelectedTemplateName'] = s.SelectedItemName;\n appendBoundedList(context, 'AvailableCategories', 'AvailableCategoryCount', s.AvailableCategories);\n appendBoundedList(context, 'VisibleTemplates', 'VisibleTemplateCount', s.VisibleTemplateNames);\n}\n\n/** Shape the runs surface slice. */\nfunction buildRunsContext(s: CommunicationRunsContext, context: Record<string, unknown>): void {\n context['RunCount'] = s.RunCount;\n context['ActiveRunCount'] = s.ActiveRunCount;\n context['CompletedRunCount'] = s.CompletedRunCount;\n context['RunSuccessRate'] = s.SuccessRate;\n context['SelectedRunId'] = s.SelectedItemId;\n context['SelectedRunName'] = s.SelectedItemName;\n appendBoundedList(context, 'VisibleRuns', 'VisibleRunCount', s.VisibleRunSummaries);\n}\n\n/**\n * Build the agent-visible context object for the Communication dashboard.\n *\n * Always reports the active tab and refresh state. The deep, per-surface slice is\n * appended only for the active, mounted surface — so the co-agent sees a focused view\n * of exactly what's on screen (mode-scoped context) rather than a flat dump of every\n * tab's counts. An unmounted surface (`Surface: 'none'`) contributes nothing beyond the\n * active-tab fields.\n *\n * Keeping this a pure function (no `this`) makes the context shape unit-testable and\n * decouples it from change-detection timing.\n *\n * @param input - the component's current state snapshot\n * @returns a flat key-value object suitable for `SetAgentContext`\n */\nexport function BuildCommunicationAgentContext(input: CommunicationAgentContextInput): Record<string, unknown> {\n const context: Record<string, unknown> = {\n ActiveTab: input.ActiveTab,\n ActiveTabLabel: input.ActiveTabLabel,\n VisitedTabs: [...input.VisitedTabs],\n IsRefreshing: input.IsRefreshing,\n };\n\n switch (input.Surface.Surface) {\n case 'monitor':\n buildMonitorContext(input.Surface, context);\n break;\n case 'logs':\n buildLogsContext(input.Surface, context);\n break;\n case 'providers':\n buildProvidersContext(input.Surface, context);\n break;\n case 'templates':\n buildTemplatesContext(input.Surface, context);\n break;\n case 'runs':\n buildRunsContext(input.Surface, context);\n break;\n case 'none':\n break;\n }\n\n return context;\n}\n\n/** @deprecated Use {@link BuildCommunicationAgentContext}. */\nexport function buildCommunicationAgentContext(input: CommunicationAgentContextInput): Record<string, unknown> {\n return BuildCommunicationAgentContext(input);\n}\n"]}
1
+ {"version":3,"file":"communication-agent-context.js","sourceRoot":"","sources":["../../src/Communication/communication-agent-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure helpers for the Communication dashboard's AI-agent integration.\n *\n * These functions are intentionally free of Angular / component dependencies so they\n * can be unit-tested in isolation. The dashboard component\n * ({@link CommunicationDashboardComponent}) supplies a plain snapshot of its current\n * state (its own active-tab state plus deep, per-surface state harvested from whichever\n * lazily-mounted child resource components exist) and these helpers shape it into the\n * key-value `AgentContext` object that flows to the async chat agent and the realtime\n * co-agent via `NavigationService.SetAgentContext`.\n *\n * The shape mirrors the \"hardcore\"/Data-Explorer-depth pattern: the active tab decides\n * which deep slice is published (mode-scoped context), every list is bounded, and the\n * selected item is reported by id AND name so the co-agent can refer to it the way a\n * user does.\n *\n * 🚨 SAFETY: these helpers only SHAPE read-only state into a context object. They\n * perform no mutation and have no side effects. Send-message / template-author /\n * provider-edit / test-send state is intentionally never surfaced here (see the\n * SAFETY BOUNDARY comment in the dashboard component). Nothing here exposes message\n * bodies, recipient lists, provider credentials, or template content — only aggregate\n * counts, the active filters/search, and the salient display names of visible rows.\n */\n\n/** The six navigation tabs the Communication dashboard exposes. */\nexport const COMMUNICATION_TABS = ['monitor', 'logs', 'providers', 'templates', 'runs', 'settings'] as const;\n\n/** A Communication-dashboard tab id. */\nexport type CommunicationTab = (typeof COMMUNICATION_TABS)[number];\n\n/** Human-readable label for each tab, in {@link COMMUNICATION_TABS} order. */\nexport const COMMUNICATION_TAB_LABELS: Record<CommunicationTab, string> = {\n monitor: 'Monitor',\n logs: 'Logs',\n providers: 'Providers',\n templates: 'Templates',\n runs: 'Runs',\n settings: 'Settings',\n};\n\n/**\n * The communication-log status values the agent may filter by. `''` clears the\n * filter (all statuses). These mirror the chip options the logs resource renders.\n */\nexport const COMMUNICATION_LOG_STATUSES = ['', 'Complete', 'Failed', 'Pending'] as const;\n\n/** A communication-log status filter value (empty string = no filter). */\nexport type CommunicationLogStatus = (typeof COMMUNICATION_LOG_STATUSES)[number];\n\n/**\n * Upper bound on how many display names / item summaries we publish in any one\n * context list field (visible logs, providers, templates, runs). Bounded so the\n * streamed note stays small even when a surface holds hundreds of rows; a companion\n * total-count field reports the true number when the list is truncated.\n */\nexport const COMMUNICATION_CONTEXT_LIST_CAP = 25;\n\n/**\n * Cap an array of names/summaries to {@link COMMUNICATION_CONTEXT_LIST_CAP} entries.\n * Pure + deterministic; returns a new array and never mutates the input.\n *\n * @param items - the full list (caller owns ordering / de-duplication)\n * @returns the first N entries, where N is the cap\n */\nexport function CapCommunicationList<T>(items: readonly T[]): T[] {\n return items.slice(0, COMMUNICATION_CONTEXT_LIST_CAP);\n}\n\n/** @deprecated Use {@link CapCommunicationList}. */\nexport function capCommunicationList<T>(items: readonly T[]): T[] {\n return CapCommunicationList(items);\n}\n\n/**\n * Type-guard / validator for a Communication tab id. Keeps the\n * `SwitchCommunicationTab` client tool tolerant of arbitrary agent input — only the\n * six known tab ids are accepted.\n */\nexport function IsValidCommunicationTab(tab: unknown): tab is CommunicationTab {\n return typeof tab === 'string' && (COMMUNICATION_TABS as readonly string[]).includes(tab);\n}\n\n/** @deprecated Use {@link IsValidCommunicationTab}. */\nexport function isValidCommunicationTab(tab: unknown): tab is CommunicationTab {\n return IsValidCommunicationTab(tab);\n}\n\n/** Resolve a tab id to its human-readable label, falling back to a default. */\nexport function CommunicationTabLabel(tab: string): string {\n return IsValidCommunicationTab(tab) ? COMMUNICATION_TAB_LABELS[tab] : 'Communication Management';\n}\n\n/** @deprecated Use {@link CommunicationTabLabel}. */\nexport function communicationTabLabel(tab: string): string {\n return CommunicationTabLabel(tab);\n}\n\n/**\n * A minimal id+name descriptor for a selectable item on a Communication surface\n * (a log row, provider card, template, or run). The component derives `Name` from\n * whatever the surface shows the user (provider name, template name, a short run id),\n * so the resolver matches the way a user refers to the row.\n */\nexport interface CommunicationItemCandidate {\n ID: string;\n Name: string;\n}\n\n/**\n * Resolve an agent-supplied item reference (by id or display name) to one of the\n * available items on a surface. Tries, in order:\n * 1. exact id (case-insensitive — handles SQL-Server-uppercase vs PG-lowercase UUIDs)\n * 2. exact display name (case-insensitive)\n * 3. first case-insensitive *contains* match on the display name\n *\n * Pure + deterministic over the supplied candidate list, so it's unit-testable in\n * isolation. Returns the matched candidate, or null on a miss.\n *\n * @param input - whatever the agent passed (an id or the on-screen name)\n * @param candidates - the items currently visible on the surface\n */\nexport function ResolveCommunicationItem<T extends CommunicationItemCandidate>(\n input: string,\n candidates: readonly T[],\n): T | null {\n const needle = (input ?? '').trim().toLowerCase();\n if (!needle) {\n return null;\n }\n const byId = candidates.find(c => c.ID.toLowerCase() === needle);\n if (byId) {\n return byId;\n }\n const byName = candidates.find(c => c.Name.toLowerCase() === needle);\n if (byName) {\n return byName;\n }\n const byContains = candidates.find(c => c.Name.toLowerCase().includes(needle));\n return byContains ?? null;\n}\n\n/** @deprecated Use {@link ResolveCommunicationItem}. */\nexport function resolveCommunicationItem<T extends CommunicationItemCandidate>(\n input: string,\n candidates: readonly T[],\n): T | null {\n return ResolveCommunicationItem(input, candidates);\n}\n\n/**\n * Selected-item context (id + name), shared by every surface that can have a\n * selected/opened row. Both are null when nothing is selected.\n */\nexport interface CommunicationSelectedItem {\n SelectedItemId: string | null;\n SelectedItemName: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Per-surface context inputs (a discriminated union keyed by the active tab).\n// Each surface carries everything visible on that screen, bounded lists, and the\n// selected id+name where applicable. Counts are non-nullable here — the component\n// only supplies a surface slice once its child is mounted; an unmounted surface\n// publishes the lean fallback (active tab only) instead.\n// ---------------------------------------------------------------------------\n\n/** Monitor surface: delivery KPIs + provider-health / channel breakdown. */\nexport interface CommunicationMonitorContext {\n Surface: 'monitor';\n /** Successfully-sent messages in the last 24h. */\n TotalSent: number;\n /** Delivery success rate (%). */\n DeliveryRate: number;\n /** Messages awaiting a provider. */\n Pending: number;\n /** Failed messages in the last 24h. */\n Failed: number;\n /** Provider names shown in the Provider Health panel (bounded). */\n ProviderHealthNames: string[];\n /** Total providers tracked in the health panel (for truncation reporting). */\n ProviderHealthCount: number;\n /** Channel names shown in the Channel Breakdown panel (e.g. Email, SMS). */\n ChannelNames: string[];\n /** Message-type / provider summary of the most-recent activity rows (bounded). */\n RecentActivityNames: string[];\n}\n\n/** Logs surface: the (read-only) message-log list with a status filter + search. */\nexport interface CommunicationLogsContext extends CommunicationSelectedItem {\n Surface: 'logs';\n /** Total log rows loaded. */\n LogCount: number;\n /** Log rows after the current status + search filters. */\n FilteredLogCount: number;\n /** Active status filter ('' = all). */\n StatusFilter: CommunicationLogStatus;\n /** Current free-text search applied to the log list. */\n SearchText: string;\n /** Per-row summaries of the visible (filtered) log rows (bounded). */\n VisibleLogSummaries: string[];\n}\n\n/** Providers surface: the configured messaging-provider cards + enterprise mailbox governance + agent utility mailboxes. */\nexport interface CommunicationProvidersContext extends CommunicationSelectedItem {\n Surface: 'providers';\n /** Total provider cards. */\n ProviderCount: number;\n /** Count of providers whose Status is Active. */\n ActiveProviderCount: number;\n /** Provider display names (bounded). */\n ProviderNames: string[];\n /** Names of providers with SupportsCalendar = true (bounded). */\n CalendarCapableProviderNames?: string[];\n /** Names of providers with SupportsFreeBusy = true (bounded). */\n FreeBusyCapableProviderNames?: string[];\n /** Per-provider EnterpriseScopeMode & AllowedEmailDomains summaries (bounded). */\n EnterpriseScopeSummaries?: string[];\n /** Total registered Agent Utility Mailboxes (MJ: AI Bridge Agent Identities with IdentityType='Email'). */\n AgentUtilityMailboxCount?: number;\n /** Bounded summary list of Agent Utility Mailboxes (\"<email> · <agent> · <user|shared>\"). */\n AgentUtilityMailboxSummaries?: string[];\n}\n\n/** Templates surface: reusable message templates with a category filter + search. */\nexport interface CommunicationTemplatesContext extends CommunicationSelectedItem {\n Surface: 'templates';\n /** Total templates loaded. */\n TemplateCount: number;\n /** Templates after the current category + search filters. */\n FilteredTemplateCount: number;\n /** Active category filter ('' = all). */\n CategoryFilter: string;\n /** Current free-text search applied to the template list. */\n SearchText: string;\n /** The category names available to filter by (bounded). */\n AvailableCategories: string[];\n /** Visible (filtered) template names (bounded). */\n VisibleTemplateNames: string[];\n}\n\n/** Runs surface: bulk communication-run history (read-only timeline). */\nexport interface CommunicationRunsContext extends CommunicationSelectedItem {\n Surface: 'runs';\n /** Total runs loaded in the timeline. */\n RunCount: number;\n /** Currently-active (In-Progress) runs. */\n ActiveRunCount: number;\n /** Runs completed in the last 24h. */\n CompletedRunCount: number;\n /** Run success rate (%). */\n SuccessRate: number;\n /** Short summaries of the visible runs (\"<short-id> · <status>\") (bounded). */\n VisibleRunSummaries: string[];\n}\n\n/** A surface that the user has opened but whose child hasn't reported data yet. */\nexport interface CommunicationNoSurfaceContext {\n Surface: 'none';\n}\n\n/** The deep per-surface slice, discriminated on {@link CommunicationSurfaceContext.Surface}. */\nexport type CommunicationSurfaceContext =\n | CommunicationMonitorContext\n | CommunicationLogsContext\n | CommunicationProvidersContext\n | CommunicationTemplatesContext\n | CommunicationRunsContext\n | CommunicationNoSurfaceContext;\n\n/**\n * The plain, component-supplied snapshot used to build the agent context.\n *\n * The dashboard owns the active-tab / refresh state; the deep `Surface` slice is\n * harvested from the active tab's lazily-mounted child resource component. When that\n * child isn't mounted yet (the tab was restored from saved state but its content hasn't\n * loaded, or the active tab is \"settings\" which has no child), `Surface` is the lean\n * `{ Surface: 'none' }` and only the active-tab/refresh fields are published — truthfully\n * reporting \"not loaded yet\" rather than a misleading `0`.\n */\nexport interface CommunicationAgentContextInput {\n /** The currently-active tab. */\n ActiveTab: CommunicationTab;\n /** Human-readable label for the active tab (e.g. \"Logs\"). */\n ActiveTabLabel: string;\n /** The tab ids the user has visited this session (their child content is mounted). */\n VisitedTabs: readonly string[];\n /** Whether a manual refresh is currently in flight. */\n IsRefreshing: boolean;\n /** The deep state of whichever surface is active (or `none` when unmounted). */\n Surface: CommunicationSurfaceContext;\n}\n\n/** Append a bounded list field plus a companion total-count field when truncated. */\nfunction appendBoundedList(\n context: Record<string, unknown>,\n listKey: string,\n countKey: string,\n items: readonly string[],\n): void {\n if (items.length === 0) {\n return;\n }\n context[listKey] = CapCommunicationList(items);\n if (items.length > COMMUNICATION_CONTEXT_LIST_CAP) {\n context[countKey] = items.length;\n }\n}\n\n/** Shape the monitor surface slice. */\nfunction buildMonitorContext(s: CommunicationMonitorContext, context: Record<string, unknown>): void {\n context['TotalSent'] = s.TotalSent;\n context['DeliveryRate'] = s.DeliveryRate;\n context['Pending'] = s.Pending;\n context['Failed'] = s.Failed;\n context['ProviderHealthCount'] = s.ProviderHealthCount;\n appendBoundedList(context, 'ProviderHealthNames', 'ProviderHealthNameCount', s.ProviderHealthNames);\n appendBoundedList(context, 'ChannelNames', 'ChannelNameCount', s.ChannelNames);\n appendBoundedList(context, 'RecentActivity', 'RecentActivityCount', s.RecentActivityNames);\n}\n\n/** Shape the logs surface slice. */\nfunction buildLogsContext(s: CommunicationLogsContext, context: Record<string, unknown>): void {\n context['LogCount'] = s.LogCount;\n context['FilteredLogCount'] = s.FilteredLogCount;\n context['LogStatusFilter'] = s.StatusFilter;\n context['LogSearchText'] = s.SearchText;\n context['SelectedLogId'] = s.SelectedItemId;\n context['SelectedLogName'] = s.SelectedItemName;\n appendBoundedList(context, 'VisibleLogs', 'VisibleLogCount', s.VisibleLogSummaries);\n}\n\n/** Shape the providers surface slice. */\nfunction buildProvidersContext(s: CommunicationProvidersContext, context: Record<string, unknown>): void {\n context['ProviderCount'] = s.ProviderCount;\n context['ActiveProviderCount'] = s.ActiveProviderCount;\n context['SelectedProviderId'] = s.SelectedItemId;\n context['SelectedProviderName'] = s.SelectedItemName;\n appendBoundedList(context, 'ProviderNames', 'ProviderNameCount', s.ProviderNames);\n if (s.CalendarCapableProviderNames) {\n appendBoundedList(context, 'CalendarCapableProviders', 'CalendarCapableProviderCount', s.CalendarCapableProviderNames);\n }\n if (s.FreeBusyCapableProviderNames) {\n appendBoundedList(context, 'FreeBusyCapableProviders', 'FreeBusyCapableProviderCount', s.FreeBusyCapableProviderNames);\n }\n if (s.EnterpriseScopeSummaries) {\n appendBoundedList(context, 'EnterpriseScopeSummaries', 'EnterpriseScopeSummaryCount', s.EnterpriseScopeSummaries);\n }\n if (typeof s.AgentUtilityMailboxCount === 'number') {\n context['AgentUtilityMailboxCount'] = s.AgentUtilityMailboxCount;\n }\n if (s.AgentUtilityMailboxSummaries) {\n appendBoundedList(context, 'AgentUtilityMailboxes', 'AgentUtilityMailboxTotalCount', s.AgentUtilityMailboxSummaries);\n }\n}\n\n/** Shape the templates surface slice. */\nfunction buildTemplatesContext(s: CommunicationTemplatesContext, context: Record<string, unknown>): void {\n context['TemplateCount'] = s.TemplateCount;\n context['FilteredTemplateCount'] = s.FilteredTemplateCount;\n context['TemplateCategoryFilter'] = s.CategoryFilter;\n context['TemplateSearchText'] = s.SearchText;\n context['SelectedTemplateId'] = s.SelectedItemId;\n context['SelectedTemplateName'] = s.SelectedItemName;\n appendBoundedList(context, 'AvailableCategories', 'AvailableCategoryCount', s.AvailableCategories);\n appendBoundedList(context, 'VisibleTemplates', 'VisibleTemplateCount', s.VisibleTemplateNames);\n}\n\n/** Shape the runs surface slice. */\nfunction buildRunsContext(s: CommunicationRunsContext, context: Record<string, unknown>): void {\n context['RunCount'] = s.RunCount;\n context['ActiveRunCount'] = s.ActiveRunCount;\n context['CompletedRunCount'] = s.CompletedRunCount;\n context['RunSuccessRate'] = s.SuccessRate;\n context['SelectedRunId'] = s.SelectedItemId;\n context['SelectedRunName'] = s.SelectedItemName;\n appendBoundedList(context, 'VisibleRuns', 'VisibleRunCount', s.VisibleRunSummaries);\n}\n\n/**\n * Build the agent-visible context object for the Communication dashboard.\n *\n * Always reports the active tab and refresh state. The deep, per-surface slice is\n * appended only for the active, mounted surface — so the co-agent sees a focused view\n * of exactly what's on screen (mode-scoped context) rather than a flat dump of every\n * tab's counts. An unmounted surface (`Surface: 'none'`) contributes nothing beyond the\n * active-tab fields.\n *\n * Keeping this a pure function (no `this`) makes the context shape unit-testable and\n * decouples it from change-detection timing.\n *\n * @param input - the component's current state snapshot\n * @returns a flat key-value object suitable for `SetAgentContext`\n */\nexport function BuildCommunicationAgentContext(input: CommunicationAgentContextInput): Record<string, unknown> {\n const context: Record<string, unknown> = {\n ActiveTab: input.ActiveTab,\n ActiveTabLabel: input.ActiveTabLabel,\n VisitedTabs: [...input.VisitedTabs],\n IsRefreshing: input.IsRefreshing,\n };\n\n switch (input.Surface.Surface) {\n case 'monitor':\n buildMonitorContext(input.Surface, context);\n break;\n case 'logs':\n buildLogsContext(input.Surface, context);\n break;\n case 'providers':\n buildProvidersContext(input.Surface, context);\n break;\n case 'templates':\n buildTemplatesContext(input.Surface, context);\n break;\n case 'runs':\n buildRunsContext(input.Surface, context);\n break;\n case 'none':\n break;\n }\n\n return context;\n}\n\n/** @deprecated Use {@link BuildCommunicationAgentContext}. */\nexport function buildCommunicationAgentContext(input: CommunicationAgentContextInput): Record<string, unknown> {\n return BuildCommunicationAgentContext(input);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"communication-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-dashboard.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"communication-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-dashboard.component.ts"],"names":[],"mappings":"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"}
@@ -361,6 +361,11 @@ let CommunicationDashboardComponent = class CommunicationDashboardComponent exte
361
361
  ProviderCount: c.providerCards.length,
362
362
  ActiveProviderCount: c.providerCards.filter(p => p.Entity.Status === 'Active').length,
363
363
  ProviderNames: CapCommunicationList(c.providerCards.map(p => p.Entity.Name)),
364
+ CalendarCapableProviderNames: CapCommunicationList(c.providerCards.filter(p => p.Entity.SupportsCalendar).map(p => p.Entity.Name)),
365
+ FreeBusyCapableProviderNames: CapCommunicationList(c.providerCards.filter(p => p.Entity.SupportsFreeBusy).map(p => p.Entity.Name)),
366
+ EnterpriseScopeSummaries: CapCommunicationList(c.providerCards.map(p => `${p.Entity.Name} · ${p.Entity.EnterpriseScopeMode || 'UtilityMailboxesOnly'} · ${p.Entity.AllowedEmailDomains || 'Any domain'}`)),
367
+ AgentUtilityMailboxCount: c.AgentUtilityMailboxes.length,
368
+ AgentUtilityMailboxSummaries: CapCommunicationList(c.AgentUtilityMailboxes.map(m => `${m.IdentityValue} · ${m.Agent || 'Unassigned'} · ${m.User ? ('Dedicated: ' + m.User) : 'Shared'}`)),
364
369
  SelectedItemId: this.selectedProvider?.id ?? null,
365
370
  SelectedItemName: this.selectedProvider?.name ?? null,
366
371
  };
@@ -1 +1 @@
1
- {"version":3,"file":"communication-dashboard.component.js","sourceRoot":"","sources":["../../src/Communication/communication-dashboard.component.ts","../../src/Communication/communication-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport {\n BuildCommunicationAgentContext,\n IsValidCommunicationTab,\n CommunicationTabLabel,\n ResolveCommunicationItem,\n CapCommunicationList,\n COMMUNICATION_TABS,\n COMMUNICATION_LOG_STATUSES,\n CommunicationTab,\n CommunicationLogStatus,\n CommunicationSurfaceContext,\n CommunicationItemCandidate,\n} from './communication-agent-context';\nimport { ValidateEnumParam, ValidateStringParam } from '../shared/agent-tool-validation';\nimport { CommunicationLogsResourceComponent } from './communication-logs-resource.component';\nimport { CommunicationProvidersResourceComponent } from './communication-providers-resource.component';\nimport { CommunicationTemplatesResourceComponent } from './communication-templates-resource.component';\nimport { CommunicationRunsResourceComponent } from './communication-runs-resource.component';\nimport { CommunicationMonitorResourceComponent } from './communication-monitor-resource.component';\n\ninterface CommunicationDashboardState {\n activeTab: string;\n}\n\n/** Tolerant result shape returned by this dashboard's agent client-tool handlers. */\ninterface CommunicationToolResult {\n Success: boolean;\n ErrorMessage?: string;\n}\n\n/** The tool-definition shape NavigationService.SetAgentClientTools accepts. */\ninterface CommunicationAgentTool {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/** A per-surface tracked selection (id + display name), set by the agent's select tools. */\ninterface SelectedCommunicationItem {\n id: string;\n name: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-communication-dashboard',\n templateUrl: './communication-dashboard.component.html',\n styleUrls: ['./communication-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'CommunicationDashboard')\nexport class CommunicationDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public isLoading = false;\n public IsRefreshing = false;\n\n /** @deprecated Use {@link IsRefreshing}. */\n public get isRefreshing() {\n return this.IsRefreshing;\n }\n /** @deprecated Use {@link IsRefreshing}. */\n public set isRefreshing(value) {\n this.IsRefreshing = value;\n }\n public ActiveTab = 'monitor';\n\n /** @deprecated Use {@link ActiveTab}. */\n public get activeTab() {\n return this.ActiveTab;\n }\n /** @deprecated Use {@link ActiveTab}. */\n public set activeTab(value) {\n this.ActiveTab = value;\n }\n public SelectedIndex = 0;\n\n /** @deprecated Use {@link SelectedIndex}. */\n public get selectedIndex() {\n return this.SelectedIndex;\n }\n /** @deprecated Use {@link SelectedIndex}. */\n public set selectedIndex(value) {\n this.SelectedIndex = value;\n }\n\n private visitedTabs = new Set<string>();\n public NavigationItems: string[] = [...COMMUNICATION_TABS];\n\n /** @deprecated Use {@link NavigationItems}. */\n public get navigationItems(): string[] {\n return this.NavigationItems;\n }\n /** @deprecated Use {@link NavigationItems}. */\n public set navigationItems(value: string[]) {\n this.NavigationItems = value;\n }\n\n private stateChangeSubject = new Subject<CommunicationDashboardState>();\n\n // Per-surface agent selection. The agent's SelectLog / SelectProvider / SelectTemplate /\n // SelectRun tools record what was last picked so the context can report it by id+name\n // (and the Open* tools can act on it). Read-only — selecting never mutates anything.\n private selectedLog: SelectedCommunicationItem | null = null;\n private selectedProvider: SelectedCommunicationItem | null = null;\n private selectedTemplate: SelectedCommunicationItem | null = null;\n private selectedRun: SelectedCommunicationItem | null = null;\n\n // Child resource components are mounted lazily (only after their tab is first\n // visited) and live inside @if blocks, so these queries resolve to a ref only\n // while their tab is the active, mounted one. They are read defensively — a null\n // ref simply means that surface's state isn't available yet.\n @ViewChild(CommunicationLogsResourceComponent) private logsChild?: CommunicationLogsResourceComponent;\n @ViewChild(CommunicationProvidersResourceComponent) private providersChild?: CommunicationProvidersResourceComponent;\n @ViewChild(CommunicationTemplatesResourceComponent) private templatesChild?: CommunicationTemplatesResourceComponent;\n @ViewChild(CommunicationRunsResourceComponent) private runsChild?: CommunicationRunsResourceComponent;\n @ViewChild(CommunicationMonitorResourceComponent) private monitorChild?: CommunicationMonitorResourceComponent;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n this.setupStateManagement();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Communications\";\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.ActiveTab);\n this.emitStateChange();\n // Wire the agent context + client tools (see SAFETY BOUNDARY below).\n this.registerAgentClientTools();\n this.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.stateChangeSubject.complete();\n }\n\n public OnTabChange(tabId: string): void {\n this.ActiveTab = tabId;\n const index = this.NavigationItems.indexOf(tabId);\n this.SelectedIndex = index >= 0 ? index : 0;\n\n setTimeout(() => {\n SharedService.Instance.InvokeManualResize();\n // The newly-mounted child has had a tick to load; re-publish so its\n // deep state reaches the agent and re-scope the tool set to the new tab.\n this.publishAgentContext();\n }, 100);\n\n this.visitedTabs.add(tabId);\n this.emitStateChange();\n // Immediate re-emit reflects the tab switch even before the child loads.\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnTabChange}. */\n public onTabChange(tabId: string): void {\n return this.OnTabChange(tabId);\n }\n\n public HasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n /** @deprecated Use {@link HasVisited}. */\n public hasVisited(tabId: string): boolean {\n return this.HasVisited(tabId);\n }\n\n public OnRefresh(): void {\n this.IsRefreshing = true;\n this.cdr.markForCheck();\n this.publishAgentContext();\n setTimeout(() => {\n this.IsRefreshing = false;\n this.cdr.markForCheck();\n this.publishAgentContext();\n }, 1000);\n }\n\n /** @deprecated Use {@link OnRefresh}. */\n public onRefresh(): void {\n return this.OnRefresh();\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n const state: CommunicationDashboardState = {\n activeTab: this.ActiveTab\n };\n this.stateChangeSubject.next(state);\n }\n\n public LoadUserState(state: Partial<CommunicationDashboardState>): void {\n if (state.activeTab) {\n this.ActiveTab = state.activeTab;\n const index = this.NavigationItems.indexOf(state.activeTab);\n this.SelectedIndex = index >= 0 ? index : 0;\n this.visitedTabs.add(state.activeTab);\n }\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link LoadUserState}. */\n public loadUserState(state: Partial<CommunicationDashboardState>): void {\n return this.LoadUserState(state);\n }\n\n initDashboard(): void {\n try {\n this.isLoading = true;\n } catch (error) {\n console.error('Error initializing Communication dashboard:', error);\n this.Error.emit(new Error('Failed to initialize Communication dashboard. Please try again.'));\n } finally {\n this.isLoading = false;\n }\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n setTimeout(() => {\n if (this.Config?.userState) {\n this.LoadUserState(this.Config.userState);\n }\n }, 0);\n }\n this.NotifyLoadComplete();\n }\n\n public GetCurrentTabLabel(): string {\n return CommunicationTabLabel(this.ActiveTab);\n }\n\n /** @deprecated Use {@link GetCurrentTabLabel}. */\n public getCurrentTabLabel(): string {\n return this.GetCurrentTabLabel();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // 🚨 SAFETY BOUNDARY — NAVIGATIONAL + READ-ONLY-DISPLAY ONLY 🚨\n // The Communication dashboard sends real messages and manages providers and\n // templates. The agent context and client tools registered here are strictly\n // READ / FILTER / SEARCH / SELECT / NAVIGATE: tab switches, a refresh of\n // already-visible data, status/category filters + free-text search on the\n // (read-only) lists, selecting a visible row by id/name, and opening a\n // template / provider / log / run record in a tab.\n //\n // The following side-effecting operations that exist on this surface (in the\n // child resource components) are DELIBERATELY NOT exposed to the agent:\n // - Sending / composing messages (onSend / new-message resource) — irreversible\n // outbound side effect.\n // - Creating / editing / deleting templates or providers — config mutation.\n // - Any test-send / \"send sample\" action.\n // Context exposes only aggregate counts, the active filters/search, and the\n // salient DISPLAY names of visible rows — never message bodies, recipient lists,\n // provider credentials, or template content.\n // ================================================================\n\n /**\n * Publish the current Communication dashboard state to the AI agent via\n * NavigationService, then re-scope the tool set to the active tab. Re-invoked on\n * every meaningful state change (tab switch, refresh start/end, agent filter/select\n * action, and a tick after a tab mounts) so the agent always sees a fresh, read-only\n * snapshot. Only the ACTIVE surface's deep state is harvested — context is mode-scoped\n * to whatever tab is open, mirroring the Data Explorer pattern.\n */\n private publishAgentContext(): void {\n const context = BuildCommunicationAgentContext({\n ActiveTab: IsValidCommunicationTab(this.ActiveTab) ? this.ActiveTab : 'monitor',\n ActiveTabLabel: this.GetCurrentTabLabel(),\n VisitedTabs: Array.from(this.visitedTabs),\n IsRefreshing: this.IsRefreshing,\n Surface: this.harvestActiveSurface(),\n });\n this.navigationService.SetAgentContext(this, context);\n this.syncAgentToolsForMode();\n }\n\n /**\n * Harvest the deep, per-surface state slice for the ACTIVE tab from whichever child\n * resource component is mounted. Returns `{ Surface: 'none' }` when the active tab's\n * child isn't available (settings tab, or a tab restored from saved state whose\n * content hasn't loaded yet) — so context truthfully reports \"not loaded\" rather than\n * fabricating zeros.\n */\n private harvestActiveSurface(): CommunicationSurfaceContext {\n switch (this.ActiveTab) {\n case 'monitor':\n return this.harvestMonitorSurface();\n case 'logs':\n return this.harvestLogsSurface();\n case 'providers':\n return this.harvestProvidersSurface();\n case 'templates':\n return this.harvestTemplatesSurface();\n case 'runs':\n return this.harvestRunsSurface();\n default:\n return { Surface: 'none' };\n }\n }\n\n private harvestMonitorSurface(): CommunicationSurfaceContext {\n const c = this.monitorChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'monitor',\n TotalSent: c.stats.totalSent,\n DeliveryRate: c.stats.deliveryRate,\n Pending: c.stats.pending,\n Failed: c.stats.failed,\n ProviderHealthNames: CapCommunicationList(c.providerHealth.map(p => p.Name)),\n ProviderHealthCount: c.providerHealth.length,\n ChannelNames: c.channelBreakdown.map(ch => ch.Name),\n RecentActivityNames: CapCommunicationList(\n c.recentLogs.map(l => `${l.CommunicationProviderMessageType || 'Message'} · ${l.CommunicationProvider || 'Unknown'} · ${l.Status}`),\n ),\n };\n }\n\n private harvestLogsSurface(): CommunicationSurfaceContext {\n const c = this.logsChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'logs',\n LogCount: c.logs.length,\n FilteredLogCount: c.filteredLogs.length,\n StatusFilter: c.statusFilter as CommunicationLogStatus,\n SearchText: c.SearchText,\n VisibleLogSummaries: CapCommunicationList(c.filteredLogs.map(l => this.logDisplayName(l))),\n SelectedItemId: this.selectedLog?.id ?? null,\n SelectedItemName: this.selectedLog?.name ?? null,\n };\n }\n\n private harvestProvidersSurface(): CommunicationSurfaceContext {\n const c = this.providersChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'providers',\n ProviderCount: c.providerCards.length,\n ActiveProviderCount: c.providerCards.filter(p => p.Entity.Status === 'Active').length,\n ProviderNames: CapCommunicationList(c.providerCards.map(p => p.Entity.Name)),\n SelectedItemId: this.selectedProvider?.id ?? null,\n SelectedItemName: this.selectedProvider?.name ?? null,\n };\n }\n\n private harvestTemplatesSurface(): CommunicationSurfaceContext {\n const c = this.templatesChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'templates',\n TemplateCount: c.allTemplates.length,\n FilteredTemplateCount: c.filteredTemplates.length,\n CategoryFilter: c.categoryFilter,\n SearchText: c.SearchText,\n AvailableCategories: CapCommunicationList(c.categories),\n VisibleTemplateNames: CapCommunicationList(c.filteredTemplates.map(t => t.Entity.Name)),\n SelectedItemId: this.selectedTemplate?.id ?? null,\n SelectedItemName: this.selectedTemplate?.name ?? null,\n };\n }\n\n private harvestRunsSurface(): CommunicationSurfaceContext {\n const c = this.runsChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'runs',\n RunCount: c.runs.length,\n ActiveRunCount: c.summary.active,\n CompletedRunCount: c.summary.completed,\n SuccessRate: c.summary.successRate,\n VisibleRunSummaries: CapCommunicationList(c.runs.map(r => `${this.runDisplayName(r.ID)} · ${r.Status}`)),\n SelectedItemId: this.selectedRun?.id ?? null,\n SelectedItemName: this.selectedRun?.name ?? null,\n };\n }\n\n /** The display label the runs timeline shows for a run (\"Run #<short-id>\"). */\n private runDisplayName(id: string): string {\n return `Run #${(id || '').substring(0, 8)}`;\n }\n\n /**\n * The on-screen display summary for a log row (\"<provider> · <type> · <status>\"),\n * used both for context publishing and for name-based resolution by the agent's\n * Select/Open log tools — so the agent can refer to a row exactly as it's described\n * in context.\n */\n private logDisplayName(log: { CommunicationProvider?: string; CommunicationProviderMessageType?: string; Status: string }): string {\n return `${log.CommunicationProvider || 'Unknown'} · ${log.CommunicationProviderMessageType || 'Message'} · ${log.Status}`;\n }\n\n /** id+name candidates for the visible (filtered) log rows. Empty when the Logs tab isn't mounted. */\n private logCandidates(): CommunicationItemCandidate[] {\n return (this.logsChild?.filteredLogs ?? []).map(l => ({ ID: l.ID, Name: this.logDisplayName(l) }));\n }\n\n // -- Mode-scoped client tools -------------------------------------------------\n\n /**\n * Tracks which tool set was last registered, so the mode-scoped re-registration\n * ({@link syncAgentToolsForMode}) only fires on a tab transition rather than on\n * every state change.\n */\n private lastRegisteredToolMode: CommunicationTab | null = null;\n\n /**\n * Re-scope the agent's client tools to the ACTIVE tab. Each surface exposes a\n * different set of affordances (logs filter by status + search + select/open a log;\n * templates filter by category + search + select/open a template; providers select/\n * open a provider; runs select/open a run; monitor is read-only), so a logs-only tool\n * is never exposed while the Providers tab is open and vice-versa. The COMMON tools\n * (switch tab, refresh) are always present. Because {@link publishAgentContext} fires\n * on every state change but the tool set only changes on the tab flip, this guards on\n * {@link lastRegisteredToolMode} and only calls into NavigationService when the active\n * tab actually changes.\n */\n private syncAgentToolsForMode(): void {\n const mode = IsValidCommunicationTab(this.ActiveTab) ? this.ActiveTab : 'monitor';\n if (mode === this.lastRegisteredToolMode) {\n return;\n }\n this.lastRegisteredToolMode = mode;\n this.navigationService.SetAgentClientTools(this, [\n ...this.buildCommonTools(),\n ...this.buildSurfaceTools(mode),\n ]);\n }\n\n /**\n * Register the navigational / read-only client tools the agent may invoke. Called\n * once on mount; {@link syncAgentToolsForMode} re-registers the surface-scoped slice\n * on every tab change. See the SAFETY BOUNDARY comment above for the operations\n * intentionally NOT exposed.\n */\n private registerAgentClientTools(): void {\n this.lastRegisteredToolMode = null;\n this.syncAgentToolsForMode();\n }\n\n private buildAgentTool(\n name: string,\n description: string,\n parameterSchema: Record<string, unknown>,\n handler: (params: Record<string, unknown>) => Promise<unknown>,\n ): CommunicationAgentTool {\n return { Name: name, Description: description, ParameterSchema: parameterSchema, Handler: handler };\n }\n\n /** COMMON tools — available on EVERY tab (switch tab + refresh). */\n private buildCommonTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'SwitchCommunicationTab',\n 'Switch the active Communication dashboard tab. Valid tabs: monitor, logs, providers, templates, runs, settings.',\n {\n type: 'object',\n properties: { tab: { type: 'string', enum: [...COMMUNICATION_TABS] } },\n required: ['tab'],\n },\n async (params) => this.handleSwitchTabTool(params),\n ),\n this.buildAgentTool(\n 'RefreshCommunicationData',\n 'Refresh the currently-displayed Communication data. Read-only — re-loads existing data, sends nothing.',\n { type: 'object', properties: {} },\n async () => {\n this.OnRefresh();\n return { Success: true };\n },\n ),\n ];\n }\n\n /** The surface-scoped tool slice for the active tab. */\n private buildSurfaceTools(mode: CommunicationTab): CommunicationAgentTool[] {\n switch (mode) {\n case 'logs':\n return this.buildLogsTools();\n case 'providers':\n return this.buildProvidersTools();\n case 'templates':\n return this.buildTemplatesTools();\n case 'runs':\n return this.buildRunsTools();\n case 'monitor':\n case 'settings':\n default:\n return [];\n }\n }\n\n private buildLogsTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'FilterLogsBy',\n \"Filter the message-log list by delivery status. Valid statuses: Complete, Failed, Pending, or '' to clear.\",\n {\n type: 'object',\n properties: { status: { type: 'string', enum: [...COMMUNICATION_LOG_STATUSES] } },\n required: ['status'],\n },\n async (params) => this.handleFilterLogsTool(params),\n ),\n this.buildAgentTool(\n 'SearchLogs',\n 'Type into the log-list search box to filter logs by provider, message type, status, or error text.',\n { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n async (params) => this.handleSearchLogsTool(params),\n ),\n this.buildAgentTool(\n 'SelectLog',\n 'Select a visible message-log row by its id or a display value (provider / message type / status). Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { log: { type: 'string' } }, required: ['log'] },\n async (params) => this.handleSelectLogTool(params),\n ),\n this.buildAgentTool(\n 'OpenLog',\n 'Open a message-log record in a tab by id or display value. Defaults to the currently-selected log when no argument is given. Read-only navigation.',\n { type: 'object', properties: { log: { type: 'string' } } },\n async (params) => this.handleOpenLogTool(params),\n ),\n ];\n }\n\n private buildProvidersTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'SelectProvider',\n 'Select a configured provider card by its name or id. Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { provider: { type: 'string' } }, required: ['provider'] },\n async (params) => this.handleSelectProviderTool(params),\n ),\n this.buildAgentTool(\n 'OpenProvider',\n 'Open a provider record in a tab by name or id. Defaults to the currently-selected provider when no argument is given. Read-only navigation — does NOT edit the provider.',\n { type: 'object', properties: { provider: { type: 'string' } } },\n async (params) => this.handleOpenProviderTool(params),\n ),\n ];\n }\n\n private buildTemplatesTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'FilterTemplatesByCategory',\n \"Filter the template list by category, or pass '' to clear the filter.\",\n { type: 'object', properties: { category: { type: 'string' } }, required: ['category'] },\n async (params) => this.handleFilterTemplatesTool(params),\n ),\n this.buildAgentTool(\n 'SearchTemplates',\n 'Type into the template-list search box to filter templates by name, description, or category.',\n { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n async (params) => this.handleSearchTemplatesTool(params),\n ),\n this.buildAgentTool(\n 'SelectTemplate',\n 'Select a visible template by its name or id. Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { template: { type: 'string' } }, required: ['template'] },\n async (params) => this.handleSelectTemplateTool(params),\n ),\n this.buildAgentTool(\n 'OpenTemplate',\n 'Open a template record in a tab by name or id. Defaults to the currently-selected template when no argument is given. Read-only navigation — does NOT edit the template.',\n { type: 'object', properties: { template: { type: 'string' } } },\n async (params) => this.handleOpenTemplateTool(params),\n ),\n ];\n }\n\n private buildRunsTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'SelectRun',\n 'Select a visible bulk-run by its id or display label (\"Run #<short-id>\"). Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { run: { type: 'string' } }, required: ['run'] },\n async (params) => this.handleSelectRunTool(params),\n ),\n this.buildAgentTool(\n 'OpenRun',\n 'Open a bulk communication-run record in a tab by id or display label. Defaults to the currently-selected run when no argument is given. Read-only navigation.',\n { type: 'object', properties: { run: { type: 'string' } } },\n async (params) => this.handleOpenRunTool(params),\n ),\n ];\n }\n\n // -- Tolerant tool handlers ---------------------------------------------------\n\n private handleSwitchTabTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateEnumParam(params?.['tab'], this.NavigationItems as readonly string[], 'tab');\n if (!v.ok) {\n return v.result;\n }\n this.OnTabChange(v.value);\n return { Success: true };\n }\n\n private handleFilterLogsTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateEnumParam(params?.['status'], COMMUNICATION_LOG_STATUSES, 'status');\n if (!v.ok) {\n return v.result;\n }\n if (!this.logsChild) {\n return { Success: false, ErrorMessage: 'The Logs tab is not open. Switch to the Logs tab before filtering logs.' };\n }\n this.logsChild.onStatusFilter(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSearchLogsTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['query'], 'query');\n if (!v.ok) {\n return v.result;\n }\n if (!this.logsChild) {\n return { Success: false, ErrorMessage: 'The Logs tab is not open. Switch to the Logs tab before searching logs.' };\n }\n this.logsChild.onSearchValue(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSelectLogTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['log'], 'log');\n if (!v.ok) {\n return v.result;\n }\n if (!this.logsChild) {\n return { Success: false, ErrorMessage: 'The Logs tab is not open. Switch to the Logs tab first.' };\n }\n const match = ResolveCommunicationItem(v.value, this.logCandidates());\n if (!match) {\n return { Success: false, ErrorMessage: `No visible log matches \"${v.value}\".` };\n }\n this.selectedLog = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenLogTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['log'] === 'string' ? (params['log'] as string) : '';\n if (ref && this.logsChild) {\n const match = ResolveCommunicationItem(ref, this.logCandidates());\n if (match) {\n this.selectedLog = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedLog) {\n return { Success: false, ErrorMessage: 'No log to open. Select a log first or pass an id / display value.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Communication Logs', CompositeKey.FromID(this.selectedLog.id));\n return { Success: true };\n }\n\n private handleSelectProviderTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['provider'], 'provider');\n if (!v.ok) {\n return v.result;\n }\n if (!this.providersChild) {\n return { Success: false, ErrorMessage: 'The Providers tab is not open. Switch to the Providers tab first.' };\n }\n const candidates: CommunicationItemCandidate[] = this.providersChild.providerCards.map(p => ({ ID: p.Entity.ID, Name: p.Entity.Name }));\n const match = ResolveCommunicationItem(v.value, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: `No provider matches \"${v.value}\".` };\n }\n this.selectedProvider = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenProviderTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['provider'] === 'string' ? (params['provider'] as string) : '';\n if (ref && this.providersChild) {\n const candidates: CommunicationItemCandidate[] = this.providersChild.providerCards.map(p => ({ ID: p.Entity.ID, Name: p.Entity.Name }));\n const match = ResolveCommunicationItem(ref, candidates);\n if (match) {\n this.selectedProvider = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedProvider) {\n return { Success: false, ErrorMessage: 'No provider to open. Select a provider first or pass a name / id.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Communication Providers', CompositeKey.FromID(this.selectedProvider.id));\n return { Success: true };\n }\n\n private handleFilterTemplatesTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['category'], 'category');\n if (!v.ok) {\n return v.result;\n }\n if (!this.templatesChild) {\n return { Success: false, ErrorMessage: 'The Templates tab is not open. Switch to the Templates tab first.' };\n }\n this.templatesChild.onCategoryFilter(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSearchTemplatesTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['query'], 'query');\n if (!v.ok) {\n return v.result;\n }\n if (!this.templatesChild) {\n return { Success: false, ErrorMessage: 'The Templates tab is not open. Switch to the Templates tab first.' };\n }\n this.templatesChild.onSearchValue(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSelectTemplateTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['template'], 'template');\n if (!v.ok) {\n return v.result;\n }\n if (!this.templatesChild) {\n return { Success: false, ErrorMessage: 'The Templates tab is not open. Switch to the Templates tab first.' };\n }\n const candidates: CommunicationItemCandidate[] = this.templatesChild.filteredTemplates.map(t => ({ ID: t.Entity.ID, Name: t.Entity.Name }));\n const match = ResolveCommunicationItem(v.value, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: `No visible template matches \"${v.value}\".` };\n }\n this.selectedTemplate = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenTemplateTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['template'] === 'string' ? (params['template'] as string) : '';\n if (ref && this.templatesChild) {\n const candidates: CommunicationItemCandidate[] = this.templatesChild.filteredTemplates.map(t => ({ ID: t.Entity.ID, Name: t.Entity.Name }));\n const match = ResolveCommunicationItem(ref, candidates);\n if (match) {\n this.selectedTemplate = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedTemplate) {\n return { Success: false, ErrorMessage: 'No template to open. Select a template first or pass a name / id.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Templates', CompositeKey.FromID(this.selectedTemplate.id));\n return { Success: true };\n }\n\n private handleSelectRunTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['run'], 'run');\n if (!v.ok) {\n return v.result;\n }\n if (!this.runsChild) {\n return { Success: false, ErrorMessage: 'The Runs tab is not open. Switch to the Runs tab first.' };\n }\n const candidates: CommunicationItemCandidate[] = this.runsChild.runs.map(r => ({ ID: r.ID, Name: this.runDisplayName(r.ID) }));\n const match = ResolveCommunicationItem(v.value, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: `No visible run matches \"${v.value}\".` };\n }\n this.selectedRun = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenRunTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['run'] === 'string' ? (params['run'] as string) : '';\n if (ref && this.runsChild) {\n const candidates: CommunicationItemCandidate[] = this.runsChild.runs.map(r => ({ ID: r.ID, Name: this.runDisplayName(r.ID) }));\n const match = ResolveCommunicationItem(ref, candidates);\n if (match) {\n this.selectedRun = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedRun) {\n return { Success: false, ErrorMessage: 'No run to open. Select a run first or pass an id / display label.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Communication Runs', CompositeKey.FromID(this.selectedRun.id));\n return { Success: true };\n }\n}\n","<div class=\"communication-dashboard-container\">\n <!-- TOOLBAR -->\n <div class=\"studio-toolbar\">\n <div class=\"toolbar-brand\">\n <div class=\"brand-icon\"><i class=\"fa-solid fa-satellite-dish\"></i></div>\n <span class=\"brand-label\">Communications</span>\n </div>\n <div class=\"toolbar-divider\"></div>\n <div class=\"toolbar-spacer\"></div>\n <button class=\"tb-btn\" (click)=\"onRefresh()\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isRefreshing\"></i> Refresh\n </button>\n </div>\n\n <!-- BODY -->\n <div class=\"dashboard-body\">\n <!-- SIDEBAR -->\n <div class=\"sidebar\">\n <div class=\"sidebar-section-label\">Dashboard</div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'monitor'\"\n (click)=\"onTabChange('monitor')\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <span>Monitor</span>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'logs'\"\n (click)=\"onTabChange('logs')\">\n <i class=\"fa-solid fa-list-ul\"></i>\n <span>Message Logs</span>\n </div>\n\n <div class=\"sidebar-section-label\">Configuration</div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'providers'\"\n (click)=\"onTabChange('providers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span>Providers</span>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'templates'\"\n (click)=\"onTabChange('templates')\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span>Templates</span>\n </div>\n\n <div class=\"sidebar-section-label\">Operations</div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'runs'\"\n (click)=\"onTabChange('runs')\">\n <i class=\"fa-solid fa-play-circle\"></i>\n <span>Bulk Runs</span>\n </div>\n\n <div class=\"sidebar-footer\">\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'settings'\"\n (click)=\"onTabChange('settings')\">\n <i class=\"fa-solid fa-gear\"></i>\n <span>Settings</span>\n </div>\n </div>\n </div>\n\n <!-- MAIN CONTENT -->\n <div class=\"main-content\">\n <div class=\"tab-container\">\n @switch (activeTab) {\n @case ('monitor') {\n <div class=\"tab-content\">\n @if (hasVisited('monitor')) {\n <mj-communication-monitor-resource></mj-communication-monitor-resource>\n }\n </div>\n }\n @case ('logs') {\n <div class=\"tab-content\">\n @if (hasVisited('logs')) {\n <mj-communication-logs-resource></mj-communication-logs-resource>\n }\n </div>\n }\n @case ('providers') {\n <div class=\"tab-content\">\n @if (hasVisited('providers')) {\n <mj-communication-providers-resource></mj-communication-providers-resource>\n }\n </div>\n }\n @case ('templates') {\n <div class=\"tab-content\">\n @if (hasVisited('templates')) {\n <mj-communication-templates-resource></mj-communication-templates-resource>\n }\n </div>\n }\n @case ('runs') {\n <div class=\"tab-content\">\n @if (hasVisited('runs')) {\n <mj-communication-runs-resource></mj-communication-runs-resource>\n }\n </div>\n }\n }\n </div>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"communication-dashboard.component.js","sourceRoot":"","sources":["../../src/Communication/communication-dashboard.component.ts","../../src/Communication/communication-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport {\n BuildCommunicationAgentContext,\n IsValidCommunicationTab,\n CommunicationTabLabel,\n ResolveCommunicationItem,\n CapCommunicationList,\n COMMUNICATION_TABS,\n COMMUNICATION_LOG_STATUSES,\n CommunicationTab,\n CommunicationLogStatus,\n CommunicationSurfaceContext,\n CommunicationItemCandidate,\n} from './communication-agent-context';\nimport { ValidateEnumParam, ValidateStringParam } from '../shared/agent-tool-validation';\nimport { CommunicationLogsResourceComponent } from './communication-logs-resource.component';\nimport { CommunicationProvidersResourceComponent } from './communication-providers-resource.component';\nimport { CommunicationTemplatesResourceComponent } from './communication-templates-resource.component';\nimport { CommunicationRunsResourceComponent } from './communication-runs-resource.component';\nimport { CommunicationMonitorResourceComponent } from './communication-monitor-resource.component';\n\ninterface CommunicationDashboardState {\n activeTab: string;\n}\n\n/** Tolerant result shape returned by this dashboard's agent client-tool handlers. */\ninterface CommunicationToolResult {\n Success: boolean;\n ErrorMessage?: string;\n}\n\n/** The tool-definition shape NavigationService.SetAgentClientTools accepts. */\ninterface CommunicationAgentTool {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/** A per-surface tracked selection (id + display name), set by the agent's select tools. */\ninterface SelectedCommunicationItem {\n id: string;\n name: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-communication-dashboard',\n templateUrl: './communication-dashboard.component.html',\n styleUrls: ['./communication-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'CommunicationDashboard')\nexport class CommunicationDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public isLoading = false;\n public IsRefreshing = false;\n\n /** @deprecated Use {@link IsRefreshing}. */\n public get isRefreshing() {\n return this.IsRefreshing;\n }\n /** @deprecated Use {@link IsRefreshing}. */\n public set isRefreshing(value) {\n this.IsRefreshing = value;\n }\n public ActiveTab = 'monitor';\n\n /** @deprecated Use {@link ActiveTab}. */\n public get activeTab() {\n return this.ActiveTab;\n }\n /** @deprecated Use {@link ActiveTab}. */\n public set activeTab(value) {\n this.ActiveTab = value;\n }\n public SelectedIndex = 0;\n\n /** @deprecated Use {@link SelectedIndex}. */\n public get selectedIndex() {\n return this.SelectedIndex;\n }\n /** @deprecated Use {@link SelectedIndex}. */\n public set selectedIndex(value) {\n this.SelectedIndex = value;\n }\n\n private visitedTabs = new Set<string>();\n public NavigationItems: string[] = [...COMMUNICATION_TABS];\n\n /** @deprecated Use {@link NavigationItems}. */\n public get navigationItems(): string[] {\n return this.NavigationItems;\n }\n /** @deprecated Use {@link NavigationItems}. */\n public set navigationItems(value: string[]) {\n this.NavigationItems = value;\n }\n\n private stateChangeSubject = new Subject<CommunicationDashboardState>();\n\n // Per-surface agent selection. The agent's SelectLog / SelectProvider / SelectTemplate /\n // SelectRun tools record what was last picked so the context can report it by id+name\n // (and the Open* tools can act on it). Read-only — selecting never mutates anything.\n private selectedLog: SelectedCommunicationItem | null = null;\n private selectedProvider: SelectedCommunicationItem | null = null;\n private selectedTemplate: SelectedCommunicationItem | null = null;\n private selectedRun: SelectedCommunicationItem | null = null;\n\n // Child resource components are mounted lazily (only after their tab is first\n // visited) and live inside @if blocks, so these queries resolve to a ref only\n // while their tab is the active, mounted one. They are read defensively — a null\n // ref simply means that surface's state isn't available yet.\n @ViewChild(CommunicationLogsResourceComponent) private logsChild?: CommunicationLogsResourceComponent;\n @ViewChild(CommunicationProvidersResourceComponent) private providersChild?: CommunicationProvidersResourceComponent;\n @ViewChild(CommunicationTemplatesResourceComponent) private templatesChild?: CommunicationTemplatesResourceComponent;\n @ViewChild(CommunicationRunsResourceComponent) private runsChild?: CommunicationRunsResourceComponent;\n @ViewChild(CommunicationMonitorResourceComponent) private monitorChild?: CommunicationMonitorResourceComponent;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n this.setupStateManagement();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Communications\";\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.ActiveTab);\n this.emitStateChange();\n // Wire the agent context + client tools (see SAFETY BOUNDARY below).\n this.registerAgentClientTools();\n this.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.stateChangeSubject.complete();\n }\n\n public OnTabChange(tabId: string): void {\n this.ActiveTab = tabId;\n const index = this.NavigationItems.indexOf(tabId);\n this.SelectedIndex = index >= 0 ? index : 0;\n\n setTimeout(() => {\n SharedService.Instance.InvokeManualResize();\n // The newly-mounted child has had a tick to load; re-publish so its\n // deep state reaches the agent and re-scope the tool set to the new tab.\n this.publishAgentContext();\n }, 100);\n\n this.visitedTabs.add(tabId);\n this.emitStateChange();\n // Immediate re-emit reflects the tab switch even before the child loads.\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnTabChange}. */\n public onTabChange(tabId: string): void {\n return this.OnTabChange(tabId);\n }\n\n public HasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n /** @deprecated Use {@link HasVisited}. */\n public hasVisited(tabId: string): boolean {\n return this.HasVisited(tabId);\n }\n\n public OnRefresh(): void {\n this.IsRefreshing = true;\n this.cdr.markForCheck();\n this.publishAgentContext();\n setTimeout(() => {\n this.IsRefreshing = false;\n this.cdr.markForCheck();\n this.publishAgentContext();\n }, 1000);\n }\n\n /** @deprecated Use {@link OnRefresh}. */\n public onRefresh(): void {\n return this.OnRefresh();\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n const state: CommunicationDashboardState = {\n activeTab: this.ActiveTab\n };\n this.stateChangeSubject.next(state);\n }\n\n public LoadUserState(state: Partial<CommunicationDashboardState>): void {\n if (state.activeTab) {\n this.ActiveTab = state.activeTab;\n const index = this.NavigationItems.indexOf(state.activeTab);\n this.SelectedIndex = index >= 0 ? index : 0;\n this.visitedTabs.add(state.activeTab);\n }\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link LoadUserState}. */\n public loadUserState(state: Partial<CommunicationDashboardState>): void {\n return this.LoadUserState(state);\n }\n\n initDashboard(): void {\n try {\n this.isLoading = true;\n } catch (error) {\n console.error('Error initializing Communication dashboard:', error);\n this.Error.emit(new Error('Failed to initialize Communication dashboard. Please try again.'));\n } finally {\n this.isLoading = false;\n }\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n setTimeout(() => {\n if (this.Config?.userState) {\n this.LoadUserState(this.Config.userState);\n }\n }, 0);\n }\n this.NotifyLoadComplete();\n }\n\n public GetCurrentTabLabel(): string {\n return CommunicationTabLabel(this.ActiveTab);\n }\n\n /** @deprecated Use {@link GetCurrentTabLabel}. */\n public getCurrentTabLabel(): string {\n return this.GetCurrentTabLabel();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // 🚨 SAFETY BOUNDARY — NAVIGATIONAL + READ-ONLY-DISPLAY ONLY 🚨\n // The Communication dashboard sends real messages and manages providers and\n // templates. The agent context and client tools registered here are strictly\n // READ / FILTER / SEARCH / SELECT / NAVIGATE: tab switches, a refresh of\n // already-visible data, status/category filters + free-text search on the\n // (read-only) lists, selecting a visible row by id/name, and opening a\n // template / provider / log / run record in a tab.\n //\n // The following side-effecting operations that exist on this surface (in the\n // child resource components) are DELIBERATELY NOT exposed to the agent:\n // - Sending / composing messages (onSend / new-message resource) — irreversible\n // outbound side effect.\n // - Creating / editing / deleting templates or providers — config mutation.\n // - Any test-send / \"send sample\" action.\n // Context exposes only aggregate counts, the active filters/search, and the\n // salient DISPLAY names of visible rows — never message bodies, recipient lists,\n // provider credentials, or template content.\n // ================================================================\n\n /**\n * Publish the current Communication dashboard state to the AI agent via\n * NavigationService, then re-scope the tool set to the active tab. Re-invoked on\n * every meaningful state change (tab switch, refresh start/end, agent filter/select\n * action, and a tick after a tab mounts) so the agent always sees a fresh, read-only\n * snapshot. Only the ACTIVE surface's deep state is harvested — context is mode-scoped\n * to whatever tab is open, mirroring the Data Explorer pattern.\n */\n private publishAgentContext(): void {\n const context = BuildCommunicationAgentContext({\n ActiveTab: IsValidCommunicationTab(this.ActiveTab) ? this.ActiveTab : 'monitor',\n ActiveTabLabel: this.GetCurrentTabLabel(),\n VisitedTabs: Array.from(this.visitedTabs),\n IsRefreshing: this.IsRefreshing,\n Surface: this.harvestActiveSurface(),\n });\n this.navigationService.SetAgentContext(this, context);\n this.syncAgentToolsForMode();\n }\n\n /**\n * Harvest the deep, per-surface state slice for the ACTIVE tab from whichever child\n * resource component is mounted. Returns `{ Surface: 'none' }` when the active tab's\n * child isn't available (settings tab, or a tab restored from saved state whose\n * content hasn't loaded yet) — so context truthfully reports \"not loaded\" rather than\n * fabricating zeros.\n */\n private harvestActiveSurface(): CommunicationSurfaceContext {\n switch (this.ActiveTab) {\n case 'monitor':\n return this.harvestMonitorSurface();\n case 'logs':\n return this.harvestLogsSurface();\n case 'providers':\n return this.harvestProvidersSurface();\n case 'templates':\n return this.harvestTemplatesSurface();\n case 'runs':\n return this.harvestRunsSurface();\n default:\n return { Surface: 'none' };\n }\n }\n\n private harvestMonitorSurface(): CommunicationSurfaceContext {\n const c = this.monitorChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'monitor',\n TotalSent: c.stats.totalSent,\n DeliveryRate: c.stats.deliveryRate,\n Pending: c.stats.pending,\n Failed: c.stats.failed,\n ProviderHealthNames: CapCommunicationList(c.providerHealth.map(p => p.Name)),\n ProviderHealthCount: c.providerHealth.length,\n ChannelNames: c.channelBreakdown.map(ch => ch.Name),\n RecentActivityNames: CapCommunicationList(\n c.recentLogs.map(l => `${l.CommunicationProviderMessageType || 'Message'} · ${l.CommunicationProvider || 'Unknown'} · ${l.Status}`),\n ),\n };\n }\n\n private harvestLogsSurface(): CommunicationSurfaceContext {\n const c = this.logsChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'logs',\n LogCount: c.logs.length,\n FilteredLogCount: c.filteredLogs.length,\n StatusFilter: c.statusFilter as CommunicationLogStatus,\n SearchText: c.SearchText,\n VisibleLogSummaries: CapCommunicationList(c.filteredLogs.map(l => this.logDisplayName(l))),\n SelectedItemId: this.selectedLog?.id ?? null,\n SelectedItemName: this.selectedLog?.name ?? null,\n };\n }\n\n private harvestProvidersSurface(): CommunicationSurfaceContext {\n const c = this.providersChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'providers',\n ProviderCount: c.providerCards.length,\n ActiveProviderCount: c.providerCards.filter(p => p.Entity.Status === 'Active').length,\n ProviderNames: CapCommunicationList(c.providerCards.map(p => p.Entity.Name)),\n CalendarCapableProviderNames: CapCommunicationList(\n c.providerCards.filter(p => p.Entity.SupportsCalendar).map(p => p.Entity.Name),\n ),\n FreeBusyCapableProviderNames: CapCommunicationList(\n c.providerCards.filter(p => p.Entity.SupportsFreeBusy).map(p => p.Entity.Name),\n ),\n EnterpriseScopeSummaries: CapCommunicationList(\n c.providerCards.map(\n p => `${p.Entity.Name} · ${p.Entity.EnterpriseScopeMode || 'UtilityMailboxesOnly'} · ${p.Entity.AllowedEmailDomains || 'Any domain'}`,\n ),\n ),\n AgentUtilityMailboxCount: c.AgentUtilityMailboxes.length,\n AgentUtilityMailboxSummaries: CapCommunicationList(\n c.AgentUtilityMailboxes.map(\n m => `${m.IdentityValue} · ${m.Agent || 'Unassigned'} · ${m.User ? ('Dedicated: ' + m.User) : 'Shared'}`,\n ),\n ),\n SelectedItemId: this.selectedProvider?.id ?? null,\n SelectedItemName: this.selectedProvider?.name ?? null,\n };\n }\n\n private harvestTemplatesSurface(): CommunicationSurfaceContext {\n const c = this.templatesChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'templates',\n TemplateCount: c.allTemplates.length,\n FilteredTemplateCount: c.filteredTemplates.length,\n CategoryFilter: c.categoryFilter,\n SearchText: c.SearchText,\n AvailableCategories: CapCommunicationList(c.categories),\n VisibleTemplateNames: CapCommunicationList(c.filteredTemplates.map(t => t.Entity.Name)),\n SelectedItemId: this.selectedTemplate?.id ?? null,\n SelectedItemName: this.selectedTemplate?.name ?? null,\n };\n }\n\n private harvestRunsSurface(): CommunicationSurfaceContext {\n const c = this.runsChild;\n if (!c) {\n return { Surface: 'none' };\n }\n return {\n Surface: 'runs',\n RunCount: c.runs.length,\n ActiveRunCount: c.summary.active,\n CompletedRunCount: c.summary.completed,\n SuccessRate: c.summary.successRate,\n VisibleRunSummaries: CapCommunicationList(c.runs.map(r => `${this.runDisplayName(r.ID)} · ${r.Status}`)),\n SelectedItemId: this.selectedRun?.id ?? null,\n SelectedItemName: this.selectedRun?.name ?? null,\n };\n }\n\n /** The display label the runs timeline shows for a run (\"Run #<short-id>\"). */\n private runDisplayName(id: string): string {\n return `Run #${(id || '').substring(0, 8)}`;\n }\n\n /**\n * The on-screen display summary for a log row (\"<provider> · <type> · <status>\"),\n * used both for context publishing and for name-based resolution by the agent's\n * Select/Open log tools — so the agent can refer to a row exactly as it's described\n * in context.\n */\n private logDisplayName(log: { CommunicationProvider?: string; CommunicationProviderMessageType?: string; Status: string }): string {\n return `${log.CommunicationProvider || 'Unknown'} · ${log.CommunicationProviderMessageType || 'Message'} · ${log.Status}`;\n }\n\n /** id+name candidates for the visible (filtered) log rows. Empty when the Logs tab isn't mounted. */\n private logCandidates(): CommunicationItemCandidate[] {\n return (this.logsChild?.filteredLogs ?? []).map(l => ({ ID: l.ID, Name: this.logDisplayName(l) }));\n }\n\n // -- Mode-scoped client tools -------------------------------------------------\n\n /**\n * Tracks which tool set was last registered, so the mode-scoped re-registration\n * ({@link syncAgentToolsForMode}) only fires on a tab transition rather than on\n * every state change.\n */\n private lastRegisteredToolMode: CommunicationTab | null = null;\n\n /**\n * Re-scope the agent's client tools to the ACTIVE tab. Each surface exposes a\n * different set of affordances (logs filter by status + search + select/open a log;\n * templates filter by category + search + select/open a template; providers select/\n * open a provider; runs select/open a run; monitor is read-only), so a logs-only tool\n * is never exposed while the Providers tab is open and vice-versa. The COMMON tools\n * (switch tab, refresh) are always present. Because {@link publishAgentContext} fires\n * on every state change but the tool set only changes on the tab flip, this guards on\n * {@link lastRegisteredToolMode} and only calls into NavigationService when the active\n * tab actually changes.\n */\n private syncAgentToolsForMode(): void {\n const mode = IsValidCommunicationTab(this.ActiveTab) ? this.ActiveTab : 'monitor';\n if (mode === this.lastRegisteredToolMode) {\n return;\n }\n this.lastRegisteredToolMode = mode;\n this.navigationService.SetAgentClientTools(this, [\n ...this.buildCommonTools(),\n ...this.buildSurfaceTools(mode),\n ]);\n }\n\n /**\n * Register the navigational / read-only client tools the agent may invoke. Called\n * once on mount; {@link syncAgentToolsForMode} re-registers the surface-scoped slice\n * on every tab change. See the SAFETY BOUNDARY comment above for the operations\n * intentionally NOT exposed.\n */\n private registerAgentClientTools(): void {\n this.lastRegisteredToolMode = null;\n this.syncAgentToolsForMode();\n }\n\n private buildAgentTool(\n name: string,\n description: string,\n parameterSchema: Record<string, unknown>,\n handler: (params: Record<string, unknown>) => Promise<unknown>,\n ): CommunicationAgentTool {\n return { Name: name, Description: description, ParameterSchema: parameterSchema, Handler: handler };\n }\n\n /** COMMON tools — available on EVERY tab (switch tab + refresh). */\n private buildCommonTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'SwitchCommunicationTab',\n 'Switch the active Communication dashboard tab. Valid tabs: monitor, logs, providers, templates, runs, settings.',\n {\n type: 'object',\n properties: { tab: { type: 'string', enum: [...COMMUNICATION_TABS] } },\n required: ['tab'],\n },\n async (params) => this.handleSwitchTabTool(params),\n ),\n this.buildAgentTool(\n 'RefreshCommunicationData',\n 'Refresh the currently-displayed Communication data. Read-only — re-loads existing data, sends nothing.',\n { type: 'object', properties: {} },\n async () => {\n this.OnRefresh();\n return { Success: true };\n },\n ),\n ];\n }\n\n /** The surface-scoped tool slice for the active tab. */\n private buildSurfaceTools(mode: CommunicationTab): CommunicationAgentTool[] {\n switch (mode) {\n case 'logs':\n return this.buildLogsTools();\n case 'providers':\n return this.buildProvidersTools();\n case 'templates':\n return this.buildTemplatesTools();\n case 'runs':\n return this.buildRunsTools();\n case 'monitor':\n case 'settings':\n default:\n return [];\n }\n }\n\n private buildLogsTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'FilterLogsBy',\n \"Filter the message-log list by delivery status. Valid statuses: Complete, Failed, Pending, or '' to clear.\",\n {\n type: 'object',\n properties: { status: { type: 'string', enum: [...COMMUNICATION_LOG_STATUSES] } },\n required: ['status'],\n },\n async (params) => this.handleFilterLogsTool(params),\n ),\n this.buildAgentTool(\n 'SearchLogs',\n 'Type into the log-list search box to filter logs by provider, message type, status, or error text.',\n { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n async (params) => this.handleSearchLogsTool(params),\n ),\n this.buildAgentTool(\n 'SelectLog',\n 'Select a visible message-log row by its id or a display value (provider / message type / status). Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { log: { type: 'string' } }, required: ['log'] },\n async (params) => this.handleSelectLogTool(params),\n ),\n this.buildAgentTool(\n 'OpenLog',\n 'Open a message-log record in a tab by id or display value. Defaults to the currently-selected log when no argument is given. Read-only navigation.',\n { type: 'object', properties: { log: { type: 'string' } } },\n async (params) => this.handleOpenLogTool(params),\n ),\n ];\n }\n\n private buildProvidersTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'SelectProvider',\n 'Select a configured provider card by its name or id. Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { provider: { type: 'string' } }, required: ['provider'] },\n async (params) => this.handleSelectProviderTool(params),\n ),\n this.buildAgentTool(\n 'OpenProvider',\n 'Open a provider record in a tab by name or id. Defaults to the currently-selected provider when no argument is given. Read-only navigation — does NOT edit the provider.',\n { type: 'object', properties: { provider: { type: 'string' } } },\n async (params) => this.handleOpenProviderTool(params),\n ),\n ];\n }\n\n private buildTemplatesTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'FilterTemplatesByCategory',\n \"Filter the template list by category, or pass '' to clear the filter.\",\n { type: 'object', properties: { category: { type: 'string' } }, required: ['category'] },\n async (params) => this.handleFilterTemplatesTool(params),\n ),\n this.buildAgentTool(\n 'SearchTemplates',\n 'Type into the template-list search box to filter templates by name, description, or category.',\n { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n async (params) => this.handleSearchTemplatesTool(params),\n ),\n this.buildAgentTool(\n 'SelectTemplate',\n 'Select a visible template by its name or id. Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { template: { type: 'string' } }, required: ['template'] },\n async (params) => this.handleSelectTemplateTool(params),\n ),\n this.buildAgentTool(\n 'OpenTemplate',\n 'Open a template record in a tab by name or id. Defaults to the currently-selected template when no argument is given. Read-only navigation — does NOT edit the template.',\n { type: 'object', properties: { template: { type: 'string' } } },\n async (params) => this.handleOpenTemplateTool(params),\n ),\n ];\n }\n\n private buildRunsTools(): CommunicationAgentTool[] {\n return [\n this.buildAgentTool(\n 'SelectRun',\n 'Select a visible bulk-run by its id or display label (\"Run #<short-id>\"). Read-only — records the selection so it can be opened or referenced.',\n { type: 'object', properties: { run: { type: 'string' } }, required: ['run'] },\n async (params) => this.handleSelectRunTool(params),\n ),\n this.buildAgentTool(\n 'OpenRun',\n 'Open a bulk communication-run record in a tab by id or display label. Defaults to the currently-selected run when no argument is given. Read-only navigation.',\n { type: 'object', properties: { run: { type: 'string' } } },\n async (params) => this.handleOpenRunTool(params),\n ),\n ];\n }\n\n // -- Tolerant tool handlers ---------------------------------------------------\n\n private handleSwitchTabTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateEnumParam(params?.['tab'], this.NavigationItems as readonly string[], 'tab');\n if (!v.ok) {\n return v.result;\n }\n this.OnTabChange(v.value);\n return { Success: true };\n }\n\n private handleFilterLogsTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateEnumParam(params?.['status'], COMMUNICATION_LOG_STATUSES, 'status');\n if (!v.ok) {\n return v.result;\n }\n if (!this.logsChild) {\n return { Success: false, ErrorMessage: 'The Logs tab is not open. Switch to the Logs tab before filtering logs.' };\n }\n this.logsChild.onStatusFilter(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSearchLogsTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['query'], 'query');\n if (!v.ok) {\n return v.result;\n }\n if (!this.logsChild) {\n return { Success: false, ErrorMessage: 'The Logs tab is not open. Switch to the Logs tab before searching logs.' };\n }\n this.logsChild.onSearchValue(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSelectLogTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['log'], 'log');\n if (!v.ok) {\n return v.result;\n }\n if (!this.logsChild) {\n return { Success: false, ErrorMessage: 'The Logs tab is not open. Switch to the Logs tab first.' };\n }\n const match = ResolveCommunicationItem(v.value, this.logCandidates());\n if (!match) {\n return { Success: false, ErrorMessage: `No visible log matches \"${v.value}\".` };\n }\n this.selectedLog = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenLogTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['log'] === 'string' ? (params['log'] as string) : '';\n if (ref && this.logsChild) {\n const match = ResolveCommunicationItem(ref, this.logCandidates());\n if (match) {\n this.selectedLog = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedLog) {\n return { Success: false, ErrorMessage: 'No log to open. Select a log first or pass an id / display value.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Communication Logs', CompositeKey.FromID(this.selectedLog.id));\n return { Success: true };\n }\n\n private handleSelectProviderTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['provider'], 'provider');\n if (!v.ok) {\n return v.result;\n }\n if (!this.providersChild) {\n return { Success: false, ErrorMessage: 'The Providers tab is not open. Switch to the Providers tab first.' };\n }\n const candidates: CommunicationItemCandidate[] = this.providersChild.providerCards.map(p => ({ ID: p.Entity.ID, Name: p.Entity.Name }));\n const match = ResolveCommunicationItem(v.value, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: `No provider matches \"${v.value}\".` };\n }\n this.selectedProvider = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenProviderTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['provider'] === 'string' ? (params['provider'] as string) : '';\n if (ref && this.providersChild) {\n const candidates: CommunicationItemCandidate[] = this.providersChild.providerCards.map(p => ({ ID: p.Entity.ID, Name: p.Entity.Name }));\n const match = ResolveCommunicationItem(ref, candidates);\n if (match) {\n this.selectedProvider = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedProvider) {\n return { Success: false, ErrorMessage: 'No provider to open. Select a provider first or pass a name / id.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Communication Providers', CompositeKey.FromID(this.selectedProvider.id));\n return { Success: true };\n }\n\n private handleFilterTemplatesTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['category'], 'category');\n if (!v.ok) {\n return v.result;\n }\n if (!this.templatesChild) {\n return { Success: false, ErrorMessage: 'The Templates tab is not open. Switch to the Templates tab first.' };\n }\n this.templatesChild.onCategoryFilter(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSearchTemplatesTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['query'], 'query');\n if (!v.ok) {\n return v.result;\n }\n if (!this.templatesChild) {\n return { Success: false, ErrorMessage: 'The Templates tab is not open. Switch to the Templates tab first.' };\n }\n this.templatesChild.onSearchValue(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleSelectTemplateTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['template'], 'template');\n if (!v.ok) {\n return v.result;\n }\n if (!this.templatesChild) {\n return { Success: false, ErrorMessage: 'The Templates tab is not open. Switch to the Templates tab first.' };\n }\n const candidates: CommunicationItemCandidate[] = this.templatesChild.filteredTemplates.map(t => ({ ID: t.Entity.ID, Name: t.Entity.Name }));\n const match = ResolveCommunicationItem(v.value, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: `No visible template matches \"${v.value}\".` };\n }\n this.selectedTemplate = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenTemplateTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['template'] === 'string' ? (params['template'] as string) : '';\n if (ref && this.templatesChild) {\n const candidates: CommunicationItemCandidate[] = this.templatesChild.filteredTemplates.map(t => ({ ID: t.Entity.ID, Name: t.Entity.Name }));\n const match = ResolveCommunicationItem(ref, candidates);\n if (match) {\n this.selectedTemplate = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedTemplate) {\n return { Success: false, ErrorMessage: 'No template to open. Select a template first or pass a name / id.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Templates', CompositeKey.FromID(this.selectedTemplate.id));\n return { Success: true };\n }\n\n private handleSelectRunTool(params: Record<string, unknown>): CommunicationToolResult {\n const v = ValidateStringParam(params?.['run'], 'run');\n if (!v.ok) {\n return v.result;\n }\n if (!this.runsChild) {\n return { Success: false, ErrorMessage: 'The Runs tab is not open. Switch to the Runs tab first.' };\n }\n const candidates: CommunicationItemCandidate[] = this.runsChild.runs.map(r => ({ ID: r.ID, Name: this.runDisplayName(r.ID) }));\n const match = ResolveCommunicationItem(v.value, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: `No visible run matches \"${v.value}\".` };\n }\n this.selectedRun = { id: match.ID, name: match.Name };\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenRunTool(params: Record<string, unknown>): CommunicationToolResult {\n const ref = typeof params?.['run'] === 'string' ? (params['run'] as string) : '';\n if (ref && this.runsChild) {\n const candidates: CommunicationItemCandidate[] = this.runsChild.runs.map(r => ({ ID: r.ID, Name: this.runDisplayName(r.ID) }));\n const match = ResolveCommunicationItem(ref, candidates);\n if (match) {\n this.selectedRun = { id: match.ID, name: match.Name };\n }\n }\n if (!this.selectedRun) {\n return { Success: false, ErrorMessage: 'No run to open. Select a run first or pass an id / display label.' };\n }\n this.navigationService.OpenEntityRecord('MJ: Communication Runs', CompositeKey.FromID(this.selectedRun.id));\n return { Success: true };\n }\n}\n","<div class=\"communication-dashboard-container\">\n <!-- TOOLBAR -->\n <div class=\"studio-toolbar\">\n <div class=\"toolbar-brand\">\n <div class=\"brand-icon\"><i class=\"fa-solid fa-satellite-dish\"></i></div>\n <span class=\"brand-label\">Communications</span>\n </div>\n <div class=\"toolbar-divider\"></div>\n <div class=\"toolbar-spacer\"></div>\n <button class=\"tb-btn\" (click)=\"onRefresh()\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isRefreshing\"></i> Refresh\n </button>\n </div>\n\n <!-- BODY -->\n <div class=\"dashboard-body\">\n <!-- SIDEBAR -->\n <div class=\"sidebar\">\n <div class=\"sidebar-section-label\">Dashboard</div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'monitor'\"\n (click)=\"onTabChange('monitor')\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <span>Monitor</span>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'logs'\"\n (click)=\"onTabChange('logs')\">\n <i class=\"fa-solid fa-list-ul\"></i>\n <span>Message Logs</span>\n </div>\n\n <div class=\"sidebar-section-label\">Configuration</div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'providers'\"\n (click)=\"onTabChange('providers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span>Providers</span>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'templates'\"\n (click)=\"onTabChange('templates')\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span>Templates</span>\n </div>\n\n <div class=\"sidebar-section-label\">Operations</div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'runs'\"\n (click)=\"onTabChange('runs')\">\n <i class=\"fa-solid fa-play-circle\"></i>\n <span>Bulk Runs</span>\n </div>\n\n <div class=\"sidebar-footer\">\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'settings'\"\n (click)=\"onTabChange('settings')\">\n <i class=\"fa-solid fa-gear\"></i>\n <span>Settings</span>\n </div>\n </div>\n </div>\n\n <!-- MAIN CONTENT -->\n <div class=\"main-content\">\n <div class=\"tab-container\">\n @switch (activeTab) {\n @case ('monitor') {\n <div class=\"tab-content\">\n @if (hasVisited('monitor')) {\n <mj-communication-monitor-resource></mj-communication-monitor-resource>\n }\n </div>\n }\n @case ('logs') {\n <div class=\"tab-content\">\n @if (hasVisited('logs')) {\n <mj-communication-logs-resource></mj-communication-logs-resource>\n }\n </div>\n }\n @case ('providers') {\n <div class=\"tab-content\">\n @if (hasVisited('providers')) {\n <mj-communication-providers-resource></mj-communication-providers-resource>\n }\n </div>\n }\n @case ('templates') {\n <div class=\"tab-content\">\n @if (hasVisited('templates')) {\n <mj-communication-templates-resource></mj-communication-templates-resource>\n }\n </div>\n }\n @case ('runs') {\n <div class=\"tab-content\">\n @if (hasVisited('runs')) {\n <mj-communication-runs-resource></mj-communication-runs-resource>\n }\n </div>\n }\n }\n </div>\n </div>\n </div>\n</div>\n"]}