@drewswiredin/backstage-plugin-assistants 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,28 +2,32 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useState, useRef, useEffect } from 'react';
3
3
  import mermaid from 'mermaid';
4
4
  import { CircularProgress, Typography, Tooltip, Dialog, IconButton } from '@material-ui/core';
5
- import { makeStyles } from '@material-ui/core/styles';
5
+ import { useTheme, makeStyles } from '@material-ui/core/styles';
6
6
  import CloseIcon from '@material-ui/icons/Close';
7
7
 
8
- mermaid.initialize({
9
- startOnLoad: false,
10
- theme: "base",
11
- themeVariables: {
12
- background: "#ffffff",
13
- mainBkg: "#ffffff",
14
- primaryColor: "#f8fafc",
15
- primaryTextColor: "#111827",
16
- primaryBorderColor: "#334155",
17
- lineColor: "#475569",
18
- secondaryColor: "#eef2ff",
19
- tertiaryColor: "#f8fafc",
20
- clusterBkg: "#f8fafc",
21
- clusterBorder: "#cbd5e1",
22
- edgeLabelBackground: "#ffffff",
23
- fontFamily: "Inter, Roboto, Arial, sans-serif"
24
- },
25
- suppressErrorRendering: true
26
- });
8
+ function mermaidConfig(theme) {
9
+ const p = theme.palette;
10
+ return {
11
+ startOnLoad: false,
12
+ theme: "base",
13
+ suppressErrorRendering: true,
14
+ themeVariables: {
15
+ background: "transparent",
16
+ mainBkg: p.background.paper,
17
+ primaryColor: p.background.paper,
18
+ primaryTextColor: p.text.primary,
19
+ primaryBorderColor: p.divider,
20
+ lineColor: p.text.secondary,
21
+ secondaryColor: p.background.default,
22
+ tertiaryColor: p.background.default,
23
+ clusterBkg: p.background.default,
24
+ clusterBorder: p.divider,
25
+ edgeLabelBackground: p.background.default,
26
+ textColor: p.text.primary,
27
+ fontFamily: "Inter, Roboto, Arial, sans-serif"
28
+ }
29
+ };
30
+ }
27
31
  let idCounter = 0;
28
32
  const DEBOUNCE_MS = 600;
