@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
|
|
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(
|
|
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(
|
|
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,
|
|
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":";;;;;;;;;;;;;;;;;;;AAqBA,MAAM,YAAY,MAAA,CAAO,CAAC,0BACxB,GAAA,CAACA,WAAA,EAAA,EAAa,gBAAc,IAAA,EAAC,SAAA,EAAW,GAAG,MAAA,EAAM,IAAA,EAAE,GAAG,KAAA,EAAO,CAC9D,EAAE,CAAC,EAAE,OAAM,MAAO;AAAA,EACjB,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,EAC1C,oBAAA,EAAsB;AAAA,IACpB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS;AAAA;AAEb,CAAA,CAAE,CAAA;AAEF,MAAM,gBAAA,GAAmB,MAAA,CAAO,CAAC,KAAA,qBAC/B,GAAA;AAAA,EAACC,kBAAA;AAAA,EAAA;AAAA,IACC,UAAA,sBAAa,wBAAA,EAAA,EAAyB,EAAA,EAAI,EAAE,QAAA,EAAU,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EAAG,CAAA;AAAA,IACxE,GAAG;AAAA;AACN,CACD,CAAA,CAAE,CAAC,EAAE,KAAA,EAAM,MAAO;AAAA,EACjB,eAAA,EAAiB,oBAAA;AAAA,EACjB,aAAA,EAAe,aAAA;AAAA,EACf,CAAC,MAAM,uBAAA,CAAwB,iBAAiB,IAAI,uBAAA,CAAwB,QAAQ,EAAE,GACpF;AAAA,IACE,SAAA,EAAW;AAAA,GACb;AAAA,EACF,CAAC,CAAA,GAAA,EAAM,uBAAA,CAAwB,OAAO,EAAE,GAAG;AAAA,IACzC,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC7B;AAAA,EACA,GAAG,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ;AAAA,IAC3B,eAAA,EAAiB;AAAA,GAClB;AACH,CAAA,CAAE,CAAA;AAEF,MAAM,mBAAmB,MAAA,CAAOC,kBAAmB,EAAE,CAAC,EAAE,OAAM,MAAO;AAAA,EACnE,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EACxB,SAAA,EAAW,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAC/C,CAAA,CAAE,CAAA;AAEK,MAAM,MAAM,MAAM;AACvB,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,iBAAA,KACrC,eAAA,EAAgB;AAElB,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,yBAAA;AAAA,IACT,KAAA,EAAO,uBAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT,GAAI,QAAA,CAAS,iBAAA,EAAmB,CAAC,iBAAiB,CAAC,CAAA;AAEnD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC9B,IAAA,IACE,yBAAA,IACA,uBAAA,IACA,CAAC,kBAAA,EACD;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,kBAAA,CACJ,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,QAAQ,CAAA,CACzB,MAAA,CAAO,CAAC,CAAA,EAAG,GAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAM,CAAC,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,kBAAA,EAAoB,uBAAA,EAAyB,yBAAyB,CAAC,CAAA;AAE3E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAyB,KAAK,CAAA;AAE9D,EAAA,MAAM,YAAA,GACJ,CAAC,KAAA,KAAkB,CAAC,QAAwB,WAAA,KAAyB;AACnE,IAAA,WAAA,CAAY,WAAA,GAAc,QAAQ,KAAK,CAAA;AAAA,EACzC,CAAA;AAEF,EAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,EAAkB,OAAA,KAAqB;AAClE,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,gBAA+B,kBAAA,CAAmB,MAAA;AAAA,MACtD,CAAA,IAAA,KAAQ,KAAK,QAAA,KAAa;AAAA,KAC5B;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,YAAA,EAAc,GAAG,aAAa,CAAA;AACnD,MAAA,MAAM,SAAS,KAAA,CAAM,IAAA;AAAA,QACnB,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,UAAQ,CAAC,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,IAAI,CAAC,CAAC,EAAE,MAAA;AAAO,OACrE;AACA,MAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,sBAAsB,IAAI,GAAA;AAAA,MAC9B,cAAc,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC;AAAA,KAC1C;AACA,IAAA,eAAA;AAAA,MACE,YAAA,CAAa,MAAA;AAAA,QACX,UAAQ,CAAC,mBAAA,CAAoB,IAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC;AAAA;AACvD,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAmB,OAAA,KAAqB;AAC/D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAU,IAAI,GAAA;AAAA,QAClB,CAAC,GAAG,YAAA,EAAc,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAC,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,OACjE;AACA,MAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,eAAA;AAAA,MACE,YAAA,CAAa,MAAA;AAAA,QACX,CAAA,CAAA,KAAK,EAAE,CAAA,CAAE,IAAA,KAAS,KAAK,IAAA,IAAQ,CAAA,CAAE,aAAa,IAAA,CAAK,QAAA;AAAA;AACrD,KACF;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,yBAAA,EAA2B;AAC7B,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,MAAA,EAAO,QAAA,EAAA,gCAAA,EAA8B,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,uBAAA,EAAyB;AAC3B,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,QAAA,EAAA,qEAAA,EAExB,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,MAAA,EAAO,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,EACnD;AAEA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAA,QAAA,qBACb,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MAEC,UAAU,QAAA,KAAa,QAAA;AAAA,MACvB,QAAA,EAAU,aAAa,QAAQ,CAAA;AAAA,MAE/B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,oBACC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EAAQ,oBAAS,CAAA,EACzC,CAAA;AAAA,wBACA,GAAA,CAAC,gBAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,OAAA,sBAAU,QAAA,EAAA,EAAS,CAAA;AAAA,cACnB,KAAA,EAAM,KAAA;AAAA,cACN,UAAU,CAAC,EAAA,EAAI,OAAA,KACb,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,cAEvC,UAAU,QAAA,KAAa,MAAA;AAAA,cACvB,SAAS,kBAAA,CACN,MAAA,CAAO,UAAQ,IAAA,CAAK,QAAA,KAAa,QAAQ,CAAA,CACzC,KAAA;AAAA,gBAAM,UACL,YAAA,EAAc,IAAA;AAAA,kBACZ,OAAK,CAAA,CAAE,IAAA,KAAS,KAAK,IAAA,IAAQ,CAAA,CAAE,aAAa,IAAA,CAAK;AAAA;AACnD;AACF;AAAA,WACJ;AAAA,UACC,kBAAA,CACE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,aAAa,QAAQ,CAAA,CACzC,GAAA,CAAI,CAAA,IAAA,yBACF,OAAA,EAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,WAAA,EAA6B,OAAK,IAAA,EACrD,QAAA,kBAAA,GAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,OAAA,sBAAU,QAAA,EAAA,EAAS,CAAA;AAAA,cACnB,OAAO,IAAA,CAAK,IAAA;AAAA,cACZ,SACE,YAAA,EAAc,IAAA;AAAA,gBACZ,OACE,CAAA,CAAE,IAAA,KAAS,KAAK,IAAA,IAChB,CAAA,CAAE,aAAa,IAAA,CAAK;AAAA,eACxB,IAAK,KAAA;AAAA,cAEP,QAAA,EAAU,KAAK,QAAA,KAAa,MAAA;AAAA,cAC5B,UAAU,CAAC,EAAA,EAAI,OAAA,KAAY,eAAA,CAAgB,MAAM,OAAO;AAAA;AAAA,WAC1D,EAAA,EAbqC,IAAA,CAAK,IAc5C,CACD;AAAA,SAAA,EACL,CAAA,EACF;AAAA;AAAA,KAAA;AAAA,IA5CK;AAAA,GA8CR,CAAA,EACH,CAAA;AAEJ;;;;"}
|
|
@@ -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
|
-
|
|
56
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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"
|