@memberjunction/ng-explorer-core 5.47.0 → 5.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/generated/lazy-feature-config.js +126 -126
  2. package/dist/generated/lazy-feature-config.js.map +1 -1
  3. package/dist/lib/omnibar/index.d.ts +15 -0
  4. package/dist/lib/omnibar/index.d.ts.map +1 -0
  5. package/dist/lib/omnibar/index.js +24 -0
  6. package/dist/lib/omnibar/index.js.map +1 -0
  7. package/dist/lib/omnibar/omnibar-palette.component.d.ts +130 -0
  8. package/dist/lib/omnibar/omnibar-palette.component.d.ts.map +1 -0
  9. package/dist/lib/omnibar/omnibar-palette.component.js +829 -0
  10. package/dist/lib/omnibar/omnibar-palette.component.js.map +1 -0
  11. package/dist/lib/omnibar/omnibar-provider.d.ts +94 -0
  12. package/dist/lib/omnibar/omnibar-provider.d.ts.map +1 -0
  13. package/dist/lib/omnibar/omnibar-provider.js +84 -0
  14. package/dist/lib/omnibar/omnibar-provider.js.map +1 -0
  15. package/dist/lib/omnibar/omnibar-shortcut.d.ts +12 -0
  16. package/dist/lib/omnibar/omnibar-shortcut.d.ts.map +1 -0
  17. package/dist/lib/omnibar/omnibar-shortcut.js +16 -0
  18. package/dist/lib/omnibar/omnibar-shortcut.js.map +1 -0
  19. package/dist/lib/omnibar/omnibar-user-setting.d.ts +38 -0
  20. package/dist/lib/omnibar/omnibar-user-setting.d.ts.map +1 -0
  21. package/dist/lib/omnibar/omnibar-user-setting.js +53 -0
  22. package/dist/lib/omnibar/omnibar-user-setting.js.map +1 -0
  23. package/dist/lib/omnibar/providers/omnibar-agent.provider.d.ts +24 -0
  24. package/dist/lib/omnibar/providers/omnibar-agent.provider.d.ts.map +1 -0
  25. package/dist/lib/omnibar/providers/omnibar-agent.provider.js +69 -0
  26. package/dist/lib/omnibar/providers/omnibar-agent.provider.js.map +1 -0
  27. package/dist/lib/omnibar/providers/omnibar-command.provider.d.ts +29 -0
  28. package/dist/lib/omnibar/providers/omnibar-command.provider.d.ts.map +1 -0
  29. package/dist/lib/omnibar/providers/omnibar-command.provider.js +130 -0
  30. package/dist/lib/omnibar/providers/omnibar-command.provider.js.map +1 -0
  31. package/dist/lib/omnibar/providers/omnibar-record.provider.d.ts +35 -0
  32. package/dist/lib/omnibar/providers/omnibar-record.provider.d.ts.map +1 -0
  33. package/dist/lib/omnibar/providers/omnibar-record.provider.js +176 -0
  34. package/dist/lib/omnibar/providers/omnibar-record.provider.js.map +1 -0
  35. package/dist/lib/omnibar/providers/omnibar-search.provider.d.ts +21 -0
  36. package/dist/lib/omnibar/providers/omnibar-search.provider.d.ts.map +1 -0
  37. package/dist/lib/omnibar/providers/omnibar-search.provider.js +94 -0
  38. package/dist/lib/omnibar/providers/omnibar-search.provider.js.map +1 -0
  39. package/dist/lib/profile/profile-dialog.component.d.ts +12 -0
  40. package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
  41. package/dist/lib/profile/profile-dialog.component.js +189 -78
  42. package/dist/lib/profile/profile-dialog.component.js.map +1 -1
  43. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +16 -0
  44. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  45. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +66 -6
  46. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  47. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  48. package/dist/lib/resource-wrappers/view-resource.component.js +6 -2
  49. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  50. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +7 -0
  51. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  52. package/dist/lib/shell/components/tabs/tab-container.component.js +26 -4
  53. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  54. package/dist/lib/shell/shell.component.d.ts +62 -2
  55. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  56. package/dist/lib/shell/shell.component.js +341 -162
  57. package/dist/lib/shell/shell.component.js.map +1 -1
  58. package/dist/lib/shell/shell.module.d.ts +8 -7
  59. package/dist/lib/shell/shell.module.d.ts.map +1 -1
  60. package/dist/lib/shell/shell.module.js +5 -2
  61. package/dist/lib/shell/shell.module.js.map +1 -1
  62. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  63. package/dist/lib/single-list-detail/single-list-detail.component.js +29 -20
  64. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  65. package/dist/public-api.d.ts +1 -0
  66. package/dist/public-api.d.ts.map +1 -1
  67. package/dist/public-api.js +2 -0
  68. package/dist/public-api.js.map +1 -1
  69. package/package.json +49 -49
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-palette.component.js","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-palette.component.ts","../../../src/lib/omnibar/omnibar-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter,\n OnDestroy, Output, ViewChild, inject,\n} from '@angular/core';\nimport { CompositeKey, UserInfo } from '@memberjunction/core';\nimport { Metadata } from '@memberjunction/core';\nimport { MentionSuggestion } from '@memberjunction/ng-composer';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { SearchService, SearchScopeInfo } from '@memberjunction/ng-search';\nimport { FileOpenService } from '@memberjunction/ng-file-storage';\nimport { Subscription, firstValueFrom, skip } from 'rxjs';\nimport { CommandPaletteService } from '../command-palette/command-palette.service';\nimport {\n DiscoverOmnibarProviders, GetOmnibarNavPayload, OmnibarProvider,\n} from './omnibar-provider';\nimport { LoadOmnibarProviders } from './index';\n\n/** One rendered result row: the suggestion + presentation extras. */\ninterface OmnibarRow {\n Suggestion: MentionSuggestion;\n /** Set only on the FIRST row of each group — drives the section header. */\n GroupLabel: string | null;\n /** 0-100 relevance bar (search mode only). */\n ScorePercent: number | null;\n}\n\n/** Debounce for the default (network-backed) search mode; trigger modes serve warm caches. */\nconst SEARCH_DEBOUNCE_MS = 300;\n\n/** Max suggestions requested per keystroke. */\nconst MAX_RESULTS = 9;\n\n/**\n * The unified Explorer command palette (Ctrl/Cmd+K): one surface for global\n * cross-source search (plain text), jump-to-record ('#'), commands & apps ('/'),\n * and agents ('@') — every mode a pluggable {@link OmnibarProvider}, discovered via\n * the MJ ClassFactory so OpenApps can add modes without touching this component.\n *\n * Design source of truth: plans/composer-adoption/mockups/omnibar-command-palette.html.\n */\n@Component({\n standalone: false,\n selector: 'mj-omnibar-palette',\n templateUrl: './omnibar-palette.component.html',\n styleUrls: ['./omnibar-palette.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OmnibarPaletteComponent implements OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private host = inject<ElementRef<HTMLElement>>(ElementRef);\n private navigation = inject(NavigationService);\n private appManager = inject(ApplicationManager);\n private search = inject(SearchService);\n private paletteService = inject(CommandPaletteService);\n private fileOpen = inject(FileOpenService);\n\n @ViewChild('paletteInput') private inputRef?: ElementRef<HTMLInputElement>;\n\n /** Palette visibility (open via {@link Open}; Escape/backdrop close). */\n public IsOpen = false;\n /** Raw input text including any leading trigger char. */\n public Query = '';\n public Rows: OmnibarRow[] = [];\n public RecentRows: OmnibarRow[] = [];\n public SelectedIndex = 0;\n public IsLoading = false;\n public Scopes: SearchScopeInfo[] = [];\n public SelectedScopeIDs: string[] = [];\n\n @Output() Opened = new EventEmitter<void>();\n @Output() Closed = new EventEmitter<void>();\n /** Footer gear clicked — the host opens its settings surface (Explorer: My\n Profile, where the Command Palette opt-in section lives). The palette\n closes first so the settings dialog isn't buried under it. */\n @Output() SettingsRequested = new EventEmitter<void>();\n\n private providers: OmnibarProvider[] = [];\n private defaultProvider: OmnibarProvider | null = null;\n private byTrigger = new Map<string, OmnibarProvider>();\n private queryGeneration = 0;\n private debounceHandle: ReturnType<typeof setTimeout> | null = null;\n /** Element focused before the palette opened — restored on close (a11y). */\n private previousFocus: HTMLElement | null = null;\n private recentsSub: Subscription | null = null;\n\n // ---------------------------------------------------------------\n // Derived view state\n // ---------------------------------------------------------------\n\n /** The active trigger char ('' = default/global-search mode). */\n public get ActiveTriggerChar(): string {\n const first = this.Query.charAt(0);\n return this.byTrigger.has(first) ? first : '';\n }\n\n /** Query text with the trigger char stripped. */\n public get EffectiveQuery(): string {\n return this.ActiveTriggerChar ? this.Query.substring(1) : this.Query;\n }\n\n public get ActiveModeLabel(): string {\n return this.activeProvider?.ModeLabel ?? 'Search';\n }\n\n public get ActivePlaceholder(): string {\n return this.activeProvider?.Placeholder ?? 'Search everything — or type #, /, @ …';\n }\n\n /** Scope pills only apply to the cross-source search mode. */\n public get ShowScopes(): boolean {\n return this.ActiveTriggerChar === '' && this.EffectiveQuery.trim().length > 0;\n }\n\n /** Footer gear: close, then let the host present its settings surface. */\n public RequestSettings(): void {\n this.Close();\n this.SettingsRequested.emit();\n }\n\n /** Hint chips for the empty state — one per non-default provider. */\n public get TriggerHints(): Array<{ Char: string; Label: string }> {\n return this.providers\n .filter((p) => p.TriggerChar !== '')\n .map((p) => ({ Char: p.TriggerChar, Label: p.ModeLabel }));\n }\n\n /** RecentRows render after the hint bar; selection indexes continue into them. */\n public get RecentBaseIndex(): number {\n return 0;\n }\n\n private get activeProvider(): OmnibarProvider | null {\n const char = this.ActiveTriggerChar;\n return char ? (this.byTrigger.get(char) ?? null) : this.defaultProvider;\n }\n\n private get selectableRows(): OmnibarRow[] {\n return this.Rows.length > 0 ? this.Rows : this.RecentRows;\n }\n\n /**\n * ARIA combobox wiring: the input keeps DOM focus while this points at the\n * virtually-highlighted option row, so screen readers announce selection moves.\n */\n public get ActiveDescendantId(): string | null {\n return this.selectableRows.length > 0 ? `ob-opt-${this.SelectedIndex}` : null;\n }\n\n /** Whether any option rows exist — drives the combobox's aria-expanded. */\n public get HasOptions(): boolean {\n return this.selectableRows.length > 0;\n }\n\n // ---------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------\n\n /** Opens the palette, optionally pre-seeded (e.g. '/' from the legacy Ctrl+/ path). */\n public Open(initialQuery = ''): void {\n this.ensureProviders();\n this.previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n this.IsOpen = true;\n this.Query = initialQuery;\n this.Rows = [];\n this.SelectedIndex = 0;\n void this.loadScopes();\n void this.loadRecents();\n if (initialQuery.length > 0) {\n this.runQuery();\n }\n this.Opened.emit();\n this.cdr.markForCheck();\n // Input mounts via @if — focus next tick.\n setTimeout(() => this.inputRef?.nativeElement.focus(), 30);\n }\n\n public Close(): void {\n if (!this.IsOpen) {\n return;\n }\n this.IsOpen = false;\n this.Query = '';\n this.Rows = [];\n this.Closed.emit();\n this.cdr.markForCheck();\n // Return focus to where the user was (skip if that element left the DOM).\n if (this.previousFocus?.isConnected) {\n this.previousFocus.focus();\n }\n this.previousFocus = null;\n }\n\n public Toggle(initialQuery = ''): void {\n if (this.IsOpen) {\n this.Close();\n } else {\n this.Open(initialQuery);\n }\n }\n\n ngOnDestroy(): void {\n if (this.debounceHandle != null) {\n clearTimeout(this.debounceHandle);\n }\n this.recentsSub?.unsubscribe();\n }\n\n // ---------------------------------------------------------------\n // Input handling\n // ---------------------------------------------------------------\n\n public OnQueryChange(value: string): void {\n this.Query = value;\n this.SelectedIndex = 0;\n this.runQuery();\n }\n\n public OnInputKeydown(event: KeyboardEvent): void {\n const rows = this.selectableRows;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1);\n break;\n case 'Enter': {\n event.preventDefault();\n const row = rows[this.SelectedIndex];\n if (row) {\n this.Execute(row.Suggestion);\n } else if (this.ActiveTriggerChar === '' && this.EffectiveQuery.trim().length > 1) {\n // No rows yet (still loading / no matches): honest escape hatch to full search.\n this.openFullSearch(this.EffectiveQuery.trim());\n }\n break;\n }\n }\n }\n\n /**\n * Dialog-level keys (bubbled from anywhere inside the palette):\n * - Escape closes from any focused element, not just the input.\n * - Tab follows the natural visual order — input → scope pills → mode chips →\n * the selected result row (roving tabindex) — and TRAPS at the ends so focus\n * cycles inside the dialog instead of escaping to the page underneath.\n * (Design review: Tab must reach the three mode chips, not skip them.)\n */\n public OnPaletteKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.Close();\n return;\n }\n if (event.key !== 'Tab') {\n return;\n }\n // On a result row, Tab / Shift+Tab step through the RESULTS themselves\n // (mirrors ArrowDown/Up) until walking off either end of the list — then\n // the trap logic below takes over. Same model as mj-search-overlay.\n const activeEl = document.activeElement as HTMLElement | null;\n if (activeEl?.classList.contains('ob-row')) {\n const last = this.selectableRows.length - 1;\n if (!event.shiftKey && this.SelectedIndex < last) {\n event.preventDefault();\n this.moveSelection(1, true);\n return;\n }\n if (event.shiftKey && this.SelectedIndex > 0) {\n event.preventDefault();\n this.moveSelection(-1, true);\n return;\n }\n // At either end: fall through so Tab leaves the list naturally.\n }\n const root = this.host.nativeElement.querySelector('.omnibar-palette') as HTMLElement | null;\n if (!root) {\n return;\n }\n const focusables = Array.from(root.querySelectorAll<HTMLElement>('input, button, .ob-row[tabindex=\"0\"]'))\n .filter((el) => el.offsetParent !== null);\n if (focusables.length === 0) {\n return;\n }\n const active = document.activeElement as HTMLElement | null;\n if (!event.shiftKey && active === focusables[focusables.length - 1]) {\n event.preventDefault();\n focusables[0].focus();\n } else if (event.shiftKey && active === focusables[0]) {\n event.preventDefault();\n focusables[focusables.length - 1].focus();\n }\n }\n\n /** Keys on a focused result row (rows are real focus stops via roving tabindex). */\n public OnRowKeydown(event: KeyboardEvent, suggestion: MentionSuggestion): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, true);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, true);\n break;\n case 'Enter':\n event.preventDefault();\n this.Execute(suggestion);\n break;\n }\n }\n\n /**\n * Keyboard-driven selection move: wraps at both ends (standard picker behavior)\n * and keeps the highlighted row visible. Mouse hover sets SelectedIndex directly\n * in the template and deliberately does NOT scroll — auto-scrolling under the\n * pointer would fight the user's hand. When the move originates from a focused\n * row (roving tabindex), DOM focus follows the selection.\n */\n private moveSelection(delta: 1 | -1, focusRow = false): void {\n const count = this.selectableRows.length;\n if (count === 0) {\n return;\n }\n this.SelectedIndex = (this.SelectedIndex + delta + count) % count;\n this.cdr.markForCheck();\n const row = this.host.nativeElement.querySelector<HTMLElement>(`#ob-opt-${this.SelectedIndex}`);\n row?.scrollIntoView({ block: 'nearest' });\n if (focusRow) {\n row?.focus();\n }\n }\n\n /** Hint-chip click: seed the trigger char and refocus. */\n public SeedTrigger(char: string): void {\n this.Query = char;\n this.SelectedIndex = 0;\n this.runQuery();\n this.inputRef?.nativeElement.focus();\n }\n\n // ---------------------------------------------------------------\n // Scopes\n // ---------------------------------------------------------------\n\n public IsScopeSelected(id: string): boolean {\n return this.SelectedScopeIDs.includes(id);\n }\n\n public ToggleScope(id: string): void {\n this.SelectedScopeIDs = this.IsScopeSelected(id)\n ? this.SelectedScopeIDs.filter((s) => s !== id)\n : [...this.SelectedScopeIDs, id];\n this.cdr.markForCheck();\n }\n\n public ClearScopes(): void {\n this.SelectedScopeIDs = [];\n this.cdr.markForCheck();\n }\n\n // ---------------------------------------------------------------\n // Execution\n // ---------------------------------------------------------------\n\n /** Executes a suggestion: navigate per its payload, or re-seed for entity drill-in. */\n public Execute(suggestion: MentionSuggestion): void {\n const nav = GetOmnibarNavPayload(suggestion);\n if (!nav) {\n return; // foreign suggestion with no navigation — nothing to execute\n }\n // Default-mode queries count as \"searches\" even when the user executes a\n // suggestion that navigates directly (no full ExecuteSearch downstream to\n // record them). Trigger-mode fragments ('#accounts ac…') are NOT searches —\n // recording those would pollute recents. 'search' payloads skip too: the\n // results page records them with the real result count.\n const typed = this.EffectiveQuery.trim();\n if (this.ActiveTriggerChar === '' && typed.length > 0 && nav.kind !== 'search') {\n this.search.RecordRecentSearch(typed);\n }\n switch (nav.kind) {\n case 'record':\n this.navigation.OpenEntityRecord(nav.entityName, CompositeKey.FromID(nav.recordId));\n break;\n case 'entity-list':\n this.navigation.OpenDynamicView(nav.entityName);\n break;\n case 'search':\n this.openFullSearch(nav.query);\n return; // openFullSearch closes\n case 'app':\n void this.paletteService.TrackAppAccess(nav.appId);\n void this.navigation.SwitchToApp(nav.appId);\n break;\n case 'nav':\n void this.navigation.SwitchToApp(nav.appId, nav.navItemName);\n break;\n case 'agent':\n void this.openAgentChat(nav.agentName);\n break;\n case 'file':\n if (!this.fileOpen.OpenPreviewFromSearchResult(nav.rawMetadata)) {\n void this.fileOpen.OpenFileFromSearchResult(nav.rawMetadata);\n }\n break;\n }\n this.Close();\n }\n\n private openFullSearch(query: string): void {\n const opts = this.SelectedScopeIDs.length > 0 ? { scopeIDs: [...this.SelectedScopeIDs] } : undefined;\n this.navigation.OpenSearch(query, opts);\n this.Close();\n }\n\n /** '@' selection: switch to the Chat app pre-addressed to the agent. */\n private async openAgentChat(agentName: string): Promise<void> {\n const apps = await firstValueFrom(this.appManager.Applications).catch(() => []);\n const chat = apps.find((a) => a.Name.trim().toLowerCase() === 'chat');\n if (chat) {\n // agentReq is a one-shot request nonce: the chat wrapper applies each\n // agent|nonce instruction exactly once, so URL↔tab-config sync echoes\n // of an already-consumed param can never re-stage the pre-address (and\n // wipe an in-progress composer draft), while a genuine re-tag of the\n // SAME agent still applies because it carries a fresh nonce.\n await this.navigation.SwitchToApp(chat.ID, undefined, {\n agent: agentName,\n agentReq: Date.now().toString(36),\n });\n }\n }\n\n // ---------------------------------------------------------------\n // Query execution\n // ---------------------------------------------------------------\n\n private ensureProviders(): void {\n if (this.providers.length > 0) {\n return;\n }\n // Kick off the persisted-recents load (idempotent; resolves via LoggedIn\n // replay). The legacy search composite used to be the only caller — with\n // the omnibar enabled it never renders, so prior-session recents were\n // invisible until the palette started requesting them itself.\n void this.search.LoadRecentSearches();\n // Refresh the empty-state Recent rows whenever recents change while the\n // palette is idle-open (skip(1): BehaviorSubject replays its current\n // value on subscribe, which loadRecents already read directly).\n this.recentsSub = this.search.RecentSearches$.pipe(skip(1)).subscribe(() => {\n if (this.IsOpen && this.Query.length === 0) {\n void this.loadRecents();\n }\n });\n LoadOmnibarProviders();\n this.providers = DiscoverOmnibarProviders();\n const context = {\n Search: this.search,\n Apps: this.appManager,\n PaletteService: this.paletteService,\n Navigation: this.navigation,\n };\n for (const provider of this.providers) {\n provider.Attach(context);\n if (provider.TriggerChar === '') {\n this.defaultProvider = this.defaultProvider ?? provider;\n } else if (!this.byTrigger.has(provider.TriggerChar)) {\n this.byTrigger.set(provider.TriggerChar, provider);\n }\n }\n }\n\n private runQuery(): void {\n if (this.debounceHandle != null) {\n clearTimeout(this.debounceHandle);\n this.debounceHandle = null;\n }\n const generation = ++this.queryGeneration;\n const provider = this.activeProvider;\n const query = this.EffectiveQuery;\n const isTriggerMode = this.ActiveTriggerChar !== '';\n\n if (!provider || (query.trim().length === 0 && !isTriggerMode)) {\n this.Rows = [];\n this.IsLoading = false;\n this.cdr.markForCheck();\n return;\n }\n\n const fire = () => void this.fetchSuggestions(provider, query, generation);\n if (isTriggerMode) {\n fire(); // warm caches — no debounce\n } else {\n this.IsLoading = this.Rows.length === 0;\n this.cdr.markForCheck();\n this.debounceHandle = setTimeout(fire, SEARCH_DEBOUNCE_MS);\n }\n }\n\n private async fetchSuggestions(provider: OmnibarProvider, query: string, generation: number): Promise<void> {\n const request = {\n Query: query,\n MaxResults: MAX_RESULTS,\n ContextUser: this.currentUser,\n Provider: null,\n };\n const suggestions = query.trim().length === 0\n ? await provider.EmptyStateSuggestions(request)\n : await provider.GetSuggestions(request);\n if (generation !== this.queryGeneration) {\n return; // stale response — a newer keystroke superseded it\n }\n this.Rows = this.toRows(suggestions);\n this.SelectedIndex = 0;\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n\n private toRows(suggestions: MentionSuggestion[]): OmnibarRow[] {\n let lastGroup: string | null = null;\n return suggestions.map((s) => {\n const group = typeof s.data?.['group'] === 'string' ? (s.data['group'] as string) : '';\n const isNewGroup = group.length > 0 && group !== lastGroup;\n if (group.length > 0) {\n lastGroup = group;\n }\n const score = typeof s.data?.['score'] === 'number' ? (s.data['score'] as number) : null;\n return {\n Suggestion: s,\n GroupLabel: isNewGroup ? group : null,\n ScorePercent: score != null ? Math.round(Math.max(0, Math.min(1, score)) * 100) : null,\n };\n });\n }\n\n private async loadScopes(): Promise<void> {\n try {\n this.Scopes = await this.search.LoadScopes();\n this.cdr.markForCheck();\n } catch {\n this.Scopes = [];\n }\n }\n\n /** Empty-state recents: recent searches + recent apps (best-effort). */\n private async loadRecents(): Promise<void> {\n const rows: OmnibarRow[] = [];\n try {\n const recentSearches = this.search.RecentSearches$.value.slice(0, 3);\n for (const recent of recentSearches) {\n rows.push({\n Suggestion: {\n type: 'search',\n id: `recent-search:${recent.Query}`,\n name: recent.Query,\n displayName: recent.Query,\n description: 'Recent search',\n icon: 'fa-solid fa-clock-rotate-left',\n data: { nav: { kind: 'search', query: recent.Query } },\n },\n GroupLabel: null,\n ScorePercent: null,\n });\n }\n } catch {\n // recents are decorative — never block the palette\n }\n try {\n const commandProvider = this.byTrigger.get('/');\n if (commandProvider) {\n const apps = await commandProvider.EmptyStateSuggestions({\n Query: '', MaxResults: 3, ContextUser: this.currentUser, Provider: null,\n });\n rows.push(...apps.map((s) => ({ Suggestion: s, GroupLabel: null, ScorePercent: null })));\n }\n } catch {\n // ditto\n }\n this.RecentRows = rows;\n this.cdr.markForCheck();\n }\n\n private get currentUser(): UserInfo | null {\n return Metadata.Provider?.CurrentUser ?? null; // global-provider-ok: Explorer shell palette is app chrome bound to the session's default provider\n }\n}\n\n/** Tree-shaking guard for the palette component. */\nexport function LoadOmnibarPaletteComponent(): void {\n // intentional no-op\n}\n","@if (IsOpen) {\n <div class=\"omnibar-overlay\" (click)=\"Close()\"></div>\n <div class=\"omnibar-palette\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Command palette\"\n (keydown)=\"OnPaletteKeydown($event)\">\n\n <div class=\"ob-input-row\">\n <span class=\"ob-lead\" [class.ob-lead--trigger]=\"ActiveTriggerChar.length > 0\">\n @if (ActiveTriggerChar.length > 0) {\n <b>{{ ActiveTriggerChar }}</b>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n }\n </span>\n <input #paletteInput class=\"ob-input\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\"\n role=\"combobox\" aria-controls=\"ob-listbox\" aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"HasOptions\"\n [attr.aria-activedescendant]=\"ActiveDescendantId\"\n [placeholder]=\"ActivePlaceholder\"\n [ngModel]=\"Query\" (ngModelChange)=\"OnQueryChange($event)\"\n (keydown)=\"OnInputKeydown($event)\" />\n <span class=\"ob-mode-badge\">{{ ActiveModeLabel }}</span>\n <kbd class=\"ob-kbd\">esc</kbd>\n <button type=\"button\" class=\"ob-close\" aria-label=\"Close\" title=\"Close\" (click)=\"Close()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n @if (ShowScopes && Scopes.length > 0) {\n <div class=\"ob-scopes\">\n <button type=\"button\" class=\"ob-scope\" [class.ob-scope--on]=\"SelectedScopeIDs.length === 0\"\n (click)=\"ClearScopes()\">All sources</button>\n @for (scope of Scopes; track scope.ID) {\n <button type=\"button\" class=\"ob-scope\" [class.ob-scope--on]=\"IsScopeSelected(scope.ID)\"\n (click)=\"ToggleScope(scope.ID)\">{{ scope.Name }}</button>\n }\n </div>\n }\n\n <div class=\"ob-body\">\n @if (IsLoading) {\n <div class=\"ob-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Searching…</div>\n } @else if (Rows.length === 0 && Query.length === 0) {\n <div class=\"ob-hintbar\">\n @for (hint of TriggerHints; track hint.Char) {\n <button type=\"button\" class=\"ob-hint-chip\" (click)=\"SeedTrigger(hint.Char)\">\n <b>{{ hint.Char }}</b><span>{{ hint.Label }}</span>\n </button>\n }\n </div>\n @if (RecentRows.length > 0) {\n <div class=\"ob-group-label\" role=\"presentation\">Recent</div>\n <div id=\"ob-listbox\" role=\"listbox\" aria-label=\"Suggestions\">\n @for (row of RecentRows; track row.Suggestion.id; let i = $index) {\n <div class=\"ob-row\" role=\"option\" [attr.id]=\"'ob-opt-' + (RecentBaseIndex + i)\"\n [attr.tabindex]=\"RecentBaseIndex + i === SelectedIndex ? 0 : -1\"\n [attr.aria-selected]=\"RecentBaseIndex + i === SelectedIndex\"\n [class.ob-row--sel]=\"RecentBaseIndex + i === SelectedIndex\"\n (focus)=\"SelectedIndex = RecentBaseIndex + i\"\n (keydown)=\"OnRowKeydown($event, row.Suggestion)\"\n (mouseenter)=\"SelectedIndex = RecentBaseIndex + i\" (click)=\"Execute(row.Suggestion)\">\n <span class=\"ob-ric\"><i [class]=\"row.Suggestion.icon || 'fa-solid fa-clock-rotate-left'\"></i></span>\n <span class=\"ob-rmain\">\n <span class=\"ob-rname\">{{ row.Suggestion.displayName }}</span>\n <span class=\"ob-rsub\">{{ row.Suggestion.description }}</span>\n </span>\n <span class=\"ob-raux\"><span class=\"ob-rtype\">{{ row.Suggestion.type }}</span></span>\n </div>\n }\n </div>\n }\n } @else if (Rows.length === 0) {\n <div class=\"ob-empty\">No matches — press <kbd class=\"ob-kbd\">↵</kbd> to search everything for “{{ EffectiveQuery }}”.</div>\n } @else {\n <div id=\"ob-listbox\" role=\"listbox\" aria-label=\"Suggestions\">\n @for (row of Rows; track row.Suggestion.id; let i = $index) {\n @if (row.GroupLabel) {\n <div class=\"ob-group-label\" role=\"presentation\">{{ row.GroupLabel }}</div>\n }\n <div class=\"ob-row\" role=\"option\" [attr.id]=\"'ob-opt-' + i\"\n [attr.tabindex]=\"i === SelectedIndex ? 0 : -1\"\n [attr.aria-selected]=\"i === SelectedIndex\"\n [class.ob-row--sel]=\"i === SelectedIndex\"\n (focus)=\"SelectedIndex = i\"\n (keydown)=\"OnRowKeydown($event, row.Suggestion)\"\n (mouseenter)=\"SelectedIndex = i\" (click)=\"Execute(row.Suggestion)\">\n <span class=\"ob-ric\"><i [class]=\"row.Suggestion.icon || 'fa-solid fa-circle'\"></i></span>\n <span class=\"ob-rmain\">\n <span class=\"ob-rname\">{{ row.Suggestion.displayName }}</span>\n @if (row.Suggestion.description) {\n <span class=\"ob-rsub\">{{ row.Suggestion.description }}</span>\n }\n </span>\n <span class=\"ob-raux\">\n @if (row.ScorePercent != null) {\n <span class=\"ob-score\"><i [style.width.%]=\"row.ScorePercent\"></i></span>\n }\n <span class=\"ob-rtype\">{{ row.Suggestion.type }}</span>\n <span class=\"ob-go\">open <kbd class=\"ob-kbd\">↵</kbd></span>\n </span>\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"ob-foot\">\n <span class=\"ob-k\"><kbd class=\"ob-kbd\">↑</kbd><kbd class=\"ob-kbd\">↓</kbd> navigate</span>\n <span class=\"ob-k\"><kbd class=\"ob-kbd\">↵</kbd> open</span>\n <button type=\"button\" class=\"ob-settings\" aria-label=\"Command Palette settings\"\n title=\"Command Palette settings\" (click)=\"RequestSettings()\">\n <i class=\"fa-solid fa-gear\"></i>\n </button>\n </div>\n </div>\n}\n"]}
@@ -0,0 +1,94 @@
1
+ import { ComposerTriggerProvider, MentionSuggestion, ComposerSuggestionRequest } from '@memberjunction/ng-composer';
2
+ import type { NavigationService } from '@memberjunction/ng-shared';
3
+ import type { ApplicationManager } from '@memberjunction/ng-base-application';
4
+ import type { SearchService } from '@memberjunction/ng-search';
5
+ import type { CommandPaletteService } from '../command-palette/command-palette.service';
6
+ /**
7
+ * What selecting an omnibar suggestion DOES. Every {@link OmnibarProvider}
8
+ * suggestion carries one of these in `MentionSuggestion.data['nav']`; the palette
9
+ * executes it through the existing navigation seams (NavigationService et al.) —
10
+ * providers never navigate themselves.
11
+ */
12
+ export type OmnibarNavPayload = {
13
+ kind: 'record';
14
+ entityName: string;
15
+ recordId: string;
16
+ } | {
17
+ kind: 'search';
18
+ query: string;
19
+ scopeIDs?: string[];
20
+ } | {
21
+ kind: 'app';
22
+ appId: string;
23
+ appName: string;
24
+ } | {
25
+ kind: 'nav';
26
+ appId: string;
27
+ navItemName: string;
28
+ } | {
29
+ kind: 'entity-list';
30
+ entityName: string;
31
+ } | {
32
+ kind: 'agent';
33
+ agentName: string;
34
+ } | {
35
+ kind: 'file';
36
+ fileName: string;
37
+ rawMetadata?: string;
38
+ };
39
+ /** Key under which the nav payload rides in `MentionSuggestion.data`. */
40
+ export declare const OMNIBAR_NAV_KEY = "nav";
41
+ /** Convenience: read a suggestion's nav payload (null when absent/foreign). */
42
+ export declare function GetOmnibarNavPayload(suggestion: MentionSuggestion): OmnibarNavPayload | null;
43
+ /**
44
+ * Angular-owned services the palette hands to providers before use. Providers are
45
+ * ClassFactory-instantiated (no Angular DI), so anything injectable arrives here.
46
+ * All members optional — a provider must degrade gracefully (return []) when a
47
+ * dependency it needs wasn't supplied.
48
+ */
49
+ export interface OmnibarContext {
50
+ Search?: SearchService;
51
+ Apps?: ApplicationManager;
52
+ PaletteService?: CommandPaletteService;
53
+ Navigation?: NavigationService;
54
+ }
55
+ /**
56
+ * Pluggable mode for the Explorer command palette (the Ctrl+K omnibar).
57
+ *
58
+ * Registers under its OWN ClassFactory base — `@RegisterClass(OmnibarProvider, '<key>')`
59
+ * — deliberately separate from the composer's `ComposerTriggerProvider` discovery, so
60
+ * palette semantics (e.g. '#' = jump to a specific record) never leak into text
61
+ * editors' mention discovery (where '#' means something else). The shape is shared
62
+ * with the composer contract for consistency; the palette is the only consumer of
63
+ * this base.
64
+ *
65
+ * `TriggerChar` conventions: '' (empty string) = the DEFAULT mode consulted when the
66
+ * input has no trigger prefix (global search); any single char ('#', '/', '@', …)
67
+ * claims that prefix. OpenApps extend the palette by registering additional
68
+ * subclasses — no core changes required.
69
+ */
70
+ export declare abstract class OmnibarProvider extends ComposerTriggerProvider {
71
+ /** Human label for the palette's mode badge while this provider is active. */
72
+ abstract readonly ModeLabel: string;
73
+ /** Placeholder shown in the input while this provider's trigger is active. */
74
+ readonly Placeholder: string;
75
+ protected context: OmnibarContext;
76
+ /**
77
+ * Called by the palette after discovery, before any GetSuggestions call, with the
78
+ * Angular services providers may need (ClassFactory construction has no DI).
79
+ * Override to validate required members; keep it idempotent.
80
+ */
81
+ Attach(context: OmnibarContext): void;
82
+ /**
83
+ * Suggestions for the EMPTY query in this mode (recents, hints). Default: none.
84
+ * The palette shows these when the trigger is active but nothing is typed yet.
85
+ */
86
+ EmptyStateSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]>;
87
+ }
88
+ /**
89
+ * Resolves every `@RegisterClass(OmnibarProvider, ...)` registration into a provider
90
+ * list — highest-priority registration wins per key, results sorted by provider
91
+ * `Priority` desc then `Key` asc. Returns [] gracefully when nothing is registered.
92
+ */
93
+ export declare function DiscoverOmnibarProviders(excludedKeys?: string[]): OmnibarProvider[];
94
+ //# sourceMappingURL=omnibar-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-provider.d.ts","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACpH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAExF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,yEAAyE;AACzE,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CAG5F;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,eAAgB,SAAQ,uBAAuB;IACjE,8EAA8E;IAC9E,kBAAyB,SAAS,EAAE,MAAM,CAAC;IAE3C,8EAA8E;IAC9E,SAAgB,WAAW,EAAE,MAAM,CAAqB;IAExD,SAAS,CAAC,OAAO,EAAE,cAAc,CAAM;IAEvC;;;;OAIG;IACI,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAI5C;;;OAGG;IACU,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAIvG;AAKD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAkCnF"}
@@ -0,0 +1,84 @@
1
+ import { MJGlobal } from '@memberjunction/global';
2
+ import { ComposerTriggerProvider } from '@memberjunction/ng-composer';
3
+ /** Key under which the nav payload rides in `MentionSuggestion.data`. */
4
+ export const OMNIBAR_NAV_KEY = 'nav';
5
+ /** Convenience: read a suggestion's nav payload (null when absent/foreign). */
6
+ export function GetOmnibarNavPayload(suggestion) {
7
+ const nav = suggestion.data?.[OMNIBAR_NAV_KEY];
8
+ return nav ? nav : null;
9
+ }
10
+ /**
11
+ * Pluggable mode for the Explorer command palette (the Ctrl+K omnibar).
12
+ *
13
+ * Registers under its OWN ClassFactory base — `@RegisterClass(OmnibarProvider, '<key>')`
14
+ * — deliberately separate from the composer's `ComposerTriggerProvider` discovery, so
15
+ * palette semantics (e.g. '#' = jump to a specific record) never leak into text
16
+ * editors' mention discovery (where '#' means something else). The shape is shared
17
+ * with the composer contract for consistency; the palette is the only consumer of
18
+ * this base.
19
+ *
20
+ * `TriggerChar` conventions: '' (empty string) = the DEFAULT mode consulted when the
21
+ * input has no trigger prefix (global search); any single char ('#', '/', '@', …)
22
+ * claims that prefix. OpenApps extend the palette by registering additional
23
+ * subclasses — no core changes required.
24
+ */
25
+ export class OmnibarProvider extends ComposerTriggerProvider {
26
+ /** Placeholder shown in the input while this provider's trigger is active. */
27
+ Placeholder = 'Type to search…';
28
+ context = {};
29
+ /**
30
+ * Called by the palette after discovery, before any GetSuggestions call, with the
31
+ * Angular services providers may need (ClassFactory construction has no DI).
32
+ * Override to validate required members; keep it idempotent.
33
+ */
34
+ Attach(context) {
35
+ this.context = context;
36
+ }
37
+ /**
38
+ * Suggestions for the EMPTY query in this mode (recents, hints). Default: none.
39
+ * The palette shows these when the trigger is active but nothing is typed yet.
40
+ */
41
+ async EmptyStateSuggestions(request) {
42
+ void request;
43
+ return [];
44
+ }
45
+ }
46
+ /** One shared instance per registered subclass (providers are stateless facades). */
47
+ const instanceCache = new Map();
48
+ /**
49
+ * Resolves every `@RegisterClass(OmnibarProvider, ...)` registration into a provider
50
+ * list — highest-priority registration wins per key, results sorted by provider
51
+ * `Priority` desc then `Key` asc. Returns [] gracefully when nothing is registered.
52
+ */
53
+ export function DiscoverOmnibarProviders(excludedKeys) {
54
+ const factory = MJGlobal.Instance.ClassFactory;
55
+ const registrations = factory.GetAllRegistrations(OmnibarProvider);
56
+ if (!registrations || registrations.length === 0) {
57
+ return [];
58
+ }
59
+ const excluded = new Set((excludedKeys ?? []).map((k) => k.trim().toLowerCase()));
60
+ const seenKeys = new Set();
61
+ const providers = [];
62
+ for (const registration of registrations) {
63
+ const normalizedKey = registration.Key?.trim().toLowerCase();
64
+ if (!normalizedKey || seenKeys.has(normalizedKey) || excluded.has(normalizedKey)) {
65
+ continue;
66
+ }
67
+ seenKeys.add(normalizedKey);
68
+ // Winning registration per key — mirrors GetRegistration's priority semantics
69
+ // (same pattern as DiscoverComposerTriggerProviders).
70
+ const winner = factory.GetRegistration(OmnibarProvider, registration.Key);
71
+ if (!winner?.SubClass) {
72
+ continue;
73
+ }
74
+ let instance = instanceCache.get(winner.SubClass);
75
+ if (!instance) {
76
+ const ProviderConstructor = winner.SubClass;
77
+ instance = new ProviderConstructor();
78
+ instanceCache.set(winner.SubClass, instance);
79
+ }
80
+ providers.push(instance);
81
+ }
82
+ return providers.sort((a, b) => (b.Priority - a.Priority) || a.Key.localeCompare(b.Key));
83
+ }
84
+ //# sourceMappingURL=omnibar-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-provider.js","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { MJGlobal } from '@memberjunction/global';\nimport { ComposerTriggerProvider, MentionSuggestion, ComposerSuggestionRequest } from '@memberjunction/ng-composer';\nimport type { NavigationService } from '@memberjunction/ng-shared';\nimport type { ApplicationManager } from '@memberjunction/ng-base-application';\nimport type { SearchService } from '@memberjunction/ng-search';\nimport type { CommandPaletteService } from '../command-palette/command-palette.service';\n\n/**\n * What selecting an omnibar suggestion DOES. Every {@link OmnibarProvider}\n * suggestion carries one of these in `MentionSuggestion.data['nav']`; the palette\n * executes it through the existing navigation seams (NavigationService et al.) —\n * providers never navigate themselves.\n */\nexport type OmnibarNavPayload =\n | { kind: 'record'; entityName: string; recordId: string }\n | { kind: 'search'; query: string; scopeIDs?: string[] }\n | { kind: 'app'; appId: string; appName: string }\n | { kind: 'nav'; appId: string; navItemName: string }\n | { kind: 'entity-list'; entityName: string }\n | { kind: 'agent'; agentName: string }\n | { kind: 'file'; fileName: string; rawMetadata?: string };\n\n/** Key under which the nav payload rides in `MentionSuggestion.data`. */\nexport const OMNIBAR_NAV_KEY = 'nav';\n\n/** Convenience: read a suggestion's nav payload (null when absent/foreign). */\nexport function GetOmnibarNavPayload(suggestion: MentionSuggestion): OmnibarNavPayload | null {\n const nav = suggestion.data?.[OMNIBAR_NAV_KEY];\n return nav ? (nav as OmnibarNavPayload) : null;\n}\n\n/**\n * Angular-owned services the palette hands to providers before use. Providers are\n * ClassFactory-instantiated (no Angular DI), so anything injectable arrives here.\n * All members optional — a provider must degrade gracefully (return []) when a\n * dependency it needs wasn't supplied.\n */\nexport interface OmnibarContext {\n Search?: SearchService;\n Apps?: ApplicationManager;\n PaletteService?: CommandPaletteService;\n Navigation?: NavigationService;\n}\n\n/**\n * Pluggable mode for the Explorer command palette (the Ctrl+K omnibar).\n *\n * Registers under its OWN ClassFactory base — `@RegisterClass(OmnibarProvider, '<key>')`\n * — deliberately separate from the composer's `ComposerTriggerProvider` discovery, so\n * palette semantics (e.g. '#' = jump to a specific record) never leak into text\n * editors' mention discovery (where '#' means something else). The shape is shared\n * with the composer contract for consistency; the palette is the only consumer of\n * this base.\n *\n * `TriggerChar` conventions: '' (empty string) = the DEFAULT mode consulted when the\n * input has no trigger prefix (global search); any single char ('#', '/', '@', …)\n * claims that prefix. OpenApps extend the palette by registering additional\n * subclasses — no core changes required.\n */\nexport abstract class OmnibarProvider extends ComposerTriggerProvider {\n /** Human label for the palette's mode badge while this provider is active. */\n public abstract readonly ModeLabel: string;\n\n /** Placeholder shown in the input while this provider's trigger is active. */\n public readonly Placeholder: string = 'Type to search…';\n\n protected context: OmnibarContext = {};\n\n /**\n * Called by the palette after discovery, before any GetSuggestions call, with the\n * Angular services providers may need (ClassFactory construction has no DI).\n * Override to validate required members; keep it idempotent.\n */\n public Attach(context: OmnibarContext): void {\n this.context = context;\n }\n\n /**\n * Suggestions for the EMPTY query in this mode (recents, hints). Default: none.\n * The palette shows these when the trigger is active but nothing is typed yet.\n */\n public async EmptyStateSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]> {\n void request;\n return [];\n }\n}\n\n/** One shared instance per registered subclass (providers are stateless facades). */\nconst instanceCache = new Map<unknown, OmnibarProvider>();\n\n/**\n * Resolves every `@RegisterClass(OmnibarProvider, ...)` registration into a provider\n * list — highest-priority registration wins per key, results sorted by provider\n * `Priority` desc then `Key` asc. Returns [] gracefully when nothing is registered.\n */\nexport function DiscoverOmnibarProviders(excludedKeys?: string[]): OmnibarProvider[] {\n const factory = MJGlobal.Instance.ClassFactory;\n const registrations = factory.GetAllRegistrations(OmnibarProvider);\n if (!registrations || registrations.length === 0) {\n return [];\n }\n\n const excluded = new Set((excludedKeys ?? []).map((k) => k.trim().toLowerCase()));\n const seenKeys = new Set<string>();\n const providers: OmnibarProvider[] = [];\n\n for (const registration of registrations) {\n const normalizedKey = registration.Key?.trim().toLowerCase();\n if (!normalizedKey || seenKeys.has(normalizedKey) || excluded.has(normalizedKey)) {\n continue;\n }\n seenKeys.add(normalizedKey);\n\n // Winning registration per key — mirrors GetRegistration's priority semantics\n // (same pattern as DiscoverComposerTriggerProviders).\n const winner = factory.GetRegistration(OmnibarProvider, registration.Key);\n if (!winner?.SubClass) {\n continue;\n }\n let instance = instanceCache.get(winner.SubClass);\n if (!instance) {\n const ProviderConstructor = winner.SubClass as new () => OmnibarProvider;\n instance = new ProviderConstructor();\n instanceCache.set(winner.SubClass, instance);\n }\n providers.push(instance);\n }\n\n return providers.sort((a, b) => (b.Priority - a.Priority) || a.Key.localeCompare(b.Key));\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Platform-aware label for the omnibar summon chord. The KEYBINDING is already
3
+ * platform-aware (Cmd on Mac, Ctrl elsewhere — see shell.component.ts's
4
+ * OnGlobalKeydown); these helpers keep the DISPLAYED hint in lockstep so a Mac
5
+ * user sees "⌘K", not "Ctrl+K". One source of truth for every surface that
6
+ * advertises the shortcut (header affordance, tooltip, My Profile hint).
7
+ */
8
+ /** True when running on macOS (same detection idiom as the keydown handlers). */
9
+ export declare function IsMacPlatform(): boolean;
10
+ /** The omnibar summon shortcut as the current platform's convention renders it. */
11
+ export declare function GetOmnibarShortcutLabel(): string;
12
+ //# sourceMappingURL=omnibar-shortcut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-shortcut.d.ts","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-shortcut.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AACjF,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Platform-aware label for the omnibar summon chord. The KEYBINDING is already
3
+ * platform-aware (Cmd on Mac, Ctrl elsewhere — see shell.component.ts's
4
+ * OnGlobalKeydown); these helpers keep the DISPLAYED hint in lockstep so a Mac
5
+ * user sees "⌘K", not "Ctrl+K". One source of truth for every surface that
6
+ * advertises the shortcut (header affordance, tooltip, My Profile hint).
7
+ */
8
+ /** True when running on macOS (same detection idiom as the keydown handlers). */
9
+ export function IsMacPlatform() {
10
+ return typeof navigator !== 'undefined' && navigator.platform.toUpperCase().indexOf('MAC') >= 0;
11
+ }
12
+ /** The omnibar summon shortcut as the current platform's convention renders it. */
13
+ export function GetOmnibarShortcutLabel() {
14
+ return IsMacPlatform() ? '⌘K' : 'Ctrl+K';
15
+ }
16
+ //# sourceMappingURL=omnibar-shortcut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-shortcut.js","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-shortcut.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AACjF,MAAM,UAAU,aAAa;IACzB,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,uBAAuB;IACnC,OAAO,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7C,CAAC","sourcesContent":["/**\n * Platform-aware label for the omnibar summon chord. The KEYBINDING is already\n * platform-aware (Cmd on Mac, Ctrl elsewhere — see shell.component.ts's\n * OnGlobalKeydown); these helpers keep the DISPLAYED hint in lockstep so a Mac\n * user sees \"⌘K\", not \"Ctrl+K\". One source of truth for every surface that\n * advertises the shortcut (header affordance, tooltip, My Profile hint).\n */\n\n/** True when running on macOS (same detection idiom as the keydown handlers). */\nexport function IsMacPlatform(): boolean {\n return typeof navigator !== 'undefined' && navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n}\n\n/** The omnibar summon shortcut as the current platform's convention renders it. */\nexport function GetOmnibarShortcutLabel(): string {\n return IsMacPlatform() ? '⌘K' : 'Ctrl+K';\n}\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Two-layer omnibar enablement:
3
+ *
4
+ * 1. INSTANCE master switch — the 'Shell.Omnibar.Enabled' Instance Config row.
5
+ * Default TRUE when absent, meaning the feature is AVAILABLE. Setting it to
6
+ * false kills the omnibar for everyone (legacy trio for all users) and hides
7
+ * the per-user toggle in My Profile.
8
+ * 2. PER-USER opt-in — the 'mj.shell.omnibar.enabled' User Setting
9
+ * (UserInfoEngine → MJ: User Settings, so it follows the user across
10
+ * browsers/devices). Absent or anything other than 'true' = legacy trio.
11
+ *
12
+ * Net: availability is instance policy; actual enablement is a personal opt-in
13
+ * from My Profile → Command Palette.
14
+ */
15
+ /** Instance Config key — the master availability switch. */
16
+ export declare const OMNIBAR_INSTANCE_CONFIG_KEY = "Shell.Omnibar.Enabled";
17
+ /** Per-user opt-in key in MJ: User Settings (values 'true' / 'false'). */
18
+ export declare const OMNIBAR_USER_SETTING_KEY = "mj.shell.omnibar.enabled";
19
+ /**
20
+ * Per-user dismissal of the "try the command palette" promo shown in the legacy
21
+ * search surfaces. 'true' = never show again (follows the user across devices).
22
+ */
23
+ export declare const OMNIBAR_PROMO_DISMISSED_KEY = "mj.shell.omnibarPromo.dismissed";
24
+ /**
25
+ * Pure resolution of the two layers — instance availability gates everything;
26
+ * the user setting must be the exact string 'true' to opt in.
27
+ */
28
+ export declare function ResolveOmnibarEnabled(instanceEnabled: boolean, userSetting: string | undefined): boolean;
29
+ /** Whether the instance makes the omnibar available at all (master switch). */
30
+ export declare function IsOmnibarAvailable(): boolean;
31
+ /**
32
+ * Whether the omnibar is ON for the current user (availability × opt-in).
33
+ * Fail-closed: this is read from the shell template on every change-detection
34
+ * pass, so an engine that isn't loaded yet (boot) or is permission-constrained
35
+ * must resolve to the legacy trio, never throw.
36
+ */
37
+ export declare function IsOmnibarEnabledForUser(): boolean;
38
+ //# sourceMappingURL=omnibar-user-setting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-user-setting.d.ts","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-user-setting.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,4DAA4D;AAC5D,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAEnE,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAE7E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKxG;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CASjD"}
@@ -0,0 +1,53 @@
1
+ import { InstanceConfigEngine, UserInfoEngine } from '@memberjunction/core-entities';
2
+ /**
3
+ * Two-layer omnibar enablement:
4
+ *
5
+ * 1. INSTANCE master switch — the 'Shell.Omnibar.Enabled' Instance Config row.
6
+ * Default TRUE when absent, meaning the feature is AVAILABLE. Setting it to
7
+ * false kills the omnibar for everyone (legacy trio for all users) and hides
8
+ * the per-user toggle in My Profile.
9
+ * 2. PER-USER opt-in — the 'mj.shell.omnibar.enabled' User Setting
10
+ * (UserInfoEngine → MJ: User Settings, so it follows the user across
11
+ * browsers/devices). Absent or anything other than 'true' = legacy trio.
12
+ *
13
+ * Net: availability is instance policy; actual enablement is a personal opt-in
14
+ * from My Profile → Command Palette.
15
+ */
16
+ /** Instance Config key — the master availability switch. */
17
+ export const OMNIBAR_INSTANCE_CONFIG_KEY = 'Shell.Omnibar.Enabled';
18
+ /** Per-user opt-in key in MJ: User Settings (values 'true' / 'false'). */
19
+ export const OMNIBAR_USER_SETTING_KEY = 'mj.shell.omnibar.enabled';
20
+ /**
21
+ * Per-user dismissal of the "try the command palette" promo shown in the legacy
22
+ * search surfaces. 'true' = never show again (follows the user across devices).
23
+ */
24
+ export const OMNIBAR_PROMO_DISMISSED_KEY = 'mj.shell.omnibarPromo.dismissed';
25
+ /**
26
+ * Pure resolution of the two layers — instance availability gates everything;
27
+ * the user setting must be the exact string 'true' to opt in.
28
+ */
29
+ export function ResolveOmnibarEnabled(instanceEnabled, userSetting) {
30
+ if (!instanceEnabled) {
31
+ return false;
32
+ }
33
+ return userSetting === 'true';
34
+ }
35
+ /** Whether the instance makes the omnibar available at all (master switch). */
36
+ export function IsOmnibarAvailable() {
37
+ return InstanceConfigEngine.Instance.GetBoolean(OMNIBAR_INSTANCE_CONFIG_KEY, true);
38
+ }
39
+ /**
40
+ * Whether the omnibar is ON for the current user (availability × opt-in).
41
+ * Fail-closed: this is read from the shell template on every change-detection
42
+ * pass, so an engine that isn't loaded yet (boot) or is permission-constrained
43
+ * must resolve to the legacy trio, never throw.
44
+ */
45
+ export function IsOmnibarEnabledForUser() {
46
+ try {
47
+ return ResolveOmnibarEnabled(IsOmnibarAvailable(), UserInfoEngine.Instance.GetSetting(OMNIBAR_USER_SETTING_KEY));
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ //# sourceMappingURL=omnibar-user-setting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-user-setting.js","sourceRoot":"","sources":["../../../src/lib/omnibar/omnibar-user-setting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAErF;;;;;;;;;;;;;GAaG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,iCAAiC,CAAC;AAE7E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAwB,EAAE,WAA+B;IAC3F,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,WAAW,KAAK,MAAM,CAAC;AAClC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB;IAC9B,OAAO,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC;AACvF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;IACnC,IAAI,CAAC;QACD,OAAO,qBAAqB,CACxB,kBAAkB,EAAE,EACpB,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAC/D,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC","sourcesContent":["import { InstanceConfigEngine, UserInfoEngine } from '@memberjunction/core-entities';\n\n/**\n * Two-layer omnibar enablement:\n *\n * 1. INSTANCE master switch — the 'Shell.Omnibar.Enabled' Instance Config row.\n * Default TRUE when absent, meaning the feature is AVAILABLE. Setting it to\n * false kills the omnibar for everyone (legacy trio for all users) and hides\n * the per-user toggle in My Profile.\n * 2. PER-USER opt-in — the 'mj.shell.omnibar.enabled' User Setting\n * (UserInfoEngine → MJ: User Settings, so it follows the user across\n * browsers/devices). Absent or anything other than 'true' = legacy trio.\n *\n * Net: availability is instance policy; actual enablement is a personal opt-in\n * from My Profile → Command Palette.\n */\n\n/** Instance Config key — the master availability switch. */\nexport const OMNIBAR_INSTANCE_CONFIG_KEY = 'Shell.Omnibar.Enabled';\n\n/** Per-user opt-in key in MJ: User Settings (values 'true' / 'false'). */\nexport const OMNIBAR_USER_SETTING_KEY = 'mj.shell.omnibar.enabled';\n\n/**\n * Per-user dismissal of the \"try the command palette\" promo shown in the legacy\n * search surfaces. 'true' = never show again (follows the user across devices).\n */\nexport const OMNIBAR_PROMO_DISMISSED_KEY = 'mj.shell.omnibarPromo.dismissed';\n\n/**\n * Pure resolution of the two layers — instance availability gates everything;\n * the user setting must be the exact string 'true' to opt in.\n */\nexport function ResolveOmnibarEnabled(instanceEnabled: boolean, userSetting: string | undefined): boolean {\n if (!instanceEnabled) {\n return false;\n }\n return userSetting === 'true';\n}\n\n/** Whether the instance makes the omnibar available at all (master switch). */\nexport function IsOmnibarAvailable(): boolean {\n return InstanceConfigEngine.Instance.GetBoolean(OMNIBAR_INSTANCE_CONFIG_KEY, true);\n}\n\n/**\n * Whether the omnibar is ON for the current user (availability × opt-in).\n * Fail-closed: this is read from the shell template on every change-detection\n * pass, so an engine that isn't loaded yet (boot) or is permission-constrained\n * must resolve to the legacy trio, never throw.\n */\nexport function IsOmnibarEnabledForUser(): boolean {\n try {\n return ResolveOmnibarEnabled(\n IsOmnibarAvailable(),\n UserInfoEngine.Instance.GetSetting(OMNIBAR_USER_SETTING_KEY)\n );\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type { MentionSuggestion, ComposerSuggestionRequest } from '@memberjunction/ng-composer';
2
+ import { OmnibarProvider } from '../omnibar-provider';
3
+ /**
4
+ * '@' — talk to an agent: opens Conversations pre-addressed. Suggestion data comes
5
+ * from the conversations package's own `agent-mentions` composer plugin, resolved
6
+ * FROM THE COMPOSER REGISTRY AT QUERY TIME — no compile-time dependency on
7
+ * ng-conversations, and graceful [] when the plugin isn't registered (e.g. a
8
+ * deployment without the conversations package).
9
+ */
10
+ export declare class OmnibarAgentProvider extends OmnibarProvider {
11
+ readonly TriggerChar = "@";
12
+ readonly Key = "omnibar-agents";
13
+ readonly Priority = 30;
14
+ readonly ModeLabel = "Talk to an Agent";
15
+ readonly Placeholder = "Agent name\u2026";
16
+ private delegate;
17
+ GetSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]>;
18
+ /** Empty '@' = the full permission-filtered agent list (delegate with empty query). */
19
+ EmptyStateSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]>;
20
+ private resolveDelegate;
21
+ }
22
+ /** Tree-shaking guard — referenced by LoadOmnibarProviders(). */
23
+ export declare function LoadOmnibarAgentProvider(): void;
24
+ //# sourceMappingURL=omnibar-agent.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-agent.provider.d.ts","sourceRoot":"","sources":["../../../../src/lib/omnibar/providers/omnibar-agent.provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,eAAe,EAAsC,MAAM,qBAAqB,CAAC;AAK1F;;;;;;GAMG;AACH,qBACa,oBAAqB,SAAQ,eAAe;IACrD,SAAgB,WAAW,OAAO;IAClC,SAAgB,GAAG,oBAAoB;IACvC,SAAyB,QAAQ,MAAM;IACvC,SAAgB,SAAS,sBAAsB;IAC/C,SAAyB,WAAW,sBAAiB;IAErD,OAAO,CAAC,QAAQ,CAA6C;IAEhD,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAuB7F,uFAAuF;IACjE,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI7G,OAAO,CAAC,eAAe;CAO1B;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
@@ -0,0 +1,69 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { RegisterClass } from '@memberjunction/global';
8
+ import { DiscoverComposerTriggerProviders } from '@memberjunction/ng-composer';
9
+ import { OmnibarProvider, OMNIBAR_NAV_KEY } from '../omnibar-provider';
10
+ /** The conversations composer plugin this provider delegates to (when present). */
11
+ const AGENT_MENTIONS_KEY = 'agent-mentions';
12
+ /**
13
+ * '@' — talk to an agent: opens Conversations pre-addressed. Suggestion data comes
14
+ * from the conversations package's own `agent-mentions` composer plugin, resolved
15
+ * FROM THE COMPOSER REGISTRY AT QUERY TIME — no compile-time dependency on
16
+ * ng-conversations, and graceful [] when the plugin isn't registered (e.g. a
17
+ * deployment without the conversations package).
18
+ */
19
+ let OmnibarAgentProvider = class OmnibarAgentProvider extends OmnibarProvider {
20
+ TriggerChar = '@';
21
+ Key = 'omnibar-agents';
22
+ Priority = 30;
23
+ ModeLabel = 'Talk to an Agent';
24
+ Placeholder = 'Agent name…';
25
+ delegate;
26
+ async GetSuggestions(request) {
27
+ const inner = this.resolveDelegate();
28
+ if (!inner) {
29
+ return [];
30
+ }
31
+ try {
32
+ const suggestions = await inner.GetSuggestions(request);
33
+ // Agents only (the plugin also yields users); re-tag with the palette nav payload.
34
+ return suggestions
35
+ .filter((s) => s.type === 'agent')
36
+ .map((s) => {
37
+ const nav = { kind: 'agent', agentName: s.name };
38
+ return {
39
+ ...s,
40
+ description: s.description ? `${s.description} · opens chat pre-addressed` : 'Opens chat pre-addressed',
41
+ data: { ...(s.data ?? {}), [OMNIBAR_NAV_KEY]: nav, group: 'Agents' },
42
+ };
43
+ });
44
+ }
45
+ catch {
46
+ return [];
47
+ }
48
+ }
49
+ /** Empty '@' = the full permission-filtered agent list (delegate with empty query). */
50
+ async EmptyStateSuggestions(request) {
51
+ return this.GetSuggestions({ ...request, Query: '' });
52
+ }
53
+ resolveDelegate() {
54
+ if (this.delegate !== undefined) {
55
+ return this.delegate;
56
+ }
57
+ this.delegate = DiscoverComposerTriggerProviders().find((p) => p.Key === AGENT_MENTIONS_KEY) ?? null;
58
+ return this.delegate;
59
+ }
60
+ };
61
+ OmnibarAgentProvider = __decorate([
62
+ RegisterClass(OmnibarProvider, 'omnibar-agents')
63
+ ], OmnibarAgentProvider);
64
+ export { OmnibarAgentProvider };
65
+ /** Tree-shaking guard — referenced by LoadOmnibarProviders(). */
66
+ export function LoadOmnibarAgentProvider() {
67
+ // intentional no-op
68
+ }
69
+ //# sourceMappingURL=omnibar-agent.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnibar-agent.provider.js","sourceRoot":"","sources":["../../../../src/lib/omnibar/providers/omnibar-agent.provider.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gCAAgC,EAA2B,MAAM,6BAA6B,CAAC;AAExG,OAAO,EAAE,eAAe,EAAE,eAAe,EAAqB,MAAM,qBAAqB,CAAC;AAE1F,mFAAmF;AACnF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C;;;;;;GAMG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,eAAe;IACrC,WAAW,GAAG,GAAG,CAAC;IAClB,GAAG,GAAG,gBAAgB,CAAC;IACd,QAAQ,GAAG,EAAE,CAAC;IACvB,SAAS,GAAG,kBAAkB,CAAC;IACtB,WAAW,GAAG,aAAa,CAAC;IAE7C,QAAQ,CAA6C;IAEtD,KAAK,CAAC,cAAc,CAAC,OAAkC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACxD,mFAAmF;YACnF,OAAO,WAAW;iBACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACP,MAAM,GAAG,GAAsB,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpE,OAAO;oBACH,GAAG,CAAC;oBACJ,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,6BAA6B,CAAC,CAAC,CAAC,0BAA0B;oBACvG,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;iBAC3C,CAAC;YAClC,CAAC,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED,uFAAuF;IACvE,KAAK,CAAC,qBAAqB,CAAC,OAAkC;QAC1E,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAEO,eAAe;QACnB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,gCAAgC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACrG,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ,CAAA;AA5CY,oBAAoB;IADhC,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC;GACpC,oBAAoB,CA4ChC;;AAED,iEAAiE;AACjE,MAAM,UAAU,wBAAwB;IACpC,oBAAoB;AACxB,CAAC","sourcesContent":["import { RegisterClass } from '@memberjunction/global';\nimport { DiscoverComposerTriggerProviders, ComposerTriggerProvider } from '@memberjunction/ng-composer';\nimport type { MentionSuggestion, ComposerSuggestionRequest } from '@memberjunction/ng-composer';\nimport { OmnibarProvider, OMNIBAR_NAV_KEY, OmnibarNavPayload } from '../omnibar-provider';\n\n/** The conversations composer plugin this provider delegates to (when present). */\nconst AGENT_MENTIONS_KEY = 'agent-mentions';\n\n/**\n * '@' — talk to an agent: opens Conversations pre-addressed. Suggestion data comes\n * from the conversations package's own `agent-mentions` composer plugin, resolved\n * FROM THE COMPOSER REGISTRY AT QUERY TIME — no compile-time dependency on\n * ng-conversations, and graceful [] when the plugin isn't registered (e.g. a\n * deployment without the conversations package).\n */\n@RegisterClass(OmnibarProvider, 'omnibar-agents')\nexport class OmnibarAgentProvider extends OmnibarProvider {\n public readonly TriggerChar = '@';\n public readonly Key = 'omnibar-agents';\n public override readonly Priority = 30;\n public readonly ModeLabel = 'Talk to an Agent';\n public override readonly Placeholder = 'Agent name…';\n\n private delegate: ComposerTriggerProvider | null | undefined;\n\n public async GetSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]> {\n const inner = this.resolveDelegate();\n if (!inner) {\n return [];\n }\n try {\n const suggestions = await inner.GetSuggestions(request);\n // Agents only (the plugin also yields users); re-tag with the palette nav payload.\n return suggestions\n .filter((s) => s.type === 'agent')\n .map((s) => {\n const nav: OmnibarNavPayload = { kind: 'agent', agentName: s.name };\n return {\n ...s,\n description: s.description ? `${s.description} · opens chat pre-addressed` : 'Opens chat pre-addressed',\n data: { ...(s.data ?? {}), [OMNIBAR_NAV_KEY]: nav, group: 'Agents' },\n } satisfies MentionSuggestion;\n });\n } catch {\n return [];\n }\n }\n\n /** Empty '@' = the full permission-filtered agent list (delegate with empty query). */\n public override async EmptyStateSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]> {\n return this.GetSuggestions({ ...request, Query: '' });\n }\n\n private resolveDelegate(): ComposerTriggerProvider | null {\n if (this.delegate !== undefined) {\n return this.delegate;\n }\n this.delegate = DiscoverComposerTriggerProviders().find((p) => p.Key === AGENT_MENTIONS_KEY) ?? null;\n return this.delegate;\n }\n}\n\n/** Tree-shaking guard — referenced by LoadOmnibarProviders(). */\nexport function LoadOmnibarAgentProvider(): void {\n // intentional no-op\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import type { MentionSuggestion, ComposerSuggestionRequest } from '@memberjunction/ng-composer';
2
+ import { OmnibarProvider } from '../omnibar-provider';
3
+ /**
4
+ * '/' — commands: switch apps and jump to their nav items. Absorbs the old Ctrl+/
5
+ * app command palette: same fuzzy scoring philosophy (exact > starts-with >
6
+ * contains > description > initials) and the same UserInfoEngine-persisted recent
7
+ * apps (via CommandPaletteService, which stays as the recents engine).
8
+ */
9
+ export declare class OmnibarCommandProvider extends OmnibarProvider {
10
+ readonly TriggerChar = "/";
11
+ readonly Key = "omnibar-commands";
12
+ readonly Priority = 40;
13
+ readonly ModeLabel = "Go to App";
14
+ readonly Placeholder = "App or destination\u2026";
15
+ GetSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]>;
16
+ /** Empty '/' query = recent apps first, then the full app list. */
17
+ EmptyStateSuggestions(request: ComposerSuggestionRequest): Promise<MentionSuggestion[]>;
18
+ private loadApps;
19
+ private appSuggestion;
20
+ private navItemSuggestions;
21
+ /**
22
+ * Fuzzy scoring, same tiers as the retired Ctrl+/ palette component:
23
+ * exact 1000 · starts-with 500 · contains 100 · description 50 · initials 25.
24
+ */
25
+ private matchScore;
26
+ }
27
+ /** Tree-shaking guard — referenced by LoadOmnibarProviders(). */
28
+ export declare function LoadOmnibarCommandProvider(): void;
29
+ //# sourceMappingURL=omnibar-command.provider.d.ts.map