@vc-shell/framework 1.2.2 → 1.2.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/composables/index.ts +2 -0
- package/core/composables/useAssets/index.ts +72 -28
- package/core/composables/useAsync/index.ts +4 -1
- package/core/composables/useBladeRegistry/index.ts +6 -5
- package/core/composables/useBreadcrumbs/index.ts +4 -1
- package/core/composables/useErrorHandler/index.ts +4 -1
- package/core/composables/useFunctions/debounce.ts +0 -1
- package/core/composables/useFunctions/delay.ts +0 -1
- package/core/composables/useFunctions/index.ts +0 -1
- package/core/composables/useFunctions/once.ts +0 -1
- package/core/composables/useFunctions/sleep.ts +0 -1
- package/core/composables/useFunctions/throttle.ts +0 -1
- package/core/composables/useGlobalSearch/index.ts +3 -3
- package/core/composables/useMenuService/index.ts +5 -2
- package/core/composables/useNotifications/index.ts +5 -2
- package/core/composables/useTheme/index.ts +4 -1
- package/core/composables/useUser/index.ts +189 -20
- package/core/composables/useWidgets/index.ts +5 -2
- package/core/constants/defaults.ts +76 -0
- package/core/constants/index.ts +2 -0
- package/core/constants/ui.ts +68 -0
- package/core/interceptors/index.ts +5 -2
- package/core/plugins/ai-agent/README.md +336 -0
- package/core/plugins/ai-agent/components/VcAiAgentPanel.vue +125 -0
- package/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue +182 -0
- package/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue +77 -0
- package/core/plugins/ai-agent/components/index.ts +1 -0
- package/core/plugins/ai-agent/composables/index.ts +4 -0
- package/core/plugins/ai-agent/composables/useAiAgent.ts +231 -0
- package/core/plugins/ai-agent/composables/useAiAgentContext.ts +280 -0
- package/core/plugins/ai-agent/constants.ts +89 -0
- package/core/plugins/ai-agent/index.ts +91 -0
- package/core/plugins/ai-agent/services/ai-agent-service.ts +598 -0
- package/core/plugins/ai-agent/types.ts +310 -0
- package/core/plugins/modularity/index.ts +8 -6
- package/core/plugins/modularity/loader.ts +36 -33
- package/core/plugins/signalR/index.ts +6 -3
- package/core/services/app-bar-menu-service.ts +4 -1
- package/core/services/dashboard-service.ts +4 -1
- package/core/services/index.ts +2 -0
- package/core/services/menu-service.ts +4 -1
- package/core/services/settings-menu-service.ts +4 -1
- package/core/services/toolbar-service.ts +18 -3
- package/core/services/widget-service.ts +7 -4
- package/core/types/index.ts +3 -0
- package/core/types/services.ts +194 -0
- package/core/utilities/errorTypes.ts +126 -0
- package/core/utilities/index.ts +2 -0
- package/core/utilities/logger.ts +120 -0
- package/dist/core/composables/useAssets/index.d.ts.map +1 -1
- package/dist/core/composables/useAsync/index.d.ts.map +1 -1
- package/dist/core/composables/useBladeRegistry/index.d.ts.map +1 -1
- package/dist/core/composables/useBreadcrumbs/index.d.ts.map +1 -1
- package/dist/core/composables/useErrorHandler/index.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/debounce.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/delay.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/index.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/once.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/sleep.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/throttle.d.ts.map +1 -1
- package/dist/core/composables/useGlobalSearch/index.d.ts.map +1 -1
- package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
- package/dist/core/composables/useNotifications/index.d.ts.map +1 -1
- package/dist/core/composables/useTheme/index.d.ts.map +1 -1
- package/dist/core/composables/useUser/index.d.ts +8 -0
- package/dist/core/composables/useUser/index.d.ts.map +1 -1
- package/dist/core/composables/useWidgets/index.d.ts.map +1 -1
- package/dist/core/constants/defaults.d.ts +63 -0
- package/dist/core/constants/defaults.d.ts.map +1 -0
- package/dist/core/constants/index.d.ts +2 -0
- package/dist/core/constants/index.d.ts.map +1 -1
- package/dist/core/constants/ui.d.ts +50 -0
- package/dist/core/constants/ui.d.ts.map +1 -0
- package/dist/core/interceptors/index.d.ts.map +1 -1
- package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts +3 -0
- package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue.d.ts +15 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue.d.ts +10 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/components/index.d.ts +2 -0
- package/dist/core/plugins/ai-agent/components/index.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/composables/index.d.ts +4 -0
- package/dist/core/plugins/ai-agent/composables/index.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgent.d.ts +95 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgent.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgentContext.d.ts +55 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgentContext.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/constants.d.ts +47 -0
- package/dist/core/plugins/ai-agent/constants.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/index.d.ts +48 -0
- package/dist/core/plugins/ai-agent/index.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/services/ai-agent-service.d.ts +45 -0
- package/dist/core/plugins/ai-agent/services/ai-agent-service.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/types.d.ts +258 -0
- package/dist/core/plugins/ai-agent/types.d.ts.map +1 -0
- package/dist/core/plugins/modularity/index.d.ts.map +1 -1
- package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
- package/dist/core/plugins/signalR/index.d.ts.map +1 -1
- package/dist/core/services/app-bar-menu-service.d.ts.map +1 -1
- package/dist/core/services/dashboard-service.d.ts.map +1 -1
- package/dist/core/services/menu-service.d.ts.map +1 -1
- package/dist/core/services/settings-menu-service.d.ts.map +1 -1
- package/dist/core/services/toolbar-service.d.ts.map +1 -1
- package/dist/core/services/widget-service.d.ts.map +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/services.d.ts +169 -0
- package/dist/core/types/services.d.ts.map +1 -0
- package/dist/core/utilities/errorTypes.d.ts +61 -0
- package/dist/core/utilities/errorTypes.d.ts.map +1 -0
- package/dist/core/utilities/index.d.ts +2 -0
- package/dist/core/utilities/index.d.ts.map +1 -1
- package/dist/core/utilities/logger.d.ts +259 -0
- package/dist/core/utilities/logger.d.ts.map +1 -0
- package/dist/framework.js +9623 -8417
- package/dist/index.css +1 -1
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/injection-keys.d.ts +21 -6
- package/dist/injection-keys.d.ts.map +1 -1
- package/dist/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts.map +1 -1
- package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -1
- package/dist/shared/components/draggable-dashboard/composables/useLayoutPersistence.d.ts.map +1 -1
- package/dist/shared/components/notifications/composables/useContainer/index.d.ts.map +1 -1
- package/dist/shared/components/notifications/composables/useInstance/index.d.ts.map +1 -1
- package/dist/shared/components/notifications/core/notification.d.ts.map +1 -1
- package/dist/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
- package/dist/shared/components/sign-in/useExternalProvider.d.ts.map +1 -1
- package/dist/shared/composables/index.d.ts +1 -0
- package/dist/shared/composables/index.d.ts.map +1 -1
- package/dist/shared/composables/useExternalWidgets.d.ts.map +1 -1
- package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
- package/dist/shared/composables/useTableSelection.d.ts +57 -0
- package/dist/shared/composables/useTableSelection.d.ts.map +1 -0
- package/dist/shared/composables/useTableSort.d.ts.map +1 -1
- package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -1
- package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
- package/dist/shared/utilities/colorUtils.d.ts +0 -6
- package/dist/shared/utilities/colorUtils.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-banner/vc-banner.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +0 -15
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-loading/vc-loading.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts +0 -5
- package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-widget/vc-widget.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-toast/vc-toast.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts.map +1 -1
- package/dist/{vendor-lodash-es-BqkGj3Jl.js → vendor-lodash-es-SgOIjJF8.js} +2 -0
- package/package.json +5 -5
- package/shared/components/app-switcher/composables/useAppSwitcher/index.ts +4 -1
- package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +67 -4
- package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +13 -10
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.ts +7 -4
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.ts +4 -1
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.ts +4 -1
- package/shared/components/change-password/change-password.vue +1 -1
- package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +14 -5
- package/shared/components/draggable-dashboard/composables/useLayoutPersistence.ts +5 -2
- package/shared/components/index.ts +2 -0
- package/shared/components/notifications/composables/useContainer/index.ts +8 -6
- package/shared/components/notifications/composables/useInstance/index.ts +4 -1
- package/shared/components/notifications/core/notification.ts +10 -7
- package/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue +20 -1
- package/shared/components/sign-in/useExternalProvider.ts +6 -4
- package/shared/composables/index.ts +1 -0
- package/shared/composables/useExternalWidgets.ts +7 -4
- package/shared/composables/useMenuExpanded.ts +15 -1
- package/shared/composables/useTableSelection.ts +151 -0
- package/shared/composables/useTableSort.ts +4 -4
- package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +6 -3
- package/shared/pages/LoginPage/components/login/Login.vue +4 -1
- package/shared/utilities/colorUtils.ts +5 -12
- package/ui/components/atoms/vc-banner/vc-banner.vue +4 -1
- package/ui/components/atoms/vc-button/vc-button.vue +2 -25
- package/ui/components/atoms/vc-container/vc-container.vue +12 -3
- package/ui/components/atoms/vc-icon/vc-icon.vue +0 -10
- package/ui/components/atoms/vc-icon/vc-lucide-icon.vue +5 -2
- package/ui/components/atoms/vc-image/vc-image.vue +4 -1
- package/ui/components/atoms/vc-link/vc-link.vue +59 -54
- package/ui/components/atoms/vc-loading/vc-loading.vue +4 -0
- package/ui/components/atoms/vc-status/vc-status.vue +0 -5
- package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +4 -4
- package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +8 -1
- package/ui/components/atoms/vc-video/vc-video.vue +4 -2
- package/ui/components/atoms/vc-widget/vc-widget.vue +4 -1
- package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +7 -2
- package/ui/components/molecules/vc-input/vc-input.vue +0 -1
- package/ui/components/molecules/vc-pagination/vc-pagination.vue +6 -1
- package/ui/components/molecules/vc-rating/vc-rating.vue +1 -1
- package/ui/components/molecules/vc-textarea/vc-textarea.vue +1 -1
- package/ui/components/molecules/vc-toast/vc-toast.vue +11 -1
- package/ui/components/organisms/vc-app/vc-app.vue +22 -3
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +4 -1
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +14 -14
- package/ui/components/organisms/vc-blade/vc-blade.vue +3 -1
- package/ui/components/organisms/vc-login-form/vc-login-form.vue +3 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +34 -2
- package/ui/components/organisms/vc-table/composables/useTableActions.ts +7 -10
- package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +4 -1
- package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +5 -2
- package/ui/components/organisms/vc-table/composables/useTableSelection.ts +26 -18
- package/ui/components/organisms/vc-table/composables/useTableState.ts +4 -1
- package/core/services/global-search-service.ts +0 -36
- package/dist/core/services/global-search-service.d.ts +0 -10
- package/dist/core/services/global-search-service.d.ts.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="vc-ai-agent-header">
|
|
3
|
+
<div class="vc-ai-agent-header__icon">
|
|
4
|
+
<svg
|
|
5
|
+
width="22"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 22 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
10
|
+
>
|
|
11
|
+
<path
|
|
12
|
+
d="M8.92406 0.537357C10.165 -0.179119 11.6939 -0.179119 12.9349 0.537357L19.8535 4.5319C21.0945 5.24838 21.8589 6.57248 21.8589 8.00543V15.9945C21.8589 17.4275 21.0945 18.7516 19.8535 19.4681L12.9349 23.4626C11.6939 24.1791 10.165 24.1791 8.92406 23.4626L2.00541 19.4681C0.764459 18.7516 0 17.4275 0 15.9945V8.00543C0 6.57248 0.764459 5.24838 2.00541 4.5319L8.92406 0.537357Z"
|
|
13
|
+
fill="white"
|
|
14
|
+
/>
|
|
15
|
+
<g
|
|
16
|
+
clip-path="url(#paint0_angular_1004_8813_clip_path)"
|
|
17
|
+
data-figma-skip-parse="true"
|
|
18
|
+
>
|
|
19
|
+
<g transform="matrix(0 -0.0359275 0.0356829 0 10.9297 12.0001)">
|
|
20
|
+
<foreignObject
|
|
21
|
+
x="-334.01"
|
|
22
|
+
y="-334.01"
|
|
23
|
+
width="668.02"
|
|
24
|
+
height="668.02"
|
|
25
|
+
><div
|
|
26
|
+
xmlns="http://www.w3.org/1999/xhtml"
|
|
27
|
+
style="
|
|
28
|
+
background: conic-gradient(
|
|
29
|
+
from 90deg,
|
|
30
|
+
rgba(255, 149, 51, 1) 0deg,
|
|
31
|
+
rgba(255, 79, 187, 1) 43.2deg,
|
|
32
|
+
rgba(155, 255, 79, 1) 143.654deg,
|
|
33
|
+
rgba(28, 145, 252, 1) 252.692deg,
|
|
34
|
+
rgba(154, 45, 248, 1) 316.8deg,
|
|
35
|
+
rgba(255, 149, 51, 1) 360deg
|
|
36
|
+
);
|
|
37
|
+
height: 100%;
|
|
38
|
+
width: 100%;
|
|
39
|
+
opacity: 1;
|
|
40
|
+
"
|
|
41
|
+
></div
|
|
42
|
+
></foreignObject>
|
|
43
|
+
</g>
|
|
44
|
+
</g>
|
|
45
|
+
<path
|
|
46
|
+
fill-rule="evenodd"
|
|
47
|
+
clip-rule="evenodd"
|
|
48
|
+
d="M16.4395 10.6925C17.4389 12.4342 17.5855 14.7605 17.0781 17.0412C16.5847 19.2587 15.479 21.3907 14.002 22.8459L12.9346 23.463C11.6937 24.1793 10.1647 24.1794 8.92383 23.463L4.81641 21.091C6.48014 21.2357 8.24755 21.0003 9.87402 20.4474C12.1457 19.6751 14.1798 18.2734 15.2773 16.3839C16.7064 13.9237 16.7787 11.8621 16.2246 10.339C16.296 10.4538 16.3694 10.5705 16.4395 10.6925ZM12.5723 6.5646C14.5851 6.56993 16.7106 7.56255 18.4668 9.09488C20.0162 10.4468 21.2529 12.1974 21.8594 14.0041V15.9943C21.8594 17.4272 21.0944 18.7514 19.8535 19.4679L15.4492 22.0109C16.4736 20.6151 17.2295 18.9083 17.6182 17.1613C18.1443 14.7966 18.0091 12.3169 16.9189 10.4171C15.5014 7.94691 13.7497 6.85357 12.1523 6.57339C12.2894 6.56875 12.4294 6.56423 12.5723 6.5646ZM0 11.2697C0.704632 12.7816 1.7891 14.1898 3.0791 15.3166C4.87894 16.8885 7.10461 17.9397 9.28906 17.9455C12.1367 17.9529 13.9586 16.9824 15 15.7394C14.9357 15.8599 14.8712 15.9836 14.7998 16.1066C13.7886 17.8473 11.8825 19.1804 9.69531 19.924C7.65984 20.6159 5.41309 20.7847 3.47656 20.3175L2.00586 19.4679C0.764906 18.7514 0 17.4272 0 15.9943V11.2697ZM5.95215 2.2521C5.01991 3.60523 4.37186 5.22291 4.0625 6.87613C3.62624 9.20794 3.85535 11.6456 4.94141 13.5382C6.36156 16.013 8.11707 17.1052 9.7168 17.383C9.57761 17.3878 9.43521 17.3931 9.29004 17.3927C7.27637 17.3873 5.17407 16.4121 3.44238 14.8996C1.82788 13.4893 0.56156 11.633 0 9.71988V8.00601C0 6.57306 0.764906 5.24885 2.00586 4.53238L5.95215 2.2521ZM11.3975 7.05093C12.0141 7.06601 12.6881 7.21751 13.376 7.5607C13.0837 7.49777 12.8006 7.49218 12.5459 7.55679L12.6816 8.09292C13.0083 8.00995 13.4967 8.1005 14.0215 8.41421C14.538 8.72301 15.057 9.23022 15.4326 9.91909C15.7285 10.4617 15.9343 11.1225 15.9805 11.8918C15.8889 11.6052 15.7517 11.3555 15.5674 11.1662L15.1709 11.5519C15.406 11.7933 15.5727 12.2611 15.5635 12.8722C15.5543 13.4739 15.3736 14.1772 14.9648 14.8468C14.642 15.3757 14.171 15.8854 13.5254 16.3107C13.73 16.0867 13.8799 15.8413 13.9521 15.5851L13.4189 15.4347C13.3275 15.7591 13.0058 16.1381 12.4717 16.4357C11.9461 16.7285 11.2471 16.9236 10.4629 16.9044C9.84516 16.8893 9.1696 16.7382 8.48047 16.3937C8.77503 16.4579 9.06081 16.4638 9.31738 16.3986L9.18066 15.8625C8.85403 15.9453 8.36539 15.8557 7.84082 15.5421C7.32436 15.2334 6.80623 14.7251 6.43066 14.0363C6.13467 13.4934 5.92691 12.8324 5.88086 12.0626C5.97253 12.3504 6.11088 12.6013 6.2959 12.7912L6.69141 12.4044C6.45639 12.163 6.28955 11.6951 6.29883 11.0841C6.30799 10.4824 6.48868 9.77922 6.89746 9.10952C7.21926 8.58233 7.68762 8.07306 8.33008 7.64859C8.12755 7.87138 7.97995 8.11577 7.9082 8.37027L8.44141 8.52066C8.53286 8.19625 8.8546 7.81729 9.38867 7.51968C9.91427 7.22684 10.6133 7.0318 11.3975 7.05093ZM8.92383 0.537258C10.1647 -0.179152 11.6937 -0.17902 12.9346 0.537258L16.832 2.78726C15.2289 2.68408 13.5406 2.93545 11.9824 3.47671C9.71315 4.26504 7.68197 5.68288 6.58496 7.57144C5.15353 10.0358 5.08346 12.1004 5.64062 13.6242C5.56755 13.507 5.49251 13.3876 5.4209 13.2628C4.41748 11.5142 4.18713 9.21872 4.60645 6.97769C4.99237 4.91536 5.92418 2.92968 7.26758 1.49331L8.92383 0.537258ZM12.1641 4.00015C14.0959 3.32907 16.2174 3.13043 18.084 3.51089L19.8535 4.53238C21.0944 5.24887 21.8594 6.57311 21.8594 8.00601V12.5626C21.1452 11.1171 20.0805 9.7689 18.8301 8.67788C17.0078 7.08795 14.7586 6.01663 12.5732 6.01089C9.72539 6.00349 7.90267 6.97374 6.86133 8.21695C6.92577 8.09606 6.9918 7.97218 7.06348 7.84878C8.07528 6.10725 9.97945 4.75906 12.1641 4.00015Z"
|
|
49
|
+
data-figma-gradient-fill="{"type":"GRADIENT_ANGULAR","stops":[{"color":{"r":1.0,"g":0.58431375026702881,"b":0.20000000298023224,"a":1.0},"position":0.0},{"color":{"r":1.0,"g":0.30980393290519714,"b":0.73333334922790527,"a":1.0},"position":0.11999999731779099},{"color":{"r":0.60888892412185669,"g":1.0,"b":0.30980393290519714,"a":1.0},"position":0.39903846383094788},{"color":{"r":0.10980392247438431,"g":0.56862747669219971,"b":0.98823529481887817,"a":1.0},"position":0.70192307233810425},{"color":{"r":0.60392159223556519,"g":0.17647059261798859,"b":0.97254902124404907,"a":1.0},"position":0.87999999523162842},{"color":{"r":1.0,"g":0.58431375026702881,"b":0.20000000298023224,"a":1.0},"position":1.0}],"stopsVar":[{"color":{"r":1.0,"g":0.58431375026702881,"b":0.20000000298023224,"a":1.0},"position":0.0},{"color":{"r":1.0,"g":0.30980393290519714,"b":0.73333334922790527,"a":1.0},"position":0.11999999731779099},{"color":{"r":0.60888892412185669,"g":1.0,"b":0.30980393290519714,"a":1.0},"position":0.39903846383094788},{"color":{"r":0.10980392247438431,"g":0.56862747669219971,"b":0.98823529481887817,"a":1.0},"position":0.70192307233810425},{"color":{"r":0.60392159223556519,"g":0.17647059261798859,"b":0.97254902124404907,"a":1.0},"position":0.87999999523162842},{"color":{"r":1.0,"g":0.58431375026702881,"b":0.20000000298023224,"a":1.0},"position":1.0}],"transform":{"m00":3.8149642949888984e-13,"m01":71.365898132324219,"m02":-24.753261566162109,"m10":-71.855010986328125,"m11":-5.4860135260525328e-14,"m12":47.927650451660156},"opacity":1.0,"blendMode":"NORMAL","visible":true}"
|
|
50
|
+
/>
|
|
51
|
+
<path
|
|
52
|
+
d="M16.0431 12.0324C16.0431 13.3654 16.5272 15.8012 13.4845 18.4291C14.5218 16.2507 12.419 17.1497 10.9259 17.1497C8.09967 17.1497 5.80859 14.8586 5.80859 12.0324C5.80859 9.20615 8.09967 6.91504 10.9259 6.91504C13.752 6.91504 16.0431 9.20615 16.0431 12.0324Z"
|
|
53
|
+
fill="white"
|
|
54
|
+
/>
|
|
55
|
+
<ellipse
|
|
56
|
+
cx="10.9283"
|
|
57
|
+
cy="12.0328"
|
|
58
|
+
rx="0.898978"
|
|
59
|
+
ry="0.898992"
|
|
60
|
+
fill="#6C6C6C"
|
|
61
|
+
/>
|
|
62
|
+
<ellipse
|
|
63
|
+
cx="13.4849"
|
|
64
|
+
cy="12.0328"
|
|
65
|
+
rx="0.898978"
|
|
66
|
+
ry="0.898992"
|
|
67
|
+
fill="#6C6C6C"
|
|
68
|
+
/>
|
|
69
|
+
<ellipse
|
|
70
|
+
cx="8.36968"
|
|
71
|
+
cy="12.0328"
|
|
72
|
+
rx="0.898978"
|
|
73
|
+
ry="0.898992"
|
|
74
|
+
fill="#6C6C6C"
|
|
75
|
+
/>
|
|
76
|
+
<defs>
|
|
77
|
+
<clipPath id="paint0_angular_1004_8813_clip_path">
|
|
78
|
+
<path
|
|
79
|
+
fill-rule="evenodd"
|
|
80
|
+
clip-rule="evenodd"
|
|
81
|
+
d="M16.4395 10.6925C17.4389 12.4342 17.5855 14.7605 17.0781 17.0412C16.5847 19.2587 15.479 21.3907 14.002 22.8459L12.9346 23.463C11.6937 24.1793 10.1647 24.1794 8.92383 23.463L4.81641 21.091C6.48014 21.2357 8.24755 21.0003 9.87402 20.4474C12.1457 19.6751 14.1798 18.2734 15.2773 16.3839C16.7064 13.9237 16.7787 11.8621 16.2246 10.339C16.296 10.4538 16.3694 10.5705 16.4395 10.6925ZM12.5723 6.5646C14.5851 6.56993 16.7106 7.56255 18.4668 9.09488C20.0162 10.4468 21.2529 12.1974 21.8594 14.0041V15.9943C21.8594 17.4272 21.0944 18.7514 19.8535 19.4679L15.4492 22.0109C16.4736 20.6151 17.2295 18.9083 17.6182 17.1613C18.1443 14.7966 18.0091 12.3169 16.9189 10.4171C15.5014 7.94691 13.7497 6.85357 12.1523 6.57339C12.2894 6.56875 12.4294 6.56423 12.5723 6.5646ZM0 11.2697C0.704632 12.7816 1.7891 14.1898 3.0791 15.3166C4.87894 16.8885 7.10461 17.9397 9.28906 17.9455C12.1367 17.9529 13.9586 16.9824 15 15.7394C14.9357 15.8599 14.8712 15.9836 14.7998 16.1066C13.7886 17.8473 11.8825 19.1804 9.69531 19.924C7.65984 20.6159 5.41309 20.7847 3.47656 20.3175L2.00586 19.4679C0.764906 18.7514 0 17.4272 0 15.9943V11.2697ZM5.95215 2.2521C5.01991 3.60523 4.37186 5.22291 4.0625 6.87613C3.62624 9.20794 3.85535 11.6456 4.94141 13.5382C6.36156 16.013 8.11707 17.1052 9.7168 17.383C9.57761 17.3878 9.43521 17.3931 9.29004 17.3927C7.27637 17.3873 5.17407 16.4121 3.44238 14.8996C1.82788 13.4893 0.56156 11.633 0 9.71988V8.00601C0 6.57306 0.764906 5.24885 2.00586 4.53238L5.95215 2.2521ZM11.3975 7.05093C12.0141 7.06601 12.6881 7.21751 13.376 7.5607C13.0837 7.49777 12.8006 7.49218 12.5459 7.55679L12.6816 8.09292C13.0083 8.00995 13.4967 8.1005 14.0215 8.41421C14.538 8.72301 15.057 9.23022 15.4326 9.91909C15.7285 10.4617 15.9343 11.1225 15.9805 11.8918C15.8889 11.6052 15.7517 11.3555 15.5674 11.1662L15.1709 11.5519C15.406 11.7933 15.5727 12.2611 15.5635 12.8722C15.5543 13.4739 15.3736 14.1772 14.9648 14.8468C14.642 15.3757 14.171 15.8854 13.5254 16.3107C13.73 16.0867 13.8799 15.8413 13.9521 15.5851L13.4189 15.4347C13.3275 15.7591 13.0058 16.1381 12.4717 16.4357C11.9461 16.7285 11.2471 16.9236 10.4629 16.9044C9.84516 16.8893 9.1696 16.7382 8.48047 16.3937C8.77503 16.4579 9.06081 16.4638 9.31738 16.3986L9.18066 15.8625C8.85403 15.9453 8.36539 15.8557 7.84082 15.5421C7.32436 15.2334 6.80623 14.7251 6.43066 14.0363C6.13467 13.4934 5.92691 12.8324 5.88086 12.0626C5.97253 12.3504 6.11088 12.6013 6.2959 12.7912L6.69141 12.4044C6.45639 12.163 6.28955 11.6951 6.29883 11.0841C6.30799 10.4824 6.48868 9.77922 6.89746 9.10952C7.21926 8.58233 7.68762 8.07306 8.33008 7.64859C8.12755 7.87138 7.97995 8.11577 7.9082 8.37027L8.44141 8.52066C8.53286 8.19625 8.8546 7.81729 9.38867 7.51968C9.91427 7.22684 10.6133 7.0318 11.3975 7.05093ZM8.92383 0.537258C10.1647 -0.179152 11.6937 -0.17902 12.9346 0.537258L16.832 2.78726C15.2289 2.68408 13.5406 2.93545 11.9824 3.47671C9.71315 4.26504 7.68197 5.68288 6.58496 7.57144C5.15353 10.0358 5.08346 12.1004 5.64062 13.6242C5.56755 13.507 5.49251 13.3876 5.4209 13.2628C4.41748 11.5142 4.18713 9.21872 4.60645 6.97769C4.99237 4.91536 5.92418 2.92968 7.26758 1.49331L8.92383 0.537258ZM12.1641 4.00015C14.0959 3.32907 16.2174 3.13043 18.084 3.51089L19.8535 4.53238C21.0944 5.24887 21.8594 6.57311 21.8594 8.00601V12.5626C21.1452 11.1171 20.0805 9.7689 18.8301 8.67788C17.0078 7.08795 14.7586 6.01663 12.5732 6.01089C9.72539 6.00349 7.90267 6.97374 6.86133 8.21695C6.92577 8.09606 6.9918 7.97218 7.06348 7.84878C8.07528 6.10725 9.97945 4.75906 12.1641 4.00015Z"
|
|
82
|
+
/>
|
|
83
|
+
</clipPath>
|
|
84
|
+
</defs>
|
|
85
|
+
</svg>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<div class="vc-ai-agent-header__wrapper">
|
|
89
|
+
<div class="vc-ai-agent-header__content">
|
|
90
|
+
<div class="vc-ai-agent-header__title">
|
|
91
|
+
{{ title }}
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div class="vc-ai-agent-header__controls">
|
|
97
|
+
<div
|
|
98
|
+
v-if="isExpanded"
|
|
99
|
+
class="vc-ai-agent-header__button"
|
|
100
|
+
title="Collapse"
|
|
101
|
+
@click="$emit('collapse')"
|
|
102
|
+
>
|
|
103
|
+
<VcIcon icon="material-minimize" />
|
|
104
|
+
</div>
|
|
105
|
+
<div
|
|
106
|
+
v-else
|
|
107
|
+
class="vc-ai-agent-header__button"
|
|
108
|
+
title="Expand"
|
|
109
|
+
@click="$emit('expand')"
|
|
110
|
+
>
|
|
111
|
+
<VcIcon icon="material-toolbar" />
|
|
112
|
+
</div>
|
|
113
|
+
<div
|
|
114
|
+
class="vc-ai-agent-header__button"
|
|
115
|
+
title="Close"
|
|
116
|
+
@click="$emit('close')"
|
|
117
|
+
>
|
|
118
|
+
<VcIcon icon="material-close" />
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</template>
|
|
123
|
+
|
|
124
|
+
<script lang="ts" setup>
|
|
125
|
+
import { VcIcon } from "../../../../../ui/components";
|
|
126
|
+
|
|
127
|
+
defineProps<{
|
|
128
|
+
title?: string;
|
|
129
|
+
isExpanded: boolean;
|
|
130
|
+
}>();
|
|
131
|
+
|
|
132
|
+
defineEmits<{
|
|
133
|
+
(e: "close"): void;
|
|
134
|
+
(e: "expand"): void;
|
|
135
|
+
(e: "collapse"): void;
|
|
136
|
+
}>();
|
|
137
|
+
</script>
|
|
138
|
+
|
|
139
|
+
<style lang="scss">
|
|
140
|
+
.vc-ai-agent-header {
|
|
141
|
+
@apply tw-shrink-0 tw-flex tw-items-center tw-py-0 tw-px-6 tw-border-solid tw-border-b;
|
|
142
|
+
height: var(--blade-header-height, 70px);
|
|
143
|
+
background-color: var(--blade-header-background-color, var(--additional-50));
|
|
144
|
+
border-color: var(--blade-header-border-color, var(--neutrals-200));
|
|
145
|
+
|
|
146
|
+
&__left {
|
|
147
|
+
@apply tw-flex tw-flex-row tw-items-center;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
&__icon {
|
|
151
|
+
@apply tw-mr-3;
|
|
152
|
+
color: var(--primary-500);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
&__wrapper {
|
|
156
|
+
@apply tw-flex tw-items-center tw-justify-between tw-grow tw-basis-0 tw-overflow-hidden;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
&__content {
|
|
160
|
+
@apply tw-overflow-hidden;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
&__title {
|
|
164
|
+
@apply tw-truncate tw-font-semibold;
|
|
165
|
+
color: var(--blade-header-title-color, var(--neutrals-950));
|
|
166
|
+
font-size: var(--blade-header-title-font-size, 19px);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
&__controls {
|
|
170
|
+
@apply tw-flex tw-items-center;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
&__button {
|
|
174
|
+
@apply tw-ml-2.5 tw-cursor-pointer;
|
|
175
|
+
color: var(--blade-header-button-color, var(--neutrals-400));
|
|
176
|
+
|
|
177
|
+
&:hover {
|
|
178
|
+
color: var(--blade-header-button-color-hover, var(--neutrals-500));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
</style>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="vc-ai-agent-iframe">
|
|
3
|
+
<iframe
|
|
4
|
+
v-if="url"
|
|
5
|
+
ref="iframeRef"
|
|
6
|
+
:src="url"
|
|
7
|
+
class="vc-ai-agent-iframe__frame"
|
|
8
|
+
sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"
|
|
9
|
+
allow="clipboard-read; clipboard-write"
|
|
10
|
+
@load="onLoad"
|
|
11
|
+
/>
|
|
12
|
+
<div v-else class="vc-ai-agent-iframe__placeholder">
|
|
13
|
+
<VcIcon icon="lucide-sparkles" size="xl" class="vc-ai-agent-iframe__placeholder-icon" />
|
|
14
|
+
<p class="vc-ai-agent-iframe__placeholder-text">AI Agent URL not configured</p>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<script lang="ts" setup>
|
|
20
|
+
import { ref, onMounted, watch } from "vue";
|
|
21
|
+
import { VcIcon } from "../../../../../ui/components";
|
|
22
|
+
|
|
23
|
+
const props = defineProps<{
|
|
24
|
+
url: string;
|
|
25
|
+
}>();
|
|
26
|
+
|
|
27
|
+
const emit = defineEmits<{
|
|
28
|
+
(e: "iframe-ready", iframe: HTMLIFrameElement): void;
|
|
29
|
+
}>();
|
|
30
|
+
|
|
31
|
+
const iframeRef = ref<HTMLIFrameElement | null>(null);
|
|
32
|
+
|
|
33
|
+
// Emit iframe ref as soon as it's available in the DOM (before @load)
|
|
34
|
+
// This is critical because chatbot sends CHAT_READY before @load fires
|
|
35
|
+
watch(iframeRef, (iframe) => {
|
|
36
|
+
if (iframe) {
|
|
37
|
+
emit("iframe-ready", iframe);
|
|
38
|
+
}
|
|
39
|
+
}, { immediate: true });
|
|
40
|
+
|
|
41
|
+
const onLoad = () => {
|
|
42
|
+
// onLoad is now just for logging/debugging, ref is already emitted
|
|
43
|
+
console.debug("[VcAiAgentIframe] Iframe loaded");
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
onMounted(() => {
|
|
47
|
+
// Emit again on mount in case watch didn't catch it
|
|
48
|
+
if (iframeRef.value) {
|
|
49
|
+
emit("iframe-ready", iframeRef.value);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<style lang="scss">
|
|
55
|
+
.vc-ai-agent-iframe {
|
|
56
|
+
@apply tw-w-full tw-h-full tw-flex tw-flex-col;
|
|
57
|
+
|
|
58
|
+
&__frame {
|
|
59
|
+
@apply tw-w-full tw-h-full tw-border-0 tw-flex-1;
|
|
60
|
+
background-color: var(--ai-panel-iframe-bg, var(--additional-50));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
&__placeholder {
|
|
64
|
+
@apply tw-w-full tw-h-full tw-flex tw-flex-col tw-items-center tw-justify-center tw-gap-4;
|
|
65
|
+
background-color: var(--ai-panel-placeholder-bg, var(--neutrals-50));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
&__placeholder-icon {
|
|
69
|
+
color: var(--ai-panel-placeholder-icon-color, var(--neutrals-300));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&__placeholder-text {
|
|
73
|
+
@apply tw-text-sm tw-m-0;
|
|
74
|
+
color: var(--ai-panel-placeholder-text-color, var(--neutrals-500));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as VcAiAgentPanel } from "./VcAiAgentPanel.vue";
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { inject, provide } from "vue";
|
|
2
|
+
import { createAiAgentService, type IAiAgentServiceInternal } from "../services/ai-agent-service";
|
|
3
|
+
import { AiAgentServiceKey, LanguageServiceKey, ToolbarServiceKey } from "../../../../injection-keys";
|
|
4
|
+
import type {
|
|
5
|
+
IAiAgentService,
|
|
6
|
+
IAiAgentConfig,
|
|
7
|
+
IAiAgentMessage,
|
|
8
|
+
IAiAgentBladeContext,
|
|
9
|
+
} from "../types";
|
|
10
|
+
import { createLogger, InjectionError } from "../../../utilities";
|
|
11
|
+
import { useUser } from "../../../composables/useUser";
|
|
12
|
+
import { useBladeNavigation } from "../../../../shared/components/blade-navigation/composables";
|
|
13
|
+
import { AI_AGENT_TOOLBAR_BUTTON_ID, AI_AGENT_TOOLBAR_BUTTON_ICON, AI_AGENT_TOOLBAR_BUTTON_TITLE } from "../constants";
|
|
14
|
+
import type { IToolbarService } from "../../../services/toolbar-service";
|
|
15
|
+
|
|
16
|
+
const logger = createLogger("use-ai-agent");
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Options for providing the AI agent service
|
|
20
|
+
*/
|
|
21
|
+
export interface ProvideAiAgentServiceOptions {
|
|
22
|
+
/** Initial configuration for the AI agent */
|
|
23
|
+
config?: Partial<IAiAgentConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* Whether to add the AI button to all blade toolbars automatically.
|
|
26
|
+
* Default: true
|
|
27
|
+
*/
|
|
28
|
+
addGlobalToolbarButton?: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Provides the AI agent service at the current component level.
|
|
33
|
+
* Should be called once at the app level (in VcApp or plugin install).
|
|
34
|
+
*
|
|
35
|
+
* @param options - Configuration options
|
|
36
|
+
*/
|
|
37
|
+
export function provideAiAgentService(options?: ProvideAiAgentServiceOptions): IAiAgentServiceInternal {
|
|
38
|
+
const languageService = inject(LanguageServiceKey);
|
|
39
|
+
const { user, getAccessToken } = useUser();
|
|
40
|
+
const { blades, openBlade, resolveBladeByName } = useBladeNavigation();
|
|
41
|
+
|
|
42
|
+
// Create the service
|
|
43
|
+
const service = createAiAgentService({
|
|
44
|
+
userGetter: () => {
|
|
45
|
+
if (!user.value) return undefined;
|
|
46
|
+
return {
|
|
47
|
+
id: user.value.id,
|
|
48
|
+
userName: user.value.userName,
|
|
49
|
+
isAdministrator: user.value.isAdministrator,
|
|
50
|
+
permissions: user.value.permissions,
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
bladeGetter: (): IAiAgentBladeContext | null => {
|
|
54
|
+
// Get the last (most recent) blade
|
|
55
|
+
const lastBlade = blades.value[blades.value.length - 1];
|
|
56
|
+
if (!lastBlade) return null;
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
id: lastBlade.type?.name?.toLowerCase() ?? "unknown",
|
|
60
|
+
name: lastBlade.type?.name ?? "Unknown",
|
|
61
|
+
title: lastBlade.props?.navigation?.instance?.title,
|
|
62
|
+
param: lastBlade.props?.param,
|
|
63
|
+
options: lastBlade.props?.options,
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
localeGetter: () => languageService?.currentLocale.value ?? "en",
|
|
67
|
+
tokenGetter: getAccessToken,
|
|
68
|
+
navigateToBlade: (bladeName: string, param?: string, bladeOptions?: Record<string, unknown>) => {
|
|
69
|
+
const blade = resolveBladeByName(bladeName);
|
|
70
|
+
if (blade) {
|
|
71
|
+
openBlade({ blade, param, options: bladeOptions });
|
|
72
|
+
logger.debug(`Navigated to blade: ${bladeName}`);
|
|
73
|
+
} else {
|
|
74
|
+
logger.warn(`Blade not found: ${bladeName}`);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
reloadBlade: () => {
|
|
78
|
+
// Emit reload on current blade if available (last blade in the list)
|
|
79
|
+
const lastBlade = blades.value[blades.value.length - 1];
|
|
80
|
+
if (lastBlade?.props?.navigation?.instance?.reload) {
|
|
81
|
+
lastBlade.props.navigation.instance.reload();
|
|
82
|
+
logger.debug("Current blade reloaded");
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
initialConfig: options?.config,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
provide(AiAgentServiceKey, service);
|
|
89
|
+
logger.debug("AiAgentService provided");
|
|
90
|
+
|
|
91
|
+
// Register global toolbar button with wildcard "*" if enabled
|
|
92
|
+
const addGlobalToolbarButton = options?.addGlobalToolbarButton ?? true;
|
|
93
|
+
if (addGlobalToolbarButton) {
|
|
94
|
+
// Get toolbar service from injection (already created by VcShell plugin)
|
|
95
|
+
const toolbarService = inject<IToolbarService | null>(ToolbarServiceKey, null);
|
|
96
|
+
if (toolbarService) {
|
|
97
|
+
toolbarService.registerToolbarItem(
|
|
98
|
+
{
|
|
99
|
+
id: AI_AGENT_TOOLBAR_BUTTON_ID,
|
|
100
|
+
icon: AI_AGENT_TOOLBAR_BUTTON_ICON,
|
|
101
|
+
title: AI_AGENT_TOOLBAR_BUTTON_TITLE,
|
|
102
|
+
clickHandler: () => {
|
|
103
|
+
service.togglePanel();
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
"*", // Wildcard for all blades
|
|
107
|
+
);
|
|
108
|
+
logger.debug("Global AI toolbar button registered with wildcard '*'");
|
|
109
|
+
} else {
|
|
110
|
+
logger.warn("Toolbar service not available, AI button not registered");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return service;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Return type for useAiAgent composable
|
|
119
|
+
*/
|
|
120
|
+
export interface UseAiAgentReturn {
|
|
121
|
+
/** Current panel state ("closed" | "open" | "expanded") */
|
|
122
|
+
panelState: IAiAgentService["panelState"];
|
|
123
|
+
/** Panel configuration */
|
|
124
|
+
config: IAiAgentService["config"];
|
|
125
|
+
/** Current context (reactive) */
|
|
126
|
+
context: IAiAgentService["context"];
|
|
127
|
+
/** Whether panel is open (not closed) */
|
|
128
|
+
isOpen: IAiAgentService["isOpen"];
|
|
129
|
+
/** Whether panel is in expanded state */
|
|
130
|
+
isExpanded: IAiAgentService["isExpanded"];
|
|
131
|
+
/** Total count of items in current context */
|
|
132
|
+
totalItemsCount: IAiAgentService["totalItemsCount"];
|
|
133
|
+
/** Open the AI panel */
|
|
134
|
+
openPanel: () => void;
|
|
135
|
+
/** Close the AI panel */
|
|
136
|
+
closePanel: () => void;
|
|
137
|
+
/** Toggle panel open/close */
|
|
138
|
+
togglePanel: () => void;
|
|
139
|
+
/** Expand the panel to larger width */
|
|
140
|
+
expandPanel: () => void;
|
|
141
|
+
/** Collapse panel to normal width */
|
|
142
|
+
collapsePanel: () => void;
|
|
143
|
+
/** Update configuration */
|
|
144
|
+
setConfig: (config: Partial<IAiAgentConfig>) => void;
|
|
145
|
+
/** Send message to AI agent iframe */
|
|
146
|
+
sendMessage: IAiAgentService["sendMessage"];
|
|
147
|
+
/** Register message handler, returns unsubscribe function */
|
|
148
|
+
onMessage: (handler: (event: IAiAgentMessage) => void) => () => void;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Composable for interacting with the AI agent panel.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* const { togglePanel, isOpen, onMessage } = useAiAgent();
|
|
157
|
+
*
|
|
158
|
+
* // Toggle AI panel
|
|
159
|
+
* const handleAiClick = () => togglePanel();
|
|
160
|
+
*
|
|
161
|
+
* // Listen for messages from AI agent
|
|
162
|
+
* onMessage((message) => {
|
|
163
|
+
* if (message.type === 'PREVIEW_CHANGES') {
|
|
164
|
+
* // Handle preview changes
|
|
165
|
+
* }
|
|
166
|
+
* });
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export function useAiAgent(): UseAiAgentReturn {
|
|
170
|
+
const service = inject(AiAgentServiceKey);
|
|
171
|
+
if (!service) {
|
|
172
|
+
logger.error("AiAgentService not found. Did you forget to call provideAiAgentService()?");
|
|
173
|
+
throw new InjectionError("AiAgentService");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
// State
|
|
178
|
+
panelState: service.panelState,
|
|
179
|
+
config: service.config,
|
|
180
|
+
context: service.context,
|
|
181
|
+
isOpen: service.isOpen,
|
|
182
|
+
isExpanded: service.isExpanded,
|
|
183
|
+
totalItemsCount: service.totalItemsCount,
|
|
184
|
+
|
|
185
|
+
// Panel control
|
|
186
|
+
openPanel: service.openPanel,
|
|
187
|
+
closePanel: service.closePanel,
|
|
188
|
+
togglePanel: service.togglePanel,
|
|
189
|
+
expandPanel: service.expandPanel,
|
|
190
|
+
collapsePanel: service.collapsePanel,
|
|
191
|
+
|
|
192
|
+
// Configuration
|
|
193
|
+
setConfig: service.setConfig,
|
|
194
|
+
|
|
195
|
+
// Communication
|
|
196
|
+
sendMessage: service.sendMessage,
|
|
197
|
+
onMessage: service.onMessage,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Creates a toolbar button configuration for opening the AI agent.
|
|
203
|
+
* Can be used directly in blade toolbar definitions.
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```typescript
|
|
207
|
+
* const bladeToolbar = [
|
|
208
|
+
* createAiAgentToolbarButton(),
|
|
209
|
+
* // ... other toolbar items
|
|
210
|
+
* ];
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
export function createAiAgentToolbarButton(options?: { title?: string; icon?: string }) {
|
|
214
|
+
return {
|
|
215
|
+
id: "ai-agent-toggle",
|
|
216
|
+
icon: options?.icon ?? "lucide-sparkles",
|
|
217
|
+
title: options?.title ?? "AI Assistant",
|
|
218
|
+
clickHandler: () => {
|
|
219
|
+
try {
|
|
220
|
+
const service = inject(AiAgentServiceKey);
|
|
221
|
+
if (service) {
|
|
222
|
+
service.togglePanel();
|
|
223
|
+
} else {
|
|
224
|
+
logger.warn("AiAgentService not available for toolbar button");
|
|
225
|
+
}
|
|
226
|
+
} catch (e) {
|
|
227
|
+
logger.error("Failed to toggle AI panel:", e);
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|