@sweetoburrito/backstage-plugin-ai-assistant 0.9.0 → 0.10.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.
@@ -1,7 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useMemo, useState } from 'react';
3
3
  import { useAsync } from 'react-use';
4
- import { useApi, fetchApiRef, discoveryApiRef } from '@backstage/core-plugin-api';
5
4
  import Alert from '@mui/material/Alert';
6
5
  import { styled } from '@mui/material/styles';
7
6
  import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp';
@@ -14,6 +13,7 @@ import FormControlLabel from '@mui/material/FormControlLabel';
14
13
  import Checkbox from '@mui/material/Checkbox';
15
14
  import Tooltip from '@mui/material/Tooltip';
16
15
  import { useChatSettings } from '../../../../hooks/use-chat-settings.esm.js';
16
+ import '@backstage/core-plugin-api';
17
17
  import '../../../../api/summarizer.esm.js';
18
18
  import 'react-router-dom';
19
19
 
@@ -50,19 +50,12 @@ const AccordionDetails = styled(AccordionDetails$1)(({ theme }) => ({
50
50
  borderTop: `1px solid ${theme.palette.divider}`
51
51
  }));
52
52
  const Tab = () => {
53
- const fetchApi = useApi(fetchApiRef);
54
- const discoveryApi = useApi(discoveryApiRef);
55
- const { toolsEnabled, setToolsEnabled } = useChatSettings();
53
+ const { toolsEnabled, setToolsEnabled, getAvailableTools } = useChatSettings();
56
54
  const {
57
55
  loading: availableUserToolsLoading,
58
56
  error: availableUserToolsError,
59
57
  value: availableUserTools
60
- } = useAsync(async () => {
61
- const baseUrl = await discoveryApi.getBaseUrl("ai-assistant");
62
- const response = await fetchApi.fetch(`${baseUrl}/chat/tools`);
63
- const { tools } = await response.json();
64
- return tools;
65
- }, [discoveryApi, fetchApi]);
58
+ } = useAsync(getAvailableTools, [getAvailableTools]);
66
59
  const providers = useMemo(() => {
67
60
  if (availableUserToolsLoading || availableUserToolsError || !availableUserTools) {
68
61
  return [];
@@ -77,7 +70,9 @@ const Tab = () => {
77
70
  if (!availableUserTools) {
78
71
  return;
79
72
  }
80
- const providerTools = availableUserTools.filter((tool) => tool.provider === provider).map((tool) => ({ name: tool.name, provider: tool.provider }));
73
+ const providerTools = availableUserTools.filter(
74
+ (tool) => tool.provider === provider
75
+ );
81
76
  if (checked) {
82
77
  const combined = [...toolsEnabled, ...providerTools];
83
78
  const unique = Array.from(
@@ -98,9 +93,7 @@ const Tab = () => {
98
93
  const handleToolClick = (tool, checked) => {
99
94
  if (checked) {
100
95
  const toolMap = new Map(
101
- [...toolsEnabled, { name: tool.name, provider: tool.provider }].map(
102
- (t) => [`${t.provider}-${t.name}`, t]
103
- )
96
+ [...toolsEnabled, tool].map((t) => [`${t.provider}-${t.name}`, t])
104
97
  );
105
98
  setToolsEnabled(Array.from(toolMap.values()));
106
99
  return;
@@ -134,6 +127,7 @@ const Tab = () => {
134
127
  control: /* @__PURE__ */ jsx(Checkbox, {}),
135
128
  label: "All",
136
129
  onChange: (_e, checked) => handleProviderClick(provider, checked),
130
+ disabled: provider === "core",
137
131
  checked: availableUserTools.filter((tool) => tool.provider === provider).every(
138
132
  (tool) => toolsEnabled?.some(
139
133
  (t) => t.name === tool.name && t.provider === tool.provider
@@ -149,6 +143,7 @@ const Tab = () => {
149
143
  checked: toolsEnabled?.some(
150
144
  (t) => t.name === tool.name && t.provider === tool.provider
151
145
  ) || false,
146
+ disabled: tool.provider === "core",
152
147
  onChange: (_e, checked) => handleToolClick(tool, checked)
153
148
  }
154
149
  ) }, tool.name))
@@ -1 +1 @@
1
- {"version":3,"file":"Tools.esm.js","sources":["../../../../../src/components/SettingsModal/tabs/Tools/Tools.tsx"],"sourcesContent":["import { SyntheticEvent, useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\nimport {\n fetchApiRef,\n useApi,\n discoveryApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n EnabledTool,\n UserTool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport Alert from '@mui/material/Alert';\n\nimport { styled } from '@mui/material/styles';\nimport ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp';\nimport MuiAccordion, { AccordionProps } from '@mui/material/Accordion';\nimport MuiAccordionSummary, {\n AccordionSummaryProps,\n accordionSummaryClasses,\n} from '@mui/material/AccordionSummary';\nimport MuiAccordionDetails from '@mui/material/AccordionDetails';\nimport Typography from '@mui/material/Typography';\nimport FormGroup from '@mui/material/FormGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useChatSettings } from '../../../../hooks';\n\nconst Accordion = styled((props: AccordionProps) => (\n <MuiAccordion disableGutters elevation={0} square {...props} />\n))(({ theme }) => ({\n border: `1px solid ${theme.palette.divider}`,\n '&:not(:last-child)': {\n borderBottom: 0,\n },\n '&::before': {\n display: 'none',\n },\n}));\n\nconst AccordionSummary = styled((props: AccordionSummaryProps) => (\n <MuiAccordionSummary\n expandIcon={<ArrowForwardIosSharpIcon sx={{ fontSize: '0.9rem', ml: 1 }} />}\n {...props}\n />\n))(({ theme }) => ({\n backgroundColor: 'rgba(0, 0, 0, .03)',\n flexDirection: 'row-reverse',\n [`& .${accordionSummaryClasses.expandIconWrapper}.${accordionSummaryClasses.expanded}`]:\n {\n transform: 'rotate(90deg)',\n },\n [`& .${accordionSummaryClasses.content}`]: {\n marginLeft: theme.spacing(1),\n },\n ...theme.applyStyles('dark', {\n backgroundColor: 'rgba(255, 255, 255, .05)',\n }),\n}));\n\nconst AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({\n padding: theme.spacing(2),\n borderTop: `1px solid ${theme.palette.divider}`,\n}));\n\nexport const Tab = () => {\n const fetchApi = useApi(fetchApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n const { toolsEnabled, setToolsEnabled } = useChatSettings();\n\n const {\n loading: availableUserToolsLoading,\n error: availableUserToolsError,\n value: availableUserTools,\n } = useAsync(async () => {\n const baseUrl = await discoveryApi.getBaseUrl('ai-assistant');\n\n const response = await fetchApi.fetch(`${baseUrl}/chat/tools`);\n\n const { tools } = (await response.json()) as {\n tools: UserTool[];\n };\n\n return tools;\n }, [discoveryApi, fetchApi]);\n\n const providers = useMemo(() => {\n if (\n availableUserToolsLoading ||\n availableUserToolsError ||\n !availableUserTools\n ) {\n return [];\n }\n return availableUserTools\n .map(tool => tool.provider)\n .filter((v, i, a) => a.indexOf(v) === i);\n }, [availableUserTools, availableUserToolsError, availableUserToolsLoading]);\n\n const [expanded, setExpanded] = useState<string | false>(false);\n\n const handleChange =\n (panel: string) => (_event: SyntheticEvent, newExpanded: boolean) => {\n setExpanded(newExpanded ? panel : false);\n };\n\n const handleProviderClick = (provider: string, checked: boolean) => {\n if (!availableUserTools) {\n return;\n }\n const providerTools: EnabledTool[] = availableUserTools\n .filter(tool => tool.provider === provider)\n .map(tool => ({ name: tool.name, provider: tool.provider }));\n\n if (checked) {\n const combined = [...toolsEnabled, ...providerTools];\n const unique = Array.from(\n new Map(combined.map(tool => [JSON.stringify(tool), tool])).values(),\n );\n setToolsEnabled(unique);\n return;\n }\n\n const providerToolStrings = new Set(\n providerTools.map(t => JSON.stringify(t)),\n );\n setToolsEnabled(\n toolsEnabled.filter(\n tool => !providerToolStrings.has(JSON.stringify(tool)),\n ),\n );\n };\n\n const handleToolClick = (tool: UserTool, checked: boolean) => {\n if (checked) {\n const toolMap = new Map(\n [...toolsEnabled, { name: tool.name, provider: tool.provider }].map(\n t => [`${t.provider}-${t.name}`, t],\n ),\n );\n setToolsEnabled(Array.from(toolMap.values()));\n return;\n }\n\n setToolsEnabled(\n toolsEnabled.filter(\n t => !(t.name === tool.name && t.provider === tool.provider),\n ),\n );\n };\n\n if (availableUserToolsLoading) {\n return <Alert severity=\"info\">Loading Tool configurations...</Alert>;\n }\n\n if (availableUserToolsError) {\n return (\n <Alert severity=\"error\">\n Failed to load Tool configurations. Please try refreshing the page.\n </Alert>\n );\n }\n\n if (!providers.length) {\n return <Alert severity=\"info\">No tools available.</Alert>;\n }\n\n return (\n <div>\n {providers.map(provider => (\n <Accordion\n key={provider}\n expanded={expanded === provider}\n onChange={handleChange(provider)}\n >\n <AccordionSummary>\n <Typography component=\"span\">{provider}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <FormGroup>\n <FormControlLabel\n control={<Checkbox />}\n label=\"All\"\n onChange={(_e, checked) =>\n handleProviderClick(provider, checked)\n }\n checked={availableUserTools!\n .filter(tool => tool.provider === provider)\n .every(tool =>\n toolsEnabled?.some(\n t => t.name === tool.name && t.provider === tool.provider,\n ),\n )}\n />\n {availableUserTools!\n .filter(tool => tool.provider === provider)\n .map(tool => (\n <Tooltip title={tool.description} key={tool.name} arrow>\n <FormControlLabel\n control={<Checkbox />}\n label={tool.name}\n checked={\n toolsEnabled?.some(\n t =>\n t.name === tool.name &&\n t.provider === tool.provider,\n ) || false\n }\n onChange={(_e, checked) => handleToolClick(tool, checked)}\n />\n </Tooltip>\n ))}\n </FormGroup>\n </AccordionDetails>\n </Accordion>\n ))}\n </div>\n );\n};\n"],"names":["MuiAccordion","MuiAccordionSummary","MuiAccordionDetails"],"mappings":"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"}
1
+ {"version":3,"file":"Tools.esm.js","sources":["../../../../../src/components/SettingsModal/tabs/Tools/Tools.tsx"],"sourcesContent":["import { SyntheticEvent, useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { EnabledTool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport Alert from '@mui/material/Alert';\n\nimport { styled } from '@mui/material/styles';\nimport ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp';\nimport MuiAccordion, { AccordionProps } from '@mui/material/Accordion';\nimport MuiAccordionSummary, {\n AccordionSummaryProps,\n accordionSummaryClasses,\n} from '@mui/material/AccordionSummary';\nimport MuiAccordionDetails from '@mui/material/AccordionDetails';\nimport Typography from '@mui/material/Typography';\nimport FormGroup from '@mui/material/FormGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useChatSettings } from '../../../../hooks';\n\nconst Accordion = styled((props: AccordionProps) => (\n <MuiAccordion disableGutters elevation={0} square {...props} />\n))(({ theme }) => ({\n border: `1px solid ${theme.palette.divider}`,\n '&:not(:last-child)': {\n borderBottom: 0,\n },\n '&::before': {\n display: 'none',\n },\n}));\n\nconst AccordionSummary = styled((props: AccordionSummaryProps) => (\n <MuiAccordionSummary\n expandIcon={<ArrowForwardIosSharpIcon sx={{ fontSize: '0.9rem', ml: 1 }} />}\n {...props}\n />\n))(({ theme }) => ({\n backgroundColor: 'rgba(0, 0, 0, .03)',\n flexDirection: 'row-reverse',\n [`& .${accordionSummaryClasses.expandIconWrapper}.${accordionSummaryClasses.expanded}`]:\n {\n transform: 'rotate(90deg)',\n },\n [`& .${accordionSummaryClasses.content}`]: {\n marginLeft: theme.spacing(1),\n },\n ...theme.applyStyles('dark', {\n backgroundColor: 'rgba(255, 255, 255, .05)',\n }),\n}));\n\nconst AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({\n padding: theme.spacing(2),\n borderTop: `1px solid ${theme.palette.divider}`,\n}));\n\nexport const Tab = () => {\n const { toolsEnabled, setToolsEnabled, getAvailableTools } =\n useChatSettings();\n\n const {\n loading: availableUserToolsLoading,\n error: availableUserToolsError,\n value: availableUserTools,\n } = useAsync(getAvailableTools, [getAvailableTools]);\n\n const providers = useMemo(() => {\n if (\n availableUserToolsLoading ||\n availableUserToolsError ||\n !availableUserTools\n ) {\n return [];\n }\n return availableUserTools\n .map(tool => tool.provider)\n .filter((v, i, a) => a.indexOf(v) === i);\n }, [availableUserTools, availableUserToolsError, availableUserToolsLoading]);\n\n const [expanded, setExpanded] = useState<string | false>(false);\n\n const handleChange =\n (panel: string) => (_event: SyntheticEvent, newExpanded: boolean) => {\n setExpanded(newExpanded ? panel : false);\n };\n\n const handleProviderClick = (provider: string, checked: boolean) => {\n if (!availableUserTools) {\n return;\n }\n const providerTools: EnabledTool[] = availableUserTools.filter(\n tool => tool.provider === provider,\n );\n\n if (checked) {\n const combined = [...toolsEnabled, ...providerTools];\n const unique = Array.from(\n new Map(combined.map(tool => [JSON.stringify(tool), tool])).values(),\n );\n setToolsEnabled(unique);\n return;\n }\n\n const providerToolStrings = new Set(\n providerTools.map(t => JSON.stringify(t)),\n );\n setToolsEnabled(\n toolsEnabled.filter(\n tool => !providerToolStrings.has(JSON.stringify(tool)),\n ),\n );\n };\n\n const handleToolClick = (tool: EnabledTool, checked: boolean) => {\n if (checked) {\n const toolMap = new Map(\n [...toolsEnabled, tool].map(t => [`${t.provider}-${t.name}`, t]),\n );\n setToolsEnabled(Array.from(toolMap.values()));\n return;\n }\n\n setToolsEnabled(\n toolsEnabled.filter(\n t => !(t.name === tool.name && t.provider === tool.provider),\n ),\n );\n };\n\n if (availableUserToolsLoading) {\n return <Alert severity=\"info\">Loading Tool configurations...</Alert>;\n }\n\n if (availableUserToolsError) {\n return (\n <Alert severity=\"error\">\n Failed to load Tool configurations. Please try refreshing the page.\n </Alert>\n );\n }\n\n if (!providers.length) {\n return <Alert severity=\"info\">No tools available.</Alert>;\n }\n\n return (\n <div>\n {providers.map(provider => (\n <Accordion\n key={provider}\n expanded={expanded === provider}\n onChange={handleChange(provider)}\n >\n <AccordionSummary>\n <Typography component=\"span\">{provider}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <FormGroup>\n <FormControlLabel\n control={<Checkbox />}\n label=\"All\"\n onChange={(_e, checked) =>\n handleProviderClick(provider, checked)\n }\n disabled={provider === 'core'}\n checked={availableUserTools!\n .filter(tool => tool.provider === provider)\n .every(tool =>\n toolsEnabled?.some(\n t => t.name === tool.name && t.provider === tool.provider,\n ),\n )}\n />\n {availableUserTools!\n .filter(tool => tool.provider === provider)\n .map(tool => (\n <Tooltip title={tool.description} key={tool.name} arrow>\n <FormControlLabel\n control={<Checkbox />}\n label={tool.name}\n checked={\n toolsEnabled?.some(\n t =>\n t.name === tool.name &&\n t.provider === tool.provider,\n ) || false\n }\n disabled={tool.provider === 'core'}\n onChange={(_e, checked) => handleToolClick(tool, checked)}\n />\n </Tooltip>\n ))}\n </FormGroup>\n </AccordionDetails>\n </Accordion>\n ))}\n </div>\n );\n};\n"],"names":["MuiAccordion","MuiAccordionSummary","MuiAccordionDetails"],"mappings":"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"}
@@ -27,6 +27,12 @@ const useChatSettings = () => {
27
27
  const setToolsEnabledState = useChatModalSettingsStore(
28
28
  (state) => state.setToolsEnabled
29
29
  );
30
+ const getAvailableTools = useCallback(async () => {
31
+ const baseUrl = await discoveryApi.getBaseUrl("ai-assistant");
32
+ const response = await fetchApi.fetch(`${baseUrl}/tools`);
33
+ const { tools } = await response.json();
34
+ return tools;
35
+ }, [discoveryApi, fetchApi]);
30
36
  const setToolsEnabled = useCallback(
31
37
  async (tools) => {
32
38
  setToolsEnabledState(tools);
@@ -52,8 +58,22 @@ const useChatSettings = () => {
52
58
  const {
53
59
  settings: { tools }
54
60
  } = await response.json();
55
- setToolsEnabledState(tools ?? []);
56
- }, [discoveryApi, fetchApi, setToolsEnabledState]);
61
+ if (tools) {
62
+ setToolsEnabledState(tools);
63
+ return;
64
+ }
65
+ const availableTools = await getAvailableTools();
66
+ const coreTools = availableTools.filter((tool) => tool.provider === "core");
67
+ setToolsEnabledState(coreTools);
68
+ await fetchApi.fetch(`${baseUrl}/settings`, {
69
+ method: "PATCH",
70
+ body: JSON.stringify({
71
+ type: "user-tools",
72
+ settings: { tools: coreTools }
73
+ }),
74
+ headers: { "Content-Type": "application/json" }
75
+ });
76
+ }, [discoveryApi, fetchApi, setToolsEnabledState, getAvailableTools]);
57
77
  useEffect(() => {
58
78
  fetchUserEnabledTools();
59
79
  }, [fetchUserEnabledTools]);
@@ -63,7 +83,8 @@ const useChatSettings = () => {
63
83
  summaryEnabled,
64
84
  setSummaryEnabled,
65
85
  toolsEnabled,
66
- setToolsEnabled
86
+ setToolsEnabled,
87
+ getAvailableTools
67
88
  };
68
89
  };
69
90
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat-settings.esm.js","sources":["../../src/hooks/use-chat-settings.ts"],"sourcesContent":["import { create } from 'zustand';\nimport {\n fetchApiRef,\n useApi,\n discoveryApiRef,\n} from '@backstage/core-plugin-api';\nimport { useCallback, useEffect } from 'react';\nimport { EnabledTool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\n\ninterface ChatModalSettings {\n modalVisible: boolean;\n setModalVisible: (visible: boolean) => void;\n summaryEnabled: boolean;\n setSummaryEnabled: (enable: boolean) => void;\n toolsEnabled: EnabledTool[];\n setToolsEnabled: (tools: EnabledTool[]) => void;\n}\n\nconst useChatModalSettingsStore = create<ChatModalSettings>(set => ({\n modalVisible: true,\n setModalVisible: (visible: boolean) => set({ modalVisible: visible }),\n summaryEnabled: false,\n setSummaryEnabled: (summaryEnabled: boolean) => set({ summaryEnabled }),\n toolsEnabled: [],\n setToolsEnabled: (toolsEnabled: EnabledTool[]) => set({ toolsEnabled }),\n}));\n\nexport const useChatSettings = () => {\n const fetchApi = useApi(fetchApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n\n const modalVisible = useChatModalSettingsStore(state => state.modalVisible);\n const setModalVisible = useChatModalSettingsStore(\n state => state.setModalVisible,\n );\n\n const summaryEnabled = useChatModalSettingsStore(\n state => state.summaryEnabled,\n );\n const setSummaryEnabled = useChatModalSettingsStore(\n state => state.setSummaryEnabled,\n );\n\n const toolsEnabled = useChatModalSettingsStore(state => state.toolsEnabled);\n\n const setToolsEnabledState = useChatModalSettingsStore(\n state => state.setToolsEnabled,\n );\n\n const setToolsEnabled = useCallback(\n async (tools: EnabledTool[]) => {\n setToolsEnabledState(tools);\n const baseUrl = await discoveryApi.getBaseUrl('ai-assistant');\n\n await fetchApi.fetch(`${baseUrl}/settings`, {\n method: 'PATCH',\n body: JSON.stringify({ type: 'user-tools', settings: { tools } }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n },\n [discoveryApi, fetchApi, setToolsEnabledState],\n );\n\n const fetchUserEnabledTools = useCallback(async () => {\n const baseUrl = await discoveryApi.getBaseUrl('ai-assistant');\n\n const query = new URLSearchParams({\n type: 'user-tools',\n });\n\n const response = await fetchApi.fetch(\n `${baseUrl}/settings?${query.toString()}`,\n );\n\n const {\n settings: { tools },\n } = (await response.json()) as {\n settings: { tools?: EnabledTool[] };\n };\n\n setToolsEnabledState(tools ?? []);\n }, [discoveryApi, fetchApi, setToolsEnabledState]);\n\n useEffect(() => {\n fetchUserEnabledTools();\n }, [fetchUserEnabledTools]);\n\n return {\n modalVisible,\n setModalVisible,\n summaryEnabled,\n setSummaryEnabled,\n toolsEnabled,\n setToolsEnabled,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-chat-settings.esm.js","sources":["../../src/hooks/use-chat-settings.ts"],"sourcesContent":["import { create } from 'zustand';\nimport {\n fetchApiRef,\n useApi,\n discoveryApiRef,\n} from '@backstage/core-plugin-api';\nimport { useCallback, useEffect } from 'react';\nimport { EnabledTool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\n\ninterface ChatModalSettings {\n modalVisible: boolean;\n setModalVisible: (visible: boolean) => void;\n summaryEnabled: boolean;\n setSummaryEnabled: (enable: boolean) => void;\n toolsEnabled: EnabledTool[];\n setToolsEnabled: (tools: EnabledTool[]) => void;\n}\n\nconst useChatModalSettingsStore = create<ChatModalSettings>(set => ({\n modalVisible: true,\n setModalVisible: (visible: boolean) => set({ modalVisible: visible }),\n summaryEnabled: false,\n setSummaryEnabled: (summaryEnabled: boolean) => set({ summaryEnabled }),\n toolsEnabled: [],\n setToolsEnabled: (toolsEnabled: EnabledTool[]) => set({ toolsEnabled }),\n}));\n\nexport const useChatSettings = () => {\n const fetchApi = useApi(fetchApiRef);\n const discoveryApi = useApi(discoveryApiRef);\n\n const modalVisible = useChatModalSettingsStore(state => state.modalVisible);\n const setModalVisible = useChatModalSettingsStore(\n state => state.setModalVisible,\n );\n\n const summaryEnabled = useChatModalSettingsStore(\n state => state.summaryEnabled,\n );\n const setSummaryEnabled = useChatModalSettingsStore(\n state => state.setSummaryEnabled,\n );\n\n const toolsEnabled = useChatModalSettingsStore(state => state.toolsEnabled);\n\n const setToolsEnabledState = useChatModalSettingsStore(\n state => state.setToolsEnabled,\n );\n\n const getAvailableTools = useCallback(async (): Promise<EnabledTool[]> => {\n const baseUrl = await discoveryApi.getBaseUrl('ai-assistant');\n\n const response = await fetchApi.fetch(`${baseUrl}/tools`);\n\n const { tools } = (await response.json()) as {\n tools: EnabledTool[];\n };\n\n return tools;\n }, [discoveryApi, fetchApi]);\n\n const setToolsEnabled = useCallback(\n async (tools: EnabledTool[]) => {\n setToolsEnabledState(tools);\n const baseUrl = await discoveryApi.getBaseUrl('ai-assistant');\n\n await fetchApi.fetch(`${baseUrl}/settings`, {\n method: 'PATCH',\n body: JSON.stringify({ type: 'user-tools', settings: { tools } }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n },\n [discoveryApi, fetchApi, setToolsEnabledState],\n );\n\n const fetchUserEnabledTools = useCallback(async () => {\n const baseUrl = await discoveryApi.getBaseUrl('ai-assistant');\n\n const query = new URLSearchParams({\n type: 'user-tools',\n });\n\n const response = await fetchApi.fetch(\n `${baseUrl}/settings?${query.toString()}`,\n );\n\n const {\n settings: { tools },\n } = (await response.json()) as {\n settings: { tools?: EnabledTool[] };\n };\n\n if (tools) {\n setToolsEnabledState(tools);\n return;\n }\n\n const availableTools = await getAvailableTools();\n\n const coreTools = availableTools.filter(tool => tool.provider === 'core');\n\n setToolsEnabledState(coreTools);\n // Persist to backend\n await fetchApi.fetch(`${baseUrl}/settings`, {\n method: 'PATCH',\n body: JSON.stringify({\n type: 'user-tools',\n settings: { tools: coreTools },\n }),\n headers: { 'Content-Type': 'application/json' },\n });\n }, [discoveryApi, fetchApi, setToolsEnabledState, getAvailableTools]);\n\n useEffect(() => {\n fetchUserEnabledTools();\n }, [fetchUserEnabledTools]);\n\n return {\n modalVisible,\n setModalVisible,\n summaryEnabled,\n setSummaryEnabled,\n toolsEnabled,\n setToolsEnabled,\n getAvailableTools,\n };\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sweetoburrito/backstage-plugin-ai-assistant",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -37,7 +37,7 @@
37
37
  "@backstage/theme": "backstage:^",
38
38
  "@mui/icons-material": "^6.5.0",
39
39
  "@mui/material": "^6.5.0",
40
- "@sweetoburrito/backstage-plugin-ai-assistant-common": "^0.7.0",
40
+ "@sweetoburrito/backstage-plugin-ai-assistant-common": "^0.8.0",
41
41
  "react-markdown": "^10.1.0",
42
42
  "react-use": "^17.2.4",
43
43
  "tss-react": "^4.9.19",
@@ -54,7 +54,8 @@
54
54
  "@backstage/dev-utils": "backstage:^",
55
55
  "@backstage/plugin-api-docs": "backstage:^",
56
56
  "@backstage/plugin-catalog": "backstage:^",
57
- "@backstage/plugin-org": "backstage:^"
57
+ "@backstage/plugin-org": "backstage:^",
58
+ "@drodil/backstage-plugin-qeta": "^3.46.0"
58
59
  },
59
60
  "files": [
60
61
  "dist"