@athenaintel/react 0.23.3 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -4
- package/dist/assets/AssetPanel.cjs +1 -1
- package/dist/assets/AssetPanel.cjs.map +1 -1
- package/dist/assets/AssetPanel.js +1 -1
- package/dist/assets/AssetPanel.js.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.js +1 -1
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/chat/AthenaChat.cjs +15 -23
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +9 -4
- package/dist/chat/AthenaChat.js +15 -23
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +34 -24
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +34 -4
- package/dist/chat/StatewireApprovalCard.js +34 -24
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -16
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireClientToolBridge.js +2 -16
- package/dist/chat/StatewireClientToolBridge.js.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +5 -16
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.js +5 -16
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +3 -18
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
- package/dist/chat/WaitingOnYouBanner.js +3 -18
- package/dist/chat/WaitingOnYouBanner.js.map +1 -1
- package/dist/chat/run-activity.cjs +0 -16
- package/dist/chat/run-activity.cjs.map +1 -1
- package/dist/chat/run-activity.js +0 -16
- package/dist/chat/run-activity.js.map +1 -1
- package/dist/chat/statewire-client-tools.cjs +1 -17
- package/dist/chat/statewire-client-tools.cjs.map +1 -1
- package/dist/chat/statewire-client-tools.js +1 -17
- package/dist/chat/statewire-client-tools.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +0 -16
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.js +0 -16
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/tiptap-text.cjs +1 -17
- package/dist/chat/tiptap-text.cjs.map +1 -1
- package/dist/chat/tiptap-text.js +1 -17
- package/dist/chat/tiptap-text.js.map +1 -1
- package/dist/chat/use-athena-run-live.cjs +0 -15
- package/dist/chat/use-athena-run-live.cjs.map +1 -1
- package/dist/chat/use-athena-run-live.js +0 -15
- package/dist/chat/use-athena-run-live.js.map +1 -1
- package/dist/chat/use-statewire-approval-request.cjs +4 -16
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +2 -0
- package/dist/chat/use-statewire-approval-request.js +4 -16
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +1 -16
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.js +1 -16
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +0 -16
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +1 -1
- package/dist/chat-ui/index.js +0 -16
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +1 -16
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.js +1 -16
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +4 -6
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +4 -6
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +2 -9
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +2 -9
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +5 -19
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.js +5 -19
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/runtime-message.cjs +1 -16
- package/dist/chat-ui/messages/runtime-message.cjs.map +1 -1
- package/dist/chat-ui/messages/runtime-message.js +1 -16
- package/dist/chat-ui/messages/runtime-message.js.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.cjs +3 -15
- package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.js +3 -15
- package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.cjs +0 -16
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.js +0 -16
- package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +1 -16
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.js +1 -16
- package/dist/chat-ui/messages/wake-marker.js.map +1 -1
- package/dist/chat-ui/statewire.cjs +0 -16
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.d.ts +1 -1
- package/dist/chat-ui/statewire.js +0 -16
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -17
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +2 -17
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/dictation/DictationStrip.cjs +2 -1
- package/dist/dictation/DictationStrip.cjs.map +1 -1
- package/dist/dictation/DictationStrip.d.ts +2 -0
- package/dist/dictation/DictationStrip.js +2 -1
- package/dist/dictation/DictationStrip.js.map +1 -1
- package/dist/dictation/dictation-engine.cjs.map +1 -1
- package/dist/dictation/dictation-engine.d.ts +8 -0
- package/dist/dictation/dictation-engine.js.map +1 -1
- package/dist/dictation/recorded-dictation-engine.cjs +153 -0
- package/dist/dictation/recorded-dictation-engine.cjs.map +1 -0
- package/dist/dictation/recorded-dictation-engine.d.ts +66 -0
- package/dist/dictation/recorded-dictation-engine.js +153 -0
- package/dist/dictation/recorded-dictation-engine.js.map +1 -0
- package/dist/dictation/use-athena-dictation-engine.cjs +64 -0
- package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -0
- package/dist/dictation/use-athena-dictation-engine.d.ts +25 -0
- package/dist/dictation/use-athena-dictation-engine.js +64 -0
- package/dist/dictation/use-athena-dictation-engine.js.map +1 -0
- package/dist/dictation/use-dictation.cjs +17 -6
- package/dist/dictation/use-dictation.cjs.map +1 -1
- package/dist/dictation/use-dictation.d.ts +20 -4
- package/dist/dictation/use-dictation.js +17 -6
- package/dist/dictation/use-dictation.js.map +1 -1
- package/dist/index.cjs +29 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +12 -22
- package/dist/index.js.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-list.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-list.js.map +1 -1
- package/dist/packages/agent-runtime/src/edit-command.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/edit-command.js.map +1 -1
- package/dist/packages/agent-runtime/src/errors.cjs +18 -0
- package/dist/packages/agent-runtime/src/errors.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/errors.js +19 -1
- package/dist/packages/agent-runtime/src/errors.js.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +2 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +2 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/packages/agent-runtime/src/interrupts.cjs +83 -14
- package/dist/packages/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/interrupts.js +83 -14
- package/dist/packages/agent-runtime/src/interrupts.js.map +1 -1
- package/dist/packages/agent-runtime/src/messages.cjs +2 -1
- package/dist/packages/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/messages.js +2 -1
- package/dist/packages/agent-runtime/src/messages.js.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +49 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js +49 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
- package/dist/packages/agent-runtime/src/thread-status.js +1 -1
- package/dist/packages/agent-runtime/src/tool-metadata.cjs +1 -37
- package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/tool-metadata.js +1 -37
- package/dist/packages/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
- package/dist/packages/agent-runtime/src/voice-presentation.cjs +6 -0
- package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/voice-presentation.js +6 -0
- package/dist/packages/agent-runtime/src/voice-presentation.js.map +1 -1
- package/dist/packages/agent-runtime/src/voice-turn-grouping.cjs +68 -0
- package/dist/packages/agent-runtime/src/voice-turn-grouping.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/voice-turn-grouping.js +68 -0
- package/dist/packages/agent-runtime/src/voice-turn-grouping.js.map +1 -0
- package/dist/packages/react/package.json.cjs +1 -1
- package/dist/packages/react/package.json.js +1 -1
- package/dist/provider/AthenaProvider.cjs +5 -18
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.js +5 -18
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/theme-style-context.cjs +12 -0
- package/dist/provider/theme-style-context.cjs.map +1 -0
- package/dist/provider/theme-style-context.d.ts +8 -0
- package/dist/provider/theme-style-context.js +12 -0
- package/dist/provider/theme-style-context.js.map +1 -0
- package/dist/runtime/statewire-lifecycle.cjs +0 -16
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.js +0 -16
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +3 -17
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +3 -17
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/SessionList.cjs +87 -16
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionList.js +88 -17
- package/dist/threads/SessionList.js.map +1 -1
- package/dist/threads/session-list-model.cjs +13 -5
- package/dist/threads/session-list-model.cjs.map +1 -1
- package/dist/threads/session-list-model.d.ts +10 -3
- package/dist/threads/session-list-model.js +13 -5
- package/dist/threads/session-list-model.js.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +4 -17
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.js +4 -17
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/use-rest-conversation-history.cjs +2 -16
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.js +2 -16
- package/dist/threads/use-rest-conversation-history.js.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +2 -16
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.js +2 -16
- package/dist/threads/use-statewire-conversation-history.js.map +1 -1
- package/dist/toolkits/index.cjs +0 -7
- package/dist/toolkits/index.cjs.map +1 -1
- package/dist/toolkits/index.d.ts +0 -2
- package/dist/toolkits/index.js +0 -7
- package/dist/toolkits/index.js.map +1 -1
- package/dist/tools/index.cjs +4 -20
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js +1 -17
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -17
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.js +2 -17
- package/dist/tools/misc-tool-uis.js.map +1 -1
- package/dist/tools/primitives.cjs +1 -16
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/primitives.js +1 -16
- package/dist/tools/primitives.js.map +1 -1
- package/dist/tools/tool-fallback.cjs +2 -17
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-fallback.js +2 -17
- package/dist/tools/tool-fallback.js.map +1 -1
- package/dist/tools/voice-update-tool-ui.cjs +1 -17
- package/dist/tools/voice-update-tool-ui.cjs.map +1 -1
- package/dist/tools/voice-update-tool-ui.js +1 -17
- package/dist/tools/voice-update-tool-ui.js.map +1 -1
- package/dist/ui/popover.cjs +46 -0
- package/dist/ui/popover.cjs.map +1 -0
- package/dist/ui/popover.d.ts +6 -0
- package/dist/ui/popover.js +46 -0
- package/dist/ui/popover.js.map +1 -0
- package/package.json +2 -2
- package/dist/node_modules/qrcode-generator/dist/qrcode.cjs +0 -32
- package/dist/node_modules/qrcode-generator/dist/qrcode.cjs.map +0 -1
- package/dist/node_modules/qrcode-generator/dist/qrcode.js +0 -31
- package/dist/node_modules/qrcode-generator/dist/qrcode.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/errors.cjs +0 -44
- package/dist/node_modules/zod/v4/classic/errors.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/errors.js +0 -44
- package/dist/node_modules/zod/v4/classic/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/iso.cjs +0 -43
- package/dist/node_modules/zod/v4/classic/iso.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/iso.js +0 -43
- package/dist/node_modules/zod/v4/classic/iso.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/parse.cjs +0 -29
- package/dist/node_modules/zod/v4/classic/parse.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/parse.js +0 -29
- package/dist/node_modules/zod/v4/classic/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/schemas.cjs +0 -871
- package/dist/node_modules/zod/v4/classic/schemas.cjs.map +0 -1
- package/dist/node_modules/zod/v4/classic/schemas.js +0 -871
- package/dist/node_modules/zod/v4/classic/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/api.cjs +0 -570
- package/dist/node_modules/zod/v4/core/api.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/api.js +0 -570
- package/dist/node_modules/zod/v4/core/api.js.map +0 -1
- package/dist/node_modules/zod/v4/core/checks.cjs +0 -411
- package/dist/node_modules/zod/v4/core/checks.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/checks.js +0 -411
- package/dist/node_modules/zod/v4/core/checks.js.map +0 -1
- package/dist/node_modules/zod/v4/core/core.cjs +0 -77
- package/dist/node_modules/zod/v4/core/core.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/core.js +0 -77
- package/dist/node_modules/zod/v4/core/core.js.map +0 -1
- package/dist/node_modules/zod/v4/core/doc.cjs +0 -38
- package/dist/node_modules/zod/v4/core/doc.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/doc.js +0 -38
- package/dist/node_modules/zod/v4/core/doc.js.map +0 -1
- package/dist/node_modules/zod/v4/core/errors.cjs +0 -76
- package/dist/node_modules/zod/v4/core/errors.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/errors.js +0 -76
- package/dist/node_modules/zod/v4/core/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs +0 -312
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/json-schema-processors.js +0 -312
- package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/parse.cjs +0 -96
- package/dist/node_modules/zod/v4/core/parse.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/parse.js +0 -96
- package/dist/node_modules/zod/v4/core/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/core/regexes.cjs +0 -86
- package/dist/node_modules/zod/v4/core/regexes.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/regexes.js +0 -86
- package/dist/node_modules/zod/v4/core/regexes.js.map +0 -1
- package/dist/node_modules/zod/v4/core/registries.cjs +0 -52
- package/dist/node_modules/zod/v4/core/registries.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/registries.js +0 -52
- package/dist/node_modules/zod/v4/core/registries.js.map +0 -1
- package/dist/node_modules/zod/v4/core/schemas.cjs +0 -1412
- package/dist/node_modules/zod/v4/core/schemas.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/schemas.js +0 -1413
- package/dist/node_modules/zod/v4/core/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs +0 -370
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/to-json-schema.js +0 -370
- package/dist/node_modules/zod/v4/core/to-json-schema.js.map +0 -1
- package/dist/node_modules/zod/v4/core/util.cjs +0 -444
- package/dist/node_modules/zod/v4/core/util.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/util.js +0 -444
- package/dist/node_modules/zod/v4/core/util.js.map +0 -1
- package/dist/node_modules/zod/v4/core/versions.cjs +0 -9
- package/dist/node_modules/zod/v4/core/versions.cjs.map +0 -1
- package/dist/node_modules/zod/v4/core/versions.js +0 -9
- package/dist/node_modules/zod/v4/core/versions.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-handoff.cjs +0 -85
- package/dist/packages/agent-runtime/src/thread-handoff.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-handoff.js +0 -85
- package/dist/packages/agent-runtime/src/thread-handoff.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../../src/chat-ui/mentions/suggestions/data/sources/index.ts"],"sourcesContent":["/**\n * Mention data sources shared by every chat host.\n *\n * Each source function implements the SourceFn interface:\n * (context: SourceContext) => Promise<SourceResult>\n *\n * Sources are either:\n * - FETCHERS: Call GraphQL API (assets, folders, team, etc.)\n * - TRANSFORMERS: Return static/local data (root categories, host-provided items)\n */\n\nimport type {\n MenuItem,\n MentionTool,\n SourceFn,\n SourceResult,\n SourceToRegister,\n FetchMetadata,\n WebpageMention,\n} from \"../types\";\nimport { MentionMenuSection } from \"../types\";\nimport {\n fetchGraphQL,\n SIMPLE_SEARCH_QUERY,\n PAGINATED_ASSETS_QUERY,\n WORKSPACE_MEMBERS_QUERY,\n TOOL_CATALOG_QUERY,\n type MentionAuthContext,\n type AssetResult,\n type WorkspaceMember,\n type ToolCatalogResult,\n} from \"../api-client\";\nimport { assetTypeToThumb, assetTypeToIcon } from \"./asset-type-icons\";\n\n// ── Helpers ──\n\nfunction assetToMenuItem(asset: AssetResult): MenuItem {\n const isFolder = asset.athenaOriginalType === \"folder\";\n const displayType = asset.athenaConvertedType || asset.athenaOriginalType;\n return {\n id: asset.id,\n name: asset.title || \"Untitled\",\n type: isFolder ? \"folder\" : \"asset\",\n thumbnailUrl: assetTypeToThumb(displayType),\n fallbackIcon: assetTypeToIcon(displayType),\n navigatesToScope: isFolder ? asset.id : undefined,\n visibleInScopes: new Set(),\n updatedAt: asset.updatedAt ?? undefined,\n extra: {\n athenaOriginalType: asset.athenaOriginalType,\n athenaConvertedType: asset.athenaConvertedType,\n parentFolderId: asset.parentFolderId,\n },\n };\n}\n\nasync function querySimpleSearch(\n auth: MentionAuthContext,\n opts: {\n query?: string;\n limit: number;\n offset: number;\n includeTypes?: string[];\n excludeTypes?: string[];\n },\n): Promise<{ items: MenuItem[]; hasMore: boolean }> {\n const searchRequest: Record<string, any> = {\n query: opts.query?.trim() || \"\",\n type: opts.includeTypes || [],\n notType: opts.excludeTypes || [],\n limit: opts.limit,\n offset: opts.offset,\n };\n\n const input = {\n searchRequest,\n returnFullAsset: true,\n shouldCalculateTotal: false,\n sort: { field: \"UPDATED_AT\", direction: \"DESC\" },\n filterColumns: { isArchived: false, isHidden: false },\n };\n\n const data = await fetchGraphQL<{\n simpleSearch: { assets: AssetResult[]; totalCount: number };\n }>(auth, SIMPLE_SEARCH_QUERY, { input });\n\n const assets = data.simpleSearch?.assets || [];\n return {\n items: assets.map(assetToMenuItem),\n hasMore: assets.length === opts.limit,\n };\n}\n\n// ══════════════════════════════════════════════════════════════════════\n// ROOT CATEGORIES (Transformer)\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface RootCategoriesConfig {\n categories: string[];\n getWebpages: () => readonly WebpageMention[];\n}\n\nconst CATEGORY_DEFS: Record<\n string,\n { name: string; icon: string; scope: string }\n> = {\n favorites: { name: \"Favorites\", icon: \"star\", scope: \"favorites\" },\n assets: { name: \"Assets\", icon: \"file-text\", scope: \"athena_assets\" },\n projects: {\n name: \"Projects\",\n icon: \"folder-kanban\",\n scope: \"athena_projects\",\n },\n browse_profiles: {\n name: \"Browse Profiles\",\n icon: \"globe\",\n scope: \"athena_browse_profiles\",\n },\n folders: { name: \"Folders\", icon: \"folder\", scope: \"athena_folders\" },\n tools: { name: \"Tools\", icon: \"wrench\", scope: \"tools\" },\n toolkits: { name: \"Toolkits\", icon: \"package\", scope: \"toolkits\" },\n team: { name: \"Team\", icon: \"users\", scope: \"team\" },\n drives: { name: \"Drives\", icon: \"hard-drive\", scope: \"drive_catalogs\" },\n};\n\nfunction webpageDescription(webpage: WebpageMention): string {\n try {\n const hostname = new URL(webpage.url).hostname;\n return webpage.isCurrent ? `${webpage.title} · ${hostname}` : hostname;\n } catch {\n return webpage.title;\n }\n}\n\nfunction webpageToMenuItem(webpage: WebpageMention): MenuItem {\n return {\n id: `webpage-tab-${webpage.tabId}`,\n name: webpage.isCurrent ? \"This webpage\" : webpage.title,\n type: \"tab\",\n thumbnailUrl: assetTypeToThumb(\"web_page\"),\n fallbackIcon: \"globe\",\n visibleInScopes: new Set([\"root\"]),\n description: webpageDescription(webpage),\n url: webpage.url,\n menuSection: webpage.isCurrent\n ? MentionMenuSection.CURRENT_WEBPAGE\n : MentionMenuSection.OTHER_WEBPAGES,\n extra: {\n tabId: webpage.tabId,\n title: webpage.title,\n isCurrent: webpage.isCurrent,\n },\n };\n}\n\nexport function buildRootMenuItems({\n categories,\n webpages,\n}: {\n categories: readonly string[];\n webpages: readonly WebpageMention[];\n}): MenuItem[] {\n const webpageItems = webpages.map(webpageToMenuItem);\n const categoryItems = categories\n .filter((cat: string) => CATEGORY_DEFS[cat])\n .map((cat: string) => {\n const def = CATEGORY_DEFS[cat];\n return {\n id: cat,\n name: def.name,\n type: \"menu\" as const,\n fallbackIcon: def.icon,\n visibleInScopes: new Set([\"root\"]),\n navigatesToScope: def.scope,\n isNavigationOnly: true,\n menuSection: MentionMenuSection.LIBRARY,\n };\n });\n\n return [...webpageItems, ...categoryItems];\n}\n\nexport const transformRootCategories: SourceFn<RootCategoriesConfig> = async (\n context,\n) => {\n const { sourceConfig } = context;\n const items = buildRootMenuItems({\n categories: sourceConfig.categories,\n webpages: sourceConfig.getWebpages(),\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// ASSETS (Fetcher) — All non-folder assets via SimpleSearch\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface AssetsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchAssets: SourceFn<AssetsConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n excludeTypes: [\n \"folder\",\n \"catalog\",\n \"spaces\",\n \"session\",\n \"table\",\n \"task_item\",\n ],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FAVORITES (Fetcher) — Favorited assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FavoritesConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFavorites: SourceFn<FavoritesConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId: null,\n filterTypes: null,\n filterColumns: {\n isFavorited: true,\n isArchived: false,\n isHidden: false,\n },\n });\n\n const assets = data.getPaginatedAssetsForWorkspace || [];\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: { hasMore: assets.length === limit },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDERS (Fetcher) — All folders as flat list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FoldersConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolders: SourceFn<FoldersConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: [\"folder\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDER CONTENTS (Fetcher) — Contents of a specific folder\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FolderContentsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolderContents: SourceFn<FolderContentsConfig> = async (\n context,\n) => {\n const { scope, query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n // Scope IS the folder ID (or 'internal_drive' for root)\n const parentFolderId = scope === \"internal_drive\" ? null : scope;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId,\n filterTypes: null,\n filterColumns: {\n isArchived: false,\n isHidden: false,\n ...(query ? { title: [{ op: \"LIKE\", value: `%${query}%` }] } : {}),\n },\n });\n\n const rawAssets = data.getPaginatedAssetsForWorkspace || [];\n // Exclude catalogs from folder contents\n const assets = rawAssets.filter(\n (a) =>\n a.athenaConvertedType !== \"catalog\" && a.athenaOriginalType !== \"catalog\",\n );\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: {\n hasMore: rawAssets.length === limit,\n consumedCount: rawAssets.length,\n },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// PROJECTS (Fetcher) — Project assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TypedAssetsConfig {\n auth: MentionAuthContext;\n includeOnlyTypes: string[];\n limit?: number;\n}\n\nexport const fetchTypedAssets: SourceFn<TypedAssetsConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: sourceConfig.includeOnlyTypes,\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TEAM (Fetcher) — Workspace members\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TeamConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchTeam: SourceFn<TeamConfig> = async (context) => {\n const { sourceConfig } = context;\n const { auth } = sourceConfig;\n\n if (!auth.workspaceId) {\n return { items: [], pagination: { hasMore: false } };\n }\n\n const data = await fetchGraphQL<{ getUsersInWorkspace: WorkspaceMember[] }>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId: auth.workspaceId },\n );\n\n const members = data.getUsersInWorkspace || [];\n const items: MenuItem[] = members.map((member) => {\n const displayName =\n [member.firstName, member.lastName].filter(Boolean).join(\" \").trim() ||\n member.email ||\n \"Unknown User\";\n\n return {\n id: member.email || member.id,\n name: displayName,\n type: \"user\" as const,\n fallbackIcon: \"user\",\n visibleInScopes: new Set<string>(),\n email: member.email ?? undefined,\n extra: { isAdmin: member.isAdmin },\n };\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TOOLS / TOOLKITS (Fetcher) — Mentionable tool catalog\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ToolCatalogConfig {\n auth: MentionAuthContext;\n}\n\n// getToolkitToToolsMapping is already filtered server-side for the\n// authenticated user (admin-only entries, beta allowlist, workspace registry),\n// so only mention/menu visibility is applied here.\nasync function queryToolCatalog(\n auth: MentionAuthContext,\n): Promise<ToolCatalogResult[\"getToolkitToToolsMapping\"]> {\n const data = await fetchGraphQL<ToolCatalogResult>(auth, TOOL_CATALOG_QUERY);\n return data.getToolkitToToolsMapping;\n}\n\nexport const fetchTools: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.tools\n .filter((tool) => tool.isMentionable)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: \"tool\" as const,\n fallbackIcon: tool.icon,\n description: tool.description ?? undefined,\n visibleInScopes: new Set<string>(),\n ...(tool.adminOnly ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\nexport const fetchToolkits: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.toolkits\n .filter((toolkit) => toolkit.isMentionable && !toolkit.hideFromMenu)\n .map((toolkit) => ({\n id: toolkit.name,\n name: toolkit.displayName,\n type: \"toolkit\" as const,\n fallbackIcon: toolkit.icon,\n description: toolkit.description || undefined,\n visibleInScopes: new Set<string>(),\n ...(toolkit.onlyAdmin ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// DRIVES (Fetcher) — Drive catalog assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface DrivesConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchDrives: SourceFn<DrivesConfig> = async (context) => {\n const { fetchState, sourceConfig } = context;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n limit: 50,\n offset,\n includeTypes: [\"catalog\"],\n });\n\n // Drive catalogs are navigation-only (navigate into them to see contents)\n const items: MenuItem[] = result.items.map((item) => ({\n ...item,\n type: \"drive_catalog\" as const,\n fallbackIcon: \"hard-drive\",\n isNavigationOnly: true,\n navigatesToScope: item.id,\n }));\n\n // Register folder contents source for each catalog\n const sources: SourceToRegister[] = items.map((item) => ({\n scope: item.id,\n sourceFn: fetchFolderContents,\n sourceConfig: { auth: sourceConfig.auth, limit: 50 },\n }));\n\n return {\n items,\n pagination: { hasMore: result.hasMore },\n sources,\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// GLOBAL SEARCH (Fetcher) — Aggregated search across all sources\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface GlobalSearchConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchGlobalSearch: SourceFn<GlobalSearchConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n if (!query?.trim()) return { items: [], pagination: { hasMore: false } };\n\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit: 50,\n offset,\n excludeTypes: [\"table\", \"catalog\", \"spaces\", \"task_item\", \"session\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// HOST-PROVIDED TOOLS (Transformer) — a host's own Tools / Toolkits list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ProvidedToolsConfig {\n getTools: () => readonly MentionTool[];\n type: MentionTool[\"type\"];\n}\n\n/** Menu items for a host-provided tool list, in the host's order. */\nexport function providedToolMenuItems(\n tools: readonly MentionTool[],\n type?: MentionTool[\"type\"],\n): MenuItem[] {\n return tools\n .filter((tool) => type === undefined || tool.type === type)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: tool.type,\n fallbackIcon: tool.icon ?? (tool.type === \"toolkit\" ? \"Package\" : \"Wrench\"),\n description: tool.description,\n visibleInScopes: new Set<string>(),\n }));\n}\n\nexport const transformProvidedTools: SourceFn<ProvidedToolsConfig> = async (\n context,\n) => ({\n items: providedToolMenuItems(\n context.sourceConfig.getTools(),\n context.sourceConfig.type,\n ),\n pagination: { hasMore: false },\n});\n\n/**\n * Prepend a host's tool list to another source's items so a root query matches\n * them the way it matches assets (the cache filters by query and sorts\n * toolkits first). The wrapped source's offset bookkeeping is preserved:\n * `consumedCount` stays the number of rows the server returned, so the added\n * items never advance the next page's offset.\n */\nexport function withProvidedTools<TConfig>(\n source: SourceFn<TConfig>,\n getTools: () => readonly MentionTool[],\n): SourceFn<TConfig> {\n return async (context) => {\n const result = await source(context);\n return {\n ...result,\n items: [...providedToolMenuItems(getTools()), ...result.items],\n pagination: {\n ...result.pagination,\n hasMore: result.pagination?.hasMore ?? false,\n consumedCount: result.pagination?.consumedCount ?? result.items.length,\n },\n };\n };\n}\n"],"names":["assetTypeToThumb","assetTypeToIcon","fetchGraphQL","SIMPLE_SEARCH_QUERY","MentionMenuSection","PAGINATED_ASSETS_QUERY","WORKSPACE_MEMBERS_QUERY","TOOL_CATALOG_QUERY"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../../src/chat-ui/mentions/suggestions/data/sources/index.ts"],"sourcesContent":["/**\n * Mention data sources shared by every chat host.\n *\n * Each source function implements the SourceFn interface:\n * (context: SourceContext) => Promise<SourceResult>\n *\n * Sources are either:\n * - FETCHERS: Call GraphQL API (assets, folders, team, etc.)\n * - TRANSFORMERS: Return static/local data (root categories, host-provided items)\n */\n\nimport type {\n MenuItem,\n MentionTool,\n SourceFn,\n SourceResult,\n SourceToRegister,\n FetchMetadata,\n WebpageMention,\n} from \"../types\";\nimport { MentionMenuSection } from \"../types\";\nimport {\n fetchGraphQL,\n SIMPLE_SEARCH_QUERY,\n PAGINATED_ASSETS_QUERY,\n WORKSPACE_MEMBERS_QUERY,\n TOOL_CATALOG_QUERY,\n type MentionAuthContext,\n type AssetResult,\n type WorkspaceMember,\n type ToolCatalogResult,\n} from \"../api-client\";\nimport { assetTypeToThumb, assetTypeToIcon } from \"./asset-type-icons\";\n\n// ── Helpers ──\n\nfunction assetToMenuItem(asset: AssetResult): MenuItem {\n const isFolder = asset.athenaOriginalType === \"folder\";\n const displayType = asset.athenaConvertedType || asset.athenaOriginalType;\n return {\n id: asset.id,\n name: asset.title || \"Untitled\",\n type: isFolder ? \"folder\" : \"asset\",\n thumbnailUrl: assetTypeToThumb(displayType),\n fallbackIcon: assetTypeToIcon(displayType),\n navigatesToScope: isFolder ? asset.id : undefined,\n visibleInScopes: new Set(),\n updatedAt: asset.updatedAt ?? undefined,\n extra: {\n athenaOriginalType: asset.athenaOriginalType,\n athenaConvertedType: asset.athenaConvertedType,\n parentFolderId: asset.parentFolderId,\n },\n };\n}\n\nasync function querySimpleSearch(\n auth: MentionAuthContext,\n opts: {\n query?: string;\n limit: number;\n offset: number;\n includeTypes?: string[];\n excludeTypes?: string[];\n },\n): Promise<{ items: MenuItem[]; hasMore: boolean }> {\n const searchRequest: Record<string, any> = {\n query: opts.query?.trim() || \"\",\n type: opts.includeTypes || [],\n notType: opts.excludeTypes || [],\n limit: opts.limit,\n offset: opts.offset,\n };\n\n const input = {\n searchRequest,\n returnFullAsset: true,\n shouldCalculateTotal: false,\n sort: { field: \"UPDATED_AT\", direction: \"DESC\" },\n filterColumns: { isArchived: false, isHidden: false },\n };\n\n const data = await fetchGraphQL<{\n simpleSearch: { assets: AssetResult[]; totalCount: number };\n }>(auth, SIMPLE_SEARCH_QUERY, { input });\n\n const assets = data.simpleSearch?.assets || [];\n return {\n items: assets.map(assetToMenuItem),\n hasMore: assets.length === opts.limit,\n };\n}\n\n// ══════════════════════════════════════════════════════════════════════\n// ROOT CATEGORIES (Transformer)\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface RootCategoriesConfig {\n categories: string[];\n getWebpages: () => readonly WebpageMention[];\n}\n\nconst CATEGORY_DEFS: Record<\n string,\n { name: string; icon: string; scope: string }\n> = {\n favorites: { name: \"Favorites\", icon: \"star\", scope: \"favorites\" },\n assets: { name: \"Assets\", icon: \"file-text\", scope: \"athena_assets\" },\n projects: {\n name: \"Projects\",\n icon: \"folder-kanban\",\n scope: \"athena_projects\",\n },\n browse_profiles: {\n name: \"Browse Profiles\",\n icon: \"globe\",\n scope: \"athena_browse_profiles\",\n },\n folders: { name: \"Folders\", icon: \"folder\", scope: \"athena_folders\" },\n tools: { name: \"Tools\", icon: \"wrench\", scope: \"tools\" },\n toolkits: { name: \"Toolkits\", icon: \"package\", scope: \"toolkits\" },\n team: { name: \"Team\", icon: \"users\", scope: \"team\" },\n drives: { name: \"Drives\", icon: \"hard-drive\", scope: \"drive_catalogs\" },\n};\n\nfunction webpageDescription(webpage: WebpageMention): string {\n try {\n const hostname = new URL(webpage.url).hostname;\n return webpage.isCurrent ? `${webpage.title} · ${hostname}` : hostname;\n } catch {\n return webpage.title;\n }\n}\n\nfunction webpageToMenuItem(webpage: WebpageMention): MenuItem {\n return {\n id: `webpage-tab-${webpage.tabId}`,\n name: webpage.isCurrent ? \"This webpage\" : webpage.title,\n type: \"tab\",\n thumbnailUrl: assetTypeToThumb(\"web_page\"),\n fallbackIcon: \"globe\",\n visibleInScopes: new Set([\"root\"]),\n description: webpageDescription(webpage),\n url: webpage.url,\n menuSection: webpage.isCurrent\n ? MentionMenuSection.CURRENT_WEBPAGE\n : MentionMenuSection.OTHER_WEBPAGES,\n extra: {\n tabId: webpage.tabId,\n title: webpage.title,\n isCurrent: webpage.isCurrent,\n },\n };\n}\n\nexport function buildRootMenuItems({\n categories,\n webpages,\n}: {\n categories: readonly string[];\n webpages: readonly WebpageMention[];\n}): MenuItem[] {\n const webpageItems = webpages.map(webpageToMenuItem);\n const categoryItems = categories\n .filter((cat: string) => CATEGORY_DEFS[cat])\n .map((cat: string) => {\n const def = CATEGORY_DEFS[cat];\n return {\n id: cat,\n name: def.name,\n type: \"menu\" as const,\n fallbackIcon: def.icon,\n visibleInScopes: new Set([\"root\"]),\n navigatesToScope: def.scope,\n isNavigationOnly: true,\n menuSection: MentionMenuSection.LIBRARY,\n };\n });\n\n return [...webpageItems, ...categoryItems];\n}\n\nexport const transformRootCategories: SourceFn<RootCategoriesConfig> = async (\n context,\n) => {\n const { sourceConfig } = context;\n const items = buildRootMenuItems({\n categories: sourceConfig.categories,\n webpages: sourceConfig.getWebpages(),\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// ASSETS (Fetcher) — All non-folder assets via SimpleSearch\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface AssetsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchAssets: SourceFn<AssetsConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n excludeTypes: [\"folder\", \"catalog\", \"session\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FAVORITES (Fetcher) — Favorited assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FavoritesConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFavorites: SourceFn<FavoritesConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId: null,\n filterTypes: null,\n filterColumns: {\n isFavorited: true,\n isArchived: false,\n isHidden: false,\n },\n });\n\n const assets = data.getPaginatedAssetsForWorkspace || [];\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: { hasMore: assets.length === limit },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDERS (Fetcher) — All folders as flat list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FoldersConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolders: SourceFn<FoldersConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: [\"folder\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDER CONTENTS (Fetcher) — Contents of a specific folder\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FolderContentsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolderContents: SourceFn<FolderContentsConfig> = async (\n context,\n) => {\n const { scope, query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n // Scope IS the folder ID (or 'internal_drive' for root)\n const parentFolderId = scope === \"internal_drive\" ? null : scope;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId,\n filterTypes: null,\n filterColumns: {\n isArchived: false,\n isHidden: false,\n ...(query ? { title: [{ op: \"LIKE\", value: `%${query}%` }] } : {}),\n },\n });\n\n const rawAssets = data.getPaginatedAssetsForWorkspace || [];\n // Exclude catalogs from folder contents\n const assets = rawAssets.filter(\n (a) =>\n a.athenaConvertedType !== \"catalog\" && a.athenaOriginalType !== \"catalog\",\n );\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: {\n hasMore: rawAssets.length === limit,\n consumedCount: rawAssets.length,\n },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// PROJECTS (Fetcher) — Project assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TypedAssetsConfig {\n auth: MentionAuthContext;\n includeOnlyTypes: string[];\n limit?: number;\n}\n\nexport const fetchTypedAssets: SourceFn<TypedAssetsConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: sourceConfig.includeOnlyTypes,\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TEAM (Fetcher) — Workspace members\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TeamConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchTeam: SourceFn<TeamConfig> = async (context) => {\n const { sourceConfig } = context;\n const { auth } = sourceConfig;\n\n if (!auth.workspaceId) {\n return { items: [], pagination: { hasMore: false } };\n }\n\n const data = await fetchGraphQL<{ getUsersInWorkspace: WorkspaceMember[] }>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId: auth.workspaceId },\n );\n\n const members = data.getUsersInWorkspace || [];\n const items: MenuItem[] = members.map((member) => {\n const displayName =\n [member.firstName, member.lastName].filter(Boolean).join(\" \").trim() ||\n member.email ||\n \"Unknown User\";\n\n return {\n id: member.email || member.id,\n name: displayName,\n type: \"user\" as const,\n fallbackIcon: \"user\",\n visibleInScopes: new Set<string>(),\n email: member.email ?? undefined,\n extra: { isAdmin: member.isAdmin },\n };\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TOOLS / TOOLKITS (Fetcher) — Mentionable tool catalog\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ToolCatalogConfig {\n auth: MentionAuthContext;\n}\n\n// getToolkitToToolsMapping is already filtered server-side for the\n// authenticated user (admin-only entries, beta allowlist, workspace registry),\n// so only mention/menu visibility is applied here.\nasync function queryToolCatalog(\n auth: MentionAuthContext,\n): Promise<ToolCatalogResult[\"getToolkitToToolsMapping\"]> {\n const data = await fetchGraphQL<ToolCatalogResult>(auth, TOOL_CATALOG_QUERY);\n return data.getToolkitToToolsMapping;\n}\n\nexport const fetchTools: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.tools\n .filter((tool) => tool.isMentionable)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: \"tool\" as const,\n fallbackIcon: tool.icon,\n description: tool.description ?? undefined,\n visibleInScopes: new Set<string>(),\n ...(tool.adminOnly ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\nexport const fetchToolkits: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.toolkits\n .filter((toolkit) => toolkit.isMentionable && !toolkit.hideFromMenu)\n .map((toolkit) => ({\n id: toolkit.name,\n name: toolkit.displayName,\n type: \"toolkit\" as const,\n fallbackIcon: toolkit.icon,\n description: toolkit.description || undefined,\n visibleInScopes: new Set<string>(),\n ...(toolkit.onlyAdmin ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// DRIVES (Fetcher) — Drive catalog assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface DrivesConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchDrives: SourceFn<DrivesConfig> = async (context) => {\n const { fetchState, sourceConfig } = context;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n limit: 50,\n offset,\n includeTypes: [\"catalog\"],\n });\n\n // Drive catalogs are navigation-only (navigate into them to see contents)\n const items: MenuItem[] = result.items.map((item) => ({\n ...item,\n type: \"drive_catalog\" as const,\n fallbackIcon: \"hard-drive\",\n isNavigationOnly: true,\n navigatesToScope: item.id,\n }));\n\n // Register folder contents source for each catalog\n const sources: SourceToRegister[] = items.map((item) => ({\n scope: item.id,\n sourceFn: fetchFolderContents,\n sourceConfig: { auth: sourceConfig.auth, limit: 50 },\n }));\n\n return {\n items,\n pagination: { hasMore: result.hasMore },\n sources,\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// GLOBAL SEARCH (Fetcher) — Aggregated search across all sources\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface GlobalSearchConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchGlobalSearch: SourceFn<GlobalSearchConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n if (!query?.trim()) return { items: [], pagination: { hasMore: false } };\n\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit: 50,\n offset,\n excludeTypes: [\"catalog\", \"session\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// HOST-PROVIDED TOOLS (Transformer) — a host's own Tools / Toolkits list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ProvidedToolsConfig {\n getTools: () => readonly MentionTool[];\n type: MentionTool[\"type\"];\n}\n\n/** Menu items for a host-provided tool list, in the host's order. */\nexport function providedToolMenuItems(\n tools: readonly MentionTool[],\n type?: MentionTool[\"type\"],\n): MenuItem[] {\n return tools\n .filter((tool) => type === undefined || tool.type === type)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: tool.type,\n fallbackIcon: tool.icon ?? (tool.type === \"toolkit\" ? \"Package\" : \"Wrench\"),\n description: tool.description,\n visibleInScopes: new Set<string>(),\n }));\n}\n\nexport const transformProvidedTools: SourceFn<ProvidedToolsConfig> = async (\n context,\n) => ({\n items: providedToolMenuItems(\n context.sourceConfig.getTools(),\n context.sourceConfig.type,\n ),\n pagination: { hasMore: false },\n});\n\n/**\n * Prepend a host's tool list to another source's items so a root query matches\n * them the way it matches assets (the cache filters by query and sorts\n * toolkits first). The wrapped source's offset bookkeeping is preserved:\n * `consumedCount` stays the number of rows the server returned, so the added\n * items never advance the next page's offset.\n */\nexport function withProvidedTools<TConfig>(\n source: SourceFn<TConfig>,\n getTools: () => readonly MentionTool[],\n): SourceFn<TConfig> {\n return async (context) => {\n const result = await source(context);\n return {\n ...result,\n items: [...providedToolMenuItems(getTools()), ...result.items],\n pagination: {\n ...result.pagination,\n hasMore: result.pagination?.hasMore ?? false,\n consumedCount: result.pagination?.consumedCount ?? result.items.length,\n },\n };\n };\n}\n"],"names":["assetTypeToThumb","assetTypeToIcon","fetchGraphQL","SIMPLE_SEARCH_QUERY","MentionMenuSection","PAGINATED_ASSETS_QUERY","WORKSPACE_MEMBERS_QUERY","TOOL_CATALOG_QUERY"],"mappings":";;;;;AAoCA,SAAS,gBAAgB,OAA8B;AACrD,QAAM,WAAW,MAAM,uBAAuB;AAC9C,QAAM,cAAc,MAAM,uBAAuB,MAAM;AACvD,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM,SAAS;AAAA,IACrB,MAAM,WAAW,WAAW;AAAA,IAC5B,cAAcA,eAAAA,iBAAiB,WAAW;AAAA,IAC1C,cAAcC,eAAAA,gBAAgB,WAAW;AAAA,IACzC,kBAAkB,WAAW,MAAM,KAAK;AAAA,IACxC,qCAAqB,IAAA;AAAA,IACrB,WAAW,MAAM,aAAa;AAAA,IAC9B,OAAO;AAAA,MACL,oBAAoB,MAAM;AAAA,MAC1B,qBAAqB,MAAM;AAAA,MAC3B,gBAAgB,MAAM;AAAA,IAAA;AAAA,EACxB;AAEJ;AAEA,eAAe,kBACb,MACA,MAOkD;;AAClD,QAAM,gBAAqC;AAAA,IACzC,SAAO,UAAK,UAAL,mBAAY,WAAU;AAAA,IAC7B,MAAM,KAAK,gBAAgB,CAAA;AAAA,IAC3B,SAAS,KAAK,gBAAgB,CAAA;AAAA,IAC9B,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,EAAA;AAGf,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,MAAM,EAAE,OAAO,cAAc,WAAW,OAAA;AAAA,IACxC,eAAe,EAAE,YAAY,OAAO,UAAU,MAAA;AAAA,EAAM;AAGtD,QAAM,OAAO,MAAMC,UAAAA,aAEhB,MAAMC,UAAAA,qBAAqB,EAAE,OAAO;AAEvC,QAAM,WAAS,UAAK,iBAAL,mBAAmB,WAAU,CAAA;AAC5C,SAAO;AAAA,IACL,OAAO,OAAO,IAAI,eAAe;AAAA,IACjC,SAAS,OAAO,WAAW,KAAK;AAAA,EAAA;AAEpC;AAWA,MAAM,gBAGF;AAAA,EACF,WAAW,EAAE,MAAM,aAAa,MAAM,QAAQ,OAAO,YAAA;AAAA,EACrD,QAAQ,EAAE,MAAM,UAAU,MAAM,aAAa,OAAO,gBAAA;AAAA,EACpD,UAAU;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,SAAS,EAAE,MAAM,WAAW,MAAM,UAAU,OAAO,iBAAA;AAAA,EACnD,OAAO,EAAE,MAAM,SAAS,MAAM,UAAU,OAAO,QAAA;AAAA,EAC/C,UAAU,EAAE,MAAM,YAAY,MAAM,WAAW,OAAO,WAAA;AAAA,EACtD,MAAM,EAAE,MAAM,QAAQ,MAAM,SAAS,OAAO,OAAA;AAAA,EAC5C,QAAQ,EAAE,MAAM,UAAU,MAAM,cAAc,OAAO,iBAAA;AACvD;AAEA,SAAS,mBAAmB,SAAiC;AAC3D,MAAI;AACF,UAAM,WAAW,IAAI,IAAI,QAAQ,GAAG,EAAE;AACtC,WAAO,QAAQ,YAAY,GAAG,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAAA,EAChE,QAAQ;AACN,WAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,kBAAkB,SAAmC;AAC5D,SAAO;AAAA,IACL,IAAI,eAAe,QAAQ,KAAK;AAAA,IAChC,MAAM,QAAQ,YAAY,iBAAiB,QAAQ;AAAA,IACnD,MAAM;AAAA,IACN,cAAcH,eAAAA,iBAAiB,UAAU;AAAA,IACzC,cAAc;AAAA,IACd,iBAAiB,oBAAI,IAAI,CAAC,MAAM,CAAC;AAAA,IACjC,aAAa,mBAAmB,OAAO;AAAA,IACvC,KAAK,QAAQ;AAAA,IACb,aAAa,QAAQ,YACjBI,MAAAA,mBAAmB,kBACnBA,MAAAA,mBAAmB;AAAA,IACvB,OAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,IAAA;AAAA,EACrB;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGe;AACb,QAAM,eAAe,SAAS,IAAI,iBAAiB;AACnD,QAAM,gBAAgB,WACnB,OAAO,CAAC,QAAgB,cAAc,GAAG,CAAC,EAC1C,IAAI,CAAC,QAAgB;AACpB,UAAM,MAAM,cAAc,GAAG;AAC7B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,IAAI;AAAA,MACV,MAAM;AAAA,MACN,cAAc,IAAI;AAAA,MAClB,iBAAiB,oBAAI,IAAI,CAAC,MAAM,CAAC;AAAA,MACjC,kBAAkB,IAAI;AAAA,MACtB,kBAAkB;AAAA,MAClB,aAAaA,MAAAA,mBAAmB;AAAA,IAAA;AAAA,EAEpC,CAAC;AAEH,SAAO,CAAC,GAAG,cAAc,GAAG,aAAa;AAC3C;AAEO,MAAM,0BAA0D,OACrE,YACG;AACH,QAAM,EAAE,iBAAiB;AACzB,QAAM,QAAQ,mBAAmB;AAAA,IAC/B,YAAY,aAAa;AAAA,IACzB,UAAU,aAAa,YAAA;AAAA,EAAY,CACpC;AAED,SAAO,EAAE,OAAO,YAAY,EAAE,SAAS,QAAM;AAC/C;AAWO,MAAM,cAAsC,OAAO,YAAY;AACpE,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB;AAC5C,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,SAAS,MAAM,kBAAkB,aAAa,MAAM;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC,UAAU,WAAW,SAAS;AAAA,EAAA,CAC9C;AAED,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,YAAY,EAAE,SAAS,OAAO,QAAA;AAAA,EAAQ;AAE1C;AAWO,MAAM,iBAA4C,OAAO,YAAY;AAC1E,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB;AAC5C,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,OAAO,MAAMF,UAAAA,aAEhB,aAAa,MAAMG,UAAAA,wBAAwB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,eAAe;AAAA,MACb,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EACZ,CACD;AAED,QAAM,SAAS,KAAK,kCAAkC,CAAA;AACtD,QAAM,QAAQ,OAAO,IAAI,eAAe;AAExC,SAAO;AAAA,IACL;AAAA,IACA,YAAY,EAAE,SAAS,OAAO,WAAW,MAAA;AAAA,EAAM;AAEnD;AAWO,MAAM,eAAwC,OAAO,YAAY;AACtE,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB;AAC5C,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,SAAS,MAAM,kBAAkB,aAAa,MAAM;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC,QAAQ;AAAA,EAAA,CACxB;AAED,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,YAAY,EAAE,SAAS,OAAO,QAAA;AAAA,EAAQ;AAE1C;AAWO,MAAM,sBAAsD,OACjE,YACG;AACH,QAAM,EAAE,OAAO,OAAO,YAAY,iBAAiB;AACnD,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAGtC,QAAM,iBAAiB,UAAU,mBAAmB,OAAO;AAE3D,QAAM,OAAO,MAAMH,UAAAA,aAEhB,aAAa,MAAMG,UAAAA,wBAAwB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,eAAe;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,GAAI,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,QAAQ,OAAO,IAAI,KAAK,IAAA,CAAK,EAAA,IAAM,CAAA;AAAA,IAAC;AAAA,EAClE,CACD;AAED,QAAM,YAAY,KAAK,kCAAkC,CAAA;AAEzD,QAAM,SAAS,UAAU;AAAA,IACvB,CAAC,MACC,EAAE,wBAAwB,aAAa,EAAE,uBAAuB;AAAA,EAAA;AAEpE,QAAM,QAAQ,OAAO,IAAI,eAAe;AAExC,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,MACV,SAAS,UAAU,WAAW;AAAA,MAC9B,eAAe,UAAU;AAAA,IAAA;AAAA,EAC3B;AAEJ;AAYO,MAAM,mBAAgD,OAC3D,YACG;AACH,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB;AAC5C,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,SAAS,MAAM,kBAAkB,aAAa,MAAM;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,aAAa;AAAA,EAAA,CAC5B;AAED,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,YAAY,EAAE,SAAS,OAAO,QAAA;AAAA,EAAQ;AAE1C;AAUO,MAAM,YAAkC,OAAO,YAAY;AAChE,QAAM,EAAE,iBAAiB;AACzB,QAAM,EAAE,SAAS;AAEjB,MAAI,CAAC,KAAK,aAAa;AACrB,WAAO,EAAE,OAAO,CAAA,GAAI,YAAY,EAAE,SAAS,QAAM;AAAA,EACnD;AAEA,QAAM,OAAO,MAAMH,UAAAA;AAAAA,IACjB;AAAA,IACAI,UAAAA;AAAAA,IACA,EAAE,aAAa,KAAK,YAAA;AAAA,EAAY;AAGlC,QAAM,UAAU,KAAK,uBAAuB,CAAA;AAC5C,QAAM,QAAoB,QAAQ,IAAI,CAAC,WAAW;AAChD,UAAM,cACJ,CAAC,OAAO,WAAW,OAAO,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,KAAA,KAC9D,OAAO,SACP;AAEF,WAAO;AAAA,MACL,IAAI,OAAO,SAAS,OAAO;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,MACd,qCAAqB,IAAA;AAAA,MACrB,OAAO,OAAO,SAAS;AAAA,MACvB,OAAO,EAAE,SAAS,OAAO,QAAA;AAAA,IAAQ;AAAA,EAErC,CAAC;AAED,SAAO,EAAE,OAAO,YAAY,EAAE,SAAS,QAAM;AAC/C;AAaA,eAAe,iBACb,MACwD;AACxD,QAAM,OAAO,MAAMJ,uBAAgC,MAAMK,UAAAA,kBAAkB;AAC3E,SAAO,KAAK;AACd;AAEO,MAAM,aAA0C,OAAO,YAAY;AACxE,QAAM,UAAU,MAAM,iBAAiB,QAAQ,aAAa,IAAI;AAEhE,QAAM,QAAoB,QAAQ,MAC/B,OAAO,CAAC,SAAS,KAAK,aAAa,EACnC,IAAI,CAAC,UAAU;AAAA,IACd,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,MAAM;AAAA,IACN,cAAc,KAAK;AAAA,IACnB,aAAa,KAAK,eAAe;AAAA,IACjC,qCAAqB,IAAA;AAAA,IACrB,GAAI,KAAK,YAAY,EAAE,OAAO,EAAE,aAAa,KAAA,MAAW,CAAA;AAAA,EAAC,EACzD;AAEJ,SAAO,EAAE,OAAO,YAAY,EAAE,SAAS,QAAM;AAC/C;AAEO,MAAM,gBAA6C,OAAO,YAAY;AAC3E,QAAM,UAAU,MAAM,iBAAiB,QAAQ,aAAa,IAAI;AAEhE,QAAM,QAAoB,QAAQ,SAC/B,OAAO,CAAC,YAAY,QAAQ,iBAAiB,CAAC,QAAQ,YAAY,EAClE,IAAI,CAAC,aAAa;AAAA,IACjB,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ,eAAe;AAAA,IACpC,qCAAqB,IAAA;AAAA,IACrB,GAAI,QAAQ,YAAY,EAAE,OAAO,EAAE,aAAa,KAAA,MAAW,CAAA;AAAA,EAAC,EAC5D;AAEJ,SAAO,EAAE,OAAO,YAAY,EAAE,SAAS,QAAM;AAC/C;AAUO,MAAM,cAAsC,OAAO,YAAY;AACpE,QAAM,EAAE,YAAY,aAAA,IAAiB;AACrC,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,SAAS,MAAM,kBAAkB,aAAa,MAAM;AAAA,IACxD,OAAO;AAAA,IACP;AAAA,IACA,cAAc,CAAC,SAAS;AAAA,EAAA,CACzB;AAGD,QAAM,QAAoB,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IACpD,GAAG;AAAA,IACH,MAAM;AAAA,IACN,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,kBAAkB,KAAK;AAAA,EAAA,EACvB;AAGF,QAAM,UAA8B,MAAM,IAAI,CAAC,UAAU;AAAA,IACvD,OAAO,KAAK;AAAA,IACZ,UAAU;AAAA,IACV,cAAc,EAAE,MAAM,aAAa,MAAM,OAAO,GAAA;AAAA,EAAG,EACnD;AAEF,SAAO;AAAA,IACL;AAAA,IACA,YAAY,EAAE,SAAS,OAAO,QAAA;AAAA,IAC9B;AAAA,EAAA;AAEJ;AAUO,MAAM,oBAAkD,OAC7D,YACG;AACH,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB;AAC5C,MAAI,EAAC,+BAAO,QAAQ,QAAO,EAAE,OAAO,CAAA,GAAI,YAAY,EAAE,SAAS,QAAM;AAErE,QAAM,OAAQ,WAAW,QAA0B,CAAA;AACnD,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,SAAS,MAAM,kBAAkB,aAAa,MAAM;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,cAAc,CAAC,WAAW,SAAS;AAAA,EAAA,CACpC;AAED,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,YAAY,EAAE,SAAS,OAAO,QAAA;AAAA,EAAQ;AAE1C;AAYO,SAAS,sBACd,OACA,MACY;AACZ,SAAO,MACJ,OAAO,CAAC,SAAS,SAAS,UAAa,KAAK,SAAS,IAAI,EACzD,IAAI,CAAC,UAAU;AAAA,IACd,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,cAAc,KAAK,SAAS,KAAK,SAAS,YAAY,YAAY;AAAA,IAClE,aAAa,KAAK;AAAA,IAClB,qCAAqB,IAAA;AAAA,EAAY,EACjC;AACN;AAEO,MAAM,yBAAwD,OACnE,aACI;AAAA,EACJ,OAAO;AAAA,IACL,QAAQ,aAAa,SAAA;AAAA,IACrB,QAAQ,aAAa;AAAA,EAAA;AAAA,EAEvB,YAAY,EAAE,SAAS,MAAA;AACzB;AASO,SAAS,kBACd,QACA,UACmB;AACnB,SAAO,OAAO,YAAY;;AACxB,UAAM,SAAS,MAAM,OAAO,OAAO;AACnC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,CAAC,GAAG,sBAAsB,UAAU,GAAG,GAAG,OAAO,KAAK;AAAA,MAC7D,YAAY;AAAA,QACV,GAAG,OAAO;AAAA,QACV,WAAS,YAAO,eAAP,mBAAmB,YAAW;AAAA,QACvC,iBAAe,YAAO,eAAP,mBAAmB,kBAAiB,OAAO,MAAM;AAAA,MAAA;AAAA,IAClE;AAAA,EAEJ;AACF;;;;;;;;;;;;;;;;"}
|
|
@@ -125,14 +125,7 @@ const fetchAssets = async (context) => {
|
|
|
125
125
|
query,
|
|
126
126
|
limit,
|
|
127
127
|
offset,
|
|
128
|
-
excludeTypes: [
|
|
129
|
-
"folder",
|
|
130
|
-
"catalog",
|
|
131
|
-
"spaces",
|
|
132
|
-
"session",
|
|
133
|
-
"table",
|
|
134
|
-
"task_item"
|
|
135
|
-
]
|
|
128
|
+
excludeTypes: ["folder", "catalog", "session"]
|
|
136
129
|
});
|
|
137
130
|
return {
|
|
138
131
|
items: result.items,
|
|
@@ -316,7 +309,7 @@ const fetchGlobalSearch = async (context) => {
|
|
|
316
309
|
query,
|
|
317
310
|
limit: 50,
|
|
318
311
|
offset,
|
|
319
|
-
excludeTypes: ["
|
|
312
|
+
excludeTypes: ["catalog", "session"]
|
|
320
313
|
});
|
|
321
314
|
return {
|
|
322
315
|
items: result.items,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../src/chat-ui/mentions/suggestions/data/sources/index.ts"],"sourcesContent":["/**\n * Mention data sources shared by every chat host.\n *\n * Each source function implements the SourceFn interface:\n * (context: SourceContext) => Promise<SourceResult>\n *\n * Sources are either:\n * - FETCHERS: Call GraphQL API (assets, folders, team, etc.)\n * - TRANSFORMERS: Return static/local data (root categories, host-provided items)\n */\n\nimport type {\n MenuItem,\n MentionTool,\n SourceFn,\n SourceResult,\n SourceToRegister,\n FetchMetadata,\n WebpageMention,\n} from \"../types\";\nimport { MentionMenuSection } from \"../types\";\nimport {\n fetchGraphQL,\n SIMPLE_SEARCH_QUERY,\n PAGINATED_ASSETS_QUERY,\n WORKSPACE_MEMBERS_QUERY,\n TOOL_CATALOG_QUERY,\n type MentionAuthContext,\n type AssetResult,\n type WorkspaceMember,\n type ToolCatalogResult,\n} from \"../api-client\";\nimport { assetTypeToThumb, assetTypeToIcon } from \"./asset-type-icons\";\n\n// ── Helpers ──\n\nfunction assetToMenuItem(asset: AssetResult): MenuItem {\n const isFolder = asset.athenaOriginalType === \"folder\";\n const displayType = asset.athenaConvertedType || asset.athenaOriginalType;\n return {\n id: asset.id,\n name: asset.title || \"Untitled\",\n type: isFolder ? \"folder\" : \"asset\",\n thumbnailUrl: assetTypeToThumb(displayType),\n fallbackIcon: assetTypeToIcon(displayType),\n navigatesToScope: isFolder ? asset.id : undefined,\n visibleInScopes: new Set(),\n updatedAt: asset.updatedAt ?? undefined,\n extra: {\n athenaOriginalType: asset.athenaOriginalType,\n athenaConvertedType: asset.athenaConvertedType,\n parentFolderId: asset.parentFolderId,\n },\n };\n}\n\nasync function querySimpleSearch(\n auth: MentionAuthContext,\n opts: {\n query?: string;\n limit: number;\n offset: number;\n includeTypes?: string[];\n excludeTypes?: string[];\n },\n): Promise<{ items: MenuItem[]; hasMore: boolean }> {\n const searchRequest: Record<string, any> = {\n query: opts.query?.trim() || \"\",\n type: opts.includeTypes || [],\n notType: opts.excludeTypes || [],\n limit: opts.limit,\n offset: opts.offset,\n };\n\n const input = {\n searchRequest,\n returnFullAsset: true,\n shouldCalculateTotal: false,\n sort: { field: \"UPDATED_AT\", direction: \"DESC\" },\n filterColumns: { isArchived: false, isHidden: false },\n };\n\n const data = await fetchGraphQL<{\n simpleSearch: { assets: AssetResult[]; totalCount: number };\n }>(auth, SIMPLE_SEARCH_QUERY, { input });\n\n const assets = data.simpleSearch?.assets || [];\n return {\n items: assets.map(assetToMenuItem),\n hasMore: assets.length === opts.limit,\n };\n}\n\n// ══════════════════════════════════════════════════════════════════════\n// ROOT CATEGORIES (Transformer)\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface RootCategoriesConfig {\n categories: string[];\n getWebpages: () => readonly WebpageMention[];\n}\n\nconst CATEGORY_DEFS: Record<\n string,\n { name: string; icon: string; scope: string }\n> = {\n favorites: { name: \"Favorites\", icon: \"star\", scope: \"favorites\" },\n assets: { name: \"Assets\", icon: \"file-text\", scope: \"athena_assets\" },\n projects: {\n name: \"Projects\",\n icon: \"folder-kanban\",\n scope: \"athena_projects\",\n },\n browse_profiles: {\n name: \"Browse Profiles\",\n icon: \"globe\",\n scope: \"athena_browse_profiles\",\n },\n folders: { name: \"Folders\", icon: \"folder\", scope: \"athena_folders\" },\n tools: { name: \"Tools\", icon: \"wrench\", scope: \"tools\" },\n toolkits: { name: \"Toolkits\", icon: \"package\", scope: \"toolkits\" },\n team: { name: \"Team\", icon: \"users\", scope: \"team\" },\n drives: { name: \"Drives\", icon: \"hard-drive\", scope: \"drive_catalogs\" },\n};\n\nfunction webpageDescription(webpage: WebpageMention): string {\n try {\n const hostname = new URL(webpage.url).hostname;\n return webpage.isCurrent ? `${webpage.title} · ${hostname}` : hostname;\n } catch {\n return webpage.title;\n }\n}\n\nfunction webpageToMenuItem(webpage: WebpageMention): MenuItem {\n return {\n id: `webpage-tab-${webpage.tabId}`,\n name: webpage.isCurrent ? \"This webpage\" : webpage.title,\n type: \"tab\",\n thumbnailUrl: assetTypeToThumb(\"web_page\"),\n fallbackIcon: \"globe\",\n visibleInScopes: new Set([\"root\"]),\n description: webpageDescription(webpage),\n url: webpage.url,\n menuSection: webpage.isCurrent\n ? MentionMenuSection.CURRENT_WEBPAGE\n : MentionMenuSection.OTHER_WEBPAGES,\n extra: {\n tabId: webpage.tabId,\n title: webpage.title,\n isCurrent: webpage.isCurrent,\n },\n };\n}\n\nexport function buildRootMenuItems({\n categories,\n webpages,\n}: {\n categories: readonly string[];\n webpages: readonly WebpageMention[];\n}): MenuItem[] {\n const webpageItems = webpages.map(webpageToMenuItem);\n const categoryItems = categories\n .filter((cat: string) => CATEGORY_DEFS[cat])\n .map((cat: string) => {\n const def = CATEGORY_DEFS[cat];\n return {\n id: cat,\n name: def.name,\n type: \"menu\" as const,\n fallbackIcon: def.icon,\n visibleInScopes: new Set([\"root\"]),\n navigatesToScope: def.scope,\n isNavigationOnly: true,\n menuSection: MentionMenuSection.LIBRARY,\n };\n });\n\n return [...webpageItems, ...categoryItems];\n}\n\nexport const transformRootCategories: SourceFn<RootCategoriesConfig> = async (\n context,\n) => {\n const { sourceConfig } = context;\n const items = buildRootMenuItems({\n categories: sourceConfig.categories,\n webpages: sourceConfig.getWebpages(),\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// ASSETS (Fetcher) — All non-folder assets via SimpleSearch\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface AssetsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchAssets: SourceFn<AssetsConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n excludeTypes: [\n \"folder\",\n \"catalog\",\n \"spaces\",\n \"session\",\n \"table\",\n \"task_item\",\n ],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FAVORITES (Fetcher) — Favorited assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FavoritesConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFavorites: SourceFn<FavoritesConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId: null,\n filterTypes: null,\n filterColumns: {\n isFavorited: true,\n isArchived: false,\n isHidden: false,\n },\n });\n\n const assets = data.getPaginatedAssetsForWorkspace || [];\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: { hasMore: assets.length === limit },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDERS (Fetcher) — All folders as flat list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FoldersConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolders: SourceFn<FoldersConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: [\"folder\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDER CONTENTS (Fetcher) — Contents of a specific folder\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FolderContentsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolderContents: SourceFn<FolderContentsConfig> = async (\n context,\n) => {\n const { scope, query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n // Scope IS the folder ID (or 'internal_drive' for root)\n const parentFolderId = scope === \"internal_drive\" ? null : scope;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId,\n filterTypes: null,\n filterColumns: {\n isArchived: false,\n isHidden: false,\n ...(query ? { title: [{ op: \"LIKE\", value: `%${query}%` }] } : {}),\n },\n });\n\n const rawAssets = data.getPaginatedAssetsForWorkspace || [];\n // Exclude catalogs from folder contents\n const assets = rawAssets.filter(\n (a) =>\n a.athenaConvertedType !== \"catalog\" && a.athenaOriginalType !== \"catalog\",\n );\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: {\n hasMore: rawAssets.length === limit,\n consumedCount: rawAssets.length,\n },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// PROJECTS (Fetcher) — Project assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TypedAssetsConfig {\n auth: MentionAuthContext;\n includeOnlyTypes: string[];\n limit?: number;\n}\n\nexport const fetchTypedAssets: SourceFn<TypedAssetsConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: sourceConfig.includeOnlyTypes,\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TEAM (Fetcher) — Workspace members\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TeamConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchTeam: SourceFn<TeamConfig> = async (context) => {\n const { sourceConfig } = context;\n const { auth } = sourceConfig;\n\n if (!auth.workspaceId) {\n return { items: [], pagination: { hasMore: false } };\n }\n\n const data = await fetchGraphQL<{ getUsersInWorkspace: WorkspaceMember[] }>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId: auth.workspaceId },\n );\n\n const members = data.getUsersInWorkspace || [];\n const items: MenuItem[] = members.map((member) => {\n const displayName =\n [member.firstName, member.lastName].filter(Boolean).join(\" \").trim() ||\n member.email ||\n \"Unknown User\";\n\n return {\n id: member.email || member.id,\n name: displayName,\n type: \"user\" as const,\n fallbackIcon: \"user\",\n visibleInScopes: new Set<string>(),\n email: member.email ?? undefined,\n extra: { isAdmin: member.isAdmin },\n };\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TOOLS / TOOLKITS (Fetcher) — Mentionable tool catalog\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ToolCatalogConfig {\n auth: MentionAuthContext;\n}\n\n// getToolkitToToolsMapping is already filtered server-side for the\n// authenticated user (admin-only entries, beta allowlist, workspace registry),\n// so only mention/menu visibility is applied here.\nasync function queryToolCatalog(\n auth: MentionAuthContext,\n): Promise<ToolCatalogResult[\"getToolkitToToolsMapping\"]> {\n const data = await fetchGraphQL<ToolCatalogResult>(auth, TOOL_CATALOG_QUERY);\n return data.getToolkitToToolsMapping;\n}\n\nexport const fetchTools: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.tools\n .filter((tool) => tool.isMentionable)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: \"tool\" as const,\n fallbackIcon: tool.icon,\n description: tool.description ?? undefined,\n visibleInScopes: new Set<string>(),\n ...(tool.adminOnly ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\nexport const fetchToolkits: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.toolkits\n .filter((toolkit) => toolkit.isMentionable && !toolkit.hideFromMenu)\n .map((toolkit) => ({\n id: toolkit.name,\n name: toolkit.displayName,\n type: \"toolkit\" as const,\n fallbackIcon: toolkit.icon,\n description: toolkit.description || undefined,\n visibleInScopes: new Set<string>(),\n ...(toolkit.onlyAdmin ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// DRIVES (Fetcher) — Drive catalog assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface DrivesConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchDrives: SourceFn<DrivesConfig> = async (context) => {\n const { fetchState, sourceConfig } = context;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n limit: 50,\n offset,\n includeTypes: [\"catalog\"],\n });\n\n // Drive catalogs are navigation-only (navigate into them to see contents)\n const items: MenuItem[] = result.items.map((item) => ({\n ...item,\n type: \"drive_catalog\" as const,\n fallbackIcon: \"hard-drive\",\n isNavigationOnly: true,\n navigatesToScope: item.id,\n }));\n\n // Register folder contents source for each catalog\n const sources: SourceToRegister[] = items.map((item) => ({\n scope: item.id,\n sourceFn: fetchFolderContents,\n sourceConfig: { auth: sourceConfig.auth, limit: 50 },\n }));\n\n return {\n items,\n pagination: { hasMore: result.hasMore },\n sources,\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// GLOBAL SEARCH (Fetcher) — Aggregated search across all sources\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface GlobalSearchConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchGlobalSearch: SourceFn<GlobalSearchConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n if (!query?.trim()) return { items: [], pagination: { hasMore: false } };\n\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit: 50,\n offset,\n excludeTypes: [\"table\", \"catalog\", \"spaces\", \"task_item\", \"session\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// HOST-PROVIDED TOOLS (Transformer) — a host's own Tools / Toolkits list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ProvidedToolsConfig {\n getTools: () => readonly MentionTool[];\n type: MentionTool[\"type\"];\n}\n\n/** Menu items for a host-provided tool list, in the host's order. */\nexport function providedToolMenuItems(\n tools: readonly MentionTool[],\n type?: MentionTool[\"type\"],\n): MenuItem[] {\n return tools\n .filter((tool) => type === undefined || tool.type === type)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: tool.type,\n fallbackIcon: tool.icon ?? (tool.type === \"toolkit\" ? \"Package\" : \"Wrench\"),\n description: tool.description,\n visibleInScopes: new Set<string>(),\n }));\n}\n\nexport const transformProvidedTools: SourceFn<ProvidedToolsConfig> = async (\n context,\n) => ({\n items: providedToolMenuItems(\n context.sourceConfig.getTools(),\n context.sourceConfig.type,\n ),\n pagination: { hasMore: false },\n});\n\n/**\n * Prepend a host's tool list to another source's items so a root query matches\n * them the way it matches assets (the cache filters by query and sorts\n * toolkits first). The wrapped source's offset bookkeeping is preserved:\n * `consumedCount` stays the number of rows the server returned, so the added\n * items never advance the next page's offset.\n */\nexport function withProvidedTools<TConfig>(\n source: SourceFn<TConfig>,\n getTools: () => readonly MentionTool[],\n): SourceFn<TConfig> {\n return async (context) => {\n const result = await source(context);\n return {\n ...result,\n items: [...providedToolMenuItems(getTools()), ...result.items],\n pagination: {\n ...result.pagination,\n hasMore: result.pagination?.hasMore ?? false,\n consumedCount: result.pagination?.consumedCount ?? result.items.length,\n },\n };\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/chat-ui/mentions/suggestions/data/sources/index.ts"],"sourcesContent":["/**\n * Mention data sources shared by every chat host.\n *\n * Each source function implements the SourceFn interface:\n * (context: SourceContext) => Promise<SourceResult>\n *\n * Sources are either:\n * - FETCHERS: Call GraphQL API (assets, folders, team, etc.)\n * - TRANSFORMERS: Return static/local data (root categories, host-provided items)\n */\n\nimport type {\n MenuItem,\n MentionTool,\n SourceFn,\n SourceResult,\n SourceToRegister,\n FetchMetadata,\n WebpageMention,\n} from \"../types\";\nimport { MentionMenuSection } from \"../types\";\nimport {\n fetchGraphQL,\n SIMPLE_SEARCH_QUERY,\n PAGINATED_ASSETS_QUERY,\n WORKSPACE_MEMBERS_QUERY,\n TOOL_CATALOG_QUERY,\n type MentionAuthContext,\n type AssetResult,\n type WorkspaceMember,\n type ToolCatalogResult,\n} from \"../api-client\";\nimport { assetTypeToThumb, assetTypeToIcon } from \"./asset-type-icons\";\n\n// ── Helpers ──\n\nfunction assetToMenuItem(asset: AssetResult): MenuItem {\n const isFolder = asset.athenaOriginalType === \"folder\";\n const displayType = asset.athenaConvertedType || asset.athenaOriginalType;\n return {\n id: asset.id,\n name: asset.title || \"Untitled\",\n type: isFolder ? \"folder\" : \"asset\",\n thumbnailUrl: assetTypeToThumb(displayType),\n fallbackIcon: assetTypeToIcon(displayType),\n navigatesToScope: isFolder ? asset.id : undefined,\n visibleInScopes: new Set(),\n updatedAt: asset.updatedAt ?? undefined,\n extra: {\n athenaOriginalType: asset.athenaOriginalType,\n athenaConvertedType: asset.athenaConvertedType,\n parentFolderId: asset.parentFolderId,\n },\n };\n}\n\nasync function querySimpleSearch(\n auth: MentionAuthContext,\n opts: {\n query?: string;\n limit: number;\n offset: number;\n includeTypes?: string[];\n excludeTypes?: string[];\n },\n): Promise<{ items: MenuItem[]; hasMore: boolean }> {\n const searchRequest: Record<string, any> = {\n query: opts.query?.trim() || \"\",\n type: opts.includeTypes || [],\n notType: opts.excludeTypes || [],\n limit: opts.limit,\n offset: opts.offset,\n };\n\n const input = {\n searchRequest,\n returnFullAsset: true,\n shouldCalculateTotal: false,\n sort: { field: \"UPDATED_AT\", direction: \"DESC\" },\n filterColumns: { isArchived: false, isHidden: false },\n };\n\n const data = await fetchGraphQL<{\n simpleSearch: { assets: AssetResult[]; totalCount: number };\n }>(auth, SIMPLE_SEARCH_QUERY, { input });\n\n const assets = data.simpleSearch?.assets || [];\n return {\n items: assets.map(assetToMenuItem),\n hasMore: assets.length === opts.limit,\n };\n}\n\n// ══════════════════════════════════════════════════════════════════════\n// ROOT CATEGORIES (Transformer)\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface RootCategoriesConfig {\n categories: string[];\n getWebpages: () => readonly WebpageMention[];\n}\n\nconst CATEGORY_DEFS: Record<\n string,\n { name: string; icon: string; scope: string }\n> = {\n favorites: { name: \"Favorites\", icon: \"star\", scope: \"favorites\" },\n assets: { name: \"Assets\", icon: \"file-text\", scope: \"athena_assets\" },\n projects: {\n name: \"Projects\",\n icon: \"folder-kanban\",\n scope: \"athena_projects\",\n },\n browse_profiles: {\n name: \"Browse Profiles\",\n icon: \"globe\",\n scope: \"athena_browse_profiles\",\n },\n folders: { name: \"Folders\", icon: \"folder\", scope: \"athena_folders\" },\n tools: { name: \"Tools\", icon: \"wrench\", scope: \"tools\" },\n toolkits: { name: \"Toolkits\", icon: \"package\", scope: \"toolkits\" },\n team: { name: \"Team\", icon: \"users\", scope: \"team\" },\n drives: { name: \"Drives\", icon: \"hard-drive\", scope: \"drive_catalogs\" },\n};\n\nfunction webpageDescription(webpage: WebpageMention): string {\n try {\n const hostname = new URL(webpage.url).hostname;\n return webpage.isCurrent ? `${webpage.title} · ${hostname}` : hostname;\n } catch {\n return webpage.title;\n }\n}\n\nfunction webpageToMenuItem(webpage: WebpageMention): MenuItem {\n return {\n id: `webpage-tab-${webpage.tabId}`,\n name: webpage.isCurrent ? \"This webpage\" : webpage.title,\n type: \"tab\",\n thumbnailUrl: assetTypeToThumb(\"web_page\"),\n fallbackIcon: \"globe\",\n visibleInScopes: new Set([\"root\"]),\n description: webpageDescription(webpage),\n url: webpage.url,\n menuSection: webpage.isCurrent\n ? MentionMenuSection.CURRENT_WEBPAGE\n : MentionMenuSection.OTHER_WEBPAGES,\n extra: {\n tabId: webpage.tabId,\n title: webpage.title,\n isCurrent: webpage.isCurrent,\n },\n };\n}\n\nexport function buildRootMenuItems({\n categories,\n webpages,\n}: {\n categories: readonly string[];\n webpages: readonly WebpageMention[];\n}): MenuItem[] {\n const webpageItems = webpages.map(webpageToMenuItem);\n const categoryItems = categories\n .filter((cat: string) => CATEGORY_DEFS[cat])\n .map((cat: string) => {\n const def = CATEGORY_DEFS[cat];\n return {\n id: cat,\n name: def.name,\n type: \"menu\" as const,\n fallbackIcon: def.icon,\n visibleInScopes: new Set([\"root\"]),\n navigatesToScope: def.scope,\n isNavigationOnly: true,\n menuSection: MentionMenuSection.LIBRARY,\n };\n });\n\n return [...webpageItems, ...categoryItems];\n}\n\nexport const transformRootCategories: SourceFn<RootCategoriesConfig> = async (\n context,\n) => {\n const { sourceConfig } = context;\n const items = buildRootMenuItems({\n categories: sourceConfig.categories,\n webpages: sourceConfig.getWebpages(),\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// ASSETS (Fetcher) — All non-folder assets via SimpleSearch\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface AssetsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchAssets: SourceFn<AssetsConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n excludeTypes: [\"folder\", \"catalog\", \"session\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FAVORITES (Fetcher) — Favorited assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FavoritesConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFavorites: SourceFn<FavoritesConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId: null,\n filterTypes: null,\n filterColumns: {\n isFavorited: true,\n isArchived: false,\n isHidden: false,\n },\n });\n\n const assets = data.getPaginatedAssetsForWorkspace || [];\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: { hasMore: assets.length === limit },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDERS (Fetcher) — All folders as flat list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FoldersConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolders: SourceFn<FoldersConfig> = async (context) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: [\"folder\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// FOLDER CONTENTS (Fetcher) — Contents of a specific folder\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface FolderContentsConfig {\n auth: MentionAuthContext;\n limit?: number;\n}\n\nexport const fetchFolderContents: SourceFn<FolderContentsConfig> = async (\n context,\n) => {\n const { scope, query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n // Scope IS the folder ID (or 'internal_drive' for root)\n const parentFolderId = scope === \"internal_drive\" ? null : scope;\n\n const data = await fetchGraphQL<{\n getPaginatedAssetsForWorkspace: AssetResult[];\n }>(sourceConfig.auth, PAGINATED_ASSETS_QUERY, {\n limit,\n offset,\n parentFolderId,\n filterTypes: null,\n filterColumns: {\n isArchived: false,\n isHidden: false,\n ...(query ? { title: [{ op: \"LIKE\", value: `%${query}%` }] } : {}),\n },\n });\n\n const rawAssets = data.getPaginatedAssetsForWorkspace || [];\n // Exclude catalogs from folder contents\n const assets = rawAssets.filter(\n (a) =>\n a.athenaConvertedType !== \"catalog\" && a.athenaOriginalType !== \"catalog\",\n );\n const items = assets.map(assetToMenuItem);\n\n return {\n items,\n pagination: {\n hasMore: rawAssets.length === limit,\n consumedCount: rawAssets.length,\n },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// PROJECTS (Fetcher) — Project assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TypedAssetsConfig {\n auth: MentionAuthContext;\n includeOnlyTypes: string[];\n limit?: number;\n}\n\nexport const fetchTypedAssets: SourceFn<TypedAssetsConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n const limit = sourceConfig.limit ?? 50;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit,\n offset,\n includeTypes: sourceConfig.includeOnlyTypes,\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TEAM (Fetcher) — Workspace members\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface TeamConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchTeam: SourceFn<TeamConfig> = async (context) => {\n const { sourceConfig } = context;\n const { auth } = sourceConfig;\n\n if (!auth.workspaceId) {\n return { items: [], pagination: { hasMore: false } };\n }\n\n const data = await fetchGraphQL<{ getUsersInWorkspace: WorkspaceMember[] }>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId: auth.workspaceId },\n );\n\n const members = data.getUsersInWorkspace || [];\n const items: MenuItem[] = members.map((member) => {\n const displayName =\n [member.firstName, member.lastName].filter(Boolean).join(\" \").trim() ||\n member.email ||\n \"Unknown User\";\n\n return {\n id: member.email || member.id,\n name: displayName,\n type: \"user\" as const,\n fallbackIcon: \"user\",\n visibleInScopes: new Set<string>(),\n email: member.email ?? undefined,\n extra: { isAdmin: member.isAdmin },\n };\n });\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// TOOLS / TOOLKITS (Fetcher) — Mentionable tool catalog\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ToolCatalogConfig {\n auth: MentionAuthContext;\n}\n\n// getToolkitToToolsMapping is already filtered server-side for the\n// authenticated user (admin-only entries, beta allowlist, workspace registry),\n// so only mention/menu visibility is applied here.\nasync function queryToolCatalog(\n auth: MentionAuthContext,\n): Promise<ToolCatalogResult[\"getToolkitToToolsMapping\"]> {\n const data = await fetchGraphQL<ToolCatalogResult>(auth, TOOL_CATALOG_QUERY);\n return data.getToolkitToToolsMapping;\n}\n\nexport const fetchTools: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.tools\n .filter((tool) => tool.isMentionable)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: \"tool\" as const,\n fallbackIcon: tool.icon,\n description: tool.description ?? undefined,\n visibleInScopes: new Set<string>(),\n ...(tool.adminOnly ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\nexport const fetchToolkits: SourceFn<ToolCatalogConfig> = async (context) => {\n const catalog = await queryToolCatalog(context.sourceConfig.auth);\n\n const items: MenuItem[] = catalog.toolkits\n .filter((toolkit) => toolkit.isMentionable && !toolkit.hideFromMenu)\n .map((toolkit) => ({\n id: toolkit.name,\n name: toolkit.displayName,\n type: \"toolkit\" as const,\n fallbackIcon: toolkit.icon,\n description: toolkit.description || undefined,\n visibleInScopes: new Set<string>(),\n ...(toolkit.onlyAdmin ? { extra: { isAdminOnly: true } } : {}),\n }));\n\n return { items, pagination: { hasMore: false } };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// DRIVES (Fetcher) — Drive catalog assets\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface DrivesConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchDrives: SourceFn<DrivesConfig> = async (context) => {\n const { fetchState, sourceConfig } = context;\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n limit: 50,\n offset,\n includeTypes: [\"catalog\"],\n });\n\n // Drive catalogs are navigation-only (navigate into them to see contents)\n const items: MenuItem[] = result.items.map((item) => ({\n ...item,\n type: \"drive_catalog\" as const,\n fallbackIcon: \"hard-drive\",\n isNavigationOnly: true,\n navigatesToScope: item.id,\n }));\n\n // Register folder contents source for each catalog\n const sources: SourceToRegister[] = items.map((item) => ({\n scope: item.id,\n sourceFn: fetchFolderContents,\n sourceConfig: { auth: sourceConfig.auth, limit: 50 },\n }));\n\n return {\n items,\n pagination: { hasMore: result.hasMore },\n sources,\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// GLOBAL SEARCH (Fetcher) — Aggregated search across all sources\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface GlobalSearchConfig {\n auth: MentionAuthContext;\n}\n\nexport const fetchGlobalSearch: SourceFn<GlobalSearchConfig> = async (\n context,\n) => {\n const { query, fetchState, sourceConfig } = context;\n if (!query?.trim()) return { items: [], pagination: { hasMore: false } };\n\n const meta = (fetchState.meta as FetchMetadata) || {};\n const offset = meta.validatedCount || 0;\n\n const result = await querySimpleSearch(sourceConfig.auth, {\n query,\n limit: 50,\n offset,\n excludeTypes: [\"catalog\", \"session\"],\n });\n\n return {\n items: result.items,\n pagination: { hasMore: result.hasMore },\n };\n};\n\n// ══════════════════════════════════════════════════════════════════════\n// HOST-PROVIDED TOOLS (Transformer) — a host's own Tools / Toolkits list\n// ══════════════════════════════════════════════════════════════════════\n\nexport interface ProvidedToolsConfig {\n getTools: () => readonly MentionTool[];\n type: MentionTool[\"type\"];\n}\n\n/** Menu items for a host-provided tool list, in the host's order. */\nexport function providedToolMenuItems(\n tools: readonly MentionTool[],\n type?: MentionTool[\"type\"],\n): MenuItem[] {\n return tools\n .filter((tool) => type === undefined || tool.type === type)\n .map((tool) => ({\n id: tool.id,\n name: tool.name,\n type: tool.type,\n fallbackIcon: tool.icon ?? (tool.type === \"toolkit\" ? \"Package\" : \"Wrench\"),\n description: tool.description,\n visibleInScopes: new Set<string>(),\n }));\n}\n\nexport const transformProvidedTools: SourceFn<ProvidedToolsConfig> = async (\n context,\n) => ({\n items: providedToolMenuItems(\n context.sourceConfig.getTools(),\n context.sourceConfig.type,\n ),\n pagination: { hasMore: false },\n});\n\n/**\n * Prepend a host's tool list to another source's items so a root query matches\n * them the way it matches assets (the cache filters by query and sorts\n * toolkits first). The wrapped source's offset bookkeeping is preserved:\n * `consumedCount` stays the number of rows the server returned, so the added\n * items never advance the next page's offset.\n */\nexport function withProvidedTools<TConfig>(\n source: SourceFn<TConfig>,\n getTools: () => readonly MentionTool[],\n): SourceFn<TConfig> {\n return async (context) => {\n const result = await source(context);\n return {\n ...result,\n items: [...providedToolMenuItems(getTools()), ...result.items],\n pagination: {\n ...result.pagination,\n hasMore: result.pagination?.hasMore ?? false,\n consumedCount: result.pagination?.consumedCount ?? result.items.length,\n },\n };\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,27 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("@assistant-ui/react");
|
|
5
|
-
require("../../packages/agent-runtime/src/generated/runconfig-contract.cjs");
|
|
6
|
-
const react$1 = require("react");
|
|
7
|
-
require("@assistant-ui/tap");
|
|
8
|
-
require("statewire");
|
|
9
|
-
require("../../packages/agent-runtime/src/statewire-suspended.cjs");
|
|
10
|
-
require("../../packages/agent-runtime/src/conversation-list.cjs");
|
|
11
|
-
require("@tanstack/react-query");
|
|
12
|
-
require("../../packages/agent-runtime/src/statewire-state.cjs");
|
|
13
|
-
require("../../packages/agent-runtime/src/messages.cjs");
|
|
14
|
-
require("@assistant-ui/store");
|
|
15
|
-
const streamingMarkdown = require("../../packages/agent-runtime/src/streaming-markdown.cjs");
|
|
16
|
-
require("../../packages/agent-runtime/src/quota-safe-local-storage-session.cjs");
|
|
17
|
-
require("../../packages/agent-runtime/src/statewire-attach-observer.cjs");
|
|
18
|
-
require("../../packages/agent-runtime/src/thread-status.cjs");
|
|
19
|
-
require("@assistant-ui/react-statewire");
|
|
20
|
-
const voicePresentation = require("../../packages/agent-runtime/src/voice-presentation.cjs");
|
|
21
|
-
const githubWakeEvent = require("../../packages/agent-runtime/src/github-wake-event.cjs");
|
|
22
|
-
const runtimeMessages = require("../../packages/agent-runtime/src/runtime-messages.cjs");
|
|
23
|
-
require("../../packages/agent-runtime/src/thread-handoff.cjs");
|
|
24
5
|
require("@assistant-ui/react-markdown/styles/dot.css");
|
|
25
6
|
const lucideReact = require("lucide-react");
|
|
7
|
+
const react$1 = require("react");
|
|
26
8
|
const useAthenaRunLive = require("../../chat/use-athena-run-live.cjs");
|
|
27
9
|
const chatMessageBody = require("../rich-text/chat-message-body.cjs");
|
|
28
10
|
const messageActionsConfig = require("./message-actions-config.cjs");
|
|
@@ -30,6 +12,10 @@ const runtimeMessage = require("./runtime-message.cjs");
|
|
|
30
12
|
const runningIndicator = require("./running-indicator.cjs");
|
|
31
13
|
const voiceDelegationCard = require("./voice-delegation-card.cjs");
|
|
32
14
|
const wakeMarker = require("./wake-marker.cjs");
|
|
15
|
+
const streamingMarkdown = require("../../packages/agent-runtime/src/streaming-markdown.cjs");
|
|
16
|
+
const githubWakeEvent = require("../../packages/agent-runtime/src/github-wake-event.cjs");
|
|
17
|
+
const voicePresentation = require("../../packages/agent-runtime/src/voice-presentation.cjs");
|
|
18
|
+
const runtimeMessages = require("../../packages/agent-runtime/src/runtime-messages.cjs");
|
|
33
19
|
const cnfast = require("cnfast");
|
|
34
20
|
function IconButton({
|
|
35
21
|
children,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-components.cjs","sources":["../../../src/chat-ui/messages/message-components.tsx"],"sourcesContent":["import {\n ActionBarPrimitive,\n AuiIf,\n BranchPickerPrimitive,\n MessagePrimitive,\n useAuiState,\n useMessagePartText,\n useSmooth,\n type ToolCallMessagePartComponent,\n} from \"@assistant-ui/react\";\nimport {\n hideUnterminatedMarkdownLink,\n isGithubWakeMessage,\n isVoiceDelegationMessage,\n readRuntimeMessageFromSourceMessages,\n readSoleRuntimeMessageKind,\n} from \"@athenaintel/agent-runtime\";\nimport \"@assistant-ui/react-markdown/styles/dot.css\";\nimport {\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CopyIcon,\n ListPlusIcon,\n PencilIcon,\n RefreshCwIcon,\n} from \"lucide-react\";\nimport {\n type ButtonHTMLAttributes,\n type FC,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport { useAthenaRunLive } from \"../../chat/use-athena-run-live\";\nimport type { ComposerAction } from \"../composer/composer-action\";\nimport { cn } from \"../../lib/utils\";\nimport { ChatMessageBody } from \"../rich-text/chat-message-body\";\nimport { useMessageActionsReadOnly } from \"./message-actions-config\";\nimport { RuntimeMessageCard } from \"./runtime-message\";\nimport { hasVisibleContent } from \"./running-indicator\";\nimport { VoiceDelegationMessage } from \"./voice-delegation-card\";\nimport { WakeMarkerMessage } from \"./wake-marker\";\n\nexport function IconButton({\n children,\n tooltip,\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { tooltip: string }) {\n return (\n <button\n type=\"button\"\n title={tooltip}\n aria-label={tooltip}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function SmallIconButton({\n children,\n tooltip,\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { tooltip: string }) {\n return (\n <button\n type=\"button\"\n title={tooltip}\n aria-label={tooltip}\n className={cn(\n \"inline-flex size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport const BranchPicker: FC = () => (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"inline-flex items-center gap-0.5 text-xs text-muted-foreground\"\n data-testid=\"chat-branch-picker\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <SmallIconButton\n tooltip=\"Previous branch\"\n data-testid=\"chat-branch-previous\"\n >\n <ChevronLeftIcon className=\"size-3\" />\n </SmallIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"font-medium\" data-testid=\"chat-branch-count\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <SmallIconButton tooltip=\"Next branch\" data-testid=\"chat-branch-next\">\n <ChevronRightIcon className=\"size-3\" />\n </SmallIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n);\n\nconst CopyActionButton: FC = () => (\n <ActionBarPrimitive.Copy asChild>\n <SmallIconButton tooltip=\"Copy\">\n <AuiIf condition={(state) => state.message.isCopied}>\n <CheckIcon className=\"size-3\" />\n </AuiIf>\n <AuiIf condition={(state) => !state.message.isCopied}>\n <CopyIcon className=\"size-3\" />\n </AuiIf>\n </SmallIconButton>\n </ActionBarPrimitive.Copy>\n);\n\n/**\n * The edit primitive does not check the runtime's edit capability itself —\n * clicking it on a runtime without one throws inside onPress, where no error\n * boundary can catch it — so the button must gate on the capability and, to\n * match the rewind semantics of `run/edit`, stay hidden while a run is live.\n * The read-only context covers threads the capability flags cannot: a host's\n * static `edit: true` still applies to fenced legacy conversations.\n */\nconst EditActionButton: FC = () => {\n const allowEdit = useAuiState((s) => s.thread.capabilities.edit);\n const isRunning = useAthenaRunLive();\n const readOnly = useMessageActionsReadOnly();\n if (!allowEdit || isRunning || readOnly) return null;\n return (\n <ActionBarPrimitive.Edit asChild>\n <SmallIconButton tooltip=\"Edit\" data-testid=\"chat-message-edit\">\n <PencilIcon className=\"size-3\" />\n </SmallIconButton>\n </ActionBarPrimitive.Edit>\n );\n};\n\n/** Regenerate dispatches `run/reload`, so it hides on read-only threads too. */\nconst RegenerateActionButton: FC = () => {\n const readOnly = useMessageActionsReadOnly();\n if (readOnly) return null;\n return (\n <ActionBarPrimitive.Reload asChild>\n <SmallIconButton tooltip=\"Regenerate\">\n <RefreshCwIcon className=\"size-3\" />\n </SmallIconButton>\n </ActionBarPrimitive.Reload>\n );\n};\n\n/**\n * Reveal-on-demand treatment for action bars: invisible and click-through\n * until the surrounding named group is hovered or a control inside receives\n * keyboard focus. The `focus-within` escape hatch is what keeps the hidden\n * controls reachable for keyboard users.\n */\nexport const ACTION_BAR_REVEAL_CLASS =\n \"pointer-events-none opacity-0 transition-opacity focus-within:pointer-events-auto focus-within:opacity-100\";\n\n/** Shared chat body; the reveal holds incomplete links until their URL is complete. */\nexport const MarkdownText: FC = () => {\n const revealed = useSmooth(useMessagePartText(), true);\n const isRunning = revealed.status.type === \"running\";\n const text = isRunning ? hideUnterminatedMarkdownLink(revealed.text) : revealed.text;\n return <ChatMessageBody text={text} isRunning={isRunning} />;\n};\n\nconst UserActionBar: FC = () => (\n <ActionBarPrimitive.Root\n autohide=\"never\"\n className={cn(\n \"flex min-h-6 items-center gap-0.5\",\n ACTION_BAR_REVEAL_CLASS,\n \"group-hover/user-message:pointer-events-auto group-hover/user-message:opacity-100\",\n )}\n >\n <CopyActionButton />\n <EditActionButton />\n </ActionBarPrimitive.Root>\n);\n\nexport const UserMessage: FC = () => {\n // A GitHub wake turn is an event, not words the user typed: it renders as\n // the compact wake marker instead of a bubble quoting the injected text.\n const isWake = useAuiState((s) => isGithubWakeMessage(s.message.metadata?.custom));\n // A voice delegation's anchor is the ask the live voice model handed to the\n // thread, not words the user typed: it renders as the shared voice-task\n // card on every host instead of a second user bubble under the spoken turn.\n const isVoiceDelegation = useAuiState((s) =>\n isVoiceDelegationMessage({ messageId: s.message.id, custom: s.message.metadata?.custom }),\n );\n if (isWake) {\n return (\n <MessagePrimitive.Root data-message-role=\"user\" className=\"mb-3\">\n <WakeMarkerMessage />\n </MessagePrimitive.Root>\n );\n }\n if (isVoiceDelegation) {\n return (\n <MessagePrimitive.Root data-message-role=\"user\" className=\"mb-3\">\n <VoiceDelegationMessage />\n </MessagePrimitive.Root>\n );\n }\n return (\n <MessagePrimitive.Root\n data-message-role=\"user\"\n className=\"group/user-message mb-3 flex justify-end\"\n >\n <div className=\"flex min-w-0 max-w-[85%] flex-col items-end gap-1\">\n <div className=\"min-w-0 max-w-full rounded-2xl rounded-br-md bg-muted px-3.5 py-2 text-sm text-foreground\">\n <MessagePrimitive.Content components={{ Text: MarkdownText }} />\n </div>\n <div className=\"flex min-h-6 items-center gap-1\">\n <BranchPicker />\n <UserActionBar />\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nexport interface CreateAssistantMessageOptions {\n /** Host-registered card for tools without a dedicated UI. */\n toolFallback: ToolCallMessagePartComponent;\n /** Extra action-bar controls appended after copy/regenerate. */\n extraActions?: ReactNode;\n /**\n * Renders the message body. Hosts that group content into activity\n * timelines supply their own; the default renders markdown and tool cards.\n */\n content?: FC;\n /**\n * Inline affordance rendered inside a runtime-ending card (e.g. a Continue\n * button). Hosts without one leave it unset.\n */\n runtimeMessageAction?: ReactNode;\n}\n\n/**\n * Builds the assistant bubble. Call this once per host (memoized on its\n * inputs) so the returned component identity stays stable across renders.\n */\nexport function createAssistantMessage({\n toolFallback,\n extraActions,\n content: Content,\n runtimeMessageAction,\n}: CreateAssistantMessageOptions): FC {\n const AssistantActionBar: FC = () => {\n // The latest reply keeps its actions visible; older replies reveal them\n // on hover so a long transcript is not a wall of icon rows.\n const isLast = useAuiState((s) => s.message.isLast);\n return (\n <ActionBarPrimitive.Root\n autohide=\"never\"\n className={cn(\n \"mt-1 flex min-h-6 items-center gap-0.5\",\n !isLast && [\n ACTION_BAR_REVEAL_CLASS,\n \"group-hover/assistant-message:pointer-events-auto group-hover/assistant-message:opacity-100\",\n ],\n )}\n >\n <CopyActionButton />\n <RegenerateActionButton />\n {extraActions}\n </ActionBarPrimitive.Root>\n );\n };\n\n // A run-lifecycle marker or handoff summary is a system event, not\n // assistant speech. When it owns the whole row, render the status card in\n // place of the bubble; when it is chunked in with the assistant's own work\n // (or is a handoff whose text IS the closing summary), keep the body and\n // frame it with the card above.\n const RuntimeEnding: FC<{ placement: \"row\" | \"banner\" }> = ({ placement }) => {\n // Select the message (a stable store reference) and derive from it: the\n // reader allocates a fresh object per call, and `useAuiState` compares\n // snapshots with `Object.is`, so selecting the reader's result directly\n // would re-render on every store update and trip React's update-depth\n // guard.\n const message = useAuiState((s) => s.message);\n const runtime = useMemo(() => readRuntimeMessageFromSourceMessages(message), [message]);\n if (!runtime || runtime.silent) return null;\n if (placement === \"row\" && !runtime.isSoleSourceMessage) return null;\n if (placement === \"banner\" && runtime.isSoleSourceMessage && runtime.kind !== \"handoff\") {\n return null;\n }\n return <RuntimeMessageCard message={runtime} action={runtimeMessageAction} />;\n };\n\n const AssistantMessage: FC = () => {\n // An assistant row exists before its first token streams; showing\n // copy/regenerate against nothing looks broken, so wait for content.\n const showActions = useAuiState((state) =>\n hasVisibleContent(state.message.content),\n );\n // Primitive selector: the reader builds a fresh object per call.\n const soleRuntimeKind = useAuiState((s) => readSoleRuntimeMessageKind(s.message));\n const soleRuntimeSilent = useAuiState(\n (s) => readRuntimeMessageFromSourceMessages(s.message)?.silent === true,\n );\n\n if (soleRuntimeKind && soleRuntimeKind !== \"handoff\") {\n if (soleRuntimeSilent) return null;\n return (\n <MessagePrimitive.Root\n data-message-role=\"assistant\"\n className=\"group group/assistant-message mb-3\"\n >\n <div className=\"max-w-[95%]\">\n <RuntimeEnding placement=\"row\" />\n </div>\n </MessagePrimitive.Root>\n );\n }\n\n return (\n <MessagePrimitive.Root\n data-message-role=\"assistant\"\n className=\"group group/assistant-message mb-3\"\n >\n <div className=\"max-w-[95%]\">\n <RuntimeEnding placement=\"banner\" />\n {Content ? (\n <Content />\n ) : (\n <MessagePrimitive.Content\n components={{\n Text: MarkdownText,\n tools: { Fallback: toolFallback },\n }}\n />\n )}\n {showActions ? (\n <div className=\"flex min-h-6 items-center gap-1\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n ) : null}\n </div>\n </MessagePrimitive.Root>\n );\n };\n\n return AssistantMessage;\n}\n\n/** Panel chrome: the thread card and the header row that sits inside it. */\nexport const THREAD_PANEL_CLASS =\n \"m-1 flex min-h-0 flex-1 flex-col overflow-hidden rounded-[18px] border border-dashed border-amber-500 bg-background shadow-[0_1px_10px_rgba(54,45,33,0.08)]\";\nexport const THREAD_HEADER_CLASS =\n \"flex items-center justify-between gap-2 px-3 py-2\";\nexport const THREAD_HEADER_ACTIONS_CLASS =\n \"flex min-w-0 items-center justify-end gap-1.5\";\n/** Pill used for the header's leading control (agent picker, host label). */\nexport const THREAD_HEADER_PILL_CLASS =\n \"inline-flex h-7 max-w-[170px] items-center gap-1.5 rounded-md border border-neutral-200 bg-white px-2 text-xs font-medium text-neutral-800 shadow-sm\";\nexport const THREAD_HEADER_ICON_CLASS = \"size-[18px]\";\n\n/** Composer chrome: the dock around the composer, its surface and its rows. */\nexport const COMPOSER_DOCK_CLASS = \"bg-background px-2.5 pb-2 pt-1.5\";\nexport const COMPOSER_SURFACE_CLASS =\n \"relative flex flex-col gap-1 rounded-xl border border-neutral-200 bg-white shadow-[0_2px_10px_rgba(54,45,33,0.08)]\";\nexport const COMPOSER_EDITOR_ROW_CLASS = \"px-2.5 pt-1\";\nexport const COMPOSER_TOOLBAR_CLASS =\n \"flex items-center gap-1 border-t border-neutral-100 px-2 py-1.5\";\n/**\n * Paper composer chrome (`ChatComposerDock appearance=\"paper\"`): a card-toned\n * surface with a larger radius, a focus-within ring, a drag-over tint keyed\n * off `data-drag-active`, and a bottom rail — the chrome the SDK's\n * `AthenaChat` thread renders. Hosts on the default chrome above are\n * untouched. The dock carries no padding of its own; the paper host's footer\n * spaces it. The radius and border colour also bind to the `--composer-radius`\n * / `--composer-border` theme variables in `styles.css`.\n */\nexport const COMPOSER_PAPER_DOCK_CLASS = \"aui-composer-dock\";\nexport const COMPOSER_PAPER_SURFACE_CLASS =\n \"aui-composer-root relative flex w-full flex-col rounded-[1.375rem] border border-border bg-card p-2.5 text-card-foreground shadow-[0_1px_2px_rgba(0,0,0,0.04)] outline-none transition-shadow duration-150 focus-within:shadow-[0_8px_24px_-14px_rgba(0,0,0,0.25)] focus-within:ring-2 focus-within:ring-ring/40 data-[drag-active=true]:bg-primary/5 data-[drag-active=true]:ring-2 data-[drag-active=true]:ring-primary/40\";\nexport const COMPOSER_PAPER_EDITOR_ROW_CLASS = \"px-0.5\";\nexport const COMPOSER_PAPER_TOOLBAR_CLASS =\n \"aui-composer-action-wrapper relative flex items-center justify-between gap-1 pt-1\";\nexport const THREAD_SCROLL_TO_BOTTOM_CLASS =\n \"inline-flex items-center justify-center rounded-full border bg-background/80 p-1 shadow-sm backdrop-blur transition-opacity hover:bg-accent disabled:invisible\";\n\nconst ComposerStopIcon: FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"size-4\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <rect width=\"10\" height=\"10\" x=\"3\" y=\"3\" rx=\"2\" />\n </svg>\n);\n\nexport interface ComposerStopButtonProps {\n onStop: () => void;\n disabled?: boolean;\n title?: string;\n}\n\nexport interface ComposerSendButtonProps {\n action: Extract<ComposerAction, \"send\" | \"queue\">;\n onSend: () => void;\n disabled?: boolean;\n title?: string;\n}\n\n/** Stop control shown while a run is in flight and there is nothing queued. */\nexport const ComposerStopButton: FC<ComposerStopButtonProps> = ({\n onStop,\n disabled = false,\n title = \"Stop generation\",\n}) => (\n <button\n type=\"button\"\n onClick={onStop}\n disabled={disabled}\n title={title}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-lg bg-foreground text-background shadow-sm transition-colors hover:bg-foreground/80\",\n disabled && \"cursor-not-allowed opacity-60\",\n )}\n >\n <ComposerStopIcon />\n </button>\n);\n/** Send control, which becomes a queue control while a run is in flight. */\nexport const ComposerSendButton: FC<ComposerSendButtonProps> = ({\n action,\n onSend,\n disabled = false,\n title,\n}) => (\n <button\n type=\"button\"\n onClick={onSend}\n disabled={disabled}\n title={title ?? (action === \"queue\" ? \"Queue message\" : \"Send\")}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-full shadow-sm transition-colors\",\n disabled\n ? \"cursor-not-allowed bg-muted text-muted-foreground opacity-60\"\n : \"bg-foreground text-background hover:bg-foreground/80\",\n )}\n >\n {action === \"queue\" ? (\n <ListPlusIcon className=\"size-4\" />\n ) : (\n <ArrowUpIcon className=\"size-4\" />\n )}\n </button>\n);\n"],"names":["jsx","cn","jsxs","BranchPickerPrimitive","ChevronLeftIcon","ChevronRightIcon","ActionBarPrimitive","AuiIf","CheckIcon","CopyIcon","useAuiState","useAthenaRunLive","useMessageActionsReadOnly","PencilIcon","RefreshCwIcon","useSmooth","useMessagePartText","hideUnterminatedMarkdownLink","ChatMessageBody","isGithubWakeMessage","isVoiceDelegationMessage","MessagePrimitive","WakeMarkerMessage","VoiceDelegationMessage","useMemo","readRuntimeMessageFromSourceMessages","RuntimeMessageCard","hasVisibleContent","readSoleRuntimeMessageKind","ListPlusIcon","ArrowUpIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message-components.cjs","sources":["../../../src/chat-ui/messages/message-components.tsx"],"sourcesContent":["import {\n ActionBarPrimitive,\n AuiIf,\n BranchPickerPrimitive,\n MessagePrimitive,\n useAuiState,\n useMessagePartText,\n useSmooth,\n type ToolCallMessagePartComponent,\n} from \"@assistant-ui/react\";\nimport {\n hideUnterminatedMarkdownLink,\n isGithubWakeMessage,\n isVoiceDelegationMessage,\n readRuntimeMessageFromSourceMessages,\n readSoleRuntimeMessageKind,\n} from \"@athenaintel/agent-runtime\";\nimport \"@assistant-ui/react-markdown/styles/dot.css\";\nimport {\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CopyIcon,\n ListPlusIcon,\n PencilIcon,\n RefreshCwIcon,\n} from \"lucide-react\";\nimport {\n type ButtonHTMLAttributes,\n type FC,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport { useAthenaRunLive } from \"../../chat/use-athena-run-live\";\nimport type { ComposerAction } from \"../composer/composer-action\";\nimport { cn } from \"../../lib/utils\";\nimport { ChatMessageBody } from \"../rich-text/chat-message-body\";\nimport { useMessageActionsReadOnly } from \"./message-actions-config\";\nimport { RuntimeMessageCard } from \"./runtime-message\";\nimport { hasVisibleContent } from \"./running-indicator\";\nimport { VoiceDelegationMessage } from \"./voice-delegation-card\";\nimport { WakeMarkerMessage } from \"./wake-marker\";\n\nexport function IconButton({\n children,\n tooltip,\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { tooltip: string }) {\n return (\n <button\n type=\"button\"\n title={tooltip}\n aria-label={tooltip}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function SmallIconButton({\n children,\n tooltip,\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { tooltip: string }) {\n return (\n <button\n type=\"button\"\n title={tooltip}\n aria-label={tooltip}\n className={cn(\n \"inline-flex size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport const BranchPicker: FC = () => (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"inline-flex items-center gap-0.5 text-xs text-muted-foreground\"\n data-testid=\"chat-branch-picker\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <SmallIconButton\n tooltip=\"Previous branch\"\n data-testid=\"chat-branch-previous\"\n >\n <ChevronLeftIcon className=\"size-3\" />\n </SmallIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"font-medium\" data-testid=\"chat-branch-count\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <SmallIconButton tooltip=\"Next branch\" data-testid=\"chat-branch-next\">\n <ChevronRightIcon className=\"size-3\" />\n </SmallIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n);\n\nconst CopyActionButton: FC = () => (\n <ActionBarPrimitive.Copy asChild>\n <SmallIconButton tooltip=\"Copy\">\n <AuiIf condition={(state) => state.message.isCopied}>\n <CheckIcon className=\"size-3\" />\n </AuiIf>\n <AuiIf condition={(state) => !state.message.isCopied}>\n <CopyIcon className=\"size-3\" />\n </AuiIf>\n </SmallIconButton>\n </ActionBarPrimitive.Copy>\n);\n\n/**\n * The edit primitive does not check the runtime's edit capability itself —\n * clicking it on a runtime without one throws inside onPress, where no error\n * boundary can catch it — so the button must gate on the capability and, to\n * match the rewind semantics of `run/edit`, stay hidden while a run is live.\n * The read-only context covers threads the capability flags cannot: a host's\n * static `edit: true` still applies to fenced legacy conversations.\n */\nconst EditActionButton: FC = () => {\n const allowEdit = useAuiState((s) => s.thread.capabilities.edit);\n const isRunning = useAthenaRunLive();\n const readOnly = useMessageActionsReadOnly();\n if (!allowEdit || isRunning || readOnly) return null;\n return (\n <ActionBarPrimitive.Edit asChild>\n <SmallIconButton tooltip=\"Edit\" data-testid=\"chat-message-edit\">\n <PencilIcon className=\"size-3\" />\n </SmallIconButton>\n </ActionBarPrimitive.Edit>\n );\n};\n\n/** Regenerate dispatches `run/reload`, so it hides on read-only threads too. */\nconst RegenerateActionButton: FC = () => {\n const readOnly = useMessageActionsReadOnly();\n if (readOnly) return null;\n return (\n <ActionBarPrimitive.Reload asChild>\n <SmallIconButton tooltip=\"Regenerate\">\n <RefreshCwIcon className=\"size-3\" />\n </SmallIconButton>\n </ActionBarPrimitive.Reload>\n );\n};\n\n/**\n * Reveal-on-demand treatment for action bars: invisible and click-through\n * until the surrounding named group is hovered or a control inside receives\n * keyboard focus. The `focus-within` escape hatch is what keeps the hidden\n * controls reachable for keyboard users.\n */\nexport const ACTION_BAR_REVEAL_CLASS =\n \"pointer-events-none opacity-0 transition-opacity focus-within:pointer-events-auto focus-within:opacity-100\";\n\n/** Shared chat body; the reveal holds incomplete links until their URL is complete. */\nexport const MarkdownText: FC = () => {\n const revealed = useSmooth(useMessagePartText(), true);\n const isRunning = revealed.status.type === \"running\";\n const text = isRunning ? hideUnterminatedMarkdownLink(revealed.text) : revealed.text;\n return <ChatMessageBody text={text} isRunning={isRunning} />;\n};\n\nconst UserActionBar: FC = () => (\n <ActionBarPrimitive.Root\n autohide=\"never\"\n className={cn(\n \"flex min-h-6 items-center gap-0.5\",\n ACTION_BAR_REVEAL_CLASS,\n \"group-hover/user-message:pointer-events-auto group-hover/user-message:opacity-100\",\n )}\n >\n <CopyActionButton />\n <EditActionButton />\n </ActionBarPrimitive.Root>\n);\n\nexport const UserMessage: FC = () => {\n // A GitHub wake turn is an event, not words the user typed: it renders as\n // the compact wake marker instead of a bubble quoting the injected text.\n const isWake = useAuiState((s) => isGithubWakeMessage(s.message.metadata?.custom));\n // A voice delegation's anchor is the ask the live voice model handed to the\n // thread, not words the user typed: it renders as the shared voice-task\n // card on every host instead of a second user bubble under the spoken turn.\n const isVoiceDelegation = useAuiState((s) =>\n isVoiceDelegationMessage({ messageId: s.message.id, custom: s.message.metadata?.custom }),\n );\n if (isWake) {\n return (\n <MessagePrimitive.Root data-message-role=\"user\" className=\"mb-3\">\n <WakeMarkerMessage />\n </MessagePrimitive.Root>\n );\n }\n if (isVoiceDelegation) {\n return (\n <MessagePrimitive.Root data-message-role=\"user\" className=\"mb-3\">\n <VoiceDelegationMessage />\n </MessagePrimitive.Root>\n );\n }\n return (\n <MessagePrimitive.Root\n data-message-role=\"user\"\n className=\"group/user-message mb-3 flex justify-end\"\n >\n <div className=\"flex min-w-0 max-w-[85%] flex-col items-end gap-1\">\n <div className=\"min-w-0 max-w-full rounded-2xl rounded-br-md bg-muted px-3.5 py-2 text-sm text-foreground\">\n <MessagePrimitive.Content components={{ Text: MarkdownText }} />\n </div>\n <div className=\"flex min-h-6 items-center gap-1\">\n <BranchPicker />\n <UserActionBar />\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nexport interface CreateAssistantMessageOptions {\n /** Host-registered card for tools without a dedicated UI. */\n toolFallback: ToolCallMessagePartComponent;\n /** Extra action-bar controls appended after copy/regenerate. */\n extraActions?: ReactNode;\n /**\n * Renders the message body. Hosts that group content into activity\n * timelines supply their own; the default renders markdown and tool cards.\n */\n content?: FC;\n /**\n * Inline affordance rendered inside a runtime-ending card (e.g. a Continue\n * button). Hosts without one leave it unset.\n */\n runtimeMessageAction?: ReactNode;\n}\n\n/**\n * Builds the assistant bubble. Call this once per host (memoized on its\n * inputs) so the returned component identity stays stable across renders.\n */\nexport function createAssistantMessage({\n toolFallback,\n extraActions,\n content: Content,\n runtimeMessageAction,\n}: CreateAssistantMessageOptions): FC {\n const AssistantActionBar: FC = () => {\n // The latest reply keeps its actions visible; older replies reveal them\n // on hover so a long transcript is not a wall of icon rows.\n const isLast = useAuiState((s) => s.message.isLast);\n return (\n <ActionBarPrimitive.Root\n autohide=\"never\"\n className={cn(\n \"mt-1 flex min-h-6 items-center gap-0.5\",\n !isLast && [\n ACTION_BAR_REVEAL_CLASS,\n \"group-hover/assistant-message:pointer-events-auto group-hover/assistant-message:opacity-100\",\n ],\n )}\n >\n <CopyActionButton />\n <RegenerateActionButton />\n {extraActions}\n </ActionBarPrimitive.Root>\n );\n };\n\n // A run-lifecycle marker or handoff summary is a system event, not\n // assistant speech. When it owns the whole row, render the status card in\n // place of the bubble; when it is chunked in with the assistant's own work\n // (or is a handoff whose text IS the closing summary), keep the body and\n // frame it with the card above.\n const RuntimeEnding: FC<{ placement: \"row\" | \"banner\" }> = ({ placement }) => {\n // Select the message (a stable store reference) and derive from it: the\n // reader allocates a fresh object per call, and `useAuiState` compares\n // snapshots with `Object.is`, so selecting the reader's result directly\n // would re-render on every store update and trip React's update-depth\n // guard.\n const message = useAuiState((s) => s.message);\n const runtime = useMemo(() => readRuntimeMessageFromSourceMessages(message), [message]);\n if (!runtime || runtime.silent) return null;\n if (placement === \"row\" && !runtime.isSoleSourceMessage) return null;\n if (placement === \"banner\" && runtime.isSoleSourceMessage && runtime.kind !== \"handoff\") {\n return null;\n }\n return <RuntimeMessageCard message={runtime} action={runtimeMessageAction} />;\n };\n\n const AssistantMessage: FC = () => {\n // An assistant row exists before its first token streams; showing\n // copy/regenerate against nothing looks broken, so wait for content.\n const showActions = useAuiState((state) =>\n hasVisibleContent(state.message.content),\n );\n // Primitive selector: the reader builds a fresh object per call.\n const soleRuntimeKind = useAuiState((s) => readSoleRuntimeMessageKind(s.message));\n const soleRuntimeSilent = useAuiState(\n (s) => readRuntimeMessageFromSourceMessages(s.message)?.silent === true,\n );\n\n if (soleRuntimeKind && soleRuntimeKind !== \"handoff\") {\n if (soleRuntimeSilent) return null;\n return (\n <MessagePrimitive.Root\n data-message-role=\"assistant\"\n className=\"group group/assistant-message mb-3\"\n >\n <div className=\"max-w-[95%]\">\n <RuntimeEnding placement=\"row\" />\n </div>\n </MessagePrimitive.Root>\n );\n }\n\n return (\n <MessagePrimitive.Root\n data-message-role=\"assistant\"\n className=\"group group/assistant-message mb-3\"\n >\n <div className=\"max-w-[95%]\">\n <RuntimeEnding placement=\"banner\" />\n {Content ? (\n <Content />\n ) : (\n <MessagePrimitive.Content\n components={{\n Text: MarkdownText,\n tools: { Fallback: toolFallback },\n }}\n />\n )}\n {showActions ? (\n <div className=\"flex min-h-6 items-center gap-1\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n ) : null}\n </div>\n </MessagePrimitive.Root>\n );\n };\n\n return AssistantMessage;\n}\n\n/** Panel chrome: the thread card and the header row that sits inside it. */\nexport const THREAD_PANEL_CLASS =\n \"m-1 flex min-h-0 flex-1 flex-col overflow-hidden rounded-[18px] border border-dashed border-amber-500 bg-background shadow-[0_1px_10px_rgba(54,45,33,0.08)]\";\nexport const THREAD_HEADER_CLASS =\n \"flex items-center justify-between gap-2 px-3 py-2\";\nexport const THREAD_HEADER_ACTIONS_CLASS =\n \"flex min-w-0 items-center justify-end gap-1.5\";\n/** Pill used for the header's leading control (agent picker, host label). */\nexport const THREAD_HEADER_PILL_CLASS =\n \"inline-flex h-7 max-w-[170px] items-center gap-1.5 rounded-md border border-neutral-200 bg-white px-2 text-xs font-medium text-neutral-800 shadow-sm\";\nexport const THREAD_HEADER_ICON_CLASS = \"size-[18px]\";\n\n/** Composer chrome: the dock around the composer, its surface and its rows. */\nexport const COMPOSER_DOCK_CLASS = \"bg-background px-2.5 pb-2 pt-1.5\";\nexport const COMPOSER_SURFACE_CLASS =\n \"relative flex flex-col gap-1 rounded-xl border border-neutral-200 bg-white shadow-[0_2px_10px_rgba(54,45,33,0.08)]\";\nexport const COMPOSER_EDITOR_ROW_CLASS = \"px-2.5 pt-1\";\nexport const COMPOSER_TOOLBAR_CLASS =\n \"flex items-center gap-1 border-t border-neutral-100 px-2 py-1.5\";\n/**\n * Paper composer chrome (`ChatComposerDock appearance=\"paper\"`): a card-toned\n * surface with a larger radius, a focus-within ring, a drag-over tint keyed\n * off `data-drag-active`, and a bottom rail — the chrome the SDK's\n * `AthenaChat` thread renders. Hosts on the default chrome above are\n * untouched. The dock carries no padding of its own; the paper host's footer\n * spaces it. The radius and border colour also bind to the `--composer-radius`\n * / `--composer-border` theme variables in `styles.css`.\n */\nexport const COMPOSER_PAPER_DOCK_CLASS = \"aui-composer-dock\";\nexport const COMPOSER_PAPER_SURFACE_CLASS =\n \"aui-composer-root relative flex w-full flex-col rounded-[1.375rem] border border-border bg-card p-2.5 text-card-foreground shadow-[0_1px_2px_rgba(0,0,0,0.04)] outline-none transition-shadow duration-150 focus-within:shadow-[0_8px_24px_-14px_rgba(0,0,0,0.25)] focus-within:ring-2 focus-within:ring-ring/40 data-[drag-active=true]:bg-primary/5 data-[drag-active=true]:ring-2 data-[drag-active=true]:ring-primary/40\";\nexport const COMPOSER_PAPER_EDITOR_ROW_CLASS = \"px-0.5\";\nexport const COMPOSER_PAPER_TOOLBAR_CLASS =\n \"aui-composer-action-wrapper relative flex items-center justify-between gap-1 pt-1\";\nexport const THREAD_SCROLL_TO_BOTTOM_CLASS =\n \"inline-flex items-center justify-center rounded-full border bg-background/80 p-1 shadow-sm backdrop-blur transition-opacity hover:bg-accent disabled:invisible\";\n\nconst ComposerStopIcon: FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"size-4\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <rect width=\"10\" height=\"10\" x=\"3\" y=\"3\" rx=\"2\" />\n </svg>\n);\n\nexport interface ComposerStopButtonProps {\n onStop: () => void;\n disabled?: boolean;\n title?: string;\n}\n\nexport interface ComposerSendButtonProps {\n action: Extract<ComposerAction, \"send\" | \"queue\">;\n onSend: () => void;\n disabled?: boolean;\n title?: string;\n}\n\n/** Stop control shown while a run is in flight and there is nothing queued. */\nexport const ComposerStopButton: FC<ComposerStopButtonProps> = ({\n onStop,\n disabled = false,\n title = \"Stop generation\",\n}) => (\n <button\n type=\"button\"\n onClick={onStop}\n disabled={disabled}\n title={title}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-lg bg-foreground text-background shadow-sm transition-colors hover:bg-foreground/80\",\n disabled && \"cursor-not-allowed opacity-60\",\n )}\n >\n <ComposerStopIcon />\n </button>\n);\n/** Send control, which becomes a queue control while a run is in flight. */\nexport const ComposerSendButton: FC<ComposerSendButtonProps> = ({\n action,\n onSend,\n disabled = false,\n title,\n}) => (\n <button\n type=\"button\"\n onClick={onSend}\n disabled={disabled}\n title={title ?? (action === \"queue\" ? \"Queue message\" : \"Send\")}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-full shadow-sm transition-colors\",\n disabled\n ? \"cursor-not-allowed bg-muted text-muted-foreground opacity-60\"\n : \"bg-foreground text-background hover:bg-foreground/80\",\n )}\n >\n {action === \"queue\" ? (\n <ListPlusIcon className=\"size-4\" />\n ) : (\n <ArrowUpIcon className=\"size-4\" />\n )}\n </button>\n);\n"],"names":["jsx","cn","jsxs","BranchPickerPrimitive","ChevronLeftIcon","ChevronRightIcon","ActionBarPrimitive","AuiIf","CheckIcon","CopyIcon","useAuiState","useAthenaRunLive","useMessageActionsReadOnly","PencilIcon","RefreshCwIcon","useSmooth","useMessagePartText","hideUnterminatedMarkdownLink","ChatMessageBody","isGithubWakeMessage","isVoiceDelegationMessage","MessagePrimitive","WakeMarkerMessage","VoiceDelegationMessage","useMemo","readRuntimeMessageFromSourceMessages","RuntimeMessageCard","hasVisibleContent","readSoleRuntimeMessageKind","ListPlusIcon","ArrowUpIcon"],"mappings":"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"}
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { BranchPickerPrimitive, useSmooth, useMessagePartText, useAuiState, MessagePrimitive, ActionBarPrimitive, AuiIf } from "@assistant-ui/react";
|
|
3
|
-
import "../../packages/agent-runtime/src/generated/runconfig-contract.js";
|
|
4
|
-
import { useMemo } from "react";
|
|
5
|
-
import "@assistant-ui/tap";
|
|
6
|
-
import "statewire";
|
|
7
|
-
import "../../packages/agent-runtime/src/statewire-suspended.js";
|
|
8
|
-
import "../../packages/agent-runtime/src/conversation-list.js";
|
|
9
|
-
import "@tanstack/react-query";
|
|
10
|
-
import "../../packages/agent-runtime/src/statewire-state.js";
|
|
11
|
-
import "../../packages/agent-runtime/src/messages.js";
|
|
12
|
-
import "@assistant-ui/store";
|
|
13
|
-
import { hideUnterminatedMarkdownLink } from "../../packages/agent-runtime/src/streaming-markdown.js";
|
|
14
|
-
import "../../packages/agent-runtime/src/quota-safe-local-storage-session.js";
|
|
15
|
-
import "../../packages/agent-runtime/src/statewire-attach-observer.js";
|
|
16
|
-
import "../../packages/agent-runtime/src/thread-status.js";
|
|
17
|
-
import "@assistant-ui/react-statewire";
|
|
18
|
-
import { isVoiceDelegationMessage } from "../../packages/agent-runtime/src/voice-presentation.js";
|
|
19
|
-
import { isGithubWakeMessage } from "../../packages/agent-runtime/src/github-wake-event.js";
|
|
20
|
-
import { readSoleRuntimeMessageKind, readRuntimeMessageFromSourceMessages } from "../../packages/agent-runtime/src/runtime-messages.js";
|
|
21
|
-
import "../../packages/agent-runtime/src/thread-handoff.js";
|
|
22
3
|
import "@assistant-ui/react-markdown/styles/dot.css";
|
|
23
4
|
import { ChevronLeftIcon, ChevronRightIcon, ListPlusIcon, ArrowUpIcon, CheckIcon, CopyIcon, PencilIcon, RefreshCwIcon } from "lucide-react";
|
|
5
|
+
import { useMemo } from "react";
|
|
24
6
|
import { useAthenaRunLive } from "../../chat/use-athena-run-live.js";
|
|
25
7
|
import { ChatMessageBody } from "../rich-text/chat-message-body.js";
|
|
26
8
|
import { useMessageActionsReadOnly } from "./message-actions-config.js";
|
|
@@ -28,6 +10,10 @@ import { RuntimeMessageCard } from "./runtime-message.js";
|
|
|
28
10
|
import { hasVisibleContent } from "./running-indicator.js";
|
|
29
11
|
import { VoiceDelegationMessage } from "./voice-delegation-card.js";
|
|
30
12
|
import { WakeMarkerMessage } from "./wake-marker.js";
|
|
13
|
+
import { hideUnterminatedMarkdownLink } from "../../packages/agent-runtime/src/streaming-markdown.js";
|
|
14
|
+
import { isGithubWakeMessage } from "../../packages/agent-runtime/src/github-wake-event.js";
|
|
15
|
+
import { isVoiceDelegationMessage } from "../../packages/agent-runtime/src/voice-presentation.js";
|
|
16
|
+
import { readSoleRuntimeMessageKind, readRuntimeMessageFromSourceMessages } from "../../packages/agent-runtime/src/runtime-messages.js";
|
|
31
17
|
import { cn } from "cnfast";
|
|
32
18
|
function IconButton({
|
|
33
19
|
children,
|