29
33
  const useStyles = makeStyles((theme) => ({
@@ -40,8 +44,8 @@ const useStyles = makeStyles((theme) => ({
40
44
  padding: theme.spacing(1),
41
45
  border: `1px solid ${theme.palette.divider}`,
42
46
  borderRadius: theme.shape.borderRadius,
43
- backgroundColor: "#ffffff",
44
- color: "#111827",
47
+ backgroundColor: "transparent",
48
+ color: theme.palette.text.primary,
45
49
  cursor: "zoom-in",
46
50
  overflow: "auto",
47
51
  transition: "filter 0.3s ease, opacity 0.3s ease",
@@ -102,8 +106,8 @@ const useStyles = makeStyles((theme) => ({
102
106
  minWidth: "100%",
103
107
  padding: theme.spacing(2),
104
108
  borderRadius: theme.shape.borderRadius,
105
- backgroundColor: "#ffffff",
106
- color: "#111827",
109
+ backgroundColor: "transparent",
110
+ color: theme.palette.text.primary,
107
111
  "& svg": {
108
112
  width: "auto",
109
113
  height: "auto",
@@ -124,6 +128,7 @@ const useStyles = makeStyles((theme) => ({
124
128
  }));
125
129
  function MermaidDiagram({ code }) {
126
130
  const classes = useStyles();
131
+ const theme = useTheme();
127
132
  const [svg, setSvg] = useState("");
128
133
  const [rendering, setRendering] = useState(true);
129
134
  const [error, setError] = useState("");
@@ -133,6 +138,7 @@ function MermaidDiagram({ code }) {
133
138
  const errorTimerRef = useRef();
134
139
  const lastRenderedCode = useRef("");
135
140
  useEffect(() => {
141
+ let active = true;
136
142
  const trimmed = code.trim();
137
143
  const isFirst = !svg && !error;
138
144
  const delay = isFirst ? 0 : DEBOUNCE_MS;
@@ -141,18 +147,20 @@ function MermaidDiagram({ code }) {
141
147
  setShowError(false);
142
148
  clearTimeout(timerRef.current);
143
149
  clearTimeout(errorTimerRef.current);
150
+ const renderKey = `${theme.palette.type}
151
+ ${trimmed}`;
144
152
  timerRef.current = setTimeout(() => {
145
- if (trimmed === lastRenderedCode.current) {
153
+ if (renderKey === lastRenderedCode.current) {
146
154
  setRendering(false);
147
155
  return;
148
156
  }
149
- let active = true;
150
157
  const id = `mermaid-${++idCounter}`;
158
+ mermaid.initialize(mermaidConfig(theme));
151
159
  mermaid.render(id, trimmed).then(({ svg: rendered }) => {
152
160
  if (active) {
153
161
  setSvg(rendered);
154
162
  setError("");
155
- lastRenderedCode.current = trimmed;
163
+ lastRenderedCode.current = renderKey;
156
164
  setRendering(false);
157
165
  }
158
166
  }).catch((err) => {
@@ -168,15 +176,13 @@ function MermaidDiagram({ code }) {
168
176
  }
169
177
  }
170
178
  });
171
- return () => {
172
- active = false;
173
- };
174
179
  }, delay);
175
180
  return () => {
181
+ active = false;
176
182
  clearTimeout(timerRef.current);
177
183
  clearTimeout(errorTimerRef.current);
178
184
  };
179
- }, [code]);
185
+ }, [code, theme.palette.type]);
180
186
  const handleKeyDown = (event) => {
181
187
  if (event.key === "Enter" || event.key === " ") {
182
188
  event.preventDefault();
@@ -1 +1 @@
1
- {"version":3,"file":"MermaidDiagram.esm.js","sources":["../../../src/collapsible/surface/MermaidDiagram.tsx"],"sourcesContent":["import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport mermaid from 'mermaid';\nimport {\n CircularProgress,\n Dialog,\n IconButton,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\n\nmermaid.initialize({\n startOnLoad: false,\n theme: 'base',\n themeVariables: {\n background: '#ffffff',\n mainBkg: '#ffffff',\n primaryColor: '#f8fafc',\n primaryTextColor: '#111827',\n primaryBorderColor: '#334155',\n lineColor: '#475569',\n secondaryColor: '#eef2ff',\n tertiaryColor: '#f8fafc',\n clusterBkg: '#f8fafc',\n clusterBorder: '#cbd5e1',\n edgeLabelBackground: '#ffffff',\n fontFamily: 'Inter, Roboto, Arial, sans-serif',\n },\n suppressErrorRendering: true,\n});\n\nlet idCounter = 0;\nconst DEBOUNCE_MS = 600;\n\nconst useStyles = makeStyles(theme => ({\n wrapper: {\n position: 'relative',\n margin: theme.spacing(1.5, 0),\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n minHeight: 80,\n },\n diagram: {\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor: '#ffffff',\n color: '#111827',\n cursor: 'zoom-in',\n overflow: 'auto',\n transition: 'filter 0.3s ease, opacity 0.3s ease',\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n '& svg': {\n maxWidth: '100%',\n height: 'auto',\n },\n },\n diagramLoading: {\n filter: 'blur(4px)',\n opacity: 0.4,\n pointerEvents: 'none',\n },\n overlay: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1),\n zIndex: 1,\n // frosted glass\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(30, 30, 30, 0.6)'\n : 'rgba(255, 255, 255, 0.6)',\n backdropFilter: 'blur(8px)',\n borderRadius: theme.shape.borderRadius,\n },\n dialogPaper: {\n backgroundColor: theme.palette.background.default,\n },\n dialogBody: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: theme.spacing(7, 3, 3),\n overflow: 'auto',\n },\n closeButton: {\n position: 'fixed',\n top: theme.spacing(1.5),\n right: theme.spacing(1.5),\n zIndex: 1,\n backgroundColor: theme.palette.background.paper,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n fullscreenDiagram: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '100%',\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: '#ffffff',\n color: '#111827',\n '& svg': {\n width: 'auto',\n height: 'auto',\n maxWidth: 'calc(100vw - 48px)',\n maxHeight: 'calc(100vh - 96px)',\n },\n },\n error: {\n margin: theme.spacing(1.5, 0),\n padding: theme.spacing(1.5),\n overflow: 'auto',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[100],\n color: theme.palette.text.primary,\n fontSize: theme.typography.caption.fontSize,\n },\n}));\n\n/**\n * Streaming-safe Mermaid renderer.\n *\n * Renders the first frame immediately, then debounces subsequent renders to\n * avoid thrashing while the diagram source is still streaming in. Keeps the\n * last good render on screen if an in-progress (incomplete) diagram fails to\n * parse, and only surfaces a parse error once the stream has settled. Clicking\n * the rendered diagram opens a fullscreen dialog.\n */\nexport function MermaidDiagram({ code }: { code: string }) {\n const classes = useStyles();\n const [svg, setSvg] = useState<string>('');\n const [rendering, setRendering] = useState(true);\n const [error, setError] = useState<string>('');\n const [showError, setShowError] = useState(false);\n const [open, setOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const errorTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const lastRenderedCode = useRef<string>('');\n\n useEffect(() => {\n const trimmed = code.trim();\n\n // If this is the first render (no svg yet), render immediately\n // Otherwise debounce to avoid rapid re-renders during streaming\n const isFirst = !svg && !error;\n const delay = isFirst ? 0 : DEBOUNCE_MS;\n\n setRendering(true);\n setError('');\n setShowError(false);\n\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n timerRef.current = setTimeout(() => {\n // Skip if code hasn't changed since last successful render\n if (trimmed === lastRenderedCode.current) {\n setRendering(false);\n return;\n }\n\n let active = true;\n const id = `mermaid-${++idCounter}`;\n\n mermaid\n .render(id, trimmed)\n .then(({ svg: rendered }) => {\n if (active) {\n setSvg(rendered);\n setError('');\n lastRenderedCode.current = trimmed;\n setRendering(false);\n }\n })\n .catch((err: Error) => {\n if (active) {\n // During streaming, don't replace a good render with an error\n // from incomplete code — just keep showing the loading state\n if (svg) {\n setRendering(false);\n } else {\n setError(err.message);\n setRendering(false);\n errorTimerRef.current = setTimeout(() => {\n setShowError(true);\n }, 1500);\n }\n }\n });\n\n return () => {\n active = false;\n };\n }, delay);\n\n return () => {\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [code]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n if (error && !svg && showError) {\n return (\n <pre className={classes.error}>\n <code>{code}</code>\n </pre>\n );\n }\n\n const isLoading = rendering && !!svg;\n const isInitialLoading = !svg && (rendering || (error && !showError));\n\n return (\n <>\n <div className={classes.wrapper}>\n {isLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {isInitialLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {svg && (\n <Tooltip title=\"Open diagram fullscreen\">\n <div\n className={`${classes.diagram} ${\n isLoading ? classes.diagramLoading : ''\n }`}\n dangerouslySetInnerHTML={{ __html: svg }}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Open Mermaid diagram fullscreen\"\n onClick={() => !isLoading && setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n </Tooltip>\n )}\n </div>\n\n <Dialog\n fullScreen\n open={open}\n onClose={() => setOpen(false)}\n PaperProps={{ className: classes.dialogPaper }}\n >\n <div className={classes.dialogBody}>\n <Tooltip title=\"Close\">\n <IconButton\n className={classes.closeButton}\n aria-label=\"Close fullscreen diagram\"\n onClick={() => setOpen(false)}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n <div\n className={classes.fullscreenDiagram}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n </div>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MermaidDiagram.esm.js","sources":["../../../src/collapsible/surface/MermaidDiagram.tsx"],"sourcesContent":["import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport mermaid from 'mermaid';\nimport {\n CircularProgress,\n Dialog,\n IconButton,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles, useTheme, type Theme } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\n\n/**\n * Mermaid config derived from the active Backstage theme so diagrams follow\n * light/dark mode. The diagram background is transparent so it blends with the\n * conversation surface (no mismatched light box on a dark thread); nodes, text,\n * borders, and lines come from the palette.\n */\nfunction mermaidConfig(theme: Theme) {\n const p = theme.palette;\n return {\n startOnLoad: false,\n theme: 'base' as const,\n suppressErrorRendering: true,\n themeVariables: {\n background: 'transparent',\n mainBkg: p.background.paper,\n primaryColor: p.background.paper,\n primaryTextColor: p.text.primary,\n primaryBorderColor: p.divider,\n lineColor: p.text.secondary,\n secondaryColor: p.background.default,\n tertiaryColor: p.background.default,\n clusterBkg: p.background.default,\n clusterBorder: p.divider,\n edgeLabelBackground: p.background.default,\n textColor: p.text.primary,\n fontFamily: 'Inter, Roboto, Arial, sans-serif',\n },\n };\n}\n\nlet idCounter = 0;\nconst DEBOUNCE_MS = 600;\n\nconst useStyles = makeStyles(theme => ({\n wrapper: {\n position: 'relative',\n margin: theme.spacing(1.5, 0),\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n minHeight: 80,\n },\n diagram: {\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n color: theme.palette.text.primary,\n cursor: 'zoom-in',\n overflow: 'auto',\n transition: 'filter 0.3s ease, opacity 0.3s ease',\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n '& svg': {\n maxWidth: '100%',\n height: 'auto',\n },\n },\n diagramLoading: {\n filter: 'blur(4px)',\n opacity: 0.4,\n pointerEvents: 'none',\n },\n overlay: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1),\n zIndex: 1,\n // frosted glass\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(30, 30, 30, 0.6)'\n : 'rgba(255, 255, 255, 0.6)',\n backdropFilter: 'blur(8px)',\n borderRadius: theme.shape.borderRadius,\n },\n dialogPaper: {\n backgroundColor: theme.palette.background.default,\n },\n dialogBody: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: theme.spacing(7, 3, 3),\n overflow: 'auto',\n },\n closeButton: {\n position: 'fixed',\n top: theme.spacing(1.5),\n right: theme.spacing(1.5),\n zIndex: 1,\n backgroundColor: theme.palette.background.paper,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n fullscreenDiagram: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '100%',\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n color: theme.palette.text.primary,\n '& svg': {\n width: 'auto',\n height: 'auto',\n maxWidth: 'calc(100vw - 48px)',\n maxHeight: 'calc(100vh - 96px)',\n },\n },\n error: {\n margin: theme.spacing(1.5, 0),\n padding: theme.spacing(1.5),\n overflow: 'auto',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[100],\n color: theme.palette.text.primary,\n fontSize: theme.typography.caption.fontSize,\n },\n}));\n\n/**\n * Streaming-safe Mermaid renderer.\n *\n * Renders the first frame immediately, then debounces subsequent renders to\n * avoid thrashing while the diagram source is still streaming in. Keeps the\n * last good render on screen if an in-progress (incomplete) diagram fails to\n * parse, and only surfaces a parse error once the stream has settled. Clicking\n * the rendered diagram opens a fullscreen dialog.\n */\nexport function MermaidDiagram({ code }: { code: string }) {\n const classes = useStyles();\n const theme = useTheme();\n const [svg, setSvg] = useState<string>('');\n const [rendering, setRendering] = useState(true);\n const [error, setError] = useState<string>('');\n const [showError, setShowError] = useState(false);\n const [open, setOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const errorTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const lastRenderedCode = useRef<string>('');\n\n useEffect(() => {\n // Cleared by the effect cleanup so an in-flight render can't setState after\n // unmount / re-run.\n let active = true;\n const trimmed = code.trim();\n\n // If this is the first render (no svg yet), render immediately\n // Otherwise debounce to avoid rapid re-renders during streaming\n const isFirst = !svg && !error;\n const delay = isFirst ? 0 : DEBOUNCE_MS;\n\n setRendering(true);\n setError('');\n setShowError(false);\n\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n // Re-render when either the code or the theme (light/dark) changes.\n const renderKey = `${theme.palette.type}\\n${trimmed}`;\n timerRef.current = setTimeout(() => {\n // Skip if nothing relevant changed since the last successful render.\n if (renderKey === lastRenderedCode.current) {\n setRendering(false);\n return;\n }\n\n const id = `mermaid-${++idCounter}`;\n\n // Apply the current Backstage theme before rendering.\n mermaid.initialize(mermaidConfig(theme));\n mermaid\n .render(id, trimmed)\n .then(({ svg: rendered }) => {\n if (active) {\n setSvg(rendered);\n setError('');\n lastRenderedCode.current = renderKey;\n setRendering(false);\n }\n })\n .catch((err: Error) => {\n if (active) {\n // During streaming, don't replace a good render with an error\n // from incomplete code — just keep showing the loading state\n if (svg) {\n setRendering(false);\n } else {\n setError(err.message);\n setRendering(false);\n errorTimerRef.current = setTimeout(() => {\n setShowError(true);\n }, 1500);\n }\n }\n });\n }, delay);\n\n return () => {\n active = false;\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [code, theme.palette.type]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n if (error && !svg && showError) {\n return (\n <pre className={classes.error}>\n <code>{code}</code>\n </pre>\n );\n }\n\n const isLoading = rendering && !!svg;\n const isInitialLoading = !svg && (rendering || (error && !showError));\n\n return (\n <>\n <div className={classes.wrapper}>\n {isLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {isInitialLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {svg && (\n <Tooltip title=\"Open diagram fullscreen\">\n <div\n className={`${classes.diagram} ${\n isLoading ? classes.diagramLoading : ''\n }`}\n dangerouslySetInnerHTML={{ __html: svg }}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Open Mermaid diagram fullscreen\"\n onClick={() => !isLoading && setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n </Tooltip>\n )}\n </div>\n\n <Dialog\n fullScreen\n open={open}\n onClose={() => setOpen(false)}\n PaperProps={{ className: classes.dialogPaper }}\n >\n <div className={classes.dialogBody}>\n <Tooltip title=\"Close\">\n <IconButton\n className={classes.closeButton}\n aria-label=\"Close fullscreen diagram\"\n onClick={() => setOpen(false)}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n <div\n className={classes.fullscreenDiagram}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n </div>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAkBA,SAAS,cAAc,KAAA,EAAc;AACnC,EAAA,MAAM,IAAI,KAAA,CAAM,OAAA;AAChB,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,KAAA;AAAA,IACb,KAAA,EAAO,MAAA;AAAA,IACP,sBAAA,EAAwB,IAAA;AAAA,IACxB,cAAA,EAAgB;AAAA,MACd,UAAA,EAAY,aAAA;AAAA,MACZ,OAAA,EAAS,EAAE,UAAA,CAAW,KAAA;AAAA,MACtB,YAAA,EAAc,EAAE,UAAA,CAAW,KAAA;AAAA,MAC3B,gBAAA,EAAkB,EAAE,IAAA,CAAK,OAAA;AAAA,MACzB,oBAAoB,CAAA,CAAE,OAAA;AAAA,MACtB,SAAA,EAAW,EAAE,IAAA,CAAK,SAAA;AAAA,MAClB,cAAA,EAAgB,EAAE,UAAA,CAAW,OAAA;AAAA,MAC7B,aAAA,EAAe,EAAE,UAAA,CAAW,OAAA;AAAA,MAC5B,UAAA,EAAY,EAAE,UAAA,CAAW,OAAA;AAAA,MACzB,eAAe,CAAA,CAAE,OAAA;AAAA,MACjB,mBAAA,EAAqB,EAAE,UAAA,CAAW,OAAA;AAAA,MAClC,SAAA,EAAW,EAAE,IAAA,CAAK,OAAA;AAAA,MAClB,UAAA,EAAY;AAAA;AACd,GACF;AACF;AAEA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAM,WAAA,GAAc,GAAA;AAEpB,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAAA,IAC5B,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,IAC1C,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,eAAA,EAAiB,aAAA;AAAA,IACjB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAA;AAAA,IAC1B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,qCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,MACjB,OAAA,EAAS,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAAA,MAChD,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,MAAA,EAAQ,WAAA;AAAA,IACR,OAAA,EAAS,GAAA;AAAA,IACT,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,CAAA;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,MAAA,EAAQ,CAAA;AAAA;AAAA,IAER,eAAA,EACE,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,SACnB,uBAAA,GACA,0BAAA;AAAA,IACN,cAAA,EAAgB,WAAA;AAAA,IAChB,YAAA,EAAc,MAAM,KAAA,CAAM;AAAA,GAC5B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,GAC5C;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IAC9B,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,OAAA;AAAA,IACV,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IACtB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IACxB,MAAA,EAAQ,CAAA;AAAA,IACR,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,KAAA;AAAA,IAC1C,SAAA,EAAW;AAAA,MACT,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO;AAAA;AACxC,GACF;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,QAAA,EAAU,MAAA;AAAA,IACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,eAAA,EAAiB,aAAA;AAAA,IACjB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAA;AAAA,IAC1B,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,oBAAA;AAAA,MACV,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAAA,IAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC1B,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,IAC1C,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,eAAA,EACE,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,MAAA,GACnB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GACtB,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAC5B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAA;AAAA,IAC1B,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ;AAAA;AAEvC,CAAA,CAAE,CAAA;AAWK,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAAqB;AACzD,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAiB,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAiB,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,WAAW,MAAA,EAAsC;AACvD,EAAA,MAAM,gBAAgB,MAAA,EAAsC;AAC5D,EAAA,MAAM,gBAAA,GAAmB,OAAe,EAAE,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AAGd,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAI1B,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,IAAO,CAAC,KAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAA,GAAI,WAAA;AAE5B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,YAAA,CAAa,KAAK,CAAA;AAElB,IAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,IAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAElC,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,IAAI;AAAA,EAAK,OAAO,CAAA,CAAA;AACnD,IAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAElC,MAAA,IAAI,SAAA,KAAc,iBAAiB,OAAA,EAAS;AAC1C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAA,GAAK,CAAA,QAAA,EAAW,EAAE,SAAS,CAAA,CAAA;AAGjC,MAAA,OAAA,CAAQ,UAAA,CAAW,aAAA,CAAc,KAAK,CAAC,CAAA;AACvC,MAAA,OAAA,CACG,MAAA,CAAO,IAAI,OAAO,CAAA,CAClB,KAAK,CAAC,EAAE,GAAA,EAAK,QAAA,EAAS,KAAM;AAC3B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,QAAQ,CAAA;AACf,UAAA,QAAA,CAAS,EAAE,CAAA;AACX,UAAA,gBAAA,CAAiB,OAAA,GAAU,SAAA;AAC3B,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,QAAA,IAAI,MAAA,EAAQ;AAGV,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,YAAA,CAAa,KAAK,CAAA;AAAA,UACpB,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,aAAA,CAAc,OAAA,GAAU,WAAW,MAAM;AACvC,cAAA,YAAA,CAAa,IAAI,CAAA;AAAA,YACnB,GAAG,IAAI,CAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACL,GAAG,KAAK,CAAA;AAER,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAAA,IACpC,CAAA;AAAA,EAEF,GAAG,CAAC,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAE7B,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyC;AAC9D,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,KAAA,IAAS,CAAC,GAAA,IAAO,SAAA,EAAW;AAC9B,IAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAW,OAAA,CAAQ,OACtB,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAM,gBAAK,CAAA,EACd,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAAY,SAAA,IAAa,CAAC,CAAC,GAAA;AACjC,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAQ,SAAA,IAAc,SAAS,CAAC,SAAA,CAAA;AAE1D,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EACrB,QAAA,EAAA;AAAA,MAAA,SAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAM,EAAA,EAAI,CAAA;AAAA,4BAC3B,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,iBAAgB,QAAA,EAAA,yBAAA,EAEpD;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,gBAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,OAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAM,EAAA,EAAI,CAAA;AAAA,4BAC3B,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,iBAAgB,QAAA,EAAA,yBAAA,EAEpD;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,GAAA,oBACC,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,yBAAA,EACb,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,GAAG,OAAA,CAAQ,OAAO,IAC3B,SAAA,GAAY,OAAA,CAAQ,iBAAiB,EACvC,CAAA,CAAA;AAAA,UACA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,GAAA,EAAI;AAAA,UACvC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,YAAA,EAAW,iCAAA;AAAA,UACX,OAAA,EAAS,MAAM,CAAC,SAAA,IAAa,QAAQ,IAAI,CAAA;AAAA,UACzC,SAAA,EAAW;AAAA;AAAA,OACb,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAU,IAAA;AAAA,QACV,IAAA;AAAA,QACA,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC5B,UAAA,EAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,WAAA,EAAY;AAAA,QAE7C,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,UAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAM,OAAA,EACb,QAAA,kBAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,WAAW,OAAA,CAAQ,WAAA;AAAA,cACnB,YAAA,EAAW,0BAAA;AAAA,cACX,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,cAE5B,8BAAC,SAAA,EAAA,EAAU;AAAA;AAAA,WACb,EACF,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAW,OAAA,CAAQ,iBAAA;AAAA,cACnB,uBAAA,EAAyB,EAAE,MAAA,EAAQ,GAAA;AAAI;AAAA;AACzC,SAAA,EACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drewswiredin/backstage-plugin-assistants",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Frontend plugin — AI Assistants for Backstage.",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {
@@ -66,7 +66,7 @@
66
66
  "@backstage/core-plugin-api": "^1.12.0",
67
67
  "@backstage/frontend-plugin-api": "^0.17.0",
68
68
  "@backstage/ui": "^0.15.0",
69
- "@drewswiredin/backstage-plugin-assistants-common": "0.4.0",
69
+ "@drewswiredin/backstage-plugin-assistants-common": "0.5.1",
70
70
  "@material-ui/core": "^4.12.4",
71
71
  "@material-ui/icons": "^4.11.3",
72
72
  "@remixicon/react": "^4.5.0",