diff --git a/assets/design-system/package.json b/assets/design-system/package.json index 028d2042cd..97687926be 100644 --- a/assets/design-system/package.json +++ b/assets/design-system/package.json @@ -69,6 +69,7 @@ "mermaid": "11.16.0", "react-animate-height": "3.2.4", "react-aria": "3.50.0", + "react-diff-viewer-continued": "4.4.0", "react-markdown": "9.1.0", "react-merge-refs": "2.1.1", "react-stately": "3.48.0", diff --git a/assets/design-system/src/components/ChipList.tsx b/assets/design-system/src/components/ChipList.tsx index ada24b2e03..02faa4915a 100644 --- a/assets/design-system/src/components/ChipList.tsx +++ b/assets/design-system/src/components/ChipList.tsx @@ -63,6 +63,8 @@ function ChipList({ {values.length > limit && ( + chroma(color).alpha(amount).hex() -const opacity = (color: string, opacity: number) => { - return chroma(color).alpha(opacity).hex() +export type DiffViewerProps = Omit< + ReactDiffViewerProps, + 'leftTitle' | 'rightTitle' +> & { + asCard?: boolean + cardProps?: CardProps } -export default function DiffViewer({ +export function DiffViewer({ styles, asCard = true, cardProps, hideSummary = true, ...props -}: Omit & { - asCard?: boolean - cardProps?: CardProps -}) { +}: DiffViewerProps) { const theme = useTheme() const mergedStyles = useMemo(() => { @@ -29,6 +39,7 @@ export default function DiffViewer({ gutterBackground: 'transparent', codeFoldGutterBackground: 'transparent', } + return merge( { content: { @@ -97,3 +108,5 @@ export default function DiffViewer({ ) } + +export default DiffViewer diff --git a/assets/design-system/src/components/icons/GoogleCloudRunIcon.tsx b/assets/design-system/src/components/icons/GoogleCloudRunIcon.tsx new file mode 100644 index 0000000000..94b811d960 --- /dev/null +++ b/assets/design-system/src/components/icons/GoogleCloudRunIcon.tsx @@ -0,0 +1,42 @@ +import createIcon from './createIcon' + +const icon = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAERElEQVR4AZxVW0xcVRRd+9x7y2OAMsC0QAtCLZq2iUCT1sTQShsf1JjAD1/GtDb+NtH0o/Jh5Mf0A43xmWjU6GdRY6IQf7S2VFpSE5uY2DagplKttjyEeTN37tnuMzPMiymoO2fdu++5e691zt7nziiUNKbBUbZ6h9n+NzCxAFMpqjUChvDQ6eje+enIx8qOTioncnFdSIyJPfBytNvkFosUCTBpK9hOmkeI8BSI90vCvnUhMSbWIR4xucU7KRB4bASVFqkjDPTiPxozDtlw+gxHfmpOYJhVLBG5F4QTUkwZ+WEb+5JAUN6JFIdwIWNZgV4s1ViMZwi0M/Puf9yowwaOPVKO6tXklMDgIFuWY3crwtHVF+Ze7gB1PoLMw1cGbK5M+1jHCDjqJcJdhtOEpQTm9oT8DPWcTPgF2bGlhvDwLgvtAUJbA+HwbgsdjQpGOBu01qmDwvOL3aFa80pB6mU5qo/BR8xEPhIesL2O8OgegvaS6NgKPNmlsLdNob6KIKcnPzznEz2hWT1uuNVBe3GbBk4SIAXJxRhvKcK4uchokrVoL4GZWyuIxBJornHxkHRq51ZCmRTdxObDcAlOHrZjTUrxpuPy0JkfsOrHXeD3BYZSCqZcS2EXC6Ekfv4zDn+li74HFHrut+CXPpXYTbdm75j0j44LoWjItcRYCGtEE4TWgI25oId7Ag4G9lehfYuDfTssPN2zScpmobZCvp7CfBJ7VoEQKpwvfiIQATJg7i0NDg7srsRBQbPfgdYe3EQcXiIG1kkUGCGumPlNmZR2yrXEaKgmOaKM2TkXzX47BRMWXdGYvBbFR2eX8cX3YSwGRcTNiciCNLN6W1kWfyoJE4I1wxzHlnqC52ncXpbySFk2+xRm512MXgzhw7NBXLgWx3JUwxSIPVd2Ek3thBnfeco7o74Zql4EaEQQRpGZ5rXIMb25kISsCI21Fqam4/jg62V8PhXGL7ddJJKGOpdoypR0o1HP069cGKqalx4Ql7mVk/Jr/kkuLO1ZxHI0Y/jqhwhkE7g8E8f7Qj55PY6/I7LqQu50klzZ8z5zoskJELGSZzwIhFnjHfH/EGTHnaDGxNUV3Ljj4ob04NxPMfxaYtXZBOMQbslu3+qp8KcOT0pgeJg0kpHrHvhdWZQMEwkkPEIwsQkgB9EVRih291UjY6z5PcspuzpsOGUuJSB3nHspEFG2MyrqV8xzGgRl2VBOOUjZ2Nj4isf6jOFajc0KmHrF/5qb1Yw35GXesaWMSMUGIpTUsF5H3P7NcCFjOQGZuPTa9jgs9zxAX6LASEQc2cndReR7GvM893yKAzkrEID8Cfeu1M6y9l7QGq+CMcbA+CrIcsaVXTYOqHEhTAM8BqaRBLunpsrbZg0H8qxIADDN+fbF6unAj75T9ff5Bho6fP35COyq62/s3Nbf1NWaRmfrQOPMpaHLp3fMINNY5Nk/AAAA///Eup1SAAAABklEQVQDAKtD2E0fWLTJAAAAAElFTkSuQmCC' + +export default createIcon(({ size, color, fullColor }) => ( + + {fullColor ? ( + + ) : ( + <> + + + + + + )} + +)) diff --git a/assets/design-system/src/components/icons/LambdaIcon.tsx b/assets/design-system/src/components/icons/LambdaIcon.tsx new file mode 100644 index 0000000000..e46a2360b8 --- /dev/null +++ b/assets/design-system/src/components/icons/LambdaIcon.tsx @@ -0,0 +1,42 @@ +import createIcon from './createIcon' + +const icon = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAYCAYAAAARfGZ1AAAD5UlEQVR4AYxVXWhcVRD+5tx79yfZ/DSbRJv0oSi1SvWhUAoRlEqeJKKVmqIgIhRa9MmiIKKWa4sW9EUQrQiCPvkHPolCRXwUIS+C0FJ8qKBttbtpm2x2s/fnjN/Zzf6km11zdubOOTNzvpk7d85Zg9vG6mt3TkWnijeiN4sJZdrhydX49fGH9TiC27b0XfaANz3FQMjoZmTV89/BzEyggGAbw2zDp+XicbI/RnQvvsa29vU4FcaTdab1s0DPE+wnQJeh/KEBmBOLR/DLrgxt/0s94KiV1vzZ0qJ/o/xEYOQwwT8nSkJ2ZBjneUyv5lQhTjGIe8AlhJUTiOUD1BFeX7M2/ZABVtogKnuiqlnACfhtXZ9JD3i3nxA1Su1N5nipS58x4j2O8clcl27L6UBwt2MkHlqnXGLVlRIMxJh4sBboKBVujn5jILjbXAlkiPU9gC4Y1n0q8PACwsE9PxD8ajiTz3jRiyKyH+iCV3G9/hzi4hQGjL7gGsLssPU5Y8xJ7s+SOyQukExExj7k/DqGzbMtwRsbKnfkPZU3WJICtwjZkbrHBjOgOXIZyNCnZd8wNcWW4DT5ST5+mXKOOXqUjiwfrmuc5BSeiMzvTsZmcbRxwJxuE/eAa4hMrToxrZCXCNy6pHiI9EKQ6rwC/xLBBRB26nBqglexD60EaOrQJnBlnSv1wliQM19CZIxuZqMFK8bSulIuEfBXMoPRCvEtdA7ZsWFd7A2wCRysc+BnF9lqB7m1ZXN3zaeeP/qdO7Ue9Auo1Gl3RB/ZG9eDu7Fvd+stnb7BNDYkmJdfL9R2eoK3AWk6KlIVlH1j35fwsjtM8IbN98z8LwCWDCh8tfgKuVtZBVgqtEcbHBgveGlwViGjbavoLVF9Cli+0tYtlapE+IzrZvZckHbGa+YehPA0hHElcrIBvsR/lyiWRyGyADS+vFImfJz72yv/JuFGllTKN0gjCK9iVLh0xNsZOVE5hGi6mNiJ+fi+4nEkxb2NKA/MTOwR432sAHvX+SPl+17KGH2X923U0HQ9hmreRdr/pCohAwJRg1OJl15QmG+5fC8xeszgwOSQWHmFDnkArjtSprKSpHqM5aiGYSdr2pt08J91EXOSi8Z3oHRUUJEdnBR4qHgfmUMmraQshTwDhbufLY1Vq/gkHywvSYhmZlR2kxxF6kv8O7Mnd1uIonxrQY1aa1S8Z6m6qoIrClxj1j9mvJG3+gFzU5PKNx2A6/mYQVzpqjSsCPCDGPtkPfEXTHC69FjmTOmu7OnSLvJscKZ8RMJm29G5PxUR21g+YmJ/0OkcO+PpwNj7/Yulw0G4fH7k7LXr/wEAAP//oYg0lgAAAAZJREFUAwB8uWLGeMjfdQAAAABJRU5ErkJggg==' + +export default createIcon(({ size, color, fullColor }) => ( + + {fullColor ? ( + + ) : ( + <> + + + + + + )} + +)) diff --git a/assets/design-system/src/components/icons/LightningIcon.tsx b/assets/design-system/src/components/icons/LightningIcon.tsx index 4a3f2c77de..26f2e40bf0 100644 --- a/assets/design-system/src/components/icons/LightningIcon.tsx +++ b/assets/design-system/src/components/icons/LightningIcon.tsx @@ -3,21 +3,17 @@ import createIcon from './createIcon' export default createIcon(({ size, color }) => ( - )) diff --git a/assets/design-system/src/components/icons/MicrosoftActionsIcon.tsx b/assets/design-system/src/components/icons/MicrosoftActionsIcon.tsx new file mode 100644 index 0000000000..ab7a2b75c9 --- /dev/null +++ b/assets/design-system/src/components/icons/MicrosoftActionsIcon.tsx @@ -0,0 +1,42 @@ +import createIcon from './createIcon' + +const icon = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAVCAYAAABc6S4mAAACP0lEQVR4AaSVsW4TQRCGZ9e5hiYpAuItkKCJkyI2JQWPAUKCltZ2QUUJEgqPQY1wIoGDQATBYyCEoEgi4rvd7Le6ueyd75KTYvnP7s78/z+j2fPFSs/P8setaf7z5jzi6+ZH92H9myI/2HzYZdO7gBGZiDcjYE6KHe/kLpDwWdv9/S4srd9eBZbfb48q9dKJgDLgBtms3LYuvQqYQTFRtTkudCt+YF5f1j3EzgLDt4v59t6naeye0cAGZffGytHa+O+zrTeHI7ik2rBSIAr2Ft54f7B4vDOtiU4uutfRfH4y3Ic7DBq0NX441ApAMNbPjfiZmtfHkweJrIwGLhq0eERS+acqQAICRATka+MpR0PcFP5p8X7dK/L5xis0aPHACx6IBZg1CQgQSYC0e1l6kcxKDYGkdxG2ghYPvPAkZtl4MRMSEAhWSC/3xkD8RlZBOXoXesYDLzzxtt6YXZIkWFN4kVmKKse4Aroe09TLHj7aHouRfR61dHaYZXd+TVMQA/wW0tEQS4EXnhSyJGKRsGF2zSIhHL/xwtmFR9UU7sje/3ePYxOY89iqZywAiQCz6yqiF26Oc2nOHT2N8VvAnM6JgaoABxKdRbjw0H3b3DGnMbR44KWoFSAIASIChMTieMKl2tM8vh6IKeDARYNW47quFCABEQF7EMdz6r50zd07M0YDt4nWApAQ8J6J3Z/5kTj7gngTcEAzrufOAkpg9bl7edVrGV4bri7w/+xBtvXneZu4T+zSAvyvvY45DZwDAAD//45G9PoAAAAGSURBVAMARbFYWb7haUoAAAAASUVORK5CYII=' + +export default createIcon(({ size, color, fullColor }) => ( + + {fullColor ? ( + + ) : ( + <> + + + + + + )} + +)) diff --git a/assets/design-system/src/icons.ts b/assets/design-system/src/icons.ts index 46c5ab2f92..56b0899d59 100644 --- a/assets/design-system/src/icons.ts +++ b/assets/design-system/src/icons.ts @@ -134,6 +134,7 @@ export { default as GitPullIcon } from './components/icons/GitPullIcon' export { default as GKEIcon } from './components/icons/GKEIcon' export { default as GlobeIcon } from './components/icons/GlobeIcon' export { default as GoogleCloudLogoIcon } from './components/icons/GoogleCloudLogoIcon' +export { default as GoogleCloudRunIcon } from './components/icons/GoogleCloudRunIcon' export { default as GoogleLogoIcon } from './components/icons/GoogleLogoIcon' export { default as GrafanaLogoIcon } from './components/icons/GrafanaLogoIcon' export { default as GraphIcon } from './components/icons/GraphIcon' @@ -161,6 +162,7 @@ export { default as KeyIcon } from './components/icons/KeyIcon' export { default as KeyPairIcon } from './components/icons/KeyPairIcon' export { default as KubernetesIcon } from './components/icons/Kubernetes' export { default as KubernetesAltIcon } from './components/icons/KubernetesAltIcon' +export { default as LambdaIcon } from './components/icons/LambdaIcon' export { default as LifePreserverIcon } from './components/icons/LifePreserverIcon' export { default as LightningIcon } from './components/icons/LightningIcon' export { default as LinearLogoIcon } from './components/icons/LinearLogoIcon' @@ -180,6 +182,7 @@ export { default as MarketPlusIcon } from './components/icons/MarketPlusIcon' export { default as McpLogoIcon } from './components/icons/McpLogoIcon' export { default as MegaphoneIcon } from './components/icons/MegaphoneIcon' export { default as MessagesIcon } from './components/icons/MessagesIcon' +export { default as MicrosoftActionsIcon } from './components/icons/MicrosoftActionsIcon' export { default as MinusIcon } from './components/icons/MinusIcon' export { default as MinimizeIcon } from './components/icons/MinimizeIcon' export { default as MoonIcon } from './components/icons/MoonIcon' diff --git a/assets/design-system/src/index.ts b/assets/design-system/src/index.ts index 6e3e9260e4..6939eb665c 100644 --- a/assets/design-system/src/index.ts +++ b/assets/design-system/src/index.ts @@ -51,6 +51,11 @@ export { default as CodeEditor } from './components/CodeEditor' export { default as Codeline } from './components/Codeline' export { ComboBox } from './components/ComboBox' export { default as Date } from './components/Date' +export { + default as DiffViewer, + DiffMethod, + type DiffViewerProps, +} from './components/DiffViewer' export { default as Divider } from './components/Divider' export { default as EmptyState } from './components/EmptyState' export { default as Flex } from './components/Flex' diff --git a/assets/design-system/src/stories/DiffViewer.stories.tsx b/assets/design-system/src/stories/DiffViewer.stories.tsx new file mode 100644 index 0000000000..5e3b83f41f --- /dev/null +++ b/assets/design-system/src/stories/DiffViewer.stories.tsx @@ -0,0 +1,62 @@ +import { DiffMethod, DiffViewer } from '..' + +const OLD_VALUE = `apiVersion: v1 +kind: ConfigMap +metadata: + name: demo + namespace: default +data: + feature: enabled +` + +const NEW_VALUE = `apiVersion: v1 +kind: ConfigMap +metadata: + name: demo + namespace: default +data: + feature: disabled + extra: true +` + +export default { + title: 'DiffViewer', + component: DiffViewer, + argTypes: { + splitView: { + control: 'boolean', + }, + asCard: { + control: 'boolean', + }, + hideLineNumbers: { + control: 'boolean', + }, + }, +} + +function Template(args: any) { + return ( +
+ +
+ ) +} + +export const Default = Template.bind({}) +Default.args = { + oldValue: OLD_VALUE, + newValue: NEW_VALUE, + splitView: false, + compareMethod: DiffMethod.LINES, + asCard: true, +} + +export const DeletedFile = Template.bind({}) +DeletedFile.args = { + oldValue: OLD_VALUE, + newValue: '', + splitView: false, + compareMethod: DiffMethod.LINES, + asCard: true, +} diff --git a/assets/package.json b/assets/package.json index 24cd19cee6..d09112f8dd 100644 --- a/assets/package.json +++ b/assets/package.json @@ -104,7 +104,6 @@ "query-string": "8.2.0", "react": "19.2.7", "react-diff-view": "3.3.3", - "react-diff-viewer-continued": "4.4.0", "react-dom": "19.2.7", "react-dropzone": "14.4.1", "react-error-boundary": "4.1.2", diff --git a/assets/src/components/ai/insights/PrEvidenceDetails.tsx b/assets/src/components/ai/insights/PrEvidenceDetails.tsx index 968d2809ea..91daf9c8e6 100644 --- a/assets/src/components/ai/insights/PrEvidenceDetails.tsx +++ b/assets/src/components/ai/insights/PrEvidenceDetails.tsx @@ -3,15 +3,15 @@ import { AccordionItem, CloseIcon, CaretDownIcon, + DiffMethod, + DiffViewer, FileIcon, Flex, IconFrame, PrOpenIcon, } from '@pluralsh/design-system' -import DiffViewer from 'components/utils/DiffViewer' import { StackedText } from 'components/utils/table/StackedText' import { useMemo } from 'react' -import { DiffMethod } from 'react-diff-viewer-continued' import styled from 'styled-components' import pluralize from 'pluralize' import { getURLPath } from 'utils/url' diff --git a/assets/src/components/awaiting-review/AwaitingReviewAgentRunItem.tsx b/assets/src/components/awaiting-review/AwaitingReviewAgentRunItem.tsx index e31e3ed48c..1f36ccd078 100644 --- a/assets/src/components/awaiting-review/AwaitingReviewAgentRunItem.tsx +++ b/assets/src/components/awaiting-review/AwaitingReviewAgentRunItem.tsx @@ -82,6 +82,7 @@ export function AwaitingReviewAgentRunItem({ workbenchId={workbench.id} workbenchName={workbench.name} workbenchJobId={workbenchJob.id} + jobInsertedAt={workbenchJob.insertedAt} onNavigate={onNavigate} css={{ flexShrink: 0 }} /> diff --git a/assets/src/components/awaiting-review/AwaitingReviewLauncher.tsx b/assets/src/components/awaiting-review/AwaitingReviewLauncher.tsx index 66897e5a31..f1021b093d 100644 --- a/assets/src/components/awaiting-review/AwaitingReviewLauncher.tsx +++ b/assets/src/components/awaiting-review/AwaitingReviewLauncher.tsx @@ -47,7 +47,8 @@ export default function AwaitingReviewLauncher() { setOpen(false) }) - const { stacks, agentRuns, count, loading, error } = useAwaitingReview() + const { stacks, agentRuns, activities, count, loading, error } = + useAwaitingReview() useLayoutEffect(() => { if (!open) return @@ -95,6 +96,7 @@ export default function AwaitingReviewLauncher() { setOpen(false)} diff --git a/assets/src/components/awaiting-review/AwaitingReviewPanel.tsx b/assets/src/components/awaiting-review/AwaitingReviewPanel.tsx index 70fbfb1e5d..7481695a5a 100644 --- a/assets/src/components/awaiting-review/AwaitingReviewPanel.tsx +++ b/assets/src/components/awaiting-review/AwaitingReviewPanel.tsx @@ -10,6 +10,7 @@ import { RectangleSkeleton } from 'components/utils/SkeletonLoaders.tsx' import { AwaitingReviewAgentRunFragment, AwaitingReviewStackFragment, + AwaitingReviewWorkbenchActivityFragment, } from 'generated/graphql' import { ApolloError } from '@apollo/client' import isEmpty from 'lodash/isEmpty' @@ -17,11 +18,13 @@ import { ComponentProps } from 'react' import { useTheme } from 'styled-components' import { AwaitingReviewAgentRunItem } from './AwaitingReviewAgentRunItem' import { AwaitingReviewItem } from './AwaitingReviewItem' +import { AwaitingReviewWorkbenchActivityItem } from './AwaitingReviewWorkbenchActivityItem' import { Overline } from 'components/cd/utils/PermissionsModal' export function AwaitingReviewPanel({ stacks, agentRuns, + activities, loading, error, onClose, @@ -29,12 +32,14 @@ export function AwaitingReviewPanel({ }: ComponentProps & { stacks: AwaitingReviewStackFragment[] agentRuns: AwaitingReviewAgentRunFragment[] + activities: AwaitingReviewWorkbenchActivityFragment[] loading: boolean error?: ApolloError onClose: () => void }) { const theme = useTheme() - const hasItems = !isEmpty(stacks) || !isEmpty(agentRuns) + const hasItems = + !isEmpty(stacks) || !isEmpty(agentRuns) || !isEmpty(activities) return ( ) : ( <> + {activities.map((activity) => ( + + ))} {agentRuns.map((agentRun) => ( ['functionCall'] + >['tool'] +> + +export function AwaitingReviewWorkbenchActivityItem({ + activity, + onNavigate, +}: { + activity: AwaitingReviewWorkbenchActivityFragment + onNavigate: () => void +}) { + const theme = useTheme() + const { workbenchJob, result } = activity + const workbench = workbenchJob?.workbench + const functionCall = result?.functionCall + const tool = functionCall?.tool + const toolType = tool?.tool + const kubeRequest = result?.kubeRequest + const isKubernetes = activity.type === WorkbenchJobActivityType.Kubernetes + const kubeVariant = isKubernetes + ? getKubeActionVariant(kubeRequest?.method) + : null + const parsedPath = isKubernetes ? parseKubePath(kubeRequest?.path) : null + + const title = isKubernetes + ? getKubeActionTitle(kubeRequest) + : 'Approval required' + + const subtitle = isKubernetes + ? getKubeActionSubtitle(kubeRequest) + : toolType + ? getWorkbenchToolLabel(toolType) + : (functionCall?.name ?? 'Action') + + const description = + workbenchJob?.result?.workingTheory?.trim() || + toolDescription(tool) || + activity.prompt?.trim() || + null + + const detailLine = + kubeVariant === 'delete' ? kubeDeleteDetail(parsedPath) : null + + const viewPath = + workbenchJob?.id && workbench?.id + ? getWorkbenchJobAbsPath({ + workbenchId: workbench.id, + jobId: workbenchJob.id, + }) + : null + + return ( +
+ + + ) : toolType ? ( + + ) : ( + + ) + } + css={{ + flexShrink: 0, + border: theme.borders['fill-two'], + backgroundColor: 'transparent', + }} + /> + + {workbenchJob?.id && workbench?.id && workbench.name && ( + + )} + + + {(description || detailLine) && ( + + {description && ( + + {description} + + )} + {detailLine && {detailLine}} + + )} + + + + } + > + Pending approval + + {kubeVariant === 'update' && ( + + Update + + )} + {kubeVariant === 'delete' && ( + + Delete + + )} + + {viewPath && ( + + )} + +
+ ) +} + +function KubeActionIcon({ + variant, +}: { + variant: ReturnType | null +}) { + if (variant === 'delete') { + return ( + + ) + } + return +} + +function toolDescription(tool: ActivityTool | null | undefined): string | null { + if (!tool?.configuration) return null + const { configuration, tool: toolType } = tool + switch (toolType) { + case WorkbenchToolType.Lambda: + return configuration.lambda?.description?.trim() || null + case WorkbenchToolType.CloudRun: + return configuration.cloudRun?.description?.trim() || null + case WorkbenchToolType.AzureFunction: + return configuration.azureFunction?.description?.trim() || null + default: + return null + } +} + +function kubeDeleteDetail( + parsed: ReturnType +): string | null { + if (parsed?.namespace) return `Deleting ns/${parsed.namespace}` + if (parsed?.name) return `Deleting ${parsed.name}` + return 'Deleting resource' +} diff --git a/assets/src/components/cd/services/service/ServiceDryRun.tsx b/assets/src/components/cd/services/service/ServiceDryRun.tsx index c2bcdc6f28..e5b0d43c77 100644 --- a/assets/src/components/cd/services/service/ServiceDryRun.tsx +++ b/assets/src/components/cd/services/service/ServiceDryRun.tsx @@ -9,14 +9,13 @@ import { useMemo, useState } from 'react' import { DiffColumnIcon, DiffUnifiedIcon, + DiffViewer, IconFrame, } from '@pluralsh/design-system' import { useTheme } from 'styled-components' import { isEmpty } from 'lodash' -import DiffViewer from '../../../utils/DiffViewer' - import { useServiceContext } from './ServiceDetailsContext' const SEPARATOR = '\n---\n' diff --git a/assets/src/components/component/ComponentDryRun.tsx b/assets/src/components/component/ComponentDryRun.tsx index bef3787a93..c853b7c7b1 100644 --- a/assets/src/components/component/ComponentDryRun.tsx +++ b/assets/src/components/component/ComponentDryRun.tsx @@ -1,8 +1,8 @@ import { useOutletContext } from 'react-router-dom' import { useMemo } from 'react' import { isEmpty } from 'lodash' +import { DiffViewer } from '@pluralsh/design-system' -import DiffViewer from '../utils/DiffViewer' import { ComponentDetailsContext } from './ComponentDetails' export default function ComponentDryRun() { diff --git a/assets/src/components/contexts/AwaitingReviewContext.tsx b/assets/src/components/contexts/AwaitingReviewContext.tsx index a190f23e61..1a2bdcd593 100644 --- a/assets/src/components/contexts/AwaitingReviewContext.tsx +++ b/assets/src/components/contexts/AwaitingReviewContext.tsx @@ -2,8 +2,10 @@ import { ApolloError } from '@apollo/client' import { AwaitingReviewAgentRunFragment, AwaitingReviewStackFragment, + AwaitingReviewWorkbenchActivityFragment, usePendingApprovalAgentRunsQuery, usePendingApprovalStacksQuery, + usePendingApprovalWorkbenchActivitiesQuery, } from 'generated/graphql' import { createContext, ReactNode, use, useMemo } from 'react' import { mapExistingNodes } from 'utils/graphql' @@ -13,6 +15,7 @@ const POLL_INTERVAL = 60 * 1000 type AwaitingReviewContextValue = { stacks: AwaitingReviewStackFragment[] agentRuns: AwaitingReviewAgentRunFragment[] + activities: AwaitingReviewWorkbenchActivityFragment[] count: number loading: boolean error?: ApolloError @@ -21,6 +24,7 @@ type AwaitingReviewContextValue = { const AwaitingReviewContext = createContext({ stacks: [], agentRuns: [], + activities: [], count: 0, loading: false, }) @@ -48,6 +52,15 @@ export function AwaitingReviewProvider({ children }: { children: ReactNode }) { fetchPolicy: 'cache-and-network', }) + const { + data: activitiesData, + loading: activitiesLoading, + error: activitiesError, + } = usePendingApprovalWorkbenchActivitiesQuery({ + pollInterval: POLL_INTERVAL, + fetchPolicy: 'cache-and-network', + }) + const stacks = useMemo( () => mapExistingNodes(stacksData?.infrastructureStacks), [stacksData?.infrastructureStacks] @@ -58,21 +71,30 @@ export function AwaitingReviewProvider({ children }: { children: ReactNode }) { [agentRunsData?.agentRuns] ) + const activities = useMemo( + () => mapExistingNodes(activitiesData?.workbenchJobActivities), + [activitiesData?.workbenchJobActivities] + ) + const value = useMemo( () => ({ stacks, agentRuns, - count: stacks.length + agentRuns.length, - loading: stacksLoading || agentRunsLoading, - error: stacksError ?? agentRunsError, + activities, + count: stacks.length + agentRuns.length + activities.length, + loading: stacksLoading || agentRunsLoading || activitiesLoading, + error: stacksError ?? agentRunsError ?? activitiesError, }), [ stacks, agentRuns, + activities, stacksLoading, agentRunsLoading, + activitiesLoading, stacksError, agentRunsError, + activitiesError, ] ) diff --git a/assets/src/components/workbenches/WorkbenchesConfiguredToolMetadata.tsx b/assets/src/components/workbenches/WorkbenchesConfiguredToolMetadata.tsx index bfb14155dd..349cad5cf9 100644 --- a/assets/src/components/workbenches/WorkbenchesConfiguredToolMetadata.tsx +++ b/assets/src/components/workbenches/WorkbenchesConfiguredToolMetadata.tsx @@ -45,9 +45,9 @@ const metadataExtractors: Record = { [WorkbenchToolType.AzureDevops]: extractAzureDevopsMetadata, [WorkbenchToolType.Docker]: extractDockerMetadata, [WorkbenchToolType.Cloud]: () => [], - [WorkbenchToolType.Lambda]: () => [], - [WorkbenchToolType.CloudRun]: () => [], - [WorkbenchToolType.AzureFunction]: () => [], + [WorkbenchToolType.Lambda]: extractLambdaMetadata, + [WorkbenchToolType.CloudRun]: extractCloudRunMetadata, + [WorkbenchToolType.AzureFunction]: extractAzureFunctionMetadata, } export function WorkbenchesConfiguredToolMetadata({ @@ -325,6 +325,26 @@ function extractDockerMetadata( ] } +function extractLambdaMetadata( + configuration: WorkbenchToolConfiguration | null +): MetadataRow[] { + return [{ label: 'ARN', value: configuration?.lambda?.lambdaArn }] +} + +function extractCloudRunMetadata( + configuration: WorkbenchToolConfiguration | null +): MetadataRow[] { + return [{ label: 'Service', value: configuration?.cloudRun?.identifier }] +} + +function extractAzureFunctionMetadata( + configuration: WorkbenchToolConfiguration | null +): MetadataRow[] { + return [ + { label: 'Function', value: configuration?.azureFunction?.identifier }, + ] +} + function getConfiguredHeadersCount( headers?: (WorkbenchToolHttpHeader | null)[] | null ): number { diff --git a/assets/src/components/workbenches/common/WorkbenchLinkChip.tsx b/assets/src/components/workbenches/common/WorkbenchLinkChip.tsx index ec8db53b2f..8edf7584de 100644 --- a/assets/src/components/workbenches/common/WorkbenchLinkChip.tsx +++ b/assets/src/components/workbenches/common/WorkbenchLinkChip.tsx @@ -24,6 +24,7 @@ type WorkbenchLinkChipProps = { workbenchId: string workbenchName: string workbenchJobId?: string + jobInsertedAt?: string | null stopPropagation?: boolean onNavigate?: () => void } & Partial< @@ -39,6 +40,7 @@ export function WorkbenchLinkChip({ workbenchId, workbenchName, workbenchJobId, + jobInsertedAt, stopPropagation = false, onNavigate, fillLevel = 1, @@ -66,7 +68,7 @@ export function WorkbenchLinkChip({ }) const { data: pendingData } = useWorkbenchLinkCardPendingAgentRunsQuery({ - skip: !open, + skip: !open || !!workbenchJobId, fetchPolicy: 'cache-first', }) @@ -144,6 +146,7 @@ export function WorkbenchLinkChip({ workbenchName={workbenchName} workbenchId={workbenchId} workbenchJobId={workbenchJobId} + jobInsertedAt={jobInsertedAt} workbench={data?.workbench} pendingAgentRuns={pendingAgentRuns} onNavigate={() => { diff --git a/assets/src/components/workbenches/common/WorkbenchLinkHoverCard.tsx b/assets/src/components/workbenches/common/WorkbenchLinkHoverCard.tsx index ec206653df..759445fc48 100644 --- a/assets/src/components/workbenches/common/WorkbenchLinkHoverCard.tsx +++ b/assets/src/components/workbenches/common/WorkbenchLinkHoverCard.tsx @@ -1,7 +1,6 @@ import { ArrowTopRightIcon, Button, - Card, Flex, prettifyRepoUrl, WorkbenchIcon, @@ -14,13 +13,15 @@ import { getWorkbenchJobAbsPath, } from 'routes/workbenchesRoutesConsts' import styled, { useTheme } from 'styled-components' +import { formatDateTime } from 'utils/datetime' -export const WORKBENCH_LINK_HOVER_CARD_WIDTH = 220 +export const WORKBENCH_LINK_HOVER_CARD_WIDTH = 260 type WorkbenchLinkHoverCardProps = { workbenchName: string workbenchId?: string workbenchJobId?: string + jobInsertedAt?: string | null workbench?: WorkbenchLinkCardFragment | null pendingAgentRuns?: number onNavigate?: () => void @@ -35,7 +36,7 @@ function DetailRow({ label, value }: { label: string; value: string }) { > {label} {value} @@ -48,6 +49,7 @@ export function WorkbenchLinkHoverCard({ workbenchName, workbenchId, workbenchJobId, + jobInsertedAt, workbench, pendingAgentRuns = 0, onNavigate, @@ -61,6 +63,9 @@ export function WorkbenchLinkHoverCard({ workbench?.repository?.httpsPath ?? workbench?.repository?.url ?? '' ) const pendingCount = pendingAgentRuns + const startTime = jobInsertedAt + ? formatDateTime(jobInsertedAt, 'HH:mm:ss [UTC]', false, true) + : null const workbenchPath = workbenchId && workbenchJobId ? getWorkbenchJobAbsPath({ workbenchId, jobId: workbenchJobId }) @@ -68,93 +73,117 @@ export function WorkbenchLinkHoverCard({ ? getWorkbenchAbsPath(workbenchId) : undefined + const detailRows = workbenchJobId + ? [ + owner ? { label: 'Owner', value: owner } : null, + startTime ? { label: 'Start time', value: startTime } : null, + ].filter(isDetailRow) + : [ + cluster ? { label: 'Cluster', value: cluster } : null, + owner ? { label: 'Owner', value: owner } : null, + repo ? { label: 'Repo', value: repo } : null, + ].filter(isDetailRow) + return ( - - - + + + + + {workbenchName} - - - - {cluster && ( - - )} - {owner && ( - - )} - {repo && ( - - )} - {pendingCount > 0 && ( + + + {(detailRows.length > 0 || (!workbenchJobId && pendingCount > 0)) && ( - Agent runs - - {pendingCount} pending - + {detailRows.map(({ label, value }) => ( + + ))} + {!workbenchJobId && pendingCount > 0 && ( + + Agent runs + + {pendingCount} pending + + + )} )} - - {workbenchPath && ( - - )} + {workbenchPath && ( + + )} + ) } -const CardSC = styled(Card)(({ theme }) => ({ - '&&': { - width: WORKBENCH_LINK_HOVER_CARD_WIDTH, - maxWidth: WORKBENCH_LINK_HOVER_CARD_WIDTH, - flexGrow: 0, - }, +function isDetailRow( + row: { label: string; value: string } | null +): row is { label: string; value: string } { + return row != null +} + +const CardSC = styled.div(({ theme }) => ({ + width: WORKBENCH_LINK_HOVER_CARD_WIDTH, + maxWidth: WORKBENCH_LINK_HOVER_CARD_WIDTH, display: 'flex', flexDirection: 'column', - gap: theme.spacing.small, - padding: theme.spacing.medium, + backgroundColor: theme.colors['fill-one'], border: theme.borders['fill-two'], + borderRadius: 6, + boxShadow: theme.boxShadows.moderate, + overflow: 'hidden', pointerEvents: 'auto', })) -const DividerSC = styled.div(({ theme }) => ({ - borderTop: `1px solid ${theme.colors['border-fill-two']}`, - marginLeft: -theme.spacing.medium, - marginRight: -theme.spacing.medium, +const HeaderSC = styled.div(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: theme.spacing.xsmall, + padding: 10, + borderBottom: theme.borders['fill-two'], +})) + +const IconWrapSC = styled.div({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + width: 32, + height: 32, flexShrink: 0, +}) + +const ContentSC = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.medium, + padding: theme.spacing.small, })) diff --git a/assets/src/components/workbenches/tools/WorkbenchToolCreateOrEdit.tsx b/assets/src/components/workbenches/tools/WorkbenchToolCreateOrEdit.tsx index 3ec1b04c66..02015a607d 100644 --- a/assets/src/components/workbenches/tools/WorkbenchToolCreateOrEdit.tsx +++ b/assets/src/components/workbenches/tools/WorkbenchToolCreateOrEdit.tsx @@ -34,11 +34,13 @@ import { deepOmitBlank } from 'utils/graphql' import { getWorkbenchesBreadcrumbs } from '../Workbenches' import { WorkbenchToolForm, WorkbenchToolFormState } from './WorkbenchToolForm' import { + cloudFunctionProviderForWorkbenchTool, CONFIGURABLE_TOOL_TYPE_TO_CONFIG_KEY, getWorkbenchToolLabel, isConfigurableWorkbenchToolType, isProvider, scmTypeForWorkbenchTool, + workbenchToolSupportsApproval, WorkbenchToolIcon, } from './workbenchToolsUtils' import { @@ -270,6 +272,7 @@ function formStateToAttributes( cloudConnectionId, mcpServerId, scmConnectionId, + approval, readBindings, writeBindings, } = state @@ -277,17 +280,23 @@ function formStateToAttributes( tool: type, name, categories, + ...(workbenchToolSupportsApproval(type) ? { approval: !!approval } : {}), readBindings: readBindings.map(bindingToBindingAttributes), writeBindings: writeBindings.map(bindingToBindingAttributes), } const scmType = scmTypeForWorkbenchTool(type) const scmPatch = scmType ? { scmConnectionId: scmConnectionId ?? null } : {} + const cloudConnectionPatch = + type === WorkbenchToolType.Cloud || + !!cloudFunctionProviderForWorkbenchTool(type) + ? { cloudConnectionId: cloudConnectionId ?? null } + : {} if (type === WorkbenchToolType.Cloud) return { ...base, - cloudConnectionId: cloudConnectionId ?? null, + ...cloudConnectionPatch, ...scmPatch, } @@ -299,14 +308,36 @@ function formStateToAttributes( } if (!isConfigurableWorkbenchToolType(type) || !configuration) - return { ...base, ...scmPatch } + return { ...base, ...cloudConnectionPatch, ...scmPatch } const configKey = CONFIGURABLE_TOOL_TYPE_TO_CONFIG_KEY[type] const sanitized = deepOmitBlank(configuration[configKey]) - if (isEmpty(sanitized)) return { ...base, ...scmPatch } + if (isEmpty(sanitized)) + return { ...base, ...cloudConnectionPatch, ...scmPatch } - return { ...base, ...scmPatch, configuration: { [configKey]: sanitized } } + return { + ...base, + ...cloudConnectionPatch, + ...scmPatch, + configuration: { + [configKey]: coerceConfigurationJsonFields(sanitized), + }, + } +} + +function coerceConfigurationJsonFields>( + config: T +): T { + if (!('inputSchema' in config)) return config + + const inputSchema = config.inputSchema + if (inputSchema == null || typeof inputSchema === 'string') return config + + return { + ...config, + inputSchema: JSON.stringify(inputSchema), + } } const WrapperSC = styled.div(({ theme }) => ({ diff --git a/assets/src/components/workbenches/tools/WorkbenchToolForm.tsx b/assets/src/components/workbenches/tools/WorkbenchToolForm.tsx index 0433907f25..25445f4447 100644 --- a/assets/src/components/workbenches/tools/WorkbenchToolForm.tsx +++ b/assets/src/components/workbenches/tools/WorkbenchToolForm.tsx @@ -9,7 +9,9 @@ import { ListBoxItem, Select, SelectButton, + WarningShieldIcon, } from '@pluralsh/design-system' +import { Overline } from 'components/cd/utils/PermissionsModal' import { useUpdateState } from 'components/hooks/useUpdateState' import { FormBindings } from 'components/utils/bindings' import { @@ -24,13 +26,14 @@ import { HelmAuthProvider, } from 'generated/graphql' import { isNonNullable } from 'utils/isNonNullable' -import { useState } from 'react' +import { useMemo, useState } from 'react' import { FormCardSC, SidebarBtnSC, StickyActionsFooterSC, WorkbenchSplitLayoutSC, } from '../workbench/create-edit/WorkbenchCreateOrEdit' +import { WorkbenchPromptSupervisionOption } from '../workbench/WorkbenchPromptModeSelector/WorkbenchPromptSupervisionOption' import { CloudConnectionSelectField } from './cloud-connection/CloudConnectionSelectField' import { McpServerSelectField } from './mcp-server/McpServerSelectField' import { ScmConnectionWorkbenchSelect } from './scm-connection/ScmConnectionWorkbenchSelect' @@ -38,6 +41,7 @@ import { WorkbenchToolDeleteModal } from './WorkbenchToolDeleteModal' import { WorkbenchToolFormFields } from './WorkbenchToolFormFields' import { categoryToLabel, + cloudFunctionProviderForWorkbenchTool, ConfigForToolType, CONFIGURABLE_TOOL_TYPE_TO_CONFIG_KEY, ConfigurableWorkbenchToolType, @@ -45,6 +49,7 @@ import { isConfigurableWorkbenchToolType, scmTypeForWorkbenchTool, TOOL_TYPE_TO_CATEGORIES, + workbenchToolSupportsApproval, } from './workbenchToolsUtils' import { Link } from 'react-router-dom' @@ -134,6 +139,7 @@ export type WorkbenchToolFormState = Omit< | 'cloudConnectionId' | 'mcpServerId' | 'scmConnectionId' + | 'approval' | 'readBindings' | 'writeBindings' >, @@ -143,12 +149,17 @@ export type WorkbenchToolFormState = Omit< writeBindings: PolicyBindingFragment[] } -type WorkbenchToolFormStep = 'configuration' | 'access-policy' +type WorkbenchToolFormStep = 'configuration' | 'access-policy' | 'approvals' -const TOOL_FORM_STEPS = [ - { key: 'configuration', label: 'Configuration' }, - { key: 'access-policy', label: 'Access policy' }, -] as const +const BASE_TOOL_FORM_STEPS = [ + { key: 'configuration' as const, label: 'Configuration' }, + { key: 'access-policy' as const, label: 'Access policy' }, +] + +const APPROVALS_TOOL_FORM_STEP = { + key: 'approvals' as const, + label: 'Approvals', +} export function WorkbenchToolForm({ type, @@ -170,6 +181,14 @@ export function WorkbenchToolForm({ const [deleteOpen, setDeleteOpen] = useState(false) const [currentStep, setCurrentStep] = useState('configuration') + const supportsApproval = workbenchToolSupportsApproval(type) + const toolFormSteps = useMemo( + () => + supportsApproval + ? [...BASE_TOOL_FORM_STEPS, APPROVALS_TOOL_FORM_STEP] + : BASE_TOOL_FORM_STEPS, + [supportsApproval] + ) const defaultCategories = type === WorkbenchToolType.Mcp ? [WorkbenchToolCategory.Integration] @@ -181,6 +200,7 @@ export function WorkbenchToolForm({ cloudConnectionId: tool?.cloudConnection?.id, mcpServerId: tool?.mcpServer?.id, scmConnectionId: tool?.scmConnection?.id, + approval: tool?.approval ?? false, readBindings: tool?.readBindings?.filter(isNonNullable) ?? [], writeBindings: tool?.writeBindings?.filter(isNonNullable) ?? [], }) @@ -188,9 +208,11 @@ export function WorkbenchToolForm({ const selectedCategories = (state.categories ?? []).filter(isNonNullable) const hasRegisteredScm = Boolean(state.scmConnectionId) const scmType = scmTypeForWorkbenchTool(type) + const cloudConnectionProvider = + provider ?? cloudFunctionProviderForWorkbenchTool(type) const configurationStepComplete = !!state.name.trim() && - (type !== WorkbenchToolType.Cloud || !!state.cloudConnectionId) && + (!cloudConnectionProvider || !!state.cloudConnectionId) && (type !== WorkbenchToolType.Mcp || !!state.mcpServerId) && (type !== WorkbenchToolType.Github || hasRegisteredScm || @@ -221,8 +243,22 @@ export function WorkbenchToolForm({ pagerdutyConfigurationIsComplete(state.configuration?.pagerduty)) && (type !== WorkbenchToolType.Sentry || !!tool?.id || - sentryConfigurationIsComplete(state.configuration?.sentry)) + sentryConfigurationIsComplete(state.configuration?.sentry)) && + (type !== WorkbenchToolType.Lambda || + (!!state.configuration?.lambda?.lambdaArn.trim() && + !!state.configuration.lambda.description.trim() && + !!state.configuration.lambda.inputSchema)) && + (type !== WorkbenchToolType.CloudRun || + (!!state.configuration?.cloudRun?.identifier.trim() && + !!state.configuration.cloudRun.description.trim() && + !!state.configuration.cloudRun.inputSchema)) && + (type !== WorkbenchToolType.AzureFunction || + (!!state.configuration?.azureFunction?.identifier.trim() && + !!state.configuration.azureFunction.description.trim() && + !!state.configuration.azureFunction.inputSchema)) const allowSave = hasUpdates && configurationStepComplete + const isLastStep = + currentStep === toolFormSteps[toolFormSteps.length - 1]?.key return ( - {TOOL_FORM_STEPS.map(({ key, label }) => ( + {toolFormSteps.map(({ key, label }) => ( update({ name: e.target.value })} /> - {type === WorkbenchToolType.Cloud && provider ? ( + {cloudConnectionProvider && ( update({ cloudConnectionId: id })} /> - ) : type === WorkbenchToolType.Mcp ? ( + )} + {type === WorkbenchToolType.Mcp ? ( <> - ) : ( + ) : type !== WorkbenchToolType.Cloud ? ( <> {scmType ? ( - )} + ) : null} {type !== WorkbenchToolType.Mcp && categories.length > 1 && ( )} - ) : ( + ) : currentStep === 'access-policy' ? ( + ) : ( + )} {tool?.id ? ( @@ -411,18 +453,24 @@ export function WorkbenchToolForm({ disabled={ currentStep === 'configuration' ? !configurationStepComplete - : !allowSave + : isLastStep + ? !allowSave + : false } - loading={currentStep === 'access-policy' && mutationLoading} + loading={isLastStep && mutationLoading} onClick={() => { if (currentStep === 'configuration') { setCurrentStep('access-policy') return } + if (currentStep === 'access-policy' && supportsApproval) { + setCurrentStep('approvals') + return + } onSave(state) }} > - {currentStep === 'configuration' ? 'Next' : 'Save'} + {isLastStep ? 'Save' : 'Next'} @@ -437,6 +485,35 @@ export function WorkbenchToolForm({ ) } +function ToolApprovalsStep({ + approval, + update, +}: { + approval: boolean + update: (next: Partial) => void +}) { + return ( + + Supervision + + } + label="Requires approval" + hint="Pause for your sign-off before this action executes." + checked={approval} + onChange={(checked) => update({ approval: checked })} + /> + + ) +} + function ToolAccessPolicyStep({ readBindings, writeBindings, @@ -490,6 +567,14 @@ function ToolAccessPolicyStep({ ) } +function normalizeJsonField( + value: Nullable | string> +): string | undefined { + if (value == null || value === '') return undefined + if (typeof value === 'string') return value + return JSON.stringify(value, null, 2) +} + // done this way so TS will catch new tool types that aren't fully implemented yet /** Build initial form configuration from fragment data. Keyed by configurable tool type. */ export const INITIAL_TOOL_CONFIG_BY_TYPE: { @@ -546,7 +631,7 @@ export const INITIAL_TOOL_CONFIG_BY_TYPE: { WorkbenchToolHttpMethod.Get, body: body ?? undefined, headers: headers?.filter(isNonNullable), - inputSchema: inputSchema ?? undefined, + inputSchema: normalizeJsonField(inputSchema), }, } }, @@ -673,6 +758,36 @@ export const INITIAL_TOOL_CONFIG_BY_TYPE: { }, } }, + [WorkbenchToolType.Lambda]: (config) => { + const { lambdaArn, description, inputSchema } = config?.lambda ?? {} + return { + lambda: { + lambdaArn: lambdaArn ?? '', + description: description ?? '', + inputSchema: normalizeJsonField(inputSchema), + }, + } + }, + [WorkbenchToolType.CloudRun]: (config) => { + const { identifier, description, inputSchema } = config?.cloudRun ?? {} + return { + cloudRun: { + identifier: identifier ?? '', + description: description ?? '', + inputSchema: normalizeJsonField(inputSchema), + }, + } + }, + [WorkbenchToolType.AzureFunction]: (config) => { + const { identifier, description, inputSchema } = config?.azureFunction ?? {} + return { + azureFunction: { + identifier: identifier ?? '', + description: description ?? '', + inputSchema: normalizeJsonField(inputSchema), + }, + } + }, } function sanitizeInitialConfiguration( diff --git a/assets/src/components/workbenches/tools/WorkbenchToolFormFields.tsx b/assets/src/components/workbenches/tools/WorkbenchToolFormFields.tsx index 00d8383e88..11be8fafe7 100644 --- a/assets/src/components/workbenches/tools/WorkbenchToolFormFields.tsx +++ b/assets/src/components/workbenches/tools/WorkbenchToolFormFields.tsx @@ -121,6 +121,12 @@ export function WorkbenchToolFormFields({ return render(type, SentryFormFields) case WorkbenchToolType.Docker: return render(type, DockerFormFields) + case WorkbenchToolType.Lambda: + return render(type, LambdaFormFields) + case WorkbenchToolType.CloudRun: + return render(type, CloudRunFormFields) + case WorkbenchToolType.AzureFunction: + return render(type, AzureFunctionFormFields) } } @@ -398,6 +404,99 @@ function HttpFormFields({ ) } +function LambdaFormFields({ + config: c, + setConfig: set, +}: ToolFormFieldProps) { + return ( + <> + set({ ...c, lambdaArn: e.target.value })} + /> + set({ ...c, description: value ?? '' })} + css={{ minHeight: 80 }} + /> + | string | undefined} + onChange={(inputSchema) => set({ ...c, inputSchema })} + /> + + ) +} + +function CloudRunFormFields({ + config: c, + setConfig: set, +}: ToolFormFieldProps) { + return ( + <> + set({ ...c, identifier: e.target.value })} + /> + set({ ...c, description: value ?? '' })} + css={{ minHeight: 80 }} + /> + | string | undefined} + onChange={(inputSchema) => set({ ...c, inputSchema })} + /> + + ) +} + +function AzureFunctionFormFields({ + config: c, + setConfig: set, +}: ToolFormFieldProps) { + return ( + <> + set({ ...c, identifier: e.target.value })} + /> + set({ ...c, description: value ?? '' })} + css={{ minHeight: 80 }} + /> + | string | undefined} + onChange={(inputSchema) => set({ ...c, inputSchema })} + /> + + ) +} + function UrlUsernamePasswordTokenTenantFormFields< T extends | WorkbenchToolType.Loki diff --git a/assets/src/components/workbenches/tools/workbenchToolsUtils.tsx b/assets/src/components/workbenches/tools/workbenchToolsUtils.tsx index a4d63a0309..7aae803beb 100644 --- a/assets/src/components/workbenches/tools/workbenchToolsUtils.tsx +++ b/assets/src/components/workbenches/tools/workbenchToolsUtils.tsx @@ -10,10 +10,13 @@ import { GitHubLogoIcon, GitLabLogoIcon, GoogleCloudLogoIcon, + GoogleCloudRunIcon, IconProps, + LambdaIcon, LinearLogoIcon, LokiLogoIcon, McpLogoIcon, + MicrosoftActionsIcon, MsTeamsLogoIcon, OpenSearchLogoIcon, PrometheusLogoIcon, @@ -63,6 +66,9 @@ const CONFIGURABLE_WORKBENCH_TOOL_TYPES = [ WorkbenchToolType.Azure, WorkbenchToolType.Sentry, WorkbenchToolType.Docker, + WorkbenchToolType.Lambda, + WorkbenchToolType.CloudRun, + WorkbenchToolType.AzureFunction, ] as const const CONFIGURABLE_SET = new Set( @@ -98,6 +104,9 @@ export const CONFIGURABLE_TOOL_TYPE_TO_CONFIG_KEY = { [WorkbenchToolType.Azure]: 'azure', [WorkbenchToolType.Sentry]: 'sentry', [WorkbenchToolType.Docker]: 'docker', + [WorkbenchToolType.Lambda]: 'lambda', + [WorkbenchToolType.CloudRun]: 'cloudRun', + [WorkbenchToolType.AzureFunction]: 'azureFunction', } as const satisfies Record< ConfigurableWorkbenchToolType, keyof WorkbenchToolConfigurationAttributes @@ -131,6 +140,22 @@ export function scmTypeForWorkbenchTool( return WORKBENCH_TOOL_TO_SCM_TYPE[type] } +const CLOUD_FUNCTION_TOOL_TO_PROVIDER: Partial< + Record +> = { + [WorkbenchToolType.Lambda]: Provider.Aws, + [WorkbenchToolType.CloudRun]: Provider.Gcp, + [WorkbenchToolType.AzureFunction]: Provider.Azure, +} + +export const cloudFunctionProviderForWorkbenchTool = ( + type: WorkbenchToolType +): Provider | undefined => CLOUD_FUNCTION_TOOL_TO_PROVIDER[type] + +export const workbenchToolSupportsApproval = ( + type: WorkbenchToolType +): boolean => !!cloudFunctionProviderForWorkbenchTool(type) + const WORKBENCH_TOOL_LABELS: Record< WorkbenchToolType | `${WorkbenchToolType.Cloud}:${Provider}`, string @@ -163,7 +188,7 @@ const WORKBENCH_TOOL_LABELS: Record< [WorkbenchToolType.Cloud]: 'Cloud', [WorkbenchToolType.Lambda]: 'AWS Lambda', [WorkbenchToolType.CloudRun]: 'GCP Cloud Run', - [WorkbenchToolType.AzureFunction]: 'Azure Function', + [WorkbenchToolType.AzureFunction]: 'Azure Cloud Function', [WorkbenchToolType.Docker]: 'Docker / OCI registry', [`${WorkbenchToolType.Cloud}:${Provider.Aws}`]: 'AWS', [`${WorkbenchToolType.Cloud}:${Provider.Gcp}`]: 'GCP', @@ -285,6 +310,12 @@ const CONFIGURABLE_TOOL_TYPE_CARD_DESCRIPTIONS: Record< 'Connect to Sentry to list issues, inspect error details, and read stack traces.', [WorkbenchToolType.Docker]: 'Inspect Docker and OCI registries by listing tags and fetching manifests.', + [WorkbenchToolType.Lambda]: + 'Run custom code with AWS Lambda without provisioning or managing servers.', + [WorkbenchToolType.CloudRun]: + 'Run custom containerized applications on GCP Cloud Run.', + [WorkbenchToolType.AzureFunction]: + 'Run custom code with Azure Functions without managing infrastructure.', } export const categoryToLabel: Record = { @@ -448,4 +479,7 @@ const toolToIcon: Record< [WorkbenchToolType.Jaeger]: ToolsIcon, [WorkbenchToolType.Sentry]: SentryLogoIcon, [WorkbenchToolType.Docker]: DockerLogoIcon, + [WorkbenchToolType.Lambda]: LambdaIcon, + [WorkbenchToolType.CloudRun]: GoogleCloudRunIcon, + [WorkbenchToolType.AzureFunction]: MicrosoftActionsIcon, } diff --git a/assets/src/components/workbenches/workbench/WorkbenchPromptModeSelector/WorkbenchPromptSupervisionOption.tsx b/assets/src/components/workbenches/workbench/WorkbenchPromptModeSelector/WorkbenchPromptSupervisionOption.tsx index 0edb3b6c4a..6de89d0a4e 100644 --- a/assets/src/components/workbenches/workbench/WorkbenchPromptModeSelector/WorkbenchPromptSupervisionOption.tsx +++ b/assets/src/components/workbenches/workbench/WorkbenchPromptModeSelector/WorkbenchPromptSupervisionOption.tsx @@ -25,7 +25,7 @@ export function WorkbenchPromptSupervisionOption({ css={{ display: 'flex', alignItems: 'flex-start', - gap: theme.spacing.xxsmall, + gap: theme.spacing.xsmall, width: '100%', padding: theme.spacing.xxsmall, border: 'none', diff --git a/assets/src/components/workbenches/workbench/create-edit/WorkbenchCreateOrEdit.tsx b/assets/src/components/workbenches/workbench/create-edit/WorkbenchCreateOrEdit.tsx index d6b722352e..e1c83f06e6 100644 --- a/assets/src/components/workbenches/workbench/create-edit/WorkbenchCreateOrEdit.tsx +++ b/assets/src/components/workbenches/workbench/create-edit/WorkbenchCreateOrEdit.tsx @@ -451,6 +451,18 @@ function formStateToAttributes(state: WorkbenchFormState): WorkbenchAttributes { // Keep explicit empty list so "delete all skills" is persisted. rest.workbenchSkills = (state.workbenchSkills ?? []).filter(isNonNullable) + // Keep explicit namespace lists so clearing required/blacklisted namespaces persists. + if (state.modes?.kubernetes) { + rest.modes ??= {} + rest.modes.kubernetes = { + ...rest.modes.kubernetes, + update: state.modes.kubernetes.update ?? false, + delete: state.modes.kubernetes.delete ?? false, + requireNamespaces: state.modes.kubernetes.requireNamespaces ?? [], + excludeNamespaces: state.modes.kubernetes.excludeNamespaces ?? [], + } + } + return { name: name ?? '', ...(r && { readBindings: r.map(bindingToBindingAttributes) }), @@ -567,5 +579,17 @@ function workbenchModesToAttributes( }, } : {}), + ...(modes.kubernetes + ? { + kubernetes: { + update: modes.kubernetes.update, + delete: modes.kubernetes.delete, + requireNamespaces: + modes.kubernetes.requireNamespaces?.filter(isNonNullable) ?? [], + excludeNamespaces: + modes.kubernetes.excludeNamespaces?.filter(isNonNullable) ?? [], + }, + } + : {}), } } diff --git a/assets/src/components/workbenches/workbench/create-edit/WorkbenchFormSteps.tsx b/assets/src/components/workbenches/workbench/create-edit/WorkbenchFormSteps.tsx index 7475ce8cdf..3639a818f8 100644 --- a/assets/src/components/workbenches/workbench/create-edit/WorkbenchFormSteps.tsx +++ b/assets/src/components/workbenches/workbench/create-edit/WorkbenchFormSteps.tsx @@ -1,4 +1,5 @@ import { + AddIcon, ArrowTopRightIcon, Button, Card, @@ -6,7 +7,9 @@ import { CardTabs, Checkbox, Chip, + ChipList, CloseIcon, + ComboBox, Divider, Flex, FormField, @@ -14,6 +17,7 @@ import { InfoOutlineIcon, Input2, isValidRepoUrl, + ListBoxFooterPlus, ListBoxItem, Radio, RadioGroup, @@ -25,14 +29,18 @@ import { import { AgentRunMode, PolicyBindingFragment, + useAgentRuntimeQuery, useAgentRuntimeReposQuery, + useClusterNamespacesQuery, useGitRepositoriesQuery, useGitRepositoryQuery, useWorkbenchToolsQuery, } from 'generated/graphql' import { produce } from 'immer' +import Fuse from 'fuse.js' import { Dispatch, + KeyboardEvent, ReactNode, SetStateAction, useCallback, @@ -747,6 +755,252 @@ export function WorkbenchCodingAgentStep({ ) } +export function WorkbenchConfigureActionsStep({ + formState, + setFormState, +}: WorkbenchFormStepProps) { + const update = createFormUpdater(setFormState) + const kubernetes = formState.modes?.kubernetes + const allowUpdates = kubernetes?.update ?? false + const allowDeletes = kubernetes?.delete ?? false + const requireNamespaces = (kubernetes?.requireNamespaces ?? []).filter( + (ns): ns is string => !!ns + ) + const excludeNamespaces = (kubernetes?.excludeNamespaces ?? []).filter( + (ns): ns is string => !!ns + ) + + const { data: runtimeData } = useAgentRuntimeQuery({ + variables: { id: formState.agentRuntimeId ?? '' }, + skip: !formState.agentRuntimeId, + }) + const clusterId = runtimeData?.agentRuntime?.cluster?.id + const { data: namespacesData, loading: namespacesLoading } = + useClusterNamespacesQuery({ + variables: { clusterId }, + skip: !clusterId, + }) + const namespaceOptions = useMemo( + () => + (namespacesData?.namespaces ?? []) + .map((ns) => ns?.metadata?.name) + .filter(isNonNullable) + .sort((a, b) => a.localeCompare(b)), + [namespacesData?.namespaces] + ) + + const setKubernetes = ( + patch: Partial<{ + update: boolean + delete: boolean + requireNamespaces: string[] + excludeNamespaces: string[] + }> + ) => + update((d) => { + d.modes ??= {} + d.modes.kubernetes = { + update: allowUpdates, + delete: allowDeletes, + requireNamespaces, + excludeNamespaces, + ...d.modes.kubernetes, + ...patch, + } + }) + + return ( + + + + setKubernetes({ update: e.target.checked })} + > + Allow updates + + setKubernetes({ delete: e.target.checked })} + > + Allow deletes + + + + + setKubernetes({ requireNamespaces: next })} + /> + + setKubernetes({ excludeNamespaces: next })} + /> + + ) +} + +function NamespaceListField({ + label, + hint, + values, + namespaces, + loading, + severity, + onChange, +}: { + label: string + hint: string + values: string[] + namespaces: string[] + loading?: boolean + severity?: 'danger' + onChange: (next: string[]) => void +}) { + const [draft, setDraft] = useState('') + const [isOpen, setIsOpen] = useState(false) + const trimmed = draft.trim() + + const allOptions = useMemo(() => { + const merged = new Set([...namespaces, ...values]) + return [...merged].sort((a, b) => a.localeCompare(b)) + }, [namespaces, values]) + + const suggestions = useMemo(() => { + if (!trimmed) return allOptions + return new Fuse(allOptions, { threshold: 0.25 }) + .search(trimmed) + .map(({ item }) => item) + }, [allOptions, trimmed]) + + const canAddCustom = + !!trimmed && !values.includes(trimmed) && !allOptions.includes(trimmed) + + const toggleNamespace = (raw: string) => { + const value = raw.trim() + if (!value) return + onChange( + values.includes(value) + ? values.filter((ns) => ns !== value) + : [...values, value] + ) + setDraft('') + setIsOpen(true) + } + + const addCustomNamespace = (raw: string) => { + const value = raw.trim() + if (!value || values.includes(value)) { + setDraft('') + return + } + onChange([...values, value]) + setDraft('') + setIsOpen(true) + } + + return ( + + + { + if (key) toggleNamespace(String(key)) + }} + isOpen={isOpen} + onOpenChange={setIsOpen} + loading={loading} + allowsEmptyCollection={canAddCustom} + inputProps={{ + placeholder: 'Search namespace name', + onKeyDown: (e: KeyboardEvent) => { + if (e.key !== 'Enter' || !canAddCustom) return + e.preventDefault() + addCustomNamespace(trimmed) + }, + }} + onFooterClick={ + canAddCustom ? () => addCustomNamespace(trimmed) : undefined + } + dropdownFooter={ + canAddCustom ? ( + + } + > + Use "{trimmed}" + + ) : undefined + } + > + {suggestions.map((ns) => ( + + } + /> + ))} + + {values.length > 0 && ( + true} + onClick={(value) => onChange(values.filter((ns) => ns !== value))} + /> + )} + + + ) +} + export function WorkbenchAccessPolicyStep({ formState, setFormState, @@ -1044,6 +1298,7 @@ export const WORKBENCH_STEP_LABELS = [ 'Workbench setup', 'Skills configuration', 'Coding agent', + 'Configure actions', 'Access policy', 'Attach tools', ] as const @@ -1056,6 +1311,7 @@ export const workbenchFormSteps: WorkbenchFormStep[] = [ { label: 'Workbench setup', component: WorkbenchSetupStep }, { label: 'Skills configuration', component: WorkbenchSkillsConfigStep }, { label: 'Coding agent', component: WorkbenchCodingAgentStep }, + { label: 'Configure actions', component: WorkbenchConfigureActionsStep }, { label: 'Access policy', component: WorkbenchAccessPolicyStep }, { label: 'Attach tools', component: WorkbenchAttachToolsStep }, ] diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJob.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJob.tsx index 17dc00487f..346e8d00a1 100644 --- a/assets/src/components/workbenches/workbench/job/WorkbenchJob.tsx +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJob.tsx @@ -9,6 +9,7 @@ import { RunStatusIcon } from 'components/ai/agent-runs/AgentRunInfoDisplays' import { POLL_INTERVAL } from 'components/cd/ContinuousDeployment' import { useSidePanelWidth } from 'components/layout/TopLevelSidePanel' import { GqlError } from 'components/utils/Alert' +import { prettifyPrompt } from 'components/utils/contentEditableChips' import { MetadataIcons } from 'components/utils/MetadataIcons' import { StretchedFlex } from 'components/utils/StretchedFlex' import { StackedText } from 'components/utils/table/StackedText' @@ -30,8 +31,8 @@ import { SaveWorkbenchPromptButton } from '../SaveWorkbenchPromptButton' import { WorkbenchJobActivities } from './WorkbenchJobActivities' import { isJobRunning } from './WorkbenchJobActivity' import { useWorkbenchJobPanel } from './WorkbenchJobPanel' -import { prettifyPrompt } from 'components/utils/contentEditableChips' -import { hasWorkbenchJobResultContent } from './workbenchJobResultUtils' +import { hasWorkbenchJobPanelContent } from './workbenchJobResultUtils' +import { useWorkbenchJobActionSummary } from './useWorkbenchJobActionSummary' export function WorkbenchJob() { const theme = useTheme() @@ -49,11 +50,10 @@ export function WorkbenchJob() { const job = data?.workbenchJob const isLoading = loading && !job - const hasResultContent = hasWorkbenchJobResultContent(job) + const { hasActions } = useWorkbenchJobActionSummary(jobId) + const hasPanelContent = hasWorkbenchJobPanelContent(job, hasActions) - const { isOpen, setOpen } = useWorkbenchJobPanel( - !!job?.id && hasResultContent - ) + const { isOpen, setOpen } = useWorkbenchJobPanel(!!job?.id && hasPanelContent) useSidePanelWidth({ maxWidthVw: 60, initialWidthVw: @@ -196,7 +196,7 @@ export function WorkbenchJob() { workbenchName={workbenchName} /> - {hasResultContent && !isOpen && ( + {!!job?.id && hasPanelContent && !isOpen && ( setOpen(true)} diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActionCard.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionCard.tsx new file mode 100644 index 0000000000..509ad90da6 --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionCard.tsx @@ -0,0 +1,105 @@ +import { + Button, + Chip, + Flex, + IconFrame, + KubernetesIcon, +} from '@pluralsh/design-system' +import { StackedText } from 'components/utils/table/StackedText' +import { + WorkbenchJobActionFragment, + WorkbenchJobActivityType, +} from 'generated/graphql' +import styled, { useTheme } from 'styled-components' +import { + getActionDetailButtonLabel, + getActionIcon, + getActionStatusBorderColor, + getActionSubtitle, + getActionTitle, +} from './workbenchJobActionsUtils' +import { getKubeActionVariant } from './workbenchJobKubeActionUtils' + +export function WorkbenchJobActionCard({ + activity, + onView, +}: { + activity: WorkbenchJobActionFragment + onView: () => void +}) { + const theme = useTheme() + const icon = getActionIcon(activity) + const kubeVariant = + activity.type === WorkbenchJobActivityType.Kubernetes + ? getKubeActionVariant(activity.result?.kubeRequest?.method) + : null + + return ( + + + } + css={{ + flexShrink: 0, + border: theme.borders['fill-two'], + backgroundColor: 'transparent', + }} + /> + + + {kubeVariant === 'update' && ( + + Update + + )} + {kubeVariant === 'delete' && ( + + Delete + + )} + + + ) +} + +const CardSC = styled.div<{ + $status: WorkbenchJobActionFragment['status'] +}>(({ theme, $status }) => ({ + display: 'flex', + alignItems: 'center', + gap: theme.spacing.medium, + padding: `${theme.spacing.medium}px ${theme.spacing.small}px`, + borderRadius: theme.borderRadiuses.large, + background: theme.colors['fill-one'], + borderLeft: `2px solid ${getActionStatusBorderColor(theme, $status)}`, +})) diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDenialResult.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDenialResult.tsx new file mode 100644 index 0000000000..01bf4c8422 --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDenialResult.tsx @@ -0,0 +1,46 @@ +import { Flex } from '@pluralsh/design-system' +import { Body2P, CaptionP } from 'components/utils/typography/Text' +import { + WorkbenchJobActionFragment, + WorkbenchJobActivityFragment, + WorkbenchJobActivityStatus, +} from 'generated/graphql' +import { useTheme } from 'styled-components' + +type ActionActivity = WorkbenchJobActionFragment | WorkbenchJobActivityFragment + +export function getActionDenialReason(activity: ActionActivity): string | null { + if ( + activity.status !== WorkbenchJobActivityStatus.Cancelled && + activity.status !== WorkbenchJobActivityStatus.Rejected + ) + return null + return activity.result?.output?.trim() || null +} + +export function WorkbenchJobActionDenialResult({ + activity, +}: { + activity: ActionActivity +}) { + const theme = useTheme() + const reason = getActionDenialReason(activity) + if (!reason) return null + + const deniedBy = activity.user?.name?.trim() + + return ( + + {`“${reason}”`} + {!!deniedBy && ( + + Denied by{' '} + {deniedBy} + + )} + + ) +} diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDenyPopover.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDenyPopover.tsx new file mode 100644 index 0000000000..ec2a528340 --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDenyPopover.tsx @@ -0,0 +1,187 @@ +import { ApolloError } from '@apollo/client' +import { + autoUpdate, + flip, + FloatingPortal, + offset, + shift, + useFloating, +} from '@floating-ui/react' +import { + Button, + CloseIcon, + Flex, + IconFrame, + Input, + Popover, + PopoverWrapper, +} from '@pluralsh/design-system' +import { GqlError } from 'components/utils/Alert' +import { Body2P, CaptionP } from 'components/utils/typography/Text' +import { FormEvent, useState } from 'react' +import styled, { useTheme } from 'styled-components' + +const POPOVER_WIDTH = 360 + +export function WorkbenchJobActionDenyButton({ + disabled, + rejecting, + rejectError, + onDeny, +}: { + disabled?: boolean + rejecting: boolean + rejectError?: ApolloError | null + onDeny: (reason: string) => Promise | unknown +}) { + const theme = useTheme() + const [open, setOpen] = useState(false) + const [reason, setReason] = useState('') + + const floating = useFloating({ + placement: 'top-start', + strategy: 'fixed', + middleware: [ + offset(theme.spacing.small), + flip({ padding: theme.spacing.small }), + shift({ padding: theme.spacing.small }), + ], + whileElementsMounted: autoUpdate, + }) + + const close = () => { + if (rejecting) return + setOpen(false) + setReason('') + } + + const onSubmit = async (e?: FormEvent) => { + e?.preventDefault() + try { + await onDeny(reason.trim()) + setOpen(false) + setReason('') + } catch { + // keep open; rejectError is shown from the mutation hook + } + } + + return ( + <> + + {open && ( + + + + + + Reason for denial + } + disabled={rejecting} + onClick={close} + /> + + + The agent will acknowledge your reasoning as it progresses. + + {rejectError && } + setReason(e.target.value)} + placeholder="Explain why this action should not run." + /> + + + + + + + + + )} + + ) +} + +const DenyPopoverSC = styled.form(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.medium, + width: '100%', + padding: theme.spacing.medium, + borderRadius: theme.borderRadiuses.large, + border: theme.borders['fill-two'], + backgroundColor: theme.colors['fill-two'], + boxShadow: theme.boxShadows.moderate, +})) + +const ActionsSC = styled.div(({ theme }) => ({ + display: 'flex', + justifyContent: 'flex-end', + gap: theme.spacing.small, +})) diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDetail.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDetail.tsx new file mode 100644 index 0000000000..721779721e --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionDetail.tsx @@ -0,0 +1,224 @@ +import { + Button, + Code, + Flex, + IconFrame, + KubernetesIcon, + ReturnIcon, +} from '@pluralsh/design-system' +import { GqlError } from 'components/utils/Alert' +import { StackedText } from 'components/utils/table/StackedText' +import { CaptionP } from 'components/utils/typography/Text' +import { + useApproveWorkbenchJobActivityMutation, + useRejectWorkbenchJobActivityMutation, + WorkbenchJobActionFragment, + WorkbenchJobActivityStatus, + WorkbenchJobActivityType, +} from 'generated/graphql' +import { useState } from 'react' +import styled, { useTheme } from 'styled-components' +import { + getActionIcon, + getActionInputJson, + getActionResultJson, + getActionSubtitle, + getActionTitle, +} from './workbenchJobActionsUtils' +import { getKubeActionVariant } from './workbenchJobKubeActionUtils' +import { + WorkbenchJobKubeActionChips, + WorkbenchJobKubeUpdateDiff, +} from './WorkbenchJobKubeUpdateDiff' +import { WorkbenchJobActionDenialResult } from './WorkbenchJobActionDenialResult' +import { WorkbenchJobActionDenyButton } from './WorkbenchJobActionDenyPopover' +import { WorkbenchJobActionStatusChip } from './WorkbenchJobActionStatusChip' + +export function WorkbenchJobActionDetail({ + activity, + onBack, +}: { + activity: WorkbenchJobActionFragment + onBack: () => void +}) { + const theme = useTheme() + const [error, setError] = useState(null) + const needsApproval = + activity.status === WorkbenchJobActivityStatus.NeedsApproval + const isKubernetes = activity.type === WorkbenchJobActivityType.Kubernetes + const kubeVariant = getKubeActionVariant(activity.result?.kubeRequest?.method) + const isKubeDiff = + isKubernetes && (kubeVariant === 'update' || kubeVariant === 'delete') + const icon = getActionIcon(activity) + const inputJson = getActionInputJson(activity) + const isDenied = + activity.status === WorkbenchJobActivityStatus.Cancelled || + activity.status === WorkbenchJobActivityStatus.Rejected + const resultJson = isDenied ? '' : getActionResultJson(activity) + + const [approve, { loading: approving }] = + useApproveWorkbenchJobActivityMutation({ + variables: { id: activity.id }, + onCompleted: onBack, + onError: (err) => setError(err.message), + refetchQueries: ['WorkbenchJobActions', 'WorkbenchJobActionSummary'], + }) + + const [reject, { loading: rejecting, error: rejectError }] = + useRejectWorkbenchJobActivityMutation({ + onCompleted: onBack, + refetchQueries: ['WorkbenchJobActions', 'WorkbenchJobActionSummary'], + }) + + return ( + + + + Back to all actions + + + + + } + css={{ + flexShrink: 0, + border: theme.borders['fill-two'], + backgroundColor: 'transparent', + }} + /> + + + } + /> + + + {error && } + + {isKubeDiff ? ( + + ) : ( + <> + {!!inputJson && ( + + INPUT + + {inputJson} + + + )} + + {!!resultJson && ( + + RESULT + + {resultJson} + + + )} + + )} + + + + {needsApproval && ( + + + reject({ + variables: { + id: activity.id, + reason: reason || undefined, + }, + }) + } + /> + + + )} + + ) +} + +const DetailSC = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.large, +})) + +const BackBtnSC = styled.button(({ theme }) => ({ + ...theme.partials.reset.button, + ...theme.partials.text.body2, + display: 'inline-flex', + alignItems: 'center', + gap: theme.spacing.xsmall, + color: theme.colors['text-xlight'], + width: 'fit-content', + '&:hover': { color: theme.colors.text }, +})) + +const ActionsRowSC = styled.div({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + width: '100%', +}) diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActionStatusChip.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionStatusChip.tsx new file mode 100644 index 0000000000..9f8e3bc0ee --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActionStatusChip.tsx @@ -0,0 +1,72 @@ +import { + Chip, + FailedFilledIcon, + SpinnerAlt, + StatusIpIcon, + StatusOkIcon, + WarningIcon, +} from '@pluralsh/design-system' +import { WorkbenchJobActivityStatus } from 'generated/graphql' + +export function WorkbenchJobActionStatusChip({ + status, +}: { + status: Nullable +}) { + switch (status) { + case WorkbenchJobActivityStatus.NeedsApproval: + return ( + } + > + Pending approval + + ) + case WorkbenchJobActivityStatus.Pending: + return ( + } + > + Pending + + ) + case WorkbenchJobActivityStatus.Running: + return ( + } + > + Running + + ) + case WorkbenchJobActivityStatus.Failed: + return ( + } + > + Failed + + ) + case WorkbenchJobActivityStatus.Successful: + return ( + } + > + Succeeded + + ) + case WorkbenchJobActivityStatus.Cancelled: + case WorkbenchJobActivityStatus.Rejected: + return Denied + default: + return null + } +} diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActions.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActions.tsx new file mode 100644 index 0000000000..14dd80f39c --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActions.tsx @@ -0,0 +1,121 @@ +import { EmptyState, Flex } from '@pluralsh/design-system' +import { POLL_INTERVAL } from 'components/cd/ContinuousDeployment' +import { GqlError } from 'components/utils/Alert' +import { TableSkeleton } from 'components/utils/SkeletonLoaders' +import { CaptionP } from 'components/utils/typography/Text' +import { + useWorkbenchJobActionsQuery, + WorkbenchJobActionFragment, +} from 'generated/graphql' +import { isEmpty } from 'lodash' +import { useMemo, useState } from 'react' +import styled, { useTheme } from 'styled-components' +import { WorkbenchJobActionCard } from './WorkbenchJobActionCard' +import { WorkbenchJobActionDetail } from './WorkbenchJobActionDetail' +import { + groupWorkbenchJobActions, + mapActionNodes, +} from './workbenchJobActionsUtils' + +export function WorkbenchJobActions({ jobId }: { jobId: string }) { + const theme = useTheme() + const [selectedId, setSelectedId] = useState(null) + + const { data, loading, error } = useWorkbenchJobActionsQuery({ + variables: { id: jobId }, + skip: !jobId, + fetchPolicy: 'cache-and-network', + pollInterval: POLL_INTERVAL, + }) + + const actions = useMemo( + () => mapActionNodes(data?.workbenchJob?.activities?.edges), + [data] + ) + const sections = useMemo( + () => groupWorkbenchJobActions(actions, theme), + [actions, theme] + ) + const selected = useMemo( + () => actions.find((action) => action.id === selectedId) ?? null, + [actions, selectedId] + ) + + if (selected) { + return ( + setSelectedId(null)} + /> + ) + } + + if (error && isEmpty(actions)) { + return + } + + if (loading && isEmpty(actions)) { + return ( + + ) + } + + if (isEmpty(sections)) { + return + } + + return ( + + {sections.map((section) => ( + + + {section.icon} + + {section.label} {section.count} + + + + {section.actions.map((activity: WorkbenchJobActionFragment) => ( + setSelectedId(activity.id)} + /> + ))} + + + ))} + + ) +} + +const ListSC = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.xlarge, +})) + +const SectionSC = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.small, +})) + +const CardsSC = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.xsmall, +})) diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobActivity.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobActivity.tsx index 7278a23770..bc1c3dbcde 100644 --- a/assets/src/components/workbenches/workbench/job/WorkbenchJobActivity.tsx +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobActivity.tsx @@ -52,10 +52,10 @@ import { JobActivityMetrics, JobActivityMetricsChart, JobActivityPrompt, - MemoActivityIcon, ExpandableUserPrompt, } from './WorkbenchJobActivityResults' import { WorkbenchJobCanvas } from './WorkbenchJobCanvas' +import { WorkbenchJobInlineActionCard } from './WorkbenchJobInlineActionCard' export function WorkbenchJobActivity({ isOpen, @@ -77,6 +77,12 @@ export function WorkbenchJobActivity({ const isRunning = isJobRunning(status) const isRejected = status === WorkbenchJobActivityStatus.Rejected + if ( + type === WorkbenchJobActivityType.Function || + type === WorkbenchJobActivityType.Kubernetes + ) + return + if (type === WorkbenchJobActivityType.Conclusion) return (
@@ -115,9 +121,6 @@ export function WorkbenchJobActivity({ > {type?.toLowerCase() ?? 'activity'} - {result?.jobUpdate && ( - - )} {!isEmpty(result?.logs) && ( - {result?.jobUpdate && } {(isFailed || isRejected) && ( setFinishedAnimating(true)} - header="Memo" + header={workingTheory ? 'Working theory' : 'Memo'} size="large" > {finishedAnimating ? ( @@ -348,7 +357,7 @@ function WorkbenchJobMemo({ css={{ wordBreak: 'break-word' }} /> )} - {content && } + {fullText && } ) : ( -}) { - const newValue = jobUpdate?.workingTheory ?? jobUpdate?.conclusion ?? '' - const oldValue = useMemo( - () => getOldContentFromTextDiff(newValue, jobUpdate?.diff), - [newValue, jobUpdate?.diff] - ) - return ( - - } - /> - ) -} const EXPANDABLE_PROMPT_LENGTH = 400 export function ExpandableUserPrompt({ diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobInlineActionCard.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobInlineActionCard.tsx new file mode 100644 index 0000000000..a35968de8a --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobInlineActionCard.tsx @@ -0,0 +1,316 @@ +import { + Button, + CaretDownIcon, + Code, + FailedFilledIcon, + Flex, + IconFrame, + KubernetesIcon, + StatusOkIcon, +} from '@pluralsh/design-system' +import { GqlError } from 'components/utils/Alert' +import { StackedText } from 'components/utils/table/StackedText' +import { CaptionP } from 'components/utils/typography/Text' +import { + useApproveWorkbenchJobActivityMutation, + useRejectWorkbenchJobActivityMutation, + WorkbenchJobActivityFragment, + WorkbenchJobActivityStatus, + WorkbenchJobActivityType, +} from 'generated/graphql' +import { useState } from 'react' +import styled, { useTheme } from 'styled-components' +import { formatDateTime } from 'utils/datetime' +import { + getActionDescription, + getActionIcon, + getActionInputJson, + getActionResultJson, + getActionStatusBorderColor, + getActionSubtitle, + getActionTitle, +} from './workbenchJobActionsUtils' +import { getKubeActionVariant } from './workbenchJobKubeActionUtils' +import { + WorkbenchJobKubeActionChips, + WorkbenchJobKubeUpdateDiff, +} from './WorkbenchJobKubeUpdateDiff' +import { WorkbenchJobActionDenialResult } from './WorkbenchJobActionDenialResult' +import { WorkbenchJobActionDenyButton } from './WorkbenchJobActionDenyPopover' +import { WorkbenchJobActionStatusChip } from './WorkbenchJobActionStatusChip' + +export function WorkbenchJobInlineActionCard({ + activity, +}: { + activity: WorkbenchJobActivityFragment +}) { + const theme = useTheme() + const [expanded, setExpanded] = useState( + activity.status === WorkbenchJobActivityStatus.NeedsApproval + ) + const [error, setError] = useState(null) + const needsApproval = + activity.status === WorkbenchJobActivityStatus.NeedsApproval + const isKubernetes = activity.type === WorkbenchJobActivityType.Kubernetes + const kubeVariant = getKubeActionVariant(activity.result?.kubeRequest?.method) + const isKubeDiff = + isKubernetes && (kubeVariant === 'update' || kubeVariant === 'delete') + const inputJson = getActionInputJson(activity) + const isDenied = + activity.status === WorkbenchJobActivityStatus.Cancelled || + activity.status === WorkbenchJobActivityStatus.Rejected + const resultJson = isDenied ? '' : getActionResultJson(activity) + const icon = getActionIcon(activity) + + const refetchQueries = [ + 'WorkbenchJobActivities', + 'WorkbenchJobActions', + 'WorkbenchJobActionSummary', + ] + const [approve, { loading: approving }] = + useApproveWorkbenchJobActivityMutation({ + variables: { id: activity.id }, + onError: (err) => setError(err.message), + refetchQueries, + }) + const [reject, { loading: rejecting, error: rejectError }] = + useRejectWorkbenchJobActivityMutation({ + refetchQueries, + }) + + return ( + + + + } + css={{ + flexShrink: 0, + border: theme.borders.default, + backgroundColor: 'transparent', + }} + /> + + + + } + /> + setExpanded((value) => !value)} + $expanded={expanded} + > + + + + + + {expanded && ( + <> + {error && } + {!isKubeDiff && ( + + {getActionDescription(activity)} + + )} + {isKubeDiff ? ( + + ) : ( + <> + {!!inputJson && ( + + INPUT + + {inputJson} + + + )} + {!!resultJson && ( + + RESULT + + {resultJson} + + + )} + + )} + + {!isKubeDiff && !!activity.insertedAt && ( + + Start time + + {formatDateTime( + activity.insertedAt, + 'YYYY-MM-DD HH:mm:ss [UTC]', + false, + true + )} + + + )} + {needsApproval && ( + + + reject({ + variables: { + id: activity.id, + reason: reason || undefined, + }, + }) + } + /> + + + )} + + )} + + ) +} + +function InlineActionStatus({ + activity, +}: { + activity: WorkbenchJobActivityFragment +}) { + if (activity.status === WorkbenchJobActivityStatus.Successful) + return ( + + ) + if (activity.status === WorkbenchJobActivityStatus.Failed) + return ( + + ) + + return +} + +const CardSC = styled.div<{ $status: WorkbenchJobActivityStatus }>( + ({ theme, $status }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.medium, + width: '100%', + minWidth: 0, + padding: theme.spacing.medium, + border: theme.borders.default, + borderLeft: `2px solid ${getActionStatusBorderColor(theme, $status)}`, + borderRadius: theme.borderRadiuses.large, + background: theme.colors['fill-zero'], + overflow: 'hidden', + marginBottom: theme.spacing.small, + }) +) + +const HeaderSC = styled.div({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: 16, + minWidth: 0, + width: '100%', +}) + +const HeaderActionsSC = styled.div({ + display: 'flex', + alignItems: 'center', + gap: 16, + flexShrink: 0, +}) + +const ExpandButtonSC = styled.button<{ $expanded: boolean }>( + ({ theme, $expanded }) => ({ + ...theme.partials.reset.button, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + color: theme.colors['icon-light'], + transform: $expanded ? 'rotate(180deg)' : undefined, + transition: 'transform 150ms ease', + '&:hover': { color: theme.colors['icon-default'] }, + '&:focus-visible': { outline: theme.borders['outline-focused'] }, + }) +) + +const ActionData = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.xxsmall, + minWidth: 0, + width: '100%', +})) + +const ApprovalActionsSC = styled.div({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + width: '100%', +}) + +const TimeSC = styled.div(({ theme }) => ({ + ...theme.partials.text.caption, + display: 'flex', + alignItems: 'center', + gap: theme.spacing.xxsmall, + color: theme.colors['text-xlight'], + fontSize: 10, + strong: { + color: theme.colors['text-light'], + fontWeight: 400, + }, +})) diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobKubeUpdateDiff.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobKubeUpdateDiff.tsx new file mode 100644 index 0000000000..1974a46c9a --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobKubeUpdateDiff.tsx @@ -0,0 +1,200 @@ +import { + Chip, + DiffMethod, + DiffViewer, + Flex, + TrashCanIcon, +} from '@pluralsh/design-system' +import { GqlError } from 'components/utils/Alert' +import { RectangleSkeleton } from 'components/utils/SkeletonLoaders' +import { CaptionP } from 'components/utils/typography/Text' +import { + useWorkbenchJobKubeRequestDiffQuery, + WorkbenchJobActivityType, +} from 'generated/graphql' +import { ReactNode } from 'react' +import styled, { useTheme } from 'styled-components' +import { + getKubeActionVariant, + getKubeDeleteDiffValues, + getKubeDeleteResourceLabel, + getKubeDeleteWarning, + getKubeUpdateDiffValues, + isKubeSecretRequest, + KubeRequestLike, + toKubeYaml, +} from './workbenchJobKubeActionUtils' + +export function WorkbenchJobKubeUpdateDiff({ + activityId, + kubeRequest, + enabled, +}: { + activityId: string + kubeRequest: KubeRequestLike | null | undefined + enabled: boolean +}) { + const theme = useTheme() + const variant = getKubeActionVariant(kubeRequest?.method) + const shouldFetch = variant === 'update' || variant === 'delete' + const { data, loading, error } = useWorkbenchJobKubeRequestDiffQuery({ + variables: { id: activityId }, + skip: !enabled || !activityId || !shouldFetch, + fetchPolicy: 'network-only', + }) + + if (!shouldFetch) return null + + const liveKube = data?.workbenchJobActivity?.result?.kubeRequest + const kube = liveKube ?? kubeRequest + const secretProtected = isKubeSecretRequest(kube) + const { oldValue, newValue } = + variant === 'delete' + ? getKubeDeleteDiffValues(kube) + : getKubeUpdateDiffValues(kube) + const isDelete = variant === 'delete' + + if (loading && !liveKube) { + return ( + + {isDelete && } + + {isDelete + ? getKubeDeleteResourceLabel(kubeRequest).toUpperCase() + : 'DIFF'} + + + + ) + } + + if (error && !oldValue && !newValue && !secretProtected) { + return + } + + if (secretProtected && !oldValue && !newValue) { + return ( + + {isDelete && } + + {isDelete ? getKubeDeleteResourceLabel(kube).toUpperCase() : 'DIFF'} + + + Secret payloads are hidden from workbench readers. Approve or deny + based on the request path and method. + + + ) + } + + if (!newValue && !oldValue) return null + + return ( + + {isDelete && } + + {isDelete ? getKubeDeleteResourceLabel(kube).toUpperCase() : 'DIFF'} + + {error && } + + + ) +} + +function DeleteWarningBanner({ + kubeRequest, +}: { + kubeRequest: KubeRequestLike | null | undefined +}) { + return ( + + + {getKubeDeleteWarning(kubeRequest)} + + ) +} + +export function WorkbenchJobKubeActionChips({ + type, + method, + statusChip, +}: { + type: Nullable + method: string | null | undefined + statusChip: ReactNode +}) { + if (type !== WorkbenchJobActivityType.Kubernetes) { + return <>{statusChip} + } + + const variant = getKubeActionVariant(method) + + return ( + + {variant === 'update' && ( + + Update + + )} + {variant === 'delete' && ( + + Delete + + )} + {statusChip} + + ) +} + +const DiffSectionSC = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing.xxsmall, + minWidth: 0, + width: '100%', +})) + +const DeleteWarningSC = styled.div(({ theme }) => ({ + ...theme.partials.text.caption, + display: 'flex', + alignItems: 'center', + gap: theme.spacing.small, + width: '100%', + padding: theme.spacing.small, + marginBottom: theme.spacing.xsmall, + borderRadius: 12, + backgroundColor: theme.colors.red[900], + border: `1px solid ${theme.colors.red[850]}`, + color: theme.colors['text-danger-light'], +})) diff --git a/assets/src/components/workbenches/workbench/job/WorkbenchJobPanel.tsx b/assets/src/components/workbenches/workbench/job/WorkbenchJobPanel.tsx index f1856b933e..a93e8f3adc 100644 --- a/assets/src/components/workbenches/workbench/job/WorkbenchJobPanel.tsx +++ b/assets/src/components/workbenches/workbench/job/WorkbenchJobPanel.tsx @@ -5,6 +5,7 @@ import { GaugeIcon, GraphIcon, IconFrame, + LightningIcon, PaperCheckIcon, PrIcon, SubTab, @@ -44,6 +45,7 @@ import { import styled, { useTheme } from 'styled-components' import { isNonNullable } from 'utils/isNonNullable' import { isJobRunning } from './WorkbenchJobActivity' +import { WorkbenchJobActions } from './WorkbenchJobActions' import { WorkbenchJobCanvas } from './WorkbenchJobCanvas' import { PATCH_PR_URL, @@ -55,10 +57,17 @@ import { } from './WorkbenchJobResult' import { hasWorkbenchJobResultContent } from './workbenchJobResultUtils' import { WorkbenchJobUsage } from './WorkbenchJobUsage' +import { useWorkbenchJobActionSummary } from './useWorkbenchJobActionSummary' const SIDE_PANEL_TYPE: SidePanel = 'workbench-job' type JobPanelTab = - 'Result' | 'Dashboard' | 'Topology' | 'Pull requests' | 'Eval' | 'Usage' + | 'Result' + | 'Dashboard' + | 'Topology' + | 'Pull requests' + | 'Eval' + | 'Usage' + | 'Actions' export function WorkbenchJobPanelContent() { const { spacing } = useTheme() @@ -82,6 +91,11 @@ export function WorkbenchJobPanelContent() { variables: { id: jobId }, fetchPolicy: 'cache-first', }) + const { + hasActions, + hasActionsAwaitingApproval, + isLoading: areActionsLoading, + } = useWorkbenchJobActionSummary(jobId) const job = data?.workbenchJob const isLoading = loading && !job const activities = useMemo( @@ -142,8 +156,21 @@ export function WorkbenchJobPanelContent() { const hasDraftPrsAwaitingApproval = draftPrs.length > 0 const tabs = useMemo( - () => getPanelTabs(job, hasDraftPrsAwaitingApproval, isLoading), - [hasDraftPrsAwaitingApproval, isLoading, job] + () => + getPanelTabs( + job, + hasDraftPrsAwaitingApproval, + hasActions, + hasActionsAwaitingApproval, + isLoading + ), + [ + hasActions, + hasActionsAwaitingApproval, + hasDraftPrsAwaitingApproval, + isLoading, + job, + ] ) useEffect(() => { @@ -153,8 +180,9 @@ export function WorkbenchJobPanelContent() { }, [selectedTab, tabs]) useEffect(() => { - if (!isLoading && job && isEmpty(tabs)) setOpen(false) - }, [isLoading, job, setOpen, tabs]) + if (isLoading || areActionsLoading) return + if (job && isEmpty(tabs)) setOpen(false) + }, [areActionsLoading, isLoading, job, setOpen, tabs]) return ( @@ -235,6 +263,9 @@ export function WorkbenchJobPanelContent() { {selectedTab === 'Usage' && job?.usage && ( )} + {selectedTab === 'Actions' && job?.id && ( + + )} @@ -301,6 +332,8 @@ const PanelSubTabSC = styled(SubTab)(({ theme, active }) => ({ const getPanelTabs = ( job: Nullable, hasDraftPrsAwaitingApproval: boolean, + hasActions: boolean, + hasActionsAwaitingApproval: boolean, isLoading: boolean ) => [ @@ -329,6 +362,11 @@ const getPanelTabs = ( label: 'Usage', icon: , }, + hasActions && { + label: 'Actions', + icon: , + showDot: hasActionsAwaitingApproval, + }, ].filter( ( tab diff --git a/assets/src/components/workbenches/workbench/job/useWorkbenchJobActionSummary.ts b/assets/src/components/workbenches/workbench/job/useWorkbenchJobActionSummary.ts new file mode 100644 index 0000000000..df03eb3597 --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/useWorkbenchJobActionSummary.ts @@ -0,0 +1,22 @@ +import { POLL_INTERVAL } from 'components/cd/ContinuousDeployment' +import { useWorkbenchJobActionSummaryQuery } from 'generated/graphql' + +export function useWorkbenchJobActionSummary(jobId: string) { + const { data, loading } = useWorkbenchJobActionSummaryQuery({ + skip: !jobId, + variables: { id: jobId }, + fetchPolicy: 'cache-and-network', + pollInterval: POLL_INTERVAL, + }) + const job = data?.workbenchJob + + return { + hasActions: + (job?.functionActions?.edges ?? []).some((edge) => !!edge?.node?.id) || + (job?.kubernetesActions?.edges ?? []).some((edge) => !!edge?.node?.id), + hasActionsAwaitingApproval: (job?.pendingActions?.edges ?? []).some( + (edge) => !!edge?.node?.id + ), + isLoading: loading && !data, + } +} diff --git a/assets/src/components/workbenches/workbench/job/workbenchJobActionsUtils.tsx b/assets/src/components/workbenches/workbench/job/workbenchJobActionsUtils.tsx new file mode 100644 index 0000000000..6546804865 --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/workbenchJobActionsUtils.tsx @@ -0,0 +1,329 @@ +import { + CancelledFilledIcon, + StatusIpIcon, + StatusOkIcon, + TrashCanIcon, + UpdatesIcon, + WarningIcon, +} from '@pluralsh/design-system' +import { + getWorkbenchToolLabel, + WorkbenchToolIcon, +} from 'components/workbenches/tools/workbenchToolsUtils' +import { + WorkbenchJobActionFragment, + WorkbenchJobActivityStatus, + WorkbenchJobActivityType, +} from 'generated/graphql' +import { ComponentType, ReactElement } from 'react' +import { DefaultTheme } from 'styled-components' +import { isNonNullable } from 'utils/isNonNullable' +import { + getKubeActionSubtitle, + getKubeActionTitle, + getKubeActionVariant, +} from './workbenchJobKubeActionUtils' + +export type WorkbenchJobActionSectionKey = + 'awaiting' | 'pending' | 'running' | 'failed' | 'succeeded' | 'denied' + +export type WorkbenchJobActionSection = { + key: WorkbenchJobActionSectionKey + label: string + count: number + actions: WorkbenchJobActionFragment[] + icon: ReactElement + iconColor: string +} + +const ACTION_TYPES = new Set([ + WorkbenchJobActivityType.Function, + WorkbenchJobActivityType.Kubernetes, +]) + +export function isWorkbenchJobAction( + activity: WorkbenchJobActionFragment +): boolean { + return !!activity.type && ACTION_TYPES.has(activity.type) +} + +export function getActionStatusBorderColor( + theme: DefaultTheme, + status: Nullable +) { + switch (status) { + case WorkbenchJobActivityStatus.NeedsApproval: + return theme.colors['border-warning'] + case WorkbenchJobActivityStatus.Pending: + return theme.colors['border-input'] + case WorkbenchJobActivityStatus.Running: + return theme.colors['border-info'] + case WorkbenchJobActivityStatus.Successful: + return theme.colors['border-success'] + case WorkbenchJobActivityStatus.Failed: + return theme.colors['border-danger'] + case WorkbenchJobActivityStatus.Cancelled: + case WorkbenchJobActivityStatus.Rejected: + return theme.colors['border-input'] + default: + return theme.colors.border + } +} + +export function getActionSectionKey( + status: Nullable +): WorkbenchJobActionSectionKey | null { + switch (status) { + case WorkbenchJobActivityStatus.NeedsApproval: + return 'awaiting' + case WorkbenchJobActivityStatus.Pending: + return 'pending' + case WorkbenchJobActivityStatus.Running: + return 'running' + case WorkbenchJobActivityStatus.Failed: + return 'failed' + case WorkbenchJobActivityStatus.Successful: + return 'succeeded' + case WorkbenchJobActivityStatus.Cancelled: + case WorkbenchJobActivityStatus.Rejected: + return 'denied' + default: + return null + } +} + +export function groupWorkbenchJobActions( + activities: WorkbenchJobActionFragment[], + theme: DefaultTheme +): WorkbenchJobActionSection[] { + const buckets: Record< + WorkbenchJobActionSectionKey, + WorkbenchJobActionFragment[] + > = { + awaiting: [], + pending: [], + running: [], + failed: [], + succeeded: [], + denied: [], + } + + for (const activity of activities) { + if (!isWorkbenchJobAction(activity)) continue + const key = getActionSectionKey(activity.status) + if (key) buckets[key].push(activity) + } + + const meta: Record< + WorkbenchJobActionSectionKey, + { + label: string + icon: ComponentType<{ size?: number; color?: string }> + iconColor: string + } + > = { + awaiting: { + label: 'Awaiting approval', + icon: WarningIcon, + iconColor: theme.colors['icon-warning'], + }, + pending: { + label: 'Pending', + icon: StatusIpIcon, + iconColor: theme.colors['icon-light'], + }, + running: { + label: 'Running', + icon: StatusIpIcon, + iconColor: theme.colors['icon-light'], + }, + failed: { + label: 'Failed', + icon: CancelledFilledIcon, + iconColor: theme.colors['icon-danger'], + }, + succeeded: { + label: 'Succeeded', + icon: StatusOkIcon, + iconColor: theme.colors['icon-success'], + }, + denied: { + label: 'Denied', + icon: CancelledFilledIcon, + iconColor: theme.colors['icon-light'], + }, + } + + return (Object.keys(buckets) as WorkbenchJobActionSectionKey[]) + .map((key) => { + const actions = buckets[key] + const { label, icon: Icon, iconColor } = meta[key] + return { + key, + label, + count: actions.length, + actions, + icon: ( + + ), + iconColor, + } + }) + .filter((section) => section.count > 0) +} + +export function getActionDetailButtonLabel( + activity: Pick +): string { + const isKubernetes = activity.type === WorkbenchJobActivityType.Kubernetes + + switch (activity.status) { + case WorkbenchJobActivityStatus.NeedsApproval: + return 'View diff' + case WorkbenchJobActivityStatus.Failed: + return 'View error' + case WorkbenchJobActivityStatus.Successful: + return isKubernetes ? 'View results' : 'View JSON' + case WorkbenchJobActivityStatus.Cancelled: + case WorkbenchJobActivityStatus.Rejected: + return 'View reason' + case WorkbenchJobActivityStatus.Pending: + case WorkbenchJobActivityStatus.Running: + return 'View details' + default: + return 'View details' + } +} + +export function getActionTitle(activity: WorkbenchJobActionFragment): string { + const toolName = activity.result?.functionCall?.tool?.name?.trim() + if (toolName) return toolName + + if (activity.type === WorkbenchJobActivityType.Kubernetes) { + return getKubeActionTitle(activity.result?.kubeRequest) + } + + return ( + activity.result?.functionCall?.name?.trim() || + activity.prompt?.trim() || + 'Action' + ) +} + +export function getActionSubtitle( + activity: WorkbenchJobActionFragment +): string { + if (activity.type === WorkbenchJobActivityType.Kubernetes) { + return getKubeActionSubtitle(activity.result?.kubeRequest) + } + + const toolType = activity.result?.functionCall?.tool?.tool + if (toolType) return getWorkbenchToolLabel(toolType) + + return activity.result?.functionCall?.name?.trim() || 'Function' +} + +export function getActionDescription( + activity: WorkbenchJobActionFragment +): string { + const tool = activity.result?.functionCall?.tool + const description = + tool?.configuration?.lambda?.description?.trim() || + tool?.configuration?.cloudRun?.description?.trim() || + tool?.configuration?.azureFunction?.description?.trim() + if (description) return description + + const output = activity.result?.output?.trim() + if (output && output !== 'waiting for user approval') return output + + const prompt = activity.prompt?.trim() + if (prompt && !prompt.toLowerCase().startsWith('function call:')) + return prompt + + return `${getActionTitle(activity)} action` +} + +export function getActionIcon(activity: WorkbenchJobActionFragment) { + if (activity.type === WorkbenchJobActivityType.Kubernetes) { + const variant = getKubeActionVariant(activity.result?.kubeRequest?.method) + if (variant === 'delete') { + return ( + + ) + } + return + } + + const toolType = activity.result?.functionCall?.tool?.tool + if (!toolType) return null + + return ( + + ) +} + +export function formatActionJson(value: unknown): string { + if (value == null) return '' + if (typeof value === 'string') { + try { + return JSON.stringify(JSON.parse(value), null, 2) + } catch { + return value + } + } + try { + return JSON.stringify(value, null, 2) + } catch { + return String(value) + } +} + +export function getActionInputJson( + activity: WorkbenchJobActionFragment +): string { + const input = activity.result?.functionCall?.input + if (input != null) return formatActionJson(input) + + const kube = activity.result?.kubeRequest + if (kube) { + return formatActionJson({ + handle: kube.handle, + method: kube.method, + path: kube.path, + queryParams: kube.queryParams, + contentType: kube.contentType, + }) + } + + return '' +} + +export function getActionResultJson( + activity: WorkbenchJobActionFragment +): string { + if (activity.result?.error?.trim()) { + return activity.result.error.trim() + } + if (activity.result?.output != null) { + return formatActionJson(activity.result.output) + } + return '' +} + +export function mapActionNodes( + edges: Nullable }>[]> +): WorkbenchJobActionFragment[] { + return (edges?.map((edge) => edge?.node).filter(isNonNullable) ?? []).filter( + isWorkbenchJobAction + ) +} diff --git a/assets/src/components/workbenches/workbench/job/workbenchJobKubeActionUtils.ts b/assets/src/components/workbenches/workbench/job/workbenchJobKubeActionUtils.ts new file mode 100644 index 0000000000..50c5138ccb --- /dev/null +++ b/assets/src/components/workbenches/workbench/job/workbenchJobKubeActionUtils.ts @@ -0,0 +1,216 @@ +import { dump } from 'js-yaml' + +export type KubeActionVariant = 'update' | 'delete' | 'other' + +export type ParsedKubePath = { + namespace?: string + resource?: string + name?: string +} + +export type KubeRequestLike = { + handle?: string | null + method?: string | null + path?: string | null + body?: string | null + current?: unknown +} + +export function getKubeActionVariant( + method: string | null | undefined +): KubeActionVariant { + switch (method?.toLowerCase()) { + case 'delete': + return 'delete' + case 'put': + case 'patch': + case 'post': + return 'update' + default: + return 'other' + } +} + +export function parseKubePath( + path: string | null | undefined +): ParsedKubePath | null { + if (!path?.trim()) return null + const segments = path.split('/').filter(Boolean) + const nsIdx = segments.indexOf('namespaces') + if (nsIdx >= 0) { + return { + namespace: segments[nsIdx + 1], + resource: segments[nsIdx + 2], + name: segments[nsIdx + 3], + } + } + if (segments.length >= 2) { + return { + resource: segments.at(-2), + name: segments.at(-1), + } + } + return null +} + +export function formatKubeKindLabel( + resource: string | undefined +): string | undefined { + if (!resource) return undefined + return resource + .split(/[-_]/) + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join('') +} + +export function getKubeActionTitle(kube: KubeRequestLike | null | undefined) { + const variant = getKubeActionVariant(kube?.method) + const parsed = parseKubePath(kube?.path) + const kind = formatKubeKindLabel(parsed?.resource) + + if (variant === 'delete' && kind && parsed?.name) { + return `${kind}/${parsed.name}` + } + if (kind) return kind + return kube?.method?.toUpperCase() || 'Kubernetes action' +} + +export function getKubeActionSubtitle( + kube: KubeRequestLike | null | undefined +) { + const variant = getKubeActionVariant(kube?.method) + const parsed = parseKubePath(kube?.path) + const nsLabel = parsed?.namespace ? `ns/${parsed.namespace}` : null + + if (variant === 'delete') { + return ( + [nsLabel, kube?.handle].filter(Boolean).join(' · ') || + kube?.handle || + 'Kubernetes' + ) + } + + if (variant === 'update') { + const resourcePath = + parsed?.resource && parsed?.name + ? `${parsed.resource}/${parsed.name}` + : parsed?.resource + return ( + [nsLabel, resourcePath].filter(Boolean).join(' · ') || + kube?.handle || + 'Kubernetes' + ) + } + + const path = kube?.path?.trim() + if (!path) return kube?.handle || 'Kubernetes' + return [kube?.handle, path].filter(Boolean).join(' · ') +} + +function sanitizeForDiff(value: unknown): unknown { + if (!value || typeof value !== 'object' || Array.isArray(value)) return value + const record = { ...(value as Record) } + delete record.status + if (record.metadata && typeof record.metadata === 'object') { + const metadata = { ...(record.metadata as Record) } + delete metadata.managedFields + delete metadata.resourceVersion + delete metadata.uid + delete metadata.generation + delete metadata.creationTimestamp + record.metadata = metadata + } + return record +} + +function parseKubeBody(body: string | null | undefined): unknown { + if (!body?.trim()) return null + try { + return JSON.parse(body) + } catch { + return body + } +} + +export function toKubeYaml(value: unknown): string { + if (value == null) return '' + if (typeof value === 'string') { + const trimmed = value.trim() + if (!trimmed) return '' + try { + return dump(sanitizeForDiff(JSON.parse(trimmed)), { + lineWidth: -1, + noRefs: true, + }).trimEnd() + } catch { + return trimmed + } + } + try { + return dump(sanitizeForDiff(value), { + lineWidth: -1, + noRefs: true, + }).trimEnd() + } catch { + return String(value) + } +} + +export function getKubeUpdateDiffValues( + kube: KubeRequestLike | null | undefined +): { oldValue: string; newValue: string } { + const proposed = parseKubeBody(kube?.body) + const newValue = toKubeYaml(proposed ?? kube?.body) + const oldValue = toKubeYaml(kube?.current) + return { oldValue, newValue } +} + +/** Full-file delete treatment: entire current object as removals. */ +export function getKubeDeleteDiffValues( + kube: KubeRequestLike | null | undefined +): { oldValue: string; newValue: string } { + return { + oldValue: toKubeYaml(kube?.current), + newValue: '', + } +} + +export function getKubeDeleteResourceLabel( + kube: KubeRequestLike | null | undefined +): string { + const parsed = parseKubePath(kube?.path) + const nsLabel = parsed?.namespace ? `ns/${parsed.namespace}` : null + const name = parsed?.name + return [nsLabel, name].filter(Boolean).join(' · ') || kube?.path || 'resource' +} + +export function getKubeDeleteWarning( + kube: KubeRequestLike | null | undefined +): string { + return `This permanently deletes ${getKubeDeleteResourceLabel(kube)} below. This can't be undone from the workbench.` +} + +export function isKubeSecretPath(path: string | null | undefined): boolean { + if (!path) return false + return path.includes('/secrets/') || path.endsWith('/secrets') +} + +export function isKubeSecretBody(body: string | null | undefined): boolean { + if (!body?.trim()) return false + try { + const parsed = JSON.parse(body) as { + kind?: string + items?: Array<{ kind?: string }> + } + if (parsed.kind === 'Secret' || parsed.kind === 'SecretList') return true + return parsed.items?.[0]?.kind === 'Secret' + } catch { + return false + } +} + +export function isKubeSecretRequest( + kube: KubeRequestLike | null | undefined +): boolean { + return isKubeSecretPath(kube?.path) || isKubeSecretBody(kube?.body) +} diff --git a/assets/src/components/workbenches/workbench/job/workbenchJobResultUtils.ts b/assets/src/components/workbenches/workbench/job/workbenchJobResultUtils.ts index dbe714cda7..76867a577d 100644 --- a/assets/src/components/workbenches/workbench/job/workbenchJobResultUtils.ts +++ b/assets/src/components/workbenches/workbench/job/workbenchJobResultUtils.ts @@ -2,6 +2,7 @@ import { WorkbenchJobFragment, WorkbenchJobResultFragment, } from 'generated/graphql' +import { isEmpty } from 'lodash' import { isJobRunning } from './WorkbenchJobActivity' export function getWorkbenchJobTodos( @@ -34,3 +35,18 @@ export function hasWorkbenchJobResultContent( getWorkbenchJobTodos(job?.result).length > 0 ) } + +export function hasWorkbenchJobPanelContent( + job: Nullable, + hasActions = false +) { + return ( + hasWorkbenchJobResultContent(job) || + !isEmpty(job?.result?.canvas) || + !!job?.result?.topology || + !isEmpty(job?.pullRequests) || + !!job?.evalResult || + !!job?.usage || + hasActions + ) +} diff --git a/assets/src/generated/graphql.ts b/assets/src/generated/graphql.ts index 9468fd49ef..262da65dbf 100644 --- a/assets/src/generated/graphql.ts +++ b/assets/src/generated/graphql.ts @@ -11053,6 +11053,7 @@ export type RootQueryType = { workbenchChatbot?: Maybe; workbenchIssues?: Maybe; workbenchJob?: Maybe; + workbenchJobActivities?: Maybe; workbenchJobActivity?: Maybe; /** Semantic search over vector-indexed workbench jobs */ workbenchJobSearch?: Maybe>>; @@ -12472,6 +12473,16 @@ export type RootQueryTypeWorkbenchJobArgs = { }; +export type RootQueryTypeWorkbenchJobActivitiesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + status?: InputMaybe; + type?: InputMaybe; +}; + + export type RootQueryTypeWorkbenchJobActivityArgs = { id: Scalars['ID']['input']; }; @@ -15999,6 +16010,8 @@ export type WorkbenchJobActivitiesArgs = { before?: InputMaybe; first?: InputMaybe; last?: InputMaybe; + status?: InputMaybe; + type?: InputMaybe; }; @@ -16039,7 +16052,7 @@ export type WorkbenchJobActivity = { /** the type of the activity */ type?: Maybe; updatedAt?: Maybe; - /** the user who created this activity */ + /** the user who created or denied this activity */ user?: Maybe; /** whimsically describes current progress for you */ whimsey?: Maybe; @@ -16071,6 +16084,8 @@ export type WorkbenchJobActivityFunctionCall = { input?: Maybe; /** the function name to invoke */ name?: Maybe; + /** the workbench tool backing this function call */ + tool?: Maybe; /** the workbench tool id backing this function */ toolId?: Maybe; }; @@ -16087,10 +16102,12 @@ export type WorkbenchJobActivityJobUpdate = { export type WorkbenchJobActivityKubeRequest = { __typename?: 'WorkbenchJobActivityKubeRequest'; - /** the Kubernetes API request body */ + /** the Kubernetes API request body (Secret payloads are redacted) */ body?: Maybe; /** the Kubernetes API request content type */ contentType?: Maybe; + /** the live kubernetes object at this path, used to render update diffs. expensive and should be requested only when reviewing an action */ + current?: Maybe; /** the target cluster handle */ handle?: Maybe; /** the Kubernetes API HTTP method */ @@ -16249,6 +16266,29 @@ export type WorkbenchJobEdge = { node?: Maybe; }; +export type WorkbenchJobKubernetesModes = { + __typename?: 'WorkbenchJobKubernetesModes'; + /** whether kubernetes delete actions are enabled */ + delete?: Maybe; + /** namespaces the agent can never act in */ + excludeNamespaces?: Maybe>>; + /** if set, actions are only allowed in these namespaces */ + requireNamespaces?: Maybe>>; + /** whether kubernetes update actions are enabled */ + update?: Maybe; +}; + +export type WorkbenchJobKubernetesModesAttributes = { + /** whether kubernetes delete actions are enabled */ + delete?: InputMaybe; + /** namespaces the agent can never act in */ + excludeNamespaces?: InputMaybe>>; + /** if set, actions are only allowed in these namespaces */ + requireNamespaces?: InputMaybe>>; + /** whether kubernetes update actions are enabled */ + update?: InputMaybe; +}; + export type WorkbenchJobModel = { __typename?: 'WorkbenchJobModel'; /** the model name for this job */ @@ -16270,6 +16310,8 @@ export type WorkbenchJobModes = { budget?: Maybe; /** coding mode options for this job */ coding?: Maybe; + /** kubernetes action options for this job */ + kubernetes?: Maybe; /** model override for this job */ model?: Maybe; /** whether planning mode is enabled for this job */ @@ -16281,6 +16323,8 @@ export type WorkbenchJobModesAttributes = { budget?: InputMaybe; /** coding mode options for this job */ coding?: InputMaybe; + /** kubernetes action options for this job */ + kubernetes?: InputMaybe; /** model override for this job */ model?: InputMaybe; /** whether planning mode is enabled for this job */ @@ -18274,7 +18318,9 @@ export type RegisterGitHubAppMutation = { __typename?: 'RootMutationType', regis export type AwaitingReviewStackFragment = { __typename?: 'InfrastructureStack', id?: string | null, name: string, status: StackStatus, runs?: { __typename?: 'StackRunConnection', edges?: Array<{ __typename?: 'StackRunEdge', node?: { __typename?: 'StackRun', id: string, status: StackStatus, message?: string | null, approvalResult?: { __typename?: 'StackRunApprovalResult', reason?: string | null, result?: ApprovalResult | null } | null, configuration: { __typename?: 'StackConfiguration', aiApproval?: { __typename?: 'AiApprovalConfiguration', enabled: boolean } | null }, pullRequest?: { __typename?: 'PullRequest', id: string, title?: string | null } | null } | null } | null> | null } | null }; -export type AwaitingReviewAgentRunFragment = { __typename?: 'AgentRun', id: string, status: AgentRunStatus, approvedAt?: string | null, prompt: string, repository: string, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, analysis?: { __typename?: 'AgentAnalysis', summary: string } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null }; +export type AwaitingReviewAgentRunFragment = { __typename?: 'AgentRun', id: string, status: AgentRunStatus, approvedAt?: string | null, prompt: string, repository: string, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, analysis?: { __typename?: 'AgentAnalysis', summary: string } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, insertedAt?: string | null, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null }; + +export type AwaitingReviewWorkbenchActivityFragment = { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, result?: { __typename?: 'WorkbenchJobActivityResult', functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null } | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, insertedAt?: string | null, result?: { __typename?: 'WorkbenchJobResult', workingTheory?: string | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null }; export type PendingApprovalStacksQueryVariables = Exact<{ first?: InputMaybe; @@ -18288,7 +18334,14 @@ export type PendingApprovalAgentRunsQueryVariables = Exact<{ }>; -export type PendingApprovalAgentRunsQuery = { __typename?: 'RootQueryType', agentRuns?: { __typename?: 'AgentRunConnection', edges?: Array<{ __typename?: 'AgentRunEdge', node?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, approvedAt?: string | null, prompt: string, repository: string, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, analysis?: { __typename?: 'AgentAnalysis', summary: string } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null } | null } | null> | null } | null }; +export type PendingApprovalAgentRunsQuery = { __typename?: 'RootQueryType', agentRuns?: { __typename?: 'AgentRunConnection', edges?: Array<{ __typename?: 'AgentRunEdge', node?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, approvedAt?: string | null, prompt: string, repository: string, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, analysis?: { __typename?: 'AgentAnalysis', summary: string } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, insertedAt?: string | null, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null } | null } | null> | null } | null }; + +export type PendingApprovalWorkbenchActivitiesQueryVariables = Exact<{ + first?: InputMaybe; +}>; + + +export type PendingApprovalWorkbenchActivitiesQuery = { __typename?: 'RootQueryType', workbenchJobActivities?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, result?: { __typename?: 'WorkbenchJobActivityResult', functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null } | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, insertedAt?: string | null, result?: { __typename?: 'WorkbenchJobResult', workingTheory?: string | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null } | null } | null> | null } | null }; export type ObjectStoreFragment = { __typename?: 'ObjectStore', id: string, name: string, insertedAt?: string | null, updatedAt?: string | null, s3?: { __typename?: 'S3Store', bucket: string, region?: string | null, endpoint?: string | null, accessKeyId: string } | null, azure?: { __typename?: 'AzureStore', container: string, storageAccount: string, resourceGroup: string, subscriptionId: string, clientId: string, tenantId: string } | null, gcs?: { __typename?: 'GcsStore', bucket: string } | null }; @@ -19624,7 +19677,7 @@ export type FlowWorkbenchesQueryVariables = Exact<{ }>; -export type FlowWorkbenchesQuery = { __typename?: 'RootQueryType', flow?: { __typename?: 'Flow', id: string, workbenches?: Array<{ __typename?: 'Workbench', id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null> | null } | null }; +export type FlowWorkbenchesQuery = { __typename?: 'RootQueryType', flow?: { __typename?: 'Flow', id: string, workbenches?: Array<{ __typename?: 'Workbench', id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null> | null } | null }; export type FlowWorkbenchJobsQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -21078,7 +21131,7 @@ export type ClusterVulnerabilityAggregateQueryVariables = Exact<{ export type ClusterVulnerabilityAggregateQuery = { __typename?: 'RootQueryType', clusterVulnerabilityAggregate?: Array<{ __typename?: 'ClusterVulnAggregate', count: number, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, project?: { __typename?: 'Project', name: string } | null } | null } | null> | null }; -export type WorkbenchTinyFragment = { __typename?: 'Workbench', id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null }; +export type WorkbenchTinyFragment = { __typename?: 'Workbench', id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null }; export type IssueWebhookFragment = { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null }; @@ -21086,11 +21139,11 @@ export type IssueWebhookTinyFragment = { __typename?: 'IssueWebhook', id: string export type WorkbenchWebhookTinyFragment = { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null }; -export type WorkbenchFragment = { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null }; +export type WorkbenchFragment = { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null }; -export type WorkbenchToolTinyFragment = { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null }; +export type WorkbenchToolTinyFragment = { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null }; -export type WorkbenchToolFragment = { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null }; +export type WorkbenchToolFragment = { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null }; export type WorkbenchJobThoughtFragment = { __typename?: 'WorkbenchJobThought', id: string, content?: string | null, toolName?: string | null, toolArgs?: Record | null, activity?: { __typename?: 'WorkbenchJobActivity', id: string } | null, attributes?: { __typename?: 'WorkbenchJobThoughtAttributes', logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, metrics?: Array<{ __typename?: 'WorkbenchJobActivityMetric', timestamp?: string | null, name?: string | null, value?: number | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null } | null }; @@ -21112,25 +21165,25 @@ export type WorkbenchCanvasBlockFragment = { __typename?: 'WorkbenchCanvasBlock' export type WorkbenchJobResultFragment = { __typename?: 'WorkbenchJobResult', id: string, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null }; -export type WorkbenchJobActivityResultFragment = { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null }; +export type WorkbenchJobActivityResultFragment = { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null }; -export type WorkbenchJobActivityFragment = { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null }; +export type WorkbenchJobActivityFragment = { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null }; -export type WorkbenchJobActivityWithThoughtsFragment = { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, thoughts?: Array<{ __typename?: 'WorkbenchJobThought', id: string, content?: string | null, toolName?: string | null, toolArgs?: Record | null, activity?: { __typename?: 'WorkbenchJobActivity', id: string } | null, attributes?: { __typename?: 'WorkbenchJobThoughtAttributes', logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, metrics?: Array<{ __typename?: 'WorkbenchJobActivityMetric', timestamp?: string | null, name?: string | null, value?: number | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null } | null } | null> | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null }; +export type WorkbenchJobActivityWithThoughtsFragment = { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, thoughts?: Array<{ __typename?: 'WorkbenchJobThought', id: string, content?: string | null, toolName?: string | null, toolArgs?: Record | null, activity?: { __typename?: 'WorkbenchJobActivity', id: string } | null, attributes?: { __typename?: 'WorkbenchJobThoughtAttributes', logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, metrics?: Array<{ __typename?: 'WorkbenchJobActivityMetric', timestamp?: string | null, name?: string | null, value?: number | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null } | null } | null> | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null }; export type WorkbenchJobProgressFragment = { __typename?: 'WorkbenchJobProgress', activityId?: string | null, tool?: string | null, text?: string | null, arguments?: Record | null }; export type WorkbenchTextStreamFragment = { __typename?: 'WorkbenchTextStream', activityId?: string | null, text?: string | null }; -export type WorkbenchCronFragment = { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null }; +export type WorkbenchCronFragment = { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null }; export type WorkbenchPromptFragment = { __typename?: 'WorkbenchPrompt', id: string, title: string, category: string, prompt?: string | null, insertedAt?: string | null, updatedAt?: string | null }; -export type WorkbenchWebhookFragment = { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null }; +export type WorkbenchWebhookFragment = { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null }; export type ChatProviderConnectionFragment = { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null }; -export type WorkbenchChatbotFragment = { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null }; +export type WorkbenchChatbotFragment = { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null }; export type WorkbenchIssueFragment = { __typename?: 'Issue', id: string, title: string, externalId: string, provider: IssueWebhookProvider, status: IssueStatus, url: string, insertedAt?: string | null, updatedAt?: string | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null }; @@ -21142,7 +21195,7 @@ export type WorkbenchJobUsageFragment = { __typename?: 'WorkbenchJobUsage', cach export type WorkbenchJobTinyFragment = { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', totalCost?: number | null, totalTokens?: number | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null } | null, issue?: { __typename?: 'Issue', id: string, status: IssueStatus, url: string } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null } | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null }; -export type WorkbenchJobFragment = { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null }; +export type WorkbenchJobFragment = { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null }; export type WorkbenchEvalResultRowFragment = { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, insertedAt?: string | null, startedAt?: string | null, completedAt?: string | null } | null }; @@ -21153,7 +21206,7 @@ export type WorkbenchesQueryVariables = Exact<{ }>; -export type WorkbenchesQuery = { __typename?: 'RootQueryType', workbenches?: { __typename?: 'WorkbenchConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchEdge', node?: { __typename?: 'Workbench', id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null } | null> | null } | null }; +export type WorkbenchesQuery = { __typename?: 'RootQueryType', workbenches?: { __typename?: 'WorkbenchConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchEdge', node?: { __typename?: 'Workbench', id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null } | null> | null } | null }; export type WorkbenchDashboardQueryVariables = Exact<{ [key: string]: never; }>; @@ -21202,7 +21255,7 @@ export type WorkbenchQueryVariables = Exact<{ }>; -export type WorkbenchQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null }; +export type WorkbenchQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null }; export type WorkbenchAccessibleUserFragment = { __typename?: 'User', id: string, name: string, email: string, profile?: string | null }; @@ -21287,7 +21340,7 @@ export type GetWorkbenchCronMutationVariables = Exact<{ }>; -export type GetWorkbenchCronMutation = { __typename?: 'RootMutationType', workbenchCron?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null } | null }; +export type GetWorkbenchCronMutation = { __typename?: 'RootMutationType', workbenchCron?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null } | null }; export type WorkbenchCronsQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -21296,7 +21349,7 @@ export type WorkbenchCronsQueryVariables = Exact<{ }>; -export type WorkbenchCronsQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, crons?: { __typename?: 'WorkbenchCronConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchCronEdge', node?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null } | null } | null> | null } | null } | null }; +export type WorkbenchCronsQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, crons?: { __typename?: 'WorkbenchCronConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchCronEdge', node?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null } | null } | null> | null } | null } | null }; export type UnifiedWorkbenchSkillTinyFragment = { __typename?: 'UnifiedWorkbenchSkill', id?: string | null, name?: string | null, description?: string | null, subagents?: Array | null }; @@ -21323,7 +21376,7 @@ export type WorkbenchWebhooksQueryVariables = Exact<{ }>; -export type WorkbenchWebhooksQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, webhooks?: { __typename?: 'WorkbenchWebhookConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null } | null> | null } | null } | null }; +export type WorkbenchWebhooksQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, webhooks?: { __typename?: 'WorkbenchWebhookConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null } | null> | null } | null } | null }; export type WorkbenchChatbotsQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -21332,14 +21385,14 @@ export type WorkbenchChatbotsQueryVariables = Exact<{ }>; -export type WorkbenchChatbotsQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, chatbots?: { __typename?: 'WorkbenchChatbotConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchChatbotEdge', node?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null } | null> | null } | null } | null }; +export type WorkbenchChatbotsQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, chatbots?: { __typename?: 'WorkbenchChatbotConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchChatbotEdge', node?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null } | null> | null } | null } | null }; export type WorkbenchChatbotQueryVariables = Exact<{ id: Scalars['ID']['input']; }>; -export type WorkbenchChatbotQuery = { __typename?: 'RootQueryType', workbenchChatbot?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null }; +export type WorkbenchChatbotQuery = { __typename?: 'RootQueryType', workbenchChatbot?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null }; export type SearchConversationsQueryVariables = Exact<{ chatConnectionId: Scalars['ID']['input']; @@ -21370,7 +21423,7 @@ export type GetWorkbenchWebhookMutationVariables = Exact<{ }>; -export type GetWorkbenchWebhookMutation = { __typename?: 'RootMutationType', getWorkbenchWebhook?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null }; +export type GetWorkbenchWebhookMutation = { __typename?: 'RootMutationType', getWorkbenchWebhook?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null }; export type IssueWebhooksQueryVariables = Exact<{ first?: InputMaybe; @@ -21393,14 +21446,14 @@ export type WorkbenchTriggersSummaryQueryVariables = Exact<{ }>; -export type WorkbenchTriggersSummaryQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, name: string, description?: string | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, crons?: { __typename?: 'WorkbenchCronConnection', edges?: Array<{ __typename?: 'WorkbenchCronEdge', node?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, nextRunAt?: string | null } | null } | null> | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null } | null> | null } | null, chatbots?: { __typename?: 'WorkbenchChatbotConnection', edges?: Array<{ __typename?: 'WorkbenchChatbotEdge', node?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null } | null> | null } | null } | null }; +export type WorkbenchTriggersSummaryQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', id: string, name: string, description?: string | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, crons?: { __typename?: 'WorkbenchCronConnection', edges?: Array<{ __typename?: 'WorkbenchCronEdge', node?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, nextRunAt?: string | null } | null } | null> | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null } | null> | null } | null, chatbots?: { __typename?: 'WorkbenchChatbotConnection', edges?: Array<{ __typename?: 'WorkbenchChatbotEdge', node?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null } | null> | null } | null } | null }; export type WorkbenchJobQueryVariables = Exact<{ id: Scalars['ID']['input']; }>; -export type WorkbenchJobQuery = { __typename?: 'RootQueryType', workbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null } | null }; +export type WorkbenchJobQuery = { __typename?: 'RootQueryType', workbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null } | null }; export type WorkbenchJobMetricsToolQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -21434,7 +21487,39 @@ export type WorkbenchJobActivitiesQueryVariables = Exact<{ }>; -export type WorkbenchJobActivitiesQuery = { __typename?: 'RootQueryType', workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus, prompt?: string | null, workbench?: { __typename?: 'Workbench', id: string } | null, referencedJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, workbench?: { __typename?: 'Workbench', id: string } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null } | null } | null, activities?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null } | null> | null } | null } | null }; +export type WorkbenchJobActivitiesQuery = { __typename?: 'RootQueryType', workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus, prompt?: string | null, workbench?: { __typename?: 'Workbench', id: string } | null, referencedJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, workbench?: { __typename?: 'Workbench', id: string } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null } | null } | null, activities?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null } | null> | null } | null } | null }; + +export type WorkbenchJobActionSummaryQueryVariables = Exact<{ + id: Scalars['ID']['input']; + first?: InputMaybe; +}>; + + +export type WorkbenchJobActionSummaryQuery = { __typename?: 'RootQueryType', workbenchJob?: { __typename?: 'WorkbenchJob', id: string, pendingActions?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string } | null } | null> | null } | null, functionActions?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string } | null } | null> | null } | null, kubernetesActions?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string } | null } | null> | null } | null } | null }; + +export type WorkbenchJobActionFragment = { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null } | null }; + +export type WorkbenchJobActionsQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type WorkbenchJobActionsQuery = { __typename?: 'RootQueryType', workbenchJob?: { __typename?: 'WorkbenchJob', id: string, activities?: { __typename?: 'WorkbenchJobActivityConnection', edges?: Array<{ __typename?: 'WorkbenchJobActivityEdge', node?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null } | null } | null } | null> | null } | null } | null }; + +export type ApproveWorkbenchJobActivityMutationVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type ApproveWorkbenchJobActivityMutation = { __typename?: 'RootMutationType', approveWorkbenchJobActivity?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null } | null } | null }; + +export type RejectWorkbenchJobActivityMutationVariables = Exact<{ + id: Scalars['ID']['input']; + reason?: InputMaybe; +}>; + + +export type RejectWorkbenchJobActivityMutation = { __typename?: 'RootMutationType', rejectWorkbenchJobActivity?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null } | null } | null }; export type WorkbenchJobWhimseyTextQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -21455,7 +21540,14 @@ export type WorkbenchJobActivityQueryVariables = Exact<{ }>; -export type WorkbenchJobActivityQuery = { __typename?: 'RootQueryType', workbenchJobActivity?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, thoughts?: Array<{ __typename?: 'WorkbenchJobThought', id: string, content?: string | null, toolName?: string | null, toolArgs?: Record | null, activity?: { __typename?: 'WorkbenchJobActivity', id: string } | null, attributes?: { __typename?: 'WorkbenchJobThoughtAttributes', logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, metrics?: Array<{ __typename?: 'WorkbenchJobActivityMetric', timestamp?: string | null, name?: string | null, value?: number | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null } | null } | null> | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null }; +export type WorkbenchJobActivityQuery = { __typename?: 'RootQueryType', workbenchJobActivity?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, thoughts?: Array<{ __typename?: 'WorkbenchJobThought', id: string, content?: string | null, toolName?: string | null, toolArgs?: Record | null, activity?: { __typename?: 'WorkbenchJobActivity', id: string } | null, attributes?: { __typename?: 'WorkbenchJobThoughtAttributes', logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, metrics?: Array<{ __typename?: 'WorkbenchJobActivityMetric', timestamp?: string | null, name?: string | null, value?: number | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null } | null } | null> | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null }; + +export type WorkbenchJobKubeRequestDiffQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type WorkbenchJobKubeRequestDiffQuery = { __typename?: 'RootQueryType', workbenchJobActivity?: { __typename?: 'WorkbenchJobActivity', id: string, result?: { __typename?: 'WorkbenchJobActivityResult', kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, contentType?: string | null, current?: Record | null } | null } | null } | null }; export type WorkbenchToolsQueryVariables = Exact<{ first?: InputMaybe; @@ -21464,7 +21556,7 @@ export type WorkbenchToolsQueryVariables = Exact<{ }>; -export type WorkbenchToolsQuery = { __typename?: 'RootQueryType', workbenchTools?: { __typename?: 'WorkbenchToolConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchToolEdge', node?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null } | null> | null } | null }; +export type WorkbenchToolsQuery = { __typename?: 'RootQueryType', workbenchTools?: { __typename?: 'WorkbenchToolConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null, hasPreviousPage: boolean, startCursor?: string | null }, edges?: Array<{ __typename?: 'WorkbenchToolEdge', node?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null } | null> | null } | null }; export type WorkbenchToolQueryVariables = Exact<{ id?: InputMaybe; @@ -21472,14 +21564,14 @@ export type WorkbenchToolQueryVariables = Exact<{ }>; -export type WorkbenchToolQuery = { __typename?: 'RootQueryType', workbenchTool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null }; +export type WorkbenchToolQuery = { __typename?: 'RootQueryType', workbenchTool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null }; export type CreateWorkbenchMutationVariables = Exact<{ attributes: WorkbenchAttributes; }>; -export type CreateWorkbenchMutation = { __typename?: 'RootMutationType', createWorkbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null }; +export type CreateWorkbenchMutation = { __typename?: 'RootMutationType', createWorkbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null }; export type UpdateWorkbenchMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21487,7 +21579,7 @@ export type UpdateWorkbenchMutationVariables = Exact<{ }>; -export type UpdateWorkbenchMutation = { __typename?: 'RootMutationType', updateWorkbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null }; +export type UpdateWorkbenchMutation = { __typename?: 'RootMutationType', updateWorkbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, repository?: { __typename?: 'GitRepository', id: string } | null, configuration?: { __typename?: 'WorkbenchConfiguration', infrastructure?: { __typename?: 'WorkbenchInfrastructure', services?: boolean | null, stacks?: boolean | null, kubernetes?: boolean | null, podLogs?: boolean | null, vulnerabilities?: boolean | null, sentinels?: boolean | null } | null, observability?: { __typename?: 'WorkbenchObservability', logs?: boolean | null, metrics?: boolean | null } | null, coding?: { __typename?: 'WorkbenchCoding', mode?: AgentRunMode | null, repositories?: Array | null, enableBabysitting?: boolean | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, skills?: { __typename?: 'WorkbenchSkills', files?: Array | null, ref?: { __typename?: 'GitRef', ref: string, folder: string } | null } | null, workbenchSkills?: { __typename?: 'WorkbenchSkillConnection', edges?: Array<{ __typename?: 'WorkbenchSkillEdge', node?: { __typename?: 'WorkbenchSkill', id: string, name?: string | null, description?: string | null, contents?: string | null, subagents?: Array | null } | null } | null> | null } | null, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, botUser?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null, webhooks?: { __typename?: 'WorkbenchWebhookConnection', edges?: Array<{ __typename?: 'WorkbenchWebhookEdge', node?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, priority?: number | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, type: ObservabilityWebhookType } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, provider: IssueWebhookProvider } | null } | null } | null> | null } | null } | null }; export type CreateWorkbenchEvalMutationVariables = Exact<{ workbenchId: Scalars['ID']['input']; @@ -21518,7 +21610,7 @@ export type WorkbenchEvalSkillMutationVariables = Exact<{ }>; -export type WorkbenchEvalSkillMutation = { __typename?: 'RootMutationType', workbenchEvalSkill?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null } | null }; +export type WorkbenchEvalSkillMutation = { __typename?: 'RootMutationType', workbenchEvalSkill?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null } | null }; export type DeleteWorkbenchMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21532,7 +21624,7 @@ export type CreateWorkbenchToolMutationVariables = Exact<{ }>; -export type CreateWorkbenchToolMutation = { __typename?: 'RootMutationType', createWorkbenchTool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null }; +export type CreateWorkbenchToolMutation = { __typename?: 'RootMutationType', createWorkbenchTool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null }; export type UpdateWorkbenchToolMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21540,7 +21632,7 @@ export type UpdateWorkbenchToolMutationVariables = Exact<{ }>; -export type UpdateWorkbenchToolMutation = { __typename?: 'RootMutationType', updateWorkbenchTool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null }; +export type UpdateWorkbenchToolMutation = { __typename?: 'RootMutationType', updateWorkbenchTool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, scmConnection?: { __typename?: 'ScmConnection', id: string, name: string, type: ScmType } | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, configuration?: { __typename?: 'WorkbenchToolConfiguration', http?: { __typename?: 'WorkbenchToolHttpConfiguration', url?: string | null, method?: string | null, body?: string | null, inputSchema?: Record | null, headers?: Array<{ __typename?: 'WorkbenchToolHttpHeader', name?: string | null, value?: string | null } | null> | null } | null, datadog?: { __typename?: 'WorkbenchToolDatadogConnection', site?: string | null } | null, elastic?: { __typename?: 'WorkbenchToolElasticConnection', index: string, url: string, username: string } | null, opensearch?: { __typename?: 'WorkbenchToolOpensearchConnection', host: string, index: string, awsAccessKeyId?: string | null, awsRegion?: string | null, assumeRoleArn?: string | null, usePodIdentity?: boolean | null } | null, loki?: { __typename?: 'WorkbenchToolLokiConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, prometheus?: { __typename?: 'WorkbenchToolPrometheusConnection', url?: string | null, username?: string | null, tenantId?: string | null, awsSigv4?: boolean | null, awsAccessKeyId?: string | null, awsRegion?: string | null } | null, tempo?: { __typename?: 'WorkbenchToolTempoConnection', url?: string | null, username?: string | null, tenantId?: string | null } | null, jaeger?: { __typename?: 'WorkbenchToolJaegerConnection', url?: string | null, username?: string | null } | null, atlassian?: { __typename?: 'WorkbenchToolAtlassianConnection', email?: string | null, url: string } | null, linear?: { __typename?: 'WorkbenchToolLinearConnection', url: string } | null, slack?: { __typename?: 'WorkbenchToolSlackConnection', url: string } | null, pagerduty?: { __typename?: 'WorkbenchToolPagerdutyConnection', url: string } | null, teams?: { __typename?: 'WorkbenchToolTeamsConnection', clientId?: string | null, tenantId?: string | null } | null, splunk?: { __typename?: 'WorkbenchToolSplunkConnection', url?: string | null, username?: string | null } | null, cloudwatch?: { __typename?: 'WorkbenchToolCloudwatchConnection', logGroupNames?: Array | null, region?: string | null, roleArn?: string | null, roleSessionName?: string | null } | null, azure?: { __typename?: 'WorkbenchToolAzureConnection', subscriptionId?: string | null, tenantId?: string | null, clientId?: string | null, prometheusUrl?: string | null } | null, dynatrace?: { __typename?: 'WorkbenchToolDynatraceConnection', url?: string | null } | null, sentry?: { __typename?: 'WorkbenchToolSentryConnection', url?: string | null } | null, github?: { __typename?: 'WorkbenchToolGithubConnection', url: string, toolset?: string | null, appId?: string | null, installationId?: string | null } | null, gitlab?: { __typename?: 'WorkbenchToolGitlabConnection', url?: string | null } | null, bitbucket?: { __typename?: 'WorkbenchToolBitbucketConnection', url?: string | null } | null, bitbucketDatacenter?: { __typename?: 'WorkbenchToolBitbucketDatacenterConnection', url?: string | null } | null, azureDevops?: { __typename?: 'WorkbenchToolAzureDevopsConnection', url?: string | null } | null, lambda?: { __typename?: 'WorkbenchToolLambdaConnection', lambdaArn?: string | null, description?: string | null, inputSchema?: Record | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', identifier?: string | null, description?: string | null, inputSchema?: Record | null } | null, docker?: { __typename?: 'WorkbenchToolDockerConnection', url?: string | null, provider?: HelmAuthProvider | null, proxy?: { __typename?: 'HttpProxyConfiguration', url: string, noproxy?: string | null } | null } | null } | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null }; export type DeleteWorkbenchToolMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21555,7 +21647,7 @@ export type CreateWorkbenchJobMutationVariables = Exact<{ }>; -export type CreateWorkbenchJobMutation = { __typename?: 'RootMutationType', createWorkbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null } | null }; +export type CreateWorkbenchJobMutation = { __typename?: 'RootMutationType', createWorkbenchJob?: { __typename?: 'WorkbenchJob', id: string, prompt?: string | null, status: WorkbenchJobStatus, error?: string | null, insertedAt?: string | null, usage?: { __typename?: 'WorkbenchJobUsage', cachedTokens?: number | null, inputCost?: number | null, inputTokens?: number | null, outputCost?: number | null, outputTokens?: number | null, reasoningTokens?: number | null, totalCost?: number | null, totalTokens?: number | null } | null, workbench?: { __typename?: 'Workbench', id: string, name: string, tools?: Array<{ __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, categories?: Array | null, approval?: boolean | null, cloudConnection?: { __typename?: 'CloudConnection', id: string, name: string, provider: Provider } | null, mcpServer?: { __typename?: 'McpServer', id: string, name: string, url: string } | null } | null> | null } | null, alert?: { __typename?: 'Alert', id: string, state: AlertState, url?: string | null, title?: string | null, message?: string | null, type: ObservabilityWebhookType, severity: AlertSeverity, fingerprint?: string | null, annotations?: Record | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'Tag', id: string, name: string, value: string } | null> | null, insight?: { __typename?: 'AiInsight', id: string, text?: string | null, summary?: string | null, sha?: string | null, freshness?: InsightFreshness | null, updatedAt?: string | null, insertedAt?: string | null, error?: Array<{ __typename?: 'ServiceError', message: string, source: string } | null> | null, evidence?: Array<{ __typename?: 'AiInsightEvidence', id: string, type: EvidenceType, insertedAt?: string | null, updatedAt?: string | null, logs?: { __typename?: 'LogsEvidence', clusterId?: string | null, serviceId?: string | null, line?: string | null, lines?: Array<{ __typename?: 'LogLine', log?: string | null, timestamp?: string | null, facets?: Array<{ __typename?: 'LogFacet', key: string, value?: string | null } | null> | null } | null> | null } | null, pullRequest?: { __typename?: 'PullRequestEvidence', contents?: string | null, filename?: string | null, patch?: string | null, repo?: string | null, sha?: string | null, title?: string | null, url?: string | null } | null, alert?: { __typename?: 'AlertEvidence', alertId?: string | null, title?: string | null, resolution?: string | null } | null, knowledge?: { __typename?: 'KnowledgeEvidence', name?: string | null, observations?: Array | null, type?: string | null } | null } | null> | null, cluster?: { __typename?: 'Cluster', id: string, name: string, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', cloud: string } | null } | null, clusterInsightComponent?: { __typename?: 'ClusterInsightComponent', id: string, name: string } | null, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null, serviceComponent?: { __typename?: 'ServiceComponent', id: string, name: string, service?: { __typename?: 'ServiceDeployment', id: string, name: string, cluster?: { __typename?: 'Cluster', id: string, name: string, handle?: string | null, distro?: ClusterDistro | null, provider?: { __typename?: 'ClusterProvider', name: string, cloud: string } | null } | null } | null } | null, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string, type: StackType } | null, stackRun?: { __typename?: 'StackRun', id: string, message?: string | null, type: StackType, stack?: { __typename?: 'InfrastructureStack', id?: string | null, name: string } | null } | null, alert?: { __typename?: 'Alert', id: string, title?: string | null, message?: string | null } | null } | null, resolution?: { __typename?: 'AlertResolution', resolution: string } | null, workbench?: { __typename?: 'Workbench', id: string } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, status: WorkbenchJobStatus } | null } | null, issue?: { __typename?: 'Issue', id: string, title: string, externalId: string, insertedAt?: string | null, status: IssueStatus, url: string, provider: IssueWebhookProvider } | null, result?: { __typename?: 'WorkbenchJobResult', id: string, conclusion?: string | null, workingTheory?: string | null, criticism?: string | null, topology?: string | null, todos?: Array<{ __typename?: 'WorkbenchJobResultTodo', name?: string | null, description?: string | null, done?: boolean | null } | null> | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, evalResult?: { __typename?: 'WorkbenchEvalResult', id: string, grade?: number | null, feedback?: { __typename?: 'WorkbenchEvalFeedback', summary?: string | null, prompt?: string | null, result?: string | null, logic?: string | null } | null } | null, modes?: { __typename?: 'WorkbenchJobModes', budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, user?: { __typename?: 'User', id: string, name: string, profile?: string | null } | null, pullRequests?: Array<{ __typename?: 'PullRequest', patch?: string | null, id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, chatbotMessage?: { __typename?: 'ChatbotMessage', id: string, channel?: string | null, message?: string | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType } | null } | null } | null }; export type CancelWorkbenchJobMutationVariables = Exact<{ jobId: Scalars['ID']['input']; @@ -21570,7 +21662,7 @@ export type CreateWorkbenchMessageMutationVariables = Exact<{ }>; -export type CreateWorkbenchMessageMutation = { __typename?: 'RootMutationType', createWorkbenchMessage?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null }; +export type CreateWorkbenchMessageMutation = { __typename?: 'RootMutationType', createWorkbenchMessage?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null }; export type CreateWorkbenchPromptMutationVariables = Exact<{ workbenchId: Scalars['ID']['input']; @@ -21601,7 +21693,7 @@ export type CreateWorkbenchCronMutationVariables = Exact<{ }>; -export type CreateWorkbenchCronMutation = { __typename?: 'RootMutationType', createWorkbenchCron?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null } | null }; +export type CreateWorkbenchCronMutation = { __typename?: 'RootMutationType', createWorkbenchCron?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null } | null }; export type UpdateWorkbenchCronMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21609,7 +21701,7 @@ export type UpdateWorkbenchCronMutationVariables = Exact<{ }>; -export type UpdateWorkbenchCronMutation = { __typename?: 'RootMutationType', updateWorkbenchCron?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null } | null }; +export type UpdateWorkbenchCronMutation = { __typename?: 'RootMutationType', updateWorkbenchCron?: { __typename?: 'WorkbenchCron', id: string, crontab?: string | null, prompt?: string | null, userId?: string | null, lastRunAt?: string | null, nextRunAt?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null } | null }; export type DeleteWorkbenchCronMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21624,7 +21716,7 @@ export type CreateWorkbenchWebhookMutationVariables = Exact<{ }>; -export type CreateWorkbenchWebhookMutation = { __typename?: 'RootMutationType', createWorkbenchWebhook?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null }; +export type CreateWorkbenchWebhookMutation = { __typename?: 'RootMutationType', createWorkbenchWebhook?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null }; export type UpdateWorkbenchWebhookMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21632,7 +21724,7 @@ export type UpdateWorkbenchWebhookMutationVariables = Exact<{ }>; -export type UpdateWorkbenchWebhookMutation = { __typename?: 'RootMutationType', updateWorkbenchWebhook?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null }; +export type UpdateWorkbenchWebhookMutation = { __typename?: 'RootMutationType', updateWorkbenchWebhook?: { __typename?: 'WorkbenchWebhook', id: string, name?: string | null, prompt?: string | null, priority?: number | null, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, matches?: { __typename?: 'WorkbenchWebhookMatches', regex?: string | null, substring?: string | null, caseInsensitive?: boolean | null } | null, webhook?: { __typename?: 'ObservabilityWebhook', id: string, name: string, type: ObservabilityWebhookType, url: string } | null, issueWebhook?: { __typename?: 'IssueWebhook', id: string, name: string, provider: IssueWebhookProvider, url: string, insertedAt?: string | null, updatedAt?: string | null, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null } | null }; export type DeleteWorkbenchWebhookMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21647,7 +21739,7 @@ export type CreateWorkbenchChatbotMutationVariables = Exact<{ }>; -export type CreateWorkbenchChatbotMutation = { __typename?: 'RootMutationType', createWorkbenchChatbot?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null }; +export type CreateWorkbenchChatbotMutation = { __typename?: 'RootMutationType', createWorkbenchChatbot?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null }; export type UpdateWorkbenchChatbotMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21655,7 +21747,7 @@ export type UpdateWorkbenchChatbotMutationVariables = Exact<{ }>; -export type UpdateWorkbenchChatbotMutation = { __typename?: 'RootMutationType', updateWorkbenchChatbot?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null }; +export type UpdateWorkbenchChatbotMutation = { __typename?: 'RootMutationType', updateWorkbenchChatbot?: { __typename?: 'WorkbenchChatbot', id: string, channel: string, prompt?: string | null, messageBehavior: WorkbenchChatbotMessageBehavior, userId?: string | null, insertedAt?: string | null, updatedAt?: string | null, modes?: { __typename?: 'WorkbenchJobModes', plan?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, chatConnection?: { __typename?: 'ChatProviderConnection', id: string, name: string, type: ChatProviderConnectionType, configuration: { __typename?: 'ChatProviderConnectionConfiguration', slack?: { __typename?: 'SlackConnectionConfiguration', botId?: string | null } | null, teams?: { __typename?: 'TeamsConnectionConfiguration', clientId?: string | null, tenantId?: string | null } | null }, readBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null, writeBindings?: Array<{ __typename?: 'PolicyBinding', id?: string | null, user?: { __typename?: 'User', id: string, name: string, email: string } | null, group?: { __typename?: 'Group', id: string, name: string } | null } | null> | null } | null, user?: { __typename?: 'User', id: string, name: string, email: string, profile?: string | null } | null } | null }; export type DeleteWorkbenchChatbotMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -21713,7 +21805,7 @@ export type WorkbenchJobActivityDeltaSubscriptionVariables = Exact<{ }>; -export type WorkbenchJobActivityDeltaSubscription = { __typename?: 'RootSubscriptionType', workbenchJobActivityDelta?: { __typename?: 'WorkbenchJobActivityDelta', delta?: Delta | null, payload?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, body?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null } | null }; +export type WorkbenchJobActivityDeltaSubscription = { __typename?: 'RootSubscriptionType', workbenchJobActivityDelta?: { __typename?: 'WorkbenchJobActivityDelta', delta?: Delta | null, payload?: { __typename?: 'WorkbenchJobActivity', id: string, type?: WorkbenchJobActivityType | null, status: WorkbenchJobActivityStatus, prompt?: string | null, insertedAt?: string | null, user?: { __typename?: 'User', name: string, email: string, profile?: string | null } | null, result?: { __typename?: 'WorkbenchJobActivityResult', output?: string | null, error?: string | null, functionCall?: { __typename?: 'WorkbenchJobActivityFunctionCall', name?: string | null, input?: Record | null, toolId?: string | null, tool?: { __typename?: 'WorkbenchTool', id: string, name: string, tool: WorkbenchToolType, configuration?: { __typename?: 'WorkbenchToolConfiguration', lambda?: { __typename?: 'WorkbenchToolLambdaConnection', description?: string | null } | null, cloudRun?: { __typename?: 'WorkbenchToolCloudRunConnection', description?: string | null } | null, azureFunction?: { __typename?: 'WorkbenchToolAzureFunctionConnection', description?: string | null } | null } | null } | null } | null, kubeRequest?: { __typename?: 'WorkbenchJobActivityKubeRequest', handle?: string | null, method?: string | null, path?: string | null, queryParams?: Record | null, contentType?: string | null } | null, jobUpdate?: { __typename?: 'WorkbenchJobActivityJobUpdate', diff?: string | null, workingTheory?: string | null, criticism?: string | null, conclusion?: string | null } | null, metricsQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, logs?: Array<{ __typename?: 'WorkbenchJobActivityLog', timestamp?: string | null, message?: string | null, labels?: Record | null } | null> | null, traces?: Array<{ __typename?: 'WorkbenchJobActivityTrace', traceId?: string | null, spanId?: string | null, parentId?: string | null, name?: string | null, service?: string | null, start?: string | null, end?: string | null, tags?: Record | null } | null> | null, tracesQuery?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null, canvas?: Array<{ __typename?: 'WorkbenchCanvasBlock', identifier?: string | null, type?: WorkbenchCanvasBlockType | null, layout?: { __typename?: 'WorkbenchCanvasBlockLayout', x?: number | null, y?: number | null, w?: number | null, h?: number | null } | null, content?: { __typename?: 'WorkbenchCanvasBlockContent', markdown?: string | null, metrics?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, logs?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, traces?: { __typename?: 'WorkbenchCanvasToolGraph', title?: string | null, summary?: string | null, query?: { __typename?: 'WorkbenchToolQueryData', toolName?: string | null, toolArgs?: Record | null, summary?: string | null } | null } | null, pie?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null, bar?: { __typename?: 'WorkbenchCanvasBlockGraph', title?: string | null, data?: Array<{ __typename?: 'WorkbenchCanvasDataPoint', label?: string | null, value?: number | null } | null> | null } | null } | null } | null> | null } | null, agentRun?: { __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null, agentRuns?: Array<{ __typename?: 'AgentRun', id: string, status: AgentRunStatus, mode: AgentRunMode, babysit?: boolean | null, approval?: boolean | null, approvedAt?: string | null, prompt: string, shared?: boolean | null, error?: string | null, repository: string, branch?: string | null, headBranch?: string | null, insertedAt?: string | null, updatedAt?: string | null, runtime?: { __typename?: 'AgentRuntime', id: string, name: string, type: AgentRuntimeType } | null, pullRequests?: Array<{ __typename?: 'PullRequest', id: string, url: string, title?: string | null, creator?: string | null, status?: PrStatus | null, insertedAt?: string | null, updatedAt?: string | null } | null> | null, podReference?: { __typename?: 'AgentPodReference', name: string, namespace: string } | null, usage?: { __typename?: 'AgentRunUsage', totalCost?: number | null, totalTokens?: number | null } | null, workbenchJob?: { __typename?: 'WorkbenchJob', id: string, workbench?: { __typename?: 'Workbench', id: string, name: string } | null } | null, upload?: { __typename?: 'AgentRunUpload', id: string, session?: string | null, patch?: string | null } | null, todos?: Array<{ __typename?: 'AgentTodo', title: string, description: string, done?: boolean | null } | null> | null } | null> | null } | null } | null }; export type WorkbenchJobThoughtDeltaSubscriptionVariables = Exact<{ jobId: Scalars['ID']['input']; @@ -22984,6 +23076,7 @@ export const AwaitingReviewAgentRunFragmentDoc = gql` } workbenchJob { id + insertedAt workbench { id name @@ -22991,6 +23084,54 @@ export const AwaitingReviewAgentRunFragmentDoc = gql` } } ${PullRequestBasicFragmentDoc}`; +export const AwaitingReviewWorkbenchActivityFragmentDoc = gql` + fragment AwaitingReviewWorkbenchActivity on WorkbenchJobActivity { + id + type + status + prompt + result { + functionCall { + name + input + toolId + tool { + id + name + tool + configuration { + lambda { + description + } + cloudRun { + description + } + azureFunction { + description + } + } + } + } + kubeRequest { + handle + method + path + } + } + workbenchJob { + id + prompt + insertedAt + result { + workingTheory + } + workbench { + id + name + } + } +} + `; export const ObjectStoreFragmentDoc = gql` fragment ObjectStore on ObjectStore { id @@ -26670,6 +26811,7 @@ export const WorkbenchToolTinyFragmentDoc = gql` name tool categories + approval cloudConnection { ...CloudConnectionTiny } @@ -26843,6 +26985,21 @@ export const WorkbenchToolFragmentDoc = gql` azureDevops { url } + lambda { + lambdaArn + description + inputSchema + } + cloudRun { + identifier + description + inputSchema + } + azureFunction { + identifier + description + inputSchema + } docker { url provider @@ -26899,6 +27056,12 @@ export const WorkbenchFragmentDoc = gql` cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } skills { ref { @@ -27020,12 +27183,27 @@ export const WorkbenchJobActivityResultFragmentDoc = gql` name input toolId + tool { + id + name + tool + configuration { + lambda { + description + } + cloudRun { + description + } + azureFunction { + description + } + } + } } kubeRequest { handle method path - body queryParams contentType } @@ -27062,6 +27240,9 @@ export const WorkbenchJobActivityFragmentDoc = gql` status prompt insertedAt + user { + ...UserTiny + } result { ...WorkbenchJobActivityResult } @@ -27072,7 +27253,8 @@ export const WorkbenchJobActivityFragmentDoc = gql` ...AgentRunTiny } } - ${WorkbenchJobActivityResultFragmentDoc} + ${UserTinyFragmentDoc} +${WorkbenchJobActivityResultFragmentDoc} ${AgentRunTinyFragmentDoc}`; export const WorkbenchJobActivityMetricFragmentDoc = gql` fragment WorkbenchJobActivityMetric on WorkbenchJobActivityMetric { @@ -27149,6 +27331,12 @@ export const WorkbenchCronFragmentDoc = gql` cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } lastRunAt nextRunAt @@ -27203,6 +27391,12 @@ export const WorkbenchWebhookFragmentDoc = gql` cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } matches { regex @@ -27265,6 +27459,12 @@ export const WorkbenchChatbotFragmentDoc = gql` cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } insertedAt updatedAt @@ -27495,6 +27695,50 @@ export const UnifiedWorkbenchSkillTinyFragmentDoc = gql` subagents } `; +export const WorkbenchJobActionFragmentDoc = gql` + fragment WorkbenchJobAction on WorkbenchJobActivity { + id + type + status + prompt + insertedAt + user { + ...UserTiny + } + result { + output + error + functionCall { + name + input + toolId + tool { + id + name + tool + configuration { + lambda { + description + } + cloudRun { + description + } + azureFunction { + description + } + } + } + } + kubeRequest { + handle + method + path + queryParams + contentType + } + } +} + ${UserTinyFragmentDoc}`; export const WorkbenchLinkCardFragmentDoc = gql` fragment WorkbenchLinkCard on Workbench { id @@ -31070,6 +31314,53 @@ export type PendingApprovalAgentRunsQueryHookResult = ReturnType; export type PendingApprovalAgentRunsSuspenseQueryHookResult = ReturnType; export type PendingApprovalAgentRunsQueryResult = Apollo.QueryResult; +export const PendingApprovalWorkbenchActivitiesDocument = gql` + query PendingApprovalWorkbenchActivities($first: Int = 100) { + workbenchJobActivities(first: $first, status: NEEDS_APPROVAL) { + edges { + node { + ...AwaitingReviewWorkbenchActivity + } + } + } +} + ${AwaitingReviewWorkbenchActivityFragmentDoc}`; + +/** + * __usePendingApprovalWorkbenchActivitiesQuery__ + * + * To run a query within a React component, call `usePendingApprovalWorkbenchActivitiesQuery` and pass it any options that fit your needs. + * When your component renders, `usePendingApprovalWorkbenchActivitiesQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = usePendingApprovalWorkbenchActivitiesQuery({ + * variables: { + * first: // value for 'first' + * }, + * }); + */ +export function usePendingApprovalWorkbenchActivitiesQuery(baseOptions?: Apollo.QueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(PendingApprovalWorkbenchActivitiesDocument, options); + } +export function usePendingApprovalWorkbenchActivitiesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(PendingApprovalWorkbenchActivitiesDocument, options); + } +// @ts-ignore +export function usePendingApprovalWorkbenchActivitiesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function usePendingApprovalWorkbenchActivitiesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function usePendingApprovalWorkbenchActivitiesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { + const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery(PendingApprovalWorkbenchActivitiesDocument, options); + } +export type PendingApprovalWorkbenchActivitiesQueryHookResult = ReturnType; +export type PendingApprovalWorkbenchActivitiesLazyQueryHookResult = ReturnType; +export type PendingApprovalWorkbenchActivitiesSuspenseQueryHookResult = ReturnType; +export type PendingApprovalWorkbenchActivitiesQueryResult = Apollo.QueryResult; export const ObjectStoresDocument = gql` query ObjectStores($after: String, $first: Int = 100, $before: String, $last: Int) { objectStores(after: $after, first: $first, before: $before, last: $last) { @@ -45194,6 +45485,188 @@ export type WorkbenchJobActivitiesQueryHookResult = ReturnType; export type WorkbenchJobActivitiesSuspenseQueryHookResult = ReturnType; export type WorkbenchJobActivitiesQueryResult = Apollo.QueryResult; +export const WorkbenchJobActionSummaryDocument = gql` + query WorkbenchJobActionSummary($id: ID!, $first: Int = 1) { + workbenchJob(id: $id) { + id + pendingActions: activities(first: $first, status: NEEDS_APPROVAL) { + edges { + node { + id + } + } + } + functionActions: activities(first: $first, type: FUNCTION) { + edges { + node { + id + } + } + } + kubernetesActions: activities(first: $first, type: KUBERNETES) { + edges { + node { + id + } + } + } + } +} + `; + +/** + * __useWorkbenchJobActionSummaryQuery__ + * + * To run a query within a React component, call `useWorkbenchJobActionSummaryQuery` and pass it any options that fit your needs. + * When your component renders, `useWorkbenchJobActionSummaryQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useWorkbenchJobActionSummaryQuery({ + * variables: { + * id: // value for 'id' + * first: // value for 'first' + * }, + * }); + */ +export function useWorkbenchJobActionSummaryQuery(baseOptions: Apollo.QueryHookOptions & ({ variables: WorkbenchJobActionSummaryQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(WorkbenchJobActionSummaryDocument, options); + } +export function useWorkbenchJobActionSummaryLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(WorkbenchJobActionSummaryDocument, options); + } +// @ts-ignore +export function useWorkbenchJobActionSummarySuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function useWorkbenchJobActionSummarySuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function useWorkbenchJobActionSummarySuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { + const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery(WorkbenchJobActionSummaryDocument, options); + } +export type WorkbenchJobActionSummaryQueryHookResult = ReturnType; +export type WorkbenchJobActionSummaryLazyQueryHookResult = ReturnType; +export type WorkbenchJobActionSummarySuspenseQueryHookResult = ReturnType; +export type WorkbenchJobActionSummaryQueryResult = Apollo.QueryResult; +export const WorkbenchJobActionsDocument = gql` + query WorkbenchJobActions($id: ID!) { + workbenchJob(id: $id) { + id + activities(first: 100) { + edges { + node { + ...WorkbenchJobAction + } + } + } + } +} + ${WorkbenchJobActionFragmentDoc}`; + +/** + * __useWorkbenchJobActionsQuery__ + * + * To run a query within a React component, call `useWorkbenchJobActionsQuery` and pass it any options that fit your needs. + * When your component renders, `useWorkbenchJobActionsQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useWorkbenchJobActionsQuery({ + * variables: { + * id: // value for 'id' + * }, + * }); + */ +export function useWorkbenchJobActionsQuery(baseOptions: Apollo.QueryHookOptions & ({ variables: WorkbenchJobActionsQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(WorkbenchJobActionsDocument, options); + } +export function useWorkbenchJobActionsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(WorkbenchJobActionsDocument, options); + } +// @ts-ignore +export function useWorkbenchJobActionsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function useWorkbenchJobActionsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function useWorkbenchJobActionsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { + const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery(WorkbenchJobActionsDocument, options); + } +export type WorkbenchJobActionsQueryHookResult = ReturnType; +export type WorkbenchJobActionsLazyQueryHookResult = ReturnType; +export type WorkbenchJobActionsSuspenseQueryHookResult = ReturnType; +export type WorkbenchJobActionsQueryResult = Apollo.QueryResult; +export const ApproveWorkbenchJobActivityDocument = gql` + mutation ApproveWorkbenchJobActivity($id: ID!) { + approveWorkbenchJobActivity(id: $id) { + ...WorkbenchJobAction + } +} + ${WorkbenchJobActionFragmentDoc}`; +export type ApproveWorkbenchJobActivityMutationFn = Apollo.MutationFunction; + +/** + * __useApproveWorkbenchJobActivityMutation__ + * + * To run a mutation, you first call `useApproveWorkbenchJobActivityMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useApproveWorkbenchJobActivityMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [approveWorkbenchJobActivityMutation, { data, loading, error }] = useApproveWorkbenchJobActivityMutation({ + * variables: { + * id: // value for 'id' + * }, + * }); + */ +export function useApproveWorkbenchJobActivityMutation(baseOptions?: Apollo.MutationHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useMutation(ApproveWorkbenchJobActivityDocument, options); + } +export type ApproveWorkbenchJobActivityMutationHookResult = ReturnType; +export type ApproveWorkbenchJobActivityMutationResult = Apollo.MutationResult; +export type ApproveWorkbenchJobActivityMutationOptions = Apollo.BaseMutationOptions; +export const RejectWorkbenchJobActivityDocument = gql` + mutation RejectWorkbenchJobActivity($id: ID!, $reason: String) { + rejectWorkbenchJobActivity(id: $id, reason: $reason) { + ...WorkbenchJobAction + } +} + ${WorkbenchJobActionFragmentDoc}`; +export type RejectWorkbenchJobActivityMutationFn = Apollo.MutationFunction; + +/** + * __useRejectWorkbenchJobActivityMutation__ + * + * To run a mutation, you first call `useRejectWorkbenchJobActivityMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useRejectWorkbenchJobActivityMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [rejectWorkbenchJobActivityMutation, { data, loading, error }] = useRejectWorkbenchJobActivityMutation({ + * variables: { + * id: // value for 'id' + * reason: // value for 'reason' + * }, + * }); + */ +export function useRejectWorkbenchJobActivityMutation(baseOptions?: Apollo.MutationHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useMutation(RejectWorkbenchJobActivityDocument, options); + } +export type RejectWorkbenchJobActivityMutationHookResult = ReturnType; +export type RejectWorkbenchJobActivityMutationResult = Apollo.MutationResult; +export type RejectWorkbenchJobActivityMutationOptions = Apollo.BaseMutationOptions; export const WorkbenchJobWhimseyTextDocument = gql` query WorkbenchJobWhimseyText($id: ID!) { workbenchJob(id: $id) { @@ -45325,6 +45798,59 @@ export type WorkbenchJobActivityQueryHookResult = ReturnType; export type WorkbenchJobActivitySuspenseQueryHookResult = ReturnType; export type WorkbenchJobActivityQueryResult = Apollo.QueryResult; +export const WorkbenchJobKubeRequestDiffDocument = gql` + query WorkbenchJobKubeRequestDiff($id: ID!) { + workbenchJobActivity(id: $id) { + id + result { + kubeRequest { + handle + method + path + body + contentType + current + } + } + } +} + `; + +/** + * __useWorkbenchJobKubeRequestDiffQuery__ + * + * To run a query within a React component, call `useWorkbenchJobKubeRequestDiffQuery` and pass it any options that fit your needs. + * When your component renders, `useWorkbenchJobKubeRequestDiffQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useWorkbenchJobKubeRequestDiffQuery({ + * variables: { + * id: // value for 'id' + * }, + * }); + */ +export function useWorkbenchJobKubeRequestDiffQuery(baseOptions: Apollo.QueryHookOptions & ({ variables: WorkbenchJobKubeRequestDiffQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(WorkbenchJobKubeRequestDiffDocument, options); + } +export function useWorkbenchJobKubeRequestDiffLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(WorkbenchJobKubeRequestDiffDocument, options); + } +// @ts-ignore +export function useWorkbenchJobKubeRequestDiffSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function useWorkbenchJobKubeRequestDiffSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +export function useWorkbenchJobKubeRequestDiffSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { + const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery(WorkbenchJobKubeRequestDiffDocument, options); + } +export type WorkbenchJobKubeRequestDiffQueryHookResult = ReturnType; +export type WorkbenchJobKubeRequestDiffLazyQueryHookResult = ReturnType; +export type WorkbenchJobKubeRequestDiffSuspenseQueryHookResult = ReturnType; +export type WorkbenchJobKubeRequestDiffQueryResult = Apollo.QueryResult; export const WorkbenchToolsDocument = gql` query WorkbenchTools($first: Int = 100, $after: String, $q: String) { workbenchTools(first: $first, after: $after, q: $q) { @@ -46774,6 +47300,7 @@ export const namedOperations = { ScmWebhooks: 'ScmWebhooks', PendingApprovalStacks: 'PendingApprovalStacks', PendingApprovalAgentRuns: 'PendingApprovalAgentRuns', + PendingApprovalWorkbenchActivities: 'PendingApprovalWorkbenchActivities', ObjectStores: 'ObjectStores', ClustersObjectStores: 'ClustersObjectStores', ClusterBackup: 'ClusterBackup', @@ -46975,9 +47502,12 @@ export const namedOperations = { WorkbenchJobLogsTool: 'WorkbenchJobLogsTool', WorkbenchJobTracesTool: 'WorkbenchJobTracesTool', WorkbenchJobActivities: 'WorkbenchJobActivities', + WorkbenchJobActionSummary: 'WorkbenchJobActionSummary', + WorkbenchJobActions: 'WorkbenchJobActions', WorkbenchJobWhimseyText: 'WorkbenchJobWhimseyText', WorkbenchJobActivityWhimseyText: 'WorkbenchJobActivityWhimseyText', WorkbenchJobActivity: 'WorkbenchJobActivity', + WorkbenchJobKubeRequestDiff: 'WorkbenchJobKubeRequestDiff', WorkbenchTools: 'WorkbenchTools', WorkbenchTool: 'WorkbenchTool', WorkbenchLinkCard: 'WorkbenchLinkCard', @@ -47138,6 +47668,8 @@ export const namedOperations = { CreateInvite: 'CreateInvite', GetWorkbenchCron: 'GetWorkbenchCron', GetWorkbenchWebhook: 'GetWorkbenchWebhook', + ApproveWorkbenchJobActivity: 'ApproveWorkbenchJobActivity', + RejectWorkbenchJobActivity: 'RejectWorkbenchJobActivity', CreateWorkbench: 'CreateWorkbench', UpdateWorkbench: 'UpdateWorkbench', CreateWorkbenchEval: 'CreateWorkbenchEval', @@ -47243,6 +47775,7 @@ export const namedOperations = { ScmWebhook: 'ScmWebhook', AwaitingReviewStack: 'AwaitingReviewStack', AwaitingReviewAgentRun: 'AwaitingReviewAgentRun', + AwaitingReviewWorkbenchActivity: 'AwaitingReviewWorkbenchActivity', ObjectStore: 'ObjectStore', ClustersObjectStores: 'ClustersObjectStores', ClusterBackup: 'ClusterBackup', @@ -47504,6 +48037,7 @@ export const namedOperations = { WorkbenchAccessibleUser: 'WorkbenchAccessibleUser', WorkbenchJobSearchRow: 'WorkbenchJobSearchRow', UnifiedWorkbenchSkillTiny: 'UnifiedWorkbenchSkillTiny', + WorkbenchJobAction: 'WorkbenchJobAction', WorkbenchLinkCard: 'WorkbenchLinkCard' } } \ No newline at end of file diff --git a/assets/src/generated/persisted-queries/client.json b/assets/src/generated/persisted-queries/client.json index bc0a79f7bc..48692d0654 100644 --- a/assets/src/generated/persisted-queries/client.json +++ b/assets/src/generated/persisted-queries/client.json @@ -422,10 +422,15 @@ "name": "PendingApprovalStacks", "body": "query PendingApprovalStacks($first: Int = 50) {\n infrastructureStacks(first: $first, status: PENDING_APPROVAL) {\n edges {\n node {\n ...AwaitingReviewStack\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment AwaitingReviewStack on InfrastructureStack {\n id\n name\n status\n runs(first: 50) {\n edges {\n node {\n id\n status\n message\n approvalResult {\n reason\n result\n __typename\n }\n configuration {\n aiApproval {\n enabled\n __typename\n }\n __typename\n }\n pullRequest {\n id\n title\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}" }, - "sha256:889b429fc27f76a2f9525100fd7754554439fcf3432d6ac68c4ecab07ef42b84": { + "sha256:5cb0329ff57c67cea17fbeb4796df76ce3572b9c9ee7a132aeda2f1528821aa4": { "type": "query", "name": "PendingApprovalAgentRuns", - "body": "query PendingApprovalAgentRuns($first: Int = 100) {\n agentRuns(first: $first, status: PENDING_APPROVAL) {\n edges {\n node {\n ...AwaitingReviewAgentRun\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment AwaitingReviewAgentRun on AgentRun {\n id\n status\n approvedAt\n prompt\n repository\n runtime {\n id\n name\n type\n __typename\n }\n analysis {\n summary\n __typename\n }\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}" + "body": "query PendingApprovalAgentRuns($first: Int = 100) {\n agentRuns(first: $first, status: PENDING_APPROVAL) {\n edges {\n node {\n ...AwaitingReviewAgentRun\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment AwaitingReviewAgentRun on AgentRun {\n id\n status\n approvedAt\n prompt\n repository\n runtime {\n id\n name\n type\n __typename\n }\n analysis {\n summary\n __typename\n }\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n workbenchJob {\n id\n insertedAt\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}" + }, + "sha256:f990718125ae298a7a56e2f63c9ed923921f70f2a94d1ef5b03f9373e80f0590": { + "type": "query", + "name": "PendingApprovalWorkbenchActivities", + "body": "query PendingApprovalWorkbenchActivities($first: Int = 100) {\n workbenchJobActivities(first: $first, status: NEEDS_APPROVAL) {\n edges {\n node {\n ...AwaitingReviewWorkbenchActivity\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment AwaitingReviewWorkbenchActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n result {\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n __typename\n }\n __typename\n }\n workbenchJob {\n id\n prompt\n insertedAt\n result {\n workingTheory\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n __typename\n}" }, "sha256:988ccffca43dd7f6a0d38dc29d76ea7b85bb4b829d0df9f1ae79511ca4472221": { "type": "query", @@ -1092,10 +1097,10 @@ "name": "FlowServices", "body": "query FlowServices($id: ID!, $first: Int = 100, $after: String) {\n flow(id: $id) {\n id\n name\n services(first: $first, after: $after) {\n ...ServiceDeploymentsConnection\n __typename\n }\n __typename\n }\n}\n\nfragment ServiceDeploymentsConnection on ServiceDeploymentConnection {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...ServiceDeploymentsRow\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment ServiceDeploymentsRow on ServiceDeployment {\n id\n name\n namespace\n protect\n promotion\n message\n git {\n ref\n folder\n __typename\n }\n helm {\n chart\n version\n url\n repository {\n namespace\n name\n __typename\n }\n __typename\n }\n cluster {\n ...ClusterMinimal\n __typename\n }\n helmRepository {\n spec {\n url\n __typename\n }\n status {\n ready\n message\n __typename\n }\n __typename\n }\n repository {\n id\n url\n httpsPath\n __typename\n }\n insertedAt\n updatedAt\n deletedAt\n componentStatus\n status\n errors {\n message\n source\n warning\n __typename\n }\n globalService {\n id\n name\n __typename\n }\n dryRun\n insight {\n ...AiInsightSummary\n __typename\n }\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AiInsightSummary on AiInsight {\n id\n summary\n freshness\n insertedAt\n updatedAt\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}" }, - "sha256:40c0a9d9ac15aee6093ab13f077dab703c05bf4e8a023e937ac2732ee6f13940": { + "sha256:362471fe8162055e450e7f1e46c2ba95b0e793aa4feb5ef3a3fd6fbac86f105b": { "type": "query", "name": "FlowWorkbenches", - "body": "query FlowWorkbenches($id: ID!) {\n flow(id: $id) {\n id\n workbenches {\n ...WorkbenchTiny\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}" + "body": "query FlowWorkbenches($id: ID!) {\n flow(id: $id) {\n id\n workbenches {\n ...WorkbenchTiny\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}" }, "sha256:39ce3dd47d43775ca9c488c51ab1253afea3668fb5610f37f704b671c1ea8931": { "type": "query", @@ -1837,10 +1842,10 @@ "name": "ClusterVulnerabilityAggregate", "body": "query ClusterVulnerabilityAggregate($grade: VulnReportGrade!) {\n clusterVulnerabilityAggregate(grade: $grade) {\n ...ClusterVulnAggregate\n __typename\n }\n}\n\nfragment ClusterVulnAggregate on ClusterVulnAggregate {\n cluster {\n id\n name\n handle\n project {\n name\n __typename\n }\n __typename\n }\n count\n __typename\n}" }, - "sha256:3f24a2ed2b62946cd9dbcbb9ca402b714b30c58b1879ee30adb3fa1019bfd248": { + "sha256:11852c9b332656a7dae1adb959bb5bb793eb46b23147a306f9b87c221bf46cda": { "type": "query", "name": "Workbenches", - "body": "query Workbenches($first: Int = 100, $after: String, $q: String) {\n workbenches(first: $first, after: $after, q: $q) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchTiny\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}" + "body": "query Workbenches($first: Int = 100, $after: String, $q: String) {\n workbenches(first: $first, after: $after, q: $q) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchTiny\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}" }, "sha256:e24312281ff0bdee07c7efba9eb661487ae11140e5956fb74b9c455c14c916d2": { "type": "query", @@ -1872,10 +1877,10 @@ "name": "WorkbenchesAlerts", "body": "query WorkbenchesAlerts($first: Int = 100, $after: String) {\n workbenchAlerts(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...Alert\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}" }, - "sha256:aa328c3e124ed36f972175977471007c6d56b07e270cba09241b8f2af379b8b6": { + "sha256:1fb40219102b95b04c8c6625d81edcbc9e1da8ea8bf89b0a9969e88a05d86499": { "type": "query", "name": "Workbench", - "body": "query Workbench($id: ID, $name: String) {\n workbench(id: $id, name: $name) {\n ...Workbench\n __typename\n }\n}\n\nfragment Workbench on Workbench {\n ...WorkbenchTiny\n systemPrompt\n agentRuntime {\n id\n name\n __typename\n }\n repository {\n id\n __typename\n }\n configuration {\n infrastructure {\n services\n stacks\n kubernetes\n podLogs\n vulnerabilities\n sentinels\n __typename\n }\n observability {\n logs\n metrics\n __typename\n }\n coding {\n mode\n repositories\n enableBabysitting\n __typename\n }\n __typename\n }\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n skills {\n ref {\n ref\n folder\n __typename\n }\n files\n __typename\n }\n workbenchSkills(first: 500) {\n edges {\n node {\n id\n name\n description\n contents\n subagents\n __typename\n }\n __typename\n }\n __typename\n }\n tools {\n ...WorkbenchTool\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n botUser {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "query Workbench($id: ID, $name: String) {\n workbench(id: $id, name: $name) {\n ...Workbench\n __typename\n }\n}\n\nfragment Workbench on Workbench {\n ...WorkbenchTiny\n systemPrompt\n agentRuntime {\n id\n name\n __typename\n }\n repository {\n id\n __typename\n }\n configuration {\n infrastructure {\n services\n stacks\n kubernetes\n podLogs\n vulnerabilities\n sentinels\n __typename\n }\n observability {\n logs\n metrics\n __typename\n }\n coding {\n mode\n repositories\n enableBabysitting\n __typename\n }\n __typename\n }\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n skills {\n ref {\n ref\n folder\n __typename\n }\n files\n __typename\n }\n workbenchSkills(first: 500) {\n edges {\n node {\n id\n name\n description\n contents\n subagents\n __typename\n }\n __typename\n }\n __typename\n }\n tools {\n ...WorkbenchTool\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n botUser {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n lambda {\n lambdaArn\n description\n inputSchema\n __typename\n }\n cloudRun {\n identifier\n description\n inputSchema\n __typename\n }\n azureFunction {\n identifier\n description\n inputSchema\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:6c3686838d1372371451664e8d6b593929eeca76e340065ed6dda5691e325b56": { "type": "query", @@ -1922,15 +1927,15 @@ "name": "WorkbenchIssues", "body": "query WorkbenchIssues($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n issues(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchIssue\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchIssue on Issue {\n id\n title\n externalId\n provider\n status\n url\n insertedAt\n updatedAt\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n __typename\n}" }, - "sha256:1b8e05e6859f73309fcfc4eb2566c85a3a11d87aaac11f70927ba933ab92d0d6": { + "sha256:47732995492227678d12f1dba6438dc71ef7c65ebf8763d4feb398a038e5e897": { "type": "mutation", "name": "GetWorkbenchCron", - "body": "mutation GetWorkbenchCron($id: ID!) {\n workbenchCron(id: $id) {\n ...WorkbenchCron\n __typename\n }\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" + "body": "mutation GetWorkbenchCron($id: ID!) {\n workbenchCron(id: $id) {\n ...WorkbenchCron\n __typename\n }\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" }, - "sha256:d9a7cff2a6178142013d3f86730a0c2132033f31aecfac685a52c75ef4cc86da": { + "sha256:63219c6ec0447d784026248db4cf9814a4578f183554d267c1524bc7c33ea3e0": { "type": "query", "name": "WorkbenchCrons", - "body": "query WorkbenchCrons($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n crons(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchCron\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" + "body": "query WorkbenchCrons($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n crons(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchCron\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" }, "sha256:827016e22fcc91757ab713668fd457d7c16f7a11e17446aaaed7b55beffbb342": { "type": "query", @@ -1942,20 +1947,20 @@ "name": "WorkbenchPrompts", "body": "query WorkbenchPrompts($id: ID!, $first: Int = 500, $after: String) {\n workbench(id: $id) {\n id\n prompts(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchPrompt\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchPrompt on WorkbenchPrompt {\n id\n title\n category\n prompt\n insertedAt\n updatedAt\n __typename\n}" }, - "sha256:40d0cbd0710088ba7a9ee85dfd67d369c8c70424501ad529941313ef569cbbac": { + "sha256:53cec0c203f2dc44b1de46d42693bc1ec8327437812fc93f49acbb20ba964035": { "type": "query", "name": "WorkbenchWebhooks", - "body": "query WorkbenchWebhooks($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n webhooks(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchWebhook\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "query WorkbenchWebhooks($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n webhooks(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchWebhook\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:eede92654c6725ca3fb1169af743ec0130a9a0b8830b07fbf263aa96f3bd0c9c": { + "sha256:901e008b53f903c1d0622eddc857903e6c179a3ba82940bd41258c5aaa1a31c0": { "type": "query", "name": "WorkbenchChatbots", - "body": "query WorkbenchChatbots($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n chatbots(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchChatbot\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "query WorkbenchChatbots($id: ID!, $first: Int = 100, $after: String) {\n workbench(id: $id) {\n id\n chatbots(first: $first, after: $after) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchChatbot\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:36823f132eedbf39209c7765d7810f289d4dc217664359e7ff1a34b80f2baf89": { + "sha256:75205f0ac6d7b66f247168657792fd42a16f4e421ca1bed94e8209f3536450d1": { "type": "query", "name": "WorkbenchChatbot", - "body": "query WorkbenchChatbot($id: ID!) {\n workbenchChatbot(id: $id) {\n ...WorkbenchChatbot\n __typename\n }\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "query WorkbenchChatbot($id: ID!) {\n workbenchChatbot(id: $id) {\n ...WorkbenchChatbot\n __typename\n }\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:5ffd312bb8d3a3ca55f7c873cb410af0478ef48c73f0e3bf76a62d202c97ffd3": { "type": "query", @@ -1972,10 +1977,10 @@ "name": "ChatProviderConnection", "body": "query ChatProviderConnection($id: ID!) {\n chatProviderConnection(id: $id) {\n ...ChatProviderConnection\n __typename\n }\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:10a9e5b8a7922749dc4ed0747ea19abc9a00977196f361a5b47bd4fdbd15e6ce": { + "sha256:8b30b20ad364a13c3fd8882472c88e709092788f2c6bb8e0c24770643202a12a": { "type": "mutation", "name": "GetWorkbenchWebhook", - "body": "mutation GetWorkbenchWebhook($id: ID!) {\n getWorkbenchWebhook(id: $id) {\n ...WorkbenchWebhook\n __typename\n }\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation GetWorkbenchWebhook($id: ID!) {\n getWorkbenchWebhook(id: $id) {\n ...WorkbenchWebhook\n __typename\n }\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:3487cf49c8d19eb4dbff60eccfa8a6ec7db7731e764165a20c877ad49f594371": { "type": "query", @@ -1987,15 +1992,15 @@ "name": "IssueWebhook", "body": "query IssueWebhook($id: ID, $name: String) {\n issueWebhook(id: $id, name: $name) {\n ...IssueWebhook\n __typename\n }\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:2b8a3634af7ae0514d12f4d9d2065aec6f664ce452dfd9d003e12a111ccdd7aa": { + "sha256:e28cb0f0171e0f4c626968d9d57ee04f259b4cbdae02291745cce0a28808cef6": { "type": "query", "name": "WorkbenchTriggersSummary", - "body": "query WorkbenchTriggersSummary($id: ID!) {\n workbench(id: $id) {\n id\n name\n description\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n crons(first: 30) {\n edges {\n node {\n id\n crontab\n prompt\n nextRunAt\n __typename\n }\n __typename\n }\n __typename\n }\n webhooks(first: 30) {\n edges {\n node {\n id\n name\n prompt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n chatbots(first: 30) {\n edges {\n node {\n id\n channel\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}" + "body": "query WorkbenchTriggersSummary($id: ID!) {\n workbench(id: $id) {\n id\n name\n description\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n crons(first: 30) {\n edges {\n node {\n id\n crontab\n prompt\n nextRunAt\n __typename\n }\n __typename\n }\n __typename\n }\n webhooks(first: 30) {\n edges {\n node {\n id\n name\n prompt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n chatbots(first: 30) {\n edges {\n node {\n id\n channel\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}" }, - "sha256:5c9c3d16b0c37f2f943daef94015608432c991d4452116908353c005b536521c": { + "sha256:df284a9a636d2fe8e1db56363fe285cef7b2fe0d0ad2a976a531102e64292efe": { "type": "query", "name": "WorkbenchJob", - "body": "query WorkbenchJob($id: ID!) {\n workbenchJob(id: $id) {\n ...WorkbenchJob\n __typename\n }\n}\n\nfragment WorkbenchJob on WorkbenchJob {\n ...WorkbenchJobTiny\n usage {\n ...WorkbenchJobUsage\n __typename\n }\n workbench {\n id\n name\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n alert {\n ...Alert\n __typename\n }\n issue {\n id\n title\n externalId\n insertedAt\n status\n url\n provider\n __typename\n }\n result {\n ...WorkbenchJobResult\n __typename\n }\n evalResult {\n feedback {\n summary\n prompt\n result\n logic\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobUsage on WorkbenchJobUsage {\n cachedTokens\n inputCost\n inputTokens\n outputCost\n outputTokens\n reasoningTokens\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" + "body": "query WorkbenchJob($id: ID!) {\n workbenchJob(id: $id) {\n ...WorkbenchJob\n __typename\n }\n}\n\nfragment WorkbenchJob on WorkbenchJob {\n ...WorkbenchJobTiny\n usage {\n ...WorkbenchJobUsage\n __typename\n }\n workbench {\n id\n name\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n alert {\n ...Alert\n __typename\n }\n issue {\n id\n title\n externalId\n insertedAt\n status\n url\n provider\n __typename\n }\n result {\n ...WorkbenchJobResult\n __typename\n }\n evalResult {\n feedback {\n summary\n prompt\n result\n logic\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobUsage on WorkbenchJobUsage {\n cachedTokens\n inputCost\n inputTokens\n outputCost\n outputTokens\n reasoningTokens\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" }, "sha256:7bbf8dc92479eaf54d2eae5bfcce896824482ef79c88df0fc1be12c64b4158ba": { "type": "query", @@ -2012,10 +2017,30 @@ "name": "WorkbenchJobTracesTool", "body": "query WorkbenchJobTracesTool($id: ID!, $name: String, $arguments: Json) {\n workbenchJob(id: $id) {\n id\n tracesTool(name: $name, arguments: $arguments) {\n ...WorkbenchJobActivityTrace\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}" }, - "sha256:766ef19189729b5b2be624c0c3e48affe9150e1b369d7c186585d44e6a1686dc": { + "sha256:7cdc418e225153157a4fc45bda81cb061f35a14f9c1156dfb026123486ccaa23": { "type": "query", "name": "WorkbenchJobActivities", - "body": "query WorkbenchJobActivities($id: ID!) {\n workbenchJob(id: $id) {\n id\n status\n prompt\n workbench {\n id\n __typename\n }\n referencedJob {\n id\n prompt\n status\n workbench {\n id\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n __typename\n }\n activities(first: 100) {\n edges {\n node {\n ...WorkbenchJobActivity\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n __typename\n }\n kubeRequest {\n handle\n method\n path\n body\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}" + "body": "query WorkbenchJobActivities($id: ID!) {\n workbenchJob(id: $id) {\n id\n status\n prompt\n workbench {\n id\n __typename\n }\n referencedJob {\n id\n prompt\n status\n workbench {\n id\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n __typename\n }\n activities(first: 100) {\n edges {\n node {\n ...WorkbenchJobActivity\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}" + }, + "sha256:58e06a37b563b9ad7356ba2e596b3c6e5e5be8323b8472e1fa8f30da7552dec2": { + "type": "query", + "name": "WorkbenchJobActionSummary", + "body": "query WorkbenchJobActionSummary($id: ID!, $first: Int = 1) {\n workbenchJob(id: $id) {\n id\n pendingActions: activities(first: $first, status: NEEDS_APPROVAL) {\n edges {\n node {\n id\n __typename\n }\n __typename\n }\n __typename\n }\n functionActions: activities(first: $first, type: FUNCTION) {\n edges {\n node {\n id\n __typename\n }\n __typename\n }\n __typename\n }\n kubernetesActions: activities(first: $first, type: KUBERNETES) {\n edges {\n node {\n id\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}" + }, + "sha256:becd7d4b4f55e1936d6113cce1c73515598fe91a65822ebd37056410dd134ad8": { + "type": "query", + "name": "WorkbenchJobActions", + "body": "query WorkbenchJobActions($id: ID!) {\n workbenchJob(id: $id) {\n id\n activities(first: 100) {\n edges {\n node {\n ...WorkbenchJobAction\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobAction on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}" + }, + "sha256:efcbc3675eb890bf144799f79038d665a58dd851a30524eb823ef9bac57edad0": { + "type": "mutation", + "name": "ApproveWorkbenchJobActivity", + "body": "mutation ApproveWorkbenchJobActivity($id: ID!) {\n approveWorkbenchJobActivity(id: $id) {\n ...WorkbenchJobAction\n __typename\n }\n}\n\nfragment WorkbenchJobAction on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}" + }, + "sha256:049abfa4119da974dcaccd33e7ba359fa9ec657304604a6af5c916dbe4732885": { + "type": "mutation", + "name": "RejectWorkbenchJobActivity", + "body": "mutation RejectWorkbenchJobActivity($id: ID!, $reason: String) {\n rejectWorkbenchJobActivity(id: $id, reason: $reason) {\n ...WorkbenchJobAction\n __typename\n }\n}\n\nfragment WorkbenchJobAction on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}" }, "sha256:1367ab87fa3cb2913dca622df4606e0b0e2217e1abedeae5807cbcaf496114ac": { "type": "query", @@ -2027,30 +2052,35 @@ "name": "WorkbenchJobActivityWhimseyText", "body": "query WorkbenchJobActivityWhimseyText($id: ID!) {\n workbenchJobActivity(id: $id) {\n id\n whimsey\n __typename\n }\n}" }, - "sha256:1c990e678cb74a3281b7212cb6f260cb9b08a35a50b57e94aba469a99af7029a": { + "sha256:423effc61434b859da2a40c53935ae204276d767027ad5a933c85d396807f818": { "type": "query", "name": "WorkbenchJobActivity", - "body": "query WorkbenchJobActivity($id: ID!) {\n workbenchJobActivity(id: $id) {\n ...WorkbenchJobActivityWithThoughts\n __typename\n }\n}\n\nfragment WorkbenchJobActivityWithThoughts on WorkbenchJobActivity {\n ...WorkbenchJobActivity\n thoughts {\n ...WorkbenchJobThought\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n __typename\n }\n kubeRequest {\n handle\n method\n path\n body\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}\n\nfragment WorkbenchJobThought on WorkbenchJobThought {\n id\n content\n toolName\n toolArgs\n activity {\n id\n __typename\n }\n attributes {\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n metrics {\n ...WorkbenchJobActivityMetric\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivityMetric on WorkbenchJobActivityMetric {\n timestamp\n name\n value\n labels\n __typename\n}" + "body": "query WorkbenchJobActivity($id: ID!) {\n workbenchJobActivity(id: $id) {\n ...WorkbenchJobActivityWithThoughts\n __typename\n }\n}\n\nfragment WorkbenchJobActivityWithThoughts on WorkbenchJobActivity {\n ...WorkbenchJobActivity\n thoughts {\n ...WorkbenchJobThought\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}\n\nfragment WorkbenchJobThought on WorkbenchJobThought {\n id\n content\n toolName\n toolArgs\n activity {\n id\n __typename\n }\n attributes {\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n metrics {\n ...WorkbenchJobActivityMetric\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivityMetric on WorkbenchJobActivityMetric {\n timestamp\n name\n value\n labels\n __typename\n}" + }, + "sha256:ff984e68d27f08c9395b10c31c0c5314157451bf3699059c598c004c5da9cff0": { + "type": "query", + "name": "WorkbenchJobKubeRequestDiff", + "body": "query WorkbenchJobKubeRequestDiff($id: ID!) {\n workbenchJobActivity(id: $id) {\n id\n result {\n kubeRequest {\n handle\n method\n path\n body\n contentType\n current\n __typename\n }\n __typename\n }\n __typename\n }\n}" }, - "sha256:e0438f6d3a5650a71ec3df99e7e73f218aae5e457accc71195a075aa1d359ea0": { + "sha256:13ca0786672355db1deeaf3a29d7f2681d5d34cff26a07ae9509aff09dcebe94": { "type": "query", "name": "WorkbenchTools", - "body": "query WorkbenchTools($first: Int = 100, $after: String, $q: String) {\n workbenchTools(first: $first, after: $after, q: $q) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}" + "body": "query WorkbenchTools($first: Int = 100, $after: String, $q: String) {\n workbenchTools(first: $first, after: $after, q: $q) {\n pageInfo {\n ...PageInfo\n __typename\n }\n edges {\n node {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PageInfo on PageInfo {\n hasNextPage\n endCursor\n hasPreviousPage\n startCursor\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}" }, - "sha256:3c46397dac105d41477dbe615144decaa5ca6811536d68de3f22b677a31447e2": { + "sha256:53680cf7767fe323b55d30ed33f9914ad4694bc246edb87d7e8d58093de140c0": { "type": "query", "name": "WorkbenchTool", - "body": "query WorkbenchTool($id: ID, $name: String) {\n workbenchTool(id: $id, name: $name) {\n ...WorkbenchTool\n __typename\n }\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "query WorkbenchTool($id: ID, $name: String) {\n workbenchTool(id: $id, name: $name) {\n ...WorkbenchTool\n __typename\n }\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n lambda {\n lambdaArn\n description\n inputSchema\n __typename\n }\n cloudRun {\n identifier\n description\n inputSchema\n __typename\n }\n azureFunction {\n identifier\n description\n inputSchema\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:e27e92588b960f6c1c7f843fb48daddcb1cd6ce4b2409afa7ea4e6e5891d1506": { + "sha256:12b198f57d75e1b45aaf10cd18e3906adcb390cd555f0c303b4cba5e8dfdc013": { "type": "mutation", "name": "CreateWorkbench", - "body": "mutation CreateWorkbench($attributes: WorkbenchAttributes!) {\n createWorkbench(attributes: $attributes) {\n ...Workbench\n __typename\n }\n}\n\nfragment Workbench on Workbench {\n ...WorkbenchTiny\n systemPrompt\n agentRuntime {\n id\n name\n __typename\n }\n repository {\n id\n __typename\n }\n configuration {\n infrastructure {\n services\n stacks\n kubernetes\n podLogs\n vulnerabilities\n sentinels\n __typename\n }\n observability {\n logs\n metrics\n __typename\n }\n coding {\n mode\n repositories\n enableBabysitting\n __typename\n }\n __typename\n }\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n skills {\n ref {\n ref\n folder\n __typename\n }\n files\n __typename\n }\n workbenchSkills(first: 500) {\n edges {\n node {\n id\n name\n description\n contents\n subagents\n __typename\n }\n __typename\n }\n __typename\n }\n tools {\n ...WorkbenchTool\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n botUser {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation CreateWorkbench($attributes: WorkbenchAttributes!) {\n createWorkbench(attributes: $attributes) {\n ...Workbench\n __typename\n }\n}\n\nfragment Workbench on Workbench {\n ...WorkbenchTiny\n systemPrompt\n agentRuntime {\n id\n name\n __typename\n }\n repository {\n id\n __typename\n }\n configuration {\n infrastructure {\n services\n stacks\n kubernetes\n podLogs\n vulnerabilities\n sentinels\n __typename\n }\n observability {\n logs\n metrics\n __typename\n }\n coding {\n mode\n repositories\n enableBabysitting\n __typename\n }\n __typename\n }\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n skills {\n ref {\n ref\n folder\n __typename\n }\n files\n __typename\n }\n workbenchSkills(first: 500) {\n edges {\n node {\n id\n name\n description\n contents\n subagents\n __typename\n }\n __typename\n }\n __typename\n }\n tools {\n ...WorkbenchTool\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n botUser {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n lambda {\n lambdaArn\n description\n inputSchema\n __typename\n }\n cloudRun {\n identifier\n description\n inputSchema\n __typename\n }\n azureFunction {\n identifier\n description\n inputSchema\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:20cd5db0a3983f865eb9c0db8ffa21370efcc7d9b7cf2526c7a6213f016ecb93": { + "sha256:93c949787303f30b3b2d76777d760b534b251d53b7f3febf32b48b7de6de3909": { "type": "mutation", "name": "UpdateWorkbench", - "body": "mutation UpdateWorkbench($id: ID!, $attributes: WorkbenchAttributes!) {\n updateWorkbench(id: $id, attributes: $attributes) {\n ...Workbench\n __typename\n }\n}\n\nfragment Workbench on Workbench {\n ...WorkbenchTiny\n systemPrompt\n agentRuntime {\n id\n name\n __typename\n }\n repository {\n id\n __typename\n }\n configuration {\n infrastructure {\n services\n stacks\n kubernetes\n podLogs\n vulnerabilities\n sentinels\n __typename\n }\n observability {\n logs\n metrics\n __typename\n }\n coding {\n mode\n repositories\n enableBabysitting\n __typename\n }\n __typename\n }\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n skills {\n ref {\n ref\n folder\n __typename\n }\n files\n __typename\n }\n workbenchSkills(first: 500) {\n edges {\n node {\n id\n name\n description\n contents\n subagents\n __typename\n }\n __typename\n }\n __typename\n }\n tools {\n ...WorkbenchTool\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n botUser {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation UpdateWorkbench($id: ID!, $attributes: WorkbenchAttributes!) {\n updateWorkbench(id: $id, attributes: $attributes) {\n ...Workbench\n __typename\n }\n}\n\nfragment Workbench on Workbench {\n ...WorkbenchTiny\n systemPrompt\n agentRuntime {\n id\n name\n __typename\n }\n repository {\n id\n __typename\n }\n configuration {\n infrastructure {\n services\n stacks\n kubernetes\n podLogs\n vulnerabilities\n sentinels\n __typename\n }\n observability {\n logs\n metrics\n __typename\n }\n coding {\n mode\n repositories\n enableBabysitting\n __typename\n }\n __typename\n }\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n skills {\n ref {\n ref\n folder\n __typename\n }\n files\n __typename\n }\n workbenchSkills(first: 500) {\n edges {\n node {\n id\n name\n description\n contents\n subagents\n __typename\n }\n __typename\n }\n __typename\n }\n tools {\n ...WorkbenchTool\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n botUser {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment WorkbenchTiny on Workbench {\n id\n name\n description\n agentRuntime {\n id\n name\n type\n __typename\n }\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n webhooks(first: 50) {\n edges {\n node {\n ...WorkbenchWebhookTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment WorkbenchWebhookTiny on WorkbenchWebhook {\n id\n name\n priority\n webhook {\n id\n type\n __typename\n }\n issueWebhook {\n ...IssueWebhookTiny\n __typename\n }\n __typename\n}\n\nfragment IssueWebhookTiny on IssueWebhook {\n id\n provider\n __typename\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n lambda {\n lambdaArn\n description\n inputSchema\n __typename\n }\n cloudRun {\n identifier\n description\n inputSchema\n __typename\n }\n azureFunction {\n identifier\n description\n inputSchema\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:6bdd9295cb14dc91a238b8bb12b0b9b2781f2c6789194acd1364f8fe10bb3f6a": { "type": "mutation", @@ -2067,45 +2097,45 @@ "name": "DeleteWorkbenchEval", "body": "mutation DeleteWorkbenchEval($id: ID!) {\n deleteWorkbenchEval(id: $id) {\n id\n __typename\n }\n}" }, - "sha256:b04c99b8bd711fc0e914d4110ad35a9dd915ad13897d3185e9c09862b39e0716": { + "sha256:4bfdc8b6b2ee06f0bf0a902a490d01a0b1c80d55a68a598d1fe8506a530de385": { "type": "mutation", "name": "WorkbenchEvalSkill", - "body": "mutation WorkbenchEvalSkill($id: ID!, $prompt: String) {\n workbenchEvalSkill(id: $id, prompt: $prompt) {\n ...WorkbenchJob\n __typename\n }\n}\n\nfragment WorkbenchJob on WorkbenchJob {\n ...WorkbenchJobTiny\n usage {\n ...WorkbenchJobUsage\n __typename\n }\n workbench {\n id\n name\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n alert {\n ...Alert\n __typename\n }\n issue {\n id\n title\n externalId\n insertedAt\n status\n url\n provider\n __typename\n }\n result {\n ...WorkbenchJobResult\n __typename\n }\n evalResult {\n feedback {\n summary\n prompt\n result\n logic\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobUsage on WorkbenchJobUsage {\n cachedTokens\n inputCost\n inputTokens\n outputCost\n outputTokens\n reasoningTokens\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" + "body": "mutation WorkbenchEvalSkill($id: ID!, $prompt: String) {\n workbenchEvalSkill(id: $id, prompt: $prompt) {\n ...WorkbenchJob\n __typename\n }\n}\n\nfragment WorkbenchJob on WorkbenchJob {\n ...WorkbenchJobTiny\n usage {\n ...WorkbenchJobUsage\n __typename\n }\n workbench {\n id\n name\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n alert {\n ...Alert\n __typename\n }\n issue {\n id\n title\n externalId\n insertedAt\n status\n url\n provider\n __typename\n }\n result {\n ...WorkbenchJobResult\n __typename\n }\n evalResult {\n feedback {\n summary\n prompt\n result\n logic\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobUsage on WorkbenchJobUsage {\n cachedTokens\n inputCost\n inputTokens\n outputCost\n outputTokens\n reasoningTokens\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" }, "sha256:7b6b450c0f286e31340ab42bfb2ab3d7137c56ed0885c120769c51d006ac14e2": { "type": "mutation", "name": "DeleteWorkbench", "body": "mutation DeleteWorkbench($id: ID!) {\n deleteWorkbench(id: $id) {\n id\n __typename\n }\n}" }, - "sha256:a9736a14721a59755abe2c76e98ebdc36fd63b330e704524b348a42f8b638e10": { + "sha256:80ab043927385b3aad0e630266cca291616e58e827f9e64ae569832bcb8be2ac": { "type": "mutation", "name": "CreateWorkbenchTool", - "body": "mutation CreateWorkbenchTool($attributes: WorkbenchToolAttributes!) {\n createWorkbenchTool(attributes: $attributes) {\n ...WorkbenchTool\n __typename\n }\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation CreateWorkbenchTool($attributes: WorkbenchToolAttributes!) {\n createWorkbenchTool(attributes: $attributes) {\n ...WorkbenchTool\n __typename\n }\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n lambda {\n lambdaArn\n description\n inputSchema\n __typename\n }\n cloudRun {\n identifier\n description\n inputSchema\n __typename\n }\n azureFunction {\n identifier\n description\n inputSchema\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:2c69e6f3ba75206af80cd3e7105e609dc3dbdb9457e8ac2cfdd23f124d3ca809": { + "sha256:a172236ffe1b891da22ca7ccf0645567d5d78b0d8c501d46d2e915d30b9aa69e": { "type": "mutation", "name": "UpdateWorkbenchTool", - "body": "mutation UpdateWorkbenchTool($id: ID!, $attributes: WorkbenchToolAttributes!) {\n updateWorkbenchTool(id: $id, attributes: $attributes) {\n ...WorkbenchTool\n __typename\n }\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation UpdateWorkbenchTool($id: ID!, $attributes: WorkbenchToolAttributes!) {\n updateWorkbenchTool(id: $id, attributes: $attributes) {\n ...WorkbenchTool\n __typename\n }\n}\n\nfragment WorkbenchTool on WorkbenchTool {\n ...WorkbenchToolTiny\n scmConnection {\n id\n name\n type\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n configuration {\n http {\n url\n method\n headers {\n name\n value\n __typename\n }\n body\n inputSchema\n __typename\n }\n datadog {\n site\n __typename\n }\n elastic {\n index\n url\n username\n __typename\n }\n opensearch {\n host\n index\n awsAccessKeyId\n awsRegion\n assumeRoleArn\n usePodIdentity\n __typename\n }\n loki {\n url\n username\n tenantId\n __typename\n }\n prometheus {\n url\n username\n tenantId\n awsSigv4\n awsAccessKeyId\n awsRegion\n __typename\n }\n tempo {\n url\n username\n tenantId\n __typename\n }\n jaeger {\n url\n username\n __typename\n }\n atlassian {\n email\n url\n __typename\n }\n linear {\n url\n __typename\n }\n slack {\n url\n __typename\n }\n pagerduty {\n url\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n splunk {\n url\n username\n __typename\n }\n cloudwatch {\n logGroupNames\n region\n roleArn\n roleSessionName\n __typename\n }\n azure {\n subscriptionId\n tenantId\n clientId\n prometheusUrl\n __typename\n }\n dynatrace {\n url\n __typename\n }\n sentry {\n url\n __typename\n }\n github {\n url\n toolset\n appId\n installationId\n __typename\n }\n gitlab {\n url\n __typename\n }\n bitbucket {\n url\n __typename\n }\n bitbucketDatacenter {\n url\n __typename\n }\n azureDevops {\n url\n __typename\n }\n lambda {\n lambdaArn\n description\n inputSchema\n __typename\n }\n cloudRun {\n identifier\n description\n inputSchema\n __typename\n }\n azureFunction {\n identifier\n description\n inputSchema\n __typename\n }\n docker {\n url\n provider\n proxy {\n url\n noproxy\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:c48b92f91779f79e1feb98e23d681a30cc7bc2f045519d3998ba022a38a9b460": { "type": "mutation", "name": "DeleteWorkbenchTool", "body": "mutation DeleteWorkbenchTool($id: ID!) {\n deleteWorkbenchTool(id: $id) {\n id\n __typename\n }\n}" }, - "sha256:5cca232f23700b424eabcc3215d30a044c8b583ea6a8f7e2906802a44aacb5a0": { + "sha256:b52fdbc20a4db4115bc6b076065f99997b6674933286c2dc791a8fb7bf68253a": { "type": "mutation", "name": "CreateWorkbenchJob", - "body": "mutation CreateWorkbenchJob($workbenchId: ID!, $attributes: WorkbenchJobAttributes!) {\n createWorkbenchJob(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchJob\n __typename\n }\n}\n\nfragment WorkbenchJob on WorkbenchJob {\n ...WorkbenchJobTiny\n usage {\n ...WorkbenchJobUsage\n __typename\n }\n workbench {\n id\n name\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n alert {\n ...Alert\n __typename\n }\n issue {\n id\n title\n externalId\n insertedAt\n status\n url\n provider\n __typename\n }\n result {\n ...WorkbenchJobResult\n __typename\n }\n evalResult {\n feedback {\n summary\n prompt\n result\n logic\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobUsage on WorkbenchJobUsage {\n cachedTokens\n inputCost\n inputTokens\n outputCost\n outputTokens\n reasoningTokens\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" + "body": "mutation CreateWorkbenchJob($workbenchId: ID!, $attributes: WorkbenchJobAttributes!) {\n createWorkbenchJob(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchJob\n __typename\n }\n}\n\nfragment WorkbenchJob on WorkbenchJob {\n ...WorkbenchJobTiny\n usage {\n ...WorkbenchJobUsage\n __typename\n }\n workbench {\n id\n name\n tools {\n ...WorkbenchToolTiny\n __typename\n }\n __typename\n }\n alert {\n ...Alert\n __typename\n }\n issue {\n id\n title\n externalId\n insertedAt\n status\n url\n provider\n __typename\n }\n result {\n ...WorkbenchJobResult\n __typename\n }\n evalResult {\n feedback {\n summary\n prompt\n result\n logic\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobUsage on WorkbenchJobUsage {\n cachedTokens\n inputCost\n inputTokens\n outputCost\n outputTokens\n reasoningTokens\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchToolTiny on WorkbenchTool {\n id\n name\n tool\n categories\n approval\n cloudConnection {\n ...CloudConnectionTiny\n __typename\n }\n mcpServer {\n id\n name\n url\n __typename\n }\n __typename\n}\n\nfragment CloudConnectionTiny on CloudConnection {\n id\n name\n provider\n __typename\n}\n\nfragment Alert on Alert {\n id\n title\n message\n type\n severity\n state\n fingerprint\n url\n annotations\n tags {\n id\n name\n value\n __typename\n }\n insight {\n ...AiInsight\n __typename\n }\n resolution {\n ...AlertResolution\n __typename\n }\n workbench {\n id\n __typename\n }\n workbenchJob {\n id\n status\n __typename\n }\n updatedAt\n __typename\n}\n\nfragment AiInsight on AiInsight {\n id\n text\n summary\n sha\n freshness\n updatedAt\n insertedAt\n error {\n message\n source\n __typename\n }\n ...AiInsightContext\n __typename\n}\n\nfragment AiInsightContext on AiInsight {\n evidence {\n ...AiInsightEvidence\n __typename\n }\n cluster {\n id\n name\n distro\n provider {\n cloud\n __typename\n }\n __typename\n }\n clusterInsightComponent {\n id\n name\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n name\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n __typename\n }\n stack {\n id\n name\n type\n __typename\n }\n stackRun {\n id\n message\n type\n stack {\n id\n name\n __typename\n }\n __typename\n }\n alert {\n id\n title\n message\n __typename\n }\n __typename\n}\n\nfragment AiInsightEvidence on AiInsightEvidence {\n id\n type\n logs {\n ...LogsEvidence\n __typename\n }\n pullRequest {\n ...PullRequestEvidence\n __typename\n }\n alert {\n ...AlertEvidence\n __typename\n }\n knowledge {\n ...KnowledgeEvidence\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment LogsEvidence on LogsEvidence {\n clusterId\n serviceId\n line\n lines {\n ...LogLine\n __typename\n }\n __typename\n}\n\nfragment LogLine on LogLine {\n facets {\n ...LogFacet\n __typename\n }\n log\n timestamp\n __typename\n}\n\nfragment LogFacet on LogFacet {\n key\n value\n __typename\n}\n\nfragment PullRequestEvidence on PullRequestEvidence {\n contents\n filename\n patch\n repo\n sha\n title\n url\n __typename\n}\n\nfragment AlertEvidence on AlertEvidence {\n alertId\n title\n resolution\n __typename\n}\n\nfragment KnowledgeEvidence on KnowledgeEvidence {\n name\n observations\n type\n __typename\n}\n\nfragment ClusterMinimal on Cluster {\n id\n name\n handle\n provider {\n name\n cloud\n __typename\n }\n distro\n __typename\n}\n\nfragment AlertResolution on AlertResolution {\n resolution\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" }, "sha256:dd0eb022c0aaaa8c305761cc3b9a52731a3df2a825b3af5722f2ed293400db36": { "type": "mutation", "name": "CancelWorkbenchJob", "body": "mutation CancelWorkbenchJob($jobId: ID!) {\n cancelWorkbenchJob(jobId: $jobId) {\n id\n status\n __typename\n }\n}" }, - "sha256:43ef1af9e7359631c0f50a04ed7be82613fedcdef77eb0f0220253e000103758": { + "sha256:ce58559013725f182dcd1111dae9862df7883af6b27281116c7ea5000eed646e": { "type": "mutation", "name": "CreateWorkbenchMessage", - "body": "mutation CreateWorkbenchMessage($jobId: ID!, $attributes: WorkbenchMessageAttributes!) {\n createWorkbenchMessage(jobId: $jobId, attributes: $attributes) {\n ...WorkbenchJobActivity\n __typename\n }\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n __typename\n }\n kubeRequest {\n handle\n method\n path\n body\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}" + "body": "mutation CreateWorkbenchMessage($jobId: ID!, $attributes: WorkbenchMessageAttributes!) {\n createWorkbenchMessage(jobId: $jobId, attributes: $attributes) {\n ...WorkbenchJobActivity\n __typename\n }\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}" }, "sha256:aec27aea620d94d724229e982ca5b06f6c40291b1488ebcb52c02655b989f534": { "type": "mutation", @@ -2122,45 +2152,45 @@ "name": "DeleteWorkbenchPrompt", "body": "mutation DeleteWorkbenchPrompt($id: ID!) {\n deleteWorkbenchPrompt(id: $id) {\n id\n __typename\n }\n}" }, - "sha256:618ad84f413fb8b1df58059e84f24e834138207e4b86c091882e2030d9c23381": { + "sha256:e9d842c0e5df16fa0ecf089035ed864106b269ec42917cebb472c9ff5945d370": { "type": "mutation", "name": "CreateWorkbenchCron", - "body": "mutation CreateWorkbenchCron($workbenchId: ID!, $attributes: WorkbenchCronAttributes!) {\n createWorkbenchCron(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchCron\n __typename\n }\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" + "body": "mutation CreateWorkbenchCron($workbenchId: ID!, $attributes: WorkbenchCronAttributes!) {\n createWorkbenchCron(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchCron\n __typename\n }\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" }, - "sha256:80e159f6d94125332c4f947c5ae663e704feb9e33cc8fa0bd653868b8b9f70a7": { + "sha256:d5a8e486c98c7608767dafe39455135b70cd4f10a61627fe09c69d749386372b": { "type": "mutation", "name": "UpdateWorkbenchCron", - "body": "mutation UpdateWorkbenchCron($id: ID!, $attributes: WorkbenchCronAttributes!) {\n updateWorkbenchCron(id: $id, attributes: $attributes) {\n ...WorkbenchCron\n __typename\n }\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" + "body": "mutation UpdateWorkbenchCron($id: ID!, $attributes: WorkbenchCronAttributes!) {\n updateWorkbenchCron(id: $id, attributes: $attributes) {\n ...WorkbenchCron\n __typename\n }\n}\n\nfragment WorkbenchCron on WorkbenchCron {\n id\n crontab\n prompt\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n lastRunAt\n nextRunAt\n insertedAt\n updatedAt\n __typename\n}" }, "sha256:b3965ac95b88758d9754efae4af12fc0cea16c124dd7fdd6dba1c30bcab3ad28": { "type": "mutation", "name": "DeleteWorkbenchCron", "body": "mutation DeleteWorkbenchCron($id: ID!) {\n deleteWorkbenchCron(id: $id) {\n id\n __typename\n }\n}" }, - "sha256:907668dbd186c42a573ee1b20fd2ce0db11349c46590a5f0512ccc922b7355e8": { + "sha256:c2d5c9c231632500af3ffaecc691770b68255fbb1ae3301a1a6d1f4572cdb6d4": { "type": "mutation", "name": "CreateWorkbenchWebhook", - "body": "mutation CreateWorkbenchWebhook($workbenchId: ID!, $attributes: WorkbenchWebhookAttributes!) {\n createWorkbenchWebhook(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchWebhook\n __typename\n }\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation CreateWorkbenchWebhook($workbenchId: ID!, $attributes: WorkbenchWebhookAttributes!) {\n createWorkbenchWebhook(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchWebhook\n __typename\n }\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:9d3ad28e40fe4cce33f25805f58a09237438bc221fac2f8a6485d36b6787dbff": { + "sha256:f5408b006170d47e04779cad5ed286550b9408c9833d29a4f0b4a0cfadb2f554": { "type": "mutation", "name": "UpdateWorkbenchWebhook", - "body": "mutation UpdateWorkbenchWebhook($id: ID!, $attributes: WorkbenchWebhookAttributes!) {\n updateWorkbenchWebhook(id: $id, attributes: $attributes) {\n ...WorkbenchWebhook\n __typename\n }\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation UpdateWorkbenchWebhook($id: ID!, $attributes: WorkbenchWebhookAttributes!) {\n updateWorkbenchWebhook(id: $id, attributes: $attributes) {\n ...WorkbenchWebhook\n __typename\n }\n}\n\nfragment WorkbenchWebhook on WorkbenchWebhook {\n id\n name\n prompt\n priority\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n matches {\n regex\n substring\n caseInsensitive\n __typename\n }\n insertedAt\n updatedAt\n webhook {\n id\n name\n type\n url\n __typename\n }\n issueWebhook {\n ...IssueWebhook\n __typename\n }\n __typename\n}\n\nfragment IssueWebhook on IssueWebhook {\n id\n name\n provider\n url\n insertedAt\n updatedAt\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:90f665268ee6333fe27fdf09680a420ab20d1600b2ea9e2e2cd06aed72494f8b": { "type": "mutation", "name": "DeleteWorkbenchWebhook", "body": "mutation DeleteWorkbenchWebhook($id: ID!) {\n deleteWorkbenchWebhook(id: $id) {\n id\n name\n __typename\n }\n}" }, - "sha256:3e997674e18ed4186a894a640bc9537d8b1bb93579f90d99bcb702ac873e8a77": { + "sha256:7437af30e322621931b4bde4514182e124d595cab6817af274b1efacdbd62a88": { "type": "mutation", "name": "CreateWorkbenchChatbot", - "body": "mutation CreateWorkbenchChatbot($workbenchId: ID!, $attributes: WorkbenchChatbotAttributes!) {\n createWorkbenchChatbot(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchChatbot\n __typename\n }\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation CreateWorkbenchChatbot($workbenchId: ID!, $attributes: WorkbenchChatbotAttributes!) {\n createWorkbenchChatbot(workbenchId: $workbenchId, attributes: $attributes) {\n ...WorkbenchChatbot\n __typename\n }\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, - "sha256:beb9aba8fe0e3d160e117831ac35c51b61849a1bf19a56fe5485dd51de4e6fcc": { + "sha256:e812d00fc1ef4ea8ffe8ff9eb82f71542f800dee0b41983262f5404f172d5b8c": { "type": "mutation", "name": "UpdateWorkbenchChatbot", - "body": "mutation UpdateWorkbenchChatbot($id: ID!, $attributes: WorkbenchChatbotAttributes!) {\n updateWorkbenchChatbot(id: $id, attributes: $attributes) {\n ...WorkbenchChatbot\n __typename\n }\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" + "body": "mutation UpdateWorkbenchChatbot($id: ID!, $attributes: WorkbenchChatbotAttributes!) {\n updateWorkbenchChatbot(id: $id, attributes: $attributes) {\n ...WorkbenchChatbot\n __typename\n }\n}\n\nfragment WorkbenchChatbot on WorkbenchChatbot {\n id\n channel\n prompt\n messageBehavior\n userId\n modes {\n plan\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n excludeNamespaces\n requireNamespaces\n __typename\n }\n __typename\n }\n insertedAt\n updatedAt\n chatConnection {\n ...ChatProviderConnection\n __typename\n }\n user {\n id\n name\n email\n profile\n __typename\n }\n __typename\n}\n\nfragment ChatProviderConnection on ChatProviderConnection {\n id\n name\n type\n configuration {\n slack {\n botId\n __typename\n }\n teams {\n clientId\n tenantId\n __typename\n }\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment PolicyBinding on PolicyBinding {\n id\n user {\n id\n name\n email\n __typename\n }\n group {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:3ff81f19b20a9fb7dd872ef07b26ede67afc71ee28befff34fc109053e7b84b2": { "type": "mutation", @@ -2197,10 +2227,10 @@ "name": "WorkbenchJobDelta", "body": "subscription WorkbenchJobDelta($id: ID, $workbenchId: ID) {\n workbenchJobDelta(id: $id, workbenchId: $workbenchId) {\n delta\n payload {\n ...WorkbenchJobTiny\n error\n result {\n ...WorkbenchJobResult\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobTiny on WorkbenchJob {\n id\n prompt\n status\n error\n insertedAt\n usage {\n ...WorkbenchJobUsageTiny\n __typename\n }\n modes {\n budget {\n cost\n tokens\n __typename\n }\n __typename\n }\n user {\n id\n name\n profile\n __typename\n }\n workbench {\n id\n name\n __typename\n }\n alert {\n id\n state\n url\n __typename\n }\n issue {\n id\n status\n url\n __typename\n }\n pullRequests {\n ...WorkbenchJobPullRequest\n __typename\n }\n result {\n id\n conclusion\n __typename\n }\n evalResult {\n id\n grade\n __typename\n }\n chatbotMessage {\n id\n channel\n message\n chatConnection {\n id\n name\n type\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobUsageTiny on WorkbenchJobUsage {\n totalCost\n totalTokens\n __typename\n}\n\nfragment WorkbenchJobPullRequest on PullRequest {\n ...PullRequestBasic\n patch\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment WorkbenchJobResult on WorkbenchJobResult {\n id\n workingTheory\n criticism\n conclusion\n topology\n todos {\n ...WorkbenchJobResultTodo\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobResultTodo on WorkbenchJobResultTodo {\n name\n description\n done\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}" }, - "sha256:092a66acb224fe031f26e578fba2a619df4112a4f7552a998f17ef5ebce383d7": { + "sha256:4a62176cdcb80b80875677833e674fe4c583bec21e15b547cf2b50db8ee2b4eb": { "type": "subscription", "name": "WorkbenchJobActivityDelta", - "body": "subscription WorkbenchJobActivityDelta($jobId: ID!) {\n workbenchJobActivityDelta(jobId: $jobId) {\n delta\n payload {\n ...WorkbenchJobActivity\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n __typename\n }\n kubeRequest {\n handle\n method\n path\n body\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}" + "body": "subscription WorkbenchJobActivityDelta($jobId: ID!) {\n workbenchJobActivityDelta(jobId: $jobId) {\n delta\n payload {\n ...WorkbenchJobActivity\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobActivity on WorkbenchJobActivity {\n id\n type\n status\n prompt\n insertedAt\n user {\n ...UserTiny\n __typename\n }\n result {\n ...WorkbenchJobActivityResult\n __typename\n }\n agentRun {\n ...AgentRunTiny\n __typename\n }\n agentRuns {\n ...AgentRunTiny\n __typename\n }\n __typename\n}\n\nfragment UserTiny on User {\n name\n email\n profile\n __typename\n}\n\nfragment WorkbenchJobActivityResult on WorkbenchJobActivityResult {\n output\n error\n functionCall {\n name\n input\n toolId\n tool {\n id\n name\n tool\n configuration {\n lambda {\n description\n __typename\n }\n cloudRun {\n description\n __typename\n }\n azureFunction {\n description\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n kubeRequest {\n handle\n method\n path\n queryParams\n contentType\n __typename\n }\n jobUpdate {\n diff\n workingTheory\n criticism\n conclusion\n __typename\n }\n metricsQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n logs {\n ...WorkbenchJobActivityLog\n __typename\n }\n traces {\n ...WorkbenchJobActivityTrace\n __typename\n }\n tracesQuery {\n ...WorkbenchToolQueryData\n __typename\n }\n canvas {\n ...WorkbenchCanvasBlock\n __typename\n }\n __typename\n}\n\nfragment WorkbenchToolQueryData on WorkbenchToolQueryData {\n toolName\n toolArgs\n summary\n __typename\n}\n\nfragment WorkbenchJobActivityLog on WorkbenchJobActivityLog {\n timestamp\n message\n labels\n __typename\n}\n\nfragment WorkbenchJobActivityTrace on WorkbenchJobActivityTrace {\n traceId\n spanId\n parentId\n name\n service\n start\n end\n tags\n __typename\n}\n\nfragment WorkbenchCanvasBlock on WorkbenchCanvasBlock {\n identifier\n type\n layout {\n x\n y\n w\n h\n __typename\n }\n content {\n markdown\n metrics {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n logs {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n traces {\n ...WorkbenchCanvasToolGraph\n __typename\n }\n pie {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n bar {\n ...WorkbenchCanvasBlockGraph\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasToolGraph on WorkbenchCanvasToolGraph {\n title\n summary\n query {\n ...WorkbenchToolQueryData\n __typename\n }\n __typename\n}\n\nfragment WorkbenchCanvasBlockGraph on WorkbenchCanvasBlockGraph {\n title\n data {\n label\n value\n __typename\n }\n __typename\n}\n\nfragment AgentRunTiny on AgentRun {\n id\n status\n mode\n babysit\n approval\n approvedAt\n prompt\n shared\n error\n runtime {\n id\n name\n type\n __typename\n }\n repository\n branch\n headBranch\n pullRequests {\n ...PullRequestBasic\n __typename\n }\n podReference {\n name\n namespace\n __typename\n }\n usage {\n totalCost\n totalTokens\n __typename\n }\n workbenchJob {\n id\n workbench {\n id\n name\n __typename\n }\n __typename\n }\n upload {\n id\n session\n patch\n __typename\n }\n todos {\n ...AgentTodo\n __typename\n }\n insertedAt\n updatedAt\n __typename\n}\n\nfragment PullRequestBasic on PullRequest {\n id\n url\n title\n creator\n status\n insertedAt\n updatedAt\n __typename\n}\n\nfragment AgentTodo on AgentTodo {\n title\n description\n done\n __typename\n}" }, "sha256:84e024a73a5d1c07d1ce00b74b6addad8b4d6eb7a1d9daaa5afbe57abd3f5f9a": { "type": "subscription", diff --git a/assets/src/graph/awaitingReview.graphql b/assets/src/graph/awaitingReview.graphql index e82daed964..5e213b1e31 100644 --- a/assets/src/graph/awaitingReview.graphql +++ b/assets/src/graph/awaitingReview.graphql @@ -45,6 +45,54 @@ fragment AwaitingReviewAgentRun on AgentRun { } workbenchJob { id + insertedAt + workbench { + id + name + } + } +} + +fragment AwaitingReviewWorkbenchActivity on WorkbenchJobActivity { + id + type + status + prompt + result { + functionCall { + name + input + toolId + tool { + id + name + tool + configuration { + lambda { + description + } + cloudRun { + description + } + azureFunction { + description + } + } + } + } + kubeRequest { + handle + method + path + } + } + workbenchJob { + id + prompt + insertedAt + result { + workingTheory + } workbench { id name @@ -71,3 +119,13 @@ query PendingApprovalAgentRuns($first: Int = 100) { } } } + +query PendingApprovalWorkbenchActivities($first: Int = 100) { + workbenchJobActivities(first: $first, status: NEEDS_APPROVAL) { + edges { + node { + ...AwaitingReviewWorkbenchActivity + } + } + } +} diff --git a/assets/src/graph/workbench.graphql b/assets/src/graph/workbench.graphql index ada6c29958..e76123dece 100644 --- a/assets/src/graph/workbench.graphql +++ b/assets/src/graph/workbench.graphql @@ -95,6 +95,12 @@ fragment Workbench on Workbench { cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } skills { ref { @@ -136,6 +142,7 @@ fragment WorkbenchToolTiny on WorkbenchTool { name tool categories + approval cloudConnection { ...CloudConnectionTiny } @@ -265,6 +272,21 @@ fragment WorkbenchTool on WorkbenchTool { azureDevops { url } + lambda { + lambdaArn + description + inputSchema + } + cloudRun { + identifier + description + inputSchema + } + azureFunction { + identifier + description + inputSchema + } docker { url provider @@ -399,12 +421,27 @@ fragment WorkbenchJobActivityResult on WorkbenchJobActivityResult { name input toolId + tool { + id + name + tool + configuration { + lambda { + description + } + cloudRun { + description + } + azureFunction { + description + } + } + } } kubeRequest { handle method path - body queryParams contentType } @@ -437,6 +474,9 @@ fragment WorkbenchJobActivity on WorkbenchJobActivity { status prompt insertedAt + user { + ...UserTiny + } result { ...WorkbenchJobActivityResult } @@ -486,6 +526,12 @@ fragment WorkbenchCron on WorkbenchCron { cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } lastRunAt nextRunAt @@ -522,6 +568,12 @@ fragment WorkbenchWebhook on WorkbenchWebhook { cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } matches { regex @@ -582,6 +634,12 @@ fragment WorkbenchChatbot on WorkbenchChatbot { cost tokens } + kubernetes { + update + delete + excludeNamespaces + requireNamespaces + } } insertedAt updatedAt @@ -1214,6 +1272,101 @@ query WorkbenchJobActivities($id: ID!) { } } +query WorkbenchJobActionSummary($id: ID!, $first: Int = 1) { + workbenchJob(id: $id) { + id + pendingActions: activities(first: $first, status: NEEDS_APPROVAL) { + edges { + node { + id + } + } + } + functionActions: activities(first: $first, type: FUNCTION) { + edges { + node { + id + } + } + } + kubernetesActions: activities(first: $first, type: KUBERNETES) { + edges { + node { + id + } + } + } + } +} + +fragment WorkbenchJobAction on WorkbenchJobActivity { + id + type + status + prompt + insertedAt + user { + ...UserTiny + } + result { + output + error + functionCall { + name + input + toolId + tool { + id + name + tool + configuration { + lambda { + description + } + cloudRun { + description + } + azureFunction { + description + } + } + } + } + kubeRequest { + handle + method + path + queryParams + contentType + } + } +} + +query WorkbenchJobActions($id: ID!) { + workbenchJob(id: $id) { + id + activities(first: 100) { + edges { + node { + ...WorkbenchJobAction + } + } + } + } +} + +mutation ApproveWorkbenchJobActivity($id: ID!) { + approveWorkbenchJobActivity(id: $id) { + ...WorkbenchJobAction + } +} + +mutation RejectWorkbenchJobActivity($id: ID!, $reason: String) { + rejectWorkbenchJobActivity(id: $id, reason: $reason) { + ...WorkbenchJobAction + } +} + query WorkbenchJobWhimseyText($id: ID!) { workbenchJob(id: $id) { id @@ -1234,6 +1387,22 @@ query WorkbenchJobActivity($id: ID!) { } } +query WorkbenchJobKubeRequestDiff($id: ID!) { + workbenchJobActivity(id: $id) { + id + result { + kubeRequest { + handle + method + path + body + contentType + current + } + } + } +} + query WorkbenchTools($first: Int = 100, $after: String, $q: String) { workbenchTools(first: $first, after: $after, q: $q) { pageInfo { diff --git a/assets/yarn.lock b/assets/yarn.lock index c0c7b20ca0..8c34a664a9 100644 --- a/assets/yarn.lock +++ b/assets/yarn.lock @@ -3923,6 +3923,7 @@ __metadata: npm-run-all: "npm:4.1.5" react-animate-height: "npm:3.2.4" react-aria: "npm:3.50.0" + react-diff-viewer-continued: "npm:4.4.0" react-markdown: "npm:9.1.0" react-merge-refs: "npm:2.1.1" react-stately: "npm:3.48.0" @@ -8428,7 +8429,6 @@ __metadata: query-string: "npm:8.2.0" react: "npm:19.2.7" react-diff-view: "npm:3.3.3" - react-diff-viewer-continued: "npm:4.4.0" react-dom: "npm:19.2.7" react-dropzone: "npm:14.4.1" react-error-boundary: "npm:4.1.2" diff --git a/go/client/models_gen.go b/go/client/models_gen.go index 4c3b837b03..35f28ab417 100644 --- a/go/client/models_gen.go +++ b/go/client/models_gen.go @@ -10367,6 +10367,8 @@ type WorkbenchJobActivityFunctionCall struct { Input map[string]any `json:"input,omitempty"` // the workbench tool id backing this function ToolID *string `json:"toolId,omitempty"` + // the workbench tool backing this function call + Tool *WorkbenchTool `json:"tool,omitempty"` } type WorkbenchJobActivityJobUpdate struct { diff --git a/lib/console/deployments/agents.ex b/lib/console/deployments/agents.ex index 34b641a865..c107841e1a 100644 --- a/lib/console/deployments/agents.ex +++ b/lib/console/deployments/agents.ex @@ -83,9 +83,8 @@ defmodule Console.Deployments.Agents do def upsert_agent_runtime(attrs, %Cluster{} = cluster), do: upsert_agent_runtime(attrs, cluster, cluster) - @spec upsert_agent_runtime(map, Cluster.t | nil, User.t | Cluster.t | nil) :: agent_runtime_resp - def upsert_agent_runtime(%{name: name} = attrs, %Cluster{id: cid} = cluster, actor) do + def upsert_agent_runtime(%{name: name} = attrs, %Cluster{id: cid}, actor) do runtime = get_agent_runtime(cid, name) |> Repo.preload([:create_bindings]) with {:ok, _} <- allow(runtime || %AgentRuntime{cluster_id: cid}, actor, :write), diff --git a/lib/console/deployments/workbenches.ex b/lib/console/deployments/workbenches.ex index 85a4a56561..d13270943f 100644 --- a/lib/console/deployments/workbenches.ex +++ b/lib/console/deployments/workbenches.ex @@ -832,13 +832,16 @@ defmodule Console.Deployments.Workbenches do end @doc """ - Approves and calls a workbench function call encapsulated in the current activity + Approves and calls a workbench function call encapsulated in the current activity. + + Locks the activity row for update so concurrent approvals cannot both invoke the + underlying external action before the status transitions away from needs_approval. """ @spec approve_job_activity(binary, User.t()) :: activity_resp def approve_job_activity(activity_id, %User{} = user) when is_binary(activity_id) do start_transaction() |> add_operation(:activity, fn _ -> - get_workbench_job_activity!(activity_id) + lock_job_activity!(activity_id) |> allow(user, :approve) end) |> add_operation(:exec, fn @@ -849,7 +852,7 @@ defmodule Console.Deployments.Workbenches do {:ok, output} -> output {:error, err} -> "Internal function calling error: #{inspect(err)}" end - |> then(&WorkbenchJobActivity.changeset(activity, %{status: :successful, result: %{output: &1}})) + |> then(&WorkbenchJobActivity.changeset(activity, %{status: :successful, user_id: user.id, result: %{output: &1}})) |> Repo.update() %{activity: %WorkbenchJobActivity{type: :kubernetes, result: %{kube_request: %KubeRequest{} = request}} = activity} -> KubeRequest.invoke(request, user) @@ -859,7 +862,7 @@ defmodule Console.Deployments.Workbenches do {:error, {:http_error, _, err}} -> "K8s request failed: #{inspect(err)}" {:error, err} -> "Internal kubernetes request error: #{inspect(err)}" end - |> then(&WorkbenchJobActivity.changeset(activity, %{status: :successful, result: %{output: &1}})) + |> then(&WorkbenchJobActivity.changeset(activity, %{status: :successful, user_id: user.id, result: %{output: &1}})) |> Repo.update() _ -> {:error, "activity does not support function calling"} end) @@ -872,18 +875,26 @@ defmodule Console.Deployments.Workbenches do """ @spec reject_job_activity(binary | nil, binary, User.t()) :: activity_resp def reject_job_activity(reason \\ nil, activity_id, %User{} = user) when is_binary(activity_id) do - get_workbench_job_activity!(activity_id) - |> allow(user, :approve) - |> when_ok(fn activity -> + start_transaction() + |> add_operation(:activity, fn _ -> + lock_job_activity!(activity_id) + |> allow(user, :approve) + end) + |> add_operation(:reject, fn %{activity: activity} -> WorkbenchJobActivity.changeset(activity, %{ status: :rejected, + user_id: user.id, result: %{output: reason || "Execution rejected by user"} }) + |> Repo.update() end) - |> when_ok(:update) + |> execute(extract: :reject) |> notify(:update) end + defp lock_job_activity!(id), + do: Repo.get!(WorkbenchJobActivity.with_lock(), id) + @doc """ Associates an agent run with a workbench activity: inserts the join row (idempotent) and sets `agent_run_id` and `status: :running` on the activity. diff --git a/lib/console/graphql/deployments/workbench.ex b/lib/console/graphql/deployments/workbench.ex index 388b098d5b..2d001a6051 100644 --- a/lib/console/graphql/deployments/workbench.ex +++ b/lib/console/graphql/deployments/workbench.ex @@ -30,6 +30,7 @@ defmodule Console.GraphQl.Deployments.Workbench do field :model, :workbench_job_model_attributes, description: "model override for this job" field :coding, :workbench_job_coding_modes_attributes, description: "coding mode options for this job" field :budget, :workbench_job_budget_attributes, description: "budget limits for this job" + field :kubernetes, :workbench_job_kubernetes_modes_attributes, description: "kubernetes action options for this job" end input_object :workbench_job_model_attributes do @@ -47,6 +48,13 @@ defmodule Console.GraphQl.Deployments.Workbench do field :tokens, :integer, description: "maximum token budget for this job" end + input_object :workbench_job_kubernetes_modes_attributes do + field :update, :boolean, description: "whether kubernetes update actions are enabled" + field :delete, :boolean, description: "whether kubernetes delete actions are enabled" + field :exclude_namespaces, list_of(:string), description: "namespaces the agent can never act in" + field :require_namespaces, list_of(:string), description: "if set, actions are only allowed in these namespaces" + end + input_object :workbench_job_update_attributes do field :result, :workbench_result_attributes, description: "the result for this job" end @@ -533,6 +541,9 @@ defmodule Console.GraphQl.Deployments.Workbench do field :referenced_job, :workbench_job, resolve: dataloader(Deployments), description: "the original job this job was spawned from (e.g. eval skill jobs) (sideloadable)" connection field :activities, node_type: :workbench_job_activity do + arg :status, :workbench_job_activity_status, description: "filter activities by status" + arg :type, :workbench_job_activity_type, description: "filter activities by type" + resolve &Deployments.list_workbench_job_activities/3 end @@ -567,6 +578,7 @@ defmodule Console.GraphQl.Deployments.Workbench do field :model, :workbench_job_model, description: "model override for this job" field :coding, :workbench_job_coding_modes, description: "coding mode options for this job" field :budget, :workbench_job_budget, description: "budget limits for this job" + field :kubernetes, :workbench_job_kubernetes_modes, description: "kubernetes action options for this job" end object :workbench_job_model do @@ -584,6 +596,13 @@ defmodule Console.GraphQl.Deployments.Workbench do field :tokens, :integer, description: "maximum token budget for this job" end + object :workbench_job_kubernetes_modes do + field :update, :boolean, description: "whether kubernetes update actions are enabled" + field :delete, :boolean, description: "whether kubernetes delete actions are enabled" + field :exclude_namespaces, list_of(:string), description: "namespaces the agent can never act in" + field :require_namespaces, list_of(:string), description: "if set, actions are only allowed in these namespaces" + end + object :workbench_job_usage do field :input_tokens, :integer, description: "input tokens consumed by this job" field :output_tokens, :integer, description: "output tokens produced by this job" @@ -608,7 +627,7 @@ defmodule Console.GraphQl.Deployments.Workbench do field :workbench_job, :workbench_job, resolve: dataloader(Deployments), description: "the job this activity belongs to" field :agent_run, :agent_run, resolve: dataloader(Deployments), description: "the agent run that executed this activity" field :agent_runs, list_of(:agent_run), resolve: dataloader(Deployments), description: "all agent runs associated with this activity (sideloadable)" - field :user, :user, resolve: dataloader(User), description: "the user who created this activity" + field :user, :user, resolve: dataloader(User), description: "the user who created or denied this activity" timestamps() end @@ -653,15 +672,21 @@ defmodule Console.GraphQl.Deployments.Workbench do field :name, :string, description: "the function name to invoke" field :input, :map, description: "input passed to the function" field :tool_id, :id, description: "the workbench tool id backing this function" + field :tool, :workbench_tool, resolve: &Deployments.function_call_tool/3, description: "the workbench tool backing this function call" end object :workbench_job_activity_kube_request do field :handle, :string, description: "the target cluster handle" field :method, :string, description: "the Kubernetes API HTTP method" field :path, :string, description: "the Kubernetes API request path" - field :body, :string, description: "the Kubernetes API request body" - field :query_params, :map, description: "query parameters sent with the Kubernetes API request" + field :body, :string, + description: "the Kubernetes API request body", + resolve: &Deployments.kube_request_body/3 + field :query_params, :map, description: "query parameters sent with the Kubernetes API request" field :content_type, :string, description: "the Kubernetes API request content type" + + @desc "the live kubernetes object at this path, used to render update diffs. expensive and should be requested only when reviewing an action" + field :current, :map, resolve: &Deployments.kube_request_current/3 end object :workbench_job_activity_job_update do @@ -1350,6 +1375,17 @@ defmodule Console.GraphQl.Deployments.Workbench do resolve &Deployments.workbench_job_activity/2 end + connection field :workbench_job_activities, node_type: :workbench_job_activity do + middleware Authenticated + middleware Scope, + resource: :workbench, + action: :read + arg :status, :workbench_job_activity_status, description: "filter activities by status" + arg :type, :workbench_job_activity_type, description: "filter activities by type" + + resolve &Deployments.workbench_job_activities/2 + end + connection field :workbench_alerts, node_type: :alert do middleware Authenticated middleware Scope, diff --git a/lib/console/graphql/resolvers/deployments/workbench.ex b/lib/console/graphql/resolvers/deployments/workbench.ex index f7de1f43a5..9d3f04104d 100644 --- a/lib/console/graphql/resolvers/deployments/workbench.ex +++ b/lib/console/graphql/resolvers/deployments/workbench.ex @@ -1,10 +1,13 @@ defmodule Console.GraphQl.Resolvers.Deployments.Workbench do use Console.GraphQl.Resolvers.Deployments.Base alias Console.Repo - alias Console.Deployments.Workbenches + alias Kube.Utils, as: KUtils + alias Console.Deployments.{Clusters, Workbenches} alias Console.AI.Workbench.{Toolchain, Skills} + alias Console.AI.Tools.Workbench.Infrastructure.KubeGet alias Console.Schema.{ Alert, + Cluster, Issue, Workbench, WorkbenchJob, @@ -138,9 +141,49 @@ defmodule Console.GraphQl.Resolvers.Deployments.Workbench do def list_workbench_job_activities(job, args, _) do WorkbenchJobActivity.for_workbench_job(job.id) |> WorkbenchJobActivity.ordered() + |> activity_filters(args) |> paginate(args) end + def workbench_job_activities(args, %{context: %{current_user: user}}) do + WorkbenchJobActivity.ordered(WorkbenchJobActivity, [desc: :inserted_at]) + |> WorkbenchJobActivity.for_user(user) + |> activity_filters(args) + |> paginate(args) + end + + def function_call_tool(%{tool_id: id}, _, _) when is_binary(id), + do: {:ok, Workbenches.get_workbench_tool(id)} + def function_call_tool(_, _, _), do: {:ok, nil} + + def kube_request_body(%{body: body}, _, _) when is_binary(body) do + case Jason.decode(body) do + {:ok, %{} = body} -> kube_request_body(body) + _ -> {:ok, body} + end + end + def kube_request_body(%{body: %{} = b}, _, _), do: kube_request_body(b) + def kube_request_body(_, _, _), do: {:ok, nil} + + defp kube_request_body(body) do + KUtils.redact_secret(body) + |> KUtils.sanitize_kube_resource() + |> Jason.encode() + end + + def kube_request_current(%{handle: handle, path: path}, _, %{context: %{current_user: user}}) + when is_binary(handle) and is_binary(path) do + with %Cluster{} = cluster <- Clusters.get_cluster_by_handle(handle), + {:ok, res} <- KubeGet.kube_request(cluster, user, path) do + KUtils.sanitize_kube_resource(res) + |> KUtils.redact_secret() + |> ok() + else + _ -> {:ok, nil} + end + end + def kube_request_current(_, _, _), do: {:ok, nil} + def all_workbench_alerts(args, %{context: %{current_user: user}}) do Alert.for_user(user) |> Alert.ordered() @@ -383,4 +426,12 @@ defmodule Console.GraphQl.Resolvers.Deployments.Workbench do _, q -> q end) end + + defp activity_filters(query, args) do + Enum.reduce(args, query, fn + {:status, status}, q when not is_nil(status) -> WorkbenchJobActivity.for_status(q, status) + {:type, type}, q when not is_nil(type) -> WorkbenchJobActivity.for_type(q, type) + _, q -> q + end) + end end diff --git a/lib/console/schema/workbench_job_activity.ex b/lib/console/schema/workbench_job_activity.ex index 9316142e4e..136a23bf5a 100644 --- a/lib/console/schema/workbench_job_activity.ex +++ b/lib/console/schema/workbench_job_activity.ex @@ -123,11 +123,18 @@ defmodule Console.Schema.WorkbenchJobActivity do from(a in query, where: a.type == ^type) end + def for_user(query \\ __MODULE__, %User{} = user) do + from(a in query, + join: j in subquery(WorkbenchJob.for_user(user)), + on: j.id == a.workbench_job_id + ) + end + def ordered(query \\ __MODULE__, order \\ [asc: :inserted_at]) do from(a in query, order_by: ^order) end - @valid ~w(status type prompt workbench_job_id agent_run_id)a + @valid ~w(status type prompt workbench_job_id agent_run_id user_id)a def changeset(model, attrs \\ %{}) do model diff --git a/lib/kube/utils.ex b/lib/kube/utils.ex index fc45868af4..1b3e079c58 100644 --- a/lib/kube/utils.ex +++ b/lib/kube/utils.ex @@ -21,6 +21,43 @@ defmodule Kube.Utils do end def raw_meta(_), do: nil + def sanitize_kube_resource(res) when is_map(res) do + res + |> Console.string_map() + |> then(fn + %{"metadata" => meta} = map when is_map(meta) -> + Map.put( + map, + "metadata", + Map.drop(meta, [ + "managedFields", + "resourceVersion", + "uid", + "generation", + "creationTimestamp" + ]) + ) + + map -> map + end) + end + def sanitize_kube_resource(res), do: res + + def redact_secret(%{"kind" => "Secret"} = res) do + Enum.reduce(["data", "stringData"], res, fn field, acc -> + case Map.fetch(acc, field) do + {:ok, data} -> Map.put(acc, field, redact_secret_data(data)) + :error -> acc + end + end) + end + def redact_secret(res), do: res + + defp redact_secret_data(data) when is_map(data), + do: Map.new(data, fn {k, _} -> {k, "*****"} end) + + defp redact_secret_data(data), do: data + def ns(%{"metadata" => meta}), do: meta["namespace"] def ns(%{metadata: %MetaV1.ObjectMeta{namespace: ns}}), do: ns def ns(%{namespace: ns}), do: ns diff --git a/schema/schema.graphql b/schema/schema.graphql index 0e41a049ff..375eb40fb6 100644 --- a/schema/schema.graphql +++ b/schema/schema.graphql @@ -571,6 +571,22 @@ type RootQueryType { workbenchJobActivity(id: ID!): WorkbenchJobActivity + workbenchJobActivities( + after: String + + first: Int + + before: String + + last: Int + + "filter activities by status" + status: WorkbenchJobActivityStatus + + "filter activities by type" + type: WorkbenchJobActivityType + ): WorkbenchJobActivityConnection + workbenchAlerts(after: String, first: Int, before: String, last: Int): AlertConnection workbenchIssues(after: String, first: Int, before: String, last: Int): IssueConnection @@ -2743,6 +2759,9 @@ input WorkbenchJobModesAttributes { "budget limits for this job" budget: WorkbenchJobBudgetAttributes + + "kubernetes action options for this job" + kubernetes: WorkbenchJobKubernetesModesAttributes } input WorkbenchJobModelAttributes { @@ -2769,6 +2788,20 @@ input WorkbenchJobBudgetAttributes { tokens: Int } +input WorkbenchJobKubernetesModesAttributes { + "whether kubernetes update actions are enabled" + update: Boolean + + "whether kubernetes delete actions are enabled" + delete: Boolean + + "namespaces the agent can never act in" + excludeNamespaces: [String] + + "if set, actions are only allowed in these namespaces" + requireNamespaces: [String] +} + input WorkbenchJobUpdateAttributes { "the result for this job" result: WorkbenchResultAttributes @@ -3653,7 +3686,21 @@ type WorkbenchJob { "the original job this job was spawned from (e.g. eval skill jobs) (sideloadable)" referencedJob: WorkbenchJob - activities(after: String, first: Int, before: String, last: Int): WorkbenchJobActivityConnection + activities( + after: String + + first: Int + + before: String + + last: Int + + "filter activities by status" + status: WorkbenchJobActivityStatus + + "filter activities by type" + type: WorkbenchJobActivityType + ): WorkbenchJobActivityConnection metricsTool( "the name of the metrics tool" @@ -3699,6 +3746,9 @@ type WorkbenchJobModes { "budget limits for this job" budget: WorkbenchJobBudget + + "kubernetes action options for this job" + kubernetes: WorkbenchJobKubernetesModes } type WorkbenchJobModel { @@ -3725,6 +3775,20 @@ type WorkbenchJobBudget { tokens: Int } +type WorkbenchJobKubernetesModes { + "whether kubernetes update actions are enabled" + update: Boolean + + "whether kubernetes delete actions are enabled" + delete: Boolean + + "namespaces the agent can never act in" + excludeNamespaces: [String] + + "if set, actions are only allowed in these namespaces" + requireNamespaces: [String] +} + type WorkbenchJobUsage { "input tokens consumed by this job" inputTokens: Int @@ -3782,7 +3846,7 @@ type WorkbenchJobActivity { "all agent runs associated with this activity (sideloadable)" agentRuns: [AgentRun] - "the user who created this activity" + "the user who created or denied this activity" user: User insertedAt: DateTime @@ -3881,6 +3945,9 @@ type WorkbenchJobActivityFunctionCall { "the workbench tool id backing this function" toolId: ID + + "the workbench tool backing this function call" + tool: WorkbenchTool } type WorkbenchJobActivityKubeRequest { @@ -3893,7 +3960,7 @@ type WorkbenchJobActivityKubeRequest { "the Kubernetes API request path" path: String - "the Kubernetes API request body" + "the Kubernetes API request body (Secret payloads are redacted)" body: String "query parameters sent with the Kubernetes API request" @@ -3901,6 +3968,9 @@ type WorkbenchJobActivityKubeRequest { "the Kubernetes API request content type" contentType: String + + "the live kubernetes object at this path, used to render update diffs. expensive and should be requested only when reviewing an action" + current: Map } type WorkbenchJobActivityJobUpdate { diff --git a/test/console/deployments/workbenches_test.exs b/test/console/deployments/workbenches_test.exs index fa5fe2ca3e..8096163ad2 100644 --- a/test/console/deployments/workbenches_test.exs +++ b/test/console/deployments/workbenches_test.exs @@ -5,7 +5,7 @@ defmodule Console.Deployments.WorkbenchesTest do alias Console.AI.Tools.Workbench.KubeRequest alias Console.PubSub alias Console.Deployments.Workbenches - alias Console.Schema.WorkbenchJob + alias Console.Schema.{WorkbenchJob, WorkbenchJobActivity} alias CloudQuery.Client alias Toolquery.{InvokeLambdaInput, InvokeLambdaOutput, ToolQuery.Stub} @@ -1340,6 +1340,51 @@ defmodule Console.Deployments.WorkbenchesTest do assert reloaded.result.output == "already complete" end + test "concurrent approvals only invoke the external action once" do + user = insert(:user) + project = insert(:project, read_bindings: [%{user_id: user.id}]) + workbench = insert(:workbench, project: project) + job = insert(:workbench_job, workbench: workbench, status: :running) + cluster = insert(:cluster, handle: "concurrent-approval-cluster") + parent = self() + + activity = + insert(:workbench_job_activity, + workbench_job: job, + type: :kubernetes, + status: :needs_approval, + prompt: "approve the kubernetes request", + result: %{ + output: "request pending user approval", + kube_request: %{ + handle: cluster.handle, + method: "delete", + path: "/apis/apps/v1/namespaces/default/deployments/api", + content_type: "application/json" + } + } + ) + + expect(Kazan, :run, fn %Kazan.Request{}, _opts -> + send(parent, :kube_invoked) + Process.sleep(150) + {:ok, %{"kind" => "Status", "status" => "Success"}} + end) + + task1 = Task.async(fn -> Workbenches.approve_job_activity(activity.id, user) end) + task2 = Task.async(fn -> Workbenches.approve_job_activity(activity.id, user) end) + results = [Task.await(task1), Task.await(task2)] + + assert Enum.count(results, &match?({:ok, %WorkbenchJobActivity{}}, &1)) == 1 + assert Enum.count(results, &match?({:error, _}, &1)) == 1 + assert_receive :kube_invoked + refute_receive :kube_invoked, 50 + + reloaded = refetch(activity) + assert reloaded.status == :successful + assert Jason.decode!(reloaded.result.output) == %{"kind" => "Status", "status" => "Success"} + end + test "does not invoke grpc for a non-function activity even with function call metadata" do user = insert(:user) project = insert(:project, read_bindings: [%{user_id: user.id}]) @@ -1439,11 +1484,13 @@ defmodule Console.Deployments.WorkbenchesTest do assert updated.id == activity.id assert updated.status == :rejected + assert updated.user_id == user.id assert updated.result.output == "too risky" assert_receive {:event, %PubSub.WorkbenchJobActivityUpdated{item: ^updated}} reloaded = refetch(activity) assert reloaded.status == :rejected + assert reloaded.user_id == user.id assert reloaded.result.output == "too risky" end @@ -1465,6 +1512,7 @@ defmodule Console.Deployments.WorkbenchesTest do assert updated.id == activity.id assert updated.status == :rejected + assert updated.user_id == user.id assert updated.result.output == "Execution rejected by user" assert_receive {:event, %PubSub.WorkbenchJobActivityUpdated{item: ^updated}} end diff --git a/test/console/graphql/mutations/deployments/workbench_mutations_test.exs b/test/console/graphql/mutations/deployments/workbench_mutations_test.exs index 51e363478c..22e3d01ac8 100644 --- a/test/console/graphql/mutations/deployments/workbench_mutations_test.exs +++ b/test/console/graphql/mutations/deployments/workbench_mutations_test.exs @@ -748,6 +748,7 @@ defmodule Console.GraphQl.Deployments.WorkbenchMutationsTest do id status result { output } + user { name } } } """, %{"id" => activity.id, "reason" => "not approved"}, %{current_user: user}) @@ -755,9 +756,11 @@ defmodule Console.GraphQl.Deployments.WorkbenchMutationsTest do assert updated["id"] == activity.id assert updated["status"] == "REJECTED" assert updated["result"]["output"] == "not approved" + assert updated["user"]["name"] == user.name reloaded = refetch(activity) assert reloaded.status == :rejected + assert reloaded.user_id == user.id assert reloaded.result.output == "not approved" end end diff --git a/test/console/graphql/queries/deployments/workbench_queries_test.exs b/test/console/graphql/queries/deployments/workbench_queries_test.exs index a1381bf600..6f71bedfe2 100644 --- a/test/console/graphql/queries/deployments/workbench_queries_test.exs +++ b/test/console/graphql/queries/deployments/workbench_queries_test.exs @@ -784,6 +784,31 @@ defmodule Console.GraphQl.Deployments.WorkbenchQueriesTest do |> ids_equal(activities) end + test "it can filter activities by status" do + job = insert(:workbench_job) + pending = insert(:workbench_job_activity, + workbench_job: job, + type: :function, + status: :needs_approval + ) + insert(:workbench_job_activity, workbench_job: job, type: :coding, status: :successful) + + {:ok, %{data: %{"workbenchJob" => found}}} = run_query(""" + query WorkbenchJob($id: ID!, $status: WorkbenchJobActivityStatus) { + workbenchJob(id: $id) { + id + activities(first: 10, status: $status) { + edges { node { id status } } + } + } + } + """, %{"id" => job.id, "status" => "NEEDS_APPROVAL"}, %{current_user: admin_user()}) + + [node] = from_connection(found["activities"]) + assert node["id"] == pending.id + assert node["status"] == "NEEDS_APPROVAL" + end + test "it can paginate activities" do job = insert(:workbench_job) insert_list(5, :workbench_job_activity, workbench_job: job, type: :coding) @@ -1027,6 +1052,40 @@ defmodule Console.GraphQl.Deployments.WorkbenchQueriesTest do end end + describe "workbenchJobActivities" do + test "it can list activities needing approval for readable workbenches" do + user = insert(:user) + project = insert(:project, read_bindings: [%{user_id: user.id}]) + workbench = insert(:workbench, project: project) + job = insert(:workbench_job, workbench: workbench) + pending = + insert_list(2, :workbench_job_activity, + workbench_job: job, + type: :function, + status: :needs_approval + ) + insert(:workbench_job_activity, + workbench_job: job, + type: :function, + status: :successful + ) + insert(:workbench_job_activity, type: :function, status: :needs_approval) + + {:ok, %{data: %{"workbenchJobActivities" => found}}} = run_query(""" + query WorkbenchJobActivities($status: WorkbenchJobActivityStatus!) { + workbenchJobActivities(first: 10, status: $status) { + edges { node { id status type } } + } + } + """, %{"status" => "NEEDS_APPROVAL"}, %{current_user: user}) + + nodes = from_connection(found) + assert length(nodes) == 2 + assert Enum.all?(nodes, &(&1["status"] == "NEEDS_APPROVAL")) + assert ids_equal(nodes, pending) + end + end + describe "workbenchJobActivity" do test "it can fetch a workbench job activity by id" do user = insert(:user) diff --git a/test/kube/utils_test.exs b/test/kube/utils_test.exs new file mode 100644 index 0000000000..5ba0fdbdf8 --- /dev/null +++ b/test/kube/utils_test.exs @@ -0,0 +1,33 @@ +defmodule Kube.UtilsTest do + use ExUnit.Case, async: true + + describe "redact_secret/1" do + test "stars out secret data fields" do + secret = %{ + "apiVersion" => "v1", + "kind" => "Secret", + "metadata" => %{"name" => "db"}, + "data" => %{"password" => "c2VjcmV0", "username" => "YWRtaW4="}, + "stringData" => %{"token" => "super-secret"} + } + + assert Kube.Utils.redact_secret(secret) == %{ + "apiVersion" => "v1", + "kind" => "Secret", + "metadata" => %{"name" => "db"}, + "data" => %{"password" => "*****", "username" => "*****"}, + "stringData" => %{"token" => "*****"} + } + end + + test "leaves non-secret resources unchanged" do + config_map = %{ + "apiVersion" => "v1", + "kind" => "ConfigMap", + "data" => %{"name" => "value"} + } + + assert Kube.Utils.redact_secret(config_map) == config_map + end + end +end