@athenaintel/react 0.59.0 → 0.60.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 (118) hide show
  1. package/README.md +52 -19
  2. package/dist/agent-runtime/src/composer-markdown.cjs +0 -16
  3. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  4. package/dist/agent-runtime/src/composer-markdown.js +1 -17
  5. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  6. package/dist/agent-runtime/src/named-agents.js +1 -1
  7. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  8. package/dist/agent-runtime/src/offline-status.d.ts +27 -0
  9. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  10. package/dist/agent-runtime/src/tool-metadata.cjs +7 -0
  11. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  12. package/dist/agent-runtime/src/tool-metadata.js +7 -0
  13. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  14. package/dist/chat/AthenaChat.cjs +15 -5
  15. package/dist/chat/AthenaChat.cjs.map +1 -1
  16. package/dist/chat/AthenaChat.js +16 -6
  17. package/dist/chat/AthenaChat.js.map +1 -1
  18. package/dist/chat-ui/index.cjs +2 -0
  19. package/dist/chat-ui/index.cjs.map +1 -1
  20. package/dist/chat-ui/index.d.ts +1 -0
  21. package/dist/chat-ui/index.js +2 -0
  22. package/dist/chat-ui/index.js.map +1 -1
  23. package/dist/chat-ui/mentions/mention-chip.cjs +9 -3
  24. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  25. package/dist/chat-ui/mentions/mention-chip.js +9 -3
  26. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  27. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +18 -2
  28. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  29. package/dist/chat-ui/mentions/suggestions/components/mention-icon.d.ts +10 -1
  30. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +19 -3
  31. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  32. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +9 -0
  33. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  34. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +6 -0
  35. package/dist/chat-ui/mentions/suggestions/data/api-client.js +9 -0
  36. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  37. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs +89 -0
  38. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs.map +1 -0
  39. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.d.ts +8 -0
  40. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js +89 -0
  41. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js.map +1 -0
  42. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +140 -116
  43. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
  44. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.d.ts +46 -12
  45. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +141 -117
  46. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
  47. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +37 -6
  48. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  49. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +39 -8
  50. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  51. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs +12 -0
  52. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs.map +1 -0
  53. package/dist/chat-ui/mentions/use-asset-icon-app-url.d.ts +8 -0
  54. package/dist/chat-ui/mentions/use-asset-icon-app-url.js +12 -0
  55. package/dist/chat-ui/mentions/use-asset-icon-app-url.js.map +1 -0
  56. package/dist/collab/client.cjs +24 -1
  57. package/dist/collab/client.cjs.map +1 -1
  58. package/dist/collab/client.d.ts +16 -0
  59. package/dist/collab/client.js +24 -1
  60. package/dist/collab/client.js.map +1 -1
  61. package/dist/composer/attached-references.js +1 -1
  62. package/dist/composer/staged-message-metadata.cjs +12 -0
  63. package/dist/composer/staged-message-metadata.cjs.map +1 -0
  64. package/dist/composer/staged-message-metadata.d.ts +15 -0
  65. package/dist/composer/staged-message-metadata.js +12 -0
  66. package/dist/composer/staged-message-metadata.js.map +1 -0
  67. package/dist/data/athena-request.cjs +2 -0
  68. package/dist/data/athena-request.cjs.map +1 -1
  69. package/dist/data/athena-request.js +2 -0
  70. package/dist/data/athena-request.js.map +1 -1
  71. package/dist/provider/AthenaProvider.cjs +4 -3
  72. package/dist/provider/AthenaProvider.cjs.map +1 -1
  73. package/dist/provider/AthenaProvider.js +4 -3
  74. package/dist/provider/AthenaProvider.js.map +1 -1
  75. package/dist/react/package.json.cjs +1 -1
  76. package/dist/react/package.json.js +1 -1
  77. package/dist/references/src/anchors/parse.cjs +11 -1
  78. package/dist/references/src/anchors/parse.cjs.map +1 -1
  79. package/dist/references/src/anchors/parse.js +11 -1
  80. package/dist/references/src/anchors/parse.js.map +1 -1
  81. package/dist/references/src/anchors/schemas.d.ts +1 -0
  82. package/dist/references/src/anchors/serialize.cjs +1 -0
  83. package/dist/references/src/anchors/serialize.cjs.map +1 -1
  84. package/dist/references/src/anchors/serialize.js +1 -0
  85. package/dist/references/src/anchors/serialize.js.map +1 -1
  86. package/dist/references/src/anchors/types.cjs.map +1 -1
  87. package/dist/references/src/anchors/types.d.ts +9 -0
  88. package/dist/references/src/anchors/types.js.map +1 -1
  89. package/dist/references/src/schemas.d.ts +2 -0
  90. package/dist/runtime/useAthenaStatewireRuntime.cjs +6 -8
  91. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  92. package/dist/runtime/useAthenaStatewireRuntime.js +6 -8
  93. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  94. package/dist/threads/statewire-thread-list.cjs +14 -2
  95. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  96. package/dist/threads/statewire-thread-list.d.ts +11 -2
  97. package/dist/threads/statewire-thread-list.js +14 -2
  98. package/dist/threads/statewire-thread-list.js.map +1 -1
  99. package/dist/tools/drive-tool-uis.cjs +8 -4
  100. package/dist/tools/drive-tool-uis.cjs.map +1 -1
  101. package/dist/tools/drive-tool-uis.d.ts +5 -4
  102. package/dist/tools/drive-tool-uis.js +9 -5
  103. package/dist/tools/drive-tool-uis.js.map +1 -1
  104. package/dist/version.cjs +4 -0
  105. package/dist/version.cjs.map +1 -1
  106. package/dist/version.d.ts +9 -0
  107. package/dist/version.js +4 -0
  108. package/dist/version.js.map +1 -1
  109. package/dist/workbench/live-desktop-api.cjs +2 -1
  110. package/dist/workbench/live-desktop-api.cjs.map +1 -1
  111. package/dist/workbench/live-desktop-api.js +2 -1
  112. package/dist/workbench/live-desktop-api.js.map +1 -1
  113. package/dist/workbench/session-workspace-api.cjs +7 -2
  114. package/dist/workbench/session-workspace-api.cjs.map +1 -1
  115. package/dist/workbench/session-workspace-api.d.ts +10 -0
  116. package/dist/workbench/session-workspace-api.js +7 -2
  117. package/dist/workbench/session-workspace-api.js.map +1 -1
  118. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
+ const require$$0 = require("react");
4
5
  const lucideReact = require("lucide-react");
5
6
  const ICON_MAP = {
6
7
  // General
@@ -76,14 +77,28 @@ function resolveMentionIcon(name) {
76
77
  return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];
77
78
  }
78
79
  const ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;
