@anyshift/backstage-plugin-anyshift 0.1.0-beta.19 → 0.1.0-beta.20
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/dist/components/ask/AskAnyshiftCard.esm.js +10 -4
- package/dist/components/ask/AskAnyshiftCard.esm.js.map +1 -1
- package/dist/components/entity/AnyshiftEntityContent.esm.js +12 -3
- package/dist/components/entity/AnyshiftEntityContent.esm.js.map +1 -1
- package/dist/package.json.esm.js +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,11 @@ import { presentAskResult, AskResultPresenter } from './askPresenters.esm.js';
|
|
|
9
9
|
const MAX_QUESTION_CODE_POINTS = 500;
|
|
10
10
|
const MAX_SCOPE_TARGET_CODE_POINTS = 200;
|
|
11
11
|
const IDLE_HELPER_TEXT = "Read-only answers from your connected graph. Do not include secrets.";
|
|
12
|
-
const AskAnyshiftCard = ({
|
|
12
|
+
const AskAnyshiftCard = ({
|
|
13
|
+
context,
|
|
14
|
+
scope,
|
|
15
|
+
scopeLabel
|
|
16
|
+
}) => {
|
|
13
17
|
const api = useApi(anyshiftApiRef);
|
|
14
18
|
const validPropScope = context === "entity" && isValidScope(scope) ? scope : void 0;
|
|
15
19
|
const propScopeIdentity = context === "entity" && scope?.entityRef.trim() ? scope.entityRef : void 0;
|
|
@@ -23,6 +27,8 @@ const AskAnyshiftCard = ({ context, scope }) => {
|
|
|
23
27
|
const [scopeRemoved, setScopeRemoved] = useState(false);
|
|
24
28
|
const localScope = scopeRemoved ? void 0 : validPropScope;
|
|
25
29
|
const restorableScope = validPropScope;
|
|
30
|
+
const visibleScopeLabel = scopeLabel?.trim() || localScope?.target;
|
|
31
|
+
const restorableScopeLabel = scopeLabel?.trim() || restorableScope?.target;
|
|
26
32
|
const requestContext = requestContextKey(
|
|
27
33
|
context,
|
|
28
34
|
propScopeIdentity,
|
|
@@ -117,7 +123,7 @@ const AskAnyshiftCard = ({ context, scope }) => {
|
|
|
117
123
|
size: "small",
|
|
118
124
|
color: "primary",
|
|
119
125
|
variant: "outlined",
|
|
120
|
-
label: `Scope \xB7 ${
|
|
126
|
+
label: `Scope \xB7 ${visibleScopeLabel}`
|
|
121
127
|
}
|
|
122
128
|
),
|
|
123
129
|
/* @__PURE__ */ jsx(
|
|
@@ -127,7 +133,7 @@ const AskAnyshiftCard = ({ context, scope }) => {
|
|
|
127
133
|
size: "small",
|
|
128
134
|
disabled: loading,
|
|
129
135
|
onClick: () => setScopeRemoved(true),
|
|
130
|
-
"aria-label": `Remove ${
|
|
136
|
+
"aria-label": `Remove ${visibleScopeLabel} scope`,
|
|
131
137
|
children: "Remove"
|
|
132
138
|
}
|
|
133
139
|
)
|
|
@@ -140,7 +146,7 @@ const AskAnyshiftCard = ({ context, scope }) => {
|
|
|
140
146
|
size: "small",
|
|
141
147
|
disabled: loading,
|
|
142
148
|
onClick: () => setScopeRemoved(false),
|
|
143
|
-
"aria-label": `Restore ${
|
|
149
|
+
"aria-label": `Restore ${restorableScopeLabel} scope`,
|
|
144
150
|
children: "Restore scope"
|
|
145
151
|
}
|
|
146
152
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AskAnyshiftCard.esm.js","sources":["../../../src/components/ask/AskAnyshiftCard.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n CircularProgress,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport {\n FormEvent,\n KeyboardEvent,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { anyshiftApiRef, AnyshiftRequestError } from '../../api/AnyshiftApi';\nimport type { AskAnyshiftResponse, AskScope } from '../../api/types';\nimport {\n estateSuggestions,\n followUpsForIntent,\n scopedSuggestions,\n} from './askSuggestions';\nimport { AskResultPresenter, presentAskResult } from './askPresenters';\n\nconst MAX_QUESTION_CODE_POINTS = 500;\nconst MAX_SCOPE_TARGET_CODE_POINTS = 200;\nconst IDLE_HELPER_TEXT =\n 'Read-only answers from your connected graph. Do not include secrets.';\n\ntype AskCardState =\n | { status: 'idle' }\n | { status: 'loading'; previous?: AskAnyshiftResponse }\n | { status: 'success'; answer: AskAnyshiftResponse }\n | {\n status: 'error';\n error: AnyshiftRequestError;\n previous?: AskAnyshiftResponse;\n };\n\nexport interface AskAnyshiftCardProps {\n context: 'estate' | 'entity';\n scope?: AskScope;\n}\n\nexport const AskAnyshiftCard = ({ context, scope }: AskAnyshiftCardProps) => {\n const api = useApi(anyshiftApiRef);\n const validPropScope =\n context === 'entity' && isValidScope(scope) ? scope : undefined;\n const propScopeIdentity =\n context === 'entity' && scope?.entityRef.trim()\n ? scope.entityRef\n : undefined;\n const mountedIdentity =\n context === 'estate' ? 'estate' : `entity:${propScopeIdentity ?? ''}`;\n const previousMountedIdentity = useRef(mountedIdentity);\n const requestGeneration = useRef(0);\n const activeRequest = useRef<{\n generation: number;\n requestContext: string;\n }>();\n const [question, setQuestion] = useState('');\n const [validationError, setValidationError] = useState<string>();\n const [state, setState] = useState<AskCardState>({ status: 'idle' });\n const [scopeRemoved, setScopeRemoved] = useState(false);\n const localScope = scopeRemoved ? undefined : validPropScope;\n const restorableScope = validPropScope;\n const requestContext = requestContextKey(\n context,\n propScopeIdentity,\n localScope,\n );\n const previousRequestContext = useRef(requestContext);\n\n useLayoutEffect(() => {\n if (previousMountedIdentity.current === mountedIdentity) return;\n previousMountedIdentity.current = mountedIdentity;\n requestGeneration.current += 1;\n activeRequest.current = undefined;\n setState({ status: 'idle' });\n setValidationError(undefined);\n setScopeRemoved(false);\n }, [mountedIdentity]);\n\n useLayoutEffect(() => {\n if (previousRequestContext.current === requestContext) return;\n previousRequestContext.current = requestContext;\n requestGeneration.current += 1;\n if (!activeRequest.current) return;\n activeRequest.current = undefined;\n setState(current =>\n current.status === 'loading' ? { status: 'idle' } : current,\n );\n setValidationError(undefined);\n }, [requestContext]);\n\n const loading = state.status === 'loading';\n const examples = localScope ? scopedSuggestions : estateSuggestions;\n const visibleAnswer = answerForState(state);\n const previousAnswer =\n state.status === 'loading' || state.status === 'error'\n ? state.previous\n : undefined;\n\n const submitQuestion = async (explicitQuestion = question) => {\n if (activeRequest.current?.requestContext === requestContext) return;\n const clientError = validateQuestion(explicitQuestion);\n if (clientError) {\n setValidationError(clientError);\n return;\n }\n\n setValidationError(undefined);\n const generation = requestGeneration.current + 1;\n requestGeneration.current = generation;\n activeRequest.current = { generation, requestContext };\n const previous = visibleAnswer;\n setState({ status: 'loading', previous });\n try {\n const request = localScope\n ? { question: explicitQuestion, scope: localScope }\n : { question: explicitQuestion };\n const answer = await api.ask(request);\n if (\n ownsActiveRequest(activeRequest.current, generation, requestContext)\n ) {\n setState({ status: 'success', answer });\n }\n } catch (error) {\n if (\n ownsActiveRequest(activeRequest.current, generation, requestContext)\n ) {\n setState({\n status: 'error',\n error: safeRequestError(error),\n previous,\n });\n }\n } finally {\n if (\n ownsActiveRequest(activeRequest.current, generation, requestContext)\n ) {\n activeRequest.current = undefined;\n }\n }\n };\n\n const submitExplicitQuestion = (nextQuestion: string) => {\n if (activeRequest.current?.requestContext === requestContext) return;\n setQuestion(nextQuestion);\n void submitQuestion(nextQuestion);\n };\n\n const onSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void submitQuestion();\n };\n\n const onQuestionKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Enter' || (!event.metaKey && !event.ctrlKey)) return;\n event.preventDefault();\n void submitQuestion();\n };\n\n return (\n <Card variant=\"outlined\">\n <CardContent>\n <Typography component=\"h2\" variant=\"h6\" gutterBottom>\n Ask Anyshift\n </Typography>\n\n {context === 'entity' && (\n <Box\n mb={2}\n display=\"flex\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gridGap={8}\n >\n {localScope ? (\n <>\n <Chip\n size=\"small\"\n color=\"primary\"\n variant=\"outlined\"\n label={`Scope · ${localScope.target}`}\n />\n <Button\n type=\"button\"\n size=\"small\"\n disabled={loading}\n onClick={() => setScopeRemoved(true)}\n aria-label={`Remove ${localScope.target} scope`}\n >\n Remove\n </Button>\n </>\n ) : (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Searching the whole connected project\n </Typography>\n {restorableScope && (\n <Button\n type=\"button\"\n size=\"small\"\n disabled={loading}\n onClick={() => setScopeRemoved(false)}\n aria-label={`Restore ${restorableScope.target} scope`}\n >\n Restore scope\n </Button>\n )}\n </>\n )}\n </Box>\n )}\n\n <form onSubmit={onSubmit} noValidate>\n <TextField\n id=\"ask-anyshift-question\"\n label=\"Question\"\n value={question}\n onChange={event => {\n setQuestion(event.target.value);\n if (validationError) setValidationError(undefined);\n }}\n onKeyDown={onQuestionKeyDown}\n disabled={loading}\n error={Boolean(validationError)}\n helperText={validationError ?? IDLE_HELPER_TEXT}\n multiline\n minRows={2}\n fullWidth\n variant=\"outlined\"\n />\n <Box mt={1} display=\"flex\" justifyContent=\"flex-end\">\n <Button\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n disabled={loading}\n startIcon={loading ? <CircularProgress size={16} /> : undefined}\n >\n {loading ? 'Asking…' : 'Ask'}\n </Button>\n </Box>\n </form>\n\n <QuestionChoices\n title=\"Try an example\"\n questions={examples}\n disabled={loading}\n onQuestion={submitExplicitQuestion}\n />\n\n {state.status === 'error' && (\n <Box mt={2} role=\"alert\" aria-live=\"polite\">\n <Typography color=\"error\">{errorCopy(state.error)}</Typography>\n {isRetryable(state.error) && (\n <Box mt={1}>\n <Button\n type=\"button\"\n size=\"small\"\n variant=\"outlined\"\n onClick={() => void submitQuestion()}\n >\n Retry\n </Button>\n </Box>\n )}\n </Box>\n )}\n\n {loading && (\n <Typography role=\"status\" variant=\"body2\" color=\"textSecondary\">\n Searching the connected graph…\n </Typography>\n )}\n\n {visibleAnswer && (\n <Box mt={3}>\n {previousAnswer && (\n <Typography component=\"h3\" variant=\"subtitle2\" gutterBottom>\n Previous answer\n </Typography>\n )}\n <SafeAnswer\n answer={visibleAnswer}\n onQuestion={loading ? undefined : submitExplicitQuestion}\n />\n {!loading && (\n <QuestionChoices\n title=\"Ask another question\"\n questions={followUpsForIntent(\n visibleAnswer.result.intent,\n Boolean(localScope),\n )}\n disabled={false}\n onQuestion={submitExplicitQuestion}\n />\n )}\n </Box>\n )}\n </CardContent>\n </Card>\n );\n};\n\nconst QuestionChoices = ({\n title,\n questions,\n disabled,\n onQuestion,\n}: {\n title: string;\n questions: readonly string[];\n disabled: boolean;\n onQuestion: (question: string) => void;\n}) => (\n <Box mt={2}>\n <Typography variant=\"subtitle2\" gutterBottom>\n {title}\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={8}>\n {questions.map(suggestion => (\n <Button\n key={suggestion}\n type=\"button\"\n size=\"small\"\n variant=\"outlined\"\n disabled={disabled}\n onClick={() => onQuestion(suggestion)}\n >\n {suggestion}\n </Button>\n ))}\n </Box>\n </Box>\n);\n\nconst SafeAnswer = ({\n answer,\n onQuestion,\n}: {\n answer: AskAnyshiftResponse;\n onQuestion?: (question: string) => void;\n}) => {\n try {\n presentAskResult(answer.result);\n } catch {\n return (\n <Box aria-label=\"Anyshift answer\">\n <Typography variant=\"body1\">{answer.result.summary}</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Detailed evidence is not supported by this Backstage version.\n </Typography>\n </Box>\n );\n }\n\n return (\n <AskResultPresenter\n result={answer.result}\n effectiveQuestion={answer.effectiveQuestion}\n answeredAt={answer.answeredAt}\n onQuestion={onQuestion}\n />\n );\n};\n\nfunction answerForState(state: AskCardState): AskAnyshiftResponse | undefined {\n switch (state.status) {\n case 'success':\n return state.answer;\n case 'loading':\n case 'error':\n return state.previous;\n case 'idle':\n return undefined;\n default:\n return assertNever(state);\n }\n}\n\nfunction ownsActiveRequest(\n activeRequest: { generation: number; requestContext: string } | undefined,\n generation: number,\n requestContext: string,\n): boolean {\n return (\n activeRequest?.generation === generation &&\n activeRequest.requestContext === requestContext\n );\n}\n\nfunction requestContextKey(\n context: 'estate' | 'entity',\n entityRef: string | undefined,\n scope: AskScope | undefined,\n): string {\n if (context === 'estate') return 'estate';\n const identity = entityRef?.trim() ?? '';\n return scope\n ? `entity:${identity}:target:${scope.target.trim()}`\n : `entity:${identity}:unscoped`;\n}\n\nfunction validateQuestion(value: string): string | undefined {\n if (!value.trim()) return 'Enter a question.';\n if (Array.from(value).length > MAX_QUESTION_CODE_POINTS) {\n return 'Questions must be 500 characters or fewer.';\n }\n return undefined;\n}\n\nfunction isValidScope(scope: AskScope | undefined): scope is AskScope {\n if (!scope?.entityRef.trim() || !scope.target.trim()) return false;\n if (Array.from(scope.target).length > MAX_SCOPE_TARGET_CODE_POINTS) {\n return false;\n }\n return !Array.from(scope.target).some(character => {\n const codePoint = character.codePointAt(0);\n return (\n codePoint !== undefined &&\n (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))\n );\n });\n}\n\nfunction safeRequestError(error: unknown): AnyshiftRequestError {\n return error instanceof AnyshiftRequestError\n ? error\n : new AnyshiftRequestError(0, 'unavailable', 'Unavailable');\n}\n\nfunction errorCopy(error: AnyshiftRequestError): string {\n if (error.status === 400 || error.code === 'bad_request') {\n return 'Ask Anyshift could not answer that question. Try rephrasing it or choose an example.';\n }\n if (error.status === 403 || error.code === 'forbidden') {\n return 'Ask Anyshift access is unavailable for your account.';\n }\n if (error.status === 413 || error.code === 'payload_too_large') {\n return 'Questions must be 500 characters or fewer.';\n }\n if (error.status === 429 || error.code === 'rate_limited') {\n return typeof error.retryAfterSeconds === 'number'\n ? `Ask Anyshift is temporarily rate limited. Try again in ${error.retryAfterSeconds} seconds.`\n : 'Ask Anyshift is temporarily rate limited. Try again shortly.';\n }\n if (error.status === 504 || error.code === 'timeout') {\n return 'The graph question timed out. Try again.';\n }\n if (\n error.status === 0 ||\n error.status === 502 ||\n error.status === 503 ||\n error.code === 'unavailable' ||\n error.code === 'upstream_unavailable' ||\n error.code === 'request_failed'\n ) {\n return 'Ask Anyshift is temporarily unavailable. Try again.';\n }\n return 'Ask Anyshift could not complete the question. Try again.';\n}\n\nfunction isRetryable(error: AnyshiftRequestError): boolean {\n return (\n error.status === 0 ||\n error.status === 429 ||\n error.status === 502 ||\n error.status === 503 ||\n error.status === 504 ||\n error.code === 'timeout' ||\n error.code === 'unavailable' ||\n error.code === 'upstream_unavailable' ||\n error.code === 'request_failed'\n );\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unsupported Ask card state: ${String(value)}`);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AskAnyshiftCard.esm.js","sources":["../../../src/components/ask/AskAnyshiftCard.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n CircularProgress,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport {\n FormEvent,\n KeyboardEvent,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { anyshiftApiRef, AnyshiftRequestError } from '../../api/AnyshiftApi';\nimport type { AskAnyshiftResponse, AskScope } from '../../api/types';\nimport {\n estateSuggestions,\n followUpsForIntent,\n scopedSuggestions,\n} from './askSuggestions';\nimport { AskResultPresenter, presentAskResult } from './askPresenters';\n\nconst MAX_QUESTION_CODE_POINTS = 500;\nconst MAX_SCOPE_TARGET_CODE_POINTS = 200;\nconst IDLE_HELPER_TEXT =\n 'Read-only answers from your connected graph. Do not include secrets.';\n\ntype AskCardState =\n | { status: 'idle' }\n | { status: 'loading'; previous?: AskAnyshiftResponse }\n | { status: 'success'; answer: AskAnyshiftResponse }\n | {\n status: 'error';\n error: AnyshiftRequestError;\n previous?: AskAnyshiftResponse;\n };\n\nexport interface AskAnyshiftCardProps {\n context: 'estate' | 'entity';\n scope?: AskScope;\n scopeLabel?: string;\n}\n\nexport const AskAnyshiftCard = ({\n context,\n scope,\n scopeLabel,\n}: AskAnyshiftCardProps) => {\n const api = useApi(anyshiftApiRef);\n const validPropScope =\n context === 'entity' && isValidScope(scope) ? scope : undefined;\n const propScopeIdentity =\n context === 'entity' && scope?.entityRef.trim()\n ? scope.entityRef\n : undefined;\n const mountedIdentity =\n context === 'estate' ? 'estate' : `entity:${propScopeIdentity ?? ''}`;\n const previousMountedIdentity = useRef(mountedIdentity);\n const requestGeneration = useRef(0);\n const activeRequest = useRef<{\n generation: number;\n requestContext: string;\n }>();\n const [question, setQuestion] = useState('');\n const [validationError, setValidationError] = useState<string>();\n const [state, setState] = useState<AskCardState>({ status: 'idle' });\n const [scopeRemoved, setScopeRemoved] = useState(false);\n const localScope = scopeRemoved ? undefined : validPropScope;\n const restorableScope = validPropScope;\n const visibleScopeLabel = scopeLabel?.trim() || localScope?.target;\n const restorableScopeLabel = scopeLabel?.trim() || restorableScope?.target;\n const requestContext = requestContextKey(\n context,\n propScopeIdentity,\n localScope,\n );\n const previousRequestContext = useRef(requestContext);\n\n useLayoutEffect(() => {\n if (previousMountedIdentity.current === mountedIdentity) return;\n previousMountedIdentity.current = mountedIdentity;\n requestGeneration.current += 1;\n activeRequest.current = undefined;\n setState({ status: 'idle' });\n setValidationError(undefined);\n setScopeRemoved(false);\n }, [mountedIdentity]);\n\n useLayoutEffect(() => {\n if (previousRequestContext.current === requestContext) return;\n previousRequestContext.current = requestContext;\n requestGeneration.current += 1;\n if (!activeRequest.current) return;\n activeRequest.current = undefined;\n setState(current =>\n current.status === 'loading' ? { status: 'idle' } : current,\n );\n setValidationError(undefined);\n }, [requestContext]);\n\n const loading = state.status === 'loading';\n const examples = localScope ? scopedSuggestions : estateSuggestions;\n const visibleAnswer = answerForState(state);\n const previousAnswer =\n state.status === 'loading' || state.status === 'error'\n ? state.previous\n : undefined;\n\n const submitQuestion = async (explicitQuestion = question) => {\n if (activeRequest.current?.requestContext === requestContext) return;\n const clientError = validateQuestion(explicitQuestion);\n if (clientError) {\n setValidationError(clientError);\n return;\n }\n\n setValidationError(undefined);\n const generation = requestGeneration.current + 1;\n requestGeneration.current = generation;\n activeRequest.current = { generation, requestContext };\n const previous = visibleAnswer;\n setState({ status: 'loading', previous });\n try {\n const request = localScope\n ? { question: explicitQuestion, scope: localScope }\n : { question: explicitQuestion };\n const answer = await api.ask(request);\n if (\n ownsActiveRequest(activeRequest.current, generation, requestContext)\n ) {\n setState({ status: 'success', answer });\n }\n } catch (error) {\n if (\n ownsActiveRequest(activeRequest.current, generation, requestContext)\n ) {\n setState({\n status: 'error',\n error: safeRequestError(error),\n previous,\n });\n }\n } finally {\n if (\n ownsActiveRequest(activeRequest.current, generation, requestContext)\n ) {\n activeRequest.current = undefined;\n }\n }\n };\n\n const submitExplicitQuestion = (nextQuestion: string) => {\n if (activeRequest.current?.requestContext === requestContext) return;\n setQuestion(nextQuestion);\n void submitQuestion(nextQuestion);\n };\n\n const onSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void submitQuestion();\n };\n\n const onQuestionKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Enter' || (!event.metaKey && !event.ctrlKey)) return;\n event.preventDefault();\n void submitQuestion();\n };\n\n return (\n <Card variant=\"outlined\">\n <CardContent>\n <Typography component=\"h2\" variant=\"h6\" gutterBottom>\n Ask Anyshift\n </Typography>\n\n {context === 'entity' && (\n <Box\n mb={2}\n display=\"flex\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gridGap={8}\n >\n {localScope ? (\n <>\n <Chip\n size=\"small\"\n color=\"primary\"\n variant=\"outlined\"\n label={`Scope · ${visibleScopeLabel}`}\n />\n <Button\n type=\"button\"\n size=\"small\"\n disabled={loading}\n onClick={() => setScopeRemoved(true)}\n aria-label={`Remove ${visibleScopeLabel} scope`}\n >\n Remove\n </Button>\n </>\n ) : (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Searching the whole connected project\n </Typography>\n {restorableScope && (\n <Button\n type=\"button\"\n size=\"small\"\n disabled={loading}\n onClick={() => setScopeRemoved(false)}\n aria-label={`Restore ${restorableScopeLabel} scope`}\n >\n Restore scope\n </Button>\n )}\n </>\n )}\n </Box>\n )}\n\n <form onSubmit={onSubmit} noValidate>\n <TextField\n id=\"ask-anyshift-question\"\n label=\"Question\"\n value={question}\n onChange={event => {\n setQuestion(event.target.value);\n if (validationError) setValidationError(undefined);\n }}\n onKeyDown={onQuestionKeyDown}\n disabled={loading}\n error={Boolean(validationError)}\n helperText={validationError ?? IDLE_HELPER_TEXT}\n multiline\n minRows={2}\n fullWidth\n variant=\"outlined\"\n />\n <Box mt={1} display=\"flex\" justifyContent=\"flex-end\">\n <Button\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n disabled={loading}\n startIcon={loading ? <CircularProgress size={16} /> : undefined}\n >\n {loading ? 'Asking…' : 'Ask'}\n </Button>\n </Box>\n </form>\n\n <QuestionChoices\n title=\"Try an example\"\n questions={examples}\n disabled={loading}\n onQuestion={submitExplicitQuestion}\n />\n\n {state.status === 'error' && (\n <Box mt={2} role=\"alert\" aria-live=\"polite\">\n <Typography color=\"error\">{errorCopy(state.error)}</Typography>\n {isRetryable(state.error) && (\n <Box mt={1}>\n <Button\n type=\"button\"\n size=\"small\"\n variant=\"outlined\"\n onClick={() => void submitQuestion()}\n >\n Retry\n </Button>\n </Box>\n )}\n </Box>\n )}\n\n {loading && (\n <Typography role=\"status\" variant=\"body2\" color=\"textSecondary\">\n Searching the connected graph…\n </Typography>\n )}\n\n {visibleAnswer && (\n <Box mt={3}>\n {previousAnswer && (\n <Typography component=\"h3\" variant=\"subtitle2\" gutterBottom>\n Previous answer\n </Typography>\n )}\n <SafeAnswer\n answer={visibleAnswer}\n onQuestion={loading ? undefined : submitExplicitQuestion}\n />\n {!loading && (\n <QuestionChoices\n title=\"Ask another question\"\n questions={followUpsForIntent(\n visibleAnswer.result.intent,\n Boolean(localScope),\n )}\n disabled={false}\n onQuestion={submitExplicitQuestion}\n />\n )}\n </Box>\n )}\n </CardContent>\n </Card>\n );\n};\n\nconst QuestionChoices = ({\n title,\n questions,\n disabled,\n onQuestion,\n}: {\n title: string;\n questions: readonly string[];\n disabled: boolean;\n onQuestion: (question: string) => void;\n}) => (\n <Box mt={2}>\n <Typography variant=\"subtitle2\" gutterBottom>\n {title}\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={8}>\n {questions.map(suggestion => (\n <Button\n key={suggestion}\n type=\"button\"\n size=\"small\"\n variant=\"outlined\"\n disabled={disabled}\n onClick={() => onQuestion(suggestion)}\n >\n {suggestion}\n </Button>\n ))}\n </Box>\n </Box>\n);\n\nconst SafeAnswer = ({\n answer,\n onQuestion,\n}: {\n answer: AskAnyshiftResponse;\n onQuestion?: (question: string) => void;\n}) => {\n try {\n presentAskResult(answer.result);\n } catch {\n return (\n <Box aria-label=\"Anyshift answer\">\n <Typography variant=\"body1\">{answer.result.summary}</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Detailed evidence is not supported by this Backstage version.\n </Typography>\n </Box>\n );\n }\n\n return (\n <AskResultPresenter\n result={answer.result}\n effectiveQuestion={answer.effectiveQuestion}\n answeredAt={answer.answeredAt}\n onQuestion={onQuestion}\n />\n );\n};\n\nfunction answerForState(state: AskCardState): AskAnyshiftResponse | undefined {\n switch (state.status) {\n case 'success':\n return state.answer;\n case 'loading':\n case 'error':\n return state.previous;\n case 'idle':\n return undefined;\n default:\n return assertNever(state);\n }\n}\n\nfunction ownsActiveRequest(\n activeRequest: { generation: number; requestContext: string } | undefined,\n generation: number,\n requestContext: string,\n): boolean {\n return (\n activeRequest?.generation === generation &&\n activeRequest.requestContext === requestContext\n );\n}\n\nfunction requestContextKey(\n context: 'estate' | 'entity',\n entityRef: string | undefined,\n scope: AskScope | undefined,\n): string {\n if (context === 'estate') return 'estate';\n const identity = entityRef?.trim() ?? '';\n return scope\n ? `entity:${identity}:target:${scope.target.trim()}`\n : `entity:${identity}:unscoped`;\n}\n\nfunction validateQuestion(value: string): string | undefined {\n if (!value.trim()) return 'Enter a question.';\n if (Array.from(value).length > MAX_QUESTION_CODE_POINTS) {\n return 'Questions must be 500 characters or fewer.';\n }\n return undefined;\n}\n\nfunction isValidScope(scope: AskScope | undefined): scope is AskScope {\n if (!scope?.entityRef.trim() || !scope.target.trim()) return false;\n if (Array.from(scope.target).length > MAX_SCOPE_TARGET_CODE_POINTS) {\n return false;\n }\n return !Array.from(scope.target).some(character => {\n const codePoint = character.codePointAt(0);\n return (\n codePoint !== undefined &&\n (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))\n );\n });\n}\n\nfunction safeRequestError(error: unknown): AnyshiftRequestError {\n return error instanceof AnyshiftRequestError\n ? error\n : new AnyshiftRequestError(0, 'unavailable', 'Unavailable');\n}\n\nfunction errorCopy(error: AnyshiftRequestError): string {\n if (error.status === 400 || error.code === 'bad_request') {\n return 'Ask Anyshift could not answer that question. Try rephrasing it or choose an example.';\n }\n if (error.status === 403 || error.code === 'forbidden') {\n return 'Ask Anyshift access is unavailable for your account.';\n }\n if (error.status === 413 || error.code === 'payload_too_large') {\n return 'Questions must be 500 characters or fewer.';\n }\n if (error.status === 429 || error.code === 'rate_limited') {\n return typeof error.retryAfterSeconds === 'number'\n ? `Ask Anyshift is temporarily rate limited. Try again in ${error.retryAfterSeconds} seconds.`\n : 'Ask Anyshift is temporarily rate limited. Try again shortly.';\n }\n if (error.status === 504 || error.code === 'timeout') {\n return 'The graph question timed out. Try again.';\n }\n if (\n error.status === 0 ||\n error.status === 502 ||\n error.status === 503 ||\n error.code === 'unavailable' ||\n error.code === 'upstream_unavailable' ||\n error.code === 'request_failed'\n ) {\n return 'Ask Anyshift is temporarily unavailable. Try again.';\n }\n return 'Ask Anyshift could not complete the question. Try again.';\n}\n\nfunction isRetryable(error: AnyshiftRequestError): boolean {\n return (\n error.status === 0 ||\n error.status === 429 ||\n error.status === 502 ||\n error.status === 503 ||\n error.status === 504 ||\n error.code === 'timeout' ||\n error.code === 'unavailable' ||\n error.code === 'upstream_unavailable' ||\n error.code === 'request_failed'\n );\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unsupported Ask card state: ${String(value)}`);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -178,7 +178,8 @@ const ServiceAnyshiftEntityContent = () => {
|
|
|
178
178
|
refreshingAll,
|
|
179
179
|
refreshError: error,
|
|
180
180
|
askEnabled: capabilities.askEnabled,
|
|
181
|
-
askScope: askScopeForEntity(entity)
|
|
181
|
+
askScope: askScopeForEntity(entity),
|
|
182
|
+
askScopeLabel: target
|
|
182
183
|
}
|
|
183
184
|
);
|
|
184
185
|
};
|
|
@@ -191,7 +192,8 @@ const ServiceBriefView = ({
|
|
|
191
192
|
refreshingAll = false,
|
|
192
193
|
refreshError,
|
|
193
194
|
askEnabled = false,
|
|
194
|
-
askScope
|
|
195
|
+
askScope,
|
|
196
|
+
askScopeLabel
|
|
195
197
|
}) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
196
198
|
/* @__PURE__ */ jsxs(
|
|
197
199
|
Box,
|
|
@@ -264,7 +266,14 @@ const ServiceBriefView = ({
|
|
|
264
266
|
refreshing: refreshing.has("whyNow")
|
|
265
267
|
}
|
|
266
268
|
) }),
|
|
267
|
-
askEnabled && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
269
|
+
askEnabled && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
270
|
+
AskAnyshiftCard,
|
|
271
|
+
{
|
|
272
|
+
context: "entity",
|
|
273
|
+
scope: askScope,
|
|
274
|
+
scopeLabel: askScopeLabel
|
|
275
|
+
}
|
|
276
|
+
) }),
|
|
268
277
|
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
269
278
|
DatadogSignalSection,
|
|
270
279
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnyshiftEntityContent.esm.js","sources":["../../../src/components/entity/AnyshiftEntityContent.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Chip,\n CircularProgress,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { useApi, useApiHolder } from '@backstage/frontend-plugin-api';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION,\n ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION,\n ANYSHIFT_KIND_ANNOTATION,\n ANYSHIFT_RESOURCE_ID_ANNOTATION,\n ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { catalogApiRef, useEntity } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n AnyshiftCapabilities,\n AskScope,\n BriefSectionName,\n ServiceBrief,\n} from '../../api/types';\nimport { AskAnyshiftCard } from '../ask/AskAnyshiftCard';\nimport { askScopeForEntity } from '../ask/askScope';\nimport { CloudAnyshiftEntityContent } from '../cloud/CloudResourceContent';\nimport { entityTarget, isCloudResourceEntity } from './entityIdentity';\nimport { resolveRelatedCatalogEntities } from './relatedCatalogEntities';\nimport {\n ArchitectureSection,\n BriefRail,\n DatadogSignalSection,\n DependencySection,\n OverviewSection,\n TimelineSection,\n WhyNowSection,\n} from './BriefSections';\n\nexport const AnyshiftEntityContent = () => {\n const { entity } = useEntity();\n return isCloudResourceEntity(entity) ? (\n <CloudAnyshiftEntityContent />\n ) : (\n <ServiceAnyshiftEntityContent />\n );\n};\n\nexport const ServiceAnyshiftEntityContent = () => {\n const { entity } = useEntity();\n const api = useApi(anyshiftApiRef);\n const catalogApi = useApiHolder().get(catalogApiRef);\n const annotations = entity.metadata.annotations ?? {};\n const target = entityTarget(entity);\n const kind = annotations[ANYSHIFT_KIND_ANNOTATION] || 'workload';\n const namespace = entity.metadata.namespace;\n const configurationEndpoints =\n annotations[ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION];\n const configurationDependencies =\n annotations[ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION];\n const configurationTarget =\n annotations[ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION] ??\n annotations[ANYSHIFT_RESOURCE_ID_ANNOTATION];\n const [brief, setBrief] = useState<ServiceBrief>();\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [capabilities, setCapabilities] = useState<AnyshiftCapabilities>({\n askEnabled: false,\n queryEnabled: false,\n });\n const [error, setError] = useState<string>();\n const [refreshingAll, setRefreshingAll] = useState(false);\n const [refreshing, setRefreshing] = useState<Set<BriefSectionName>>(\n new Set(),\n );\n const active = useRef(true);\n\n const load = useCallback(\n async (refresh = false) => {\n setError(undefined);\n if (refresh) setRefreshingAll(true);\n try {\n const next = await api.brief(kind, target, {\n namespace,\n refresh,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) setBrief(next);\n } catch (cause) {\n if (active.current)\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n if (active.current) setRefreshingAll(false);\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n const retrySection = useCallback(\n async (section: BriefSectionName) => {\n setRefreshing(current => new Set(current).add(section));\n try {\n const response = await api.briefSection(kind, target, section, {\n namespace,\n refresh: true,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) {\n setBrief(current =>\n current\n ? {\n ...current,\n [section]: response.value,\n refreshedAt: response.refreshedAt,\n ...(response.observedService\n ? { observedService: response.observedService }\n : {}),\n }\n : current,\n );\n }\n } finally {\n if (active.current) {\n setRefreshing(current => {\n const next = new Set(current);\n next.delete(section);\n return next;\n });\n }\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n useEffect(() => {\n active.current = true;\n void load();\n return () => {\n active.current = false;\n };\n }, [load]);\n\n useEffect(() => {\n let cancelled = false;\n if (!catalogApi) {\n setCatalogEntities([]);\n return () => {\n cancelled = true;\n };\n }\n catalogApi\n .getEntities({\n filter: [{ kind: 'Component' }, { kind: 'Resource' }],\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n })\n .then(response => {\n if (!cancelled) setCatalogEntities(response.items);\n })\n .catch(() => {\n if (!cancelled) setCatalogEntities([]);\n });\n return () => {\n cancelled = true;\n };\n }, [catalogApi]);\n\n useEffect(() => {\n api\n .capabilities()\n .then(next => {\n if (active.current) setCapabilities(next);\n })\n .catch(() => {\n if (active.current) {\n setCapabilities({ askEnabled: false, queryEnabled: false });\n }\n });\n }, [api]);\n\n const resolvedBrief = useMemo<ServiceBrief | undefined>(() => {\n if (!brief || brief.impact.state !== 'data' || !brief.impact.data)\n return brief;\n const impactData = brief.impact.data;\n return {\n ...brief,\n impact: {\n ...brief.impact,\n data: {\n ...impactData,\n relatedEntities: resolveRelatedCatalogEntities(\n impactData.relatedEntities,\n catalogEntities,\n ),\n },\n },\n };\n }, [brief, catalogEntities]);\n\n if (error && !resolvedBrief)\n return <Typography color=\"error\">{error}</Typography>;\n if (!resolvedBrief) return <Progress />;\n return (\n <ServiceBriefView\n brief={resolvedBrief}\n onRetry={retrySection}\n refreshing={refreshing}\n onRefresh={() => void load(true)}\n refreshingAll={refreshingAll}\n refreshError={error}\n askEnabled={capabilities.askEnabled}\n askScope={askScopeForEntity(entity)}\n />\n );\n};\n\nexport const ServiceBriefView = ({\n brief,\n onRetry,\n refreshing = new Set(),\n onRefresh = () => {},\n refreshingAll = false,\n refreshError,\n askEnabled = false,\n askScope,\n}: {\n brief: ServiceBrief;\n onRetry: (section: BriefSectionName) => void;\n refreshing?: ReadonlySet<BriefSectionName>;\n onRefresh?: () => void;\n refreshingAll?: boolean;\n refreshError?: string;\n askEnabled?: boolean;\n askScope?: AskScope;\n}) => (\n <>\n <Box\n mb={3}\n px={2.5}\n py={2}\n borderLeft={4}\n borderColor=\"primary.main\"\n bgcolor=\"background.paper\"\n >\n <Box display=\"flex\" justifyContent=\"space-between\" gridGap={16}>\n <Box>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Anyshift evidence trace\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Chip size=\"small\" label={`Workload · ${brief.target}`} />\n <Typography aria-hidden=\"true\" color=\"primary\">\n →\n </Typography>\n <Chip\n size=\"small\"\n color=\"primary\"\n label={`Observed service · ${\n brief.observedService || 'Not resolved'\n }`}\n />\n </Box>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Runtime namespace: {brief.namespace || 'Not set'} · Refreshed{' '}\n {formatTimestamp(brief.refreshedAt)}\n </Typography>\n </Box>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n onClick={onRefresh}\n disabled={refreshingAll}\n startIcon={refreshingAll ? <CircularProgress size={14} /> : undefined}\n >\n {refreshingAll ? 'Refreshing…' : 'Refresh brief'}\n </Button>\n </Box>\n {refreshError && (\n <Typography color=\"error\" variant=\"caption\">\n Refresh failed: {refreshError}. Existing evidence is still shown.\n </Typography>\n )}\n </Box>\n\n <Grid container spacing={3} alignItems=\"stretch\">\n <Grid item xs={12}>\n <OverviewSection\n section={brief.overview}\n onRetry={onRetry}\n refreshing={refreshing.has('overview')}\n />\n </Grid>\n <Grid item xs={12}>\n <WhyNowSection\n section={brief.whyNow}\n onRetry={onRetry}\n refreshing={refreshing.has('whyNow')}\n />\n </Grid>\n {askEnabled && (\n <Grid item xs={12}>\n <AskAnyshiftCard context=\"entity\" scope={askScope} />\n </Grid>\n )}\n <Grid item xs={12}>\n <DatadogSignalSection\n section={brief.observability}\n onRetry={onRetry}\n refreshing={refreshing.has('observability')}\n />\n </Grid>\n <Grid item xs={12}>\n <ArchitectureSection\n section={brief.architecture}\n onRetry={onRetry}\n refreshing={refreshing.has('architecture')}\n />\n </Grid>\n <Grid item xs={12} md={8}>\n <DependencySection\n section={brief.topology}\n onRetry={onRetry}\n refreshing={refreshing.has('topology')}\n />\n </Grid>\n <Grid item xs={12} md={4}>\n <BriefRail brief={brief} onRetry={onRetry} refreshing={refreshing} />\n </Grid>\n <Grid item xs={12}>\n <TimelineSection\n section={brief.timeline}\n onRetry={onRetry}\n refreshing={refreshing.has('timeline')}\n />\n </Grid>\n </Grid>\n </>\n);\n\nfunction formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnyshiftEntityContent.esm.js","sources":["../../../src/components/entity/AnyshiftEntityContent.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Chip,\n CircularProgress,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { useApi, useApiHolder } from '@backstage/frontend-plugin-api';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION,\n ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION,\n ANYSHIFT_KIND_ANNOTATION,\n ANYSHIFT_RESOURCE_ID_ANNOTATION,\n ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { catalogApiRef, useEntity } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n AnyshiftCapabilities,\n AskScope,\n BriefSectionName,\n ServiceBrief,\n} from '../../api/types';\nimport { AskAnyshiftCard } from '../ask/AskAnyshiftCard';\nimport { askScopeForEntity } from '../ask/askScope';\nimport { CloudAnyshiftEntityContent } from '../cloud/CloudResourceContent';\nimport { entityTarget, isCloudResourceEntity } from './entityIdentity';\nimport { resolveRelatedCatalogEntities } from './relatedCatalogEntities';\nimport {\n ArchitectureSection,\n BriefRail,\n DatadogSignalSection,\n DependencySection,\n OverviewSection,\n TimelineSection,\n WhyNowSection,\n} from './BriefSections';\n\nexport const AnyshiftEntityContent = () => {\n const { entity } = useEntity();\n return isCloudResourceEntity(entity) ? (\n <CloudAnyshiftEntityContent />\n ) : (\n <ServiceAnyshiftEntityContent />\n );\n};\n\nexport const ServiceAnyshiftEntityContent = () => {\n const { entity } = useEntity();\n const api = useApi(anyshiftApiRef);\n const catalogApi = useApiHolder().get(catalogApiRef);\n const annotations = entity.metadata.annotations ?? {};\n const target = entityTarget(entity);\n const kind = annotations[ANYSHIFT_KIND_ANNOTATION] || 'workload';\n const namespace = entity.metadata.namespace;\n const configurationEndpoints =\n annotations[ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION];\n const configurationDependencies =\n annotations[ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION];\n const configurationTarget =\n annotations[ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION] ??\n annotations[ANYSHIFT_RESOURCE_ID_ANNOTATION];\n const [brief, setBrief] = useState<ServiceBrief>();\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [capabilities, setCapabilities] = useState<AnyshiftCapabilities>({\n askEnabled: false,\n queryEnabled: false,\n });\n const [error, setError] = useState<string>();\n const [refreshingAll, setRefreshingAll] = useState(false);\n const [refreshing, setRefreshing] = useState<Set<BriefSectionName>>(\n new Set(),\n );\n const active = useRef(true);\n\n const load = useCallback(\n async (refresh = false) => {\n setError(undefined);\n if (refresh) setRefreshingAll(true);\n try {\n const next = await api.brief(kind, target, {\n namespace,\n refresh,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) setBrief(next);\n } catch (cause) {\n if (active.current)\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n if (active.current) setRefreshingAll(false);\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n const retrySection = useCallback(\n async (section: BriefSectionName) => {\n setRefreshing(current => new Set(current).add(section));\n try {\n const response = await api.briefSection(kind, target, section, {\n namespace,\n refresh: true,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) {\n setBrief(current =>\n current\n ? {\n ...current,\n [section]: response.value,\n refreshedAt: response.refreshedAt,\n ...(response.observedService\n ? { observedService: response.observedService }\n : {}),\n }\n : current,\n );\n }\n } finally {\n if (active.current) {\n setRefreshing(current => {\n const next = new Set(current);\n next.delete(section);\n return next;\n });\n }\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n useEffect(() => {\n active.current = true;\n void load();\n return () => {\n active.current = false;\n };\n }, [load]);\n\n useEffect(() => {\n let cancelled = false;\n if (!catalogApi) {\n setCatalogEntities([]);\n return () => {\n cancelled = true;\n };\n }\n catalogApi\n .getEntities({\n filter: [{ kind: 'Component' }, { kind: 'Resource' }],\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n })\n .then(response => {\n if (!cancelled) setCatalogEntities(response.items);\n })\n .catch(() => {\n if (!cancelled) setCatalogEntities([]);\n });\n return () => {\n cancelled = true;\n };\n }, [catalogApi]);\n\n useEffect(() => {\n api\n .capabilities()\n .then(next => {\n if (active.current) setCapabilities(next);\n })\n .catch(() => {\n if (active.current) {\n setCapabilities({ askEnabled: false, queryEnabled: false });\n }\n });\n }, [api]);\n\n const resolvedBrief = useMemo<ServiceBrief | undefined>(() => {\n if (!brief || brief.impact.state !== 'data' || !brief.impact.data)\n return brief;\n const impactData = brief.impact.data;\n return {\n ...brief,\n impact: {\n ...brief.impact,\n data: {\n ...impactData,\n relatedEntities: resolveRelatedCatalogEntities(\n impactData.relatedEntities,\n catalogEntities,\n ),\n },\n },\n };\n }, [brief, catalogEntities]);\n\n if (error && !resolvedBrief)\n return <Typography color=\"error\">{error}</Typography>;\n if (!resolvedBrief) return <Progress />;\n return (\n <ServiceBriefView\n brief={resolvedBrief}\n onRetry={retrySection}\n refreshing={refreshing}\n onRefresh={() => void load(true)}\n refreshingAll={refreshingAll}\n refreshError={error}\n askEnabled={capabilities.askEnabled}\n askScope={askScopeForEntity(entity)}\n askScopeLabel={target}\n />\n );\n};\n\nexport const ServiceBriefView = ({\n brief,\n onRetry,\n refreshing = new Set(),\n onRefresh = () => {},\n refreshingAll = false,\n refreshError,\n askEnabled = false,\n askScope,\n askScopeLabel,\n}: {\n brief: ServiceBrief;\n onRetry: (section: BriefSectionName) => void;\n refreshing?: ReadonlySet<BriefSectionName>;\n onRefresh?: () => void;\n refreshingAll?: boolean;\n refreshError?: string;\n askEnabled?: boolean;\n askScope?: AskScope;\n askScopeLabel?: string;\n}) => (\n <>\n <Box\n mb={3}\n px={2.5}\n py={2}\n borderLeft={4}\n borderColor=\"primary.main\"\n bgcolor=\"background.paper\"\n >\n <Box display=\"flex\" justifyContent=\"space-between\" gridGap={16}>\n <Box>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Anyshift evidence trace\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Chip size=\"small\" label={`Workload · ${brief.target}`} />\n <Typography aria-hidden=\"true\" color=\"primary\">\n →\n </Typography>\n <Chip\n size=\"small\"\n color=\"primary\"\n label={`Observed service · ${\n brief.observedService || 'Not resolved'\n }`}\n />\n </Box>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Runtime namespace: {brief.namespace || 'Not set'} · Refreshed{' '}\n {formatTimestamp(brief.refreshedAt)}\n </Typography>\n </Box>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n onClick={onRefresh}\n disabled={refreshingAll}\n startIcon={refreshingAll ? <CircularProgress size={14} /> : undefined}\n >\n {refreshingAll ? 'Refreshing…' : 'Refresh brief'}\n </Button>\n </Box>\n {refreshError && (\n <Typography color=\"error\" variant=\"caption\">\n Refresh failed: {refreshError}. Existing evidence is still shown.\n </Typography>\n )}\n </Box>\n\n <Grid container spacing={3} alignItems=\"stretch\">\n <Grid item xs={12}>\n <OverviewSection\n section={brief.overview}\n onRetry={onRetry}\n refreshing={refreshing.has('overview')}\n />\n </Grid>\n <Grid item xs={12}>\n <WhyNowSection\n section={brief.whyNow}\n onRetry={onRetry}\n refreshing={refreshing.has('whyNow')}\n />\n </Grid>\n {askEnabled && (\n <Grid item xs={12}>\n <AskAnyshiftCard\n context=\"entity\"\n scope={askScope}\n scopeLabel={askScopeLabel}\n />\n </Grid>\n )}\n <Grid item xs={12}>\n <DatadogSignalSection\n section={brief.observability}\n onRetry={onRetry}\n refreshing={refreshing.has('observability')}\n />\n </Grid>\n <Grid item xs={12}>\n <ArchitectureSection\n section={brief.architecture}\n onRetry={onRetry}\n refreshing={refreshing.has('architecture')}\n />\n </Grid>\n <Grid item xs={12} md={8}>\n <DependencySection\n section={brief.topology}\n onRetry={onRetry}\n refreshing={refreshing.has('topology')}\n />\n </Grid>\n <Grid item xs={12} md={4}>\n <BriefRail brief={brief} onRetry={onRetry} refreshing={refreshing} />\n </Grid>\n <Grid item xs={12}>\n <TimelineSection\n section={brief.timeline}\n onRetry={onRetry}\n refreshing={refreshing.has('timeline')}\n />\n </Grid>\n </Grid>\n </>\n);\n\nfunction formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
|
package/dist/package.json.esm.js
CHANGED
package/package.json
CHANGED