80
+ function useThumbnailLoadFailure(url) {
81
+ const [failedUrl, setFailedUrl] = require$$0.useState();
82
+ const imageRef = require$$0.useCallback(
83
+ (image) => {
84
+ if (!image || !url) return void 0;
85
+ const fail = () => setFailedUrl(url);
86
+ image.addEventListener("error", fail);
87
+ return () => image.removeEventListener("error", fail);
88
+ },
89
+ [url]
90
+ );
91
+ return { failed: !!url && failedUrl === url, imageRef };
92
+ }
79
93
  function MentionIcon({
80
94
  fallbackIcon,
81
95
  thumbnailUrl,
82
96
  alt,
83
97
  className = "w-4 h-4 flex-shrink-0"
84
98
  }) {
85
- if (thumbnailUrl) {
86
- return /* @__PURE__ */ jsxRuntime.jsx("img", { src: thumbnailUrl, alt: alt ?? "", className });
99
+ const thumbnail = useThumbnailLoadFailure(thumbnailUrl);
100
+ if (thumbnailUrl && !thumbnail.failed) {
101
+ return /* @__PURE__ */ jsxRuntime.jsx("img", { ref: thumbnail.imageRef, src: thumbnailUrl, alt: alt ?? "", className });
87
102
  }
88
103
  const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : void 0;
89
104
  if (Icon) return /* @__PURE__ */ jsxRuntime.jsx(Icon, { className });
@@ -94,4 +109,5 @@ function MentionIcon({
94
109
  }
95
110
  exports.MentionIcon = MentionIcon;
96
111
  exports.resolveMentionIcon = resolveMentionIcon;
112
+ exports.useThumbnailLoadFailure = useThumbnailLoadFailure;
97
113
  //# sourceMappingURL=mention-icon.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mention-icon.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport type { FC } from \"react\";\nimport {\n BookOpenIcon,\n BotIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n // The agents a message can name (the Agents section).\n bot: BotIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n if (thumbnailUrl) {\n return <img src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":["FileIcon","FileTextIcon","FileCodeIcon","FolderIcon","FolderKanbanIcon","GlobeIcon","SearchIcon","StarIcon","UsersIcon","UserIcon","BotIcon","WrenchIcon","PackageIcon","Building2Icon","HardDriveIcon","LayoutGridIcon","ZapIcon","EyeIcon","CameraIcon","KeyboardIcon","CodeIcon","MonitorIcon","ImageIcon","VideoIcon","HeadphonesIcon","MicIcon","MailIcon","CalendarIcon","PhoneIcon","DatabaseIcon","TableIcon","SheetIcon","PaletteIcon","PenToolIcon","LayoutIcon","LayoutDashboardIcon","LibraryIcon","BookOpenIcon","SparklesIcon","CheckSquareIcon","KeyIcon","SmartphoneIcon","CloudIcon","WorkflowIcon","PresentationIcon","BoxesIcon","BriefcaseBusinessIcon","CableIcon","ChartBarIcon","Code2Icon","FileSpreadsheetIcon","MegaphoneIcon","MessageSquareIcon","PanelTopIcon","ServerIcon","SettingsIcon","Table2Icon","TerminalIcon","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"mention-icon.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport { useCallback, useState, type FC } from \"react\";\nimport {\n BookOpenIcon,\n BotIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n // The agents a message can name (the Agents section).\n bot: BotIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\n/**\n * Whether the thumbnail at `url` failed to load (a strict CSP, offline, a\n * host copy without that file), read from the image's own `error` event:\n * attach `imageRef` to the `<img>`. A new `url` is tried afresh.\n */\nexport function useThumbnailLoadFailure(url: string | undefined): {\n failed: boolean;\n imageRef: (image: HTMLImageElement | null) => (() => void) | undefined;\n} {\n const [failedUrl, setFailedUrl] = useState<string>();\n const imageRef = useCallback(\n (image: HTMLImageElement | null) => {\n if (!image || !url) return undefined;\n const fail = () => setFailedUrl(url);\n image.addEventListener(\"error\", fail);\n return () => image.removeEventListener(\"error\", fail);\n },\n [url],\n );\n return { failed: !!url && failedUrl === url, imageRef };\n}\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n // A thumbnail that cannot load gives way to the fallback icon rather than a\n // broken image.\n const thumbnail = useThumbnailLoadFailure(thumbnailUrl);\n if (thumbnailUrl && !thumbnail.failed) {\n return <img ref={thumbnail.imageRef} src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":["FileIcon","FileTextIcon","FileCodeIcon","FolderIcon","FolderKanbanIcon","GlobeIcon","SearchIcon","StarIcon","UsersIcon","UserIcon","BotIcon","WrenchIcon","PackageIcon","Building2Icon","HardDriveIcon","LayoutGridIcon","ZapIcon","EyeIcon","CameraIcon","KeyboardIcon","CodeIcon","MonitorIcon","ImageIcon","VideoIcon","HeadphonesIcon","MicIcon","MailIcon","CalendarIcon","PhoneIcon","DatabaseIcon","TableIcon","SheetIcon","PaletteIcon","PenToolIcon","LayoutIcon","LayoutDashboardIcon","LibraryIcon","BookOpenIcon","SparklesIcon","CheckSquareIcon","KeyIcon","SmartphoneIcon","CloudIcon","WorkflowIcon","PresentationIcon","BoxesIcon","BriefcaseBusinessIcon","CableIcon","ChartBarIcon","Code2Icon","FileSpreadsheetIcon","MegaphoneIcon","MessageSquareIcon","PanelTopIcon","ServerIcon","SettingsIcon","Table2Icon","TerminalIcon","useState","useCallback","jsx"],"mappings":"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"}
@@ -2,11 +2,20 @@
2
2
  * Mention icon component.
3
3
  * Maps string icon names to Lucide icon components.
4
4
  */
5
- import type { FC } from "react";
5
+ import { type FC } from "react";
6
6
  /** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */
7
7
  export declare function resolveMentionIcon(name: string): FC<{
8
8
  className?: string;
9
9
  }> | undefined;
10
+ /**
11
+ * Whether the thumbnail at `url` failed to load (a strict CSP, offline, a
12
+ * host copy without that file), read from the image's own `error` event:
13
+ * attach `imageRef` to the `<img>`. A new `url` is tried afresh.
14
+ */
15
+ export declare function useThumbnailLoadFailure(url: string | undefined): {
16
+ failed: boolean;
17
+ imageRef: (image: HTMLImageElement | null) => (() => void) | undefined;
18
+ };
10
19
  export declare function MentionIcon({ fallbackIcon, thumbnailUrl, alt, className, }: {
11
20
  fallbackIcon?: string;
12
21
  thumbnailUrl?: string;
@@ -1,4 +1,5 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import { useState, useCallback } from "react";
2
3
  import { FileIcon, TerminalIcon, Table2Icon, SettingsIcon, ServerIcon, PanelTopIcon, MessageSquareIcon, MegaphoneIcon, FileSpreadsheetIcon, Code2Icon, ChartBarIcon, CableIcon, BriefcaseBusinessIcon, BoxesIcon, PresentationIcon, WorkflowIcon, CloudIcon, SmartphoneIcon, KeyIcon, CheckSquareIcon, SparklesIcon, BookOpenIcon, LibraryIcon, LayoutDashboardIcon, LayoutIcon, PenToolIcon, PaletteIcon, SheetIcon, TableIcon, DatabaseIcon, PhoneIcon, CalendarIcon, MailIcon, MicIcon, HeadphonesIcon, VideoIcon, ImageIcon, MonitorIcon, CodeIcon, KeyboardIcon, CameraIcon, EyeIcon, ZapIcon, LayoutGridIcon, HardDriveIcon, Building2Icon, PackageIcon, WrenchIcon, BotIcon, UserIcon, UsersIcon, StarIcon, SearchIcon, GlobeIcon, FolderKanbanIcon, FolderIcon, FileCodeIcon, FileTextIcon } from "lucide-react";
3
4
  const ICON_MAP = {
4
5
  // General
@@ -74,14 +75,28 @@ function resolveMentionIcon(name) {
74
75
  return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];
75
76
  }
76
77
  const ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;
78
+ function useThumbnailLoadFailure(url) {
79
+ const [failedUrl, setFailedUrl] = useState();
80
+ const imageRef = useCallback(
81
+ (image) => {
82
+ if (!image || !url) return void 0;
83
+ const fail = () => setFailedUrl(url);
84
+ image.addEventListener("error", fail);
85
+ return () => image.removeEventListener("error", fail);
86
+ },
87
+ [url]
88
+ );
89
+ return { failed: !!url && failedUrl === url, imageRef };
90
+ }
77
91
  function MentionIcon({
78
92
  fallbackIcon,
79
93
  thumbnailUrl,
80
94
  alt,
81
95
  className = "w-4 h-4 flex-shrink-0"
82
96
  }) {
83
- if (thumbnailUrl) {
84
- return /* @__PURE__ */ jsx("img", { src: thumbnailUrl, alt: alt ?? "", className });
97
+ const thumbnail = useThumbnailLoadFailure(thumbnailUrl);
98
+ if (thumbnailUrl && !thumbnail.failed) {
99
+ return /* @__PURE__ */ jsx("img", { ref: thumbnail.imageRef, src: thumbnailUrl, alt: alt ?? "", className });
85
100
  }
86
101
  const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : void 0;
87
102
  if (Icon) return /* @__PURE__ */ jsx(Icon, { className });
@@ -92,6 +107,7 @@ function MentionIcon({
92
107
  }
93
108
  export {
94
109
  MentionIcon,
95
- resolveMentionIcon
110
+ resolveMentionIcon,
111
+ useThumbnailLoadFailure
96
112
  };
97
113
  //# sourceMappingURL=mention-icon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mention-icon.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport type { FC } from \"react\";\nimport {\n BookOpenIcon,\n BotIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n // The agents a message can name (the Agents section).\n bot: BotIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n if (thumbnailUrl) {\n return <img src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":[],"mappings":";;AAmEA,MAAM,WAAuD;AAAA;AAAA,EAE3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA;AAAA,EAEN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd,eAAe;AAAA,EACf,KAAK;AAAA,EACL,KAAK;AAAA;AAAA,EAGL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAEV,cAAc;AAAA;AAAA;AAAA,EAId,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AACZ;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,YAAA;AACL;AAGO,SAAS,mBAAmB,MAAsD;AACvF,SAAO,SAAS,IAAI,KAAK,SAAS,gBAAgB,IAAI,CAAC;AACzD;AAEA,MAAM,oBAAoB;AAEnB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAKG;AACD,MAAI,cAAc;AAChB,+BAAQ,OAAA,EAAI,KAAK,cAAc,KAAK,OAAO,IAAI,WAAsB;AAAA,EACvE;AACA,QAAM,OAAO,eAAe,mBAAmB,YAAY,IAAI;AAC/D,MAAI,KAAM,QAAO,oBAAC,MAAA,EAAK,UAAA,CAAsB;AAE7C,MAAI,gBAAgB,CAAC,kBAAkB,KAAK,YAAY,GAAG;AACzD,WAAO,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,cAAa;AAAA,EAC/D;AACA,SAAO,oBAAC,YAAS,WAAsB;AACzC;"}
1
+ {"version":3,"file":"mention-icon.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-icon.tsx"],"sourcesContent":["/**\n * Mention icon component.\n * Maps string icon names to Lucide icon components.\n */\n\nimport { useCallback, useState, type FC } from \"react\";\nimport {\n BookOpenIcon,\n BotIcon,\n BoxesIcon,\n BriefcaseBusinessIcon,\n Building2Icon,\n CableIcon,\n CalendarIcon,\n CameraIcon,\n ChartBarIcon,\n CheckSquareIcon,\n Code2Icon,\n FileSpreadsheetIcon,\n MegaphoneIcon,\n MessageSquareIcon,\n PanelTopIcon,\n PresentationIcon,\n ServerIcon,\n SettingsIcon,\n Table2Icon,\n TerminalIcon,\n CloudIcon,\n CodeIcon,\n DatabaseIcon,\n EyeIcon,\n FileCodeIcon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderKanbanIcon,\n GlobeIcon,\n HardDriveIcon,\n HeadphonesIcon,\n ImageIcon,\n KeyIcon,\n KeyboardIcon,\n LayoutDashboardIcon,\n LayoutGridIcon,\n LayoutIcon,\n LibraryIcon,\n MailIcon,\n MicIcon,\n MonitorIcon,\n PackageIcon,\n PaletteIcon,\n PenToolIcon,\n PhoneIcon,\n SearchIcon,\n SheetIcon,\n SmartphoneIcon,\n SparklesIcon,\n StarIcon,\n TableIcon,\n UserIcon,\n UsersIcon,\n VideoIcon,\n WrenchIcon,\n ZapIcon,\n WorkflowIcon,\n} from \"lucide-react\";\n\nconst ICON_MAP: Record<string, FC<{ className?: string }>> = {\n // General\n file: FileIcon,\n \"file-text\": FileTextIcon,\n \"file-code\": FileCodeIcon,\n folder: FolderIcon,\n \"folder-kanban\": FolderKanbanIcon,\n globe: GlobeIcon,\n search: SearchIcon,\n star: StarIcon,\n users: UsersIcon,\n user: UserIcon,\n // The agents a message can name (the Agents section).\n bot: BotIcon,\n wrench: WrenchIcon,\n package: PackageIcon,\n building2: Building2Icon,\n \"hard-drive\": HardDriveIcon,\n \"layout-grid\": LayoutGridIcon,\n zap: ZapIcon,\n eye: EyeIcon,\n\n // Chrome tools\n camera: CameraIcon,\n keyboard: KeyboardIcon,\n code: CodeIcon,\n monitor: MonitorIcon,\n\n // Asset types\n image: ImageIcon,\n video: VideoIcon,\n headphones: HeadphonesIcon,\n mic: MicIcon,\n mail: MailIcon,\n calendar: CalendarIcon,\n phone: PhoneIcon,\n database: DatabaseIcon,\n table: TableIcon,\n sheet: SheetIcon,\n palette: PaletteIcon,\n \"pen-tool\": PenToolIcon,\n layout: LayoutIcon,\n \"layout-dashboard\": LayoutDashboardIcon,\n library: LibraryIcon,\n \"book-open\": BookOpenIcon,\n sparkles: SparklesIcon,\n \"check-square\": CheckSquareIcon,\n key: KeyIcon,\n smartphone: SmartphoneIcon,\n cloud: CloudIcon,\n workflow: WorkflowIcon,\n // The presentation asset type and the presentation toolkits share this key.\n presentation: PresentationIcon,\n\n // Toolkit icons (the SDK's toolkit display info names these in PascalCase;\n // the digit-suffixed ones kebab-case to `code2` / `table2`)\n boxes: BoxesIcon,\n \"briefcase-business\": BriefcaseBusinessIcon,\n cable: CableIcon,\n \"chart-bar\": ChartBarIcon,\n code2: Code2Icon,\n \"file-spreadsheet\": FileSpreadsheetIcon,\n megaphone: MegaphoneIcon,\n \"message-square\": MessageSquareIcon,\n \"panel-top\": PanelTopIcon,\n server: ServerIcon,\n settings: SettingsIcon,\n table2: Table2Icon,\n terminal: TerminalIcon,\n};\n\n/** Backend icon names arrive as Lucide PascalCase (`FolderKanban`). */\nfunction toKebabIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/** The Lucide component for an icon name (kebab or PascalCase), or undefined for an unknown name. */\nexport function resolveMentionIcon(name: string): FC<{ className?: string }> | undefined {\n return ICON_MAP[name] ?? ICON_MAP[toKebabIconName(name)];\n}\n\nconst ICON_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9-]*$/;\n\n/**\n * Whether the thumbnail at `url` failed to load (a strict CSP, offline, a\n * host copy without that file), read from the image's own `error` event:\n * attach `imageRef` to the `<img>`. A new `url` is tried afresh.\n */\nexport function useThumbnailLoadFailure(url: string | undefined): {\n failed: boolean;\n imageRef: (image: HTMLImageElement | null) => (() => void) | undefined;\n} {\n const [failedUrl, setFailedUrl] = useState<string>();\n const imageRef = useCallback(\n (image: HTMLImageElement | null) => {\n if (!image || !url) return undefined;\n const fail = () => setFailedUrl(url);\n image.addEventListener(\"error\", fail);\n return () => image.removeEventListener(\"error\", fail);\n },\n [url],\n );\n return { failed: !!url && failedUrl === url, imageRef };\n}\n\nexport function MentionIcon({\n fallbackIcon,\n thumbnailUrl,\n alt,\n className = \"w-4 h-4 flex-shrink-0\",\n}: {\n fallbackIcon?: string;\n thumbnailUrl?: string;\n alt?: string;\n className?: string;\n}) {\n // A thumbnail that cannot load gives way to the fallback icon rather than a\n // broken image.\n const thumbnail = useThumbnailLoadFailure(thumbnailUrl);\n if (thumbnailUrl && !thumbnail.failed) {\n return <img ref={thumbnail.imageRef} src={thumbnailUrl} alt={alt ?? \"\"} className={className} />;\n }\n const Icon = fallbackIcon ? resolveMentionIcon(fallbackIcon) : undefined;\n if (Icon) return <Icon className={className} />;\n // Emoji fallback; unmapped icon names render as the generic file icon\n if (fallbackIcon && !ICON_NAME_PATTERN.test(fallbackIcon)) {\n return <span className=\"text-sm flex-shrink-0\">{fallbackIcon}</span>;\n }\n return <FileIcon className={className} />;\n}\n"],"names":[],"mappings":";;;AAmEA,MAAM,WAAuD;AAAA;AAAA,EAE3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA;AAAA,EAEN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd,eAAe;AAAA,EACf,KAAK;AAAA,EACL,KAAK;AAAA;AAAA,EAGL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAEV,cAAc;AAAA;AAAA;AAAA,EAId,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AACZ;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,YAAA;AACL;AAGO,SAAS,mBAAmB,MAAsD;AACvF,SAAO,SAAS,IAAI,KAAK,SAAS,gBAAgB,IAAI,CAAC;AACzD;AAEA,MAAM,oBAAoB;AAOnB,SAAS,wBAAwB,KAGtC;AACA,QAAM,CAAC,WAAW,YAAY,IAAI,SAAA;AAClC,QAAM,WAAW;AAAA,IACf,CAAC,UAAmC;AAClC,UAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAC3B,YAAM,OAAO,MAAM,aAAa,GAAG;AACnC,YAAM,iBAAiB,SAAS,IAAI;AACpC,aAAO,MAAM,MAAM,oBAAoB,SAAS,IAAI;AAAA,IACtD;AAAA,IACA,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,cAAc,KAAK,SAAA;AAC/C;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAKG;AAGD,QAAM,YAAY,wBAAwB,YAAY;AACtD,MAAI,gBAAgB,CAAC,UAAU,QAAQ;AACrC,WAAO,oBAAC,OAAA,EAAI,KAAK,UAAU,UAAU,KAAK,cAAc,KAAK,OAAO,IAAI,UAAA,CAAsB;AAAA,EAChG;AACA,QAAM,OAAO,eAAe,mBAAmB,YAAY,IAAI;AAC/D,MAAI,KAAM,QAAO,oBAAC,MAAA,EAAK,UAAA,CAAsB;AAE7C,MAAI,gBAAgB,CAAC,kBAAkB,KAAK,YAAY,GAAG;AACzD,WAAO,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,cAAa;AAAA,EAC/D;AACA,SAAO,oBAAC,YAAS,WAAsB;AACzC;"}
@@ -118,6 +118,14 @@ const PAGINATED_ASSETS_QUERY = `
118
118
  }
119
119
  }
120
120
  `;
121
+ const MENTION_EMAIL_METADATA_QUERY = `
122
+ query MentionEmailMetadata($assetIds: [String!]!) {
123
+ getAssetsByIds(assetIds: $assetIds, withMetadata: true) {
124
+ id
125
+ athenaMetadata
126
+ }
127
+ }
128
+ `;
121
129
  const WORKSPACE_MEMBERS_QUERY = `
122
130
  query GetUsersInWorkspace($workspaceId: String!) {
123
131
  getUsersInWorkspace(workspaceId: $workspaceId) {
@@ -187,6 +195,7 @@ const TOOL_CATALOG_QUERY = `
187
195
  `;
188
196
  exports.AthenaGraphQLError = AthenaGraphQLError;
189
197
  exports.MENTION_ASSET_FIELDS = MENTION_ASSET_FIELDS;
198
+ exports.MENTION_EMAIL_METADATA_QUERY = MENTION_EMAIL_METADATA_QUERY;
190
199
  exports.MentionAuthCtx = MentionAuthCtx;
191
200
  exports.PAGINATED_ASSETS_QUERY = PAGINATED_ASSETS_QUERY;
192
201
  exports.PERSON_MENTION_CANDIDATES_QUERY = PERSON_MENTION_CANDIDATES_QUERY;
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nexport const MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\n/**\n * The workspace's groups, listed under Team after the members (Olympus's\n * `MentionWorkspaceGroups`). An agora that predates groups refuses the query;\n * Team then lists the members alone.\n */\nexport const WORKSPACE_GROUPS_QUERY = `\n query MentionWorkspaceGroups($workspaceId: String!) {\n getWorkspaceGroups(workspaceId: $workspaceId) {\n id\n name\n slug\n memberCount\n archivedAt\n }\n }\n`;\n\n/**\n * The viewer's people, most recently talked to first: teammates and the people\n * they saved (Olympus's `PersonMentionCandidates`, docs/PERSON_GUIDE.md). Asked\n * for admins only while Person is in preview; agora's Person gate refuses\n * everyone else.\n */\nexport const PERSON_MENTION_CANDIDATES_QUERY = `\n query PersonMentionCandidates($limit: Int) {\n personMentionCandidates(limit: $limit) {\n email\n displayName\n userId\n savedPersonAssetId\n photoUrl\n lastInteractionAt\n }\n }\n`;\n\n/** Whether the viewer is an Athena admin: who the Agents section and the ranked people are offered to. */\nexport const VIEWER_IS_ADMIN_QUERY = `\n query MentionViewerIsAdmin {\n getCurrentUserWithWorkspace {\n user {\n isAdmin\n }\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n\nexport interface WorkspaceGroup {\n id: string;\n name: string;\n slug: string | null;\n memberCount: number;\n archivedAt: string | null;\n}\n\nexport interface PersonMentionCandidate {\n email: string;\n displayName: string;\n userId: string | null;\n savedPersonAssetId: string | null;\n photoUrl: string | null;\n lastInteractionAt: string | null;\n}\n\nexport interface ViewerIsAdminResult {\n getCurrentUserWithWorkspace: { user: { isAdmin: boolean } } | null;\n}\n"],"names":["createContext","useContext","requestAuth"],"mappings":"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"}
1
+ {"version":3,"file":"api-client.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nexport const MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\n/**\n * The metadata of the email rows a page lists, read for those rows alone so\n * the search stays slim: it names their mailbox, whose logo the row draws\n * (`emailProviderThumb`). Ids the caller may not read are left out.\n */\nexport const MENTION_EMAIL_METADATA_QUERY = `\n query MentionEmailMetadata($assetIds: [String!]!) {\n getAssetsByIds(assetIds: $assetIds, withMetadata: true) {\n id\n athenaMetadata\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\n/**\n * The workspace's groups, listed under Team after the members (Olympus's\n * `MentionWorkspaceGroups`). An agora that predates groups refuses the query;\n * Team then lists the members alone.\n */\nexport const WORKSPACE_GROUPS_QUERY = `\n query MentionWorkspaceGroups($workspaceId: String!) {\n getWorkspaceGroups(workspaceId: $workspaceId) {\n id\n name\n slug\n memberCount\n archivedAt\n }\n }\n`;\n\n/**\n * The viewer's people, most recently talked to first: teammates and the people\n * they saved (Olympus's `PersonMentionCandidates`, docs/PERSON_GUIDE.md). Asked\n * for admins only while Person is in preview; agora's Person gate refuses\n * everyone else.\n */\nexport const PERSON_MENTION_CANDIDATES_QUERY = `\n query PersonMentionCandidates($limit: Int) {\n personMentionCandidates(limit: $limit) {\n email\n displayName\n userId\n savedPersonAssetId\n photoUrl\n lastInteractionAt\n }\n }\n`;\n\n/** Whether the viewer is an Athena admin: who the Agents section and the ranked people are offered to. */\nexport const VIEWER_IS_ADMIN_QUERY = `\n query MentionViewerIsAdmin {\n getCurrentUserWithWorkspace {\n user {\n isAdmin\n }\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n\nexport interface WorkspaceGroup {\n id: string;\n name: string;\n slug: string | null;\n memberCount: number;\n archivedAt: string | null;\n}\n\nexport interface PersonMentionCandidate {\n email: string;\n displayName: string;\n userId: string | null;\n savedPersonAssetId: string | null;\n photoUrl: string | null;\n lastInteractionAt: string | null;\n}\n\nexport interface ViewerIsAdminResult {\n getCurrentUserWithWorkspace: { user: { isAdmin: boolean } } | null;\n}\n"],"names":["createContext","useContext","requestAuth"],"mappings":"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"}
@@ -60,6 +60,12 @@ export declare function fetchGraphQL<T = any>(auth: MentionAuthContext, query: s
60
60
  export declare const MENTION_ASSET_FIELDS = "\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n";
61
61
  export declare const SIMPLE_SEARCH_QUERY = "\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n \n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n\n }\n totalCount\n }\n }\n";
62
62
  export declare const PAGINATED_ASSETS_QUERY = "\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n \n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n\n }\n }\n";
63
+ /**
64
+ * The metadata of the email rows a page lists, read for those rows alone so
65
+ * the search stays slim: it names their mailbox, whose logo the row draws
66
+ * (`emailProviderThumb`). Ids the caller may not read are left out.
67
+ */
68
+ export declare const MENTION_EMAIL_METADATA_QUERY = "\n query MentionEmailMetadata($assetIds: [String!]!) {\n getAssetsByIds(assetIds: $assetIds, withMetadata: true) {\n id\n athenaMetadata\n }\n }\n";
63
69
  export declare const WORKSPACE_MEMBERS_QUERY = "\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n";
64
70
  /**
65
71
  * The workspace's groups, listed under Team after the members (Olympus's
@@ -116,6 +116,14 @@ const PAGINATED_ASSETS_QUERY = `
116
116
  }
117
117
  }
118
118
  `;
119
+ const MENTION_EMAIL_METADATA_QUERY = `
120
+ query MentionEmailMetadata($assetIds: [String!]!) {
121
+ getAssetsByIds(assetIds: $assetIds, withMetadata: true) {
122
+ id
123
+ athenaMetadata
124
+ }
125
+ }
126
+ `;
119
127
  const WORKSPACE_MEMBERS_QUERY = `
120
128
  query GetUsersInWorkspace($workspaceId: String!) {
121
129
  getUsersInWorkspace(workspaceId: $workspaceId) {
@@ -186,6 +194,7 @@ const TOOL_CATALOG_QUERY = `
186
194
  export {
187
195
  AthenaGraphQLError,
188
196
  MENTION_ASSET_FIELDS,
197
+ MENTION_EMAIL_METADATA_QUERY,
189
198
  MentionAuthCtx,
190
199
  PAGINATED_ASSETS_QUERY,
191
200
  PERSON_MENTION_CANDIDATES_QUERY,
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nexport const MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\n/**\n * The workspace's groups, listed under Team after the members (Olympus's\n * `MentionWorkspaceGroups`). An agora that predates groups refuses the query;\n * Team then lists the members alone.\n */\nexport const WORKSPACE_GROUPS_QUERY = `\n query MentionWorkspaceGroups($workspaceId: String!) {\n getWorkspaceGroups(workspaceId: $workspaceId) {\n id\n name\n slug\n memberCount\n archivedAt\n }\n }\n`;\n\n/**\n * The viewer's people, most recently talked to first: teammates and the people\n * they saved (Olympus's `PersonMentionCandidates`, docs/PERSON_GUIDE.md). Asked\n * for admins only while Person is in preview; agora's Person gate refuses\n * everyone else.\n */\nexport const PERSON_MENTION_CANDIDATES_QUERY = `\n query PersonMentionCandidates($limit: Int) {\n personMentionCandidates(limit: $limit) {\n email\n displayName\n userId\n savedPersonAssetId\n photoUrl\n lastInteractionAt\n }\n }\n`;\n\n/** Whether the viewer is an Athena admin: who the Agents section and the ranked people are offered to. */\nexport const VIEWER_IS_ADMIN_QUERY = `\n query MentionViewerIsAdmin {\n getCurrentUserWithWorkspace {\n user {\n isAdmin\n }\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n\nexport interface WorkspaceGroup {\n id: string;\n name: string;\n slug: string | null;\n memberCount: number;\n archivedAt: string | null;\n}\n\nexport interface PersonMentionCandidate {\n email: string;\n displayName: string;\n userId: string | null;\n savedPersonAssetId: string | null;\n photoUrl: string | null;\n lastInteractionAt: string | null;\n}\n\nexport interface ViewerIsAdminResult {\n getCurrentUserWithWorkspace: { user: { isAdmin: boolean } } | null;\n}\n"],"names":["requestAuth"],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nexport const MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\n/**\n * The metadata of the email rows a page lists, read for those rows alone so\n * the search stays slim: it names their mailbox, whose logo the row draws\n * (`emailProviderThumb`). Ids the caller may not read are left out.\n */\nexport const MENTION_EMAIL_METADATA_QUERY = `\n query MentionEmailMetadata($assetIds: [String!]!) {\n getAssetsByIds(assetIds: $assetIds, withMetadata: true) {\n id\n athenaMetadata\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\n/**\n * The workspace's groups, listed under Team after the members (Olympus's\n * `MentionWorkspaceGroups`). An agora that predates groups refuses the query;\n * Team then lists the members alone.\n */\nexport const WORKSPACE_GROUPS_QUERY = `\n query MentionWorkspaceGroups($workspaceId: String!) {\n getWorkspaceGroups(workspaceId: $workspaceId) {\n id\n name\n slug\n memberCount\n archivedAt\n }\n }\n`;\n\n/**\n * The viewer's people, most recently talked to first: teammates and the people\n * they saved (Olympus's `PersonMentionCandidates`, docs/PERSON_GUIDE.md). Asked\n * for admins only while Person is in preview; agora's Person gate refuses\n * everyone else.\n */\nexport const PERSON_MENTION_CANDIDATES_QUERY = `\n query PersonMentionCandidates($limit: Int) {\n personMentionCandidates(limit: $limit) {\n email\n displayName\n userId\n savedPersonAssetId\n photoUrl\n lastInteractionAt\n }\n }\n`;\n\n/** Whether the viewer is an Athena admin: who the Agents section and the ranked people are offered to. */\nexport const VIEWER_IS_ADMIN_QUERY = `\n query MentionViewerIsAdmin {\n getCurrentUserWithWorkspace {\n user {\n isAdmin\n }\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n\nexport interface WorkspaceGroup {\n id: string;\n name: string;\n slug: string | null;\n memberCount: number;\n archivedAt: string | null;\n}\n\nexport interface PersonMentionCandidate {\n email: string;\n displayName: string;\n userId: string | null;\n savedPersonAssetId: string | null;\n photoUrl: string | null;\n lastInteractionAt: string | null;\n}\n\nexport interface ViewerIsAdminResult {\n getCurrentUserWithWorkspace: { user: { isAdmin: boolean } } | null;\n}\n"],"names":["requestAuth"],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const ASSET_TYPE_ICON_NAMES = {
4
+ aop: "ic-flow",
5
+ application: "ic-application",
6
+ asset_graph: "ic-asset-graph",
7
+ audio: "ic-audio",
8
+ automation: "ic-automation",
9
+ browse_profile: "ic-profile",
10
+ browse_session: "ic-html",
11
+ bundle: "ic-bundle",
12
+ canvas: "ic-canvas",
13
+ catalog: "ic-db",
14
+ collab_agent: "ic-ai",
15
+ collab_source: "ic-db",
16
+ collab_toolkit: "ic-toolkit",
17
+ collection: "ic-collection",
18
+ computer: "ic-computer",
19
+ dashboard: "ic-dashboard",
20
+ database: "ic-snippet",
21
+ design_system: "ic-canvas",
22
+ desktop_session: "ic-desktop_session",
23
+ device: "ic-device",
24
+ document: "ic-word",
25
+ drive: "ic-db",
26
+ email: "ic-mail",
27
+ email_draft: "ic-mail",
28
+ email_message: "ic-mail",
29
+ environment: "ic-environment",
30
+ explorer_view: "ic-explorer-view",
31
+ figure: "ic_figure",
32
+ folder: "ic-folder",
33
+ gdrive_folder: "ic-folder",
34
+ illustrator: "ic-ai",
35
+ image: "ic-img",
36
+ json: "ic-json",
37
+ lakehouse_namespace: "ic-db",
38
+ lakehouse_sync: "ic-flow",
39
+ lakehouse_table: "ic-table",
40
+ live_calendar_event: "ic-mail",
41
+ live_email_thread: "ic-mail",
42
+ markdown: "ic-md",
43
+ meeting: "ic-meeting",
44
+ mobile_session: "ic-mobile_session",
45
+ notebook: "ic-notebook",
46
+ olympus_drive: "ic-drive",
47
+ ontology_object: "ic-ontology-object",
48
+ ontology_object_set: "ic-ontology-object",
49
+ ontology_object_type: "ic-ontology-type",
50
+ pdf: "ic-pdf",
51
+ person: "ic-person",
52
+ phone_call: "ic-phonecall",
53
+ photoshop: "ic-pts",
54
+ playbook: "ic-playbook",
55
+ policy: "ic-policy",
56
+ powerbi_dashboard: "powerbi_dashboard",
57
+ powerbi_dataset: "powerbi_dataset",
58
+ powerbi_report: "powerbi_report",
59
+ powerpoint_deck: "ic-power_point",
60
+ pptx: "ic-power_point",
61
+ presentation: "ic-power_point",
62
+ presentation_pptx_studio: "ic-power_point",
63
+ project: "ic-project",
64
+ python: "ic-py",
65
+ query_snippet: "ic-snippet",
66
+ script: "ic-script",
67
+ secret: "ic-secret",
68
+ semantic_model: "ic-db",
69
+ session: "ic-session",
70
+ session_replay_clip: "ic-session-replay-clip",
71
+ skill: "ic-skill",
72
+ slack_message: "slack",
73
+ spreadsheet: "ic-excel",
74
+ tool: "ic-code",
75
+ tool_result: "ic-snippet",
76
+ transform_project: "ic-transform_project",
77
+ txt: "ic-txt",
78
+ user_interface: "ic-app",
79
+ video: "ic-video",
80
+ video_session: "ic-meeting",
81
+ voice_memo: "ic-voice_memo",
82
+ web_page: "ic-html",
83
+ word_document: "ic-word",
84
+ yaml: "ic-yaml"
85
+ };
86
+ const DEFAULT_ASSET_TYPE_ICON = "ic-file";
87
+ exports.ASSET_TYPE_ICON_NAMES = ASSET_TYPE_ICON_NAMES;
88
+ exports.DEFAULT_ASSET_TYPE_ICON = DEFAULT_ASSET_TYPE_ICON;
89
+ //# sourceMappingURL=asset-type-icon-names.generated.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-type-icon-names.generated.cjs","sources":["../../../../../../src/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.ts"],"sourcesContent":["// Generated by olympus/src/sections/sheets/__tests__/sheets-structured-cells-parity.test.ts\n// from Olympus's `AthenaTypeToThumb` (olympus/src/components/file-thumbnail/utils.ts). Do not edit;\n// regenerate with the command in that test.\n\n/** An icon Olympus shows for an asset type, named after its file under `public/assets/icons/`. */\nexport type AssetTypeIconName =\n | 'ic-ai'\n | 'ic-app'\n | 'ic-application'\n | 'ic-asset-graph'\n | 'ic-audio'\n | 'ic-automation'\n | 'ic-bundle'\n | 'ic-canvas'\n | 'ic-code'\n | 'ic-collection'\n | 'ic-computer'\n | 'ic-dashboard'\n | 'ic-db'\n | 'ic-desktop_session'\n | 'ic-device'\n | 'ic-drive'\n | 'ic-environment'\n | 'ic-excel'\n | 'ic-explorer-view'\n | 'ic-file'\n | 'ic-flow'\n | 'ic-folder'\n | 'ic-html'\n | 'ic-img'\n | 'ic-json'\n | 'ic-mail'\n | 'ic-md'\n | 'ic-meeting'\n | 'ic-mobile_session'\n | 'ic-notebook'\n | 'ic-ontology-object'\n | 'ic-ontology-type'\n | 'ic-pdf'\n | 'ic-person'\n | 'ic-phonecall'\n | 'ic-playbook'\n | 'ic-policy'\n | 'ic-power_point'\n | 'ic-profile'\n | 'ic-project'\n | 'ic-pts'\n | 'ic-py'\n | 'ic-script'\n | 'ic-secret'\n | 'ic-session'\n | 'ic-session-replay-clip'\n | 'ic-skill'\n | 'ic-snippet'\n | 'ic-table'\n | 'ic-toolkit'\n | 'ic-transform_project'\n | 'ic-txt'\n | 'ic-video'\n | 'ic-voice_memo'\n | 'ic-word'\n | 'ic-yaml'\n | 'ic_figure'\n | 'powerbi_dashboard'\n | 'powerbi_dataset'\n | 'powerbi_report'\n | 'slack';\n\n/** The icon Olympus shows for each asset type, where it is not `DEFAULT_ASSET_TYPE_ICON`. */\nexport const ASSET_TYPE_ICON_NAMES: Readonly<Record<string, AssetTypeIconName>> = {\n aop: 'ic-flow',\n application: 'ic-application',\n asset_graph: 'ic-asset-graph',\n audio: 'ic-audio',\n automation: 'ic-automation',\n browse_profile: 'ic-profile',\n browse_session: 'ic-html',\n bundle: 'ic-bundle',\n canvas: 'ic-canvas',\n catalog: 'ic-db',\n collab_agent: 'ic-ai',\n collab_source: 'ic-db',\n collab_toolkit: 'ic-toolkit',\n collection: 'ic-collection',\n computer: 'ic-computer',\n dashboard: 'ic-dashboard',\n database: 'ic-snippet',\n design_system: 'ic-canvas',\n desktop_session: 'ic-desktop_session',\n device: 'ic-device',\n document: 'ic-word',\n drive: 'ic-db',\n email: 'ic-mail',\n email_draft: 'ic-mail',\n email_message: 'ic-mail',\n environment: 'ic-environment',\n explorer_view: 'ic-explorer-view',\n figure: 'ic_figure',\n folder: 'ic-folder',\n gdrive_folder: 'ic-folder',\n illustrator: 'ic-ai',\n image: 'ic-img',\n json: 'ic-json',\n lakehouse_namespace: 'ic-db',\n lakehouse_sync: 'ic-flow',\n lakehouse_table: 'ic-table',\n live_calendar_event: 'ic-mail',\n live_email_thread: 'ic-mail',\n markdown: 'ic-md',\n meeting: 'ic-meeting',\n mobile_session: 'ic-mobile_session',\n notebook: 'ic-notebook',\n olympus_drive: 'ic-drive',\n ontology_object: 'ic-ontology-object',\n ontology_object_set: 'ic-ontology-object',\n ontology_object_type: 'ic-ontology-type',\n pdf: 'ic-pdf',\n person: 'ic-person',\n phone_call: 'ic-phonecall',\n photoshop: 'ic-pts',\n playbook: 'ic-playbook',\n policy: 'ic-policy',\n powerbi_dashboard: 'powerbi_dashboard',\n powerbi_dataset: 'powerbi_dataset',\n powerbi_report: 'powerbi_report',\n powerpoint_deck: 'ic-power_point',\n pptx: 'ic-power_point',\n presentation: 'ic-power_point',\n presentation_pptx_studio: 'ic-power_point',\n project: 'ic-project',\n python: 'ic-py',\n query_snippet: 'ic-snippet',\n script: 'ic-script',\n secret: 'ic-secret',\n semantic_model: 'ic-db',\n session: 'ic-session',\n session_replay_clip: 'ic-session-replay-clip',\n skill: 'ic-skill',\n slack_message: 'slack',\n spreadsheet: 'ic-excel',\n tool: 'ic-code',\n tool_result: 'ic-snippet',\n transform_project: 'ic-transform_project',\n txt: 'ic-txt',\n user_interface: 'ic-app',\n video: 'ic-video',\n video_session: 'ic-meeting',\n voice_memo: 'ic-voice_memo',\n web_page: 'ic-html',\n word_document: 'ic-word',\n yaml: 'ic-yaml',\n};\n\n/** The icon of a type Olympus has none for. */\nexport const DEFAULT_ASSET_TYPE_ICON: AssetTypeIconName = 'ic-file';\n\n/** The icon Olympus shows for a value that carries no type at all. */\nexport const MISSING_ASSET_TYPE_ICON: AssetTypeIconName = 'ic-html';\n"],"names":[],"mappings":";;AAqEO,MAAM,wBAAqE;AAAA,EAChF,KAAK;AAAA,EACL,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,aAAa;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AAAA,EACb,MAAM;AAAA,EACN,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,MAAM;AACR;AAGO,MAAM,0BAA6C;;;"}
@@ -0,0 +1,8 @@
1
+ /** An icon Olympus shows for an asset type, named after its file under `public/assets/icons/`. */
2
+ export type AssetTypeIconName = 'ic-ai' | 'ic-app' | 'ic-application' | 'ic-asset-graph' | 'ic-audio' | 'ic-automation' | 'ic-bundle' | 'ic-canvas' | 'ic-code' | 'ic-collection' | 'ic-computer' | 'ic-dashboard' | 'ic-db' | 'ic-desktop_session' | 'ic-device' | 'ic-drive' | 'ic-environment' | 'ic-excel' | 'ic-explorer-view' | 'ic-file' | 'ic-flow' | 'ic-folder' | 'ic-html' | 'ic-img' | 'ic-json' | 'ic-mail' | 'ic-md' | 'ic-meeting' | 'ic-mobile_session' | 'ic-notebook' | 'ic-ontology-object' | 'ic-ontology-type' | 'ic-pdf' | 'ic-person' | 'ic-phonecall' | 'ic-playbook' | 'ic-policy' | 'ic-power_point' | 'ic-profile' | 'ic-project' | 'ic-pts' | 'ic-py' | 'ic-script' | 'ic-secret' | 'ic-session' | 'ic-session-replay-clip' | 'ic-skill' | 'ic-snippet' | 'ic-table' | 'ic-toolkit' | 'ic-transform_project' | 'ic-txt' | 'ic-video' | 'ic-voice_memo' | 'ic-word' | 'ic-yaml' | 'ic_figure' | 'powerbi_dashboard' | 'powerbi_dataset' | 'powerbi_report' | 'slack';
3
+ /** The icon Olympus shows for each asset type, where it is not `DEFAULT_ASSET_TYPE_ICON`. */
4
+ export declare const ASSET_TYPE_ICON_NAMES: Readonly<Record<string, AssetTypeIconName>>;
5
+ /** The icon of a type Olympus has none for. */
6
+ export declare const DEFAULT_ASSET_TYPE_ICON: AssetTypeIconName;
7
+ /** The icon Olympus shows for a value that carries no type at all. */
8
+ export declare const MISSING_ASSET_TYPE_ICON: AssetTypeIconName;
@@ -0,0 +1,89 @@
1
+ const ASSET_TYPE_ICON_NAMES = {
2
+ aop: "ic-flow",
3
+ application: "ic-application",
4
+ asset_graph: "ic-asset-graph",
5
+ audio: "ic-audio",
6
+ automation: "ic-automation",
7
+ browse_profile: "ic-profile",
8
+ browse_session: "ic-html",
9
+ bundle: "ic-bundle",
10
+ canvas: "ic-canvas",
11
+ catalog: "ic-db",
12
+ collab_agent: "ic-ai",
13
+ collab_source: "ic-db",
14
+ collab_toolkit: "ic-toolkit",
15
+ collection: "ic-collection",
16
+ computer: "ic-computer",
17
+ dashboard: "ic-dashboard",
18
+ database: "ic-snippet",
19
+ design_system: "ic-canvas",
20
+ desktop_session: "ic-desktop_session",
21
+ device: "ic-device",
22
+ document: "ic-word",
23
+ drive: "ic-db",
24
+ email: "ic-mail",
25
+ email_draft: "ic-mail",
26
+ email_message: "ic-mail",
27
+ environment: "ic-environment",
28
+ explorer_view: "ic-explorer-view",
29
+ figure: "ic_figure",
30
+ folder: "ic-folder",
31
+ gdrive_folder: "ic-folder",
32
+ illustrator: "ic-ai",
33
+ image: "ic-img",
34
+ json: "ic-json",
35
+ lakehouse_namespace: "ic-db",
36
+ lakehouse_sync: "ic-flow",
37
+ lakehouse_table: "ic-table",
38
+ live_calendar_event: "ic-mail",
39
+ live_email_thread: "ic-mail",
40
+ markdown: "ic-md",
41
+ meeting: "ic-meeting",
42
+ mobile_session: "ic-mobile_session",
43
+ notebook: "ic-notebook",
44
+ olympus_drive: "ic-drive",
45
+ ontology_object: "ic-ontology-object",
46
+ ontology_object_set: "ic-ontology-object",
47
+ ontology_object_type: "ic-ontology-type",
48
+ pdf: "ic-pdf",
49
+ person: "ic-person",
50
+ phone_call: "ic-phonecall",
51
+ photoshop: "ic-pts",
52
+ playbook: "ic-playbook",
53
+ policy: "ic-policy",
54
+ powerbi_dashboard: "powerbi_dashboard",
55
+ powerbi_dataset: "powerbi_dataset",
56
+ powerbi_report: "powerbi_report",
57
+ powerpoint_deck: "ic-power_point",
58
+ pptx: "ic-power_point",
59
+ presentation: "ic-power_point",
60
+ presentation_pptx_studio: "ic-power_point",
61
+ project: "ic-project",
62
+ python: "ic-py",
63
+ query_snippet: "ic-snippet",
64
+ script: "ic-script",
65
+ secret: "ic-secret",
66
+ semantic_model: "ic-db",
67
+ session: "ic-session",
68
+ session_replay_clip: "ic-session-replay-clip",
69
+ skill: "ic-skill",
70
+ slack_message: "slack",
71
+ spreadsheet: "ic-excel",
72
+ tool: "ic-code",
73
+ tool_result: "ic-snippet",
74
+ transform_project: "ic-transform_project",
75
+ txt: "ic-txt",
76
+ user_interface: "ic-app",
77
+ video: "ic-video",
78
+ video_session: "ic-meeting",
79
+ voice_memo: "ic-voice_memo",
80
+ web_page: "ic-html",
81
+ word_document: "ic-word",
82
+ yaml: "ic-yaml"
83
+ };
84
+ const DEFAULT_ASSET_TYPE_ICON = "ic-file";
85
+ export {
86
+ ASSET_TYPE_ICON_NAMES,
87
+ DEFAULT_ASSET_TYPE_ICON
88
+ };
89
+ //# sourceMappingURL=asset-type-icon-names.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-type-icon-names.generated.js","sources":["../../../../../../src/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.ts"],"sourcesContent":["// Generated by olympus/src/sections/sheets/__tests__/sheets-structured-cells-parity.test.ts\n// from Olympus's `AthenaTypeToThumb` (olympus/src/components/file-thumbnail/utils.ts). Do not edit;\n// regenerate with the command in that test.\n\n/** An icon Olympus shows for an asset type, named after its file under `public/assets/icons/`. */\nexport type AssetTypeIconName =\n | 'ic-ai'\n | 'ic-app'\n | 'ic-application'\n | 'ic-asset-graph'\n | 'ic-audio'\n | 'ic-automation'\n | 'ic-bundle'\n | 'ic-canvas'\n | 'ic-code'\n | 'ic-collection'\n | 'ic-computer'\n | 'ic-dashboard'\n | 'ic-db'\n | 'ic-desktop_session'\n | 'ic-device'\n | 'ic-drive'\n | 'ic-environment'\n | 'ic-excel'\n | 'ic-explorer-view'\n | 'ic-file'\n | 'ic-flow'\n | 'ic-folder'\n | 'ic-html'\n | 'ic-img'\n | 'ic-json'\n | 'ic-mail'\n | 'ic-md'\n | 'ic-meeting'\n | 'ic-mobile_session'\n | 'ic-notebook'\n | 'ic-ontology-object'\n | 'ic-ontology-type'\n | 'ic-pdf'\n | 'ic-person'\n | 'ic-phonecall'\n | 'ic-playbook'\n | 'ic-policy'\n | 'ic-power_point'\n | 'ic-profile'\n | 'ic-project'\n | 'ic-pts'\n | 'ic-py'\n | 'ic-script'\n | 'ic-secret'\n | 'ic-session'\n | 'ic-session-replay-clip'\n | 'ic-skill'\n | 'ic-snippet'\n | 'ic-table'\n | 'ic-toolkit'\n | 'ic-transform_project'\n | 'ic-txt'\n | 'ic-video'\n | 'ic-voice_memo'\n | 'ic-word'\n | 'ic-yaml'\n | 'ic_figure'\n | 'powerbi_dashboard'\n | 'powerbi_dataset'\n | 'powerbi_report'\n | 'slack';\n\n/** The icon Olympus shows for each asset type, where it is not `DEFAULT_ASSET_TYPE_ICON`. */\nexport const ASSET_TYPE_ICON_NAMES: Readonly<Record<string, AssetTypeIconName>> = {\n aop: 'ic-flow',\n application: 'ic-application',\n asset_graph: 'ic-asset-graph',\n audio: 'ic-audio',\n automation: 'ic-automation',\n browse_profile: 'ic-profile',\n browse_session: 'ic-html',\n bundle: 'ic-bundle',\n canvas: 'ic-canvas',\n catalog: 'ic-db',\n collab_agent: 'ic-ai',\n collab_source: 'ic-db',\n collab_toolkit: 'ic-toolkit',\n collection: 'ic-collection',\n computer: 'ic-computer',\n dashboard: 'ic-dashboard',\n database: 'ic-snippet',\n design_system: 'ic-canvas',\n desktop_session: 'ic-desktop_session',\n device: 'ic-device',\n document: 'ic-word',\n drive: 'ic-db',\n email: 'ic-mail',\n email_draft: 'ic-mail',\n email_message: 'ic-mail',\n environment: 'ic-environment',\n explorer_view: 'ic-explorer-view',\n figure: 'ic_figure',\n folder: 'ic-folder',\n gdrive_folder: 'ic-folder',\n illustrator: 'ic-ai',\n image: 'ic-img',\n json: 'ic-json',\n lakehouse_namespace: 'ic-db',\n lakehouse_sync: 'ic-flow',\n lakehouse_table: 'ic-table',\n live_calendar_event: 'ic-mail',\n live_email_thread: 'ic-mail',\n markdown: 'ic-md',\n meeting: 'ic-meeting',\n mobile_session: 'ic-mobile_session',\n notebook: 'ic-notebook',\n olympus_drive: 'ic-drive',\n ontology_object: 'ic-ontology-object',\n ontology_object_set: 'ic-ontology-object',\n ontology_object_type: 'ic-ontology-type',\n pdf: 'ic-pdf',\n person: 'ic-person',\n phone_call: 'ic-phonecall',\n photoshop: 'ic-pts',\n playbook: 'ic-playbook',\n policy: 'ic-policy',\n powerbi_dashboard: 'powerbi_dashboard',\n powerbi_dataset: 'powerbi_dataset',\n powerbi_report: 'powerbi_report',\n powerpoint_deck: 'ic-power_point',\n pptx: 'ic-power_point',\n presentation: 'ic-power_point',\n presentation_pptx_studio: 'ic-power_point',\n project: 'ic-project',\n python: 'ic-py',\n query_snippet: 'ic-snippet',\n script: 'ic-script',\n secret: 'ic-secret',\n semantic_model: 'ic-db',\n session: 'ic-session',\n session_replay_clip: 'ic-session-replay-clip',\n skill: 'ic-skill',\n slack_message: 'slack',\n spreadsheet: 'ic-excel',\n tool: 'ic-code',\n tool_result: 'ic-snippet',\n transform_project: 'ic-transform_project',\n txt: 'ic-txt',\n user_interface: 'ic-app',\n video: 'ic-video',\n video_session: 'ic-meeting',\n voice_memo: 'ic-voice_memo',\n web_page: 'ic-html',\n word_document: 'ic-word',\n yaml: 'ic-yaml',\n};\n\n/** The icon of a type Olympus has none for. */\nexport const DEFAULT_ASSET_TYPE_ICON: AssetTypeIconName = 'ic-file';\n\n/** The icon Olympus shows for a value that carries no type at all. */\nexport const MISSING_ASSET_TYPE_ICON: AssetTypeIconName = 'ic-html';\n"],"names":[],"mappings":"AAqEO,MAAM,wBAAqE;AAAA,EAChF,KAAK;AAAA,EACL,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,aAAa;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AAAA,EACb,MAAM;AAAA,EACN,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,MAAM;AACR;AAGO,MAAM,0BAA6C;"}