diff --git a/.cursor/skills/console-operator-crd-docs/SKILL.md b/.cursor/skills/console-operator-crd-docs/SKILL.md new file mode 100644 index 0000000000..39c128c4dc --- /dev/null +++ b/.cursor/skills/console-operator-crd-docs/SKILL.md @@ -0,0 +1,22 @@ +--- +name: console-operator-crd-docs +description: Regenerates and synchronizes Console operator CRD documentation. Use whenever editing CRD definitions under go/controller/api. +--- + +# Console Operator CRD Documentation + +After updating Console operator CRD definitions under `go/controller/api`, run both documentation steps. + +First, regenerate the CRD reference from `go/controller/`: + +```bash +make codegen-crd-docs +``` + +Then synchronize the generated reference into the documentation site from the repository root: + +```bash +make documentation-sync +``` + +Include changes to both `go/controller/docs/api.md` and `js/documentation/pages/api-reference/kubernetes/management-api-reference.md` with the CRD update. diff --git a/.github/workflows/helm-test-ci.yaml b/.github/workflows/helm-test-ci.yaml index d83c5e7540..68af51490f 100644 --- a/.github/workflows/helm-test-ci.yaml +++ b/.github/workflows/helm-test-ci.yaml @@ -7,6 +7,7 @@ on: paths: - ".github/workflows/helm-test-ci.yaml" - "go/helm-test/**" + - "charts/controller/**" - "charts/console/**" - "charts/console-rapid/**" permissions: diff --git a/.github/workflows/helm.yaml b/.github/workflows/helm.yaml index e1dda7aeee..c273637237 100644 --- a/.github/workflows/helm.yaml +++ b/.github/workflows/helm.yaml @@ -21,6 +21,7 @@ jobs: chart: - charts/console - charts/console-rapid + - charts/controller steps: - name: Checkout uses: actions/checkout@v6 diff --git a/Dockerfile b/Dockerfile index 11bf3ae671..c8f5d4c0e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -87,7 +87,7 @@ RUN mix do db.certs, agent.chart, sentry.package_source_code, release FROM alpine:3.21.3 as tools ARG TARGETARCH=amd64 -ENV CLI_VERSION=v0.12.63 +ENV CLI_VERSION=v0.12.64 COPY AGENT_VERSION AGENT_VERSION diff --git a/charts/console-rapid/charts/controller-0.0.209.tgz b/charts/console-rapid/charts/controller-0.0.209.tgz index 4d19abad67..edc01b9cc7 100644 Binary files a/charts/console-rapid/charts/controller-0.0.209.tgz and b/charts/console-rapid/charts/controller-0.0.209.tgz differ diff --git a/charts/console/charts/controller-0.0.209.tgz b/charts/console/charts/controller-0.0.209.tgz index b2c337c9d6..89c526241c 100644 Binary files a/charts/console/charts/controller-0.0.209.tgz and b/charts/console/charts/controller-0.0.209.tgz differ diff --git a/charts/console/templates/kas/configmap.yaml b/charts/console/templates/kas/configmap.yaml index 6133cc078d..f2fdda4cb8 100644 --- a/charts/console/templates/kas/configmap.yaml +++ b/charts/console/templates/kas/configmap.yaml @@ -35,4 +35,9 @@ data: listen: address: ":{{ .Values.kas.service.privateApiPort }}" authentication_secret_file: "/etc/kas/.privateapi_secret" + {{- if .Values.console.tls.enabled }} + plural_url: "https://console.{{ .Release.Namespace }}:{{ .Values.service.port }}/gql" + plural_insecure_skip_tls_verify: true + {{- else }} plural_url: "https://{{ .Values.kas.consoleUrl }}/gql" + {{- end }} diff --git a/charts/console/templates/kas/deployment.yaml b/charts/console/templates/kas/deployment.yaml index 85c08fb045..c0738b97ca 100644 --- a/charts/console/templates/kas/deployment.yaml +++ b/charts/console/templates/kas/deployment.yaml @@ -110,7 +110,12 @@ spec: - --disable-csrf-protection - --cluster-context-enabled=true - --insecure-bind-address=0.0.0.0 + {{- if .Values.console.tls.enabled }} + - --token-exchange-endpoint=https://$(CONSOLE_HOST)/v1/dashboard/cluster + - --token-exchange-skip-tls-verify + {{- else }} - --token-exchange-endpoint=http://$(CONSOLE_HOST)/v1/dashboard/cluster + {{- end }} env: - name: KAS_HOST valueFrom: diff --git a/charts/console/templates/secrets.yaml b/charts/console/templates/secrets.yaml index a18fd57041..a90e24a750 100644 --- a/charts/console/templates/secrets.yaml +++ b/charts/console/templates/secrets.yaml @@ -58,6 +58,9 @@ data: {{ if .Values.console.config.tarballQps }} CONSOLE_TARBALL_QPS: {{ .Values.console.config.tarballQps | toString | b64enc | quote }} {{ end }} +{{ if .Values.console.config.maxRequestBodyLength }} + CONSOLE_MAX_REQUEST_BODY_LENGTH: {{ .Values.console.config.maxRequestBodyLength | toString | b64enc | quote }} +{{ end }} {{ if .Values.console.config.cacheAgentQps }} CONSOLE_CACHE_AGENT_QPS: {{ .Values.console.config.cacheAgentQps | toString | b64enc | quote }} {{ end }} @@ -73,6 +76,9 @@ data: {{ if .Values.console.config.healthmapClusterCount }} CONSOLE_HEALTHMAP_CLUSTER_COUNT: {{ .Values.console.config.healthmapClusterCount | toString | b64enc | quote }} {{ end }} +{{ if .Values.console.config.tracing.endpoint }} + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: {{ .Values.console.config.tracing.endpoint | b64enc | quote }} +{{ end }} {{ range $key, $value := $extraSecretEnv }} {{ $key }}: {{ $value | b64enc | quote }} {{ end }} diff --git a/charts/console/values.yaml b/charts/console/values.yaml index afa4327a67..311a2303b4 100644 --- a/charts/console/values.yaml +++ b/charts/console/values.yaml @@ -127,6 +127,10 @@ console: # tarballQps configures the global QPS limit for digest and git tarball endpoints. tarballQps: 100 + # maxRequestBodyLength configures the maximum HTTP request body size in bytes. + # Leave unset to use the application default (100000000). Raise this if stack state uploads return 413. + maxRequestBodyLength: ~ + # cacheAgentQps configures the global QPS limit for pod-local cache agents. cacheAgentQps: ~ @@ -142,6 +146,12 @@ console: # healthmapClusterCount configures the number of clusters to show in the healthmap. healthmapClusterCount: ~ + # tracing configures OpenTelemetry trace export from the Console. + tracing: + # endpoint is the full OTLP/HTTP traces endpoint. Leave unset to disable tracing. + # Example: http://otel-collector.observability:4318/v1/traces + endpoint: ~ + # rdsIamAuthentication is used to configure whether rds iam authentication should be enabled for all db connections. Ensure your database is prepared to handle IAM authentication before enabling here. rdsIamAuthentication: false @@ -580,6 +590,9 @@ provider: custom # controller is used in Chart.yaml to determine if controller dependency should be installed controller: enabled: true + console: + tls: + enabled: false # flux2 is used to override some values in flux2 default chart (packaged in charts/flux2-2.14.0.tgz). See https://github.com/fluxcd-community/helm-charts/blob/main/charts/flux2/values.yaml flux2: diff --git a/charts/controller/crds/deployments.plural.sh_deploymentsettings.yaml b/charts/controller/crds/deployments.plural.sh_deploymentsettings.yaml index 8e47572ebe..48b5520e5f 100644 --- a/charts/controller/crds/deployments.plural.sh_deploymentsettings.yaml +++ b/charts/controller/crds/deployments.plural.sh_deploymentsettings.yaml @@ -255,6 +255,15 @@ spec: description: EmbeddingModel is the Bedrock model or inference profile for embeddings. Same ID formats as modelId. type: string + endpoint: + default: RUNTIME + description: |- + Endpoint selects the AWS Bedrock API surface. RUNTIME (the default) uses InvokeModel or + Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. + enum: + - RUNTIME + - MANTLE + type: string modelId: description: |- ModelID is the primary AWS Bedrock model or inference profile identifier. diff --git a/charts/controller/crds/deployments.plural.sh_workbenchtools.yaml b/charts/controller/crds/deployments.plural.sh_workbenchtools.yaml index 9163c27e28..a86f2f722a 100644 --- a/charts/controller/crds/deployments.plural.sh_workbenchtools.yaml +++ b/charts/controller/crds/deployments.plural.sh_workbenchtools.yaml @@ -1590,7 +1590,7 @@ spec: type: object x-kubernetes-map-type: atomic tokenSecretRef: - description: Reference to a secret key containing the bearer + description: Reference to a secret key containing the authentication token. properties: key: @@ -1614,6 +1614,13 @@ spec: - key type: object x-kubernetes-map-type: atomic + tokenType: + default: BEARER + description: Authorization realm used for token authentication. + enum: + - BEARER + - SPLUNK + type: string url: description: Splunk base URL. type: string @@ -1727,6 +1734,74 @@ spec: required: - url type: object + victoriaLogs: + description: VictoriaLogs connection (logs). + properties: + accountId: + description: Optional AccountID tenant header. + type: string + passwordSecretRef: + description: Reference to a secret key containing the basic + auth password. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + projectId: + description: Optional ProjectID tenant header. + type: string + tokenSecretRef: + description: Reference to a secret key containing the bearer + token or api key. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + url: + description: VictoriaLogs base URL. + type: string + username: + description: Basic auth username. + type: string + required: + - url + type: object type: object mcpServerRef: description: The mcp server for this tool. @@ -1917,6 +1992,7 @@ spec: - CLOUD_RUN - AZURE_FUNCTION - DOCKER + - VICTORIA_LOGS type: string required: - tool diff --git a/charts/controller/templates/deployment.yaml b/charts/controller/templates/deployment.yaml index f2b0903733..85c82c4e96 100644 --- a/charts/controller/templates/deployment.yaml +++ b/charts/controller/templates/deployment.yaml @@ -1,4 +1,5 @@ -{{ $consoleUrl := .Values.consoleUrl | default (printf "http://console.%s:4000" .Release.Namespace) }} +{{ $consoleScheme := ternary "https" "http" .Values.console.tls.enabled }} +{{ $consoleUrl := .Values.consoleUrl | default (printf "%s://console.%s:4000" $consoleScheme .Release.Namespace) }} apiVersion: apps/v1 kind: Deployment metadata: @@ -36,6 +37,9 @@ spec: - args: {{- toYaml .Values.controllerManager.manager.args | nindent 8 }} - --console-url={{ $consoleUrl }}/gql + {{- if .Values.console.tls.enabled }} + - --console-insecure-skip-tls-verify + {{- end }} - --console-token=$(CONSOLE_TOKEN) command: - /manager diff --git a/charts/controller/templates/manager-rbac.yaml b/charts/controller/templates/manager-rbac.yaml index 8dbeef2a02..fd29862720 100644 --- a/charts/controller/templates/manager-rbac.yaml +++ b/charts/controller/templates/manager-rbac.yaml @@ -5,37 +5,56 @@ metadata: labels: app.kubernetes.io/part-of: plural-deployment-controller {{- include "controller.labels" . | nindent 4 }} +{{- $coreRules := list .Values.rbac.configMapsAndNamespaces .Values.rbac.secrets }} +{{- range $rule := $coreRules }} +{{- if or (has "*" $rule.resources) (has "*" $rule.verbs) }} +{{- fail "RBAC resources and verbs must be explicitly enumerated; wildcards are not allowed" }} +{{- end }} +{{- end }} +{{- $deploymentsRule := .Values.rbac.deploymentsPlural }} +{{- if or + (has "*" $deploymentsRule.resources) + (has "*" $deploymentsRule.verbs) + (has "*" $deploymentsRule.finalizerVerbs) + (has "*" $deploymentsRule.statusVerbs) +}} +{{- fail "RBAC resources and verbs must be explicitly enumerated; wildcards are not allowed" }} +{{- end }} rules: - apiGroups: - "" resources: - - configmaps - - namespaces +{{ toYaml .Values.rbac.configMapsAndNamespaces.resources | indent 2 }} verbs: - - get - - list - - patch - - update - - watch - - create +{{ toYaml .Values.rbac.configMapsAndNamespaces.verbs | indent 2 }} - apiGroups: - "" resources: - - secrets +{{ toYaml .Values.rbac.secrets.resources | indent 2 }} verbs: - - get - - list - - patch - - update - - watch - - create - - delete +{{ toYaml .Values.rbac.secrets.verbs | indent 2 }} - apiGroups: - deployments.plural.sh resources: - - '*' +{{ toYaml $deploymentsRule.resources | indent 2 }} verbs: - - '*' +{{ toYaml $deploymentsRule.verbs | indent 2 }} +- apiGroups: + - deployments.plural.sh + resources: + {{- range $resource := $deploymentsRule.resources }} + - {{ $resource }}/finalizers + {{- end }} + verbs: +{{ toYaml $deploymentsRule.finalizerVerbs | indent 2 }} +- apiGroups: + - deployments.plural.sh + resources: + {{- range $resource := $deploymentsRule.resources }} + - {{ $resource }}/status + {{- end }} + verbs: +{{ toYaml $deploymentsRule.statusVerbs | indent 2 }} --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding diff --git a/charts/controller/values.yaml b/charts/controller/values.yaml index 11a0e679b6..f8767282a1 100644 --- a/charts/controller/values.yaml +++ b/charts/controller/values.yaml @@ -10,6 +10,9 @@ securityContext: type: RuntimeDefault consoleUrl: ~ +console: + tls: + enabled: false fullnameOverride: console-operator tokenSecretRef: @@ -48,3 +51,96 @@ controllerManager: annotations: {} imagePullSecrets: [] kubernetesClusterDomain: cluster.local + +rbac: + configMapsAndNamespaces: + resources: + - configmaps + - namespaces + verbs: + - create + - get + - list + - patch + - update + - watch + secrets: + resources: + - secrets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + deploymentsPlural: + resources: + - agentruntimepolicies + - bindingpolicies + - bootstraptokens + - catalogs + - cloudconnections + - clusterrestores + - clusterrestoretriggers + - clusters + - clustersyncs + - compliancereportgenerators + - customcompatibilitymatrices + - customstackruns + - deploymentsettings + - federatedcredentials + - flows + - generatedsecrets + - gitrepositories + - globalservices + - groups + - helmrepositories + - infrastructurestacks + - managednamespaces + - mcpservers + - namespacecredentials + - notificationrouters + - notificationsinks + - observabilityproviders + - observers + - oidcproviders + - personas + - pipelinecontexts + - pipelines + - policies + - prautomations + - prautomationtriggers + - previewenvironmenttemplates + - prgovernances + - projects + - providers + - scmconnections + - sentinels + - sentineltriggers + - serviceaccounts + - servicecontexts + - servicedeployments + - stackdefinitions + - upgradeplancallouts + - workbenchcrons + - workbenches + - workbenchprompts + - workbenchtools + - workbenchwebhooks + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + finalizerVerbs: + - update + statusVerbs: + - get + - patch + - update diff --git a/config/config.exs b/config/config.exs index cb209fe12d..8978a89f51 100644 --- a/config/config.exs +++ b/config/config.exs @@ -71,6 +71,7 @@ config :console, kas_dns: "https://kas.example.com", qps: 1_000, tarball_qps: 100, + max_request_body_length: 100_000_000, cache_agent_qps: 50, cache_agent_queue_limit: 50, cache_agent_queue_shed: 5, diff --git a/config/test.exs b/config/test.exs index c3f229bdbb..3a4765f506 100644 --- a/config/test.exs +++ b/config/test.exs @@ -520,23 +520,23 @@ config :console, Console.Deployments.Metrics.Provider.NewRelic, plug: {Req.Test, Console.Deployments.Metrics.Provider.NewRelic} config :console, - Console.AI.Tools.Workbench.Observability.ExternalDashboards.Datadog, - plug: {Req.Test, Console.AI.Tools.Workbench.Observability.ExternalDashboards.Datadog} + Console.AI.Tools.Workbench.Observability.External.Datadog, + plug: {Req.Test, Console.AI.Tools.Workbench.Observability.External.Datadog} config :console, - Console.AI.Tools.Workbench.Observability.ExternalDashboards.Dynatrace, - plug: {Req.Test, Console.AI.Tools.Workbench.Observability.ExternalDashboards.Dynatrace} + Console.AI.Tools.Workbench.Observability.External.Dynatrace, + plug: {Req.Test, Console.AI.Tools.Workbench.Observability.External.Dynatrace} config :console, - Console.AI.Tools.Workbench.Observability.ExternalDashboards.Splunk, - plug: {Req.Test, Console.AI.Tools.Workbench.Observability.ExternalDashboards.Splunk} + Console.AI.Tools.Workbench.Observability.External.Splunk, + plug: {Req.Test, Console.AI.Tools.Workbench.Observability.External.Splunk} config :console, - Console.AI.Tools.Workbench.Observability.ExternalDashboards.Azure, - plug: {Req.Test, Console.AI.Tools.Workbench.Observability.ExternalDashboards.Azure} + Console.AI.Tools.Workbench.Observability.External.Azure, + plug: {Req.Test, Console.AI.Tools.Workbench.Observability.External.Azure} -config :console, Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry, - plug: {Req.Test, Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry} +config :console, Console.AI.Tools.Workbench.Observability.External.Sentry, + plug: {Req.Test, Console.AI.Tools.Workbench.Observability.External.Sentry} config :elasticsearch, host: System.get_env("ELASTICSEARCH_HOST", "http://localhost:9200"), diff --git a/go/client/client.go b/go/client/client.go index 2f79c1e543..1bbc5a0e4b 100644 --- a/go/client/client.go +++ b/go/client/client.go @@ -14882,6 +14882,38 @@ func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Loki) GetUs return t.Username } +type WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -15343,6 +15375,7 @@ type WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration struct { Splunk *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetAtlassian() *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Atlassian { @@ -15513,6 +15546,12 @@ func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetTempo() } return t.Tempo } +func (t *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type WorkbenchToolFragment_McpServer_MCPServerFragment_Authentication_Headers struct { Name string "json:\"name\" graphql:\"name\"" @@ -15781,6 +15820,38 @@ func (t *WorkbenchToolFragment_Configuration_Loki) GetUsername() *string { return t.Username } +type WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -16242,6 +16313,7 @@ type WorkbenchToolFragment_Configuration struct { Splunk *WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *WorkbenchToolFragment_Configuration) GetAtlassian() *WorkbenchToolFragment_Configuration_Atlassian { @@ -16412,6 +16484,12 @@ func (t *WorkbenchToolFragment_Configuration) GetTempo() *WorkbenchToolFragment_ } return t.Tempo } +func (t *WorkbenchToolFragment_Configuration) GetVictoriaLogs() *WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type WorkbenchCronFragment_Workbench struct { ID string "json:\"id\" graphql:\"id\"" @@ -34122,6 +34200,38 @@ func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFr return t.Username } +type CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -34583,6 +34693,7 @@ type CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragme Splunk *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetAtlassian() *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Atlassian { @@ -34753,6 +34864,12 @@ func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFr } return t.Tempo } +func (t *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &CreateWorkbench_CreateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_AgentRuntime_TinyAgentRuntimeFragment_Cluster struct { Handle *string "json:\"handle,omitempty\" graphql:\"handle\"" @@ -35175,6 +35292,38 @@ func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFr return t.Username } +type UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -35636,6 +35785,7 @@ type UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragme Splunk *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetAtlassian() *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Atlassian { @@ -35806,6 +35956,12 @@ func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFr } return t.Tempo } +func (t *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &UpdateWorkbench_UpdateWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_AgentRuntime_TinyAgentRuntimeFragment_Cluster struct { Handle *string "json:\"handle,omitempty\" graphql:\"handle\"" @@ -36228,6 +36384,38 @@ func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFr return t.Username } +type DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -36689,6 +36877,7 @@ type DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragme Splunk *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetAtlassian() *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Atlassian { @@ -36859,6 +37048,12 @@ func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFr } return t.Tempo } +func (t *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &DeleteWorkbench_DeleteWorkbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type WorkbenchPrFollowup_WorkbenchPrFollowup struct { ID string "json:\"id\" graphql:\"id\"" @@ -37159,6 +37354,38 @@ func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configura return t.Username } +type CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -37620,6 +37847,7 @@ type CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration Splunk *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration) GetAtlassian() *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_Atlassian { @@ -37790,6 +38018,12 @@ func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configura } return t.Tempo } +func (t *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &CreateWorkbenchTool_CreateWorkbenchTool_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_McpServer_MCPServerFragment_Authentication_Headers struct { Name string "json:\"name\" graphql:\"name\"" @@ -38058,6 +38292,38 @@ func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configura return t.Username } +type UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -38519,6 +38785,7 @@ type UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration Splunk *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration) GetAtlassian() *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_Atlassian { @@ -38689,6 +38956,12 @@ func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configura } return t.Tempo } +func (t *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &UpdateWorkbenchTool_UpdateWorkbenchTool_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_McpServer_MCPServerFragment_Authentication_Headers struct { Name string "json:\"name\" graphql:\"name\"" @@ -38957,6 +39230,38 @@ func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configura return t.Username } +type DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -39418,6 +39723,7 @@ type DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration Splunk *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration) GetAtlassian() *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_Atlassian { @@ -39588,6 +39894,12 @@ func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configura } return t.Tempo } +func (t *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &DeleteWorkbenchTool_DeleteWorkbenchTool_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_AgentRuntime_TinyAgentRuntimeFragment_Cluster struct { Handle *string "json:\"handle,omitempty\" graphql:\"handle\"" @@ -40010,6 +40322,38 @@ func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_Workbenc return t.Username } +type ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -40471,6 +40815,7 @@ type ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToo Splunk *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetAtlassian() *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Atlassian { @@ -40641,6 +40986,12 @@ func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_Workbenc } return t.Tempo } +func (t *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &ListWorkbenches_Workbenches_Edges_Node_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type ListWorkbenches_Workbenches_Edges struct { Node *WorkbenchFragment "json:\"node,omitempty\" graphql:\"node\"" @@ -41092,6 +41443,38 @@ func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Co return t.Username } +type GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -41553,6 +41936,7 @@ type GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Config Splunk *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetAtlassian() *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_Atlassian { @@ -41723,6 +42107,12 @@ func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Co } return t.Tempo } +func (t *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &GetWorkbench_Workbench_WorkbenchFragment_Tools_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type GetWorkbenchTiny_Workbench struct { ID string "json:\"id\" graphql:\"id\"" @@ -42009,6 +42399,38 @@ func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Conf return t.Username } +type ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -42470,6 +42892,7 @@ type ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configur Splunk *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration) GetAtlassian() *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_Atlassian { @@ -42640,6 +43063,12 @@ func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Conf } return t.Tempo } +func (t *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &ListWorkbenchTools_WorkbenchTools_Edges_Node_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type ListWorkbenchTools_WorkbenchTools_Edges struct { Node *WorkbenchToolFragment "json:\"node,omitempty\" graphql:\"node\"" @@ -42937,6 +43366,38 @@ func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_Loki return t.Username } +type GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs struct { + AccountID *string "json:\"accountId,omitempty\" graphql:\"accountId\"" + ProjectID *string "json:\"projectId,omitempty\" graphql:\"projectId\"" + URL *string "json:\"url,omitempty\" graphql:\"url\"" + Username *string "json:\"username,omitempty\" graphql:\"username\"" +} + +func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetAccountID() *string { + if t == nil { + t = &GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.AccountID +} +func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetProjectID() *string { + if t == nil { + t = &GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.ProjectID +} +func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetURL() *string { + if t == nil { + t = &GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.URL +} +func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs) GetUsername() *string { + if t == nil { + t = &GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs{} + } + return t.Username +} + type GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_Splunk struct { URL *string "json:\"url,omitempty\" graphql:\"url\"" Username *string "json:\"username,omitempty\" graphql:\"username\"" @@ -43398,6 +43859,7 @@ type GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration struct { Splunk *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_Splunk "json:\"splunk,omitempty\" graphql:\"splunk\"" Teams *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_Teams "json:\"teams,omitempty\" graphql:\"teams\"" Tempo *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_Tempo "json:\"tempo,omitempty\" graphql:\"tempo\"" + VictoriaLogs *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs "json:\"victoriaLogs,omitempty\" graphql:\"victoriaLogs\"" } func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration) GetAtlassian() *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_Atlassian { @@ -43568,6 +44030,12 @@ func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration) Get } return t.Tempo } +func (t *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration) GetVictoriaLogs() *GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration_VictoriaLogs { + if t == nil { + t = &GetWorkbenchTool_WorkbenchTool_WorkbenchToolFragment_Configuration{} + } + return t.VictoriaLogs +} type GetWorkbenchToolTiny_WorkbenchTool struct { ID string "json:\"id\" graphql:\"id\"" @@ -70531,6 +70999,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -70825,6 +71299,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -71120,6 +71600,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -71369,6 +71855,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -71595,6 +72087,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -71822,6 +72320,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -72128,6 +72632,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -72430,6 +72940,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -72685,6 +73201,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username @@ -72919,6 +73441,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username diff --git a/go/client/generated/persisted-queries/queries.json b/go/client/generated/persisted-queries/queries.json index 72c53faf5f..02679df5f6 100644 --- a/go/client/generated/persisted-queries/queries.json +++ b/go/client/generated/persisted-queries/queries.json @@ -1 +1 @@ -{"operations":{"sha256:00103bd4468d331dceccf9f2cf1c3770fe14da6023e65301de2f423934a180df":"query GetNamespaceByName ($name: String!) {\n\tmanagedNamespace(name: $name) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:00cc798d4efba980df734ed908f4a6eff35ea9532ba5a24ce2e678c47b9e4edd":"mutation DeleteGitRepository ($id: ID!) {\n\tdeleteGitRepository(id: $id) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:0495efe67b265523309e91230a439c44a3566aa4f54eae8038c54b08e197da4a":"mutation CreatePullRequest ($id: ID!, $identifier: String, $branch: String, $context: Json) {\n\tcreatePullRequest(id: $id, identifier: $identifier, branch: $branch, context: $context) {\n\t\t... PullRequestFragment\n\t}\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\n","sha256:04f446a7241e2a77f9c03860529c22f6097f0b065b8a91812af367db06c51783":"mutation DeletePipeline ($id: ID!) {\n\tdeletePipeline(id: $id) {\n\t\t... PipelineFragmentId\n\t}\n}\nfragment PipelineFragmentId on Pipeline {\n\tid\n}\n","sha256:05614f559b29689b95f90bfb84adf304e3898a429c26fc3b55dda779621f3d26":"mutation UpsertCatalog ($attributes: CatalogAttributes) {\n\tupsertCatalog(attributes: $attributes) {\n\t\t... CatalogFragment\n\t}\n}\nfragment CatalogFragment on Catalog {\n\tid\n\tname\n\tdescription\n\tcategory\n\tauthor\n\tproject {\n\t\t... ProjectFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:071e713551ffc28f4196427c367142ecc5fa316d0b9fc17c0dfc682f6b1dca67":"query GetProjectTiny ($id: ID, $name: String) {\n\tproject(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:07fc34a5e5b6a6de044a6b35bf40e5218106f2849f0528e71f8f23287a498858":"mutation UpdateCloudConnection ($id: ID!, $attributes: CloudConnectionAttributes!) {\n\tupdateCloudConnection(id: $id, attributes: $attributes) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:08223278347596ef0a0f5ab698ed517803e9dcf41027abe6e1b00e1765a24534":"mutation UpdateAgentRunTodos ($id: ID!, $todos: [AgentTodoAttributes]) {\n\tupdateAgentRunTodos(id: $id, todos: $todos) {\n\t\t... AgentRunBaseFragment\n\t}\n}\nfragment AgentRunBaseFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tmode\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\n","sha256:085357a60e4fc347e143328a81f9de10226eed039c1bf5c65180c4a22e0cabbf":"mutation CreateGlobalServiceDeploymentFromTemplate ($attributes: GlobalServiceAttributes!) {\n\tcreateGlobalService(attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:08538e2a930e5635cdf567d936c4e328614f999e32a060237d625a4bf0a0d818":"query GetPreviewEnvironmentTemplate ($id: ID, $flowId: ID, $name: String) {\n\tpreviewEnvironmentTemplate(id: $id, flowId: $flowId, name: $name) {\n\t\t... PreviewEnvironmentTemplateFragment\n\t}\n}\nfragment PreviewEnvironmentTemplateFragment on PreviewEnvironmentTemplate {\n\tid\n\tname\n\tcommentTemplate\n\tflow {\n\t\tid\n\t}\n\tconnection {\n\t\tid\n\t}\n\ttemplate {\n\t\tname\n\t}\n}\n","sha256:087514315644018028c9097e305b44d39b6d2a04bbc27db80624db6f7cc0ca72":"query GetCloudConnection ($id: ID, $name: String) {\n\tcloudConnection(id: $id, name: $name) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:0a28bd1898f2387165f13394e8eef522528534c85f28548d81706a42b2711b11":"mutation CreateProject ($attributes: ProjectAttributes!) {\n\tcreateProject(attributes: $attributes) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:0bc7753b4e8e392d65a52f75255bc48a95cdea84ee46118b08f141280cb5aa18":"query ListStackRuns ($id: ID!, $after: String, $before: String, $first: Int, $last: Int) {\n\tinfrastructureStack(id: $id) {\n\t\truns(after: $after, before: $before, first: $first, last: $last) {\n\t\t\tpageInfo {\n\t\t\t\t... PageInfoFragment\n\t\t\t}\n\t\t\tedges {\n\t\t\t\tnode {\n\t\t\t\t\t... StackRunFragment\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackRunFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n\tapprover {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:0c0af919e2a1ba02a7c44e25fe40583b263f45bc1a1639ae2d730c016a86fdbe":"query GetStackRun ($id: ID!) {\n\tstackRun(id: $id) {\n\t\t... StackRunFragment\n\t}\n}\nfragment StackRunFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n\tapprover {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:0d0a41b5dfa910c86743e2020189205095d82cfdaff768c950becb55d86e2b18":"query GetPrAutomationTiny ($id: ID, $name: String) {\n\tprAutomation(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:0e44517bb19e961ba5072de436b6c59ae5f5f26a0abe32ae3e8ddee5f69a6aa2":"query GetInfrastructureStack ($id: ID, $name: String) {\n\tinfrastructureStack(id: $id, name: $name) {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:0f0760bb85acd02798886990edc78e9aac44db50fa883f250d5972519ffa9ce3":"query GetGitRepository ($id: ID, $url: String) {\n\tgitRepository(id: $id, url: $url) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:0f2aa1a8d7ef81b1122c7d75ae4e54e7f47f04ec942981b778e1d6899309f374":"mutation DeleteCustomCompatibilityMatrix ($name: String!) {\n\tdeleteCustomCompatibilityMatrix(name: $name) {\n\t\tid\n\t}\n}\n","sha256:0f857226291e1c313b529970c1763b3099d220400b5c30af99dcba2ecbe28880":"mutation DeleteWorkbenchTool ($id: ID!) {\n\tdeleteWorkbenchTool(id: $id) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:0fa340d64f20a24b0474d3d73ba219d190d314d53d35e1cd3cba85f0c08b3e9b":"query ListClusterNamespaces ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterManagedNamespaces(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ManagedNamespaceEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ManagedNamespaceEdgeFragment on ManagedNamespaceEdge {\n\tcursor\n\tnode {\n\t\t... ManagedNamespaceMinimalFragment\n\t}\n}\nfragment ManagedNamespaceMinimalFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n}\n","sha256:113ac0549d0fcfd701e5bd6f98913d91d1b5c93a64d33494d301d8a0512d0c3b":"mutation DeleteCluster ($id: ID!) {\n\tdeleteCluster(id: $id) {\n\t\tid\n\t}\n}\n","sha256:1241ee42efef6bee48784022906e25828de81d27b66b8b2661a6696b25bf8096":"query ListPolicyConstraints ($after: String, $first: Int, $before: String, $last: Int, $namespace: String, $kind: String, $q: String) {\n\tpolicyConstraints(after: $after, first: $first, before: $before, last: $last, namespace: $namespace, kind: $kind, q: $q) {\n\t\t... PolicyConstraintConnectionFragment\n\t}\n}\nfragment PolicyConstraintConnectionFragment on PolicyConstraintConnection {\n\tpageInfo {\n\t\t... PageInfoFragment\n\t}\n\tedges {\n\t\t... PolicyConstraintEdgeFragment\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment PolicyConstraintEdgeFragment on PolicyConstraintEdge {\n\tcursor\n\tnode {\n\t\t... PolicyConstraintFragment\n\t}\n}\nfragment PolicyConstraintFragment on PolicyConstraint {\n\tid\n\tname\n\tdescription\n\trecommendation\n\tviolationCount\n\tref {\n\t\t... ConstraintRefFragment\n\t}\n\tviolations {\n\t\t... ViolationFragment\n\t}\n}\nfragment ConstraintRefFragment on ConstraintRef {\n\tkind\n\tname\n}\nfragment ViolationFragment on Violation {\n\tid\n\tgroup\n\tversion\n\tkind\n\tnamespace\n\tname\n\tmessage\n}\n","sha256:12978d7990d091e6a41e14baa02a3eec74a42fa51d13c7123407753af75206d5":"mutation DeleteMCPServer ($id: ID!) {\n\tdeleteMcpServer(id: $id) {\n\t\tid\n\t}\n}\n","sha256:14dab7763ca34c91224365fb4ee687491114c4f8417edf9242c56b2471d8e8aa":"mutation UpsertObserver ($attributes: ObserverAttributes!) {\n\tupsertObserver(attributes: $attributes) {\n\t\t... ObserverFragment\n\t}\n}\nfragment ObserverFragment on Observer {\n\tid\n\tname\n\tstatus\n\tcrontab\n\ttarget {\n\t\t... ObserverTargetFragment\n\t}\n\tactions {\n\t\t... ObserverActionFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ObserverTargetFragment on ObserverTarget {\n\thelm {\n\t\t... ObserverHelmRepoFragment\n\t}\n\toci {\n\t\t... ObserverOciRepoFragment\n\t}\n}\nfragment ObserverHelmRepoFragment on ObserverHelmRepo {\n\turl\n\tchart\n\tprovider\n}\nfragment ObserverOciRepoFragment on ObserverOciRepo {\n\turl\n\tprovider\n}\nfragment ObserverActionFragment on ObserverAction {\n\ttype\n\tconfiguration {\n\t\t... ObserverActionConfigurationFragment\n\t}\n}\nfragment ObserverActionConfigurationFragment on ObserverActionConfiguration {\n\tpr {\n\t\t... ObserverPrActionFragment\n\t}\n\tpipeline {\n\t\t... ObserverPipelineActionFragment\n\t}\n}\nfragment ObserverPrActionFragment on ObserverPrAction {\n\tautomationId\n\trepository\n\tbranchTemplate\n\tcontext\n}\nfragment ObserverPipelineActionFragment on ObserverPipelineAction {\n\tpipelineId\n\tcontext\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\n","sha256:156bc954626bd533fcb5d6b04f8818932bf0aac8fe3b75559b80c0fdba618249":"query GetServiceContext ($name: String!) {\n\tserviceContext(name: $name) {\n\t\t... ServiceContextFragment\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:15709e3e6be95a817cd82440cad42dff3e321b122c6dd4a244b34c11c83e0d60":"mutation AddClusterAuditLog ($audit: ClusterAuditAttributes, $audits: [ClusterAuditAttributes!]) {\n\taddClusterAuditLog(audit: $audit, audits: $audits)\n}\n","sha256:15a07ea39246684d9bc7446b1b87bd02c1d896b97e55a709744128464a8f9cd5":"mutation UpdateWorkbenchTool ($id: ID!, $attributes: WorkbenchToolAttributes!) {\n\tupdateWorkbenchTool(id: $id, attributes: $attributes) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:167f4296a579145d132b20e16834fe927e5cbcf3207bc99ee1e4224cde76c0ca":"mutation TriggerRun ($id: ID!) {\n\ttriggerRun(id: $id) {\n\t\t... StackRunBaseFragment\n\t}\n}\nfragment StackRunBaseFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:173a6ff059c298faca0983bed5cd23dd2618146a475ba1b318c6df57571088fe":"mutation DetachCluster ($id: ID!) {\n\tdetachCluster(id: $id) {\n\t\tid\n\t}\n}\n","sha256:18dd5f16f5b5edea59cefc781dd47a75481f7fbf8e82fe78bd0b282bdea8ecb1":"query GetServiceContextTiny ($name: String!) {\n\tserviceContext(name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:19d5a50725b33d0f729cfab39941f60c599fa65fd3b62bc8ccaf516d466d61bd":"mutation DeleteCloudConnection ($id: ID!) {\n\tdeleteCloudConnection(id: $id) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:1b46f5f5487d9da23d5fefe4e9c687345d8262c0c56cc51fba038dcb114804fb":"mutation UpdateClusterRegistration ($id: ID!, $attributes: ClusterRegistrationUpdateAttributes!) {\n\tupdateClusterRegistration(id: $id, attributes: $attributes) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:1b8cbf2dcdf2de8865c73a61fa9d6c804e98ab333aa265a4662e88187f1102c8":"query GetServiceTarball ($id: ID!) {\n\tserviceTarball(id: $id) {\n\t\tpath\n\t\tcontent\n\t}\n}\n","sha256:1bda12b2e70df63429dc0f9828860174e95a031e50753a96c7df1d8fbbc31e5f":"mutation CompletesStackRun ($id: ID!, $attributes: StackRunAttributes!) {\n\tcompleteStackRun(id: $id, attributes: $attributes) {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:1cefc75c539e6334a815541ea29d5b313d62320a0891add20d37aadcb87e2f86":"mutation UpdateGitRepository ($id: ID!, $attributes: GitAttributes!) {\n\tupdateGitRepository(id: $id, attributes: $attributes) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:1e351c0a49167a35fcecf3cd2357422f8d0d46d815b2cefbe94af6a2eea3e050":"mutation UpsertUser ($attributes: UserAttributes!) {\n\tupsertUser(attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:1e3e1e2790a3766fa468050e82832991f68555001110778be9611b060369753e":"mutation CreatePipelineContext ($pipelineId: ID!, $attributes: PipelineContextAttributes!) {\n\tcreatePipelineContext(pipelineId: $pipelineId, attributes: $attributes) {\n\t\t... PipelineContextFragment\n\t}\n}\nfragment PipelineContextFragment on PipelineContext {\n\tid\n\tcontext\n}\n","sha256:1f6e3f1f3f3453e925cba533c56cd78e169a56f9276e8795f8aa63576dd56a24":"mutation UpsertUpgradePlanCallout ($attributes: UpgradePlanCalloutAttributes!) {\n\tupsertUpgradePlanCallout(attributes: $attributes) {\n\t\t... UpgradePlanCalloutFragment\n\t}\n}\nfragment UpgradePlanCalloutFragment on UpgradePlanCallout {\n\tid\n\tname\n}\n","sha256:1f6f1a1489995b77678694f2575e16e943eeee4736e05a91dec811f0f15983f3":"mutation CreateFederatedCredential ($attributes: FederatedCredentialAttributes!) {\n\tcreateFederatedCredential(attributes: $attributes) {\n\t\t... FederatedCredentialFragment\n\t}\n}\nfragment FederatedCredentialFragment on FederatedCredential {\n\tid\n\tclaimsLike\n\tissuer\n\tscopes\n\tinsertedAt\n\tupdatedAt\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n}\n","sha256:1ffea4d7cf10ecfd70c134cdf5bfb7dbeaf6434a6a643a55cff81fd9ebbcec0c":"mutation SaveUpgradeInsights ($insights: [UpgradeInsightAttributes], $addons: [CloudAddonAttributes]) {\n\tsaveUpgradeInsights(insights: $insights, addons: $addons) {\n\t\tid\n\t\tname\n\t\tversion\n\t}\n}\n","sha256:203d28df2014c4b7e9a0b2207cf6ccc8a5ef26fdf3e2601c5a3d62109c6837ea":"query ListStackDefinitions ($after: String, $first: Int, $before: String, $last: Int) {\n\tstackDefinitions(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... StackDefinitionFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:221cb5170a90de1dc482ba3e31377437aa9b15a97c7b8ff3230177b70e08bfe4":"query GetHelmRepositoryTiny ($url: String!) {\n\thelmRepository(url: $url) {\n\t\tid\n\t}\n}\n","sha256:2345924629957866fb322bc4c388a43686af182cbbddf270b0f30f8a3b377dd0":"query GetGlobalServiceDeployment ($id: ID!) {\n\tglobalService(id: $id) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:23583acdae3cdcc986ffa4a7e1a2b55d5e7a3bde0311c3ec5718bfbbea14f219":"query GetGlobalServiceDeploymentByName ($name: String!) {\n\tglobalService(name: $name) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:23bb559098a8c85f67e0edcbff659daa6e752c76f0892c65d77432d568398bee":"query GetClusterRestore ($id: ID!) {\n\tclusterRestore(id: $id) {\n\t\t... ClusterRestoreFragment\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:24a3dde607ba5f19327deea354f30f58b8184bcc9d2bbc102fb49b51c5f422b5":"query GetNotificationRouter ($id: ID!) {\n\tnotificationRouter(id: $id) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:25a4c7c811b4dd79d86e145181462499315c7b476c5caaaa60518db1f57f95d9":"mutation SavePipeline ($name: String!, $attributes: PipelineAttributes!) {\n\tsavePipeline(name: $name, attributes: $attributes) {\n\t\t... PipelineFragmentMinimal\n\t}\n}\nfragment PipelineFragmentMinimal on Pipeline {\n\tid\n\tname\n}\n","sha256:2623408de61d79178f6ee987a04e0df092546078b563e89b072b162af6f15ffe":"mutation GetWorkbenchWebhook ($id: ID!) {\n\tgetWorkbenchWebhook(id: $id) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:263be051e9e86e4a69b64064ebf9971db9f14ff4827e881b0a9ea988c3d0870e":"mutation DeleteObservabilityProvider ($id: ID!) {\n\tdeleteObservabilityProvider(id: $id) {\n\t\t... ObservabilityProviderFragment\n\t}\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:299b1ad1887219aef8605421301e00b36aabb4a1cbd34f3ba1f7c4717612eadf":"mutation DeletePrGovernance ($id: ID!) {\n\tdeletePrGovernance(id: $id) {\n\t\t... PrGovernanceFragment\n\t}\n}\nfragment PrGovernanceFragment on PrGovernance {\n\tid\n\tname\n}\n","sha256:29a58c567342ed6668f8af22b9ff8d5ed8c55c74151c93d87accd3827bc39faf":"mutation CreateBootstrapToken ($attributes: BootstrapTokenAttributes!) {\n\tcreateBootstrapToken(attributes: $attributes) {\n\t\t... BootstrapTokenBase\n\t}\n}\nfragment BootstrapTokenBase on BootstrapToken {\n\tid\n\ttoken\n}\n","sha256:2a1fd145f179ee0d1e6ce186d9d3633981ac99bf3752b07c815b1ce2f659c430":"mutation CreateClusterProvider ($attributes: ClusterProviderAttributes!) {\n\tcreateClusterProvider(attributes: $attributes) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:2a9a8fbe23cdfbbf00c854bb4f8332064dff6c8a552ac756b506395bd25100c7":"mutation UpdateClusterProvider ($id: ID!, $attributes: ClusterProviderUpdateAttributes!) {\n\tupdateClusterProvider(id: $id, attributes: $attributes) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:2cfa322ebeb5f421f7cd23fad60e385d43d70b18962d71d0fede0f594cc1b46d":"mutation UpdateSentinel ($id: ID!, $attributes: SentinelAttributes) {\n\tupdateSentinel(id: $id, attributes: $attributes) {\n\t\t... SentinelFragment\n\t}\n}\nfragment SentinelFragment on Sentinel {\n\tid\n\tname\n\tdescription\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:2d79ab2f196f1d63931d3806a4477b92870750014a086d6f2561e55cb6a67af3":"mutation CreateUser ($attributes: UserAttributes!) {\n\tcreateUser(attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:2e5118d5c1872f1f474c40362070af9ad131edef31a6fcfa53ffc550957cb86d":"mutation CreateAgentPullRequest ($runId: ID!, $attributes: AgentPullRequestAttributes!) {\n\tagentPullRequest(runId: $runId, attributes: $attributes) {\n\t\t... PullRequestFragment\n\t}\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\n","sha256:2e5a060183ca0f115ca2fd5c98f051bd8f260fa00902992c20ad8fcf46523699":"query GetFederatedCredentialTiny ($id: ID!) {\n\tfederatedCredential(id: $id) {\n\t\tid\n\t}\n}\n","sha256:2ed4e4848a2483a8d60683df43dcf2668484b6af513db89072d7b9163cb91e40":"mutation UpdateNamespace ($id: ID!, $attributes: ManagedNamespaceAttributes!) {\n\tupdateManagedNamespace(id: $id, attributes: $attributes) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:2f962b9a1cf08b3ac5eb37f0935bf9fb9553825da92e773f0198f564812ddcca":"query GetClusterGate ($id: ID!) {\n\tclusterGate(id: $id) {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:2fb0280705bd95774e0830e6b69482a17a4bdea51b60aae031c878e7622bfb31":"query ListAccessTokens ($cursor: String, $before: String, $last: Int) {\n\taccessTokens(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AccessTokenFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:31c87507e58e544b9660476a49191db9bb682a97098db47b0a24f6ab6b7c7099":"mutation DeleteWorkbenchPrompt ($id: ID!) {\n\tdeleteWorkbenchPrompt(id: $id) {\n\t\tid\n\t}\n}\n","sha256:3328865733a3222c979c5635979280018cbe8a54f6eea8f28e32314b39c6a6a6":"mutation UpdateStackDefinition ($id: ID!, $attributes: StackDefinitionAttributes!) {\n\tupdateStackDefinition(id: $id, attributes: $attributes) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:344d00a3e2e6e10a36de6867db2b9deba25bdebc3547c897fe6f2548738724a7":"query GetStackDefinitionTiny ($id: ID!) {\n\tstackDefinition(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:3557f778cd80f66482868b2bc6d0df507b4a2eb9cc6249877b001bdcc2c2c455":"mutation CreateSentinel ($attributes: SentinelAttributes) {\n\tcreateSentinel(attributes: $attributes) {\n\t\t... SentinelFragment\n\t}\n}\nfragment SentinelFragment on Sentinel {\n\tid\n\tname\n\tdescription\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:3617cd964a5282e8fbdbbb88a2dfddc82c9392725b259d6db7e10b87adb28e91":"mutation SaveServiceContext ($name: String!, $attributes: ServiceContextAttributes!) {\n\tsaveServiceContext(name: $name, attributes: $attributes) {\n\t\t... ServiceContextFragment\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:3642d7afaa157713cb448c26f4f3362a53ba61ba9f368233782e709637054dbe":"mutation DeletePrAutomation ($id: ID!) {\n\tdeletePrAutomation(id: $id) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:368c82946025827b9e5a282df168753546a94ae38c4eba8077c45f32ae92ab54":"mutation DeleteObserver ($id: ID!) {\n\tdeleteObserver(id: $id) {\n\t\t... ObserverFragment\n\t}\n}\nfragment ObserverFragment on Observer {\n\tid\n\tname\n\tstatus\n\tcrontab\n\ttarget {\n\t\t... ObserverTargetFragment\n\t}\n\tactions {\n\t\t... ObserverActionFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ObserverTargetFragment on ObserverTarget {\n\thelm {\n\t\t... ObserverHelmRepoFragment\n\t}\n\toci {\n\t\t... ObserverOciRepoFragment\n\t}\n}\nfragment ObserverHelmRepoFragment on ObserverHelmRepo {\n\turl\n\tchart\n\tprovider\n}\nfragment ObserverOciRepoFragment on ObserverOciRepo {\n\turl\n\tprovider\n}\nfragment ObserverActionFragment on ObserverAction {\n\ttype\n\tconfiguration {\n\t\t... ObserverActionConfigurationFragment\n\t}\n}\nfragment ObserverActionConfigurationFragment on ObserverActionConfiguration {\n\tpr {\n\t\t... ObserverPrActionFragment\n\t}\n\tpipeline {\n\t\t... ObserverPipelineActionFragment\n\t}\n}\nfragment ObserverPrActionFragment on ObserverPrAction {\n\tautomationId\n\trepository\n\tbranchTemplate\n\tcontext\n}\nfragment ObserverPipelineActionFragment on ObserverPipelineAction {\n\tpipelineId\n\tcontext\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\n","sha256:36fea2d78373476143b536962a73f6b9eca5fdef00b5415ab69e1ab830908756":"mutation CreateStackDefinition ($attributes: StackDefinitionAttributes!) {\n\tcreateStackDefinition(attributes: $attributes) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:3715c332fc325a323b5c2baf5a93b97960d05d5a84c4480a8bec3ae6d2e2b3ba":"query GetBindingPolicyTiny ($id: ID!) {\n\tbindingPolicy(id: $id) {\n\t\tid\n\t}\n}\n","sha256:375a7c2c38b8646e8df33e517981225183365bcadcc689195c122f3d4ab5864c":"mutation UpdateGlobalServiceDeployment ($id: ID!, $attributes: GlobalServiceAttributes!) {\n\tupdateGlobalService(id: $id, attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:376451d410f05aa32972a4ecfe1e4e9efab9bcd12428dfcee693eacfbe653ae9":"mutation CreateServiceDeploymentWithHandle ($cluster: String!, $attributes: ServiceDeploymentAttributes!) {\n\tcreateServiceDeployment(cluster: $cluster, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:37a8038a21b33330a0321ceaa792807a8a959323c31d52b87f71cd557f5e8529":"query MyCluster {\n\tmyCluster {\n\t\t... {\n\t\t\tid\n\t\t\tname\n\t\t\tdistro\n\t\t\tsupportedAddons\n\t\t\trestore {\n\t\t\t\t... ClusterRestoreFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:383f1a8e3b789b58df1c1b5e1de4ada6be3b0ef5e3cd24f6a79109ff2a6ef6ec":"mutation DeleteAccessToken ($token: String!) {\n\tdeleteAccessToken(token: $token) {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:38cf2b80e79145a83cf653ef5dd530c09492427bbc5c2f2b2b00a99f63081a6d":"mutation DeleteServiceDeployment ($id: ID!) {\n\tdeleteServiceDeployment(id: $id) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:39189795df275ba5770b0f0fdc2167fef15a2ef105f13bb69b95d1e3d75ef749":"mutation UpsertVirtualCluster ($parentID: ID!, $attributes: ClusterAttributes!) {\n\tupsertVirtualCluster(parentId: $parentID, attributes: $attributes) {\n\t\tdeployToken\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:395be562633ea07aa14a2848d97c2662d5a27f2bc3b0306ff8fb328b80c35562":"query ListObservabilityProviders ($after: String, $first: Int, $before: String, $last: Int) {\n\tobservabilityProviders(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ObservabilityProviderFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:3a5b26fabfbcb1813210e97107878f8cf880da4efec00b5d807733890b99c663":"mutation UpdateDeploymentSettings ($attributes: DeploymentSettingsAttributes!) {\n\tupdateDeploymentSettings(attributes: $attributes) {\n\t\t... DeploymentSettingsFragment\n\t}\n}\nfragment DeploymentSettingsFragment on DeploymentSettings {\n\tid\n\tname\n\tagentHelmValues\n\tagentHelmValuesTemplateable\n\tagentVsn\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tartifactRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tdeployerRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tai {\n\t\t... AISettingsFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment AISettingsFragment on AiSettings {\n\tenabled\n\tprovider\n\topenai {\n\t\tmodel\n\t}\n\tanthropic {\n\t\tmodel\n\t}\n}\n","sha256:3c3311c918109c032947b1352a1b4229f13ac85fc9e6ae86c4feda508041cde9":"mutation CreateAgentRunUpload ($runId: ID!, $session: Upload, $screenRecording: Upload, $patch: Upload) {\n\tcreateAgentRunUpload(runId: $runId, attributes: {session:$session,screenRecording:$screenRecording,patch:$patch}) {\n\t\t... AgentRunUploadFragment\n\t}\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:3c447e070c14ecaac431c794c559ba5fa606bc15df98c00bcc81e24809315a4f":"mutation DeleteCustomStackRun ($id: ID!) {\n\tdeleteCustomStackRun(id: $id) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:3cbfaefd04ec40ea1887c27ae44dbbfd5bb148938afe070745b9f35951a4b791":"mutation UpsertCloudConnection ($attributes: CloudConnectionAttributes!) {\n\tupsertCloudConnection(attributes: $attributes) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:3d79eb2a713ca289a10f7515c20da885c422f3c2220a76d6d505e681d8021237":"mutation CreateGitRepository ($attributes: GitAttributes!) {\n\tcreateGitRepository(attributes: $attributes) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:3e27a6a17cfbb6f6db0ee7472736f01ea3fc36b07c7654011e2f40c4f5405e75":"query GetSentinelTiny ($id: ID!) {\n\tsentinel(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:3f077b2e9c8019b17de56676404222eb2dceb3f3cb76f6f40bccf9086217553b":"query GetDeploymentSettings {\n\tdeploymentSettings {\n\t\t... DeploymentSettingsFragment\n\t}\n}\nfragment DeploymentSettingsFragment on DeploymentSettings {\n\tid\n\tname\n\tagentHelmValues\n\tagentHelmValuesTemplateable\n\tagentVsn\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tartifactRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tdeployerRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tai {\n\t\t... AISettingsFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment AISettingsFragment on AiSettings {\n\tenabled\n\tprovider\n\topenai {\n\t\tmodel\n\t}\n\tanthropic {\n\t\tmodel\n\t}\n}\n","sha256:4098e8f5d7c1242768a4330163d671ffefb47a68245a8035f1347543f7c4254d":"mutation UpdateBindingPolicy ($id: ID!, $attributes: BindingPolicyUpdateAttributes!) {\n\tupdateBindingPolicy(id: $id, attributes: $attributes) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:41e4f03ed32b05e32866db167f922d8092eef5aad38075b2245827da5d9ad23c":"query GetCatalogTiny ($id: ID, $name: String) {\n\tcatalog(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:42bc0bd98144dabaac9fef4c5455c391a5deb4b9a594273884aa88c59778dd9e":"query GetComplianceReportGenerator ($id: ID, $name: String) {\n\tcomplianceReportGenerator(id: $id, name: $name) {\n\t\t... ComplianceReportGeneratorFragment\n\t}\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4356bc0c1808c4f31a7a47247affbdc702e039c898d4fa26a650774b3c9f8338":"query GetAgentRunTodos ($id: ID!) {\n\tagentRun(id: $id) {\n\t\ttodos {\n\t\t\t... AgentTodoFragment\n\t\t}\n\t}\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\n","sha256:45568860a37d05e3d18ecb976ee1f222aed9a5e7a9c0fa7150c1251c9ef61fae":"mutation UpdateGlobalService ($id: ID!, $attributes: GlobalServiceAttributes!) {\n\tupdateGlobalService(id: $id, attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:45b1488b1732a010d79649d4a39feb42ce81a6842f62fa9f9c801df10136e3f8":"mutation UpsertObservabilityProvider ($attributes: ObservabilityProviderAttributes!) {\n\tupsertObservabilityProvider(attributes: $attributes) {\n\t\t... ObservabilityProviderFragment\n\t}\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:45c1ed4b2d99d030559403440ac39f886badb154fcfd4f10e301ea0a056ab824":"query GetPipelineContext ($id: ID!) {\n\tpipelineContext(id: $id) {\n\t\t... PipelineContextFragment\n\t}\n}\nfragment PipelineContextFragment on PipelineContext {\n\tid\n\tcontext\n}\n","sha256:46566d1616e7e91db2d6216bad8fe25d3985df875d9c85d06ecc1d6a9ff761d4":"mutation UpsertNotificationRouter ($attributes: NotificationRouterAttributes!) {\n\tupsertNotificationRouter(attributes: $attributes) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4664a72f360d14d57f6c374965d8d12a4795cbca5c8af739d02349214a90e3c5":"query GetScmWebhook ($id: ID, $externalId: String) {\n\tscmWebhook(id: $id, externalId: $externalId) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:4694b939a2c331cca99be014be0d45dd8756b9cfc8a2f7fed2fb0b2ae2b2b176":"query Me {\n\tme {\n\t\tid\n\t\temail\n\t\tname\n\t}\n}\n","sha256:46c0244b8b182a0be59a3619a9147a3686d4894a5403b47f4758ec7456437bbd":"query GetClusterIsoImage ($id: ID, $image: String) {\n\tclusterIsoImage(id: $id, image: $image) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:4700694be9716b23c92b557c584739bdc4f7a86d0106842f5ade8d21da402adb":"mutation EnqueueWorkbenchPrFollowup ($url: String!, $attributes: QueuedPromptAttributes!) {\n\tenqueueWorkbenchPrFollowup(url: $url, attributes: $attributes) {\n\t\t... QueuedPromptFragment\n\t\tworkbenchJob {\n\t\t\tid\n\t\t\turl\n\t\t}\n\t}\n}\nfragment QueuedPromptFragment on QueuedPrompt {\n\tid\n\tprompt\n\tdequeableAt\n\tworkbenchJob {\n\t\tid\n\t}\n\tuser {\n\t\tid\n\t}\n}\n","sha256:47dc4b6bd1139a41dc445fb76faeb339207d650f0b1b9b6991e56dbc37777de6":"query GetClusterByHandle ($handle: String) {\n\tcluster(handle: $handle) {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4889a49b7bc53288977c1d827c7e540ef407641fd1b37faf467ad3aa1fae20eb":"query ListInfrastructureStacks ($after: String, $first: Int, $before: String, $last: Int) {\n\tinfrastructureStacks(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... InfrastructureStackEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment InfrastructureStackEdgeFragment on InfrastructureStackEdge {\n\tnode {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:4a0f99c5c1ed02f2c004bf4676a192e75731634bfe4e37218dd6a34a1c95b326":"query ServiceAccounts ($after: String, $first: Int, $before: String, $last: Int, $q: String) {\n\tserviceAccounts(after: $after, first: $first, before: $before, last: $last, q: $q) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... UserFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4bb4613ac3d087f679e786b1d6a491b02d4333ca215fbdfc7233b43ab02d9f66":"query GetStackRunMinimal ($id: ID!) {\n\tstackRun(id: $id) {\n\t\t... StackRunMinimalFragment\n\t}\n}\nfragment StackRunMinimalFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\n","sha256:4bc390a223f5151c820474b4ec055094ecbbc7fb3894f9f48baa6b612ce62161":"query GetAgentRuntime ($id: ID!) {\n\tagentRuntime(id: $id) {\n\t\t... AgentRuntimeFragment\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4beb4e8b7b5844428fa204b98d19c00119ab761ba14a33d1e40e1cdebdc2365a":"mutation UpdateStackRun ($id: ID!, $attributes: StackRunAttributes!) {\n\tupdateStackRun(id: $id, attributes: $attributes) {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:4cb5452060ebdbaa1e8effa76d240b91af5cfe5e2fcc8780fa6607c298fa725d":"mutation WorkbenchPrFollowup ($url: String!, $attributes: WorkbenchMessageAttributes!) {\n\tworkbenchPrFollowup(url: $url, attributes: $attributes) {\n\t\tid\n\t\tprompt\n\t\ttype\n\t\tstatus\n\t}\n}\n","sha256:4ccc84b66170761dbc355854fbe36f2ad7914720d9026128e860a2ca679caa4b":"mutation AddStackRunLogs ($id: ID!, $attributes: RunLogAttributes!) {\n\taddRunLogs(stepId: $id, attributes: $attributes) {\n\t\tupdatedAt\n\t}\n}\n","sha256:4d391c1b966bca6a1f7392320cb12a42bb9d76c0ea06b9aee89eba25db04b08b":"mutation CreateScmWebhook ($connectionId: ID!, $owner: String!) {\n\tcreateScmWebhook(connectionId: $connectionId, owner: $owner) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:4e817a16d60e0674f5530ba1e1249840f369e23853ca214d13863f299b8f7d0e":"query GetNotificationSink ($id: ID!) {\n\tnotificationSink(id: $id) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4e9ae0595f3f41aeefd121080484f583351451a9ed9c4a2ac21d24b375d5ae8e":"mutation UpsertComplianceReportGenerator ($attributes: ComplianceReportGeneratorAttributes!) {\n\tupsertComplianceReportGenerator(attributes: $attributes) {\n\t\t... ComplianceReportGeneratorFragment\n\t}\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:50da97f82323246c4aec944e818a055833aabfcf3e4be9d67e061fe7776ae0df":"mutation UpdateServiceDeploymentWithHandle ($cluster: String!, $name: String!, $attributes: ServiceUpdateAttributes!) {\n\tupdateServiceDeployment(cluster: $cluster, name: $name, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:527aebd2d9c8f2c1e9f845c3ab24baf3fdd536ce86a0206e14ec3b05132b3913":"mutation CreateAgentMessage ($runId: ID!, $attributes: AgentMessageAttributes!) {\n\tcreateAgentMessage(runId: $runId, attributes: $attributes) {\n\t\tid\n\t\tmessage\n\t}\n}\n","sha256:54910ed76d4c42ee7339454901466a271af34936ab345c88fb03ee4bdb763a3a":"query ListClustersWithParameters ($after: String, $first: Int, $before: String, $last: Int, $projectId: ID, $tagQuery: TagQuery) {\n\tclusters(after: $after, first: $first, before: $before, last: $last, projectId: $projectId, tagQuery: $tagQuery) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ClusterEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ClusterEdgeFragment on ClusterEdge {\n\tnode {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:54f9977d5571d11d430f63e03d6208e3a305b0e2bc32a06a1ebbebf6b4522fa3":"mutation DeletePreviewEnvironmentTemplate ($id: ID!) {\n\tdeletePreviewEnvironmentTemplate(id: $id) {\n\t\tid\n\t}\n}\n","sha256:5525b1c9bf332e1fc609b70c671ecb9ba088933b87b249f40fa1827d7db494f9":"mutation CreateClusterIsoImage ($attributes: ClusterIsoImageAttributes!) {\n\tcreateClusterIsoImage(attributes: $attributes) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:556a981320a385d7d9776830051cbf6d2127e4e538b57d3d28d1473aad5dfd33":"mutation DeleteOIDCProvider ($id: ID!, $type: OidcProviderType!) {\n\tdeleteOidcProvider(id: $id, type: $type) {\n\t\t... OIDCProviderFragment\n\t}\n}\nfragment OIDCProviderFragment on OidcProvider {\n\tid\n\tname\n\tdescription\n\tclientId\n\tclientSecret\n\tauthMethod\n\tredirectUris\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:56607343e0225629d380152b80a6aeaa8d46a2a306400b6c3f4e396595d33c33":"mutation CreateNamespace ($attributes: ManagedNamespaceAttributes!) {\n\tcreateManagedNamespace(attributes: $attributes) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:573648a4bd455ab3047a5627bd4188286785ec9d36d9a4a69d525c9999a7ead4":"mutation DeleteFederatedCredential ($id: ID!) {\n\tdeleteFederatedCredential(id: $id) {\n\t\tid\n\t}\n}\n","sha256:57790a6caa298edfdbc1f311bcb963189e1b8a519753c8029225bbc6a9d497ef":"query GetPolicy ($id: ID, $name: String) {\n\tpolicy(id: $id, name: $name) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:580fca816c2a2b2d59eb97ad4f2569218ef0685d0e724a2e0e5de4230db5aa93":"query ListGitRepositories ($cursor: String, $before: String, $last: Int) {\n\tgitRepositories(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\t... GitRepositoryEdgeFragment\n\t\t}\n\t}\n}\nfragment GitRepositoryEdgeFragment on GitRepositoryEdge {\n\tnode {\n\t\t... GitRepositoryFragment\n\t}\n\tcursor\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:5893cd09a5fbd29b0b6ce255f5e5d50e08ff164d1da91525a124b44619b58d59":"mutation CreateWorkbenchPrompt ($workbenchId: ID!, $attributes: WorkbenchPromptAttributes!) {\n\tcreateWorkbenchPrompt(workbenchId: $workbenchId, attributes: $attributes) {\n\t\tid\n\t}\n}\n","sha256:58ea9b0116be68d9f4da2ac8110d93fde21e86df23bb1ef89b982e5a16aa11ed":"mutation UpdateClusterIsoImage ($id: ID!, $attributes: ClusterIsoImageAttributes!) {\n\tupdateClusterIsoImage(id: $id, attributes: $attributes) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:594c9c271560981bef35235a0b0e29463631416f6dbf2aab24d2efb5f5395ba7":"query GetBindingPolicy ($id: ID!) {\n\tbindingPolicy(id: $id) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:594cb032bccdf14d2cae9ade9f52b20d4b56e9ab6630e299927ee9d2c9801fa5":"mutation CreateWorkbenchCron ($workbenchId: ID!, $attributes: WorkbenchCronAttributes!) {\n\tcreateWorkbenchCron(workbenchId: $workbenchId, attributes: $attributes) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:5abc2071d4557f9edd21dfc6472a9473d4b1b267eb0c3e3b8437ee1eca0e91cb":"mutation ShareSecret ($attributes: SharedSecretAttributes!) {\n\tshareSecret(attributes: $attributes) {\n\t\tname\n\t\thandle\n\t\tsecret\n\t\tinsertedAt\n\t\tupdatedAt\n\t}\n}\n","sha256:5b27782cd5302beb56aec90bd5e986f67aea75a37582b480e0860ac9242293a0":"query GetIssueWebhook ($id: ID, $name: String) {\n\tissueWebhook(id: $id, name: $name) {\n\t\t... IssueWebhookFragment\n\t}\n}\nfragment IssueWebhookFragment on IssueWebhook {\n\tid\n\tname\n\tprovider\n}\n","sha256:5baa034c528aa2f193811366642087e0b6c75c88fe1a8c5c22bc06ee75d02427":"mutation DeleteServiceContext ($id: ID!) {\n\tdeleteServiceContext(id: $id) {\n\t\t... ServiceContextFragment\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:5e4949060ce8bce3c89357a76aa82dcd88350b1965a30113a6eeeda2c424aa8d":"query ListNotificationSinks ($after: String, $first: Int, $before: String, $last: Int) {\n\tnotificationSinks(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... NotificationSinkEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment NotificationSinkEdgeFragment on NotificationSinkEdge {\n\tcursor\n\tnode {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:5e544cd179164a2409b455e448b0eed324f40742a26522fb344a1e997d2a3c80":"mutation DeleteObservabilityWebhook ($id: ID!) {\n\tdeleteObservabilityWebhook(id: $id) {\n\t\t... ObservabilityWebhookFragment\n\t}\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:5e94440e7b15f517f56955063550fd90e284a59c002e9121b8df3a45660c99fc":"query GetHelmRepository ($url: String!) {\n\thelmRepository(url: $url) {\n\t\t... HelmRepositoryFragment\n\t}\n}\nfragment HelmRepositoryFragment on HelmRepository {\n\tid\n\tinsertedAt\n\tupdatedAt\n\turl\n\tprovider\n\thealth\n}\n","sha256:5ecaf5a68c146c589c3f685bd48ede65c4968216e0372b5936740118f2092211":"query GetWorkbench ($id: ID, $name: String) {\n\tworkbench(id: $id, name: $name) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:5f21204c5bd4b167f535c75bbf9e260687339ea359232dce1ff84ff01bb4db0b":"query GetAgentRun ($id: ID!) {\n\tagentRun(id: $id) {\n\t\t... AgentRunFragment\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:60bb829fc0d5411b67d8e260b204b0c3118d75c022ffd368f18f7f9edc85bc5f":"query GetClusterProvider ($id: ID!) {\n\tclusterProvider(id: $id) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:60de6586577e9cb81f7c41bcf3482947a47f5da53ca1e658ea5a5764d6343aac":"mutation CreateScmWebhookPointer ($attributes: ScmWebhookAttributes!) {\n\tcreateScmWebhookPointer(attributes: $attributes) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:60e59d1ffe598a7b92e95d4feeeec19a2f2a092b1df881228829acc658b7f1e7":"query ListAgentRuntimePendingRuns ($id: ID!, $after: String, $first: Int, $before: String, $last: Int) {\n\tagentRuntime(id: $id) {\n\t\tpendingRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\t\tedges {\n\t\t\t\tnode {\n\t\t\t\t\t... AgentRunFragment\n\t\t\t\t}\n\t\t\t}\n\t\t\tpageInfo {\n\t\t\t\t... PageInfoFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:633dba4e06a7c190478b1c6d65302b9715ecbe84bc5f5bf1534286fc064c39fe":"query GetStackRunBase ($id: ID!) {\n\tstackRun(id: $id) {\n\t\t... StackRunBaseFragment\n\t}\n}\nfragment StackRunBaseFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:6374f2075fc651ba96385d190f73e93a949d38a302c3a520b9aa7b48e14986d2":"mutation DeleteClusterRegistration ($id: ID!) {\n\tdeleteClusterRegistration(id: $id) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:653bd2dca1e546786b5564738f50ef09c21243d55f0a8ff6af6613af43a6839d":"query ListClusterSentinelRunJobs ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterSentinelRunJobs(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... SentinelRunJobFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment SentinelRunJobFragment on SentinelRunJob {\n\tid\n\tcheck\n\tstatus\n\tformat\n\tusesGit\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\treference {\n\t\tname\n\t\tnamespace\n\t}\n\tsentinelRun {\n\t\t... SentinelRunFragment\n\t}\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tdistro\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:663074674ca5e1837c9a836c9ca87d011e3b82c7aee97c307816f923807f1403":"mutation CancelAgentRun ($id: ID!) {\n\tcancelAgentRun(id: $id) {\n\t\tid\n\t}\n}\n","sha256:672a471c01d8cea255bc474ee2c2b4b0bf19071e5c4cac93dd3d60de6af33c3a":"query ListBindingPolicies ($after: String, $first: Int, $before: String, $last: Int) {\n\tbindingPolicies(after: $after, first: $first, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... BindingPolicyFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:676c685a9306b2973a2921f6f0158ec0e4785aced9987122ea6ef490c93ecfb4":"mutation UpdateWorkbenchCron ($id: ID!, $attributes: WorkbenchCronAttributes!) {\n\tupdateWorkbenchCron(id: $id, attributes: $attributes) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:68d98b7ac666f84eeb85897ef3519a78ecf00304af9b78e9ae3b4c25532a4982":"mutation DeleteStackDefinition ($id: ID!) {\n\tdeleteStackDefinition(id: $id) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:68fac5688e28798e6adbf158c70679ee2e327893121a12db46a02362ac47b68c":"mutation UpdateUser ($id: ID, $attributes: UserAttributes!) {\n\tupdateUser(id: $id, attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:6b93ab2a338d28d179dfcf1e7cf182ea307a540af36d2860b97747f764bf2560":"mutation DeleteWorkbench ($id: ID!) {\n\tdeleteWorkbench(id: $id) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:6c6860b13a9d0aaacfd7eb47b2c1a993768f0389f5fbe197efa64971d2e232df":"query ListHelmRepositories ($after: String, $first: Int, $before: String, $last: Int) {\n\thelmRepositories(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... HelmRepositoryFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment HelmRepositoryFragment on HelmRepository {\n\tid\n\tinsertedAt\n\tupdatedAt\n\turl\n\tprovider\n\thealth\n}\n","sha256:6cfac09e011997d8e43d520ffb21c7f2742981c3a59ba78e9274cfc750f3a991":"query ListScmWebhooks ($after: String, $before: String, $first: Int, $last: Int) {\n\tscmWebhooks(after: $after, before: $before, first: $first, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ScmWebhookFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:6fb3a6d7b695c4168b976dedfcf9a53c6ab7783770a26d4f25fa705153dae6f0":"mutation RegisterRuntimeServices ($services: [RuntimeServiceAttributes], $layout: OperationalLayoutAttributes, $deprecated: [DeprecatedCustomResourceAttributes], $serviceId: ID) {\n\tregisterRuntimeServices(services: $services, layout: $layout, deprecated: $deprecated, serviceId: $serviceId)\n}\n","sha256:6fcb5448dc8bc96c565dab0bf002bb9bcb82ad8785717de59ad14a80e4d4e178":"query GetScmConnectionByName ($name: String!) {\n\tscmConnection(name: $name) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:6fe58e154caaddb59485ac72d26e0ffee5fb864c6e1a45b31b90082830872995":"mutation DetachServiceDeployment ($id: ID!) {\n\tdetachServiceDeployment(id: $id) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:6fec0d284e2f2884e65a4de72ee9ed2673b92adfc0b19e73d970364aa3410d79":"mutation CreateCluster ($attributes: ClusterAttributes!) {\n\tcreateCluster(attributes: $attributes) {\n\t\tdeployToken\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:7022709816c360b28f659e86985f545a415f48e96b2f30ef866ea3ae97f39fa9":"query GetClusterBackup ($id: ID, $clusterId: ID, $namespace: String, $name: String) {\n\tclusterBackup(id: $id, clusterId: $clusterId, namespace: $namespace, name: $name) {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:705e50fb64758842c60cce987d7ab0eb08cf21df44eaf506ee141324260481bb":"query GetAgentRunMinimal ($id: ID!) {\n\tagentRun(id: $id) {\n\t\t... AgentRunMinimalFragment\n\t}\n}\nfragment AgentRunMinimalFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\truntime {\n\t\ttype\n\t}\n\tpullRequests {\n\t\tid\n\t\tstatus\n\t\turl\n\t\ttitle\n\t\tref\n\t}\n\tupload {\n\t\tsession\n\t\tpatch\n\t\tscreenRecording\n\t}\n}\n","sha256:70dd24813b99b33f0bd76a916a653bd40aefb7b4d1f950c1c6cfb349f5e064c7":"mutation DeleteCatalog ($id: ID!) {\n\tdeleteCatalog(id: $id) {\n\t\t... CatalogFragment\n\t}\n}\nfragment CatalogFragment on Catalog {\n\tid\n\tname\n\tdescription\n\tcategory\n\tauthor\n\tproject {\n\t\t... ProjectFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:71211688078517de55856c131211f78a9b5f707fc2c3857726fd59a81123b2b9":"query GetWorkbenchToolTiny ($id: ID, $name: String) {\n\tworkbenchTool(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:75340df6d83e5cb03878a6914da84328432f6879320e6083d0cf6fd1ba1e0a35":"mutation RollbackService ($id: ID!, $revisionId: ID!) {\n\trollbackService(id: $id, revisionId: $revisionId) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:782b1bd26714e00f7908991d5ed8af1beee25bbdb038e0885378d17a277b1929":"query GetClusterProviderByCloud ($cloud: String!) {\n\tclusterProvider(cloud: $cloud) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:78dbebdbef637a8412788971739ba9931f0eae3ae63eb7b0d0d75902620521fc":"query GetCustomStackRun ($id: ID!) {\n\tcustomStackRun(id: $id) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:7a35b4446780f4560edd416760772e7f4d9bd8193e64e39d945a0ca57e6d5799":"mutation UpdateAgentMessage ($id: ID!, $attributes: AgentMessageAttributes!) {\n\tupdateAgentMessage(id: $id, attributes: $attributes) {\n\t\tid\n\t\tmessage\n\t}\n}\n","sha256:7a526118f0ec20a508e94f419446156ab87b99bd9ff5700c13cf8612f6e8be8d":"query GetObserver ($id: ID, $name: String) {\n\tobserver(id: $id, name: $name) {\n\t\t... ObserverFragment\n\t}\n}\nfragment ObserverFragment on Observer {\n\tid\n\tname\n\tstatus\n\tcrontab\n\ttarget {\n\t\t... ObserverTargetFragment\n\t}\n\tactions {\n\t\t... ObserverActionFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ObserverTargetFragment on ObserverTarget {\n\thelm {\n\t\t... ObserverHelmRepoFragment\n\t}\n\toci {\n\t\t... ObserverOciRepoFragment\n\t}\n}\nfragment ObserverHelmRepoFragment on ObserverHelmRepo {\n\turl\n\tchart\n\tprovider\n}\nfragment ObserverOciRepoFragment on ObserverOciRepo {\n\turl\n\tprovider\n}\nfragment ObserverActionFragment on ObserverAction {\n\ttype\n\tconfiguration {\n\t\t... ObserverActionConfigurationFragment\n\t}\n}\nfragment ObserverActionConfigurationFragment on ObserverActionConfiguration {\n\tpr {\n\t\t... ObserverPrActionFragment\n\t}\n\tpipeline {\n\t\t... ObserverPipelineActionFragment\n\t}\n}\nfragment ObserverPrActionFragment on ObserverPrAction {\n\tautomationId\n\trepository\n\tbranchTemplate\n\tcontext\n}\nfragment ObserverPipelineActionFragment on ObserverPipelineAction {\n\tpipelineId\n\tcontext\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\n","sha256:7bb99a71a060105e0369bd65dfbef40cfaefd3bf24f3a20be6bba8ebe0f5d151":"query ListPolicies ($after: String, $first: Int, $before: String, $last: Int, $projectId: ID, $q: String) {\n\tpolicies(after: $after, first: $first, before: $before, last: $last, projectId: $projectId, q: $q) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... PolicyFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:7bf259965e095c6f562ceabf64b53c96f2af8c279f8f585ae46150d432e15177":"mutation DeleteAgentRuntime ($id: ID!) {\n\tdeleteAgentRuntime(id: $id) {\n\t\tid\n\t}\n}\n","sha256:7c28e35a508edb6910ec148143db545bf6ceae2d3f89d99dd12108d55cbace2e":"query ListProviders {\n\tclusterProviders(first: 100) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ClusterProviderFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:7d305588dda783d061b91186810d26c83dc96ce88ca6eadd3dc0aeb8e5c2b1e9":"query GetObservabilityWebhook ($id: ID, $name: String) {\n\tobservabilityWebhook(id: $id, name: $name) {\n\t\t... ObservabilityWebhookFragment\n\t}\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:7e2b1754c1a0096773632c812c86d3e0e73c8bd0ff4e4de4e783b3afc545c212":"query GetTinyCluster ($id: ID) {\n\tcluster(id: $id) {\n\t\t... TinyClusterFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:7fc3c4c26cd7f027d90210964398854eebe7e5ce7bb518f4c8839505a4b4fcb3":"mutation AddGroupMember ($groupId: ID!, $userId: ID!) {\n\tcreateGroupMember(groupId: $groupId, userId: $userId) {\n\t\t... GroupMemberFragment\n\t}\n}\nfragment GroupMemberFragment on GroupMember {\n\tid\n\tuser {\n\t\tid\n\t}\n\tgroup {\n\t\tid\n\t}\n}\n","sha256:806453fdd48b0a0eae70fc366b758b34c1fb7290ff39b393794e5181fe7664ae":"query GetGitRepositoryID ($url: String) {\n\tgitRepository(url: $url) {\n\t\t... {\n\t\t\tid\n\t\t}\n\t}\n}\n","sha256:808ebe4bf5034aa84eae9f40e3b4046bd9d0961b9c6c15acc96c29a5c2ba961b":"mutation CreateGlobalService ($attributes: GlobalServiceAttributes!) {\n\tcreateGlobalService(attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:812b636e5bfc0c485832996d9aed1a5826dc9a1d48e1b65ff68774f2c97e89c9":"query ListClusterServices {\n\tclusterServices {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:825ebd6ac166846c04631143991b97b8170a7a9d266ebb1c9331a9976a20d30f":"query GetClusterGates {\n\tclusterGates {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:82a9426820e1787f567e38edbce7759b05900a1ec3721d17f883dd62ebc6642c":"query GetPrAutomation ($id: ID!) {\n\tprAutomation(id: $id) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:836475a72bf4f3ebb0e1fcd945018865862b53cb7616f62ba213c2fd5fe69d05":"query ListViolationStatistics ($field: ConstraintViolationField!) {\n\tviolationStatistics(field: $field) {\n\t\t... ViolationStatisticFragment\n\t}\n}\nfragment ViolationStatisticFragment on ViolationStatistic {\n\tvalue\n\tviolations\n\tcount\n}\n","sha256:83b4333debfd340763ef190910485c333c6dd49d47110057df60be57da770157":"mutation DeleteNotificationRouter ($id: ID!) {\n\tdeleteNotificationRouter(id: $id) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:843362e6b99d63d6a55e850db9f69b9b09f86278c3eb97dca4f720100546283d":"query GetMCPServer ($id: ID!) {\n\tmcpServer(id: $id) {\n\t\t... MCPServerFragment\n\t}\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\n","sha256:846394445eb276768ef88fd02f91df408ff47226252026a4337560cfbda11036":"mutation CreateWorkbenchTool ($attributes: WorkbenchToolAttributes!) {\n\tcreateWorkbenchTool(attributes: $attributes) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:851d296b63f9c0c937e82a454781e76d918b708a27c3e264069902f71eff5d6d":"mutation CreateStack ($attributes: StackAttributes!) {\n\tcreateStack(attributes: $attributes) {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:857bac887a978a2ac4f093331e7384dfb57425924b0a1bd5a09ffa9e04844819":"mutation UpdateOIDCProvider ($id: ID!, $type: OidcProviderType!, $attributes: OidcProviderAttributes!) {\n\tupdateOidcProvider(id: $id, type: $type, attributes: $attributes) {\n\t\t... OIDCProviderFragment\n\t}\n}\nfragment OIDCProviderFragment on OidcProvider {\n\tid\n\tname\n\tdescription\n\tclientId\n\tclientSecret\n\tauthMethod\n\tredirectUris\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:85df9e68d83e11a9f9321348538306287166a75d4ab75ab2b48855e80d8b39d2":"mutation DeleteBootstrapToken ($id: ID!) {\n\tdeleteBootstrapToken(id: $id) {\n\t\tid\n\t}\n}\n","sha256:8670eabfee3682802dbfd5c68f5e72b37119ec31e909f425655206ed9d5a18ec":"mutation UpdateFederatedCredential ($id: ID!, $attributes: FederatedCredentialAttributes!) {\n\tupdateFederatedCredential(id: $id, attributes: $attributes) {\n\t\t... FederatedCredentialFragment\n\t}\n}\nfragment FederatedCredentialFragment on FederatedCredential {\n\tid\n\tclaimsLike\n\tissuer\n\tscopes\n\tinsertedAt\n\tupdatedAt\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n}\n","sha256:86eb778bec88542b242c634b49a9073f61d1a6ea3c569519f7ac3281203bdf6f":"mutation DeleteBindingPolicy ($id: ID!) {\n\tdeleteBindingPolicy(id: $id) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:891cd1d4fbd8a953702cf2564d83f04e8bc76746d689988b9200ec64b2553336":"mutation RunSentinel ($id: ID!, $overrides: SentinelRunOverrides) {\n\trunSentinel(id: $id, overrides: $overrides) {\n\t\t... SentinelRunFragment\n\t}\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:897d62511eba988b849bd933c4ecb4586c6cf041aa66da4bc33967b3304da588":"mutation DeleteProject ($id: ID!) {\n\tdeleteProject(id: $id) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:8c0caea577e1915120cdd7b5231a7f1a58eb0c339d1aaf024f8aa120902a7442":"mutation CreateClusterBackup ($attributes: BackupAttributes!) {\n\tcreateClusterBackup(attributes: $attributes) {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:8c44743ad7a874271ddb162b00027395262b0ac38d0322a4f09afe48f5c442e2":"mutation UpdateAgentRunAnalysis ($id: ID!, $attributes: AgentAnalysisAttributes!) {\n\tupdateAgentRunAnalysis(id: $id, attributes: $attributes) {\n\t\t... AgentRunBaseFragment\n\t}\n}\nfragment AgentRunBaseFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tmode\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\n","sha256:8ca4f731dfc18a56ba661dcbba9c673f55aee501b263dbf655e67788eefec1eb":"query ListClusterMinimalStacks ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterStackRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... MinimalStackRunEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment MinimalStackRunEdgeFragment on StackRunEdge {\n\tnode {\n\t\t... StackRunMinimalFragment\n\t}\n}\nfragment StackRunMinimalFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\n","sha256:8d30669f0383e625d9b639af9cf66ccdb9458850496a8cbf656780348b7c7766":"mutation UpdateWorkbenchWebhook ($id: ID!, $attributes: WorkbenchWebhookAttributes!) {\n\tupdateWorkbenchWebhook(id: $id, attributes: $attributes) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:8d31d95b1fa3ae035864ae7aab5e31a31347f5c3a9654ea25237813800fb2c6c":"query GetSentinel ($id: ID!) {\n\tsentinel(id: $id) {\n\t\t... SentinelFragment\n\t}\n}\nfragment SentinelFragment on Sentinel {\n\tid\n\tname\n\tdescription\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:8e8fd8e272f046273e47c808d99bd0dd91b158e3c23175488c07482dc99b3a2b":"mutation UpsertNotificationSink ($attributes: NotificationSinkAttributes!) {\n\tupsertNotificationSink(attributes: $attributes) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:8f12d8cad53529ad1067b2ad72f6dc4ca662168c0268c3bbc027db8f662ef925":"query GetAgentUrl ($id: ID!) {\n\tcluster(id: $id) {\n\t\tagentUrl\n\t}\n}\n","sha256:8fa6f7a3f1ca23ce9e7d886bb84c023f4be92f923d057ce7bd97e95a41e541a0":"query GetDeploymentSettingsMinimal {\n\tdeploymentSettings {\n\t\t... DeploymentSettingsMinimalFragment\n\t}\n}\nfragment DeploymentSettingsMinimalFragment on DeploymentSettings {\n\tagentHelmValues\n\tagentVsn\n}\n","sha256:901e2e68afb969b6cc521cb1f1f3e0d134e6f0f11b9f24dcb288b95cc2a6e39e":"mutation CreateServiceAccount ($attributes: ServiceAccountAttributes!) {\n\tcreateServiceAccount(attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:90314a4b07d2a45508cf458997cf53a19dd5eb958764462f71e43f062128f3db":"query GetMCPServers ($q: String, $first: Int, $after: String, $before: String, $last: Int) {\n\tmcpServers(q: $q, first: $first, after: $after, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... MCPServerFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\n","sha256:910b361b6f8a5a95c6ddfd9d86bbeba38445e6242537e44f8a71f1294a098d31":"mutation UpsertVulnerabilities ($vulnerabilities: [VulnerabilityReportAttributes]) {\n\tupsertVulnerabilities(vulnerabilities: $vulnerabilities)\n}\n","sha256:91104bc566948580b79bda2fc4bf5cac926cf9bf185468a2e32653a9aaef8292":"mutation UpdateCluster ($id: ID!, $attributes: ClusterUpdateAttributes!) {\n\tupdateCluster(id: $id, attributes: $attributes) {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:9189c9e78cd7eb57a9e67c9b09905683e01f2864e5e49516cac6beeaae44ce28":"query ListObservabilityWebhooks ($after: String, $before: String, $first: Int, $last: Int) {\n\tobservabilityWebhooks(after: $after, before: $before, first: $first, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ObservabilityWebhookFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:921369b1661c3b6001335e7a580e5d3b9e04a2792231cde13dc7b98159790d97":"mutation UpdatePrAutomation ($id: ID!, $attributes: PrAutomationAttributes!) {\n\tupdatePrAutomation(id: $id, attributes: $attributes) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:929cc36181b7f6e09352f8e2776a66a3876c5fdd3ce60ab2637ac4dad4340cc0":"query PagedClusterServicesForAgent ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterServices(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragmentForAgent\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ServiceDeploymentEdgeFragmentForAgent on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentForAgent\n\t}\n}\nfragment ServiceDeploymentForAgent on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\ttarball\n\tdeletedAt\n\tdryRun\n\ttemplated\n\tsha\n\tstatus\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tself\n\t\tversion\n\t\tpingedAt\n\t\tmetadata\n\t\ttags {\n\t\t\t... ClusterTags\n\t\t}\n\t\tcurrentVersion\n\t\tkasUrl\n\t\tdistro\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\thelm {\n\t\trelease\n\t\tvaluesFiles\n\t\tvalues\n\t\tignoreHooks\n\t\tignoreCrds\n\t\tluaScript\n\t\tluaFile\n\t\tluaFolder\n\t\tpythonScript\n\t\tpythonFile\n\t\tpythonFolder\n\t\tkustomizePostrender\n\t}\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tcontexts {\n\t\tname\n\t\tconfiguration\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tdeleteNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\trevision {\n\t\tid\n\t}\n\timports {\n\t\tid\n\t\tstack {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t\toutputs {\n\t\t\tname\n\t\t\tvalue\n\t\t\tsecret\n\t\t}\n\t}\n\trenderers {\n\t\t... RendererFragment\n\t}\n\tdependencies {\n\t\t... ServiceDependencyFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment RendererFragment on Renderer {\n\tpath\n\ttype\n\thelm {\n\t\t... HelmMinimalFragment\n\t}\n}\nfragment HelmMinimalFragment on HelmMinimal {\n\tvalues\n\tvaluesFiles\n\trelease\n\tignoreHooks\n}\nfragment ServiceDependencyFragment on ServiceDependency {\n\tid\n\tname\n}\n","sha256:930b441c217f098b4a06fe5ee2b3413b71ddfeb7a14fd5a3f34e9eb094cf38c7":"query GetNotificationSinkByName ($name: String) {\n\tnotificationSink(name: $name) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:9408ad873dfdbd82d7e41d8dbff8b46185dea3a6f1fa49dec03cd60ebbc1e830":"query GetGroupTiny ($name: String!) {\n\tgroup(name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:945929e80092a3ddfffa063c66ef0f3daaf82409c169e3e7127fafed50a14ab2":"query ListNamespaces ($after: String, $first: Int, $before: String, $last: Int) {\n\tmanagedNamespaces(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ManagedNamespaceEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ManagedNamespaceEdgeFragment on ManagedNamespaceEdge {\n\tcursor\n\tnode {\n\t\t... ManagedNamespaceMinimalFragment\n\t}\n}\nfragment ManagedNamespaceMinimalFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n}\n","sha256:953c6871b8ad6a66454c4be5f93053bbfb913d5da336e4a83e9ba1f702561273":"mutation DeleteUser ($id: ID!) {\n\tdeleteUser(id: $id) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:95f63c044687b9aeb755352caddb8fae1cff74a694a8d44c20c2669e786b4f82":"query ListServiceDeployment ($after: String, $before: String, $last: Int, $clusterId: ID) {\n\tserviceDeployments(after: $after, first: 100, before: $before, last: $last, clusterId: $clusterId) {\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragment\n\t\t}\n\t}\n}\nfragment ServiceDeploymentEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:960457be7108f80ff02c924d123a5a85a8ea8df66a779785b18eb8376f72f525":"mutation DeleteClusterIsoImage ($id: ID!) {\n\tdeleteClusterIsoImage(id: $id) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:96e9ad521bf896ffa2f2b2b584ef7d8216073289a30bdfe8de3ca0e6241057f1":"mutation UpdateWorkbenchPrompt ($id: ID!, $attributes: WorkbenchPromptAttributes!) {\n\tupdateWorkbenchPrompt(id: $id, attributes: $attributes) {\n\t\tid\n\t}\n}\n","sha256:97134516f2bf93fd448744222727bc2d4b9c4778c529fecc1d68766696fc4ad5":"query GetScmConnection ($id: ID!) {\n\tscmConnection(id: $id) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:980afba6c180a980bcf9a8639972cfe0612f6251116bf78b86442ade3cda51c3":"query GetWorkbenchTiny ($id: ID, $name: String) {\n\tworkbench(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:9827fcdc2ff6a39a12b07c9f580189df66b547435d5077b4348d57534c3981f5":"query TokenExchange ($token: String!) {\n\ttokenExchange(token: $token) {\n\t\t... UserFragment\n\t\tgroups {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t\tboundRoles {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:98630448e8dfa27ddc91790290e32ffc4f4ebee749bd1a8f890940c6f637bcb8":"query PagedClusterGateIDs ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterGates(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... PipelineGateIDsEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment PipelineGateIDsEdgeFragment on PipelineGateEdge {\n\tnode {\n\t\t... {\n\t\t\tid\n\t\t}\n\t}\n}\n","sha256:99cf665c8973fc5fbe75bbb8053212dd63bbd38fae367116c111ae69665385fb":"query ListScmConnections ($cursor: String, $before: String, $last: Int) {\n\tscmConnections(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ScmConnectionFragment\n\t\t\t}\n\t\t\tcursor\n\t\t}\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:9a1a0ff9faec767fdd76670f61d6f07e3bfb6f87e38e9f7258337ec4d55ef49c":"query GetServiceDeploymentByHandle ($cluster: String!, $name: String!) {\n\tserviceDeployment(cluster: $cluster, name: $name) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:9c6c086b73a8e8893f47aebd4f4b3fa31e6a323f54e4f49bad3390f41ff55e77":"mutation UpdateProject ($id: ID!, $attributes: ProjectAttributes!) {\n\tupdateProject(id: $id, attributes: $attributes) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:9fb8d63cdb26f2f0c24141600a2e63734c288a3721a76322410265f4f2979d35":"query GetClusterRegistrations ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterRegistrations(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ClusterRegistrationFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:a09067ffa71e8f8b2a7a319ff96f0a79b1e54733cc99029952e2744ebcb93e8d":"mutation CreateGroup ($attributtes: GroupAttributes!) {\n\tcreateGroup(attributes: $attributtes) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:a16b1da2c5e2560270870aa279c534d36db2d0dc8abfb0c21578fc61fc7a6b00":"query ListPrAutomations ($cursor: String, $before: String, $last: Int) {\n\tprAutomations(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... PrAutomationFragment\n\t\t\t}\n\t\t\tcursor\n\t\t}\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:a21b5e44c5251b2393d36641f8e80e67318a9fe5cbd5a5a5010c21ee2deeb985":"mutation DeleteWorkbenchCron ($id: ID!) {\n\tdeleteWorkbenchCron(id: $id) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:a334251e65b8ab49ef2c93cf1b71d07822fb6b8f9201095cd5490fd1deab6e8e":"query ListServiceDeployments ($cursor: String, $before: String, $last: Int) {\n\tserviceDeployments(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ServiceDeploymentFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:a44c40a19e2a6fdec2c6ebc9a7d8d85f004466fc628e568ef27a4973c6e4ae38":"mutation GetWorkbenchCron ($id: ID!) {\n\tworkbenchCron(id: $id) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:a6982b6bb2f74922ef5d6e2368ac42f8a499ad17f16f819a0f64e89b0c20abe0":"mutation DeleteWorkbenchWebhook ($id: ID!) {\n\tdeleteWorkbenchWebhook(id: $id) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:a7c3ab7455fa73c5f0171b092aafbfee2c47186ef1e6053d5ba99e5b264b4b16":"query GetCatalog ($id: ID, $name: String) {\n\tcatalog(id: $id, name: $name) {\n\t\t... CatalogFragment\n\t}\n}\nfragment CatalogFragment on Catalog {\n\tid\n\tname\n\tdescription\n\tcategory\n\tauthor\n\tproject {\n\t\t... ProjectFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:a84f8942424abe644392066d12e351e0835027df1720d80bfa24f202b38a9dfd":"query GetNamespace ($id: ID!) {\n\tmanagedNamespace(id: $id) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:a8ce65444a9c0e953ccc22260b021bf84771782d619f4d9f940867bdaf01d9df":"mutation DeleteStack ($id: ID!) {\n\tdeleteStack(id: $id) {\n\t\t... InfrastructureStackIdFragment\n\t}\n}\nfragment InfrastructureStackIdFragment on InfrastructureStack {\n\tid\n}\n","sha256:a91f084bbbd85931d0e231c6caf2d1280b97dd1f9c7a1fb574192f3710106563":"mutation UpsertHelmRepository ($url: String!, $attributes: HelmRepositoryAttributes) {\n\tupsertHelmRepository(url: $url, attributes: $attributes) {\n\t\t... HelmRepositoryFragment\n\t}\n}\nfragment HelmRepositoryFragment on HelmRepository {\n\tid\n\tinsertedAt\n\tupdatedAt\n\turl\n\tprovider\n\thealth\n}\n","sha256:a929072c59cbb7e762fec990adb41cf6cf80c06d00bbd0caa372f6bd4661b053":"query GetClusterWithToken ($id: ID, $handle: String) {\n\tcluster(id: $id, handle: $handle) {\n\t\t... ClusterFragment\n\t\tdeployToken\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:a9481fbef0ee5faac5f98ff86f1fcc351aef26a41e52daf22428135a715824b1":"query PagedClusterGates ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterGates(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... PipelineGateEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment PipelineGateEdgeFragment on PipelineGateEdge {\n\tnode {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:aa077f5ef1fd98bb3909a063b4f4f6d722ee4355e2006aa48a80a5a3f34a988d":"mutation DeleteScmConnection ($id: ID!) {\n\tdeleteScmConnection(id: $id) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:aa987069b6edaf93d75eb44ab52356a7374b4ea4669b503729dc5209e4ba85e2":"query GetServiceDeploymentComponents ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\tid\n\t\tcomponents {\n\t\t\tkind\n\t\t\tstate\n\t\t}\n\t}\n}\n","sha256:abd3ae6e1fb895e3c792f77c5ec324b372ffc85abb94f26772455a98f547ef0a":"mutation UpdateScmConnection ($id: ID!, $attributes: ScmConnectionAttributes!) {\n\tupdateScmConnection(id: $id, attributes: $attributes) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:acdaf678c528e8bf7724301610dd4dd6304314c59d436e8e5452073068a143fc":"mutation DeleteGlobalService ($id: ID!) {\n\tdeleteGlobalService(id: $id) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:ad10097393ee33916a9be2804e6c786bb8f42679e64049dcf17eb8dd2cf79ef1":"query PagedClusterServiceIds ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterServices(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ServiceDeploymentIdEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ServiceDeploymentIdEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentIdFragment\n\t}\n}\nfragment ServiceDeploymentIdFragment on ServiceDeployment {\n\tid\n}\n","sha256:adee195af481a8e2bdd38909764b70bbb0011f77789ef14872c4e5a8fb6e5919":"mutation UpdateAgentRun ($id: ID!, $attributes: AgentRunStatusAttributes!) {\n\tupdateAgentRun(id: $id, attributes: $attributes) {\n\t\t... AgentRunFragment\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:af037c14ab732c3150f56513fcdbf6187c36457b52c13b05928e9dea542d3f97":"query GetProject ($id: ID, $name: String) {\n\tproject(id: $id, name: $name) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b0c7d62eece94e065f18516cf7006281428f4ff44ecd903fb3fbcf334d99deac":"mutation CreateQueuedPrompt ($jobId: ID!, $attributes: QueuedPromptAttributes!) {\n\tcreateQueuedPrompt(jobId: $jobId, attributes: $attributes) {\n\t\t... QueuedPromptFragment\n\t}\n}\nfragment QueuedPromptFragment on QueuedPrompt {\n\tid\n\tprompt\n\tdequeableAt\n\tworkbenchJob {\n\t\tid\n\t}\n\tuser {\n\t\tid\n\t}\n}\n","sha256:b220576f4e2238111c178658b7e3e11c7a2fc482e1d1145c94aab213f2595242":"mutation DeleteGroupMember ($userId: ID!, $groupId: ID!) {\n\tdeleteGroupMember(userId: $userId, groupId: $groupId) {\n\t\t... GroupMemberFragment\n\t}\n}\nfragment GroupMemberFragment on GroupMember {\n\tid\n\tuser {\n\t\tid\n\t}\n\tgroup {\n\t\tid\n\t}\n}\n","sha256:b3c5a853563920b74b4e2d1687e851e198d53c61d2d42df5642261d732841cc6":"mutation DeletePolicy ($id: ID!) {\n\tdeletePolicy(id: $id) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:b48053dac3c5ecd9ab8e99a7f29f52b25c13f7f191203637fb43f1833a30d335":"query ListServiceDeploymentByHandle ($after: String, $before: String, $last: Int, $cluster: String) {\n\tserviceDeployments(after: $after, first: 100, before: $before, last: $last, cluster: $cluster) {\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragment\n\t\t}\n\t}\n}\nfragment ServiceDeploymentEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:b5aade690f9187a9eb7b67156c989946e1f652356238ffb859cf67c002dd5b20":"query GetServiceDeploymentForAgent ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\t... ServiceDeploymentForAgent\n\t}\n}\nfragment ServiceDeploymentForAgent on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\ttarball\n\tdeletedAt\n\tdryRun\n\ttemplated\n\tsha\n\tstatus\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tself\n\t\tversion\n\t\tpingedAt\n\t\tmetadata\n\t\ttags {\n\t\t\t... ClusterTags\n\t\t}\n\t\tcurrentVersion\n\t\tkasUrl\n\t\tdistro\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\thelm {\n\t\trelease\n\t\tvaluesFiles\n\t\tvalues\n\t\tignoreHooks\n\t\tignoreCrds\n\t\tluaScript\n\t\tluaFile\n\t\tluaFolder\n\t\tpythonScript\n\t\tpythonFile\n\t\tpythonFolder\n\t\tkustomizePostrender\n\t}\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tcontexts {\n\t\tname\n\t\tconfiguration\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tdeleteNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\trevision {\n\t\tid\n\t}\n\timports {\n\t\tid\n\t\tstack {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t\toutputs {\n\t\t\tname\n\t\t\tvalue\n\t\t\tsecret\n\t\t}\n\t}\n\trenderers {\n\t\t... RendererFragment\n\t}\n\tdependencies {\n\t\t... ServiceDependencyFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment RendererFragment on Renderer {\n\tpath\n\ttype\n\thelm {\n\t\t... HelmMinimalFragment\n\t}\n}\nfragment HelmMinimalFragment on HelmMinimal {\n\tvalues\n\tvaluesFiles\n\trelease\n\tignoreHooks\n}\nfragment ServiceDependencyFragment on ServiceDependency {\n\tid\n\tname\n}\n","sha256:b615046b5d5e730296e98a13ca59bf1b4009e2ef018ebd96c16dbff4d2252a20":"query GetWorkbenchTool ($id: ID, $name: String) {\n\tworkbenchTool(id: $id, name: $name) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b6344198b643d2b030241e4ba06a7a808511584a5ddc52dabbbcc1b896c989ff":"mutation CloneServiceDeploymentWithHandle ($clusterId: ID!, $cluster: String!, $name: String!, $attributes: ServiceCloneAttributes!) {\n\tcloneService(clusterId: $clusterId, cluster: $cluster, name: $name, attributes: $attributes) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:b640b4ec159932cdb9519e0edba90585ba6552f8637f5a3136ecca8c7c4b33c5":"query ListClusters ($cursor: String, $before: String, $last: Int) {\n\tclusters(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\t... ClusterEdgeFragment\n\t\t}\n\t}\n}\nfragment ClusterEdgeFragment on ClusterEdge {\n\tnode {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b6bb1e90c1b8586144c0060e4b38c1d76124d80c3d4ae2d7b1f6ada4251afedf":"mutation UpdateServiceDeployment ($id: ID!, $attributes: ServiceUpdateAttributes!) {\n\tupdateServiceDeployment(id: $id, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:b77c4291ae27a7349ae24c8c3963ce23ff5daed32c51eb1275dbccd1df6fcbe1":"query GetObservabilityProvider ($id: ID, $name: String) {\n\tobservabilityProvider(id: $id, name: $name) {\n\t\t... ObservabilityProviderFragment\n\t}\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:b80a7faf4eee40b6c3823963dcf3614aa12035c3da6b317cb8208ccc4f6ac8b7":"query GetPrAutomationByName ($name: String!) {\n\tprAutomation(name: $name) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:b83ec626d13be86492db9fd86946d48b92e7e29239c0ff5600ac0e6006109e5c":"mutation CreateProviderCredential ($attributes: ProviderCredentialAttributes!, $name: String!) {\n\tcreateProviderCredential(attributes: $attributes, name: $name) {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:b87afc4a88b126bb018cbdee0a2d9f5c3552d1a2d9b032cdd1875023c2680da4":"mutation DeleteComplianceReportGenerator ($id: ID!) {\n\tdeleteComplianceReportGenerator(id: $id) {\n\t\t... ComplianceReportGeneratorFragment\n\t}\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b88dad5dbf1911bf14fc349f8f14568b3cea7b12079ba4f50b80360a8a05d063":"mutation CreateGlobalServiceDeployment ($serviceId: ID!, $attributes: GlobalServiceAttributes!) {\n\tcreateGlobalService(serviceId: $serviceId, attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:b92d34e46bb45d51af62431f19f46a643594ab8d2ace6ee0cdd7d2f9076c4116":"mutation UpsertPolicyConstraints ($constraints: [PolicyConstraintAttributes!]) {\n\tupsertPolicyConstraints(constraints: $constraints)\n}\n","sha256:b93ae4d17a11b60381e132d78df0ec8d9431bbf834517cc47ab74f83c7ef87aa":"mutation CreateServiceAccountToken ($id: ID!, $scopes: [ScopeAttributes], $expiry: String) {\n\tcreateServiceAccountToken(id: $id, scopes: $scopes, expiry: $expiry) {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:b97ad5c22e824cb03ea1120d22df72eb1a45c6e18b82b399000786edf1fb6635":"mutation DeleteSentinel ($id: ID!) {\n\tdeleteSentinel(id: $id) {\n\t\tid\n\t}\n}\n","sha256:babd1fcf26e7e8d1243a3f92bb3135de93cd73b0bb5d4e28e40bd650bcbdfd1d":"query GetWorkbenchPrompt ($id: ID!) {\n\tworkbenchPrompt(id: $id) {\n\t\t... WorkbenchPromptFragment\n\t}\n}\nfragment WorkbenchPromptFragment on WorkbenchPrompt {\n\tid\n\ttitle\n\tcategory\n\tprompt\n}\n","sha256:bb41a2b83ff40ea0e043a1edace47470f4c97a1b20b95d0c8b862e85ce5ad54f":"query GetUser ($email: String!) {\n\tuser(email: $email) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:bcaa00aae81a591bfbc55c97d7d7fab286def9d56608d84929c4e948dbea70da":"mutation CreateClusterRegistration ($attributes: ClusterRegistrationCreateAttributes!) {\n\tcreateClusterRegistration(attributes: $attributes) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:bcc887913f98c41acf007562df28e5875b1aaba723fd60ce3718ce59f78c46c2":"mutation DeletePersona ($id: ID!) {\n\tdeletePersona(id: $id) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:be6f160416467f5e1c4f5f50a1549a66bbc8069b3b54836348e3be3507cdc897":"query GetPrGovernance ($id: ID, $name: String) {\n\tprGovernance(id: $id, name: $name) {\n\t\t... PrGovernanceFragment\n\t}\n}\nfragment PrGovernanceFragment on PrGovernance {\n\tid\n\tname\n}\n","sha256:becbe7cfde6f4a45472afa3838782c007a7ca917e38ba1c6e9994f66543401c1":"mutation UpdateStackRunStep ($id: ID!, $attributes: RunStepAttributes!) {\n\tupdateRunStep(id: $id, attributes: $attributes) {\n\t\t... RunStepFragment\n\t}\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\n","sha256:bef364b9855a0f6ff2adb5d11c887b240e54f9ccad79cf8cb5a687a5f01fe216":"query ListProjects ($after: String, $before: String, $first: Int, $last: Int, $q: String) {\n\tprojects(after: $after, before: $before, first: $first, last: $last, q: $q) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ProjectFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:bf5e9b738fb2b1a68f843372e8c2e91e18668242bf1fafa6742714dde3380675":"query ListAgentRuns ($after: String, $first: Int, $before: String, $last: Int) {\n\tagentRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AgentRunFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:bfaf5cbd07eaa142e0d849d06d5e5b453aa32d0c6eeace81fa1933d76650e234":"mutation CreateClusterRestore ($backupId: ID!) {\n\tcreateClusterRestore(backupId: $backupId) {\n\t\t... ClusterRestoreFragment\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:bfb0af0255fcb8a8df9b9a92adc450dc9d7b73aecfb9d984041d36741ab28357":"query GetPolicyTiny ($id: ID, $name: String) {\n\tpolicy(id: $id, name: $name) {\n\t\t... TinyPolicyFragment\n\t}\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:c064e0789ac325d358976a1f68ae61f2d0fd196ac6452d2a0d89e14dc0a8f106":"mutation updateServiceComponents ($id: ID!, $components: [ComponentAttributes], $revisionId: ID!, $sha: String, $errors: [ServiceErrorAttributes], $metadata: ServiceMetadataAttributes) {\n\tupdateServiceComponents(id: $id, components: $components, revisionId: $revisionId, sha: $sha, errors: $errors, metadata: $metadata) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:c09faa203ac4b24e71309d89522aeb52d09256d884896870c257c57940b352ae":"mutation CreateAccessToken {\n\tcreateAccessToken {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:c0b9e33345dc718f8fb3c28711b5694a0b0e04be77e9faf13094cbecb500eeab":"mutation UpsertPreviewEnvironmentTemplate ($attributes: PreviewEnvironmentTemplateAttributes!) {\n\tupsertPreviewEnvironmentTemplate(attributes: $attributes) {\n\t\t... PreviewEnvironmentTemplateFragment\n\t}\n}\nfragment PreviewEnvironmentTemplateFragment on PreviewEnvironmentTemplate {\n\tid\n\tname\n\tcommentTemplate\n\tflow {\n\t\tid\n\t}\n\tconnection {\n\t\tid\n\t}\n\ttemplate {\n\t\tname\n\t}\n}\n","sha256:c115b884fcc5aa8a05486db11aec7c66d51336be00dbcb79b14276e983bcf4c4":"mutation UpsertCustomCompatibilityMatrix ($attributes: CustomCompatibilityMatrixAttributes!) {\n\tupsertCustomCompatibilityMatrix(attributes: $attributes) {\n\t\t... CustomCompatibilityMatrixFragment\n\t}\n}\nfragment CustomCompatibilityMatrixFragment on CustomCompatibilityMatrix {\n\tid\n\tname\n}\n","sha256:c1242302002fd521aeb0171d4df304f9a6561bbc5b77c36ba36998fe0700f33e":"mutation UpdatePersona ($id: ID!, $attributes: PersonaAttributes!) {\n\tupdatePersona(id: $id, attributes: $attributes) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:c1cd732253ebdf1c807451b3cf00bed2497fddd70b94dc26115e51be4f20de65":"mutation DeleteNamespace ($id: ID!) {\n\tdeleteManagedNamespace(id: $id) {\n\t\tid\n\t}\n}\n","sha256:c233e6f7b150960c88d30f2bbebdaa5cb184e1d973b4d57add138eae8b439a99":"query GetStackDefinition ($id: ID!) {\n\tstackDefinition(id: $id) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:c33f34d45c517bb9de74e17503e1955925c8ae908a2c6f3e1f8937cdc5494736":"mutation DeleteNotificationSink ($id: ID!) {\n\tdeleteNotificationSink(id: $id) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:c361daaf8af4e815cd5037cfca3508c99c82d5d13efeea7be74df0aa0a4a4086":"mutation DeleteScmWebhook ($id: ID!) {\n\tdeleteScmWebhook(id: $id) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:c46ab7fc3397b368523489263f27b9a319cc77a572670579ef50788e37a52cb3":"query ListWorkbenches ($after: String, $first: Int, $before: String, $last: Int, $q: String) {\n\tworkbenches(after: $after, first: $first, before: $before, last: $last, q: $q) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... WorkbenchFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:c4d1d8e2c7cc145562d0347c03a7e8d55ffa769b5c86fc0bf62e5a437a5c7705":"query GetScmConnectionTiny ($id: ID, $name: String) {\n\tscmConnection(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:c59085c3cc9fc0cdf5fdab1ad6426d70cad3c18d61e8099408b0f729ff7896a0":"query GetGroup ($name: String!) {\n\tgroup(name: $name) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:c648bed210879433e880936999a0177cfed858de16ae630b4d28fdf328e5ba8c":"query ListClusterStackIds ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterStackRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... StackRunIdEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackRunIdEdgeFragment on StackRunEdge {\n\tnode {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:c6e7aaf82961c3a494e7dad20a5034cb38d7b6c7f7d314ede07872165c9514c2":"mutation CreateServiceDeployment ($clusterId: ID!, $attributes: ServiceDeploymentAttributes!) {\n\tcreateServiceDeployment(clusterId: $clusterId, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:c8e0fc5503578fcfd182a285f270117143fea26d5788ae339ea658d7824ead7a":"query GetStackRunApprovedAt ($id: ID!) {\n\tstackRun(id: $id) {\n\t\tapprovedAt\n\t}\n}\n","sha256:c8e4277ef08029190490500c4713ee3efdb9cbd85fe2afa0ab64c9fde367c4c8":"mutation CreateWorkbenchWebhook ($workbenchId: ID!, $attributes: WorkbenchWebhookAttributes!) {\n\tcreateWorkbenchWebhook(workbenchId: $workbenchId, attributes: $attributes) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:c9d7d1433d0b7c8a13ee3f48b79dc7ca7d2fbe3fbc95a59605bc4bcb6105be48":"query GetPipelines ($after: String) {\n\tpipelines(first: 100, after: $after) {\n\t\tedges {\n\t\t\t... PipelineEdgeFragment\n\t\t}\n\t}\n}\nfragment PipelineEdgeFragment on PipelineEdge {\n\tnode {\n\t\t... PipelineFragment\n\t}\n}\nfragment PipelineFragment on Pipeline {\n\tid\n\tname\n\tstages {\n\t\t... PipelineStageFragment\n\t}\n\tedges {\n\t\t... PipelineStageEdgeFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment PipelineStageFragment on PipelineStage {\n\tid\n\tname\n\tservices {\n\t\tservice {\n\t\t\t... ServiceDeploymentBaseFragment\n\t\t}\n\t\tcriteria {\n\t\t\tsource {\n\t\t\t\t... ServiceDeploymentBaseFragment\n\t\t\t}\n\t\t\tsecrets\n\t\t}\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PipelineStageEdgeFragment on PipelineStageEdge {\n\tid\n\tfrom {\n\t\t... PipelineStageFragment\n\t}\n\tto {\n\t\t... PipelineStageFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:cb1a08aa627034f757f578e60b19cdf3d86cb6d07d0e092665994437fd3b0c8c":"query GetAgentRuntimeByName ($name: String!, $clusterId: ID!) {\n\tagentRuntime(name: $name, clusterId: $clusterId) {\n\t\t... AgentRuntimeFragment\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:cb23898da395a1259a3eea1069486d08bdd398b8e19ab7767f479516394fb545":"mutation IngestClusterCost ($costs: CostIngestAttributes!) {\n\tingestClusterCost(costs: $costs)\n}\n","sha256:cbf979fbb7271eae49c77cfe27cf45f05476150dbf4d2de0e43a6baed1fbbf9f":"mutation CreateCustomStackRun ($attributes: CustomStackRunAttributes!) {\n\tcreateCustomStackRun(attributes: $attributes) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:cc23c54f364f7fc86b1677d8f80d5f90f66bb7dbb52aa56ac2ca9505602f7c63":"mutation ApproveStackRun ($id: ID!) {\n\tapproveStackRun(id: $id) {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:cc4284d27cd80dffc23f9a8b628e071a091bf13b1e8a75c1a628b487c92ea8c8":"mutation DeleteGroup ($groupId: ID!) {\n\tdeleteGroup(groupId: $groupId) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:cd777b75a96e3400c0bdd6a75f4e63860fb1019c20082c6509d7a8a9179d2947":"query GetInfrastructureStackStatus ($id: ID, $name: String) {\n\tinfrastructureStack(id: $id, name: $name) {\n\t\t... InfrastructureStackStatusFragment\n\t}\n}\nfragment InfrastructureStackStatusFragment on InfrastructureStack {\n\tstatus\n}\n","sha256:cf8c42483cecc603b29f28f8c4f4f0fc9cba008aa0ae2228ba85683ddb71c31c":"query GetUserTiny ($email: String!) {\n\tuser(email: $email) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:d0243f65b29d1f4a3dc0fc341329bd64771a81b61027b49b5c657638fc12d993":"mutation DetachStack ($id: ID!) {\n\tdetachStack(id: $id) {\n\t\t... InfrastructureStackIdFragment\n\t}\n}\nfragment InfrastructureStackIdFragment on InfrastructureStack {\n\tid\n}\n","sha256:d034e60088292f765627dce48ade66b2a3329d670b310d078883f59f345e5f3d":"mutation UpdateWorkbench ($id: ID!, $attributes: WorkbenchAttributes!) {\n\tupdateWorkbench(id: $id, attributes: $attributes) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:d0deff4a75c0315f913f84dcd0babf240d3dd12dc7b753f6796ac081b4b10b6c":"query ListAgentRunsMinimal ($after: String, $first: Int, $before: String, $last: Int) {\n\tagentRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AgentRunMinimalFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment AgentRunMinimalFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\truntime {\n\t\ttype\n\t}\n\tpullRequests {\n\t\tid\n\t\tstatus\n\t\turl\n\t\ttitle\n\t\tref\n\t}\n\tupload {\n\t\tsession\n\t\tpatch\n\t\tscreenRecording\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:d17fdd1f3585dbb5fe41795aa0f06da222848b52ad30ef0827bc0eb968fc3c68":"mutation DeleteGlobalServiceDeployment ($id: ID!) {\n\tdeleteGlobalService(id: $id) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:d1b43ea072acd70d56e7e3637eb05a13b854defd61c46d3f03cac4c831be0df4":"mutation UpsertPrGovernance ($attributes: PrGovernanceAttributes!) {\n\tupsertPrGovernance(attributes: $attributes) {\n\t\t... PrGovernanceFragment\n\t}\n}\nfragment PrGovernanceFragment on PrGovernance {\n\tid\n\tname\n}\n","sha256:d212c3e56c32e78aa75561817cfa4aa18d96b3f7ef6b60e363dfdd864b78bbc4":"mutation PingCluster ($attributes: ClusterPing!) {\n\tpingCluster(attributes: $attributes) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:d37c4e4d20689e9ff322abbb478c77fc9a8aec7b995b68617d3401d1f123b39b":"mutation CreateScmConnection ($attributes: ScmConnectionAttributes!) {\n\tcreateScmConnection(attributes: $attributes) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:d666f635df84ed6a6c279cd0f46a5ede9d26b15ec7aac618a0d96fb731fb7dda":"query GetAccessToken ($id: ID!) {\n\taccessToken(id: $id) {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:d7a398fe4bbf2a5f798ff3b3cc4b219587eeb27f422f3afb15c9621926dcb1e4":"mutation DeleteClusterProvider ($id: ID!) {\n\tdeleteClusterProvider(id: $id) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:d7c04e62db15eca75b1b7ac459f73ee190f7d014edd53ebf926182940ae46f55":"query GetPersona ($id: ID!) {\n\tpersona(id: $id) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:d7d71625718364b0b47e0f2fcacf1411f6ce8f1a5f8d5368133b7c28ee931c2d":"query GetClusterRegistration ($id: ID, $machineId: String) {\n\tclusterRegistration(id: $id, machineId: $machineId) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:d8d1b2b67547c395415dba4760257041fc27373d662324934850ae8a53f7f436":"mutation CreateAgentRun ($runtimeId: ID!, $attributes: AgentRunAttributes!) {\n\tcreateAgentRun(runtimeId: $runtimeId, attributes: $attributes) {\n\t\t... AgentRunFragment\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:d9d6a609a379b3b6ba578167a4b9218c222ffede1152770c7df98cd5558bdb57":"mutation AgentPrReview ($runId: ID!, $attributes: AgentPrReviewAttributes!) {\n\tagentPrReview(runId: $runId, attributes: $attributes) {\n\t\t... PullRequestFragment\n\t}\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\n","sha256:da49a26dea358a0bd0fbe7d5293211ce6a6264208cd6a62c06f3fbbecda3d907":"query ListClusterStacks ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterStackRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... StackRunEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackRunEdgeFragment on StackRunEdge {\n\tnode {\n\t\t... StackRunFragment\n\t}\n}\nfragment StackRunFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n\tapprover {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:da61f9d23f2bb33137008e58f123fe876dd8b1313e9e4c9bcde20a36f0af2026":"mutation UpdateClusterRestore ($id: ID!, $attributes: RestoreAttributes!) {\n\tupdateClusterRestore(id: $id, attributes: $attributes) {\n\t\t... ClusterRestoreFragment\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:da7c309e7952dd39dd8aff2fb5caff9e91fd9b874fd67a885a8fa9919c56f922":"query GetFederatedCredential ($id: ID!) {\n\tfederatedCredential(id: $id) {\n\t\t... FederatedCredentialFragment\n\t}\n}\nfragment FederatedCredentialFragment on FederatedCredential {\n\tid\n\tclaimsLike\n\tissuer\n\tscopes\n\tinsertedAt\n\tupdatedAt\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n}\n","sha256:dc234dc3210e744612266cc34041deddb89799519c26a5bb343caf804baa220c":"query ListWorkbenchTools ($after: String, $first: Int, $before: String, $last: Int, $q: String) {\n\tworkbenchTools(after: $after, first: $first, before: $before, last: $last, q: $q) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... WorkbenchToolFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:dd43f3ef75185258586ab4bb1b086ed6a2703f09a5e439ea3f4a7cda94429d74":"mutation UpdateCustomStackRun ($id: ID!, $attributes: CustomStackRunAttributes!) {\n\tupdateCustomStackRun(id: $id, attributes: $attributes) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:df1a376b62fbd1450e92d22cb75ad7ee44d7f03f99bfb7d5c0e9d899ed428b22":"mutation DeleteFlow ($id: ID!) {\n\tdeleteFlow(id: $id) {\n\t\tid\n\t}\n}\n","sha256:e00dac57c9bbde70847c095096e903c6b33b62d4e20bc848a5996649ed738826":"query GetServiceDeployment ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:e12171fbbb1ccefe73589f2b19ea00806a6d8a4ef0be04692110bfcd18587456":"mutation UpdateRbac ($rbac: RbacAttributes!, $serviceId: ID, $clusterId: ID, $providerId: ID) {\n\tupdateRbac(rbac: $rbac, serviceId: $serviceId, clusterId: $clusterId, providerId: $providerId)\n}\n","sha256:e191a0abc1d10463daf351717693b915fb5e1e2e376ebc1914069c8ed5b4d83c":"mutation CreatePersona ($attributes: PersonaAttributes!) {\n\tcreatePersona(attributes: $attributes) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:e2d945757a488df65767d201a8b1b87d4485fe2e48cf16478979b6f4c5cd9a20":"mutation AddServiceError ($id: ID!, $errors: [ServiceErrorAttributes]) {\n\tupdateServiceComponents(id: $id, errors: $errors) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:e44cf2898da342dcf07148d3868d094a0dd29e5579d25257d5be9c1f0f05489a":"query GetSentinelRunJob ($id: ID!) {\n\tsentinelRunJob(id: $id) {\n\t\t... SentinelRunJobFragment\n\t}\n}\nfragment SentinelRunJobFragment on SentinelRunJob {\n\tid\n\tcheck\n\tstatus\n\tformat\n\tusesGit\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\treference {\n\t\tname\n\t\tnamespace\n\t}\n\tsentinelRun {\n\t\t... SentinelRunFragment\n\t}\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tdistro\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:e59e52086eae818a70aac84cb1c4d4ac1e23135482a8444db2155af8bf60a789":"mutation UpdateServiceAccount ($id: ID!, $attributes: ServiceAccountAttributes!) {\n\tupdateServiceAccount(id: $id, attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:e5c3c0029872eee1c6e1cdd984869fe9a4b27eca35ea11c05567ae7561df3519":"query ListComplianceReportGenerators ($after: String, $before: String, $first: Int, $last: Int) {\n\tcomplianceReportGenerators(after: $after, before: $before, first: $first, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ComplianceReportGeneratorFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:e5f970f2b0557a81ab6348adfc94a898956ea5f945ac0bd067ebc465a588a25e":"mutation UpdateSentinelRunJobStatus ($id: ID!, $attributes: SentinelRunJobUpdateAttributes) {\n\tupdateSentinelRunJob(id: $id, attributes: $attributes) {\n\t\t... SentinelRunJobFragment\n\t}\n}\nfragment SentinelRunJobFragment on SentinelRunJob {\n\tid\n\tcheck\n\tstatus\n\tformat\n\tusesGit\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\treference {\n\t\tname\n\t\tnamespace\n\t}\n\tsentinelRun {\n\t\t... SentinelRunFragment\n\t}\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tdistro\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:e64a2264b1a894d3db35c700efe1e5b72103efab97275077b7184600bb81b4ec":"query GetServiceDeploymentTiny ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:e81829a6508fe6b8fb4e8d0e7b4180772c5ebff701a3011e1ce4a365cdcea6c5":"query GetSentinelRun ($id: ID!) {\n\tsentinelRun(id: $id) {\n\t\t... SentinelRunFragment\n\t}\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:e885bd9d9a88f0e525d69bee24aba63717c7969bcda29dcc1e0181db1d6553f7":"mutation UpdateGroup ($groupId: ID!, $attributtes: GroupAttributes!) {\n\tupdateGroup(groupId: $groupId, attributes: $attributtes) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:e8cabd7bee2b3ec8fb69f3c07726d145c7ba7d1342e884bb6674c48ee584d3f2":"query GetObserverTiny ($id: ID, $name: String) {\n\tobserver(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:e98aa15a1c0af4f3b5d1831279f62d9ef48c9a28217191e54b8e7545e322356a":"mutation UpsertAgentRuntime ($attributes: AgentRuntimeAttributes!) {\n\tupsertAgentRuntime(attributes: $attributes) {\n\t\t... AgentRuntimeFragment\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:ea42f99ac6aa82489ff83d4b6a3569d01af1e44663670ce7983d6e0950e00445":"mutation CreateOIDCProvider ($type: OidcProviderType!, $attributes: OidcProviderAttributes!) {\n\tcreateOidcProvider(type: $type, attributes: $attributes) {\n\t\t... OIDCProviderFragment\n\t}\n}\nfragment OIDCProviderFragment on OidcProvider {\n\tid\n\tname\n\tdescription\n\tclientId\n\tclientSecret\n\tauthMethod\n\tredirectUris\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:eb1e79ee0e1ae9924acfacadc2225debe000a1deaf29f4bd0b4fd32bdc06fc37":"mutation KickService ($id: ID!) {\n\tkickService(serviceId: $id) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:eb48e1387916b107c9eb813c9b4c86628952b1cc47b2cc19138c55e28c0d27c2":"query GetInfrastructureStackId ($id: ID, $name: String) {\n\tinfrastructureStack(id: $id, name: $name) {\n\t\t... InfrastructureStackIdFragment\n\t}\n}\nfragment InfrastructureStackIdFragment on InfrastructureStack {\n\tid\n}\n","sha256:eb6667b96554ee27077292eed506b0777efacdffaee51babf8fdaa2fe20de1df":"query GetObservabilityProviderTiny ($id: ID, $name: String) {\n\tobservabilityProvider(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:ebb21cf148c1266159da87762af8b07b3d86e2bc357ed7e97e3836552ff47725":"query ListAgentRuntimes ($after: String, $first: Int, $before: String, $last: Int, $q: String, $type: AgentRuntimeType) {\n\tagentRuntimes(after: $after, first: $first, before: $before, last: $last, q: $q, type: $type) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AgentRuntimeFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:edf0898fb4698594637c396cb651e59637dde77354bfd5f6cbac6a174973ab3f":"mutation CreatePolicy ($attributes: PolicyAttributes!) {\n\tcreatePolicy(attributes: $attributes) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:ee2c452c191fc50ec78c441ccd4beaec32bb632b4a32df0b3bbdbf5a77ae2b26":"query GetCluster ($id: ID) {\n\tcluster(id: $id) {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:f0877907330fe5fe1eb0c25fde95aa37e9cc7c9e0a1c18f5fd432ec35fbdaf0f":"mutation UpdateStack ($id: ID!, $attributes: StackAttributes!) {\n\tupdateStack(id: $id, attributes: $attributes) {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:f0e05ce093b55732e58f7c3095178c28f5fe253dc86cb3fe35b8d9780e729d8a":"mutation DeleteProviderCredential ($id: ID!) {\n\tdeleteProviderCredential(id: $id) {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:f0f3bc7a7e51984167ff9097cb46eea2b6f8511fde8e987e799db5e919392da2":"mutation UpdatePolicy ($id: ID!, $attributes: PolicyAttributes!) {\n\tupdatePolicy(id: $id, attributes: $attributes) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:f2bb0c00963bc3dd9e407275110593d11307a2f5ad6b0874d0ec68e39f98aacc":"query GetFlow ($id: ID!) {\n\tflow(id: $id) {\n\t\t... FlowFragment\n\t}\n}\nfragment FlowFragment on Flow {\n\tid\n\tname\n\tdescription\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\n","sha256:f2e2e6aea69a2fe6413ac04731bf6bdf9b1b8fbfbc631f64081b97925cf0c4d5":"mutation CreatePrAutomation ($attributes: PrAutomationAttributes!) {\n\tcreatePrAutomation(attributes: $attributes) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:f48fca8fbe86193ecceac779139b392ec35b9668b6391b87e9e485968adbe281":"mutation KickServiceByHandle ($cluster: String!, $name: String!) {\n\tkickService(cluster: $cluster, name: $name) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:f4c23df10fd69bac428668e234d4671734030cdb043ab60cf1c2d1ae81755751":"mutation CloneServiceDeployment ($clusterId: ID!, $id: ID!, $attributes: ServiceCloneAttributes!) {\n\tcloneService(clusterId: $clusterId, serviceId: $id, attributes: $attributes) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:f4e1c56176b7a939e788ef5b53f4787503b89c032124e826851a5ff4aceb0f25":"query GetNotificationRouterByName ($name: String) {\n\tnotificationRouter(name: $name) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:f6ed33ad9b1d5a5809a4e165bd5ef8f45b11473299e695b900de16f0e019638e":"mutation CreateBindingPolicy ($attributes: BindingPolicyAttributes!) {\n\tcreateBindingPolicy(attributes: $attributes) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:f6f84fe259c76394005edc0fae05274cf74dbc7798901ae09e0ffcd10cc83f56":"mutation UpsertMCPServer ($attributes: McpServerAttributes!) {\n\tupsertMcpServer(attributes: $attributes) {\n\t\t... MCPServerFragment\n\t}\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\n","sha256:fb582babd9105b9d3a968a697cd3c6879d73cc169cb3a0ea2ff6919653b93159":"query GetPersonaTiny ($id: ID!) {\n\tpersona(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:fb5ea857664bc64ec6b9b3be0df5183537c6ada36d9076badf3035fac4821160":"mutation updateGate ($id: ID!, $attributes: GateUpdateAttributes!) {\n\tupdateGate(id: $id, attributes: $attributes) {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:fbbe6bebeab1e039a67523921914f1c01201317c02cc98e06dec4433b164babe":"mutation UpsertFlow ($attributes: FlowAttributes!) {\n\tupsertFlow(attributes: $attributes) {\n\t\t... FlowFragment\n\t}\n}\nfragment FlowFragment on Flow {\n\tid\n\tname\n\tdescription\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\n","sha256:fd1e534eae2f32dcc454ce202bcdf126e56a5fd1783af6d72bac469daf44711a":"mutation UpsertObservabilityWebhook ($attributes: ObservabilityWebhookAttributes!) {\n\tupsertObservabilityWebhook(attributes: $attributes) {\n\t\t... ObservabilityWebhookFragment\n\t}\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:fd2719879c20e353e13ab4632ed7ef0463e32c44312ba4718fa3c3398f85757b":"mutation DeleteUpgradePlanCallout ($name: String!) {\n\tdeleteUpgradePlanCallout(name: $name) {\n\t\tid\n\t}\n}\n","sha256:fd676c01ee84f17507ca86fc92b81db853336c773cdd9aa5d76179aca8c4be1a":"mutation CreateWorkbench ($attributes: WorkbenchAttributes!) {\n\tcreateWorkbench(attributes: $attributes) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:fe29529018620357fb036988eaedf93dcc5f4c261a1790008fe871e730df22a7":"mutation CreateAgentMessageOutput ($attributes: AgentMessageOutputAttributes!) {\n\tagentMessageOutput(attributes: $attributes) {\n\t\tmessageId\n\t\tagentRunId\n\t\tstdout\n\t\tstderr\n\t}\n}\n","sha256:fe6d1ea15a4c48af7dd3d108284742c3e213ae0ca2d056b54e9f69e76d324ff0":"query GetPipeline ($id: ID!) {\n\tpipeline(id: $id) {\n\t\t... PipelineFragmentMinimal\n\t}\n}\nfragment PipelineFragmentMinimal on Pipeline {\n\tid\n\tname\n}\n","sha256:fe9a6d6142da6bdab74374a10496278f9c48e7c7d5be86f30230ab48f378cec0":"query GetClusterIdByHandle ($handle: String) {\n\tcluster(handle: $handle) {\n\t\t... {\n\t\t\tid\n\t\t}\n\t}\n}\n","sha256:feaaf702508e6b2448a4d426421ceaece0bdb6c525c329b24c8944dec9373dc3":"query PagedClusterServices ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterServices(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ServiceDeploymentEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n"}} +{"operations":{"sha256:00103bd4468d331dceccf9f2cf1c3770fe14da6023e65301de2f423934a180df":"query GetNamespaceByName ($name: String!) {\n\tmanagedNamespace(name: $name) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:00cc798d4efba980df734ed908f4a6eff35ea9532ba5a24ce2e678c47b9e4edd":"mutation DeleteGitRepository ($id: ID!) {\n\tdeleteGitRepository(id: $id) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:0495efe67b265523309e91230a439c44a3566aa4f54eae8038c54b08e197da4a":"mutation CreatePullRequest ($id: ID!, $identifier: String, $branch: String, $context: Json) {\n\tcreatePullRequest(id: $id, identifier: $identifier, branch: $branch, context: $context) {\n\t\t... PullRequestFragment\n\t}\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\n","sha256:04f446a7241e2a77f9c03860529c22f6097f0b065b8a91812af367db06c51783":"mutation DeletePipeline ($id: ID!) {\n\tdeletePipeline(id: $id) {\n\t\t... PipelineFragmentId\n\t}\n}\nfragment PipelineFragmentId on Pipeline {\n\tid\n}\n","sha256:05614f559b29689b95f90bfb84adf304e3898a429c26fc3b55dda779621f3d26":"mutation UpsertCatalog ($attributes: CatalogAttributes) {\n\tupsertCatalog(attributes: $attributes) {\n\t\t... CatalogFragment\n\t}\n}\nfragment CatalogFragment on Catalog {\n\tid\n\tname\n\tdescription\n\tcategory\n\tauthor\n\tproject {\n\t\t... ProjectFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:071e713551ffc28f4196427c367142ecc5fa316d0b9fc17c0dfc682f6b1dca67":"query GetProjectTiny ($id: ID, $name: String) {\n\tproject(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:07fc34a5e5b6a6de044a6b35bf40e5218106f2849f0528e71f8f23287a498858":"mutation UpdateCloudConnection ($id: ID!, $attributes: CloudConnectionAttributes!) {\n\tupdateCloudConnection(id: $id, attributes: $attributes) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:08223278347596ef0a0f5ab698ed517803e9dcf41027abe6e1b00e1765a24534":"mutation UpdateAgentRunTodos ($id: ID!, $todos: [AgentTodoAttributes]) {\n\tupdateAgentRunTodos(id: $id, todos: $todos) {\n\t\t... AgentRunBaseFragment\n\t}\n}\nfragment AgentRunBaseFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tmode\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\n","sha256:085357a60e4fc347e143328a81f9de10226eed039c1bf5c65180c4a22e0cabbf":"mutation CreateGlobalServiceDeploymentFromTemplate ($attributes: GlobalServiceAttributes!) {\n\tcreateGlobalService(attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:08538e2a930e5635cdf567d936c4e328614f999e32a060237d625a4bf0a0d818":"query GetPreviewEnvironmentTemplate ($id: ID, $flowId: ID, $name: String) {\n\tpreviewEnvironmentTemplate(id: $id, flowId: $flowId, name: $name) {\n\t\t... PreviewEnvironmentTemplateFragment\n\t}\n}\nfragment PreviewEnvironmentTemplateFragment on PreviewEnvironmentTemplate {\n\tid\n\tname\n\tcommentTemplate\n\tflow {\n\t\tid\n\t}\n\tconnection {\n\t\tid\n\t}\n\ttemplate {\n\t\tname\n\t}\n}\n","sha256:087514315644018028c9097e305b44d39b6d2a04bbc27db80624db6f7cc0ca72":"query GetCloudConnection ($id: ID, $name: String) {\n\tcloudConnection(id: $id, name: $name) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:0a28bd1898f2387165f13394e8eef522528534c85f28548d81706a42b2711b11":"mutation CreateProject ($attributes: ProjectAttributes!) {\n\tcreateProject(attributes: $attributes) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:0bc7753b4e8e392d65a52f75255bc48a95cdea84ee46118b08f141280cb5aa18":"query ListStackRuns ($id: ID!, $after: String, $before: String, $first: Int, $last: Int) {\n\tinfrastructureStack(id: $id) {\n\t\truns(after: $after, before: $before, first: $first, last: $last) {\n\t\t\tpageInfo {\n\t\t\t\t... PageInfoFragment\n\t\t\t}\n\t\t\tedges {\n\t\t\t\tnode {\n\t\t\t\t\t... StackRunFragment\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackRunFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n\tapprover {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:0c0af919e2a1ba02a7c44e25fe40583b263f45bc1a1639ae2d730c016a86fdbe":"query GetStackRun ($id: ID!) {\n\tstackRun(id: $id) {\n\t\t... StackRunFragment\n\t}\n}\nfragment StackRunFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n\tapprover {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:0c4c1df078093fe381c14fb9f8ab6e669fedf3a631a8508dbad33ac9cfba8d93":"mutation DeleteWorkbenchTool ($id: ID!) {\n\tdeleteWorkbenchTool(id: $id) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:0d0a41b5dfa910c86743e2020189205095d82cfdaff768c950becb55d86e2b18":"query GetPrAutomationTiny ($id: ID, $name: String) {\n\tprAutomation(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:0e44517bb19e961ba5072de436b6c59ae5f5f26a0abe32ae3e8ddee5f69a6aa2":"query GetInfrastructureStack ($id: ID, $name: String) {\n\tinfrastructureStack(id: $id, name: $name) {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:0f0760bb85acd02798886990edc78e9aac44db50fa883f250d5972519ffa9ce3":"query GetGitRepository ($id: ID, $url: String) {\n\tgitRepository(id: $id, url: $url) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:0f2aa1a8d7ef81b1122c7d75ae4e54e7f47f04ec942981b778e1d6899309f374":"mutation DeleteCustomCompatibilityMatrix ($name: String!) {\n\tdeleteCustomCompatibilityMatrix(name: $name) {\n\t\tid\n\t}\n}\n","sha256:0fa340d64f20a24b0474d3d73ba219d190d314d53d35e1cd3cba85f0c08b3e9b":"query ListClusterNamespaces ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterManagedNamespaces(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ManagedNamespaceEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ManagedNamespaceEdgeFragment on ManagedNamespaceEdge {\n\tcursor\n\tnode {\n\t\t... ManagedNamespaceMinimalFragment\n\t}\n}\nfragment ManagedNamespaceMinimalFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n}\n","sha256:113ac0549d0fcfd701e5bd6f98913d91d1b5c93a64d33494d301d8a0512d0c3b":"mutation DeleteCluster ($id: ID!) {\n\tdeleteCluster(id: $id) {\n\t\tid\n\t}\n}\n","sha256:1241ee42efef6bee48784022906e25828de81d27b66b8b2661a6696b25bf8096":"query ListPolicyConstraints ($after: String, $first: Int, $before: String, $last: Int, $namespace: String, $kind: String, $q: String) {\n\tpolicyConstraints(after: $after, first: $first, before: $before, last: $last, namespace: $namespace, kind: $kind, q: $q) {\n\t\t... PolicyConstraintConnectionFragment\n\t}\n}\nfragment PolicyConstraintConnectionFragment on PolicyConstraintConnection {\n\tpageInfo {\n\t\t... PageInfoFragment\n\t}\n\tedges {\n\t\t... PolicyConstraintEdgeFragment\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment PolicyConstraintEdgeFragment on PolicyConstraintEdge {\n\tcursor\n\tnode {\n\t\t... PolicyConstraintFragment\n\t}\n}\nfragment PolicyConstraintFragment on PolicyConstraint {\n\tid\n\tname\n\tdescription\n\trecommendation\n\tviolationCount\n\tref {\n\t\t... ConstraintRefFragment\n\t}\n\tviolations {\n\t\t... ViolationFragment\n\t}\n}\nfragment ConstraintRefFragment on ConstraintRef {\n\tkind\n\tname\n}\nfragment ViolationFragment on Violation {\n\tid\n\tgroup\n\tversion\n\tkind\n\tnamespace\n\tname\n\tmessage\n}\n","sha256:12978d7990d091e6a41e14baa02a3eec74a42fa51d13c7123407753af75206d5":"mutation DeleteMCPServer ($id: ID!) {\n\tdeleteMcpServer(id: $id) {\n\t\tid\n\t}\n}\n","sha256:14dab7763ca34c91224365fb4ee687491114c4f8417edf9242c56b2471d8e8aa":"mutation UpsertObserver ($attributes: ObserverAttributes!) {\n\tupsertObserver(attributes: $attributes) {\n\t\t... ObserverFragment\n\t}\n}\nfragment ObserverFragment on Observer {\n\tid\n\tname\n\tstatus\n\tcrontab\n\ttarget {\n\t\t... ObserverTargetFragment\n\t}\n\tactions {\n\t\t... ObserverActionFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ObserverTargetFragment on ObserverTarget {\n\thelm {\n\t\t... ObserverHelmRepoFragment\n\t}\n\toci {\n\t\t... ObserverOciRepoFragment\n\t}\n}\nfragment ObserverHelmRepoFragment on ObserverHelmRepo {\n\turl\n\tchart\n\tprovider\n}\nfragment ObserverOciRepoFragment on ObserverOciRepo {\n\turl\n\tprovider\n}\nfragment ObserverActionFragment on ObserverAction {\n\ttype\n\tconfiguration {\n\t\t... ObserverActionConfigurationFragment\n\t}\n}\nfragment ObserverActionConfigurationFragment on ObserverActionConfiguration {\n\tpr {\n\t\t... ObserverPrActionFragment\n\t}\n\tpipeline {\n\t\t... ObserverPipelineActionFragment\n\t}\n}\nfragment ObserverPrActionFragment on ObserverPrAction {\n\tautomationId\n\trepository\n\tbranchTemplate\n\tcontext\n}\nfragment ObserverPipelineActionFragment on ObserverPipelineAction {\n\tpipelineId\n\tcontext\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\n","sha256:156bc954626bd533fcb5d6b04f8818932bf0aac8fe3b75559b80c0fdba618249":"query GetServiceContext ($name: String!) {\n\tserviceContext(name: $name) {\n\t\t... ServiceContextFragment\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:15709e3e6be95a817cd82440cad42dff3e321b122c6dd4a244b34c11c83e0d60":"mutation AddClusterAuditLog ($audit: ClusterAuditAttributes, $audits: [ClusterAuditAttributes!]) {\n\taddClusterAuditLog(audit: $audit, audits: $audits)\n}\n","sha256:167f4296a579145d132b20e16834fe927e5cbcf3207bc99ee1e4224cde76c0ca":"mutation TriggerRun ($id: ID!) {\n\ttriggerRun(id: $id) {\n\t\t... StackRunBaseFragment\n\t}\n}\nfragment StackRunBaseFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:173a6ff059c298faca0983bed5cd23dd2618146a475ba1b318c6df57571088fe":"mutation DetachCluster ($id: ID!) {\n\tdetachCluster(id: $id) {\n\t\tid\n\t}\n}\n","sha256:18dd5f16f5b5edea59cefc781dd47a75481f7fbf8e82fe78bd0b282bdea8ecb1":"query GetServiceContextTiny ($name: String!) {\n\tserviceContext(name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:19d5a50725b33d0f729cfab39941f60c599fa65fd3b62bc8ccaf516d466d61bd":"mutation DeleteCloudConnection ($id: ID!) {\n\tdeleteCloudConnection(id: $id) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:1b46f5f5487d9da23d5fefe4e9c687345d8262c0c56cc51fba038dcb114804fb":"mutation UpdateClusterRegistration ($id: ID!, $attributes: ClusterRegistrationUpdateAttributes!) {\n\tupdateClusterRegistration(id: $id, attributes: $attributes) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:1b8cbf2dcdf2de8865c73a61fa9d6c804e98ab333aa265a4662e88187f1102c8":"query GetServiceTarball ($id: ID!) {\n\tserviceTarball(id: $id) {\n\t\tpath\n\t\tcontent\n\t}\n}\n","sha256:1bda12b2e70df63429dc0f9828860174e95a031e50753a96c7df1d8fbbc31e5f":"mutation CompletesStackRun ($id: ID!, $attributes: StackRunAttributes!) {\n\tcompleteStackRun(id: $id, attributes: $attributes) {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:1cefc75c539e6334a815541ea29d5b313d62320a0891add20d37aadcb87e2f86":"mutation UpdateGitRepository ($id: ID!, $attributes: GitAttributes!) {\n\tupdateGitRepository(id: $id, attributes: $attributes) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:1d4359e183ae6b47f7415ab6785626c59d818e2b146ae91e3098c10ef74e4635":"mutation UpdateWorkbenchTool ($id: ID!, $attributes: WorkbenchToolAttributes!) {\n\tupdateWorkbenchTool(id: $id, attributes: $attributes) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:1e351c0a49167a35fcecf3cd2357422f8d0d46d815b2cefbe94af6a2eea3e050":"mutation UpsertUser ($attributes: UserAttributes!) {\n\tupsertUser(attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:1e3e1e2790a3766fa468050e82832991f68555001110778be9611b060369753e":"mutation CreatePipelineContext ($pipelineId: ID!, $attributes: PipelineContextAttributes!) {\n\tcreatePipelineContext(pipelineId: $pipelineId, attributes: $attributes) {\n\t\t... PipelineContextFragment\n\t}\n}\nfragment PipelineContextFragment on PipelineContext {\n\tid\n\tcontext\n}\n","sha256:1f6e3f1f3f3453e925cba533c56cd78e169a56f9276e8795f8aa63576dd56a24":"mutation UpsertUpgradePlanCallout ($attributes: UpgradePlanCalloutAttributes!) {\n\tupsertUpgradePlanCallout(attributes: $attributes) {\n\t\t... UpgradePlanCalloutFragment\n\t}\n}\nfragment UpgradePlanCalloutFragment on UpgradePlanCallout {\n\tid\n\tname\n}\n","sha256:1f6f1a1489995b77678694f2575e16e943eeee4736e05a91dec811f0f15983f3":"mutation CreateFederatedCredential ($attributes: FederatedCredentialAttributes!) {\n\tcreateFederatedCredential(attributes: $attributes) {\n\t\t... FederatedCredentialFragment\n\t}\n}\nfragment FederatedCredentialFragment on FederatedCredential {\n\tid\n\tclaimsLike\n\tissuer\n\tscopes\n\tinsertedAt\n\tupdatedAt\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n}\n","sha256:1ffea4d7cf10ecfd70c134cdf5bfb7dbeaf6434a6a643a55cff81fd9ebbcec0c":"mutation SaveUpgradeInsights ($insights: [UpgradeInsightAttributes], $addons: [CloudAddonAttributes]) {\n\tsaveUpgradeInsights(insights: $insights, addons: $addons) {\n\t\tid\n\t\tname\n\t\tversion\n\t}\n}\n","sha256:203d28df2014c4b7e9a0b2207cf6ccc8a5ef26fdf3e2601c5a3d62109c6837ea":"query ListStackDefinitions ($after: String, $first: Int, $before: String, $last: Int) {\n\tstackDefinitions(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... StackDefinitionFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:221cb5170a90de1dc482ba3e31377437aa9b15a97c7b8ff3230177b70e08bfe4":"query GetHelmRepositoryTiny ($url: String!) {\n\thelmRepository(url: $url) {\n\t\tid\n\t}\n}\n","sha256:2345924629957866fb322bc4c388a43686af182cbbddf270b0f30f8a3b377dd0":"query GetGlobalServiceDeployment ($id: ID!) {\n\tglobalService(id: $id) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:23583acdae3cdcc986ffa4a7e1a2b55d5e7a3bde0311c3ec5718bfbbea14f219":"query GetGlobalServiceDeploymentByName ($name: String!) {\n\tglobalService(name: $name) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:23bb559098a8c85f67e0edcbff659daa6e752c76f0892c65d77432d568398bee":"query GetClusterRestore ($id: ID!) {\n\tclusterRestore(id: $id) {\n\t\t... ClusterRestoreFragment\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:24a3dde607ba5f19327deea354f30f58b8184bcc9d2bbc102fb49b51c5f422b5":"query GetNotificationRouter ($id: ID!) {\n\tnotificationRouter(id: $id) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:25a4c7c811b4dd79d86e145181462499315c7b476c5caaaa60518db1f57f95d9":"mutation SavePipeline ($name: String!, $attributes: PipelineAttributes!) {\n\tsavePipeline(name: $name, attributes: $attributes) {\n\t\t... PipelineFragmentMinimal\n\t}\n}\nfragment PipelineFragmentMinimal on Pipeline {\n\tid\n\tname\n}\n","sha256:2623408de61d79178f6ee987a04e0df092546078b563e89b072b162af6f15ffe":"mutation GetWorkbenchWebhook ($id: ID!) {\n\tgetWorkbenchWebhook(id: $id) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:263be051e9e86e4a69b64064ebf9971db9f14ff4827e881b0a9ea988c3d0870e":"mutation DeleteObservabilityProvider ($id: ID!) {\n\tdeleteObservabilityProvider(id: $id) {\n\t\t... ObservabilityProviderFragment\n\t}\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:299b1ad1887219aef8605421301e00b36aabb4a1cbd34f3ba1f7c4717612eadf":"mutation DeletePrGovernance ($id: ID!) {\n\tdeletePrGovernance(id: $id) {\n\t\t... PrGovernanceFragment\n\t}\n}\nfragment PrGovernanceFragment on PrGovernance {\n\tid\n\tname\n}\n","sha256:29a58c567342ed6668f8af22b9ff8d5ed8c55c74151c93d87accd3827bc39faf":"mutation CreateBootstrapToken ($attributes: BootstrapTokenAttributes!) {\n\tcreateBootstrapToken(attributes: $attributes) {\n\t\t... BootstrapTokenBase\n\t}\n}\nfragment BootstrapTokenBase on BootstrapToken {\n\tid\n\ttoken\n}\n","sha256:2a1fd145f179ee0d1e6ce186d9d3633981ac99bf3752b07c815b1ce2f659c430":"mutation CreateClusterProvider ($attributes: ClusterProviderAttributes!) {\n\tcreateClusterProvider(attributes: $attributes) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:2a9a8fbe23cdfbbf00c854bb4f8332064dff6c8a552ac756b506395bd25100c7":"mutation UpdateClusterProvider ($id: ID!, $attributes: ClusterProviderUpdateAttributes!) {\n\tupdateClusterProvider(id: $id, attributes: $attributes) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:2cfa322ebeb5f421f7cd23fad60e385d43d70b18962d71d0fede0f594cc1b46d":"mutation UpdateSentinel ($id: ID!, $attributes: SentinelAttributes) {\n\tupdateSentinel(id: $id, attributes: $attributes) {\n\t\t... SentinelFragment\n\t}\n}\nfragment SentinelFragment on Sentinel {\n\tid\n\tname\n\tdescription\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:2d79ab2f196f1d63931d3806a4477b92870750014a086d6f2561e55cb6a67af3":"mutation CreateUser ($attributes: UserAttributes!) {\n\tcreateUser(attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:2e5118d5c1872f1f474c40362070af9ad131edef31a6fcfa53ffc550957cb86d":"mutation CreateAgentPullRequest ($runId: ID!, $attributes: AgentPullRequestAttributes!) {\n\tagentPullRequest(runId: $runId, attributes: $attributes) {\n\t\t... PullRequestFragment\n\t}\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\n","sha256:2e5a060183ca0f115ca2fd5c98f051bd8f260fa00902992c20ad8fcf46523699":"query GetFederatedCredentialTiny ($id: ID!) {\n\tfederatedCredential(id: $id) {\n\t\tid\n\t}\n}\n","sha256:2ed4e4848a2483a8d60683df43dcf2668484b6af513db89072d7b9163cb91e40":"mutation UpdateNamespace ($id: ID!, $attributes: ManagedNamespaceAttributes!) {\n\tupdateManagedNamespace(id: $id, attributes: $attributes) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:2f962b9a1cf08b3ac5eb37f0935bf9fb9553825da92e773f0198f564812ddcca":"query GetClusterGate ($id: ID!) {\n\tclusterGate(id: $id) {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:2fb0280705bd95774e0830e6b69482a17a4bdea51b60aae031c878e7622bfb31":"query ListAccessTokens ($cursor: String, $before: String, $last: Int) {\n\taccessTokens(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AccessTokenFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:3153ef98895d30c2c6f51cf864b6461c951e4385c408e4736ab5c85909c55967":"query GetWorkbenchTool ($id: ID, $name: String) {\n\tworkbenchTool(id: $id, name: $name) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:31c87507e58e544b9660476a49191db9bb682a97098db47b0a24f6ab6b7c7099":"mutation DeleteWorkbenchPrompt ($id: ID!) {\n\tdeleteWorkbenchPrompt(id: $id) {\n\t\tid\n\t}\n}\n","sha256:3328865733a3222c979c5635979280018cbe8a54f6eea8f28e32314b39c6a6a6":"mutation UpdateStackDefinition ($id: ID!, $attributes: StackDefinitionAttributes!) {\n\tupdateStackDefinition(id: $id, attributes: $attributes) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:344d00a3e2e6e10a36de6867db2b9deba25bdebc3547c897fe6f2548738724a7":"query GetStackDefinitionTiny ($id: ID!) {\n\tstackDefinition(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:3557f778cd80f66482868b2bc6d0df507b4a2eb9cc6249877b001bdcc2c2c455":"mutation CreateSentinel ($attributes: SentinelAttributes) {\n\tcreateSentinel(attributes: $attributes) {\n\t\t... SentinelFragment\n\t}\n}\nfragment SentinelFragment on Sentinel {\n\tid\n\tname\n\tdescription\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:3617cd964a5282e8fbdbbb88a2dfddc82c9392725b259d6db7e10b87adb28e91":"mutation SaveServiceContext ($name: String!, $attributes: ServiceContextAttributes!) {\n\tsaveServiceContext(name: $name, attributes: $attributes) {\n\t\t... ServiceContextFragment\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:3642d7afaa157713cb448c26f4f3362a53ba61ba9f368233782e709637054dbe":"mutation DeletePrAutomation ($id: ID!) {\n\tdeletePrAutomation(id: $id) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:368c82946025827b9e5a282df168753546a94ae38c4eba8077c45f32ae92ab54":"mutation DeleteObserver ($id: ID!) {\n\tdeleteObserver(id: $id) {\n\t\t... ObserverFragment\n\t}\n}\nfragment ObserverFragment on Observer {\n\tid\n\tname\n\tstatus\n\tcrontab\n\ttarget {\n\t\t... ObserverTargetFragment\n\t}\n\tactions {\n\t\t... ObserverActionFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ObserverTargetFragment on ObserverTarget {\n\thelm {\n\t\t... ObserverHelmRepoFragment\n\t}\n\toci {\n\t\t... ObserverOciRepoFragment\n\t}\n}\nfragment ObserverHelmRepoFragment on ObserverHelmRepo {\n\turl\n\tchart\n\tprovider\n}\nfragment ObserverOciRepoFragment on ObserverOciRepo {\n\turl\n\tprovider\n}\nfragment ObserverActionFragment on ObserverAction {\n\ttype\n\tconfiguration {\n\t\t... ObserverActionConfigurationFragment\n\t}\n}\nfragment ObserverActionConfigurationFragment on ObserverActionConfiguration {\n\tpr {\n\t\t... ObserverPrActionFragment\n\t}\n\tpipeline {\n\t\t... ObserverPipelineActionFragment\n\t}\n}\nfragment ObserverPrActionFragment on ObserverPrAction {\n\tautomationId\n\trepository\n\tbranchTemplate\n\tcontext\n}\nfragment ObserverPipelineActionFragment on ObserverPipelineAction {\n\tpipelineId\n\tcontext\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\n","sha256:36fea2d78373476143b536962a73f6b9eca5fdef00b5415ab69e1ab830908756":"mutation CreateStackDefinition ($attributes: StackDefinitionAttributes!) {\n\tcreateStackDefinition(attributes: $attributes) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:3715c332fc325a323b5c2baf5a93b97960d05d5a84c4480a8bec3ae6d2e2b3ba":"query GetBindingPolicyTiny ($id: ID!) {\n\tbindingPolicy(id: $id) {\n\t\tid\n\t}\n}\n","sha256:375a7c2c38b8646e8df33e517981225183365bcadcc689195c122f3d4ab5864c":"mutation UpdateGlobalServiceDeployment ($id: ID!, $attributes: GlobalServiceAttributes!) {\n\tupdateGlobalService(id: $id, attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:376451d410f05aa32972a4ecfe1e4e9efab9bcd12428dfcee693eacfbe653ae9":"mutation CreateServiceDeploymentWithHandle ($cluster: String!, $attributes: ServiceDeploymentAttributes!) {\n\tcreateServiceDeployment(cluster: $cluster, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:37a8038a21b33330a0321ceaa792807a8a959323c31d52b87f71cd557f5e8529":"query MyCluster {\n\tmyCluster {\n\t\t... {\n\t\t\tid\n\t\t\tname\n\t\t\tdistro\n\t\t\tsupportedAddons\n\t\t\trestore {\n\t\t\t\t... ClusterRestoreFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:383f1a8e3b789b58df1c1b5e1de4ada6be3b0ef5e3cd24f6a79109ff2a6ef6ec":"mutation DeleteAccessToken ($token: String!) {\n\tdeleteAccessToken(token: $token) {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:38cf2b80e79145a83cf653ef5dd530c09492427bbc5c2f2b2b00a99f63081a6d":"mutation DeleteServiceDeployment ($id: ID!) {\n\tdeleteServiceDeployment(id: $id) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:39189795df275ba5770b0f0fdc2167fef15a2ef105f13bb69b95d1e3d75ef749":"mutation UpsertVirtualCluster ($parentID: ID!, $attributes: ClusterAttributes!) {\n\tupsertVirtualCluster(parentId: $parentID, attributes: $attributes) {\n\t\tdeployToken\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:395be562633ea07aa14a2848d97c2662d5a27f2bc3b0306ff8fb328b80c35562":"query ListObservabilityProviders ($after: String, $first: Int, $before: String, $last: Int) {\n\tobservabilityProviders(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ObservabilityProviderFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:3a5b26fabfbcb1813210e97107878f8cf880da4efec00b5d807733890b99c663":"mutation UpdateDeploymentSettings ($attributes: DeploymentSettingsAttributes!) {\n\tupdateDeploymentSettings(attributes: $attributes) {\n\t\t... DeploymentSettingsFragment\n\t}\n}\nfragment DeploymentSettingsFragment on DeploymentSettings {\n\tid\n\tname\n\tagentHelmValues\n\tagentHelmValuesTemplateable\n\tagentVsn\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tartifactRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tdeployerRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tai {\n\t\t... AISettingsFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment AISettingsFragment on AiSettings {\n\tenabled\n\tprovider\n\topenai {\n\t\tmodel\n\t}\n\tanthropic {\n\t\tmodel\n\t}\n}\n","sha256:3c3311c918109c032947b1352a1b4229f13ac85fc9e6ae86c4feda508041cde9":"mutation CreateAgentRunUpload ($runId: ID!, $session: Upload, $screenRecording: Upload, $patch: Upload) {\n\tcreateAgentRunUpload(runId: $runId, attributes: {session:$session,screenRecording:$screenRecording,patch:$patch}) {\n\t\t... AgentRunUploadFragment\n\t}\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:3c447e070c14ecaac431c794c559ba5fa606bc15df98c00bcc81e24809315a4f":"mutation DeleteCustomStackRun ($id: ID!) {\n\tdeleteCustomStackRun(id: $id) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:3cbfaefd04ec40ea1887c27ae44dbbfd5bb148938afe070745b9f35951a4b791":"mutation UpsertCloudConnection ($attributes: CloudConnectionAttributes!) {\n\tupsertCloudConnection(attributes: $attributes) {\n\t\t... CloudConnectionFragment\n\t}\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:3d79eb2a713ca289a10f7515c20da885c422f3c2220a76d6d505e681d8021237":"mutation CreateGitRepository ($attributes: GitAttributes!) {\n\tcreateGitRepository(attributes: $attributes) {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:3e27a6a17cfbb6f6db0ee7472736f01ea3fc36b07c7654011e2f40c4f5405e75":"query GetSentinelTiny ($id: ID!) {\n\tsentinel(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:3f077b2e9c8019b17de56676404222eb2dceb3f3cb76f6f40bccf9086217553b":"query GetDeploymentSettings {\n\tdeploymentSettings {\n\t\t... DeploymentSettingsFragment\n\t}\n}\nfragment DeploymentSettingsFragment on DeploymentSettings {\n\tid\n\tname\n\tagentHelmValues\n\tagentHelmValuesTemplateable\n\tagentVsn\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tartifactRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tdeployerRepository {\n\t\t... GitRepositoryFragment\n\t}\n\tai {\n\t\t... AISettingsFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment AISettingsFragment on AiSettings {\n\tenabled\n\tprovider\n\topenai {\n\t\tmodel\n\t}\n\tanthropic {\n\t\tmodel\n\t}\n}\n","sha256:4098e8f5d7c1242768a4330163d671ffefb47a68245a8035f1347543f7c4254d":"mutation UpdateBindingPolicy ($id: ID!, $attributes: BindingPolicyUpdateAttributes!) {\n\tupdateBindingPolicy(id: $id, attributes: $attributes) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:413142a1e1214ce0d2a445a9d9912d4b098d01e69aa9d6a35c619c0d05a8a7ed":"mutation CreateWorkbench ($attributes: WorkbenchAttributes!) {\n\tcreateWorkbench(attributes: $attributes) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:41e4f03ed32b05e32866db167f922d8092eef5aad38075b2245827da5d9ad23c":"query GetCatalogTiny ($id: ID, $name: String) {\n\tcatalog(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:42bc0bd98144dabaac9fef4c5455c391a5deb4b9a594273884aa88c59778dd9e":"query GetComplianceReportGenerator ($id: ID, $name: String) {\n\tcomplianceReportGenerator(id: $id, name: $name) {\n\t\t... ComplianceReportGeneratorFragment\n\t}\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4356bc0c1808c4f31a7a47247affbdc702e039c898d4fa26a650774b3c9f8338":"query GetAgentRunTodos ($id: ID!) {\n\tagentRun(id: $id) {\n\t\ttodos {\n\t\t\t... AgentTodoFragment\n\t\t}\n\t}\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\n","sha256:45568860a37d05e3d18ecb976ee1f222aed9a5e7a9c0fa7150c1251c9ef61fae":"mutation UpdateGlobalService ($id: ID!, $attributes: GlobalServiceAttributes!) {\n\tupdateGlobalService(id: $id, attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:45b1488b1732a010d79649d4a39feb42ce81a6842f62fa9f9c801df10136e3f8":"mutation UpsertObservabilityProvider ($attributes: ObservabilityProviderAttributes!) {\n\tupsertObservabilityProvider(attributes: $attributes) {\n\t\t... ObservabilityProviderFragment\n\t}\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:45c1ed4b2d99d030559403440ac39f886badb154fcfd4f10e301ea0a056ab824":"query GetPipelineContext ($id: ID!) {\n\tpipelineContext(id: $id) {\n\t\t... PipelineContextFragment\n\t}\n}\nfragment PipelineContextFragment on PipelineContext {\n\tid\n\tcontext\n}\n","sha256:46566d1616e7e91db2d6216bad8fe25d3985df875d9c85d06ecc1d6a9ff761d4":"mutation UpsertNotificationRouter ($attributes: NotificationRouterAttributes!) {\n\tupsertNotificationRouter(attributes: $attributes) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4664a72f360d14d57f6c374965d8d12a4795cbca5c8af739d02349214a90e3c5":"query GetScmWebhook ($id: ID, $externalId: String) {\n\tscmWebhook(id: $id, externalId: $externalId) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:4694b939a2c331cca99be014be0d45dd8756b9cfc8a2f7fed2fb0b2ae2b2b176":"query Me {\n\tme {\n\t\tid\n\t\temail\n\t\tname\n\t}\n}\n","sha256:46c0244b8b182a0be59a3619a9147a3686d4894a5403b47f4758ec7456437bbd":"query GetClusterIsoImage ($id: ID, $image: String) {\n\tclusterIsoImage(id: $id, image: $image) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:4700694be9716b23c92b557c584739bdc4f7a86d0106842f5ade8d21da402adb":"mutation EnqueueWorkbenchPrFollowup ($url: String!, $attributes: QueuedPromptAttributes!) {\n\tenqueueWorkbenchPrFollowup(url: $url, attributes: $attributes) {\n\t\t... QueuedPromptFragment\n\t\tworkbenchJob {\n\t\t\tid\n\t\t\turl\n\t\t}\n\t}\n}\nfragment QueuedPromptFragment on QueuedPrompt {\n\tid\n\tprompt\n\tdequeableAt\n\tworkbenchJob {\n\t\tid\n\t}\n\tuser {\n\t\tid\n\t}\n}\n","sha256:47dc4b6bd1139a41dc445fb76faeb339207d650f0b1b9b6991e56dbc37777de6":"query GetClusterByHandle ($handle: String) {\n\tcluster(handle: $handle) {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4889a49b7bc53288977c1d827c7e540ef407641fd1b37faf467ad3aa1fae20eb":"query ListInfrastructureStacks ($after: String, $first: Int, $before: String, $last: Int) {\n\tinfrastructureStacks(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... InfrastructureStackEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment InfrastructureStackEdgeFragment on InfrastructureStackEdge {\n\tnode {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:4a0f99c5c1ed02f2c004bf4676a192e75731634bfe4e37218dd6a34a1c95b326":"query ServiceAccounts ($after: String, $first: Int, $before: String, $last: Int, $q: String) {\n\tserviceAccounts(after: $after, first: $first, before: $before, last: $last, q: $q) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... UserFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4bb4613ac3d087f679e786b1d6a491b02d4333ca215fbdfc7233b43ab02d9f66":"query GetStackRunMinimal ($id: ID!) {\n\tstackRun(id: $id) {\n\t\t... StackRunMinimalFragment\n\t}\n}\nfragment StackRunMinimalFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\n","sha256:4bc390a223f5151c820474b4ec055094ecbbc7fb3894f9f48baa6b612ce62161":"query GetAgentRuntime ($id: ID!) {\n\tagentRuntime(id: $id) {\n\t\t... AgentRuntimeFragment\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4beb4e8b7b5844428fa204b98d19c00119ab761ba14a33d1e40e1cdebdc2365a":"mutation UpdateStackRun ($id: ID!, $attributes: StackRunAttributes!) {\n\tupdateStackRun(id: $id, attributes: $attributes) {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:4cb5452060ebdbaa1e8effa76d240b91af5cfe5e2fcc8780fa6607c298fa725d":"mutation WorkbenchPrFollowup ($url: String!, $attributes: WorkbenchMessageAttributes!) {\n\tworkbenchPrFollowup(url: $url, attributes: $attributes) {\n\t\tid\n\t\tprompt\n\t\ttype\n\t\tstatus\n\t}\n}\n","sha256:4ccc84b66170761dbc355854fbe36f2ad7914720d9026128e860a2ca679caa4b":"mutation AddStackRunLogs ($id: ID!, $attributes: RunLogAttributes!) {\n\taddRunLogs(stepId: $id, attributes: $attributes) {\n\t\tupdatedAt\n\t}\n}\n","sha256:4d391c1b966bca6a1f7392320cb12a42bb9d76c0ea06b9aee89eba25db04b08b":"mutation CreateScmWebhook ($connectionId: ID!, $owner: String!) {\n\tcreateScmWebhook(connectionId: $connectionId, owner: $owner) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:4e817a16d60e0674f5530ba1e1249840f369e23853ca214d13863f299b8f7d0e":"query GetNotificationSink ($id: ID!) {\n\tnotificationSink(id: $id) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:4e9ae0595f3f41aeefd121080484f583351451a9ed9c4a2ac21d24b375d5ae8e":"mutation UpsertComplianceReportGenerator ($attributes: ComplianceReportGeneratorAttributes!) {\n\tupsertComplianceReportGenerator(attributes: $attributes) {\n\t\t... ComplianceReportGeneratorFragment\n\t}\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:50da97f82323246c4aec944e818a055833aabfcf3e4be9d67e061fe7776ae0df":"mutation UpdateServiceDeploymentWithHandle ($cluster: String!, $name: String!, $attributes: ServiceUpdateAttributes!) {\n\tupdateServiceDeployment(cluster: $cluster, name: $name, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:527aebd2d9c8f2c1e9f845c3ab24baf3fdd536ce86a0206e14ec3b05132b3913":"mutation CreateAgentMessage ($runId: ID!, $attributes: AgentMessageAttributes!) {\n\tcreateAgentMessage(runId: $runId, attributes: $attributes) {\n\t\tid\n\t\tmessage\n\t}\n}\n","sha256:54910ed76d4c42ee7339454901466a271af34936ab345c88fb03ee4bdb763a3a":"query ListClustersWithParameters ($after: String, $first: Int, $before: String, $last: Int, $projectId: ID, $tagQuery: TagQuery) {\n\tclusters(after: $after, first: $first, before: $before, last: $last, projectId: $projectId, tagQuery: $tagQuery) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ClusterEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ClusterEdgeFragment on ClusterEdge {\n\tnode {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:54f9977d5571d11d430f63e03d6208e3a305b0e2bc32a06a1ebbebf6b4522fa3":"mutation DeletePreviewEnvironmentTemplate ($id: ID!) {\n\tdeletePreviewEnvironmentTemplate(id: $id) {\n\t\tid\n\t}\n}\n","sha256:5525b1c9bf332e1fc609b70c671ecb9ba088933b87b249f40fa1827d7db494f9":"mutation CreateClusterIsoImage ($attributes: ClusterIsoImageAttributes!) {\n\tcreateClusterIsoImage(attributes: $attributes) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:556a981320a385d7d9776830051cbf6d2127e4e538b57d3d28d1473aad5dfd33":"mutation DeleteOIDCProvider ($id: ID!, $type: OidcProviderType!) {\n\tdeleteOidcProvider(id: $id, type: $type) {\n\t\t... OIDCProviderFragment\n\t}\n}\nfragment OIDCProviderFragment on OidcProvider {\n\tid\n\tname\n\tdescription\n\tclientId\n\tclientSecret\n\tauthMethod\n\tredirectUris\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:56607343e0225629d380152b80a6aeaa8d46a2a306400b6c3f4e396595d33c33":"mutation CreateNamespace ($attributes: ManagedNamespaceAttributes!) {\n\tcreateManagedNamespace(attributes: $attributes) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:573648a4bd455ab3047a5627bd4188286785ec9d36d9a4a69d525c9999a7ead4":"mutation DeleteFederatedCredential ($id: ID!) {\n\tdeleteFederatedCredential(id: $id) {\n\t\tid\n\t}\n}\n","sha256:57790a6caa298edfdbc1f311bcb963189e1b8a519753c8029225bbc6a9d497ef":"query GetPolicy ($id: ID, $name: String) {\n\tpolicy(id: $id, name: $name) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:580fca816c2a2b2d59eb97ad4f2569218ef0685d0e724a2e0e5de4230db5aa93":"query ListGitRepositories ($cursor: String, $before: String, $last: Int) {\n\tgitRepositories(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\t... GitRepositoryEdgeFragment\n\t\t}\n\t}\n}\nfragment GitRepositoryEdgeFragment on GitRepositoryEdge {\n\tnode {\n\t\t... GitRepositoryFragment\n\t}\n\tcursor\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:5893cd09a5fbd29b0b6ce255f5e5d50e08ff164d1da91525a124b44619b58d59":"mutation CreateWorkbenchPrompt ($workbenchId: ID!, $attributes: WorkbenchPromptAttributes!) {\n\tcreateWorkbenchPrompt(workbenchId: $workbenchId, attributes: $attributes) {\n\t\tid\n\t}\n}\n","sha256:58ea9b0116be68d9f4da2ac8110d93fde21e86df23bb1ef89b982e5a16aa11ed":"mutation UpdateClusterIsoImage ($id: ID!, $attributes: ClusterIsoImageAttributes!) {\n\tupdateClusterIsoImage(id: $id, attributes: $attributes) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:594c9c271560981bef35235a0b0e29463631416f6dbf2aab24d2efb5f5395ba7":"query GetBindingPolicy ($id: ID!) {\n\tbindingPolicy(id: $id) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:594cb032bccdf14d2cae9ade9f52b20d4b56e9ab6630e299927ee9d2c9801fa5":"mutation CreateWorkbenchCron ($workbenchId: ID!, $attributes: WorkbenchCronAttributes!) {\n\tcreateWorkbenchCron(workbenchId: $workbenchId, attributes: $attributes) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:5abc2071d4557f9edd21dfc6472a9473d4b1b267eb0c3e3b8437ee1eca0e91cb":"mutation ShareSecret ($attributes: SharedSecretAttributes!) {\n\tshareSecret(attributes: $attributes) {\n\t\tname\n\t\thandle\n\t\tsecret\n\t\tinsertedAt\n\t\tupdatedAt\n\t}\n}\n","sha256:5b27782cd5302beb56aec90bd5e986f67aea75a37582b480e0860ac9242293a0":"query GetIssueWebhook ($id: ID, $name: String) {\n\tissueWebhook(id: $id, name: $name) {\n\t\t... IssueWebhookFragment\n\t}\n}\nfragment IssueWebhookFragment on IssueWebhook {\n\tid\n\tname\n\tprovider\n}\n","sha256:5baa034c528aa2f193811366642087e0b6c75c88fe1a8c5c22bc06ee75d02427":"mutation DeleteServiceContext ($id: ID!) {\n\tdeleteServiceContext(id: $id) {\n\t\t... ServiceContextFragment\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:5e4949060ce8bce3c89357a76aa82dcd88350b1965a30113a6eeeda2c424aa8d":"query ListNotificationSinks ($after: String, $first: Int, $before: String, $last: Int) {\n\tnotificationSinks(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... NotificationSinkEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment NotificationSinkEdgeFragment on NotificationSinkEdge {\n\tcursor\n\tnode {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:5e544cd179164a2409b455e448b0eed324f40742a26522fb344a1e997d2a3c80":"mutation DeleteObservabilityWebhook ($id: ID!) {\n\tdeleteObservabilityWebhook(id: $id) {\n\t\t... ObservabilityWebhookFragment\n\t}\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:5e94440e7b15f517f56955063550fd90e284a59c002e9121b8df3a45660c99fc":"query GetHelmRepository ($url: String!) {\n\thelmRepository(url: $url) {\n\t\t... HelmRepositoryFragment\n\t}\n}\nfragment HelmRepositoryFragment on HelmRepository {\n\tid\n\tinsertedAt\n\tupdatedAt\n\turl\n\tprovider\n\thealth\n}\n","sha256:5f21204c5bd4b167f535c75bbf9e260687339ea359232dce1ff84ff01bb4db0b":"query GetAgentRun ($id: ID!) {\n\tagentRun(id: $id) {\n\t\t... AgentRunFragment\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:60bb829fc0d5411b67d8e260b204b0c3118d75c022ffd368f18f7f9edc85bc5f":"query GetClusterProvider ($id: ID!) {\n\tclusterProvider(id: $id) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:60de6586577e9cb81f7c41bcf3482947a47f5da53ca1e658ea5a5764d6343aac":"mutation CreateScmWebhookPointer ($attributes: ScmWebhookAttributes!) {\n\tcreateScmWebhookPointer(attributes: $attributes) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:60e59d1ffe598a7b92e95d4feeeec19a2f2a092b1df881228829acc658b7f1e7":"query ListAgentRuntimePendingRuns ($id: ID!, $after: String, $first: Int, $before: String, $last: Int) {\n\tagentRuntime(id: $id) {\n\t\tpendingRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\t\tedges {\n\t\t\t\tnode {\n\t\t\t\t\t... AgentRunFragment\n\t\t\t\t}\n\t\t\t}\n\t\t\tpageInfo {\n\t\t\t\t... PageInfoFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:633dba4e06a7c190478b1c6d65302b9715ecbe84bc5f5bf1534286fc064c39fe":"query GetStackRunBase ($id: ID!) {\n\tstackRun(id: $id) {\n\t\t... StackRunBaseFragment\n\t}\n}\nfragment StackRunBaseFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:6374f2075fc651ba96385d190f73e93a949d38a302c3a520b9aa7b48e14986d2":"mutation DeleteClusterRegistration ($id: ID!) {\n\tdeleteClusterRegistration(id: $id) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:653bd2dca1e546786b5564738f50ef09c21243d55f0a8ff6af6613af43a6839d":"query ListClusterSentinelRunJobs ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterSentinelRunJobs(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... SentinelRunJobFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment SentinelRunJobFragment on SentinelRunJob {\n\tid\n\tcheck\n\tstatus\n\tformat\n\tusesGit\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\treference {\n\t\tname\n\t\tnamespace\n\t}\n\tsentinelRun {\n\t\t... SentinelRunFragment\n\t}\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tdistro\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:663074674ca5e1837c9a836c9ca87d011e3b82c7aee97c307816f923807f1403":"mutation CancelAgentRun ($id: ID!) {\n\tcancelAgentRun(id: $id) {\n\t\tid\n\t}\n}\n","sha256:672a471c01d8cea255bc474ee2c2b4b0bf19071e5c4cac93dd3d60de6af33c3a":"query ListBindingPolicies ($after: String, $first: Int, $before: String, $last: Int) {\n\tbindingPolicies(after: $after, first: $first, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... BindingPolicyFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:676c685a9306b2973a2921f6f0158ec0e4785aced9987122ea6ef490c93ecfb4":"mutation UpdateWorkbenchCron ($id: ID!, $attributes: WorkbenchCronAttributes!) {\n\tupdateWorkbenchCron(id: $id, attributes: $attributes) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:68d98b7ac666f84eeb85897ef3519a78ecf00304af9b78e9ae3b4c25532a4982":"mutation DeleteStackDefinition ($id: ID!) {\n\tdeleteStackDefinition(id: $id) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:68fac5688e28798e6adbf158c70679ee2e327893121a12db46a02362ac47b68c":"mutation UpdateUser ($id: ID, $attributes: UserAttributes!) {\n\tupdateUser(id: $id, attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:6c6860b13a9d0aaacfd7eb47b2c1a993768f0389f5fbe197efa64971d2e232df":"query ListHelmRepositories ($after: String, $first: Int, $before: String, $last: Int) {\n\thelmRepositories(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... HelmRepositoryFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment HelmRepositoryFragment on HelmRepository {\n\tid\n\tinsertedAt\n\tupdatedAt\n\turl\n\tprovider\n\thealth\n}\n","sha256:6cfac09e011997d8e43d520ffb21c7f2742981c3a59ba78e9274cfc750f3a991":"query ListScmWebhooks ($after: String, $before: String, $first: Int, $last: Int) {\n\tscmWebhooks(after: $after, before: $before, first: $first, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ScmWebhookFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:6fb3a6d7b695c4168b976dedfcf9a53c6ab7783770a26d4f25fa705153dae6f0":"mutation RegisterRuntimeServices ($services: [RuntimeServiceAttributes], $layout: OperationalLayoutAttributes, $deprecated: [DeprecatedCustomResourceAttributes], $serviceId: ID) {\n\tregisterRuntimeServices(services: $services, layout: $layout, deprecated: $deprecated, serviceId: $serviceId)\n}\n","sha256:6fcb5448dc8bc96c565dab0bf002bb9bcb82ad8785717de59ad14a80e4d4e178":"query GetScmConnectionByName ($name: String!) {\n\tscmConnection(name: $name) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:6fe58e154caaddb59485ac72d26e0ffee5fb864c6e1a45b31b90082830872995":"mutation DetachServiceDeployment ($id: ID!) {\n\tdetachServiceDeployment(id: $id) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:6fec0d284e2f2884e65a4de72ee9ed2673b92adfc0b19e73d970364aa3410d79":"mutation CreateCluster ($attributes: ClusterAttributes!) {\n\tcreateCluster(attributes: $attributes) {\n\t\tdeployToken\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:7022709816c360b28f659e86985f545a415f48e96b2f30ef866ea3ae97f39fa9":"query GetClusterBackup ($id: ID, $clusterId: ID, $namespace: String, $name: String) {\n\tclusterBackup(id: $id, clusterId: $clusterId, namespace: $namespace, name: $name) {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:705e50fb64758842c60cce987d7ab0eb08cf21df44eaf506ee141324260481bb":"query GetAgentRunMinimal ($id: ID!) {\n\tagentRun(id: $id) {\n\t\t... AgentRunMinimalFragment\n\t}\n}\nfragment AgentRunMinimalFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\truntime {\n\t\ttype\n\t}\n\tpullRequests {\n\t\tid\n\t\tstatus\n\t\turl\n\t\ttitle\n\t\tref\n\t}\n\tupload {\n\t\tsession\n\t\tpatch\n\t\tscreenRecording\n\t}\n}\n","sha256:70dd24813b99b33f0bd76a916a653bd40aefb7b4d1f950c1c6cfb349f5e064c7":"mutation DeleteCatalog ($id: ID!) {\n\tdeleteCatalog(id: $id) {\n\t\t... CatalogFragment\n\t}\n}\nfragment CatalogFragment on Catalog {\n\tid\n\tname\n\tdescription\n\tcategory\n\tauthor\n\tproject {\n\t\t... ProjectFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:71211688078517de55856c131211f78a9b5f707fc2c3857726fd59a81123b2b9":"query GetWorkbenchToolTiny ($id: ID, $name: String) {\n\tworkbenchTool(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:75340df6d83e5cb03878a6914da84328432f6879320e6083d0cf6fd1ba1e0a35":"mutation RollbackService ($id: ID!, $revisionId: ID!) {\n\trollbackService(id: $id, revisionId: $revisionId) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:782b1bd26714e00f7908991d5ed8af1beee25bbdb038e0885378d17a277b1929":"query GetClusterProviderByCloud ($cloud: String!) {\n\tclusterProvider(cloud: $cloud) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:78dbebdbef637a8412788971739ba9931f0eae3ae63eb7b0d0d75902620521fc":"query GetCustomStackRun ($id: ID!) {\n\tcustomStackRun(id: $id) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:7a35b4446780f4560edd416760772e7f4d9bd8193e64e39d945a0ca57e6d5799":"mutation UpdateAgentMessage ($id: ID!, $attributes: AgentMessageAttributes!) {\n\tupdateAgentMessage(id: $id, attributes: $attributes) {\n\t\tid\n\t\tmessage\n\t}\n}\n","sha256:7a526118f0ec20a508e94f419446156ab87b99bd9ff5700c13cf8612f6e8be8d":"query GetObserver ($id: ID, $name: String) {\n\tobserver(id: $id, name: $name) {\n\t\t... ObserverFragment\n\t}\n}\nfragment ObserverFragment on Observer {\n\tid\n\tname\n\tstatus\n\tcrontab\n\ttarget {\n\t\t... ObserverTargetFragment\n\t}\n\tactions {\n\t\t... ObserverActionFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ObserverTargetFragment on ObserverTarget {\n\thelm {\n\t\t... ObserverHelmRepoFragment\n\t}\n\toci {\n\t\t... ObserverOciRepoFragment\n\t}\n}\nfragment ObserverHelmRepoFragment on ObserverHelmRepo {\n\turl\n\tchart\n\tprovider\n}\nfragment ObserverOciRepoFragment on ObserverOciRepo {\n\turl\n\tprovider\n}\nfragment ObserverActionFragment on ObserverAction {\n\ttype\n\tconfiguration {\n\t\t... ObserverActionConfigurationFragment\n\t}\n}\nfragment ObserverActionConfigurationFragment on ObserverActionConfiguration {\n\tpr {\n\t\t... ObserverPrActionFragment\n\t}\n\tpipeline {\n\t\t... ObserverPipelineActionFragment\n\t}\n}\nfragment ObserverPrActionFragment on ObserverPrAction {\n\tautomationId\n\trepository\n\tbranchTemplate\n\tcontext\n}\nfragment ObserverPipelineActionFragment on ObserverPipelineAction {\n\tpipelineId\n\tcontext\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\n","sha256:7bb99a71a060105e0369bd65dfbef40cfaefd3bf24f3a20be6bba8ebe0f5d151":"query ListPolicies ($after: String, $first: Int, $before: String, $last: Int, $projectId: ID, $q: String) {\n\tpolicies(after: $after, first: $first, before: $before, last: $last, projectId: $projectId, q: $q) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... PolicyFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:7bf259965e095c6f562ceabf64b53c96f2af8c279f8f585ae46150d432e15177":"mutation DeleteAgentRuntime ($id: ID!) {\n\tdeleteAgentRuntime(id: $id) {\n\t\tid\n\t}\n}\n","sha256:7c28e35a508edb6910ec148143db545bf6ceae2d3f89d99dd12108d55cbace2e":"query ListProviders {\n\tclusterProviders(first: 100) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ClusterProviderFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:7d305588dda783d061b91186810d26c83dc96ce88ca6eadd3dc0aeb8e5c2b1e9":"query GetObservabilityWebhook ($id: ID, $name: String) {\n\tobservabilityWebhook(id: $id, name: $name) {\n\t\t... ObservabilityWebhookFragment\n\t}\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:7e2b1754c1a0096773632c812c86d3e0e73c8bd0ff4e4de4e783b3afc545c212":"query GetTinyCluster ($id: ID) {\n\tcluster(id: $id) {\n\t\t... TinyClusterFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:7fc3c4c26cd7f027d90210964398854eebe7e5ce7bb518f4c8839505a4b4fcb3":"mutation AddGroupMember ($groupId: ID!, $userId: ID!) {\n\tcreateGroupMember(groupId: $groupId, userId: $userId) {\n\t\t... GroupMemberFragment\n\t}\n}\nfragment GroupMemberFragment on GroupMember {\n\tid\n\tuser {\n\t\tid\n\t}\n\tgroup {\n\t\tid\n\t}\n}\n","sha256:806453fdd48b0a0eae70fc366b758b34c1fb7290ff39b393794e5181fe7664ae":"query GetGitRepositoryID ($url: String) {\n\tgitRepository(url: $url) {\n\t\t... {\n\t\t\tid\n\t\t}\n\t}\n}\n","sha256:808ebe4bf5034aa84eae9f40e3b4046bd9d0961b9c6c15acc96c29a5c2ba961b":"mutation CreateGlobalService ($attributes: GlobalServiceAttributes!) {\n\tcreateGlobalService(attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:812b636e5bfc0c485832996d9aed1a5826dc9a1d48e1b65ff68774f2c97e89c9":"query ListClusterServices {\n\tclusterServices {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:825ebd6ac166846c04631143991b97b8170a7a9d266ebb1c9331a9976a20d30f":"query GetClusterGates {\n\tclusterGates {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:82a9426820e1787f567e38edbce7759b05900a1ec3721d17f883dd62ebc6642c":"query GetPrAutomation ($id: ID!) {\n\tprAutomation(id: $id) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:836475a72bf4f3ebb0e1fcd945018865862b53cb7616f62ba213c2fd5fe69d05":"query ListViolationStatistics ($field: ConstraintViolationField!) {\n\tviolationStatistics(field: $field) {\n\t\t... ViolationStatisticFragment\n\t}\n}\nfragment ViolationStatisticFragment on ViolationStatistic {\n\tvalue\n\tviolations\n\tcount\n}\n","sha256:83b4333debfd340763ef190910485c333c6dd49d47110057df60be57da770157":"mutation DeleteNotificationRouter ($id: ID!) {\n\tdeleteNotificationRouter(id: $id) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:843362e6b99d63d6a55e850db9f69b9b09f86278c3eb97dca4f720100546283d":"query GetMCPServer ($id: ID!) {\n\tmcpServer(id: $id) {\n\t\t... MCPServerFragment\n\t}\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\n","sha256:851d296b63f9c0c937e82a454781e76d918b708a27c3e264069902f71eff5d6d":"mutation CreateStack ($attributes: StackAttributes!) {\n\tcreateStack(attributes: $attributes) {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:857bac887a978a2ac4f093331e7384dfb57425924b0a1bd5a09ffa9e04844819":"mutation UpdateOIDCProvider ($id: ID!, $type: OidcProviderType!, $attributes: OidcProviderAttributes!) {\n\tupdateOidcProvider(id: $id, type: $type, attributes: $attributes) {\n\t\t... OIDCProviderFragment\n\t}\n}\nfragment OIDCProviderFragment on OidcProvider {\n\tid\n\tname\n\tdescription\n\tclientId\n\tclientSecret\n\tauthMethod\n\tredirectUris\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:85df9e68d83e11a9f9321348538306287166a75d4ab75ab2b48855e80d8b39d2":"mutation DeleteBootstrapToken ($id: ID!) {\n\tdeleteBootstrapToken(id: $id) {\n\t\tid\n\t}\n}\n","sha256:8670eabfee3682802dbfd5c68f5e72b37119ec31e909f425655206ed9d5a18ec":"mutation UpdateFederatedCredential ($id: ID!, $attributes: FederatedCredentialAttributes!) {\n\tupdateFederatedCredential(id: $id, attributes: $attributes) {\n\t\t... FederatedCredentialFragment\n\t}\n}\nfragment FederatedCredentialFragment on FederatedCredential {\n\tid\n\tclaimsLike\n\tissuer\n\tscopes\n\tinsertedAt\n\tupdatedAt\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n}\n","sha256:86eb778bec88542b242c634b49a9073f61d1a6ea3c569519f7ac3281203bdf6f":"mutation DeleteBindingPolicy ($id: ID!) {\n\tdeleteBindingPolicy(id: $id) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:891cd1d4fbd8a953702cf2564d83f04e8bc76746d689988b9200ec64b2553336":"mutation RunSentinel ($id: ID!, $overrides: SentinelRunOverrides) {\n\trunSentinel(id: $id, overrides: $overrides) {\n\t\t... SentinelRunFragment\n\t}\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:897d62511eba988b849bd933c4ecb4586c6cf041aa66da4bc33967b3304da588":"mutation DeleteProject ($id: ID!) {\n\tdeleteProject(id: $id) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:8c0caea577e1915120cdd7b5231a7f1a58eb0c339d1aaf024f8aa120902a7442":"mutation CreateClusterBackup ($attributes: BackupAttributes!) {\n\tcreateClusterBackup(attributes: $attributes) {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:8c44743ad7a874271ddb162b00027395262b0ac38d0322a4f09afe48f5c442e2":"mutation UpdateAgentRunAnalysis ($id: ID!, $attributes: AgentAnalysisAttributes!) {\n\tupdateAgentRunAnalysis(id: $id, attributes: $attributes) {\n\t\t... AgentRunBaseFragment\n\t}\n}\nfragment AgentRunBaseFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tmode\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\n","sha256:8ca4f731dfc18a56ba661dcbba9c673f55aee501b263dbf655e67788eefec1eb":"query ListClusterMinimalStacks ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterStackRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... MinimalStackRunEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment MinimalStackRunEdgeFragment on StackRunEdge {\n\tnode {\n\t\t... StackRunMinimalFragment\n\t}\n}\nfragment StackRunMinimalFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\n","sha256:8d30669f0383e625d9b639af9cf66ccdb9458850496a8cbf656780348b7c7766":"mutation UpdateWorkbenchWebhook ($id: ID!, $attributes: WorkbenchWebhookAttributes!) {\n\tupdateWorkbenchWebhook(id: $id, attributes: $attributes) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:8d31d95b1fa3ae035864ae7aab5e31a31347f5c3a9654ea25237813800fb2c6c":"query GetSentinel ($id: ID!) {\n\tsentinel(id: $id) {\n\t\t... SentinelFragment\n\t}\n}\nfragment SentinelFragment on Sentinel {\n\tid\n\tname\n\tdescription\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:8e8fd8e272f046273e47c808d99bd0dd91b158e3c23175488c07482dc99b3a2b":"mutation UpsertNotificationSink ($attributes: NotificationSinkAttributes!) {\n\tupsertNotificationSink(attributes: $attributes) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:8f12d8cad53529ad1067b2ad72f6dc4ca662168c0268c3bbc027db8f662ef925":"query GetAgentUrl ($id: ID!) {\n\tcluster(id: $id) {\n\t\tagentUrl\n\t}\n}\n","sha256:8fa6f7a3f1ca23ce9e7d886bb84c023f4be92f923d057ce7bd97e95a41e541a0":"query GetDeploymentSettingsMinimal {\n\tdeploymentSettings {\n\t\t... DeploymentSettingsMinimalFragment\n\t}\n}\nfragment DeploymentSettingsMinimalFragment on DeploymentSettings {\n\tagentHelmValues\n\tagentVsn\n}\n","sha256:901e2e68afb969b6cc521cb1f1f3e0d134e6f0f11b9f24dcb288b95cc2a6e39e":"mutation CreateServiceAccount ($attributes: ServiceAccountAttributes!) {\n\tcreateServiceAccount(attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:90314a4b07d2a45508cf458997cf53a19dd5eb958764462f71e43f062128f3db":"query GetMCPServers ($q: String, $first: Int, $after: String, $before: String, $last: Int) {\n\tmcpServers(q: $q, first: $first, after: $after, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... MCPServerFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\n","sha256:910b361b6f8a5a95c6ddfd9d86bbeba38445e6242537e44f8a71f1294a098d31":"mutation UpsertVulnerabilities ($vulnerabilities: [VulnerabilityReportAttributes]) {\n\tupsertVulnerabilities(vulnerabilities: $vulnerabilities)\n}\n","sha256:91104bc566948580b79bda2fc4bf5cac926cf9bf185468a2e32653a9aaef8292":"mutation UpdateCluster ($id: ID!, $attributes: ClusterUpdateAttributes!) {\n\tupdateCluster(id: $id, attributes: $attributes) {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:9189c9e78cd7eb57a9e67c9b09905683e01f2864e5e49516cac6beeaae44ce28":"query ListObservabilityWebhooks ($after: String, $before: String, $first: Int, $last: Int) {\n\tobservabilityWebhooks(after: $after, before: $before, first: $first, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ObservabilityWebhookFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:921369b1661c3b6001335e7a580e5d3b9e04a2792231cde13dc7b98159790d97":"mutation UpdatePrAutomation ($id: ID!, $attributes: PrAutomationAttributes!) {\n\tupdatePrAutomation(id: $id, attributes: $attributes) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:929cc36181b7f6e09352f8e2776a66a3876c5fdd3ce60ab2637ac4dad4340cc0":"query PagedClusterServicesForAgent ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterServices(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragmentForAgent\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ServiceDeploymentEdgeFragmentForAgent on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentForAgent\n\t}\n}\nfragment ServiceDeploymentForAgent on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\ttarball\n\tdeletedAt\n\tdryRun\n\ttemplated\n\tsha\n\tstatus\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tself\n\t\tversion\n\t\tpingedAt\n\t\tmetadata\n\t\ttags {\n\t\t\t... ClusterTags\n\t\t}\n\t\tcurrentVersion\n\t\tkasUrl\n\t\tdistro\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\thelm {\n\t\trelease\n\t\tvaluesFiles\n\t\tvalues\n\t\tignoreHooks\n\t\tignoreCrds\n\t\tluaScript\n\t\tluaFile\n\t\tluaFolder\n\t\tpythonScript\n\t\tpythonFile\n\t\tpythonFolder\n\t\tkustomizePostrender\n\t}\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tcontexts {\n\t\tname\n\t\tconfiguration\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tdeleteNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\trevision {\n\t\tid\n\t}\n\timports {\n\t\tid\n\t\tstack {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t\toutputs {\n\t\t\tname\n\t\t\tvalue\n\t\t\tsecret\n\t\t}\n\t}\n\trenderers {\n\t\t... RendererFragment\n\t}\n\tdependencies {\n\t\t... ServiceDependencyFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment RendererFragment on Renderer {\n\tpath\n\ttype\n\thelm {\n\t\t... HelmMinimalFragment\n\t}\n}\nfragment HelmMinimalFragment on HelmMinimal {\n\tvalues\n\tvaluesFiles\n\trelease\n\tignoreHooks\n}\nfragment ServiceDependencyFragment on ServiceDependency {\n\tid\n\tname\n}\n","sha256:930b441c217f098b4a06fe5ee2b3413b71ddfeb7a14fd5a3f34e9eb094cf38c7":"query GetNotificationSinkByName ($name: String) {\n\tnotificationSink(name: $name) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:9408ad873dfdbd82d7e41d8dbff8b46185dea3a6f1fa49dec03cd60ebbc1e830":"query GetGroupTiny ($name: String!) {\n\tgroup(name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:945929e80092a3ddfffa063c66ef0f3daaf82409c169e3e7127fafed50a14ab2":"query ListNamespaces ($after: String, $first: Int, $before: String, $last: Int) {\n\tmanagedNamespaces(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ManagedNamespaceEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ManagedNamespaceEdgeFragment on ManagedNamespaceEdge {\n\tcursor\n\tnode {\n\t\t... ManagedNamespaceMinimalFragment\n\t}\n}\nfragment ManagedNamespaceMinimalFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n}\n","sha256:953c6871b8ad6a66454c4be5f93053bbfb913d5da336e4a83e9ba1f702561273":"mutation DeleteUser ($id: ID!) {\n\tdeleteUser(id: $id) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:95f63c044687b9aeb755352caddb8fae1cff74a694a8d44c20c2669e786b4f82":"query ListServiceDeployment ($after: String, $before: String, $last: Int, $clusterId: ID) {\n\tserviceDeployments(after: $after, first: 100, before: $before, last: $last, clusterId: $clusterId) {\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragment\n\t\t}\n\t}\n}\nfragment ServiceDeploymentEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:960457be7108f80ff02c924d123a5a85a8ea8df66a779785b18eb8376f72f525":"mutation DeleteClusterIsoImage ($id: ID!) {\n\tdeleteClusterIsoImage(id: $id) {\n\t\t... ClusterIsoImageFragment\n\t}\n}\nfragment ClusterIsoImageFragment on ClusterIsoImage {\n\tid\n\timage\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tregistry\n\tuser\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:96e9ad521bf896ffa2f2b2b584ef7d8216073289a30bdfe8de3ca0e6241057f1":"mutation UpdateWorkbenchPrompt ($id: ID!, $attributes: WorkbenchPromptAttributes!) {\n\tupdateWorkbenchPrompt(id: $id, attributes: $attributes) {\n\t\tid\n\t}\n}\n","sha256:97134516f2bf93fd448744222727bc2d4b9c4778c529fecc1d68766696fc4ad5":"query GetScmConnection ($id: ID!) {\n\tscmConnection(id: $id) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:980afba6c180a980bcf9a8639972cfe0612f6251116bf78b86442ade3cda51c3":"query GetWorkbenchTiny ($id: ID, $name: String) {\n\tworkbench(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:9827fcdc2ff6a39a12b07c9f580189df66b547435d5077b4348d57534c3981f5":"query TokenExchange ($token: String!) {\n\ttokenExchange(token: $token) {\n\t\t... UserFragment\n\t\tgroups {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t\tboundRoles {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:98630448e8dfa27ddc91790290e32ffc4f4ebee749bd1a8f890940c6f637bcb8":"query PagedClusterGateIDs ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterGates(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... PipelineGateIDsEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment PipelineGateIDsEdgeFragment on PipelineGateEdge {\n\tnode {\n\t\t... {\n\t\t\tid\n\t\t}\n\t}\n}\n","sha256:99cf665c8973fc5fbe75bbb8053212dd63bbd38fae367116c111ae69665385fb":"query ListScmConnections ($cursor: String, $before: String, $last: Int) {\n\tscmConnections(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ScmConnectionFragment\n\t\t\t}\n\t\t\tcursor\n\t\t}\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:9a1a0ff9faec767fdd76670f61d6f07e3bfb6f87e38e9f7258337ec4d55ef49c":"query GetServiceDeploymentByHandle ($cluster: String!, $name: String!) {\n\tserviceDeployment(cluster: $cluster, name: $name) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:9c6c086b73a8e8893f47aebd4f4b3fa31e6a323f54e4f49bad3390f41ff55e77":"mutation UpdateProject ($id: ID!, $attributes: ProjectAttributes!) {\n\tupdateProject(id: $id, attributes: $attributes) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:9fb8d63cdb26f2f0c24141600a2e63734c288a3721a76322410265f4f2979d35":"query GetClusterRegistrations ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterRegistrations(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ClusterRegistrationFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:a09067ffa71e8f8b2a7a319ff96f0a79b1e54733cc99029952e2744ebcb93e8d":"mutation CreateGroup ($attributtes: GroupAttributes!) {\n\tcreateGroup(attributes: $attributtes) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:a16b1da2c5e2560270870aa279c534d36db2d0dc8abfb0c21578fc61fc7a6b00":"query ListPrAutomations ($cursor: String, $before: String, $last: Int) {\n\tprAutomations(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... PrAutomationFragment\n\t\t\t}\n\t\t\tcursor\n\t\t}\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:a21b5e44c5251b2393d36641f8e80e67318a9fe5cbd5a5a5010c21ee2deeb985":"mutation DeleteWorkbenchCron ($id: ID!) {\n\tdeleteWorkbenchCron(id: $id) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:a334251e65b8ab49ef2c93cf1b71d07822fb6b8f9201095cd5490fd1deab6e8e":"query ListServiceDeployments ($cursor: String, $before: String, $last: Int) {\n\tserviceDeployments(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ServiceDeploymentFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:a44c40a19e2a6fdec2c6ebc9a7d8d85f004466fc628e568ef27a4973c6e4ae38":"mutation GetWorkbenchCron ($id: ID!) {\n\tworkbenchCron(id: $id) {\n\t\t... WorkbenchCronFragment\n\t}\n}\nfragment WorkbenchCronFragment on WorkbenchCron {\n\tid\n\tcrontab\n\tprompt\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:a6982b6bb2f74922ef5d6e2368ac42f8a499ad17f16f819a0f64e89b0c20abe0":"mutation DeleteWorkbenchWebhook ($id: ID!) {\n\tdeleteWorkbenchWebhook(id: $id) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:a7c3ab7455fa73c5f0171b092aafbfee2c47186ef1e6053d5ba99e5b264b4b16":"query GetCatalog ($id: ID, $name: String) {\n\tcatalog(id: $id, name: $name) {\n\t\t... CatalogFragment\n\t}\n}\nfragment CatalogFragment on Catalog {\n\tid\n\tname\n\tdescription\n\tcategory\n\tauthor\n\tproject {\n\t\t... ProjectFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:a84f8942424abe644392066d12e351e0835027df1720d80bfa24f202b38a9dfd":"query GetNamespace ($id: ID!) {\n\tmanagedNamespace(id: $id) {\n\t\t... ManagedNamespaceFragment\n\t}\n}\nfragment ManagedNamespaceFragment on ManagedNamespace {\n\tid\n\tname\n\tdescription\n\tlabels\n\tannotations\n\tpullSecrets\n\tservice {\n\t\t... ServiceTemplateFragment\n\t}\n\ttarget {\n\t\t... ClusterTargetFragment\n\t}\n\tdeletedAt\n}\nfragment ServiceTemplateFragment on ServiceTemplate {\n\tname\n\tnamespace\n\ttemplated\n\trepositoryId\n\tcontexts\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tsyncConfig {\n\t\t... SyncConfigFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment SyncConfigFragment on SyncConfig {\n\tcreateNamespace\n\tnamespaceMetadata {\n\t\t... NamespaceMetadataFragment\n\t}\n}\nfragment NamespaceMetadataFragment on NamespaceMetadata {\n\tlabels\n\tannotations\n}\nfragment ClusterTargetFragment on ClusterTarget {\n\ttags\n\tdistro\n}\n","sha256:a8ce65444a9c0e953ccc22260b021bf84771782d619f4d9f940867bdaf01d9df":"mutation DeleteStack ($id: ID!) {\n\tdeleteStack(id: $id) {\n\t\t... InfrastructureStackIdFragment\n\t}\n}\nfragment InfrastructureStackIdFragment on InfrastructureStack {\n\tid\n}\n","sha256:a91f084bbbd85931d0e231c6caf2d1280b97dd1f9c7a1fb574192f3710106563":"mutation UpsertHelmRepository ($url: String!, $attributes: HelmRepositoryAttributes) {\n\tupsertHelmRepository(url: $url, attributes: $attributes) {\n\t\t... HelmRepositoryFragment\n\t}\n}\nfragment HelmRepositoryFragment on HelmRepository {\n\tid\n\tinsertedAt\n\tupdatedAt\n\turl\n\tprovider\n\thealth\n}\n","sha256:a929072c59cbb7e762fec990adb41cf6cf80c06d00bbd0caa372f6bd4661b053":"query GetClusterWithToken ($id: ID, $handle: String) {\n\tcluster(id: $id, handle: $handle) {\n\t\t... ClusterFragment\n\t\tdeployToken\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:a9481fbef0ee5faac5f98ff86f1fcc351aef26a41e52daf22428135a715824b1":"query PagedClusterGates ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterGates(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... PipelineGateEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment PipelineGateEdgeFragment on PipelineGateEdge {\n\tnode {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:aa077f5ef1fd98bb3909a063b4f4f6d722ee4355e2006aa48a80a5a3f34a988d":"mutation DeleteScmConnection ($id: ID!) {\n\tdeleteScmConnection(id: $id) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:aa987069b6edaf93d75eb44ab52356a7374b4ea4669b503729dc5209e4ba85e2":"query GetServiceDeploymentComponents ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\tid\n\t\tcomponents {\n\t\t\tkind\n\t\t\tstate\n\t\t}\n\t}\n}\n","sha256:abd3ae6e1fb895e3c792f77c5ec324b372ffc85abb94f26772455a98f547ef0a":"mutation UpdateScmConnection ($id: ID!, $attributes: ScmConnectionAttributes!) {\n\tupdateScmConnection(id: $id, attributes: $attributes) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:acdaf678c528e8bf7724301610dd4dd6304314c59d436e8e5452073068a143fc":"mutation DeleteGlobalService ($id: ID!) {\n\tdeleteGlobalService(id: $id) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:ad10097393ee33916a9be2804e6c786bb8f42679e64049dcf17eb8dd2cf79ef1":"query PagedClusterServiceIds ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterServices(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ServiceDeploymentIdEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ServiceDeploymentIdEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentIdFragment\n\t}\n}\nfragment ServiceDeploymentIdFragment on ServiceDeployment {\n\tid\n}\n","sha256:adee195af481a8e2bdd38909764b70bbb0011f77789ef14872c4e5a8fb6e5919":"mutation UpdateAgentRun ($id: ID!, $attributes: AgentRunStatusAttributes!) {\n\tupdateAgentRun(id: $id, attributes: $attributes) {\n\t\t... AgentRunFragment\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:af037c14ab732c3150f56513fcdbf6187c36457b52c13b05928e9dea542d3f97":"query GetProject ($id: ID, $name: String) {\n\tproject(id: $id, name: $name) {\n\t\t... ProjectFragment\n\t}\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:aff1e211314f3b4f2795d03b2a40b9302661e9b92c8cc49c6c46c2758274c875":"mutation UpdateWorkbench ($id: ID!, $attributes: WorkbenchAttributes!) {\n\tupdateWorkbench(id: $id, attributes: $attributes) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b0c7d62eece94e065f18516cf7006281428f4ff44ecd903fb3fbcf334d99deac":"mutation CreateQueuedPrompt ($jobId: ID!, $attributes: QueuedPromptAttributes!) {\n\tcreateQueuedPrompt(jobId: $jobId, attributes: $attributes) {\n\t\t... QueuedPromptFragment\n\t}\n}\nfragment QueuedPromptFragment on QueuedPrompt {\n\tid\n\tprompt\n\tdequeableAt\n\tworkbenchJob {\n\t\tid\n\t}\n\tuser {\n\t\tid\n\t}\n}\n","sha256:b220576f4e2238111c178658b7e3e11c7a2fc482e1d1145c94aab213f2595242":"mutation DeleteGroupMember ($userId: ID!, $groupId: ID!) {\n\tdeleteGroupMember(userId: $userId, groupId: $groupId) {\n\t\t... GroupMemberFragment\n\t}\n}\nfragment GroupMemberFragment on GroupMember {\n\tid\n\tuser {\n\t\tid\n\t}\n\tgroup {\n\t\tid\n\t}\n}\n","sha256:b344029ffce5a39a293ead846a55b56059495641da56fe8b536d4e12f9b22b71":"query GetWorkbench ($id: ID, $name: String) {\n\tworkbench(id: $id, name: $name) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b3c5a853563920b74b4e2d1687e851e198d53c61d2d42df5642261d732841cc6":"mutation DeletePolicy ($id: ID!) {\n\tdeletePolicy(id: $id) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:b48053dac3c5ecd9ab8e99a7f29f52b25c13f7f191203637fb43f1833a30d335":"query ListServiceDeploymentByHandle ($after: String, $before: String, $last: Int, $cluster: String) {\n\tserviceDeployments(after: $after, first: 100, before: $before, last: $last, cluster: $cluster) {\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragment\n\t\t}\n\t}\n}\nfragment ServiceDeploymentEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n","sha256:b5aade690f9187a9eb7b67156c989946e1f652356238ffb859cf67c002dd5b20":"query GetServiceDeploymentForAgent ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\t... ServiceDeploymentForAgent\n\t}\n}\nfragment ServiceDeploymentForAgent on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\ttarball\n\tdeletedAt\n\tdryRun\n\ttemplated\n\tsha\n\tstatus\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tself\n\t\tversion\n\t\tpingedAt\n\t\tmetadata\n\t\ttags {\n\t\t\t... ClusterTags\n\t\t}\n\t\tcurrentVersion\n\t\tkasUrl\n\t\tdistro\n\t}\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\thelm {\n\t\trelease\n\t\tvaluesFiles\n\t\tvalues\n\t\tignoreHooks\n\t\tignoreCrds\n\t\tluaScript\n\t\tluaFile\n\t\tluaFolder\n\t\tpythonScript\n\t\tpythonFile\n\t\tpythonFolder\n\t\tkustomizePostrender\n\t}\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tcontexts {\n\t\tname\n\t\tconfiguration\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tdeleteNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\trevision {\n\t\tid\n\t}\n\timports {\n\t\tid\n\t\tstack {\n\t\t\tid\n\t\t\tname\n\t\t}\n\t\toutputs {\n\t\t\tname\n\t\t\tvalue\n\t\t\tsecret\n\t\t}\n\t}\n\trenderers {\n\t\t... RendererFragment\n\t}\n\tdependencies {\n\t\t... ServiceDependencyFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment RendererFragment on Renderer {\n\tpath\n\ttype\n\thelm {\n\t\t... HelmMinimalFragment\n\t}\n}\nfragment HelmMinimalFragment on HelmMinimal {\n\tvalues\n\tvaluesFiles\n\trelease\n\tignoreHooks\n}\nfragment ServiceDependencyFragment on ServiceDependency {\n\tid\n\tname\n}\n","sha256:b6344198b643d2b030241e4ba06a7a808511584a5ddc52dabbbcc1b896c989ff":"mutation CloneServiceDeploymentWithHandle ($clusterId: ID!, $cluster: String!, $name: String!, $attributes: ServiceCloneAttributes!) {\n\tcloneService(clusterId: $clusterId, cluster: $cluster, name: $name, attributes: $attributes) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:b640b4ec159932cdb9519e0edba90585ba6552f8637f5a3136ecca8c7c4b33c5":"query ListClusters ($cursor: String, $before: String, $last: Int) {\n\tclusters(after: $cursor, first: 100, before: $before, last: $last) {\n\t\tedges {\n\t\t\t... ClusterEdgeFragment\n\t\t}\n\t}\n}\nfragment ClusterEdgeFragment on ClusterEdge {\n\tnode {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b6bb1e90c1b8586144c0060e4b38c1d76124d80c3d4ae2d7b1f6ada4251afedf":"mutation UpdateServiceDeployment ($id: ID!, $attributes: ServiceUpdateAttributes!) {\n\tupdateServiceDeployment(id: $id, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:b77c4291ae27a7349ae24c8c3963ce23ff5daed32c51eb1275dbccd1df6fcbe1":"query GetObservabilityProvider ($id: ID, $name: String) {\n\tobservabilityProvider(id: $id, name: $name) {\n\t\t... ObservabilityProviderFragment\n\t}\n}\nfragment ObservabilityProviderFragment on ObservabilityProvider {\n\tid\n\tname\n\ttype\n\tupdatedAt\n\tinsertedAt\n}\n","sha256:b80a7faf4eee40b6c3823963dcf3614aa12035c3da6b317cb8208ccc4f6ac8b7":"query GetPrAutomationByName ($name: String!) {\n\tprAutomation(name: $name) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:b83ec626d13be86492db9fd86946d48b92e7e29239c0ff5600ac0e6006109e5c":"mutation CreateProviderCredential ($attributes: ProviderCredentialAttributes!, $name: String!) {\n\tcreateProviderCredential(attributes: $attributes, name: $name) {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:b87afc4a88b126bb018cbdee0a2d9f5c3552d1a2d9b032cdd1875023c2680da4":"mutation DeleteComplianceReportGenerator ($id: ID!) {\n\tdeleteComplianceReportGenerator(id: $id) {\n\t\t... ComplianceReportGeneratorFragment\n\t}\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:b88dad5dbf1911bf14fc349f8f14568b3cea7b12079ba4f50b80360a8a05d063":"mutation CreateGlobalServiceDeployment ($serviceId: ID!, $attributes: GlobalServiceAttributes!) {\n\tcreateGlobalService(serviceId: $serviceId, attributes: $attributes) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:b92d34e46bb45d51af62431f19f46a643594ab8d2ace6ee0cdd7d2f9076c4116":"mutation UpsertPolicyConstraints ($constraints: [PolicyConstraintAttributes!]) {\n\tupsertPolicyConstraints(constraints: $constraints)\n}\n","sha256:b93ae4d17a11b60381e132d78df0ec8d9431bbf834517cc47ab74f83c7ef87aa":"mutation CreateServiceAccountToken ($id: ID!, $scopes: [ScopeAttributes], $expiry: String) {\n\tcreateServiceAccountToken(id: $id, scopes: $scopes, expiry: $expiry) {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:b97ad5c22e824cb03ea1120d22df72eb1a45c6e18b82b399000786edf1fb6635":"mutation DeleteSentinel ($id: ID!) {\n\tdeleteSentinel(id: $id) {\n\t\tid\n\t}\n}\n","sha256:babd1fcf26e7e8d1243a3f92bb3135de93cd73b0bb5d4e28e40bd650bcbdfd1d":"query GetWorkbenchPrompt ($id: ID!) {\n\tworkbenchPrompt(id: $id) {\n\t\t... WorkbenchPromptFragment\n\t}\n}\nfragment WorkbenchPromptFragment on WorkbenchPrompt {\n\tid\n\ttitle\n\tcategory\n\tprompt\n}\n","sha256:bb41a2b83ff40ea0e043a1edace47470f4c97a1b20b95d0c8b862e85ce5ad54f":"query GetUser ($email: String!) {\n\tuser(email: $email) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:bcaa00aae81a591bfbc55c97d7d7fab286def9d56608d84929c4e948dbea70da":"mutation CreateClusterRegistration ($attributes: ClusterRegistrationCreateAttributes!) {\n\tcreateClusterRegistration(attributes: $attributes) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:bcc887913f98c41acf007562df28e5875b1aaba723fd60ce3718ce59f78c46c2":"mutation DeletePersona ($id: ID!) {\n\tdeletePersona(id: $id) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:be6f160416467f5e1c4f5f50a1549a66bbc8069b3b54836348e3be3507cdc897":"query GetPrGovernance ($id: ID, $name: String) {\n\tprGovernance(id: $id, name: $name) {\n\t\t... PrGovernanceFragment\n\t}\n}\nfragment PrGovernanceFragment on PrGovernance {\n\tid\n\tname\n}\n","sha256:becbe7cfde6f4a45472afa3838782c007a7ca917e38ba1c6e9994f66543401c1":"mutation UpdateStackRunStep ($id: ID!, $attributes: RunStepAttributes!) {\n\tupdateRunStep(id: $id, attributes: $attributes) {\n\t\t... RunStepFragment\n\t}\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\n","sha256:bef364b9855a0f6ff2adb5d11c887b240e54f9ccad79cf8cb5a687a5f01fe216":"query ListProjects ($after: String, $before: String, $first: Int, $last: Int, $q: String) {\n\tprojects(after: $after, before: $before, first: $first, last: $last, q: $q) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ProjectFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:bf5e9b738fb2b1a68f843372e8c2e91e18668242bf1fafa6742714dde3380675":"query ListAgentRuns ($after: String, $first: Int, $before: String, $last: Int) {\n\tagentRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AgentRunFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:bfaf5cbd07eaa142e0d849d06d5e5b453aa32d0c6eeace81fa1933d76650e234":"mutation CreateClusterRestore ($backupId: ID!) {\n\tcreateClusterRestore(backupId: $backupId) {\n\t\t... ClusterRestoreFragment\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:bfb0af0255fcb8a8df9b9a92adc450dc9d7b73aecfb9d984041d36741ab28357":"query GetPolicyTiny ($id: ID, $name: String) {\n\tpolicy(id: $id, name: $name) {\n\t\t... TinyPolicyFragment\n\t}\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:c064e0789ac325d358976a1f68ae61f2d0fd196ac6452d2a0d89e14dc0a8f106":"mutation updateServiceComponents ($id: ID!, $components: [ComponentAttributes], $revisionId: ID!, $sha: String, $errors: [ServiceErrorAttributes], $metadata: ServiceMetadataAttributes) {\n\tupdateServiceComponents(id: $id, components: $components, revisionId: $revisionId, sha: $sha, errors: $errors, metadata: $metadata) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:c09faa203ac4b24e71309d89522aeb52d09256d884896870c257c57940b352ae":"mutation CreateAccessToken {\n\tcreateAccessToken {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:c0b9e33345dc718f8fb3c28711b5694a0b0e04be77e9faf13094cbecb500eeab":"mutation UpsertPreviewEnvironmentTemplate ($attributes: PreviewEnvironmentTemplateAttributes!) {\n\tupsertPreviewEnvironmentTemplate(attributes: $attributes) {\n\t\t... PreviewEnvironmentTemplateFragment\n\t}\n}\nfragment PreviewEnvironmentTemplateFragment on PreviewEnvironmentTemplate {\n\tid\n\tname\n\tcommentTemplate\n\tflow {\n\t\tid\n\t}\n\tconnection {\n\t\tid\n\t}\n\ttemplate {\n\t\tname\n\t}\n}\n","sha256:c115b884fcc5aa8a05486db11aec7c66d51336be00dbcb79b14276e983bcf4c4":"mutation UpsertCustomCompatibilityMatrix ($attributes: CustomCompatibilityMatrixAttributes!) {\n\tupsertCustomCompatibilityMatrix(attributes: $attributes) {\n\t\t... CustomCompatibilityMatrixFragment\n\t}\n}\nfragment CustomCompatibilityMatrixFragment on CustomCompatibilityMatrix {\n\tid\n\tname\n}\n","sha256:c1242302002fd521aeb0171d4df304f9a6561bbc5b77c36ba36998fe0700f33e":"mutation UpdatePersona ($id: ID!, $attributes: PersonaAttributes!) {\n\tupdatePersona(id: $id, attributes: $attributes) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:c1cd732253ebdf1c807451b3cf00bed2497fddd70b94dc26115e51be4f20de65":"mutation DeleteNamespace ($id: ID!) {\n\tdeleteManagedNamespace(id: $id) {\n\t\tid\n\t}\n}\n","sha256:c233e6f7b150960c88d30f2bbebdaa5cb184e1d973b4d57add138eae8b439a99":"query GetStackDefinition ($id: ID!) {\n\tstackDefinition(id: $id) {\n\t\t... StackDefinitionFragment\n\t}\n}\nfragment StackDefinitionFragment on StackDefinition {\n\tid\n\tname\n\tdescription\n\tinsertedAt\n\tupdatedAt\n\tconfiguration {\n\t\timage\n\t\ttag\n\t\tversion\n\t\thooks {\n\t\t\tcmd\n\t\t\targs\n\t\t\tafterStage\n\t\t}\n\t}\n\tsteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n\tdeleteSteps {\n\t\tcmd\n\t\targs\n\t\tstage\n\t\trequireApproval\n\t}\n}\n","sha256:c33f34d45c517bb9de74e17503e1955925c8ae908a2c6f3e1f8937cdc5494736":"mutation DeleteNotificationSink ($id: ID!) {\n\tdeleteNotificationSink(id: $id) {\n\t\t... NotificationSinkFragment\n\t}\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:c361daaf8af4e815cd5037cfca3508c99c82d5d13efeea7be74df0aa0a4a4086":"mutation DeleteScmWebhook ($id: ID!) {\n\tdeleteScmWebhook(id: $id) {\n\t\t... ScmWebhookFragment\n\t}\n}\nfragment ScmWebhookFragment on ScmWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\towner\n\ttype\n\turl\n}\n","sha256:c4d1d8e2c7cc145562d0347c03a7e8d55ffa769b5c86fc0bf62e5a437a5c7705":"query GetScmConnectionTiny ($id: ID, $name: String) {\n\tscmConnection(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:c59085c3cc9fc0cdf5fdab1ad6426d70cad3c18d61e8099408b0f729ff7896a0":"query GetGroup ($name: String!) {\n\tgroup(name: $name) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:c648bed210879433e880936999a0177cfed858de16ae630b4d28fdf328e5ba8c":"query ListClusterStackIds ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterStackRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... StackRunIdEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackRunIdEdgeFragment on StackRunEdge {\n\tnode {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:c6e7aaf82961c3a494e7dad20a5034cb38d7b6c7f7d314ede07872165c9514c2":"mutation CreateServiceDeployment ($clusterId: ID!, $attributes: ServiceDeploymentAttributes!) {\n\tcreateServiceDeployment(clusterId: $clusterId, attributes: $attributes) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:c8e0fc5503578fcfd182a285f270117143fea26d5788ae339ea658d7824ead7a":"query GetStackRunApprovedAt ($id: ID!) {\n\tstackRun(id: $id) {\n\t\tapprovedAt\n\t}\n}\n","sha256:c8e4277ef08029190490500c4713ee3efdb9cbd85fe2afa0ab64c9fde367c4c8":"mutation CreateWorkbenchWebhook ($workbenchId: ID!, $attributes: WorkbenchWebhookAttributes!) {\n\tcreateWorkbenchWebhook(workbenchId: $workbenchId, attributes: $attributes) {\n\t\t... WorkbenchWebhookFragment\n\t}\n}\nfragment WorkbenchWebhookFragment on WorkbenchWebhook {\n\tid\n\tname\n\tprompt\n\tpriority\n\tmatches {\n\t\tregex\n\t\tsubstring\n\t\tcaseInsensitive\n\t}\n\twebhook {\n\t\tid\n\t\tname\n\t}\n\tissueWebhook {\n\t\tid\n\t\tname\n\t}\n\tworkbench {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:c9d7d1433d0b7c8a13ee3f48b79dc7ca7d2fbe3fbc95a59605bc4bcb6105be48":"query GetPipelines ($after: String) {\n\tpipelines(first: 100, after: $after) {\n\t\tedges {\n\t\t\t... PipelineEdgeFragment\n\t\t}\n\t}\n}\nfragment PipelineEdgeFragment on PipelineEdge {\n\tnode {\n\t\t... PipelineFragment\n\t}\n}\nfragment PipelineFragment on Pipeline {\n\tid\n\tname\n\tstages {\n\t\t... PipelineStageFragment\n\t}\n\tedges {\n\t\t... PipelineStageEdgeFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment PipelineStageFragment on PipelineStage {\n\tid\n\tname\n\tservices {\n\t\tservice {\n\t\t\t... ServiceDeploymentBaseFragment\n\t\t}\n\t\tcriteria {\n\t\t\tsource {\n\t\t\t\t... ServiceDeploymentBaseFragment\n\t\t\t}\n\t\t\tsecrets\n\t\t}\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PipelineStageEdgeFragment on PipelineStageEdge {\n\tid\n\tfrom {\n\t\t... PipelineStageFragment\n\t}\n\tto {\n\t\t... PipelineStageFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:cb1a08aa627034f757f578e60b19cdf3d86cb6d07d0e092665994437fd3b0c8c":"query GetAgentRuntimeByName ($name: String!, $clusterId: ID!) {\n\tagentRuntime(name: $name, clusterId: $clusterId) {\n\t\t... AgentRuntimeFragment\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:cb23898da395a1259a3eea1069486d08bdd398b8e19ab7767f479516394fb545":"mutation IngestClusterCost ($costs: CostIngestAttributes!) {\n\tingestClusterCost(costs: $costs)\n}\n","sha256:cbf979fbb7271eae49c77cfe27cf45f05476150dbf4d2de0e43a6baed1fbbf9f":"mutation CreateCustomStackRun ($attributes: CustomStackRunAttributes!) {\n\tcreateCustomStackRun(attributes: $attributes) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:cc23c54f364f7fc86b1677d8f80d5f90f66bb7dbb52aa56ac2ca9505602f7c63":"mutation ApproveStackRun ($id: ID!) {\n\tapproveStackRun(id: $id) {\n\t\t... StackRunIdFragment\n\t}\n}\nfragment StackRunIdFragment on StackRun {\n\tid\n}\n","sha256:cc4284d27cd80dffc23f9a8b628e071a091bf13b1e8a75c1a628b487c92ea8c8":"mutation DeleteGroup ($groupId: ID!) {\n\tdeleteGroup(groupId: $groupId) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:cc42a4ba14d88488b304966f6db6111e774264487956c89be92e2ce5a1f825d8":"query ListWorkbenchTools ($after: String, $first: Int, $before: String, $last: Int, $q: String) {\n\tworkbenchTools(after: $after, first: $first, before: $before, last: $last, q: $q) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... WorkbenchToolFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:cd777b75a96e3400c0bdd6a75f4e63860fb1019c20082c6509d7a8a9179d2947":"query GetInfrastructureStackStatus ($id: ID, $name: String) {\n\tinfrastructureStack(id: $id, name: $name) {\n\t\t... InfrastructureStackStatusFragment\n\t}\n}\nfragment InfrastructureStackStatusFragment on InfrastructureStack {\n\tstatus\n}\n","sha256:cf8c42483cecc603b29f28f8c4f4f0fc9cba008aa0ae2228ba85683ddb71c31c":"query GetUserTiny ($email: String!) {\n\tuser(email: $email) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:d0243f65b29d1f4a3dc0fc341329bd64771a81b61027b49b5c657638fc12d993":"mutation DetachStack ($id: ID!) {\n\tdetachStack(id: $id) {\n\t\t... InfrastructureStackIdFragment\n\t}\n}\nfragment InfrastructureStackIdFragment on InfrastructureStack {\n\tid\n}\n","sha256:d0deff4a75c0315f913f84dcd0babf240d3dd12dc7b753f6796ac081b4b10b6c":"query ListAgentRunsMinimal ($after: String, $first: Int, $before: String, $last: Int) {\n\tagentRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AgentRunMinimalFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment AgentRunMinimalFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\truntime {\n\t\ttype\n\t}\n\tpullRequests {\n\t\tid\n\t\tstatus\n\t\turl\n\t\ttitle\n\t\tref\n\t}\n\tupload {\n\t\tsession\n\t\tpatch\n\t\tscreenRecording\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:d17fdd1f3585dbb5fe41795aa0f06da222848b52ad30ef0827bc0eb968fc3c68":"mutation DeleteGlobalServiceDeployment ($id: ID!) {\n\tdeleteGlobalService(id: $id) {\n\t\t... GlobalServiceFragment\n\t}\n}\nfragment GlobalServiceFragment on GlobalService {\n\tid\n\tname\n\tdistro\n\tprovider {\n\t\tid\n\t}\n\tservice {\n\t\tid\n\t}\n\ttags {\n\t\t... ClusterTags\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:d1b43ea072acd70d56e7e3637eb05a13b854defd61c46d3f03cac4c831be0df4":"mutation UpsertPrGovernance ($attributes: PrGovernanceAttributes!) {\n\tupsertPrGovernance(attributes: $attributes) {\n\t\t... PrGovernanceFragment\n\t}\n}\nfragment PrGovernanceFragment on PrGovernance {\n\tid\n\tname\n}\n","sha256:d212c3e56c32e78aa75561817cfa4aa18d96b3f7ef6b60e363dfdd864b78bbc4":"mutation PingCluster ($attributes: ClusterPing!) {\n\tpingCluster(attributes: $attributes) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:d37c4e4d20689e9ff322abbb478c77fc9a8aec7b995b68617d3401d1f123b39b":"mutation CreateScmConnection ($attributes: ScmConnectionAttributes!) {\n\tcreateScmConnection(attributes: $attributes) {\n\t\t... ScmConnectionFragment\n\t}\n}\nfragment ScmConnectionFragment on ScmConnection {\n\tid\n\tname\n\tapiUrl\n\tbaseUrl\n\ttype\n\tusername\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:d5f1c35ebe2aa909ebaf89248f6120c9fbe9b6b991bc615ae72c786bbc519892":"mutation DeleteWorkbench ($id: ID!) {\n\tdeleteWorkbench(id: $id) {\n\t\t... WorkbenchFragment\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:d666f635df84ed6a6c279cd0f46a5ede9d26b15ec7aac618a0d96fb731fb7dda":"query GetAccessToken ($id: ID!) {\n\taccessToken(id: $id) {\n\t\t... AccessTokenFragment\n\t}\n}\nfragment AccessTokenFragment on AccessToken {\n\tid\n\ttoken\n}\n","sha256:d7a398fe4bbf2a5f798ff3b3cc4b219587eeb27f422f3afb15c9621926dcb1e4":"mutation DeleteClusterProvider ($id: ID!) {\n\tdeleteClusterProvider(id: $id) {\n\t\t... ClusterProviderFragment\n\t}\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:d7c04e62db15eca75b1b7ac459f73ee190f7d014edd53ebf926182940ae46f55":"query GetPersona ($id: ID!) {\n\tpersona(id: $id) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:d7d71625718364b0b47e0f2fcacf1411f6ce8f1a5f8d5368133b7c28ee931c2d":"query GetClusterRegistration ($id: ID, $machineId: String) {\n\tclusterRegistration(id: $id, machineId: $machineId) {\n\t\t... ClusterRegistrationFragment\n\t}\n}\nfragment ClusterRegistrationFragment on ClusterRegistration {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tmachineId\n\tname\n\thandle\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcreator {\n\t\t... UserFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:d8d1b2b67547c395415dba4760257041fc27373d662324934850ae8a53f7f436":"mutation CreateAgentRun ($runtimeId: ID!, $attributes: AgentRunAttributes!) {\n\tcreateAgentRun(runtimeId: $runtimeId, attributes: $attributes) {\n\t\t... AgentRunFragment\n\t}\n}\nfragment AgentRunFragment on AgentRun {\n\tid\n\tprompt\n\trepository\n\tbranch\n\theadBranch\n\tmode\n\treviewDepth\n\tlanguage\n\tlanguageVersion\n\ttodos {\n\t\t... AgentTodoFragment\n\t}\n\tprompts {\n\t\t... AgentPromptFragment\n\t}\n\tskills {\n\t\tname\n\t\tdescription\n\t\tcontents\n\t}\n\tstatus\n\tpodReference {\n\t\t... AgentPodReferenceFragment\n\t}\n\terror\n\tanalysis {\n\t\t... AgentAnalysisFragment\n\t}\n\tusage {\n\t\tinputTokens\n\t\toutputTokens\n\t\ttotalTokens\n\t\tcachedTokens\n\t\treasoningTokens\n\t\tinputCost\n\t\toutputCost\n\t\ttotalCost\n\t}\n\tscmCreds {\n\t\t... ScmCredentialFragment\n\t}\n\tpluralCreds {\n\t\t... PluralCredsFragment\n\t}\n\truntime {\n\t\t... AgentRuntimeFragment\n\t}\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n\tflow {\n\t\tid\n\t\tname\n\t}\n\tpullRequests {\n\t\t... PullRequestFragment\n\t}\n\tupload {\n\t\t... AgentRunUploadFragment\n\t}\n\tbabysit\n\tbabysitInterval\n\tapproval\n\tapprovedAt\n\tfollowup\n\tfollowupPrUrl\n}\nfragment AgentTodoFragment on AgentTodo {\n\tdescription\n\tdone\n\ttitle\n}\nfragment AgentPromptFragment on AgentPrompt {\n\tid\n\tprompt\n\tseq\n}\nfragment AgentPodReferenceFragment on AgentPodReference {\n\tname\n\tnamespace\n}\nfragment AgentAnalysisFragment on AgentAnalysis {\n\tsummary\n\tanalysis\n\tbullets\n}\nfragment ScmCredentialFragment on ScmCreds {\n\ttoken\n\tusername\n\texaKey\n}\nfragment PluralCredsFragment on PluralCreds {\n\ttoken\n\turl\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\nfragment AgentRunUploadFragment on AgentRunUpload {\n\tid\n\tsession\n\tscreenRecording\n\tpatch\n}\n","sha256:d9d6a609a379b3b6ba578167a4b9218c222ffede1152770c7df98cd5558bdb57":"mutation AgentPrReview ($runId: ID!, $attributes: AgentPrReviewAttributes!) {\n\tagentPrReview(runId: $runId, attributes: $attributes) {\n\t\t... PullRequestFragment\n\t}\n}\nfragment PullRequestFragment on PullRequest {\n\tid\n\tstatus\n\turl\n\ttitle\n\tcreator\n\tref\n}\n","sha256:da49a26dea358a0bd0fbe7d5293211ce6a6264208cd6a62c06f3fbbecda3d907":"query ListClusterStacks ($after: String, $first: Int, $before: String, $last: Int) {\n\tclusterStackRuns(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... StackRunEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment StackRunEdgeFragment on StackRunEdge {\n\tnode {\n\t\t... StackRunFragment\n\t}\n}\nfragment StackRunFragment on StackRun {\n\tid\n\ttype\n\tstatus\n\tapproval\n\tapprovedAt\n\ttarball\n\tworkdir\n\tmanageState\n\tvariables\n\tdryRun\n\tstateUrls {\n\t\tterraform {\n\t\t\taddress\n\t\t\tlock\n\t\t\tunlock\n\t\t}\n\t}\n\tpluralCreds {\n\t\turl\n\t\ttoken\n\t}\n\tactor {\n\t\t... UserFragment\n\t}\n\tstack {\n\t\t... InfrastructureStackFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\tsteps {\n\t\t... RunStepFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\terrors {\n\t\t... ServiceErrorFragment\n\t}\n\tviolations {\n\t\t... StackPolicyViolationFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n\tapprover {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\nfragment RunStepFragment on RunStep {\n\tid\n\tstatus\n\tstage\n\tname\n\tcmd\n\targs\n\trequireApproval\n\tindex\n}\nfragment ServiceErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment StackPolicyViolationFragment on StackPolicyViolation {\n\tid\n\ttitle\n\tdescription\n\tpolicyId\n\tpolicyModule\n\tpolicyUrl\n\tseverity\n\tresolution\n\tcauses {\n\t\t... StackViolationCauseFragment\n\t}\n}\nfragment StackViolationCauseFragment on StackViolationCause {\n\tstart\n\tend\n\tresource\n\tfilename\n\tlines {\n\t\t... StackViolationCauseLineFragment\n\t}\n}\nfragment StackViolationCauseLineFragment on StackViolationCauseLine {\n\tfirst\n\tlast\n\tcontent\n\tline\n}\n","sha256:da61f9d23f2bb33137008e58f123fe876dd8b1313e9e4c9bcde20a36f0af2026":"mutation UpdateClusterRestore ($id: ID!, $attributes: RestoreAttributes!) {\n\tupdateClusterRestore(id: $id, attributes: $attributes) {\n\t\t... ClusterRestoreFragment\n\t}\n}\nfragment ClusterRestoreFragment on ClusterRestore {\n\tid\n\tstatus\n\tbackup {\n\t\t... ClusterBackupFragment\n\t}\n}\nfragment ClusterBackupFragment on ClusterBackup {\n\tid\n\tname\n\tcluster {\n\t\tid\n\t}\n\tgarbageCollected\n}\n","sha256:da7c309e7952dd39dd8aff2fb5caff9e91fd9b874fd67a885a8fa9919c56f922":"query GetFederatedCredential ($id: ID!) {\n\tfederatedCredential(id: $id) {\n\t\t... FederatedCredentialFragment\n\t}\n}\nfragment FederatedCredentialFragment on FederatedCredential {\n\tid\n\tclaimsLike\n\tissuer\n\tscopes\n\tinsertedAt\n\tupdatedAt\n\tuser {\n\t\tid\n\t\tname\n\t\temail\n\t}\n}\n","sha256:db848743beb32ccf52efc157a7df4acd0e6f68d1b66b1563f014a7aa5b503794":"mutation CreateWorkbenchTool ($attributes: WorkbenchToolAttributes!) {\n\tcreateWorkbenchTool(attributes: $attributes) {\n\t\t... WorkbenchToolFragment\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:dd43f3ef75185258586ab4bb1b086ed6a2703f09a5e439ea3f4a7cda94429d74":"mutation UpdateCustomStackRun ($id: ID!, $attributes: CustomStackRunAttributes!) {\n\tupdateCustomStackRun(id: $id, attributes: $attributes) {\n\t\t... CustomStackRunFragment\n\t}\n}\nfragment CustomStackRunFragment on CustomStackRun {\n\tid\n\tname\n\tstack {\n\t\tid\n\t}\n\tdocumentation\n\tcommands {\n\t\t... StackCommandFragment\n\t}\n\tconfiguration {\n\t\t... PrConfigurationFragment\n\t}\n}\nfragment StackCommandFragment on StackCommand {\n\tcmd\n\targs\n\tdir\n}\nfragment PrConfigurationFragment on PrConfiguration {\n\ttype\n\tname\n\tdefault\n\tdocumentation\n\tlongform\n\tplaceholder\n\toptional\n\tcondition {\n\t\t... PrConfigurationConditionFragment\n\t}\n}\nfragment PrConfigurationConditionFragment on PrConfigurationCondition {\n\toperation\n\tfield\n\tvalue\n}\n","sha256:df1a376b62fbd1450e92d22cb75ad7ee44d7f03f99bfb7d5c0e9d899ed428b22":"mutation DeleteFlow ($id: ID!) {\n\tdeleteFlow(id: $id) {\n\t\tid\n\t}\n}\n","sha256:e00dac57c9bbde70847c095096e903c6b33b62d4e20bc848a5996649ed738826":"query GetServiceDeployment ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:e12171fbbb1ccefe73589f2b19ea00806a6d8a4ef0be04692110bfcd18587456":"mutation UpdateRbac ($rbac: RbacAttributes!, $serviceId: ID, $clusterId: ID, $providerId: ID) {\n\tupdateRbac(rbac: $rbac, serviceId: $serviceId, clusterId: $clusterId, providerId: $providerId)\n}\n","sha256:e191a0abc1d10463daf351717693b915fb5e1e2e376ebc1914069c8ed5b4d83c":"mutation CreatePersona ($attributes: PersonaAttributes!) {\n\tcreatePersona(attributes: $attributes) {\n\t\t... PersonaFragment\n\t}\n}\nfragment PersonaFragment on Persona {\n\tid\n\tname\n\tdescription\n\tconfiguration {\n\t\t... PersonaConfigurationFragment\n\t}\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PersonaConfigurationFragment on PersonaConfiguration {\n\tall\n\tdeployments {\n\t\taddOns\n\t\tclusters\n\t\tpipelines\n\t\tproviders\n\t\trepositories\n\t\tservices\n\t}\n\thome {\n\t\tmanager\n\t\tsecurity\n\t}\n\tflows {\n\t\tpermissions\n\t\tstartWorkbenchJob\n\t\tpipelines\n\t\tpreviews\n\t\tworkbenches\n\t}\n\tsidebar {\n\t\taudits\n\t\tflows\n\t\tkubernetes\n\t\tpullRequests\n\t\tsettings\n\t\tbackups\n\t\tstacks\n\t\tworkbenches\n\t\tcd\n\t\tai\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:e2d945757a488df65767d201a8b1b87d4485fe2e48cf16478979b6f4c5cd9a20":"mutation AddServiceError ($id: ID!, $errors: [ServiceErrorAttributes]) {\n\tupdateServiceComponents(id: $id, errors: $errors) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:e44cf2898da342dcf07148d3868d094a0dd29e5579d25257d5be9c1f0f05489a":"query GetSentinelRunJob ($id: ID!) {\n\tsentinelRunJob(id: $id) {\n\t\t... SentinelRunJobFragment\n\t}\n}\nfragment SentinelRunJobFragment on SentinelRunJob {\n\tid\n\tcheck\n\tstatus\n\tformat\n\tusesGit\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\treference {\n\t\tname\n\t\tnamespace\n\t}\n\tsentinelRun {\n\t\t... SentinelRunFragment\n\t}\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tdistro\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:e59e52086eae818a70aac84cb1c4d4ac1e23135482a8444db2155af8bf60a789":"mutation UpdateServiceAccount ($id: ID!, $attributes: ServiceAccountAttributes!) {\n\tupdateServiceAccount(id: $id, attributes: $attributes) {\n\t\t... UserFragment\n\t}\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:e5c3c0029872eee1c6e1cdd984869fe9a4b27eca35ea11c05567ae7561df3519":"query ListComplianceReportGenerators ($after: String, $before: String, $first: Int, $last: Int) {\n\tcomplianceReportGenerators(after: $after, before: $before, first: $first, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... ComplianceReportGeneratorFragment\n\t\t\t}\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ComplianceReportGeneratorFragment on ComplianceReportGenerator {\n\tid\n\tname\n\tformat\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:e5f970f2b0557a81ab6348adfc94a898956ea5f945ac0bd067ebc465a588a25e":"mutation UpdateSentinelRunJobStatus ($id: ID!, $attributes: SentinelRunJobUpdateAttributes) {\n\tupdateSentinelRunJob(id: $id, attributes: $attributes) {\n\t\t... SentinelRunJobFragment\n\t}\n}\nfragment SentinelRunJobFragment on SentinelRunJob {\n\tid\n\tcheck\n\tstatus\n\tformat\n\tusesGit\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\treference {\n\t\tname\n\t\tnamespace\n\t}\n\tsentinelRun {\n\t\t... SentinelRunFragment\n\t}\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t\tdistro\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:e64a2264b1a894d3db35c700efe1e5b72103efab97275077b7184600bb81b4ec":"query GetServiceDeploymentTiny ($id: ID!) {\n\tserviceDeployment(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:e81829a6508fe6b8fb4e8d0e7b4180772c5ebff701a3011e1ce4a365cdcea6c5":"query GetSentinelRun ($id: ID!) {\n\tsentinelRun(id: $id) {\n\t\t... SentinelRunFragment\n\t}\n}\nfragment SentinelRunFragment on SentinelRun {\n\tid\n\tstatus\n\tsentinel {\n\t\tid\n\t}\n\tchecks {\n\t\t... SentinelCheckFragment\n\t}\n}\nfragment SentinelCheckFragment on SentinelCheck {\n\tid\n\tname\n\ttype\n\truleFile\n\tconfiguration {\n\t\t... SentinelCheckConfigurationFragment\n\t}\n}\nfragment SentinelCheckConfigurationFragment on SentinelCheckConfiguration {\n\tlog {\n\t\t... SentinelCheckLogConfigurationFragment\n\t}\n\tkubernetes {\n\t\t... SentinelCheckKubernetesConfigurationFragment\n\t}\n\tintegrationTest {\n\t\t... SentinelCheckIntegrationTestConfigurationFragment\n\t}\n}\nfragment SentinelCheckLogConfigurationFragment on SentinelCheckLogConfiguration {\n\tnamespaces\n\tquery\n\tclusterId\n\tfacets {\n\t\tkey\n\t\tvalue\n\t}\n\tduration\n}\nfragment SentinelCheckKubernetesConfigurationFragment on SentinelCheckKubernetesConfiguration {\n\tgroup\n\tversion\n\tkind\n\tname\n\tnamespace\n}\nfragment SentinelCheckIntegrationTestConfigurationFragment on SentinelCheckIntegrationTestConfiguration {\n\tdistro\n\ttags\n\trerunFailures\n\trerunFailuresCount\n\tpostrunScript\n\tgotestsum {\n\t\tp\n\t\tparallel\n\t}\n\tjob {\n\t\t... JobSpecFragment\n\t}\n\tcases {\n\t\t... TestCaseConfigurationFragment\n\t}\n\tdefault {\n\t\t... SentinelCheckIntegrationTestDefaultConfigurationFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment TestCaseConfigurationFragment on SentinelCheckIntegrationTestCaseConfiguration {\n\tname\n\ttype\n\tcoredns {\n\t\tdialFqdns\n\t\tdelay\n\t\tretries\n\t}\n\tloadbalancer {\n\t\tannotations\n\t\tlabels\n\t\tnamePrefix\n\t\tnamespace\n\t\tdnsProbe {\n\t\t\tfqdn\n\t\t\tdelay\n\t\t\tretries\n\t\t}\n\t}\n\tpvc {\n\t\tnamePrefix\n\t\tstorageClass\n\t\tsize\n\t}\n\traw {\n\t\tyaml\n\t\texpectedResult\n\t}\n}\nfragment SentinelCheckIntegrationTestDefaultConfigurationFragment on SentinelCheckIntegrationTestDefaultConfiguration {\n\tignore\n\tnamespaceAnnotations\n\tnamespaceLabels\n\tregistry\n\tresourceAnnotations\n\tresourceLabels\n}\n","sha256:e885bd9d9a88f0e525d69bee24aba63717c7969bcda29dcc1e0181db1d6553f7":"mutation UpdateGroup ($groupId: ID!, $attributtes: GroupAttributes!) {\n\tupdateGroup(groupId: $groupId, attributes: $attributtes) {\n\t\t... GroupFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\n","sha256:e8cabd7bee2b3ec8fb69f3c07726d145c7ba7d1342e884bb6674c48ee584d3f2":"query GetObserverTiny ($id: ID, $name: String) {\n\tobserver(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:e98aa15a1c0af4f3b5d1831279f62d9ef48c9a28217191e54b8e7545e322356a":"mutation UpsertAgentRuntime ($attributes: AgentRuntimeAttributes!) {\n\tupsertAgentRuntime(attributes: $attributes) {\n\t\t... AgentRuntimeFragment\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:ea42f99ac6aa82489ff83d4b6a3569d01af1e44663670ce7983d6e0950e00445":"mutation CreateOIDCProvider ($type: OidcProviderType!, $attributes: OidcProviderAttributes!) {\n\tcreateOidcProvider(type: $type, attributes: $attributes) {\n\t\t... OIDCProviderFragment\n\t}\n}\nfragment OIDCProviderFragment on OidcProvider {\n\tid\n\tname\n\tdescription\n\tclientId\n\tclientSecret\n\tauthMethod\n\tredirectUris\n\tbindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:eb1e79ee0e1ae9924acfacadc2225debe000a1deaf29f4bd0b4fd32bdc06fc37":"mutation KickService ($id: ID!) {\n\tkickService(serviceId: $id) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:eb48e1387916b107c9eb813c9b4c86628952b1cc47b2cc19138c55e28c0d27c2":"query GetInfrastructureStackId ($id: ID, $name: String) {\n\tinfrastructureStack(id: $id, name: $name) {\n\t\t... InfrastructureStackIdFragment\n\t}\n}\nfragment InfrastructureStackIdFragment on InfrastructureStack {\n\tid\n}\n","sha256:eb6667b96554ee27077292eed506b0777efacdffaee51babf8fdaa2fe20de1df":"query GetObservabilityProviderTiny ($id: ID, $name: String) {\n\tobservabilityProvider(id: $id, name: $name) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:ebb21cf148c1266159da87762af8b07b3d86e2bc357ed7e97e3836552ff47725":"query ListAgentRuntimes ($after: String, $first: Int, $before: String, $last: Int, $q: String, $type: AgentRuntimeType) {\n\tagentRuntimes(after: $after, first: $first, before: $before, last: $last, q: $q, type: $type) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... AgentRuntimeFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment AgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\taiProxy\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tcreateBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:edf0898fb4698594637c396cb651e59637dde77354bfd5f6cbac6a174973ab3f":"mutation CreatePolicy ($attributes: PolicyAttributes!) {\n\tcreatePolicy(attributes: $attributes) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:ee2c452c191fc50ec78c441ccd4beaec32bb632b4a32df0b3bbdbf5a77ae2b26":"query GetCluster ($id: ID) {\n\tcluster(id: $id) {\n\t\t... ClusterFragment\n\t}\n}\nfragment ClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tinsertedAt\n\tpingedAt\n\tprotect\n\tcurrentVersion\n\tkasUrl\n\tdeletedAt\n\tmetadata\n\tdistro\n\ttags {\n\t\t... ClusterTags\n\t}\n\tprovider {\n\t\t... ClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tstatus {\n\t\t... ClusterStatusFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\tdeletedAt\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tservice {\n\t\t... ServiceDeploymentFragment\n\t}\n\tcredentials {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment ClusterStatusFragment on ClusterStatus {\n\tconditions {\n\t\t... ClusterConditionFragment\n\t}\n}\nfragment ClusterConditionFragment on ClusterCondition {\n\tstatus\n\ttype\n\tmessage\n\treason\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:f0180c3b7af6b2fd274ee2b25b45dc2f9577ea7cd180278c8873f71e30a8e57c":"query ListWorkbenches ($after: String, $first: Int, $before: String, $last: Int, $q: String) {\n\tworkbenches(after: $after, first: $first, before: $before, last: $last, q: $q) {\n\t\tedges {\n\t\t\tnode {\n\t\t\t\t... WorkbenchFragment\n\t\t\t}\n\t\t}\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t}\n}\nfragment WorkbenchFragment on Workbench {\n\tid\n\tname\n\tdescription\n\tsystemPrompt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tagentRuntime {\n\t\t... TinyAgentRuntimeFragment\n\t}\n\tconfiguration {\n\t\tcoding {\n\t\t\tmode\n\t\t\trepositories\n\t\t}\n\t\tinfrastructure {\n\t\t\tservices\n\t\t\tstacks\n\t\t\tkubernetes\n\t\t}\n\t\tobservability {\n\t\t\tlogs\n\t\t\tmetrics\n\t\t}\n\t}\n\tskills {\n\t\tref {\n\t\t\tref\n\t\t\tfolder\n\t\t\tfiles\n\t\t}\n\t\tfiles\n\t}\n\ttools {\n\t\t... WorkbenchToolFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment TinyAgentRuntimeFragment on AgentRuntime {\n\tid\n\tname\n\ttype\n\tcluster {\n\t\tid\n\t\tname\n\t\thandle\n\t}\n}\nfragment WorkbenchToolFragment on WorkbenchTool {\n\tid\n\tname\n\ttool\n\tcategories\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tmcpServer {\n\t\t... MCPServerFragment\n\t}\n\tcloudConnection {\n\t\t... CloudConnectionFragment\n\t}\n\tscmConnection {\n\t\tid\n\t\tname\n\t\ttype\n\t}\n\tconfiguration {\n\t\thttp {\n\t\t\turl\n\t\t\tmethod\n\t\t\tfunction\n\t\t\theaders {\n\t\t\t\tname\n\t\t\t\tvalue\n\t\t\t}\n\t\t\tbody\n\t\t\tinputSchema\n\t\t}\n\t\telastic {\n\t\t\tindex\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\topensearch {\n\t\t\thost\n\t\t\tindex\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t\tassumeRoleArn\n\t\t\tusePodIdentity\n\t\t}\n\t\tprometheus {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t\tawsSigv4\n\t\t\tawsAccessKeyId\n\t\t\tawsRegion\n\t\t}\n\t\tloki {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tvictoriaLogs {\n\t\t\turl\n\t\t\tusername\n\t\t\taccountId\n\t\t\tprojectId\n\t\t}\n\t\tsplunk {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\ttempo {\n\t\t\turl\n\t\t\tusername\n\t\t\ttenantId\n\t\t}\n\t\tjaeger {\n\t\t\turl\n\t\t\tusername\n\t\t}\n\t\tdatadog {\n\t\t\tsite\n\t\t}\n\t\tdynatrace {\n\t\t\turl\n\t\t}\n\t\tcloudwatch {\n\t\t\tregion\n\t\t\tlogGroupNames\n\t\t\troleArn\n\t\t\troleSessionName\n\t\t}\n\t\tazure {\n\t\t\tsubscriptionId\n\t\t\ttenantId\n\t\t\tclientId\n\t\t\tprometheusUrl\n\t\t}\n\t\tsentry {\n\t\t\turl\n\t\t}\n\t\tlinear {\n\t\t\turl\n\t\t}\n\t\tslack {\n\t\t\turl\n\t\t}\n\t\tpagerduty {\n\t\t\turl\n\t\t}\n\t\tteams {\n\t\t\tclientId\n\t\t\ttenantId\n\t\t}\n\t\tatlassian {\n\t\t\turl\n\t\t\temail\n\t\t}\n\t\texa {\n\t\t\turl\n\t\t}\n\t\tgithub {\n\t\t\turl\n\t\t\ttoolset\n\t\t\tappId\n\t\t\tinstallationId\n\t\t}\n\t\tgitlab {\n\t\t\turl\n\t\t}\n\t\tbitbucket {\n\t\t\turl\n\t\t}\n\t\tbitbucketDatacenter {\n\t\t\turl\n\t\t}\n\t\tazureDevops {\n\t\t\turl\n\t\t}\n\t\tlambda {\n\t\t\tlambdaArn\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tcloudRun {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tazureFunction {\n\t\t\tidentifier\n\t\t\tdescription\n\t\t\tinputSchema\n\t\t}\n\t\tdocker {\n\t\t\turl\n\t\t\tprovider\n\t\t\tproxy {\n\t\t\t\turl\n\t\t\t\tnoproxy\n\t\t\t}\n\t\t}\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\nfragment CloudConnectionFragment on CloudConnection {\n\tid\n\tname\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tprovider\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\n","sha256:f0877907330fe5fe1eb0c25fde95aa37e9cc7c9e0a1c18f5fd432ec35fbdaf0f":"mutation UpdateStack ($id: ID!, $attributes: StackAttributes!) {\n\tupdateStack(id: $id, attributes: $attributes) {\n\t\t... InfrastructureStackFragment\n\t}\n}\nfragment InfrastructureStackFragment on InfrastructureStack {\n\tid\n\tname\n\ttype\n\tvariables\n\tapproval\n\tworkdir\n\tmanageState\n\tdeletedAt\n\tgit {\n\t\t... GitRefFragment\n\t}\n\tjobSpec {\n\t\t... JobSpecFragment\n\t}\n\tconfiguration {\n\t\t... StackConfigurationFragment\n\t}\n\tcluster {\n\t\t... TinyClusterFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tfiles {\n\t\t... StackFileFragment\n\t}\n\tenvironment {\n\t\t... StackEnvironmentFragment\n\t}\n\toutput {\n\t\t... StackOutputFragment\n\t}\n\tstate {\n\t\t... StackStateFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tpolicyEngine {\n\t\t... PolicyEngineFragment\n\t}\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment StackConfigurationFragment on StackConfiguration {\n\timage\n\tversion\n\ttag\n\thooks {\n\t\t... StackHookFragment\n\t}\n\tterraform {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tterragrunt {\n\t\tparallelism\n\t\trefresh\n\t\tapproveEmpty\n\t}\n\tpulumi {\n\t\tparallel\n\t\trefresh\n\t\tapproveEmpty\n\t\tstack\n\t\tbackendUrl\n\t}\n\tansible {\n\t\tinventory\n\t\tplaybook\n\t\tprivateKeyFile\n\t\tconfigFile\n\t}\n}\nfragment StackHookFragment on StackHook {\n\tcmd\n\targs\n\tafterStage\n}\nfragment TinyClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tdeletedAt\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment StackFileFragment on StackFile {\n\tpath\n\tcontent\n}\nfragment StackEnvironmentFragment on StackEnvironment {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\nfragment StackStateFragment on StackState {\n\tid\n\tplan\n\tplanJson\n\tstate {\n\t\t... StackStateResourceFragment\n\t}\n}\nfragment StackStateResourceFragment on StackStateResource {\n\tidentifier\n\tresource\n\tname\n\tconfiguration\n\tlinks\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment PolicyEngineFragment on PolicyEngine {\n\ttype\n\tmaxSeverity\n\tcustomPolicies\n}\n","sha256:f0e05ce093b55732e58f7c3095178c28f5fe253dc86cb3fe35b8d9780e729d8a":"mutation DeleteProviderCredential ($id: ID!) {\n\tdeleteProviderCredential(id: $id) {\n\t\t... ProviderCredentialFragment\n\t}\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\n","sha256:f0f3bc7a7e51984167ff9097cb46eea2b6f8511fde8e987e799db5e919392da2":"mutation UpdatePolicy ($id: ID!, $attributes: PolicyAttributes!) {\n\tupdatePolicy(id: $id, attributes: $attributes) {\n\t\t... PolicyFragment\n\t}\n}\nfragment PolicyFragment on Policy {\n\tid\n\tname\n\ttype\n\tdescription\n\tpolicy\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\n","sha256:f2bb0c00963bc3dd9e407275110593d11307a2f5ad6b0874d0ec68e39f98aacc":"query GetFlow ($id: ID!) {\n\tflow(id: $id) {\n\t\t... FlowFragment\n\t}\n}\nfragment FlowFragment on Flow {\n\tid\n\tname\n\tdescription\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\n","sha256:f2e2e6aea69a2fe6413ac04731bf6bdf9b1b8fbfbc631f64081b97925cf0c4d5":"mutation CreatePrAutomation ($attributes: PrAutomationAttributes!) {\n\tcreatePrAutomation(attributes: $attributes) {\n\t\t... PrAutomationFragment\n\t}\n}\nfragment PrAutomationFragment on PrAutomation {\n\tid\n\tname\n\ttitle\n\taddon\n\tmessage\n\tidentifier\n\tinsertedAt\n\tupdatedAt\n}\n","sha256:f48fca8fbe86193ecceac779139b392ec35b9668b6391b87e9e485968adbe281":"mutation KickServiceByHandle ($cluster: String!, $name: String!) {\n\tkickService(cluster: $cluster, name: $name) {\n\t\t... ServiceDeploymentExtended\n\t}\n}\nfragment ServiceDeploymentExtended on ServiceDeployment {\n\tcluster {\n\t\t... BaseClusterFragment\n\t}\n\terrors {\n\t\t... ErrorFragment\n\t}\n\trevision {\n\t\t... RevisionFragment\n\t}\n\tcontexts {\n\t\t... ServiceContextFragment\n\t}\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n\timports {\n\t\tstack {\n\t\t\t... InfrastructureStackTinyFragment\n\t\t}\n\t\toutputs {\n\t\t\t... StackOutputFragment\n\t\t}\n\t}\n}\nfragment BaseClusterFragment on Cluster {\n\tid\n\tname\n\thandle\n\tself\n\tversion\n\tdistro\n\tpingedAt\n\tcurrentVersion\n\tkasUrl\n\tmetadata\n\ttags {\n\t\t... ClusterTags\n\t}\n\tcredential {\n\t\t... ProviderCredentialFragment\n\t}\n\tprovider {\n\t\t... BaseClusterProviderFragment\n\t}\n\tnodePools {\n\t\t... NodePoolFragment\n\t}\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment ClusterTags on Tag {\n\tname\n\tvalue\n}\nfragment ProviderCredentialFragment on ProviderCredential {\n\tid\n\tname\n\tnamespace\n\tkind\n}\nfragment BaseClusterProviderFragment on ClusterProvider {\n\tid\n\tname\n\tnamespace\n\tcloud\n\teditable\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment NodePoolFragment on NodePool {\n\tid\n\tname\n\tminSize\n\tmaxSize\n\tinstanceType\n\tlabels\n\ttaints {\n\t\t... NodePoolTaintFragment\n\t}\n}\nfragment NodePoolTaintFragment on Taint {\n\tkey\n\tvalue\n\teffect\n}\nfragment TinyProjectFragment on Project {\n\tid\n\tname\n\tdefault\n}\nfragment ErrorFragment on ServiceError {\n\tsource\n\tmessage\n}\nfragment RevisionFragment on Revision {\n\tid\n\tsha\n\tgit {\n\t\tref\n\t\tfolder\n\t}\n}\nfragment ServiceContextFragment on ServiceContext {\n\tid\n\tname\n\tconfiguration\n\tproject {\n\t\t... TinyProjectFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\nfragment InfrastructureStackTinyFragment on InfrastructureStack {\n\tid\n\tname\n}\nfragment StackOutputFragment on StackOutput {\n\tname\n\tvalue\n\tsecret\n}\n","sha256:f4c23df10fd69bac428668e234d4671734030cdb043ab60cf1c2d1ae81755751":"mutation CloneServiceDeployment ($clusterId: ID!, $id: ID!, $attributes: ServiceCloneAttributes!) {\n\tcloneService(clusterId: $clusterId, serviceId: $id, attributes: $attributes) {\n\t\t... ServiceDeploymentFragment\n\t}\n}\nfragment ServiceDeploymentFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n\tcomponents {\n\t\tid\n\t\tuid\n\t\tname\n\t\tgroup\n\t\tkind\n\t\tnamespace\n\t\tstate\n\t\tsynced\n\t\tversion\n\t\tcontent {\n\t\t\t... ComponentContentFragment\n\t\t}\n\t}\n\tprotect\n\tdeletedAt\n\tsha\n\ttarball\n\tdryRun\n\ttemplated\n\tconfiguration {\n\t\tname\n\t\tvalue\n\t}\n\tflow {\n\t\tid\n\t}\n\tsyncConfig {\n\t\tcreateNamespace\n\t\tenforceNamespace\n\t\tnamespaceMetadata {\n\t\t\tlabels\n\t\t\tannotations\n\t\t}\n\t\tdiffNormalizers {\n\t\t\t... DiffNormalizerFragment\n\t\t}\n\t}\n\tmetadata {\n\t\timages\n\t\tfqdns\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\nfragment ComponentContentFragment on ComponentContent {\n\tid\n\tlive\n\tdesired\n}\nfragment DiffNormalizerFragment on DiffNormalizer {\n\tnamespace\n\tname\n\tkind\n\tbackfill\n\tjsonPointers\n}\n","sha256:f4e1c56176b7a939e788ef5b53f4787503b89c032124e826851a5ff4aceb0f25":"query GetNotificationRouterByName ($name: String) {\n\tnotificationRouter(name: $name) {\n\t\t... NotificationRouterFragment\n\t}\n}\nfragment NotificationRouterFragment on NotificationRouter {\n\tid\n\tname\n\tsinks {\n\t\t... NotificationSinkFragment\n\t}\n\tevents\n}\nfragment NotificationSinkFragment on NotificationSink {\n\tid\n\tname\n\ttype\n\tconfiguration {\n\t\t... SinkConfigurationFragment\n\t}\n\tnotificationBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\nfragment SinkConfigurationFragment on SinkConfiguration {\n\tid\n\tslack {\n\t\t... UrlSinkConfigurationFragment\n\t}\n\tteams {\n\t\t... UrlSinkConfigurationFragment\n\t}\n}\nfragment UrlSinkConfigurationFragment on UrlSinkConfiguration {\n\turl\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\n","sha256:f6ed33ad9b1d5a5809a4e165bd5ef8f45b11473299e695b900de16f0e019638e":"mutation CreateBindingPolicy ($attributes: BindingPolicyAttributes!) {\n\tcreateBindingPolicy(attributes: $attributes) {\n\t\t... BindingPolicyFragment\n\t}\n}\nfragment BindingPolicyFragment on BindingPolicy {\n\tid\n\ttype\n\tinterval\n\tnextPollAt\n\tmatches {\n\t\tworkbench {\n\t\t\tregexes\n\t\t}\n\t}\n\tpolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tbindPolicy {\n\t\t... TinyPolicyFragment\n\t}\n\tinsertedAt\n\tupdatedAt\n}\nfragment TinyPolicyFragment on Policy {\n\tid\n\tname\n}\n","sha256:f6f84fe259c76394005edc0fae05274cf74dbc7798901ae09e0ffcd10cc83f56":"mutation UpsertMCPServer ($attributes: McpServerAttributes!) {\n\tupsertMcpServer(attributes: $attributes) {\n\t\t... MCPServerFragment\n\t}\n}\nfragment MCPServerFragment on McpServer {\n\tid\n\tname\n\turl\n\tauthentication {\n\t\tplural\n\t\theaders {\n\t\t\tname\n\t\t\tvalue\n\t\t}\n\t}\n\tconfirm\n}\n","sha256:fb582babd9105b9d3a968a697cd3c6879d73cc169cb3a0ea2ff6919653b93159":"query GetPersonaTiny ($id: ID!) {\n\tpersona(id: $id) {\n\t\tid\n\t\tname\n\t}\n}\n","sha256:fb5ea857664bc64ec6b9b3be0df5183537c6ada36d9076badf3035fac4821160":"mutation updateGate ($id: ID!, $attributes: GateUpdateAttributes!) {\n\tupdateGate(id: $id, attributes: $attributes) {\n\t\t... PipelineGateFragment\n\t}\n}\nfragment PipelineGateFragment on PipelineGate {\n\tid\n\tname\n\ttype\n\tstate\n\tupdatedAt\n\tspec {\n\t\t... GateSpecFragment\n\t}\n\tstatus {\n\t\t... GateStatusFragment\n\t}\n}\nfragment GateSpecFragment on GateSpec {\n\tjob {\n\t\t... JobSpecFragment\n\t}\n}\nfragment JobSpecFragment on JobGateSpec {\n\tnamespace\n\traw\n\tcontainers {\n\t\t... ContainerSpecFragment\n\t}\n\tlabels\n\tannotations\n\tserviceAccount\n\trequests {\n\t\t... ContainerResourcesFragment\n\t}\n\tnodeSelector\n\ttolerations {\n\t\tkey\n\t\toperator\n\t\tvalue\n\t\teffect\n\t}\n}\nfragment ContainerSpecFragment on ContainerSpec {\n\tname\n\timage\n\targs\n\tenv {\n\t\tname\n\t\tvalue\n\t}\n\tenvFrom {\n\t\tconfigMap\n\t\tsecret\n\t}\n}\nfragment ContainerResourcesFragment on ContainerResources {\n\trequests {\n\t\t... ResourceRequestFragment\n\t}\n\tlimits {\n\t\t... ResourceRequestFragment\n\t}\n}\nfragment ResourceRequestFragment on ResourceRequest {\n\tcpu\n\tmemory\n}\nfragment GateStatusFragment on GateStatus {\n\tjobRef {\n\t\t... JobReferenceFragment\n\t}\n}\nfragment JobReferenceFragment on JobReference {\n\tname\n\tnamespace\n}\n","sha256:fbbe6bebeab1e039a67523921914f1c01201317c02cc98e06dec4433b164babe":"mutation UpsertFlow ($attributes: FlowAttributes!) {\n\tupsertFlow(attributes: $attributes) {\n\t\t... FlowFragment\n\t}\n}\nfragment FlowFragment on Flow {\n\tid\n\tname\n\tdescription\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n\tproject {\n\t\t... ProjectFragment\n\t}\n}\nfragment PolicyBindingFragment on PolicyBinding {\n\tid\n\tgroup {\n\t\t... GroupFragment\n\t}\n\tuser {\n\t\t... UserFragment\n\t}\n}\nfragment GroupFragment on Group {\n\tid\n\tname\n\tdescription\n\tglobal\n}\nfragment UserFragment on User {\n\tname\n\tid\n\temail\n}\nfragment ProjectFragment on Project {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\tdefault\n\tdescription\n\tdisableInsights\n\treadBindings {\n\t\t... PolicyBindingFragment\n\t}\n\twriteBindings {\n\t\t... PolicyBindingFragment\n\t}\n}\n","sha256:fd1e534eae2f32dcc454ce202bcdf126e56a5fd1783af6d72bac469daf44711a":"mutation UpsertObservabilityWebhook ($attributes: ObservabilityWebhookAttributes!) {\n\tupsertObservabilityWebhook(attributes: $attributes) {\n\t\t... ObservabilityWebhookFragment\n\t}\n}\nfragment ObservabilityWebhookFragment on ObservabilityWebhook {\n\tid\n\tinsertedAt\n\tupdatedAt\n\tname\n\ttype\n\turl\n}\n","sha256:fd2719879c20e353e13ab4632ed7ef0463e32c44312ba4718fa3c3398f85757b":"mutation DeleteUpgradePlanCallout ($name: String!) {\n\tdeleteUpgradePlanCallout(name: $name) {\n\t\tid\n\t}\n}\n","sha256:fe29529018620357fb036988eaedf93dcc5f4c261a1790008fe871e730df22a7":"mutation CreateAgentMessageOutput ($attributes: AgentMessageOutputAttributes!) {\n\tagentMessageOutput(attributes: $attributes) {\n\t\tmessageId\n\t\tagentRunId\n\t\tstdout\n\t\tstderr\n\t}\n}\n","sha256:fe6d1ea15a4c48af7dd3d108284742c3e213ae0ca2d056b54e9f69e76d324ff0":"query GetPipeline ($id: ID!) {\n\tpipeline(id: $id) {\n\t\t... PipelineFragmentMinimal\n\t}\n}\nfragment PipelineFragmentMinimal on Pipeline {\n\tid\n\tname\n}\n","sha256:fe9a6d6142da6bdab74374a10496278f9c48e7c7d5be86f30230ab48f378cec0":"query GetClusterIdByHandle ($handle: String) {\n\tcluster(handle: $handle) {\n\t\t... {\n\t\t\tid\n\t\t}\n\t}\n}\n","sha256:feaaf702508e6b2448a4d426421ceaece0bdb6c525c329b24c8944dec9373dc3":"query PagedClusterServices ($after: String, $first: Int, $before: String, $last: Int) {\n\tpagedClusterServices(after: $after, first: $first, before: $before, last: $last) {\n\t\tpageInfo {\n\t\t\t... PageInfoFragment\n\t\t}\n\t\tedges {\n\t\t\t... ServiceDeploymentEdgeFragment\n\t\t}\n\t}\n}\nfragment PageInfoFragment on PageInfo {\n\thasNextPage\n\tendCursor\n}\nfragment ServiceDeploymentEdgeFragment on ServiceDeploymentEdge {\n\tnode {\n\t\t... ServiceDeploymentBaseFragment\n\t}\n}\nfragment ServiceDeploymentBaseFragment on ServiceDeployment {\n\tid\n\tname\n\tnamespace\n\tversion\n\tstatus\n\tkustomize {\n\t\t... KustomizeFragment\n\t}\n\tgit {\n\t\t... GitRefFragment\n\t}\n\thelm {\n\t\t... HelmSpecFragment\n\t}\n\trepository {\n\t\t... GitRepositoryFragment\n\t}\n}\nfragment KustomizeFragment on Kustomize {\n\tpath\n\tenableHelm\n}\nfragment GitRefFragment on GitRef {\n\tfolder\n\tref\n}\nfragment HelmSpecFragment on HelmSpec {\n\tvaluesFiles\n}\nfragment GitRepositoryFragment on GitRepository {\n\tid\n\terror\n\thealth\n\tauthMethod\n\turl\n\tdecrypt\n\trecurseSubmodules\n}\n"}} diff --git a/go/client/graph/workbench.graphql b/go/client/graph/workbench.graphql index 8d61420b27..4f810d7885 100644 --- a/go/client/graph/workbench.graphql +++ b/go/client/graph/workbench.graphql @@ -105,6 +105,12 @@ fragment WorkbenchToolFragment on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } splunk { url username diff --git a/go/client/models_gen.go b/go/client/models_gen.go index 3c3d4e4d0a..e8d9cb1f68 100644 --- a/go/client/models_gen.go +++ b/go/client/models_gen.go @@ -1458,6 +1458,8 @@ type BedrockAiAttributes struct { AWSSecretAccessKey *string `json:"awsSecretAccessKey,omitempty"` // Bedrock model or inference profile for embeddings. Same ID formats as modelId. EmbeddingModel *string `json:"embeddingModel,omitempty"` + // AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. + Endpoint *BedrockEndpoint `json:"endpoint,omitempty"` // Additional Bedrock model or inference profile IDs exposed through the Nexus OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. ProxyModels []*string `json:"proxyModels,omitempty"` // Deprecated for most configurations: prefer regional-prefixed inference profile IDs in modelId or proxyModels (aliases are inferred automatically). Still needed for explicit client model name overrides, application inference profile resource IDs (profile suffix only, not full ARN), or when alias mapping cannot be inferred. Maps client-facing model ID to inference profile ID. Example: {"anthropic.claude-3-5-sonnet-20241022-v2:0": "us.anthropic.claude-3-5-sonnet-20241022-v2:0"} @@ -1476,6 +1478,8 @@ type BedrockAiSettings struct { Region *string `json:"region,omitempty"` // Bedrock model or inference profile for embeddings. Same ID formats as modelId. EmbeddingModel *string `json:"embeddingModel,omitempty"` + // AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. + Endpoint *BedrockEndpoint `json:"endpoint,omitempty"` // Additional Bedrock model or inference profile IDs exposed through the Nexus OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. ProxyModels []*string `json:"proxyModels,omitempty"` // Deprecated for most configurations: prefer regional-prefixed inference profile IDs in modelId or proxyModels (aliases are inferred automatically). Still needed for explicit client model name overrides, application inference profile resource IDs (profile suffix only, not full ARN), or when alias mapping cannot be inferred. Maps client-facing model ID to inference profile ID. Example: {"anthropic.claude-3-5-sonnet-20241022-v2:0": "us.anthropic.claude-3-5-sonnet-20241022-v2:0"} @@ -11875,6 +11879,8 @@ type WorkbenchToolConfiguration struct { Prometheus *WorkbenchToolPrometheusConnection `json:"prometheus,omitempty"` // loki connection (no secrets) Loki *WorkbenchToolLokiConnection `json:"loki,omitempty"` + // victoria logs connection (no secrets) + VictoriaLogs *WorkbenchToolVictoriaLogsConnection `json:"victoriaLogs,omitempty"` // splunk connection (no secrets) Splunk *WorkbenchToolSplunkConnection `json:"splunk,omitempty"` // tempo connection (no secrets) @@ -11934,6 +11940,8 @@ type WorkbenchToolConfigurationAttributes struct { Prometheus *WorkbenchToolPrometheusConnectionAttributes `json:"prometheus,omitempty"` // loki connection (logs) Loki *WorkbenchToolLokiConnectionAttributes `json:"loki,omitempty"` + // victoria logs connection (logs) + VictoriaLogs *WorkbenchToolVictoriaLogsConnectionAttributes `json:"victoriaLogs,omitempty"` // splunk connection (logs) Splunk *WorkbenchToolSplunkConnectionAttributes `json:"splunk,omitempty"` // tempo connection (traces) @@ -12324,6 +12332,8 @@ type WorkbenchToolSlackConnectionAttributes struct { type WorkbenchToolSplunkConnection struct { // splunk base url URL *string `json:"url,omitempty"` + // authorization realm for token authentication + TokenType *SplunkTokenType `json:"tokenType,omitempty"` // basic auth username Username *string `json:"username,omitempty"` } @@ -12331,8 +12341,10 @@ type WorkbenchToolSplunkConnection struct { type WorkbenchToolSplunkConnectionAttributes struct { // splunk base url URL string `json:"url"` - // bearer token + // splunk authentication token Token *string `json:"token,omitempty"` + // authorization realm for token authentication + TokenType *SplunkTokenType `json:"tokenType,omitempty"` // basic auth username Username *string `json:"username,omitempty"` // basic auth password @@ -12377,6 +12389,32 @@ type WorkbenchToolTempoConnectionAttributes struct { TenantID *string `json:"tenantId,omitempty"` } +type WorkbenchToolVictoriaLogsConnection struct { + // victoria logs base url + URL *string `json:"url,omitempty"` + // basic auth username + Username *string `json:"username,omitempty"` + // optional AccountID tenant header + AccountID *string `json:"accountId,omitempty"` + // optional ProjectID tenant header + ProjectID *string `json:"projectId,omitempty"` +} + +type WorkbenchToolVictoriaLogsConnectionAttributes struct { + // victoria logs base url + URL string `json:"url"` + // bearer token or api key + Token *string `json:"token,omitempty"` + // basic auth username + Username *string `json:"username,omitempty"` + // basic auth password + Password *string `json:"password,omitempty"` + // optional AccountID tenant header + AccountID *string `json:"accountId,omitempty"` + // optional ProjectID tenant header + ProjectID *string `json:"projectId,omitempty"` +} + type WorkbenchUsageTimeseries struct { // UTC timestamp for this data point Timestamp *string `json:"timestamp,omitempty"` @@ -13605,6 +13643,61 @@ func (e AutoscalingTarget) MarshalJSON() ([]byte, error) { return buf.Bytes(), nil } +type BedrockEndpoint string + +const ( + BedrockEndpointRuntime BedrockEndpoint = "RUNTIME" + BedrockEndpointMantle BedrockEndpoint = "MANTLE" +) + +var AllBedrockEndpoint = []BedrockEndpoint{ + BedrockEndpointRuntime, + BedrockEndpointMantle, +} + +func (e BedrockEndpoint) IsValid() bool { + switch e { + case BedrockEndpointRuntime, BedrockEndpointMantle: + return true + } + return false +} + +func (e BedrockEndpoint) String() string { + return string(e) +} + +func (e *BedrockEndpoint) UnmarshalGQL(v any) error { + str, ok := v.(string) + if !ok { + return fmt.Errorf("enums must be strings") + } + + *e = BedrockEndpoint(str) + if !e.IsValid() { + return fmt.Errorf("%s is not a valid BedrockEndpoint", str) + } + return nil +} + +func (e BedrockEndpoint) MarshalGQL(w io.Writer) { + fmt.Fprint(w, strconv.Quote(e.String())) +} + +func (e *BedrockEndpoint) UnmarshalJSON(b []byte) error { + s, err := strconv.Unquote(string(b)) + if err != nil { + return err + } + return e.UnmarshalGQL(s) +} + +func (e BedrockEndpoint) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + e.MarshalGQL(&buf) + return buf.Bytes(), nil +} + type BindingPolicyType string const ( @@ -18324,6 +18417,61 @@ func (e SortDirection) MarshalJSON() ([]byte, error) { return buf.Bytes(), nil } +type SplunkTokenType string + +const ( + SplunkTokenTypeBearer SplunkTokenType = "BEARER" + SplunkTokenTypeSplunk SplunkTokenType = "SPLUNK" +) + +var AllSplunkTokenType = []SplunkTokenType{ + SplunkTokenTypeBearer, + SplunkTokenTypeSplunk, +} + +func (e SplunkTokenType) IsValid() bool { + switch e { + case SplunkTokenTypeBearer, SplunkTokenTypeSplunk: + return true + } + return false +} + +func (e SplunkTokenType) String() string { + return string(e) +} + +func (e *SplunkTokenType) UnmarshalGQL(v any) error { + str, ok := v.(string) + if !ok { + return fmt.Errorf("enums must be strings") + } + + *e = SplunkTokenType(str) + if !e.IsValid() { + return fmt.Errorf("%s is not a valid SplunkTokenType", str) + } + return nil +} + +func (e SplunkTokenType) MarshalGQL(w io.Writer) { + fmt.Fprint(w, strconv.Quote(e.String())) +} + +func (e *SplunkTokenType) UnmarshalJSON(b []byte) error { + s, err := strconv.Unquote(string(b)) + if err != nil { + return err + } + return e.UnmarshalGQL(s) +} + +func (e SplunkTokenType) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + e.MarshalGQL(&buf) + return buf.Bytes(), nil +} + type StackStatus string const ( @@ -19725,6 +19873,7 @@ const ( WorkbenchToolTypeCloudRun WorkbenchToolType = "CLOUD_RUN" WorkbenchToolTypeAzureFunction WorkbenchToolType = "AZURE_FUNCTION" WorkbenchToolTypeDocker WorkbenchToolType = "DOCKER" + WorkbenchToolTypeVictoriaLogs WorkbenchToolType = "VICTORIA_LOGS" ) var AllWorkbenchToolType = []WorkbenchToolType{ @@ -19758,11 +19907,12 @@ var AllWorkbenchToolType = []WorkbenchToolType{ WorkbenchToolTypeCloudRun, WorkbenchToolTypeAzureFunction, WorkbenchToolTypeDocker, + WorkbenchToolTypeVictoriaLogs, } func (e WorkbenchToolType) IsValid() bool { switch e { - case WorkbenchToolTypeHTTP, WorkbenchToolTypeElastic, WorkbenchToolTypeDatadog, WorkbenchToolTypePrometheus, WorkbenchToolTypeLoki, WorkbenchToolTypeTempo, WorkbenchToolTypeSentry, WorkbenchToolTypeMcp, WorkbenchToolTypeLinear, WorkbenchToolTypeAtlassian, WorkbenchToolTypeSplunk, WorkbenchToolTypeDynatrace, WorkbenchToolTypeCloudwatch, WorkbenchToolTypeAzure, WorkbenchToolTypeCloud, WorkbenchToolTypeJaeger, WorkbenchToolTypeExa, WorkbenchToolTypeGithub, WorkbenchToolTypeSLACk, WorkbenchToolTypeTeams, WorkbenchToolTypeGitlab, WorkbenchToolTypeBitbucket, WorkbenchToolTypeBitbucketDatacenter, WorkbenchToolTypeAzureDevops, WorkbenchToolTypePagerduty, WorkbenchToolTypeOpensearch, WorkbenchToolTypeLambda, WorkbenchToolTypeCloudRun, WorkbenchToolTypeAzureFunction, WorkbenchToolTypeDocker: + case WorkbenchToolTypeHTTP, WorkbenchToolTypeElastic, WorkbenchToolTypeDatadog, WorkbenchToolTypePrometheus, WorkbenchToolTypeLoki, WorkbenchToolTypeTempo, WorkbenchToolTypeSentry, WorkbenchToolTypeMcp, WorkbenchToolTypeLinear, WorkbenchToolTypeAtlassian, WorkbenchToolTypeSplunk, WorkbenchToolTypeDynatrace, WorkbenchToolTypeCloudwatch, WorkbenchToolTypeAzure, WorkbenchToolTypeCloud, WorkbenchToolTypeJaeger, WorkbenchToolTypeExa, WorkbenchToolTypeGithub, WorkbenchToolTypeSLACk, WorkbenchToolTypeTeams, WorkbenchToolTypeGitlab, WorkbenchToolTypeBitbucket, WorkbenchToolTypeBitbucketDatacenter, WorkbenchToolTypeAzureDevops, WorkbenchToolTypePagerduty, WorkbenchToolTypeOpensearch, WorkbenchToolTypeLambda, WorkbenchToolTypeCloudRun, WorkbenchToolTypeAzureFunction, WorkbenchToolTypeDocker, WorkbenchToolTypeVictoriaLogs: return true } return false diff --git a/go/cloud-query/README.md b/go/cloud-query/README.md index c68e0da155..adee93bbe8 100644 --- a/go/cloud-query/README.md +++ b/go/cloud-query/README.md @@ -80,6 +80,7 @@ Cloud-Query also exposes ToolQuery gRPC endpoints for observability tools (metri | Datadog | Yes | Yes | Yes | Yes | Datadog API v1/v2 via `datadog-api-client-go` (requires API key + app key; site optional) | | Elasticsearch | No | No | Yes | No | Elasticsearch typed client v9 Search API (API key required) | | Loki | No | No | Yes | No | REST client to `/loki/api/v1/query_range` (bearer token; optional `X-Scope-OrgID`) | +| VictoriaLogs | No | No | Yes | No | REST client to `/select/logsql/query` and `/select/logsql/hits` (LogsQL; optional AccountID/ProjectID) | | Splunk | No | No | Yes | No | Splunk export search API (token or basic auth) | | Tempo | No | No | No | Yes | REST client to `/api/search` and `/api/traces/{traceID}` (bearer token; optional `X-Scope-OrgID`) | | Jaeger | No | No | No | Yes | Jaeger Query v3 REST API (`GET /api/v3/traces`) with structured trace filters | @@ -107,6 +108,10 @@ ToolQuery also supports cloud function invocation via `InvokeLambda` for AWS Lam - `Prometheus` / `Loki` / `Tempo`: - Use bearer token and/or basic auth credentials when required by your backend. - If multi-tenant, also configure `tenant_id` (`X-Scope-OrgID`). +- `VictoriaLogs`: + - Query language is LogsQL (`/select/logsql/query` for logs, `/select/logsql/hits` for count-over-time). + - Use bearer token and/or basic auth credentials when required by your backend. + - If multi-tenant, configure `account_id` / `project_id` (`AccountID` / `ProjectID` headers). - `Jaeger`: - Uses Jaeger stable v3 Query API (`GET /api/v3/traces`). - `Traces.query` is interpreted as Jaeger `service_name`. diff --git a/go/cloud-query/api/proto/toolquery.proto b/go/cloud-query/api/proto/toolquery.proto index 5c4685127f..6a4c80b08c 100644 --- a/go/cloud-query/api/proto/toolquery.proto +++ b/go/cloud-query/api/proto/toolquery.proto @@ -50,6 +50,15 @@ message LokiConnection { optional string password = 5; } +message VictoriaLogsConnection { + string url = 1; + optional string token = 2; + optional string username = 3; + optional string password = 4; + optional string account_id = 5; + optional string project_id = 6; +} + message TempoConnection { string url = 1; optional string token = 2; @@ -65,11 +74,17 @@ message JaegerConnection { optional string password = 4; } +enum SplunkTokenType { + BEARER = 0; + SPLUNK = 1; +} + message SplunkConnection { string url = 1; optional string token = 2; optional string username = 3; optional string password = 4; + SplunkTokenType token_type = 5; } message DynatraceConnection { @@ -107,6 +122,7 @@ message ToolConnection { AzureConnection azure = 9; JaegerConnection jaeger = 10; OpensearchConnection opensearch = 11; + VictoriaLogsConnection victoria_logs = 12; } } diff --git a/go/cloud-query/internal/proto/toolquery/toolquery.pb.go b/go/cloud-query/internal/proto/toolquery/toolquery.pb.go index 6c3b594cc9..913f9bda01 100644 --- a/go/cloud-query/internal/proto/toolquery/toolquery.pb.go +++ b/go/cloud-query/internal/proto/toolquery/toolquery.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 +// protoc-gen-go v1.36.11-devel // protoc v6.31.1 // source: toolquery.proto @@ -23,6 +23,52 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type SplunkTokenType int32 + +const ( + SplunkTokenType_BEARER SplunkTokenType = 0 + SplunkTokenType_SPLUNK SplunkTokenType = 1 +) + +// Enum value maps for SplunkTokenType. +var ( + SplunkTokenType_name = map[int32]string{ + 0: "BEARER", + 1: "SPLUNK", + } + SplunkTokenType_value = map[string]int32{ + "BEARER": 0, + "SPLUNK": 1, + } +) + +func (x SplunkTokenType) Enum() *SplunkTokenType { + p := new(SplunkTokenType) + *p = x + return p +} + +func (x SplunkTokenType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SplunkTokenType) Descriptor() protoreflect.EnumDescriptor { + return file_toolquery_proto_enumTypes[0].Descriptor() +} + +func (SplunkTokenType) Type() protoreflect.EnumType { + return &file_toolquery_proto_enumTypes[0] +} + +func (x SplunkTokenType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SplunkTokenType.Descriptor instead. +func (SplunkTokenType) EnumDescriptor() ([]byte, []int) { + return file_toolquery_proto_rawDescGZIP(), []int{0} +} + type LogQueryOperator int32 const ( @@ -53,11 +99,11 @@ func (x LogQueryOperator) String() string { } func (LogQueryOperator) Descriptor() protoreflect.EnumDescriptor { - return file_toolquery_proto_enumTypes[0].Descriptor() + return file_toolquery_proto_enumTypes[1].Descriptor() } func (LogQueryOperator) Type() protoreflect.EnumType { - return &file_toolquery_proto_enumTypes[0] + return &file_toolquery_proto_enumTypes[1] } func (x LogQueryOperator) Number() protoreflect.EnumNumber { @@ -66,7 +112,7 @@ func (x LogQueryOperator) Number() protoreflect.EnumNumber { // Deprecated: Use LogQueryOperator.Descriptor instead. func (LogQueryOperator) EnumDescriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{0} + return file_toolquery_proto_rawDescGZIP(), []int{1} } type ElasticConnection struct { @@ -473,6 +519,90 @@ func (x *LokiConnection) GetPassword() string { return "" } +type VictoriaLogsConnection struct { + state protoimpl.MessageState `protogen:"open.v1"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + Token *string `protobuf:"bytes,2,opt,name=token,proto3,oneof" json:"token,omitempty"` + Username *string `protobuf:"bytes,3,opt,name=username,proto3,oneof" json:"username,omitempty"` + Password *string `protobuf:"bytes,4,opt,name=password,proto3,oneof" json:"password,omitempty"` + AccountId *string `protobuf:"bytes,5,opt,name=account_id,json=accountId,proto3,oneof" json:"account_id,omitempty"` + ProjectId *string `protobuf:"bytes,6,opt,name=project_id,json=projectId,proto3,oneof" json:"project_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VictoriaLogsConnection) Reset() { + *x = VictoriaLogsConnection{} + mi := &file_toolquery_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VictoriaLogsConnection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VictoriaLogsConnection) ProtoMessage() {} + +func (x *VictoriaLogsConnection) ProtoReflect() protoreflect.Message { + mi := &file_toolquery_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VictoriaLogsConnection.ProtoReflect.Descriptor instead. +func (*VictoriaLogsConnection) Descriptor() ([]byte, []int) { + return file_toolquery_proto_rawDescGZIP(), []int{5} +} + +func (x *VictoriaLogsConnection) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *VictoriaLogsConnection) GetToken() string { + if x != nil && x.Token != nil { + return *x.Token + } + return "" +} + +func (x *VictoriaLogsConnection) GetUsername() string { + if x != nil && x.Username != nil { + return *x.Username + } + return "" +} + +func (x *VictoriaLogsConnection) GetPassword() string { + if x != nil && x.Password != nil { + return *x.Password + } + return "" +} + +func (x *VictoriaLogsConnection) GetAccountId() string { + if x != nil && x.AccountId != nil { + return *x.AccountId + } + return "" +} + +func (x *VictoriaLogsConnection) GetProjectId() string { + if x != nil && x.ProjectId != nil { + return *x.ProjectId + } + return "" +} + type TempoConnection struct { state protoimpl.MessageState `protogen:"open.v1"` Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` @@ -486,7 +616,7 @@ type TempoConnection struct { func (x *TempoConnection) Reset() { *x = TempoConnection{} - mi := &file_toolquery_proto_msgTypes[5] + mi := &file_toolquery_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -498,7 +628,7 @@ func (x *TempoConnection) String() string { func (*TempoConnection) ProtoMessage() {} func (x *TempoConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[5] + mi := &file_toolquery_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -511,7 +641,7 @@ func (x *TempoConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TempoConnection.ProtoReflect.Descriptor instead. func (*TempoConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{5} + return file_toolquery_proto_rawDescGZIP(), []int{6} } func (x *TempoConnection) GetUrl() string { @@ -561,7 +691,7 @@ type JaegerConnection struct { func (x *JaegerConnection) Reset() { *x = JaegerConnection{} - mi := &file_toolquery_proto_msgTypes[6] + mi := &file_toolquery_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +703,7 @@ func (x *JaegerConnection) String() string { func (*JaegerConnection) ProtoMessage() {} func (x *JaegerConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[6] + mi := &file_toolquery_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +716,7 @@ func (x *JaegerConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use JaegerConnection.ProtoReflect.Descriptor instead. func (*JaegerConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{6} + return file_toolquery_proto_rawDescGZIP(), []int{7} } func (x *JaegerConnection) GetUrl() string { @@ -623,13 +753,14 @@ type SplunkConnection struct { Token *string `protobuf:"bytes,2,opt,name=token,proto3,oneof" json:"token,omitempty"` Username *string `protobuf:"bytes,3,opt,name=username,proto3,oneof" json:"username,omitempty"` Password *string `protobuf:"bytes,4,opt,name=password,proto3,oneof" json:"password,omitempty"` + TokenType SplunkTokenType `protobuf:"varint,5,opt,name=token_type,json=tokenType,proto3,enum=toolquery.SplunkTokenType" json:"token_type,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *SplunkConnection) Reset() { *x = SplunkConnection{} - mi := &file_toolquery_proto_msgTypes[7] + mi := &file_toolquery_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -641,7 +772,7 @@ func (x *SplunkConnection) String() string { func (*SplunkConnection) ProtoMessage() {} func (x *SplunkConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[7] + mi := &file_toolquery_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -654,7 +785,7 @@ func (x *SplunkConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use SplunkConnection.ProtoReflect.Descriptor instead. func (*SplunkConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{7} + return file_toolquery_proto_rawDescGZIP(), []int{8} } func (x *SplunkConnection) GetUrl() string { @@ -685,6 +816,13 @@ func (x *SplunkConnection) GetPassword() string { return "" } +func (x *SplunkConnection) GetTokenType() SplunkTokenType { + if x != nil { + return x.TokenType + } + return SplunkTokenType_BEARER +} + type DynatraceConnection struct { state protoimpl.MessageState `protogen:"open.v1"` Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` @@ -695,7 +833,7 @@ type DynatraceConnection struct { func (x *DynatraceConnection) Reset() { *x = DynatraceConnection{} - mi := &file_toolquery_proto_msgTypes[8] + mi := &file_toolquery_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -707,7 +845,7 @@ func (x *DynatraceConnection) String() string { func (*DynatraceConnection) ProtoMessage() {} func (x *DynatraceConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[8] + mi := &file_toolquery_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -720,7 +858,7 @@ func (x *DynatraceConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use DynatraceConnection.ProtoReflect.Descriptor instead. func (*DynatraceConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{8} + return file_toolquery_proto_rawDescGZIP(), []int{9} } func (x *DynatraceConnection) GetUrl() string { @@ -752,7 +890,7 @@ type CloudwatchConnection struct { func (x *CloudwatchConnection) Reset() { *x = CloudwatchConnection{} - mi := &file_toolquery_proto_msgTypes[9] + mi := &file_toolquery_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -764,7 +902,7 @@ func (x *CloudwatchConnection) String() string { func (*CloudwatchConnection) ProtoMessage() {} func (x *CloudwatchConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[9] + mi := &file_toolquery_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -777,7 +915,7 @@ func (x *CloudwatchConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use CloudwatchConnection.ProtoReflect.Descriptor instead. func (*CloudwatchConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{9} + return file_toolquery_proto_rawDescGZIP(), []int{10} } func (x *CloudwatchConnection) GetRegion() string { @@ -841,7 +979,7 @@ type AzureConnection struct { func (x *AzureConnection) Reset() { *x = AzureConnection{} - mi := &file_toolquery_proto_msgTypes[10] + mi := &file_toolquery_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -853,7 +991,7 @@ func (x *AzureConnection) String() string { func (*AzureConnection) ProtoMessage() {} func (x *AzureConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[10] + mi := &file_toolquery_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -866,7 +1004,7 @@ func (x *AzureConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureConnection.ProtoReflect.Descriptor instead. func (*AzureConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{10} + return file_toolquery_proto_rawDescGZIP(), []int{11} } func (x *AzureConnection) GetSubscriptionId() string { @@ -912,6 +1050,7 @@ type ToolConnection struct { // *ToolConnection_Azure // *ToolConnection_Jaeger // *ToolConnection_Opensearch + // *ToolConnection_VictoriaLogs Connection isToolConnection_Connection `protobuf_oneof:"connection"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -919,7 +1058,7 @@ type ToolConnection struct { func (x *ToolConnection) Reset() { *x = ToolConnection{} - mi := &file_toolquery_proto_msgTypes[11] + mi := &file_toolquery_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -931,7 +1070,7 @@ func (x *ToolConnection) String() string { func (*ToolConnection) ProtoMessage() {} func (x *ToolConnection) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[11] + mi := &file_toolquery_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -944,7 +1083,7 @@ func (x *ToolConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use ToolConnection.ProtoReflect.Descriptor instead. func (*ToolConnection) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{11} + return file_toolquery_proto_rawDescGZIP(), []int{12} } func (x *ToolConnection) GetConnection() isToolConnection_Connection { @@ -1053,6 +1192,15 @@ func (x *ToolConnection) GetOpensearch() *OpensearchConnection { return nil } +func (x *ToolConnection) GetVictoriaLogs() *VictoriaLogsConnection { + if x != nil { + if x, ok := x.Connection.(*ToolConnection_VictoriaLogs); ok { + return x.VictoriaLogs + } + } + return nil +} + type isToolConnection_Connection interface { isToolConnection_Connection() } @@ -1101,6 +1249,10 @@ type ToolConnection_Opensearch struct { Opensearch *OpensearchConnection `protobuf:"bytes,11,opt,name=opensearch,proto3,oneof"` } +type ToolConnection_VictoriaLogs struct { + VictoriaLogs *VictoriaLogsConnection `protobuf:"bytes,12,opt,name=victoria_logs,json=victoriaLogs,proto3,oneof"` +} + func (*ToolConnection_Elastic) isToolConnection_Connection() {} func (*ToolConnection_Datadog) isToolConnection_Connection() {} @@ -1123,6 +1275,8 @@ func (*ToolConnection_Jaeger) isToolConnection_Connection() {} func (*ToolConnection_Opensearch) isToolConnection_Connection() {} +func (*ToolConnection_VictoriaLogs) isToolConnection_Connection() {} + type TimeRange struct { state protoimpl.MessageState `protogen:"open.v1"` Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` @@ -1133,7 +1287,7 @@ type TimeRange struct { func (x *TimeRange) Reset() { *x = TimeRange{} - mi := &file_toolquery_proto_msgTypes[12] + mi := &file_toolquery_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1145,7 +1299,7 @@ func (x *TimeRange) String() string { func (*TimeRange) ProtoMessage() {} func (x *TimeRange) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[12] + mi := &file_toolquery_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1158,7 +1312,7 @@ func (x *TimeRange) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeRange.ProtoReflect.Descriptor instead. func (*TimeRange) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{12} + return file_toolquery_proto_rawDescGZIP(), []int{13} } func (x *TimeRange) GetStart() *timestamppb.Timestamp { @@ -1188,7 +1342,7 @@ type MetricsQueryInput struct { func (x *MetricsQueryInput) Reset() { *x = MetricsQueryInput{} - mi := &file_toolquery_proto_msgTypes[13] + mi := &file_toolquery_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1200,7 +1354,7 @@ func (x *MetricsQueryInput) String() string { func (*MetricsQueryInput) ProtoMessage() {} func (x *MetricsQueryInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[13] + mi := &file_toolquery_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1213,7 +1367,7 @@ func (x *MetricsQueryInput) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsQueryInput.ProtoReflect.Descriptor instead. func (*MetricsQueryInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{13} + return file_toolquery_proto_rawDescGZIP(), []int{14} } func (x *MetricsQueryInput) GetConnection() *ToolConnection { @@ -1260,7 +1414,7 @@ type MetricsOptions struct { func (x *MetricsOptions) Reset() { *x = MetricsOptions{} - mi := &file_toolquery_proto_msgTypes[14] + mi := &file_toolquery_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1272,7 +1426,7 @@ func (x *MetricsOptions) String() string { func (*MetricsOptions) ProtoMessage() {} func (x *MetricsOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[14] + mi := &file_toolquery_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1285,7 +1439,7 @@ func (x *MetricsOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsOptions.ProtoReflect.Descriptor instead. func (*MetricsOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{14} + return file_toolquery_proto_rawDescGZIP(), []int{15} } func (x *MetricsOptions) GetAzure() *AzureMetricsOptions { @@ -1311,7 +1465,7 @@ type AzureMetricsOptions struct { func (x *AzureMetricsOptions) Reset() { *x = AzureMetricsOptions{} - mi := &file_toolquery_proto_msgTypes[15] + mi := &file_toolquery_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1323,7 +1477,7 @@ func (x *AzureMetricsOptions) String() string { func (*AzureMetricsOptions) ProtoMessage() {} func (x *AzureMetricsOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[15] + mi := &file_toolquery_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1336,7 +1490,7 @@ func (x *AzureMetricsOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureMetricsOptions.ProtoReflect.Descriptor instead. func (*AzureMetricsOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{15} + return file_toolquery_proto_rawDescGZIP(), []int{16} } func (x *AzureMetricsOptions) GetResourceId() string { @@ -1405,7 +1559,7 @@ type LogsQueryFacet struct { func (x *LogsQueryFacet) Reset() { *x = LogsQueryFacet{} - mi := &file_toolquery_proto_msgTypes[16] + mi := &file_toolquery_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1417,7 +1571,7 @@ func (x *LogsQueryFacet) String() string { func (*LogsQueryFacet) ProtoMessage() {} func (x *LogsQueryFacet) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[16] + mi := &file_toolquery_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1430,7 +1584,7 @@ func (x *LogsQueryFacet) ProtoReflect() protoreflect.Message { // Deprecated: Use LogsQueryFacet.ProtoReflect.Descriptor instead. func (*LogsQueryFacet) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{16} + return file_toolquery_proto_rawDescGZIP(), []int{17} } func (x *LogsQueryFacet) GetName() string { @@ -1461,7 +1615,7 @@ type LogsQueryInput struct { func (x *LogsQueryInput) Reset() { *x = LogsQueryInput{} - mi := &file_toolquery_proto_msgTypes[17] + mi := &file_toolquery_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1473,7 +1627,7 @@ func (x *LogsQueryInput) String() string { func (*LogsQueryInput) ProtoMessage() {} func (x *LogsQueryInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[17] + mi := &file_toolquery_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1486,7 +1640,7 @@ func (x *LogsQueryInput) ProtoReflect() protoreflect.Message { // Deprecated: Use LogsQueryInput.ProtoReflect.Descriptor instead. func (*LogsQueryInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{17} + return file_toolquery_proto_rawDescGZIP(), []int{18} } func (x *LogsQueryInput) GetConnection() *ToolConnection { @@ -1546,7 +1700,7 @@ type LogAggregateInput struct { func (x *LogAggregateInput) Reset() { *x = LogAggregateInput{} - mi := &file_toolquery_proto_msgTypes[18] + mi := &file_toolquery_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1712,7 @@ func (x *LogAggregateInput) String() string { func (*LogAggregateInput) ProtoMessage() {} func (x *LogAggregateInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[18] + mi := &file_toolquery_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1571,7 +1725,7 @@ func (x *LogAggregateInput) ProtoReflect() protoreflect.Message { // Deprecated: Use LogAggregateInput.ProtoReflect.Descriptor instead. func (*LogAggregateInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{18} + return file_toolquery_proto_rawDescGZIP(), []int{19} } func (x *LogAggregateInput) GetConnection() *ToolConnection { @@ -1632,7 +1786,7 @@ type LogsOptions struct { func (x *LogsOptions) Reset() { *x = LogsOptions{} - mi := &file_toolquery_proto_msgTypes[19] + mi := &file_toolquery_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1644,7 +1798,7 @@ func (x *LogsOptions) String() string { func (*LogsOptions) ProtoMessage() {} func (x *LogsOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[19] + mi := &file_toolquery_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1657,7 +1811,7 @@ func (x *LogsOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use LogsOptions.ProtoReflect.Descriptor instead. func (*LogsOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{19} + return file_toolquery_proto_rawDescGZIP(), []int{20} } func (x *LogsOptions) GetAzure() *AzureLogsOptions { @@ -1676,7 +1830,7 @@ type AzureLogsOptions struct { func (x *AzureLogsOptions) Reset() { *x = AzureLogsOptions{} - mi := &file_toolquery_proto_msgTypes[20] + mi := &file_toolquery_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1688,7 +1842,7 @@ func (x *AzureLogsOptions) String() string { func (*AzureLogsOptions) ProtoMessage() {} func (x *AzureLogsOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[20] + mi := &file_toolquery_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1701,7 +1855,7 @@ func (x *AzureLogsOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureLogsOptions.ProtoReflect.Descriptor instead. func (*AzureLogsOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{20} + return file_toolquery_proto_rawDescGZIP(), []int{21} } func (x *AzureLogsOptions) GetResourceId() string { @@ -1724,7 +1878,7 @@ type TracesQueryInput struct { func (x *TracesQueryInput) Reset() { *x = TracesQueryInput{} - mi := &file_toolquery_proto_msgTypes[21] + mi := &file_toolquery_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1736,7 +1890,7 @@ func (x *TracesQueryInput) String() string { func (*TracesQueryInput) ProtoMessage() {} func (x *TracesQueryInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[21] + mi := &file_toolquery_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1749,7 +1903,7 @@ func (x *TracesQueryInput) ProtoReflect() protoreflect.Message { // Deprecated: Use TracesQueryInput.ProtoReflect.Descriptor instead. func (*TracesQueryInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{21} + return file_toolquery_proto_rawDescGZIP(), []int{22} } func (x *TracesQueryInput) GetConnection() *ToolConnection { @@ -1796,7 +1950,7 @@ type TracesOptions struct { func (x *TracesOptions) Reset() { *x = TracesOptions{} - mi := &file_toolquery_proto_msgTypes[22] + mi := &file_toolquery_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1808,7 +1962,7 @@ func (x *TracesOptions) String() string { func (*TracesOptions) ProtoMessage() {} func (x *TracesOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[22] + mi := &file_toolquery_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1821,7 +1975,7 @@ func (x *TracesOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use TracesOptions.ProtoReflect.Descriptor instead. func (*TracesOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{22} + return file_toolquery_proto_rawDescGZIP(), []int{23} } func (x *TracesOptions) GetJaeger() *JaegerTracesOptions { @@ -1841,7 +1995,7 @@ type JaegerTraceQueryAttribute struct { func (x *JaegerTraceQueryAttribute) Reset() { *x = JaegerTraceQueryAttribute{} - mi := &file_toolquery_proto_msgTypes[23] + mi := &file_toolquery_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1853,7 +2007,7 @@ func (x *JaegerTraceQueryAttribute) String() string { func (*JaegerTraceQueryAttribute) ProtoMessage() {} func (x *JaegerTraceQueryAttribute) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[23] + mi := &file_toolquery_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1866,7 +2020,7 @@ func (x *JaegerTraceQueryAttribute) ProtoReflect() protoreflect.Message { // Deprecated: Use JaegerTraceQueryAttribute.ProtoReflect.Descriptor instead. func (*JaegerTraceQueryAttribute) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{23} + return file_toolquery_proto_rawDescGZIP(), []int{24} } func (x *JaegerTraceQueryAttribute) GetName() string { @@ -1895,7 +2049,7 @@ type JaegerTracesOptions struct { func (x *JaegerTracesOptions) Reset() { *x = JaegerTracesOptions{} - mi := &file_toolquery_proto_msgTypes[24] + mi := &file_toolquery_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1907,7 +2061,7 @@ func (x *JaegerTracesOptions) String() string { func (*JaegerTracesOptions) ProtoMessage() {} func (x *JaegerTracesOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[24] + mi := &file_toolquery_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1920,7 +2074,7 @@ func (x *JaegerTracesOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use JaegerTracesOptions.ProtoReflect.Descriptor instead. func (*JaegerTracesOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{24} + return file_toolquery_proto_rawDescGZIP(), []int{25} } func (x *JaegerTracesOptions) GetOperationName() string { @@ -1963,7 +2117,7 @@ type MetricPoint struct { func (x *MetricPoint) Reset() { *x = MetricPoint{} - mi := &file_toolquery_proto_msgTypes[25] + mi := &file_toolquery_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1975,7 +2129,7 @@ func (x *MetricPoint) String() string { func (*MetricPoint) ProtoMessage() {} func (x *MetricPoint) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[25] + mi := &file_toolquery_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1988,7 +2142,7 @@ func (x *MetricPoint) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricPoint.ProtoReflect.Descriptor instead. func (*MetricPoint) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{25} + return file_toolquery_proto_rawDescGZIP(), []int{26} } func (x *MetricPoint) GetTimestamp() *timestamppb.Timestamp { @@ -2028,7 +2182,7 @@ type MetricsQueryOutput struct { func (x *MetricsQueryOutput) Reset() { *x = MetricsQueryOutput{} - mi := &file_toolquery_proto_msgTypes[26] + mi := &file_toolquery_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2040,7 +2194,7 @@ func (x *MetricsQueryOutput) String() string { func (*MetricsQueryOutput) ProtoMessage() {} func (x *MetricsQueryOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[26] + mi := &file_toolquery_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2053,7 +2207,7 @@ func (x *MetricsQueryOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsQueryOutput.ProtoReflect.Descriptor instead. func (*MetricsQueryOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{26} + return file_toolquery_proto_rawDescGZIP(), []int{27} } func (x *MetricsQueryOutput) GetMetrics() []*MetricPoint { @@ -2080,7 +2234,7 @@ type MetricsSearchInput struct { func (x *MetricsSearchInput) Reset() { *x = MetricsSearchInput{} - mi := &file_toolquery_proto_msgTypes[27] + mi := &file_toolquery_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2092,7 +2246,7 @@ func (x *MetricsSearchInput) String() string { func (*MetricsSearchInput) ProtoMessage() {} func (x *MetricsSearchInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[27] + mi := &file_toolquery_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2105,7 +2259,7 @@ func (x *MetricsSearchInput) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsSearchInput.ProtoReflect.Descriptor instead. func (*MetricsSearchInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{27} + return file_toolquery_proto_rawDescGZIP(), []int{28} } func (x *MetricsSearchInput) GetConnection() *ToolConnection { @@ -2145,7 +2299,7 @@ type MetricsSearchOptions struct { func (x *MetricsSearchOptions) Reset() { *x = MetricsSearchOptions{} - mi := &file_toolquery_proto_msgTypes[28] + mi := &file_toolquery_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2157,7 +2311,7 @@ func (x *MetricsSearchOptions) String() string { func (*MetricsSearchOptions) ProtoMessage() {} func (x *MetricsSearchOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[28] + mi := &file_toolquery_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2170,7 +2324,7 @@ func (x *MetricsSearchOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsSearchOptions.ProtoReflect.Descriptor instead. func (*MetricsSearchOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{28} + return file_toolquery_proto_rawDescGZIP(), []int{29} } func (x *MetricsSearchOptions) GetAzure() *AzureMetricsSearchOptions { @@ -2190,7 +2344,7 @@ type AzureMetricsSearchOptions struct { func (x *AzureMetricsSearchOptions) Reset() { *x = AzureMetricsSearchOptions{} - mi := &file_toolquery_proto_msgTypes[29] + mi := &file_toolquery_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2202,7 +2356,7 @@ func (x *AzureMetricsSearchOptions) String() string { func (*AzureMetricsSearchOptions) ProtoMessage() {} func (x *AzureMetricsSearchOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[29] + mi := &file_toolquery_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2215,7 +2369,7 @@ func (x *AzureMetricsSearchOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureMetricsSearchOptions.ProtoReflect.Descriptor instead. func (*AzureMetricsSearchOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{29} + return file_toolquery_proto_rawDescGZIP(), []int{30} } func (x *AzureMetricsSearchOptions) GetResourceId() string { @@ -2242,7 +2396,7 @@ type MetricsSearchResult struct { func (x *MetricsSearchResult) Reset() { *x = MetricsSearchResult{} - mi := &file_toolquery_proto_msgTypes[30] + mi := &file_toolquery_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2254,7 +2408,7 @@ func (x *MetricsSearchResult) String() string { func (*MetricsSearchResult) ProtoMessage() {} func (x *MetricsSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[30] + mi := &file_toolquery_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2267,7 +2421,7 @@ func (x *MetricsSearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsSearchResult.ProtoReflect.Descriptor instead. func (*MetricsSearchResult) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{30} + return file_toolquery_proto_rawDescGZIP(), []int{31} } func (x *MetricsSearchResult) GetName() string { @@ -2286,7 +2440,7 @@ type MetricsSearchOutput struct { func (x *MetricsSearchOutput) Reset() { *x = MetricsSearchOutput{} - mi := &file_toolquery_proto_msgTypes[31] + mi := &file_toolquery_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2298,7 +2452,7 @@ func (x *MetricsSearchOutput) String() string { func (*MetricsSearchOutput) ProtoMessage() {} func (x *MetricsSearchOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[31] + mi := &file_toolquery_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2311,7 +2465,7 @@ func (x *MetricsSearchOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsSearchOutput.ProtoReflect.Descriptor instead. func (*MetricsSearchOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{31} + return file_toolquery_proto_rawDescGZIP(), []int{32} } func (x *MetricsSearchOutput) GetMetrics() []*MetricsSearchResult { @@ -2335,7 +2489,7 @@ type MetricsLabelSearchInput struct { func (x *MetricsLabelSearchInput) Reset() { *x = MetricsLabelSearchInput{} - mi := &file_toolquery_proto_msgTypes[32] + mi := &file_toolquery_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2347,7 +2501,7 @@ func (x *MetricsLabelSearchInput) String() string { func (*MetricsLabelSearchInput) ProtoMessage() {} func (x *MetricsLabelSearchInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[32] + mi := &file_toolquery_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2360,7 +2514,7 @@ func (x *MetricsLabelSearchInput) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsLabelSearchInput.ProtoReflect.Descriptor instead. func (*MetricsLabelSearchInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{32} + return file_toolquery_proto_rawDescGZIP(), []int{33} } func (x *MetricsLabelSearchInput) GetConnection() *ToolConnection { @@ -2414,7 +2568,7 @@ type MetricsLabelSearchOptions struct { func (x *MetricsLabelSearchOptions) Reset() { *x = MetricsLabelSearchOptions{} - mi := &file_toolquery_proto_msgTypes[33] + mi := &file_toolquery_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2426,7 +2580,7 @@ func (x *MetricsLabelSearchOptions) String() string { func (*MetricsLabelSearchOptions) ProtoMessage() {} func (x *MetricsLabelSearchOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[33] + mi := &file_toolquery_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2439,7 +2593,7 @@ func (x *MetricsLabelSearchOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsLabelSearchOptions.ProtoReflect.Descriptor instead. func (*MetricsLabelSearchOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{33} + return file_toolquery_proto_rawDescGZIP(), []int{34} } func (x *MetricsLabelSearchOptions) GetAzure() *AzureMetricsLabelSearchOptions { @@ -2461,7 +2615,7 @@ type AzureMetricsLabelSearchOptions struct { func (x *AzureMetricsLabelSearchOptions) Reset() { *x = AzureMetricsLabelSearchOptions{} - mi := &file_toolquery_proto_msgTypes[34] + mi := &file_toolquery_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2473,7 +2627,7 @@ func (x *AzureMetricsLabelSearchOptions) String() string { func (*AzureMetricsLabelSearchOptions) ProtoMessage() {} func (x *AzureMetricsLabelSearchOptions) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[34] + mi := &file_toolquery_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2486,7 +2640,7 @@ func (x *AzureMetricsLabelSearchOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureMetricsLabelSearchOptions.ProtoReflect.Descriptor instead. func (*AzureMetricsLabelSearchOptions) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{34} + return file_toolquery_proto_rawDescGZIP(), []int{35} } func (x *AzureMetricsLabelSearchOptions) GetResourceId() string { @@ -2527,7 +2681,7 @@ type MetricsLabelSearchResult struct { func (x *MetricsLabelSearchResult) Reset() { *x = MetricsLabelSearchResult{} - mi := &file_toolquery_proto_msgTypes[35] + mi := &file_toolquery_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2539,7 +2693,7 @@ func (x *MetricsLabelSearchResult) String() string { func (*MetricsLabelSearchResult) ProtoMessage() {} func (x *MetricsLabelSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[35] + mi := &file_toolquery_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2552,7 +2706,7 @@ func (x *MetricsLabelSearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsLabelSearchResult.ProtoReflect.Descriptor instead. func (*MetricsLabelSearchResult) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{35} + return file_toolquery_proto_rawDescGZIP(), []int{36} } func (x *MetricsLabelSearchResult) GetName() string { @@ -2571,7 +2725,7 @@ type MetricsLabelSearchOutput struct { func (x *MetricsLabelSearchOutput) Reset() { *x = MetricsLabelSearchOutput{} - mi := &file_toolquery_proto_msgTypes[36] + mi := &file_toolquery_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2583,7 +2737,7 @@ func (x *MetricsLabelSearchOutput) String() string { func (*MetricsLabelSearchOutput) ProtoMessage() {} func (x *MetricsLabelSearchOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[36] + mi := &file_toolquery_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2596,7 +2750,7 @@ func (x *MetricsLabelSearchOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsLabelSearchOutput.ProtoReflect.Descriptor instead. func (*MetricsLabelSearchOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{36} + return file_toolquery_proto_rawDescGZIP(), []int{37} } func (x *MetricsLabelSearchOutput) GetResults() []*MetricsLabelSearchResult { @@ -2617,7 +2771,7 @@ type LogEntry struct { func (x *LogEntry) Reset() { *x = LogEntry{} - mi := &file_toolquery_proto_msgTypes[37] + mi := &file_toolquery_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2629,7 +2783,7 @@ func (x *LogEntry) String() string { func (*LogEntry) ProtoMessage() {} func (x *LogEntry) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[37] + mi := &file_toolquery_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2642,7 +2796,7 @@ func (x *LogEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use LogEntry.ProtoReflect.Descriptor instead. func (*LogEntry) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{37} + return file_toolquery_proto_rawDescGZIP(), []int{38} } func (x *LogEntry) GetTimestamp() *timestamppb.Timestamp { @@ -2675,7 +2829,7 @@ type LogsQueryOutput struct { func (x *LogsQueryOutput) Reset() { *x = LogsQueryOutput{} - mi := &file_toolquery_proto_msgTypes[38] + mi := &file_toolquery_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2687,7 +2841,7 @@ func (x *LogsQueryOutput) String() string { func (*LogsQueryOutput) ProtoMessage() {} func (x *LogsQueryOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[38] + mi := &file_toolquery_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2700,7 +2854,7 @@ func (x *LogsQueryOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use LogsQueryOutput.ProtoReflect.Descriptor instead. func (*LogsQueryOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{38} + return file_toolquery_proto_rawDescGZIP(), []int{39} } func (x *LogsQueryOutput) GetLogs() []*LogEntry { @@ -2720,7 +2874,7 @@ type LogAggregateBucket struct { func (x *LogAggregateBucket) Reset() { *x = LogAggregateBucket{} - mi := &file_toolquery_proto_msgTypes[39] + mi := &file_toolquery_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2732,7 +2886,7 @@ func (x *LogAggregateBucket) String() string { func (*LogAggregateBucket) ProtoMessage() {} func (x *LogAggregateBucket) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[39] + mi := &file_toolquery_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2745,7 +2899,7 @@ func (x *LogAggregateBucket) ProtoReflect() protoreflect.Message { // Deprecated: Use LogAggregateBucket.ProtoReflect.Descriptor instead. func (*LogAggregateBucket) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{39} + return file_toolquery_proto_rawDescGZIP(), []int{40} } func (x *LogAggregateBucket) GetTimestamp() *timestamppb.Timestamp { @@ -2771,7 +2925,7 @@ type LogAggregateOutput struct { func (x *LogAggregateOutput) Reset() { *x = LogAggregateOutput{} - mi := &file_toolquery_proto_msgTypes[40] + mi := &file_toolquery_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2783,7 +2937,7 @@ func (x *LogAggregateOutput) String() string { func (*LogAggregateOutput) ProtoMessage() {} func (x *LogAggregateOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[40] + mi := &file_toolquery_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2796,7 +2950,7 @@ func (x *LogAggregateOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use LogAggregateOutput.ProtoReflect.Descriptor instead. func (*LogAggregateOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{40} + return file_toolquery_proto_rawDescGZIP(), []int{41} } func (x *LogAggregateOutput) GetBuckets() []*LogAggregateBucket { @@ -2822,7 +2976,7 @@ type TraceSpan struct { func (x *TraceSpan) Reset() { *x = TraceSpan{} - mi := &file_toolquery_proto_msgTypes[41] + mi := &file_toolquery_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2834,7 +2988,7 @@ func (x *TraceSpan) String() string { func (*TraceSpan) ProtoMessage() {} func (x *TraceSpan) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[41] + mi := &file_toolquery_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2847,7 +3001,7 @@ func (x *TraceSpan) ProtoReflect() protoreflect.Message { // Deprecated: Use TraceSpan.ProtoReflect.Descriptor instead. func (*TraceSpan) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{41} + return file_toolquery_proto_rawDescGZIP(), []int{42} } func (x *TraceSpan) GetTraceId() string { @@ -2915,7 +3069,7 @@ type TracesQueryOutput struct { func (x *TracesQueryOutput) Reset() { *x = TracesQueryOutput{} - mi := &file_toolquery_proto_msgTypes[42] + mi := &file_toolquery_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2927,7 +3081,7 @@ func (x *TracesQueryOutput) String() string { func (*TracesQueryOutput) ProtoMessage() {} func (x *TracesQueryOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[42] + mi := &file_toolquery_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2940,7 +3094,7 @@ func (x *TracesQueryOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use TracesQueryOutput.ProtoReflect.Descriptor instead. func (*TracesQueryOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{42} + return file_toolquery_proto_rawDescGZIP(), []int{43} } func (x *TracesQueryOutput) GetSpans() []*TraceSpan { @@ -2961,7 +3115,7 @@ type InvokeLambdaInput struct { func (x *InvokeLambdaInput) Reset() { *x = InvokeLambdaInput{} - mi := &file_toolquery_proto_msgTypes[43] + mi := &file_toolquery_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2973,7 +3127,7 @@ func (x *InvokeLambdaInput) String() string { func (*InvokeLambdaInput) ProtoMessage() {} func (x *InvokeLambdaInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[43] + mi := &file_toolquery_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2986,7 +3140,7 @@ func (x *InvokeLambdaInput) ProtoReflect() protoreflect.Message { // Deprecated: Use InvokeLambdaInput.ProtoReflect.Descriptor instead. func (*InvokeLambdaInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{43} + return file_toolquery_proto_rawDescGZIP(), []int{44} } func (x *InvokeLambdaInput) GetConnection() *cloudquery.Connection { @@ -3020,7 +3174,7 @@ type InvokeLambdaOutput struct { func (x *InvokeLambdaOutput) Reset() { *x = InvokeLambdaOutput{} - mi := &file_toolquery_proto_msgTypes[44] + mi := &file_toolquery_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3032,7 +3186,7 @@ func (x *InvokeLambdaOutput) String() string { func (*InvokeLambdaOutput) ProtoMessage() {} func (x *InvokeLambdaOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[44] + mi := &file_toolquery_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3045,7 +3199,7 @@ func (x *InvokeLambdaOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use InvokeLambdaOutput.ProtoReflect.Descriptor instead. func (*InvokeLambdaOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{44} + return file_toolquery_proto_rawDescGZIP(), []int{45} } func (x *InvokeLambdaOutput) GetResult() string { @@ -3072,7 +3226,7 @@ type RunLuaInput struct { func (x *RunLuaInput) Reset() { *x = RunLuaInput{} - mi := &file_toolquery_proto_msgTypes[45] + mi := &file_toolquery_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3084,7 +3238,7 @@ func (x *RunLuaInput) String() string { func (*RunLuaInput) ProtoMessage() {} func (x *RunLuaInput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[45] + mi := &file_toolquery_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3097,7 +3251,7 @@ func (x *RunLuaInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RunLuaInput.ProtoReflect.Descriptor instead. func (*RunLuaInput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{45} + return file_toolquery_proto_rawDescGZIP(), []int{46} } func (x *RunLuaInput) GetScript() string { @@ -3117,7 +3271,7 @@ type RunLuaOutput struct { func (x *RunLuaOutput) Reset() { *x = RunLuaOutput{} - mi := &file_toolquery_proto_msgTypes[46] + mi := &file_toolquery_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3129,7 +3283,7 @@ func (x *RunLuaOutput) String() string { func (*RunLuaOutput) ProtoMessage() {} func (x *RunLuaOutput) ProtoReflect() protoreflect.Message { - mi := &file_toolquery_proto_msgTypes[46] + mi := &file_toolquery_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3142,7 +3296,7 @@ func (x *RunLuaOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use RunLuaOutput.ProtoReflect.Descriptor instead. func (*RunLuaOutput) Descriptor() ([]byte, []int) { - return file_toolquery_proto_rawDescGZIP(), []int{46} + return file_toolquery_proto_rawDescGZIP(), []int{47} } func (x *RunLuaOutput) GetResultJson() string { @@ -3213,7 +3367,21 @@ const file_toolquery_proto_rawDesc = "" + "\n" + "_tenant_idB\v\n" + "\t_usernameB\v\n" + - "\t_password\"\xd4\x01\n" + + "\t_password\"\x91\x02\n" + + "\x16VictoriaLogsConnection\x12\x10\n" + + "\x03url\x18\x01 \x01(\tR\x03url\x12\x19\n" + + "\x05token\x18\x02 \x01(\tH\x00R\x05token\x88\x01\x01\x12\x1f\n" + + "\busername\x18\x03 \x01(\tH\x01R\busername\x88\x01\x01\x12\x1f\n" + + "\bpassword\x18\x04 \x01(\tH\x02R\bpassword\x88\x01\x01\x12\"\n" + + "\n" + + "account_id\x18\x05 \x01(\tH\x03R\taccountId\x88\x01\x01\x12\"\n" + + "\n" + + "project_id\x18\x06 \x01(\tH\x04R\tprojectId\x88\x01\x01B\b\n" + + "\x06_tokenB\v\n" + + "\t_usernameB\v\n" + + "\t_passwordB\r\n" + + "\v_account_idB\r\n" + + "\v_project_id\"\xd4\x01\n" + "\x0fTempoConnection\x12\x10\n" + "\x03url\x18\x01 \x01(\tR\x03url\x12\x19\n" + "\x05token\x18\x02 \x01(\tH\x00R\x05token\x88\x01\x01\x12 \n" + @@ -3232,12 +3400,14 @@ const file_toolquery_proto_rawDesc = "" + "\bpassword\x18\x04 \x01(\tH\x02R\bpassword\x88\x01\x01B\b\n" + "\x06_tokenB\v\n" + "\t_usernameB\v\n" + - "\t_password\"\xa5\x01\n" + + "\t_password\"\xe0\x01\n" + "\x10SplunkConnection\x12\x10\n" + "\x03url\x18\x01 \x01(\tR\x03url\x12\x19\n" + "\x05token\x18\x02 \x01(\tH\x00R\x05token\x88\x01\x01\x12\x1f\n" + "\busername\x18\x03 \x01(\tH\x01R\busername\x88\x01\x01\x12\x1f\n" + - "\bpassword\x18\x04 \x01(\tH\x02R\bpassword\x88\x01\x01B\b\n" + + "\bpassword\x18\x04 \x01(\tH\x02R\bpassword\x88\x01\x01\x129\n" + + "\n" + + "token_type\x18\x05 \x01(\x0e2\x1a.toolquery.SplunkTokenTypeR\ttokenTypeB\b\n" + "\x06_tokenB\v\n" + "\t_usernameB\v\n" + "\t_password\"M\n" + @@ -3262,7 +3432,7 @@ const file_toolquery_proto_rawDesc = "" + "\x0fsubscription_id\x18\x01 \x01(\tR\x0esubscriptionId\x12\x1b\n" + "\ttenant_id\x18\x02 \x01(\tR\btenantId\x12\x1b\n" + "\tclient_id\x18\x03 \x01(\tR\bclientId\x12#\n" + - "\rclient_secret\x18\x04 \x01(\tR\fclientSecret\"\xa2\x05\n" + + "\rclient_secret\x18\x04 \x01(\tR\fclientSecret\"\xec\x05\n" + "\x0eToolConnection\x128\n" + "\aelastic\x18\x01 \x01(\v2\x1c.toolquery.ElasticConnectionH\x00R\aelastic\x128\n" + "\adatadog\x18\x02 \x01(\v2\x1c.toolquery.DatadogConnectionH\x00R\adatadog\x12A\n" + @@ -3281,7 +3451,8 @@ const file_toolquery_proto_rawDesc = "" + " \x01(\v2\x1b.toolquery.JaegerConnectionH\x00R\x06jaeger\x12A\n" + "\n" + "opensearch\x18\v \x01(\v2\x1f.toolquery.OpensearchConnectionH\x00R\n" + - "opensearchB\f\n" + + "opensearch\x12H\n" + + "\rvictoria_logs\x18\f \x01(\v2!.toolquery.VictoriaLogsConnectionH\x00R\fvictoriaLogsB\f\n" + "\n" + "connection\"k\n" + "\tTimeRange\x120\n" + @@ -3484,7 +3655,12 @@ const file_toolquery_proto_rawDesc = "" + "\x06script\x18\x01 \x01(\tR\x06script\"/\n" + "\fRunLuaOutput\x12\x1f\n" + "\vresult_json\x18\x01 \x01(\tR\n" + - "resultJson*I\n" + + "resultJson*)\n" + + "\x0fSplunkTokenType\x12\n" + + "\n" + + "\x06BEARER\x10\x00\x12\n" + + "\n" + + "\x06SPLUNK\x10\x01*I\n" + "\x10LogQueryOperator\x12\x1a\n" + "\x16LOG_QUERY_OPERATOR_AND\x10\x00\x12\x19\n" + "\x15LOG_QUERY_OPERATOR_OR\x10\x012\xeb\x04\n" + @@ -3510,138 +3686,142 @@ func file_toolquery_proto_rawDescGZIP() []byte { return file_toolquery_proto_rawDescData } -var file_toolquery_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_toolquery_proto_msgTypes = make([]protoimpl.MessageInfo, 50) +var file_toolquery_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_toolquery_proto_msgTypes = make([]protoimpl.MessageInfo, 51) var file_toolquery_proto_goTypes = []any{ - (LogQueryOperator)(0), // 0: toolquery.LogQueryOperator - (*ElasticConnection)(nil), // 1: toolquery.ElasticConnection - (*OpensearchConnection)(nil), // 2: toolquery.OpensearchConnection - (*DatadogConnection)(nil), // 3: toolquery.DatadogConnection - (*PrometheusConnection)(nil), // 4: toolquery.PrometheusConnection - (*LokiConnection)(nil), // 5: toolquery.LokiConnection - (*TempoConnection)(nil), // 6: toolquery.TempoConnection - (*JaegerConnection)(nil), // 7: toolquery.JaegerConnection - (*SplunkConnection)(nil), // 8: toolquery.SplunkConnection - (*DynatraceConnection)(nil), // 9: toolquery.DynatraceConnection - (*CloudwatchConnection)(nil), // 10: toolquery.CloudwatchConnection - (*AzureConnection)(nil), // 11: toolquery.AzureConnection - (*ToolConnection)(nil), // 12: toolquery.ToolConnection - (*TimeRange)(nil), // 13: toolquery.TimeRange - (*MetricsQueryInput)(nil), // 14: toolquery.MetricsQueryInput - (*MetricsOptions)(nil), // 15: toolquery.MetricsOptions - (*AzureMetricsOptions)(nil), // 16: toolquery.AzureMetricsOptions - (*LogsQueryFacet)(nil), // 17: toolquery.LogsQueryFacet - (*LogsQueryInput)(nil), // 18: toolquery.LogsQueryInput - (*LogAggregateInput)(nil), // 19: toolquery.LogAggregateInput - (*LogsOptions)(nil), // 20: toolquery.LogsOptions - (*AzureLogsOptions)(nil), // 21: toolquery.AzureLogsOptions - (*TracesQueryInput)(nil), // 22: toolquery.TracesQueryInput - (*TracesOptions)(nil), // 23: toolquery.TracesOptions - (*JaegerTraceQueryAttribute)(nil), // 24: toolquery.JaegerTraceQueryAttribute - (*JaegerTracesOptions)(nil), // 25: toolquery.JaegerTracesOptions - (*MetricPoint)(nil), // 26: toolquery.MetricPoint - (*MetricsQueryOutput)(nil), // 27: toolquery.MetricsQueryOutput - (*MetricsSearchInput)(nil), // 28: toolquery.MetricsSearchInput - (*MetricsSearchOptions)(nil), // 29: toolquery.MetricsSearchOptions - (*AzureMetricsSearchOptions)(nil), // 30: toolquery.AzureMetricsSearchOptions - (*MetricsSearchResult)(nil), // 31: toolquery.MetricsSearchResult - (*MetricsSearchOutput)(nil), // 32: toolquery.MetricsSearchOutput - (*MetricsLabelSearchInput)(nil), // 33: toolquery.MetricsLabelSearchInput - (*MetricsLabelSearchOptions)(nil), // 34: toolquery.MetricsLabelSearchOptions - (*AzureMetricsLabelSearchOptions)(nil), // 35: toolquery.AzureMetricsLabelSearchOptions - (*MetricsLabelSearchResult)(nil), // 36: toolquery.MetricsLabelSearchResult - (*MetricsLabelSearchOutput)(nil), // 37: toolquery.MetricsLabelSearchOutput - (*LogEntry)(nil), // 38: toolquery.LogEntry - (*LogsQueryOutput)(nil), // 39: toolquery.LogsQueryOutput - (*LogAggregateBucket)(nil), // 40: toolquery.LogAggregateBucket - (*LogAggregateOutput)(nil), // 41: toolquery.LogAggregateOutput - (*TraceSpan)(nil), // 42: toolquery.TraceSpan - (*TracesQueryOutput)(nil), // 43: toolquery.TracesQueryOutput - (*InvokeLambdaInput)(nil), // 44: toolquery.InvokeLambdaInput - (*InvokeLambdaOutput)(nil), // 45: toolquery.InvokeLambdaOutput - (*RunLuaInput)(nil), // 46: toolquery.RunLuaInput - (*RunLuaOutput)(nil), // 47: toolquery.RunLuaOutput - nil, // 48: toolquery.MetricPoint.LabelsEntry - nil, // 49: toolquery.LogEntry.LabelsEntry - nil, // 50: toolquery.TraceSpan.TagsEntry - (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp - (*cloudquery.Connection)(nil), // 52: cloudquery.Connection + (SplunkTokenType)(0), // 0: toolquery.SplunkTokenType + (LogQueryOperator)(0), // 1: toolquery.LogQueryOperator + (*ElasticConnection)(nil), // 2: toolquery.ElasticConnection + (*OpensearchConnection)(nil), // 3: toolquery.OpensearchConnection + (*DatadogConnection)(nil), // 4: toolquery.DatadogConnection + (*PrometheusConnection)(nil), // 5: toolquery.PrometheusConnection + (*LokiConnection)(nil), // 6: toolquery.LokiConnection + (*VictoriaLogsConnection)(nil), // 7: toolquery.VictoriaLogsConnection + (*TempoConnection)(nil), // 8: toolquery.TempoConnection + (*JaegerConnection)(nil), // 9: toolquery.JaegerConnection + (*SplunkConnection)(nil), // 10: toolquery.SplunkConnection + (*DynatraceConnection)(nil), // 11: toolquery.DynatraceConnection + (*CloudwatchConnection)(nil), // 12: toolquery.CloudwatchConnection + (*AzureConnection)(nil), // 13: toolquery.AzureConnection + (*ToolConnection)(nil), // 14: toolquery.ToolConnection + (*TimeRange)(nil), // 15: toolquery.TimeRange + (*MetricsQueryInput)(nil), // 16: toolquery.MetricsQueryInput + (*MetricsOptions)(nil), // 17: toolquery.MetricsOptions + (*AzureMetricsOptions)(nil), // 18: toolquery.AzureMetricsOptions + (*LogsQueryFacet)(nil), // 19: toolquery.LogsQueryFacet + (*LogsQueryInput)(nil), // 20: toolquery.LogsQueryInput + (*LogAggregateInput)(nil), // 21: toolquery.LogAggregateInput + (*LogsOptions)(nil), // 22: toolquery.LogsOptions + (*AzureLogsOptions)(nil), // 23: toolquery.AzureLogsOptions + (*TracesQueryInput)(nil), // 24: toolquery.TracesQueryInput + (*TracesOptions)(nil), // 25: toolquery.TracesOptions + (*JaegerTraceQueryAttribute)(nil), // 26: toolquery.JaegerTraceQueryAttribute + (*JaegerTracesOptions)(nil), // 27: toolquery.JaegerTracesOptions + (*MetricPoint)(nil), // 28: toolquery.MetricPoint + (*MetricsQueryOutput)(nil), // 29: toolquery.MetricsQueryOutput + (*MetricsSearchInput)(nil), // 30: toolquery.MetricsSearchInput + (*MetricsSearchOptions)(nil), // 31: toolquery.MetricsSearchOptions + (*AzureMetricsSearchOptions)(nil), // 32: toolquery.AzureMetricsSearchOptions + (*MetricsSearchResult)(nil), // 33: toolquery.MetricsSearchResult + (*MetricsSearchOutput)(nil), // 34: toolquery.MetricsSearchOutput + (*MetricsLabelSearchInput)(nil), // 35: toolquery.MetricsLabelSearchInput + (*MetricsLabelSearchOptions)(nil), // 36: toolquery.MetricsLabelSearchOptions + (*AzureMetricsLabelSearchOptions)(nil), // 37: toolquery.AzureMetricsLabelSearchOptions + (*MetricsLabelSearchResult)(nil), // 38: toolquery.MetricsLabelSearchResult + (*MetricsLabelSearchOutput)(nil), // 39: toolquery.MetricsLabelSearchOutput + (*LogEntry)(nil), // 40: toolquery.LogEntry + (*LogsQueryOutput)(nil), // 41: toolquery.LogsQueryOutput + (*LogAggregateBucket)(nil), // 42: toolquery.LogAggregateBucket + (*LogAggregateOutput)(nil), // 43: toolquery.LogAggregateOutput + (*TraceSpan)(nil), // 44: toolquery.TraceSpan + (*TracesQueryOutput)(nil), // 45: toolquery.TracesQueryOutput + (*InvokeLambdaInput)(nil), // 46: toolquery.InvokeLambdaInput + (*InvokeLambdaOutput)(nil), // 47: toolquery.InvokeLambdaOutput + (*RunLuaInput)(nil), // 48: toolquery.RunLuaInput + (*RunLuaOutput)(nil), // 49: toolquery.RunLuaOutput + nil, // 50: toolquery.MetricPoint.LabelsEntry + nil, // 51: toolquery.LogEntry.LabelsEntry + nil, // 52: toolquery.TraceSpan.TagsEntry + (*timestamppb.Timestamp)(nil), // 53: google.protobuf.Timestamp + (*cloudquery.Connection)(nil), // 54: cloudquery.Connection } var file_toolquery_proto_depIdxs = []int32{ - 1, // 0: toolquery.ToolConnection.elastic:type_name -> toolquery.ElasticConnection - 3, // 1: toolquery.ToolConnection.datadog:type_name -> toolquery.DatadogConnection - 4, // 2: toolquery.ToolConnection.prometheus:type_name -> toolquery.PrometheusConnection - 5, // 3: toolquery.ToolConnection.loki:type_name -> toolquery.LokiConnection - 6, // 4: toolquery.ToolConnection.tempo:type_name -> toolquery.TempoConnection - 8, // 5: toolquery.ToolConnection.splunk:type_name -> toolquery.SplunkConnection - 9, // 6: toolquery.ToolConnection.dynatrace:type_name -> toolquery.DynatraceConnection - 10, // 7: toolquery.ToolConnection.cloudwatch:type_name -> toolquery.CloudwatchConnection - 11, // 8: toolquery.ToolConnection.azure:type_name -> toolquery.AzureConnection - 7, // 9: toolquery.ToolConnection.jaeger:type_name -> toolquery.JaegerConnection - 2, // 10: toolquery.ToolConnection.opensearch:type_name -> toolquery.OpensearchConnection - 51, // 11: toolquery.TimeRange.start:type_name -> google.protobuf.Timestamp - 51, // 12: toolquery.TimeRange.end:type_name -> google.protobuf.Timestamp - 12, // 13: toolquery.MetricsQueryInput.connection:type_name -> toolquery.ToolConnection - 13, // 14: toolquery.MetricsQueryInput.range:type_name -> toolquery.TimeRange - 15, // 15: toolquery.MetricsQueryInput.options:type_name -> toolquery.MetricsOptions - 16, // 16: toolquery.MetricsOptions.azure:type_name -> toolquery.AzureMetricsOptions - 12, // 17: toolquery.LogsQueryInput.connection:type_name -> toolquery.ToolConnection - 13, // 18: toolquery.LogsQueryInput.range:type_name -> toolquery.TimeRange - 17, // 19: toolquery.LogsQueryInput.facets:type_name -> toolquery.LogsQueryFacet - 20, // 20: toolquery.LogsQueryInput.options:type_name -> toolquery.LogsOptions - 12, // 21: toolquery.LogAggregateInput.connection:type_name -> toolquery.ToolConnection - 13, // 22: toolquery.LogAggregateInput.range:type_name -> toolquery.TimeRange - 17, // 23: toolquery.LogAggregateInput.facets:type_name -> toolquery.LogsQueryFacet - 20, // 24: toolquery.LogAggregateInput.options:type_name -> toolquery.LogsOptions - 0, // 25: toolquery.LogAggregateInput.operator:type_name -> toolquery.LogQueryOperator - 21, // 26: toolquery.LogsOptions.azure:type_name -> toolquery.AzureLogsOptions - 12, // 27: toolquery.TracesQueryInput.connection:type_name -> toolquery.ToolConnection - 13, // 28: toolquery.TracesQueryInput.range:type_name -> toolquery.TimeRange - 23, // 29: toolquery.TracesQueryInput.options:type_name -> toolquery.TracesOptions - 25, // 30: toolquery.TracesOptions.jaeger:type_name -> toolquery.JaegerTracesOptions - 24, // 31: toolquery.JaegerTracesOptions.attributes:type_name -> toolquery.JaegerTraceQueryAttribute - 51, // 32: toolquery.MetricPoint.timestamp:type_name -> google.protobuf.Timestamp - 48, // 33: toolquery.MetricPoint.labels:type_name -> toolquery.MetricPoint.LabelsEntry - 26, // 34: toolquery.MetricsQueryOutput.metrics:type_name -> toolquery.MetricPoint - 12, // 35: toolquery.MetricsSearchInput.connection:type_name -> toolquery.ToolConnection - 29, // 36: toolquery.MetricsSearchInput.options:type_name -> toolquery.MetricsSearchOptions - 30, // 37: toolquery.MetricsSearchOptions.azure:type_name -> toolquery.AzureMetricsSearchOptions - 31, // 38: toolquery.MetricsSearchOutput.metrics:type_name -> toolquery.MetricsSearchResult - 12, // 39: toolquery.MetricsLabelSearchInput.connection:type_name -> toolquery.ToolConnection - 34, // 40: toolquery.MetricsLabelSearchInput.options:type_name -> toolquery.MetricsLabelSearchOptions - 35, // 41: toolquery.MetricsLabelSearchOptions.azure:type_name -> toolquery.AzureMetricsLabelSearchOptions - 36, // 42: toolquery.MetricsLabelSearchOutput.results:type_name -> toolquery.MetricsLabelSearchResult - 51, // 43: toolquery.LogEntry.timestamp:type_name -> google.protobuf.Timestamp - 49, // 44: toolquery.LogEntry.labels:type_name -> toolquery.LogEntry.LabelsEntry - 38, // 45: toolquery.LogsQueryOutput.logs:type_name -> toolquery.LogEntry - 51, // 46: toolquery.LogAggregateBucket.timestamp:type_name -> google.protobuf.Timestamp - 40, // 47: toolquery.LogAggregateOutput.buckets:type_name -> toolquery.LogAggregateBucket - 51, // 48: toolquery.TraceSpan.start:type_name -> google.protobuf.Timestamp - 51, // 49: toolquery.TraceSpan.end:type_name -> google.protobuf.Timestamp - 50, // 50: toolquery.TraceSpan.tags:type_name -> toolquery.TraceSpan.TagsEntry - 42, // 51: toolquery.TracesQueryOutput.spans:type_name -> toolquery.TraceSpan - 52, // 52: toolquery.InvokeLambdaInput.connection:type_name -> cloudquery.Connection - 14, // 53: toolquery.ToolQuery.Metrics:input_type -> toolquery.MetricsQueryInput - 28, // 54: toolquery.ToolQuery.MetricsSearch:input_type -> toolquery.MetricsSearchInput - 33, // 55: toolquery.ToolQuery.MetricsLabelSearch:input_type -> toolquery.MetricsLabelSearchInput - 18, // 56: toolquery.ToolQuery.Logs:input_type -> toolquery.LogsQueryInput - 19, // 57: toolquery.ToolQuery.LogAggregate:input_type -> toolquery.LogAggregateInput - 22, // 58: toolquery.ToolQuery.Traces:input_type -> toolquery.TracesQueryInput - 44, // 59: toolquery.ToolQuery.InvokeLambda:input_type -> toolquery.InvokeLambdaInput - 46, // 60: toolquery.ToolQuery.RunLua:input_type -> toolquery.RunLuaInput - 27, // 61: toolquery.ToolQuery.Metrics:output_type -> toolquery.MetricsQueryOutput - 32, // 62: toolquery.ToolQuery.MetricsSearch:output_type -> toolquery.MetricsSearchOutput - 37, // 63: toolquery.ToolQuery.MetricsLabelSearch:output_type -> toolquery.MetricsLabelSearchOutput - 39, // 64: toolquery.ToolQuery.Logs:output_type -> toolquery.LogsQueryOutput - 41, // 65: toolquery.ToolQuery.LogAggregate:output_type -> toolquery.LogAggregateOutput - 43, // 66: toolquery.ToolQuery.Traces:output_type -> toolquery.TracesQueryOutput - 45, // 67: toolquery.ToolQuery.InvokeLambda:output_type -> toolquery.InvokeLambdaOutput - 47, // 68: toolquery.ToolQuery.RunLua:output_type -> toolquery.RunLuaOutput - 61, // [61:69] is the sub-list for method output_type - 53, // [53:61] is the sub-list for method input_type - 53, // [53:53] is the sub-list for extension type_name - 53, // [53:53] is the sub-list for extension extendee - 0, // [0:53] is the sub-list for field type_name + 0, // 0: toolquery.SplunkConnection.token_type:type_name -> toolquery.SplunkTokenType + 2, // 1: toolquery.ToolConnection.elastic:type_name -> toolquery.ElasticConnection + 4, // 2: toolquery.ToolConnection.datadog:type_name -> toolquery.DatadogConnection + 5, // 3: toolquery.ToolConnection.prometheus:type_name -> toolquery.PrometheusConnection + 6, // 4: toolquery.ToolConnection.loki:type_name -> toolquery.LokiConnection + 8, // 5: toolquery.ToolConnection.tempo:type_name -> toolquery.TempoConnection + 10, // 6: toolquery.ToolConnection.splunk:type_name -> toolquery.SplunkConnection + 11, // 7: toolquery.ToolConnection.dynatrace:type_name -> toolquery.DynatraceConnection + 12, // 8: toolquery.ToolConnection.cloudwatch:type_name -> toolquery.CloudwatchConnection + 13, // 9: toolquery.ToolConnection.azure:type_name -> toolquery.AzureConnection + 9, // 10: toolquery.ToolConnection.jaeger:type_name -> toolquery.JaegerConnection + 3, // 11: toolquery.ToolConnection.opensearch:type_name -> toolquery.OpensearchConnection + 7, // 12: toolquery.ToolConnection.victoria_logs:type_name -> toolquery.VictoriaLogsConnection + 53, // 13: toolquery.TimeRange.start:type_name -> google.protobuf.Timestamp + 53, // 14: toolquery.TimeRange.end:type_name -> google.protobuf.Timestamp + 14, // 15: toolquery.MetricsQueryInput.connection:type_name -> toolquery.ToolConnection + 15, // 16: toolquery.MetricsQueryInput.range:type_name -> toolquery.TimeRange + 17, // 17: toolquery.MetricsQueryInput.options:type_name -> toolquery.MetricsOptions + 18, // 18: toolquery.MetricsOptions.azure:type_name -> toolquery.AzureMetricsOptions + 14, // 19: toolquery.LogsQueryInput.connection:type_name -> toolquery.ToolConnection + 15, // 20: toolquery.LogsQueryInput.range:type_name -> toolquery.TimeRange + 19, // 21: toolquery.LogsQueryInput.facets:type_name -> toolquery.LogsQueryFacet + 22, // 22: toolquery.LogsQueryInput.options:type_name -> toolquery.LogsOptions + 14, // 23: toolquery.LogAggregateInput.connection:type_name -> toolquery.ToolConnection + 15, // 24: toolquery.LogAggregateInput.range:type_name -> toolquery.TimeRange + 19, // 25: toolquery.LogAggregateInput.facets:type_name -> toolquery.LogsQueryFacet + 22, // 26: toolquery.LogAggregateInput.options:type_name -> toolquery.LogsOptions + 1, // 27: toolquery.LogAggregateInput.operator:type_name -> toolquery.LogQueryOperator + 23, // 28: toolquery.LogsOptions.azure:type_name -> toolquery.AzureLogsOptions + 14, // 29: toolquery.TracesQueryInput.connection:type_name -> toolquery.ToolConnection + 15, // 30: toolquery.TracesQueryInput.range:type_name -> toolquery.TimeRange + 25, // 31: toolquery.TracesQueryInput.options:type_name -> toolquery.TracesOptions + 27, // 32: toolquery.TracesOptions.jaeger:type_name -> toolquery.JaegerTracesOptions + 26, // 33: toolquery.JaegerTracesOptions.attributes:type_name -> toolquery.JaegerTraceQueryAttribute + 53, // 34: toolquery.MetricPoint.timestamp:type_name -> google.protobuf.Timestamp + 50, // 35: toolquery.MetricPoint.labels:type_name -> toolquery.MetricPoint.LabelsEntry + 28, // 36: toolquery.MetricsQueryOutput.metrics:type_name -> toolquery.MetricPoint + 14, // 37: toolquery.MetricsSearchInput.connection:type_name -> toolquery.ToolConnection + 31, // 38: toolquery.MetricsSearchInput.options:type_name -> toolquery.MetricsSearchOptions + 32, // 39: toolquery.MetricsSearchOptions.azure:type_name -> toolquery.AzureMetricsSearchOptions + 33, // 40: toolquery.MetricsSearchOutput.metrics:type_name -> toolquery.MetricsSearchResult + 14, // 41: toolquery.MetricsLabelSearchInput.connection:type_name -> toolquery.ToolConnection + 36, // 42: toolquery.MetricsLabelSearchInput.options:type_name -> toolquery.MetricsLabelSearchOptions + 37, // 43: toolquery.MetricsLabelSearchOptions.azure:type_name -> toolquery.AzureMetricsLabelSearchOptions + 38, // 44: toolquery.MetricsLabelSearchOutput.results:type_name -> toolquery.MetricsLabelSearchResult + 53, // 45: toolquery.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 51, // 46: toolquery.LogEntry.labels:type_name -> toolquery.LogEntry.LabelsEntry + 40, // 47: toolquery.LogsQueryOutput.logs:type_name -> toolquery.LogEntry + 53, // 48: toolquery.LogAggregateBucket.timestamp:type_name -> google.protobuf.Timestamp + 42, // 49: toolquery.LogAggregateOutput.buckets:type_name -> toolquery.LogAggregateBucket + 53, // 50: toolquery.TraceSpan.start:type_name -> google.protobuf.Timestamp + 53, // 51: toolquery.TraceSpan.end:type_name -> google.protobuf.Timestamp + 52, // 52: toolquery.TraceSpan.tags:type_name -> toolquery.TraceSpan.TagsEntry + 44, // 53: toolquery.TracesQueryOutput.spans:type_name -> toolquery.TraceSpan + 54, // 54: toolquery.InvokeLambdaInput.connection:type_name -> cloudquery.Connection + 16, // 55: toolquery.ToolQuery.Metrics:input_type -> toolquery.MetricsQueryInput + 30, // 56: toolquery.ToolQuery.MetricsSearch:input_type -> toolquery.MetricsSearchInput + 35, // 57: toolquery.ToolQuery.MetricsLabelSearch:input_type -> toolquery.MetricsLabelSearchInput + 20, // 58: toolquery.ToolQuery.Logs:input_type -> toolquery.LogsQueryInput + 21, // 59: toolquery.ToolQuery.LogAggregate:input_type -> toolquery.LogAggregateInput + 24, // 60: toolquery.ToolQuery.Traces:input_type -> toolquery.TracesQueryInput + 46, // 61: toolquery.ToolQuery.InvokeLambda:input_type -> toolquery.InvokeLambdaInput + 48, // 62: toolquery.ToolQuery.RunLua:input_type -> toolquery.RunLuaInput + 29, // 63: toolquery.ToolQuery.Metrics:output_type -> toolquery.MetricsQueryOutput + 34, // 64: toolquery.ToolQuery.MetricsSearch:output_type -> toolquery.MetricsSearchOutput + 39, // 65: toolquery.ToolQuery.MetricsLabelSearch:output_type -> toolquery.MetricsLabelSearchOutput + 41, // 66: toolquery.ToolQuery.Logs:output_type -> toolquery.LogsQueryOutput + 43, // 67: toolquery.ToolQuery.LogAggregate:output_type -> toolquery.LogAggregateOutput + 45, // 68: toolquery.ToolQuery.Traces:output_type -> toolquery.TracesQueryOutput + 47, // 69: toolquery.ToolQuery.InvokeLambda:output_type -> toolquery.InvokeLambdaOutput + 49, // 70: toolquery.ToolQuery.RunLua:output_type -> toolquery.RunLuaOutput + 63, // [63:71] is the sub-list for method output_type + 55, // [55:63] is the sub-list for method input_type + 55, // [55:55] is the sub-list for extension type_name + 55, // [55:55] is the sub-list for extension extendee + 0, // [0:55] is the sub-list for field type_name } func init() { file_toolquery_proto_init() } @@ -3656,8 +3836,9 @@ func file_toolquery_proto_init() { file_toolquery_proto_msgTypes[5].OneofWrappers = []any{} file_toolquery_proto_msgTypes[6].OneofWrappers = []any{} file_toolquery_proto_msgTypes[7].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[9].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[11].OneofWrappers = []any{ + file_toolquery_proto_msgTypes[8].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[10].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[12].OneofWrappers = []any{ (*ToolConnection_Elastic)(nil), (*ToolConnection_Datadog)(nil), (*ToolConnection_Prometheus)(nil), @@ -3669,29 +3850,30 @@ func file_toolquery_proto_init() { (*ToolConnection_Azure)(nil), (*ToolConnection_Jaeger)(nil), (*ToolConnection_Opensearch)(nil), + (*ToolConnection_VictoriaLogs)(nil), } - file_toolquery_proto_msgTypes[13].OneofWrappers = []any{} file_toolquery_proto_msgTypes[14].OneofWrappers = []any{} file_toolquery_proto_msgTypes[15].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[17].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[16].OneofWrappers = []any{} file_toolquery_proto_msgTypes[18].OneofWrappers = []any{} file_toolquery_proto_msgTypes[19].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[21].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[20].OneofWrappers = []any{} file_toolquery_proto_msgTypes[22].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[24].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[27].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[23].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[25].OneofWrappers = []any{} file_toolquery_proto_msgTypes[28].OneofWrappers = []any{} file_toolquery_proto_msgTypes[29].OneofWrappers = []any{} - file_toolquery_proto_msgTypes[32].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[30].OneofWrappers = []any{} file_toolquery_proto_msgTypes[33].OneofWrappers = []any{} file_toolquery_proto_msgTypes[34].OneofWrappers = []any{} + file_toolquery_proto_msgTypes[35].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_toolquery_proto_rawDesc), len(file_toolquery_proto_rawDesc)), - NumEnums: 1, - NumMessages: 50, + NumEnums: 2, + NumMessages: 51, NumExtensions: 0, NumServices: 1, }, diff --git a/go/cloud-query/internal/service/toolquery.go b/go/cloud-query/internal/service/toolquery.go index 236a5ef210..2ea6390e79 100644 --- a/go/cloud-query/internal/service/toolquery.go +++ b/go/cloud-query/internal/service/toolquery.go @@ -109,7 +109,7 @@ func (in *ToolQueryService) Logs(ctx context.Context, input *toolquery.LogsQuery return nil, status.Error(codes.InvalidArgument, "input is required") } - if err := in.validateInput(input.GetConnection(), input.GetQuery(), input.GetRange()); err != nil { + if err := in.validateLogsInput(input.GetConnection(), input.GetQuery(), input.GetRange()); err != nil { return nil, err } provider, err := tools.NewProvider(input.GetConnection()) @@ -130,7 +130,7 @@ func (in *ToolQueryService) LogAggregate(ctx context.Context, input *toolquery.L return nil, status.Error(codes.InvalidArgument, "input is required") } - if err := in.validateInput(input.GetConnection(), input.GetQuery(), input.GetRange()); err != nil { + if err := in.validateLogsInput(input.GetConnection(), input.GetQuery(), input.GetRange()); err != nil { return nil, err } if bucketSize, err := time.ParseDuration(input.GetBucketSize()); err != nil || bucketSize <= 0 { @@ -247,6 +247,18 @@ func (in *ToolQueryService) validateInput(connection *toolquery.ToolConnection, return in.validateTimeRange(timeRange) } +func (in *ToolQueryService) validateLogsInput(connection *toolquery.ToolConnection, _ string, timeRange *toolquery.TimeRange) error { + if err := in.validateSearchInput(connection); err != nil { + return err + } + + if connection.GetDynatrace() != nil { + return nil + } + + return in.validateTimeRange(timeRange) +} + func (in *ToolQueryService) validateSearchInput(connection *toolquery.ToolConnection) error { if connection == nil { return status.Error(codes.InvalidArgument, "connection is required") diff --git a/go/cloud-query/internal/service/toolquery_test.go b/go/cloud-query/internal/service/toolquery_test.go index 8433231600..3b9b540986 100644 --- a/go/cloud-query/internal/service/toolquery_test.go +++ b/go/cloud-query/internal/service/toolquery_test.go @@ -38,3 +38,26 @@ func TestLogAggregateValidation(t *testing.T) { require.Equal(t, codes.InvalidArgument, status.Code(err)) require.Contains(t, err.Error(), "bucket_size") } + +func TestEmptyLogQueryValidation(t *testing.T) { + service := &ToolQueryService{} + now := time.Now().UTC() + timeRange := &toolquery.TimeRange{ + Start: timestamppb.New(now.Add(-time.Hour)), + End: timestamppb.New(now), + } + elastic := &toolquery.ToolConnection{ + Connection: &toolquery.ToolConnection_Elastic{ + Elastic: &toolquery.ElasticConnection{}, + }, + } + loki := &toolquery.ToolConnection{ + Connection: &toolquery.ToolConnection_Loki{ + Loki: &toolquery.LokiConnection{}, + }, + } + + require.NoError(t, service.validateLogsInput(elastic, "", timeRange)) + require.NoError(t, service.validateLogsInput(loki, "", timeRange)) + require.Error(t, service.validateInput(loki, "", timeRange)) +} diff --git a/go/cloud-query/internal/tools/client/splunk.go b/go/cloud-query/internal/tools/client/splunk.go index 2330e5e7bf..e8408fe879 100644 --- a/go/cloud-query/internal/tools/client/splunk.go +++ b/go/cloud-query/internal/tools/client/splunk.go @@ -7,6 +7,7 @@ import ( "net/url" "strings" + "github.com/pluralsh/console/go/cloud-query/internal/proto/toolquery" "resty.dev/v3" ) @@ -16,7 +17,7 @@ type SplunkClient struct { baseURL string } -func NewSplunkClient(baseURL, token, username, password string) *SplunkClient { +func NewSplunkClient(baseURL, token string, tokenType toolquery.SplunkTokenType, username, password string) *SplunkClient { client := resty.New() normalizedBaseURL, insecureSkipVerify := normalizeSplunkURL(baseURL) @@ -26,7 +27,11 @@ func NewSplunkClient(baseURL, token, username, password string) *SplunkClient { } if len(token) > 0 { - client.SetHeader("Authorization", "Splunk "+token) + realm := "Bearer" + if tokenType == toolquery.SplunkTokenType_SPLUNK { + realm = "Splunk" + } + client.SetHeader("Authorization", realm+" "+token) } else if len(username) > 0 && len(password) > 0 { client.SetBasicAuth(username, password) } diff --git a/go/cloud-query/internal/tools/client/splunk_test.go b/go/cloud-query/internal/tools/client/splunk_test.go index 0e436ce14e..7c2f1be11b 100644 --- a/go/cloud-query/internal/tools/client/splunk_test.go +++ b/go/cloud-query/internal/tools/client/splunk_test.go @@ -1,6 +1,47 @@ package client -import "testing" +import ( + "context" + "net/http" + "net/http/httptest" + "net/url" + "testing" + + "github.com/pluralsh/console/go/cloud-query/internal/proto/toolquery" +) + +func TestSplunkClientTokenRealm(t *testing.T) { + t.Parallel() + + for _, test := range []struct { + name string + tokenType toolquery.SplunkTokenType + wantAuth string + }{ + {name: "defaults to bearer", tokenType: toolquery.SplunkTokenType_BEARER, wantAuth: "Bearer test-token"}, + {name: "uses splunk", tokenType: toolquery.SplunkTokenType_SPLUNK, wantAuth: "Splunk test-token"}, + } { + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if got := r.Header.Get("Authorization"); got != test.wantAuth { + t.Errorf("Authorization = %q, want %q", got, test.wantAuth) + } + _, _ = w.Write([]byte(`{"preview":false}`)) + })) + defer server.Close() + + splunk := NewSplunkClient(server.URL, "test-token", test.tokenType, "", "") + defer splunk.Close() + + if _, err := splunk.ExportSearch(context.Background(), url.Values{"search": {"search *"}}); err != nil { + t.Fatalf("ExportSearch() error = %v", err) + } + }) + } +} func TestNormalizeSplunkURL(t *testing.T) { t.Parallel() diff --git a/go/cloud-query/internal/tools/client/victoria_logs.go b/go/cloud-query/internal/tools/client/victoria_logs.go new file mode 100644 index 0000000000..2fb4162be4 --- /dev/null +++ b/go/cloud-query/internal/tools/client/victoria_logs.go @@ -0,0 +1,63 @@ +package client + +import ( + "context" + "fmt" + "net/url" + "strings" + + "resty.dev/v3" +) + +type VictoriaLogsClient struct { + *resty.Client + + baseURL string +} + +func NewVictoriaLogsClient(baseURL, token, username, password, accountID, projectID string) *VictoriaLogsClient { + client := resty.New() + + if len(token) > 0 { + client.SetAuthToken(token) + client.SetAuthScheme("Bearer") + } else if len(username) > 0 && len(password) > 0 { + client.SetBasicAuth(username, password) + } + + if accountID != "" { + client.SetHeader("AccountID", accountID) + } + if projectID != "" { + client.SetHeader("ProjectID", projectID) + } + + return &VictoriaLogsClient{ + Client: client, + baseURL: strings.TrimSuffix(baseURL, "/"), + } +} + +func (in *VictoriaLogsClient) Query(ctx context.Context, params url.Values) (string, error) { + return in.post(ctx, "/select/logsql/query", params) +} + +func (in *VictoriaLogsClient) Hits(ctx context.Context, params url.Values) (string, error) { + return in.post(ctx, "/select/logsql/hits", params) +} + +func (in *VictoriaLogsClient) post(ctx context.Context, path string, params url.Values) (string, error) { + response, err := in.R(). + SetContext(ctx). + SetContentType("application/x-www-form-urlencoded"). + SetFormDataFromValues(params). + Post(in.baseURL + path) + if err != nil { + return "", err + } + if response.IsError() { + return "", fmt.Errorf("victoria logs %s failed: status=%d body=%s", path, response.StatusCode(), response.String()) + } + + return response.String(), nil +} diff --git a/go/cloud-query/internal/tools/logs_facets.go b/go/cloud-query/internal/tools/logs_facets.go index 1f84511e45..122aa761f2 100644 --- a/go/cloud-query/internal/tools/logs_facets.go +++ b/go/cloud-query/internal/tools/logs_facets.go @@ -40,7 +40,7 @@ func datadogEscapeLogQueryValue(v string) string { // splunkSearchWithFacets appends field predicates to the first search stage of an SPL pipeline. func splunkSearchWithFacets(query string, limit int32, facets []*toolquery.LogsQueryFacet) string { clause := splunkFacetClause(facets) - trimmed := strings.TrimSpace(query) + trimmed := strings.TrimSpace(defaultLogQuery(query, "*")) var pipeline string if strings.HasPrefix(trimmed, "search ") { diff --git a/go/cloud-query/internal/tools/loki_facets.go b/go/cloud-query/internal/tools/loki_facets.go index 15fc9eb03b..64fd3a2f15 100644 --- a/go/cloud-query/internal/tools/loki_facets.go +++ b/go/cloud-query/internal/tools/loki_facets.go @@ -24,6 +24,9 @@ func mergeLokiQueryWithFacets(query string, facets []*toolquery.LogsQueryFacet) extra := strings.Join(additions, ",") q := strings.TrimSpace(query) + if q == "" { + return "{" + extra + "}" + } start := strings.Index(q, "{") if start >= 0 { depth := 0 diff --git a/go/cloud-query/internal/tools/provider.go b/go/cloud-query/internal/tools/provider.go index 4e25d3fd38..17751c4ff5 100644 --- a/go/cloud-query/internal/tools/provider.go +++ b/go/cloud-query/internal/tools/provider.go @@ -24,6 +24,13 @@ func escapeDoubleQuoted(value string) string { return strings.NewReplacer(`\`, `\\`, `"`, `\"`).Replace(value) } +func defaultLogQuery(query, fallback string) string { + if strings.TrimSpace(query) == "" { + return fallback + } + return query +} + type MetricsProvider interface { Metrics(ctx context.Context, input *toolquery.MetricsQueryInput) (*toolquery.MetricsQueryOutput, error) MetricsSearch(ctx context.Context, input *toolquery.MetricsSearchInput) (*toolquery.MetricsSearchOutput, error) @@ -70,6 +77,8 @@ func newLogsProvider(conn *toolquery.ToolConnection) (LogsProvider, error) { return NewCloudwatchProvider(provider.Cloudwatch), nil case *toolquery.ToolConnection_Azure: return NewAzureProvider(provider.Azure) + case *toolquery.ToolConnection_VictoriaLogs: + return NewVictoriaLogsProvider(provider.VictoriaLogs), nil default: return nil, nil } diff --git a/go/cloud-query/internal/tools/provider_azure.go b/go/cloud-query/internal/tools/provider_azure.go index 726dd04c47..b891ad4f7b 100644 --- a/go/cloud-query/internal/tools/provider_azure.go +++ b/go/cloud-query/internal/tools/provider_azure.go @@ -229,8 +229,8 @@ func (in *AzureProvider) metricsLabelSearchValues(ctx context.Context, input *to } func (in *AzureProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInput) (*toolquery.LogsQueryOutput, error) { - if input == nil || strings.TrimSpace(input.GetQuery()) == "" { - return nil, fmt.Errorf("%w: query is required", ErrInvalidArgument) + if input == nil { + return nil, ErrInvalidArgument } resourceID := azureLogsResourceID(input.GetOptions()) if resourceID == "" { @@ -238,7 +238,7 @@ func (in *AzureProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInp } body := azlogs.QueryBody{ - Query: new(input.GetQuery()), + Query: new(defaultLogQuery(input.GetQuery(), "search *")), Timespan: logsTimeRange(input.GetRange()), } resp, err := in.client.Logs(ctx, resourceID, body, nil) @@ -250,8 +250,8 @@ func (in *AzureProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInp } func (in *AzureProvider) LogAggregate(ctx context.Context, input *toolquery.LogAggregateInput) (*toolquery.LogAggregateOutput, error) { - if input == nil || strings.TrimSpace(input.GetQuery()) == "" { - return nil, fmt.Errorf("%w: query is required", ErrInvalidArgument) + if input == nil { + return nil, ErrInvalidArgument } resourceID := azureLogsResourceID(input.GetOptions()) if resourceID == "" { @@ -268,7 +268,7 @@ func (in *AzureProvider) LogAggregate(ctx context.Context, input *toolquery.LogA } func azureLogAggregateQueryBody(input *toolquery.LogAggregateInput) azlogs.QueryBody { - query := azureLogsQueryWithFacets(input.GetQuery(), input.GetFacets(), input.GetOperator()) + query := azureLogsQueryWithFacets(defaultLogQuery(input.GetQuery(), "search *"), input.GetFacets(), input.GetOperator()) query = fmt.Sprintf( "%s | summarize count = count() by timestamp = bin(TimeGenerated, %s) | order by timestamp asc", query, diff --git a/go/cloud-query/internal/tools/provider_cloudwatch.go b/go/cloud-query/internal/tools/provider_cloudwatch.go index 9d4d7bc62b..2df2fcb1df 100644 --- a/go/cloud-query/internal/tools/provider_cloudwatch.go +++ b/go/cloud-query/internal/tools/provider_cloudwatch.go @@ -218,8 +218,8 @@ func (in *CloudwatchProvider) Logs(ctx context.Context, input *toolquery.LogsQue if in.conn == nil { return nil, fmt.Errorf("%w: cloudwatch connection is required", ErrInvalidArgument) } - if input == nil || input.GetQuery() == "" { - return nil, fmt.Errorf("%w: query is required", ErrInvalidArgument) + if input == nil { + return nil, ErrInvalidArgument } cfg, err := in.newAWSConfig(ctx) @@ -227,7 +227,10 @@ func (in *CloudwatchProvider) Logs(ctx context.Context, input *toolquery.LogsQue return nil, err } - query := cloudwatchLogsQueryWithFacets(input.GetQuery(), input.GetFacets()) + query := cloudwatchLogsQueryWithFacets( + defaultLogQuery(input.GetQuery(), "fields @timestamp, @message | sort @timestamp desc"), + input.GetFacets(), + ) startQueryInput := &cloudwatchlogs.StartQueryInput{ StartTime: aws.Int64(input.GetRange().GetStart().AsTime().Unix()), EndTime: aws.Int64(input.GetRange().GetEnd().AsTime().Unix()), @@ -265,8 +268,8 @@ func (in *CloudwatchProvider) LogAggregate(ctx context.Context, input *toolquery if in.conn == nil { return nil, fmt.Errorf("%w: cloudwatch connection is required", ErrInvalidArgument) } - if input == nil || input.GetQuery() == "" { - return nil, fmt.Errorf("%w: query is required", ErrInvalidArgument) + if input == nil { + return nil, ErrInvalidArgument } cfg, err := in.newAWSConfig(ctx) @@ -302,7 +305,7 @@ func (in *CloudwatchProvider) LogAggregate(ctx context.Context, input *toolquery } func cloudwatchLogAggregateStartQueryInput(input *toolquery.LogAggregateInput) *cloudwatchlogs.StartQueryInput { - query := cloudwatchLogsQueryWithFacets(input.GetQuery(), input.GetFacets()) + query := cloudwatchLogsQueryWithFacets(defaultLogQuery(input.GetQuery(), "fields @timestamp"), input.GetFacets()) query = fmt.Sprintf("%s | stats count(*) as count by bin(%s) as timestamp", query, input.GetBucketSize()) return &cloudwatchlogs.StartQueryInput{ StartTime: aws.Int64(input.GetRange().GetStart().AsTime().Unix()), diff --git a/go/cloud-query/internal/tools/provider_datadog.go b/go/cloud-query/internal/tools/provider_datadog.go index 99a693533b..8f9d2fa255 100644 --- a/go/cloud-query/internal/tools/provider_datadog.go +++ b/go/cloud-query/internal/tools/provider_datadog.go @@ -143,7 +143,7 @@ func (in *DatadogProvider) Logs(ctx context.Context, input *toolquery.LogsQueryI if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } @@ -155,7 +155,7 @@ func (in *DatadogProvider) Logs(ctx context.Context, input *toolquery.LogsQueryI filter := datadogV2.NewLogsQueryFilter() filter.SetFrom(input.GetRange().GetStart().AsTime().UTC().Format(time.RFC3339Nano)) filter.SetTo(input.GetRange().GetEnd().AsTime().UTC().Format(time.RFC3339Nano)) - filter.SetQuery(datadogLogsQueryWithFacets(input.Query, input.GetFacets())) + filter.SetQuery(datadogLogsQueryWithFacets(defaultLogQuery(input.Query, "*"), input.GetFacets())) request := datadogV2.NewLogsListRequest() request.SetFilter(*filter) @@ -179,7 +179,7 @@ func (in *DatadogProvider) LogAggregate(ctx context.Context, input *toolquery.Lo if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } @@ -201,7 +201,7 @@ func datadogLogAggregateRequest(input *toolquery.LogAggregateInput) *datadogV2.L filter := datadogV2.NewLogsQueryFilter() filter.SetFrom(input.GetRange().GetStart().AsTime().UTC().Format(time.RFC3339Nano)) filter.SetTo(input.GetRange().GetEnd().AsTime().UTC().Format(time.RFC3339Nano)) - filter.SetQuery(datadogLogsQueryWithFacets(datadogAggregateQuery(input.Query, input.GetOperator()), input.GetFacets())) + filter.SetQuery(datadogLogsQueryWithFacets(datadogAggregateQuery(defaultLogQuery(input.Query, "*"), input.GetOperator()), input.GetFacets())) compute := datadogV2.NewLogsCompute(datadogV2.LOGSAGGREGATIONFUNCTION_COUNT) compute.SetType(datadogV2.LOGSCOMPUTETYPE_TIMESERIES) diff --git a/go/cloud-query/internal/tools/provider_dynatrace.go b/go/cloud-query/internal/tools/provider_dynatrace.go index d3860133f5..ceb4ffa0ab 100644 --- a/go/cloud-query/internal/tools/provider_dynatrace.go +++ b/go/cloud-query/internal/tools/provider_dynatrace.go @@ -70,7 +70,7 @@ func (in *DynatraceProvider) MetricsLabelSearch(ctx context.Context, input *tool } func (in *DynatraceProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInput) (*toolquery.LogsQueryOutput, error) { - if in.client == nil { + if in.client == nil || input == nil { return nil, ErrInvalidArgument } @@ -80,7 +80,7 @@ func (in *DynatraceProvider) Logs(ctx context.Context, input *toolquery.LogsQuer resp, err := in.client.Logs( ctx, - input.GetQuery(), + defaultLogQuery(input.GetQuery(), "fetch logs"), ) if err != nil { return nil, err @@ -93,11 +93,11 @@ func (in *DynatraceProvider) LogAggregate(ctx context.Context, input *toolquery. if in.client == nil || input == nil { return nil, ErrInvalidArgument } - if !strings.HasPrefix(input.GetQuery(), "fetch logs") { + if !strings.HasPrefix(defaultLogQuery(input.GetQuery(), "fetch logs"), "fetch logs") { return nil, fmt.Errorf("invalid query: must start with 'fetch logs'") } - query := dynatraceLogsQueryWithFacets(input.GetQuery(), input.GetFacets(), input.GetOperator()) + query := dynatraceLogsQueryWithFacets(defaultLogQuery(input.GetQuery(), "fetch logs"), input.GetFacets(), input.GetOperator()) query = fmt.Sprintf( "%s | summarize count = count(), by:{timestamp = bin(timestamp, %s)}", query, @@ -194,7 +194,7 @@ func dynatraceAggregateCount(value any) (int64, bool) { } func (in *DynatraceProvider) validateLogsInput(input *toolquery.LogsQueryInput) error { - if !strings.HasPrefix(input.GetQuery(), "fetch logs") { + if !strings.HasPrefix(defaultLogQuery(input.GetQuery(), "fetch logs"), "fetch logs") { return fmt.Errorf("invalid query: must start with 'fetch logs'") } diff --git a/go/cloud-query/internal/tools/provider_elastic.go b/go/cloud-query/internal/tools/provider_elastic.go index 461ae4ed76..7e3b904532 100644 --- a/go/cloud-query/internal/tools/provider_elastic.go +++ b/go/cloud-query/internal/tools/provider_elastic.go @@ -9,7 +9,6 @@ import ( "github.com/elastic/go-elasticsearch/v9" "github.com/elastic/go-elasticsearch/v9/typedapi/core/search" - "github.com/elastic/go-elasticsearch/v9/typedapi/esdsl" "github.com/elastic/go-elasticsearch/v9/typedapi/types" "github.com/elastic/go-elasticsearch/v9/typedapi/types/enums/operator" "github.com/samber/lo" @@ -42,7 +41,7 @@ func (in *ElasticProvider) Logs(ctx context.Context, input *toolquery.LogsQueryI if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } @@ -63,7 +62,7 @@ func (in *ElasticProvider) LogAggregate(ctx context.Context, input *toolquery.Lo if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } @@ -174,21 +173,27 @@ func (in *ElasticProvider) elasticLogsQuery(query string, timeRange *toolquery.T }) } - queryString := esdsl.NewQueryStringQuery(query). - AllowLeadingWildcard(true). - DefaultField("*"). - AnalyzeWildcard(true) + matchOperator := operator.Or if defaultOperator != nil { - queryString.DefaultOperator(*defaultOperator) + matchOperator = *defaultOperator + } + + messageQuery := types.Query{ + Match: map[string]types.MatchQuery{ + "message": { + Analyzer: lo.ToPtr("stop"), + Operator: &matchOperator, + Query: query, + }, + }, + } + if query == "" || query == "*" { + messageQuery = types.Query{MatchAll: &types.MatchAllQuery{}} } return &types.Query{ Bool: &types.BoolQuery{ - Must: []types.Query{ - { - QueryString: queryString.QueryStringQueryCaster(), - }, - }, + Must: []types.Query{messageQuery}, Filter: append([]types.Query{ {Range: map[string]types.RangeQuery{ "@timestamp": types.DateRangeQuery{ diff --git a/go/cloud-query/internal/tools/provider_log_aggregate_test.go b/go/cloud-query/internal/tools/provider_log_aggregate_test.go index 632f310995..5cfa950703 100644 --- a/go/cloud-query/internal/tools/provider_log_aggregate_test.go +++ b/go/cloud-query/internal/tools/provider_log_aggregate_test.go @@ -17,6 +17,93 @@ import ( "github.com/pluralsh/console/go/cloud-query/internal/proto/toolquery" ) +func TestElasticLogsMessageQuery(t *testing.T) { + timeRange := &toolquery.TimeRange{ + Start: timestamppb.New(time.Unix(1704067200, 0)), + End: timestamppb.New(time.Unix(1704070800, 0)), + } + + t.Run("defaults to OR matching on message", func(t *testing.T) { + request := (&ElasticProvider{}).toRequest(&toolquery.LogsQueryInput{ + Query: "error OR failure", + Range: timeRange, + Facets: []*toolquery.LogsQueryFacet{ + {Name: "cluster.name.keyword", Value: "mgmt"}, + }, + }) + data, err := json.Marshal(request) + if err != nil { + t.Fatalf("failed to marshal Elasticsearch logs request: %v", err) + } + + body := string(data) + for _, expected := range []string{ + `"match":{"message":`, + `"analyzer":"stop"`, + `"operator":"or"`, + `"query":"error OR failure"`, + `"cluster.name.keyword":{"value":"mgmt"}`, + } { + if !strings.Contains(body, expected) { + t.Fatalf("logs request missing %s: %s", expected, body) + } + } + }) + + for _, query := range []string{"", " ", "*"} { + t.Run("uses match_all for "+query, func(t *testing.T) { + request := (&ElasticProvider{}).toRequest(&toolquery.LogsQueryInput{ + Query: query, + Range: timeRange, + }) + data, err := json.Marshal(request) + if err != nil { + t.Fatalf("failed to marshal Elasticsearch match-all request: %v", err) + } + + body := string(data) + if !strings.Contains(body, `"match_all":{}`) { + t.Fatalf("empty or wildcard request missing match_all query: %s", body) + } + if strings.Contains(body, `"match":{"message":`) { + t.Fatalf("empty or wildcard request unexpectedly contains a message match: %s", body) + } + }) + } +} + +func TestEmptyLogProviderQueryDefaults(t *testing.T) { + input := logAggregateTestInput(toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_OR) + input.Query = "" + input.Facets = nil + + datadogFilter := datadogLogAggregateRequest(input).GetFilter() + if got := datadogFilter.GetQuery(); got != "*" { + t.Fatalf("unexpected Datadog empty query: %q", got) + } + if got := splunkSearchWithFacets("", 0, nil); got != "search *" { + t.Fatalf("unexpected Splunk empty query: %q", got) + } + if got := lokiQueryWithFacets("", nil); got != `{job=~".+"}` { + t.Fatalf("unexpected Loki empty query: %q", got) + } + if got := lokiQueryWithFacets("", []*toolquery.LogsQueryFacet{{Name: "namespace", Value: "prod"}}); got != `{namespace="prod"}` { + t.Fatalf("unexpected Loki facets-only query: %q", got) + } + if got := mergeVictoriaLogsQueryWithFacets(defaultLogQuery("", "*"), nil, input.GetOperator()); got != "*" { + t.Fatalf("unexpected VictoriaLogs empty query: %q", got) + } + if got := *azureLogAggregateQueryBody(input).Query; !strings.HasPrefix(got, "search * | summarize") { + t.Fatalf("unexpected Azure empty query: %q", got) + } + if got := *cloudwatchLogAggregateStartQueryInput(input).QueryString; !strings.HasPrefix(got, "fields @timestamp | stats") { + t.Fatalf("unexpected CloudWatch empty query: %q", got) + } + if got := defaultLogQuery("", "fetch logs"); got != "fetch logs" { + t.Fatalf("unexpected Dynatrace empty query: %q", got) + } +} + func TestElasticLogAggregateRequestAndResponse(t *testing.T) { input := logAggregateTestInput(toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_OR) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -203,7 +290,9 @@ func assertElasticAggregateBody(t *testing.T, body io.Reader, input *toolquery.L `"size":0`, `"field":"@timestamp"`, `"fixed_interval":"` + input.GetBucketSize() + `"`, - `"default_operator":"` + operator + `"`, + `"match":{"message":`, + `"analyzer":"stop"`, + `"operator":"` + operator + `"`, `"query":"error timeout"`, `"gte":"2024-01-01T00:00:00Z"`, `"lte":"2024-01-01T01:00:00Z"`, diff --git a/go/cloud-query/internal/tools/provider_loki.go b/go/cloud-query/internal/tools/provider_loki.go index bdcd4b90c8..4b52257690 100644 --- a/go/cloud-query/internal/tools/provider_loki.go +++ b/go/cloud-query/internal/tools/provider_loki.go @@ -6,6 +6,7 @@ import ( "fmt" "sort" "strconv" + "strings" "time" "google.golang.org/protobuf/types/known/timestamppb" @@ -26,7 +27,7 @@ func (in *LokiProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInpu if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } @@ -35,7 +36,7 @@ func (in *LokiProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInpu resp, err := client.Logs( ctx, - mergeLokiQueryWithFacets(input.Query, input.GetFacets()), + lokiQueryWithFacets(input.Query, input.GetFacets()), strconv.FormatInt(input.GetRange().GetStart().AsTime().UnixNano(), 10), strconv.FormatInt(input.GetRange().GetEnd().AsTime().UnixNano(), 10), strconv.Itoa(int(input.GetLimit()))) @@ -50,14 +51,14 @@ func (in *LokiProvider) LogAggregate(ctx context.Context, input *toolquery.LogAg if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } lokiClient := client.NewLokiClient(in.conn.GetUrl(), in.conn.GetToken(), in.conn.GetUsername(), in.conn.GetPassword(), in.conn.GetTenantId()) defer lokiClient.Close() - query := mergeLokiQueryWithFacets(input.Query, input.GetFacets()) + query := lokiQueryWithFacets(input.Query, input.GetFacets()) resp, err := lokiClient.LogAggregate( ctx, fmt.Sprintf("sum(count_over_time(%s[%s]))", query, input.GetBucketSize()), @@ -103,6 +104,16 @@ func (in *LokiProvider) LogAggregate(ctx context.Context, input *toolquery.LogAg return &toolquery.LogAggregateOutput{Buckets: buckets}, nil } +func lokiQueryWithFacets(query string, facets []*toolquery.LogsQueryFacet) string { + if strings.TrimSpace(query) == "" { + if facetQuery := mergeLokiQueryWithFacets("", facets); strings.TrimSpace(facetQuery) != "" { + return facetQuery + } + query = `{job=~".+"}` + } + return mergeLokiQueryWithFacets(query, facets) +} + func lokiAggregateTimestamp(value any) (time.Time, error) { seconds, err := strconv.ParseFloat(fmt.Sprint(value), 64) if err != nil { diff --git a/go/cloud-query/internal/tools/provider_opensearch.go b/go/cloud-query/internal/tools/provider_opensearch.go index 63e9edce05..c38f7f91a2 100644 --- a/go/cloud-query/internal/tools/provider_opensearch.go +++ b/go/cloud-query/internal/tools/provider_opensearch.go @@ -47,7 +47,7 @@ func (in *OpensearchProvider) Logs(ctx context.Context, input *toolquery.LogsQue if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } @@ -86,7 +86,7 @@ func (in *OpensearchProvider) LogAggregate(ctx context.Context, input *toolquery if in.conn == nil { return nil, ErrInvalidArgument } - if input == nil || input.Query == "" { + if input == nil { return nil, ErrInvalidArgument } diff --git a/go/cloud-query/internal/tools/provider_splunk.go b/go/cloud-query/internal/tools/provider_splunk.go index 73f460957d..bbdff2bdcd 100644 --- a/go/cloud-query/internal/tools/provider_splunk.go +++ b/go/cloud-query/internal/tools/provider_splunk.go @@ -71,6 +71,7 @@ func (in *SplunkProvider) Logs(ctx context.Context, input *toolquery.LogsQueryIn client := client.NewSplunkClient( in.conn.GetUrl(), in.conn.GetToken(), + in.conn.GetTokenType(), in.conn.GetUsername(), in.conn.GetPassword(), ) @@ -107,6 +108,7 @@ func (in *SplunkProvider) LogAggregate(ctx context.Context, input *toolquery.Log client := client.NewSplunkClient( in.conn.GetUrl(), in.conn.GetToken(), + in.conn.GetTokenType(), in.conn.GetUsername(), in.conn.GetPassword(), ) diff --git a/go/cloud-query/internal/tools/provider_victoria_logs.go b/go/cloud-query/internal/tools/provider_victoria_logs.go new file mode 100644 index 0000000000..563b586b21 --- /dev/null +++ b/go/cloud-query/internal/tools/provider_victoria_logs.go @@ -0,0 +1,224 @@ +package tools + +import ( + "bufio" + "context" + "encoding/json" + "fmt" + "net/url" + "sort" + "strconv" + "strings" + "time" + + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/pluralsh/console/go/cloud-query/internal/proto/toolquery" + "github.com/pluralsh/console/go/cloud-query/internal/tools/client" +) + +type VictoriaLogsProvider struct { + conn *toolquery.VictoriaLogsConnection +} + +type victoriaLogsHitsResponse struct { + Hits []struct { + Timestamps []string `json:"timestamps"` + Values []int64 `json:"values"` + } `json:"hits"` +} + +func NewVictoriaLogsProvider(conn *toolquery.VictoriaLogsConnection) LogsProvider { + return &VictoriaLogsProvider{conn: conn} +} + +func (in *VictoriaLogsProvider) Logs(ctx context.Context, input *toolquery.LogsQueryInput) (*toolquery.LogsQueryOutput, error) { + if in.conn == nil { + return nil, ErrInvalidArgument + } + if input == nil { + return nil, ErrInvalidArgument + } + + vlClient := client.NewVictoriaLogsClient( + in.conn.GetUrl(), + in.conn.GetToken(), + in.conn.GetUsername(), + in.conn.GetPassword(), + in.conn.GetAccountId(), + in.conn.GetProjectId(), + ) + defer vlClient.Close() + + body, err := vlClient.Query(ctx, in.queryParams(defaultLogQuery(input.Query, "*"), input.GetFacets(), input.GetLimit(), input.GetRange(), toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_AND)) + if err != nil { + return nil, err + } + + return in.toLogsQueryOutput(body) +} + +func (in *VictoriaLogsProvider) LogAggregate(ctx context.Context, input *toolquery.LogAggregateInput) (*toolquery.LogAggregateOutput, error) { + if in.conn == nil { + return nil, ErrInvalidArgument + } + if input == nil { + return nil, ErrInvalidArgument + } + + vlClient := client.NewVictoriaLogsClient( + in.conn.GetUrl(), + in.conn.GetToken(), + in.conn.GetUsername(), + in.conn.GetPassword(), + in.conn.GetAccountId(), + in.conn.GetProjectId(), + ) + defer vlClient.Close() + + params := in.rangeParams(mergeVictoriaLogsQueryWithFacets(defaultLogQuery(input.Query, "*"), input.GetFacets(), input.GetOperator()), input.GetRange()) + params.Set("step", input.GetBucketSize()) + + body, err := vlClient.Hits(ctx, params) + if err != nil { + return nil, err + } + + var resp victoriaLogsHitsResponse + if err := json.Unmarshal([]byte(body), &resp); err != nil { + return nil, fmt.Errorf("decode victoria logs hits: %w", err) + } + + counts := map[int64]int64{} + for _, hit := range resp.Hits { + n := len(hit.Timestamps) + if len(hit.Values) < n { + n = len(hit.Values) + } + for i := 0; i < n; i++ { + ts, err := parseVictoriaLogsTime(hit.Timestamps[i]) + if err != nil { + return nil, err + } + counts[ts.UnixNano()] += hit.Values[i] + } + } + + timestamps := make([]int64, 0, len(counts)) + for timestamp := range counts { + timestamps = append(timestamps, timestamp) + } + sort.Slice(timestamps, func(i, j int) bool { return timestamps[i] < timestamps[j] }) + + buckets := make([]*toolquery.LogAggregateBucket, 0, len(timestamps)) + for _, timestamp := range timestamps { + buckets = append(buckets, &toolquery.LogAggregateBucket{ + Timestamp: timestamppb.New(time.Unix(0, timestamp)), + Count: counts[timestamp], + }) + } + + return &toolquery.LogAggregateOutput{Buckets: buckets}, nil +} + +func (in *VictoriaLogsProvider) queryParams(query string, facets []*toolquery.LogsQueryFacet, limit int32, timeRange *toolquery.TimeRange, operator toolquery.LogQueryOperator) url.Values { + params := in.rangeParams(mergeVictoriaLogsQueryWithFacets(query, facets, operator), timeRange) + if limit > 0 { + params.Set("limit", strconv.Itoa(int(limit))) + } + return params +} + +func (in *VictoriaLogsProvider) rangeParams(query string, timeRange *toolquery.TimeRange) url.Values { + params := url.Values{ + "query": {query}, + } + if timeRange != nil && timeRange.GetStart() != nil { + params.Set("start", timeRange.GetStart().AsTime().UTC().Format(time.RFC3339Nano)) + } + if timeRange != nil && timeRange.GetEnd() != nil { + params.Set("end", timeRange.GetEnd().AsTime().UTC().Format(time.RFC3339Nano)) + } + return params +} + +func (in *VictoriaLogsProvider) toLogsQueryOutput(body string) (*toolquery.LogsQueryOutput, error) { + logs := make([]*toolquery.LogEntry, 0) + scanner := bufio.NewScanner(strings.NewReader(body)) + scanner.Buffer(make([]byte, 0, 64*1024), 16*1024*1024) + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + + var entry map[string]any + if err := json.Unmarshal([]byte(line), &entry); err != nil { + return nil, fmt.Errorf("decode victoria logs line: %w", err) + } + + message, _ := entry["_msg"].(string) + rawTime, _ := entry["_time"].(string) + ts, err := parseVictoriaLogsTime(rawTime) + if err != nil { + return nil, err + } + + logs = append(logs, &toolquery.LogEntry{ + Timestamp: timestamppb.New(ts), + Message: message, + Labels: victoriaLogsLabels(entry), + }) + } + if err := scanner.Err(); err != nil { + return nil, err + } + + return &toolquery.LogsQueryOutput{Logs: logs}, nil +} + +func victoriaLogsLabels(entry map[string]any) map[string]string { + labels := make(map[string]string, len(entry)) + for key, value := range entry { + if key == "_msg" || key == "_time" { + continue + } + labels[key] = victoriaLogsStringify(value) + } + return labels +} + +func victoriaLogsStringify(value any) string { + switch typed := value.(type) { + case nil: + return "" + case string: + return typed + case json.Number: + return typed.String() + default: + encoded, err := json.Marshal(typed) + if err != nil { + return fmt.Sprint(typed) + } + return string(encoded) + } +} + +func parseVictoriaLogsTime(value string) (time.Time, error) { + value = strings.TrimSpace(value) + if value == "" { + return time.Time{}, fmt.Errorf("missing victoria logs timestamp") + } + if ts, err := time.Parse(time.RFC3339Nano, value); err == nil { + return ts, nil + } + if ts, err := time.Parse(time.RFC3339, value); err == nil { + return ts, nil + } + if ns, err := strconv.ParseInt(value, 10, 64); err == nil { + return time.Unix(0, ns), nil + } + return time.Time{}, fmt.Errorf("unsupported victoria logs timestamp %q", value) +} diff --git a/go/cloud-query/internal/tools/provider_victoria_logs_test.go b/go/cloud-query/internal/tools/provider_victoria_logs_test.go new file mode 100644 index 0000000000..2a7d3fb933 --- /dev/null +++ b/go/cloud-query/internal/tools/provider_victoria_logs_test.go @@ -0,0 +1,135 @@ +package tools + +import ( + "context" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/pluralsh/console/go/cloud-query/internal/proto/toolquery" +) + +func TestMergeVictoriaLogsQueryWithFacets(t *testing.T) { + andQuery := mergeVictoriaLogsQueryWithFacets(`error`, []*toolquery.LogsQueryFacet{ + {Name: "service", Value: "api"}, + {Name: "env", Value: `prod"x`}, + }, toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_AND) + if andQuery != `error service:="api" env:="prod\"x"` { + t.Fatalf("unexpected AND LogsQL: %q", andQuery) + } + + orQuery := mergeVictoriaLogsQueryWithFacets(`error`, []*toolquery.LogsQueryFacet{ + {Name: "service", Value: "api"}, + {Name: "env", Value: "prod"}, + }, toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_OR) + if orQuery != `error (service:="api" OR env:="prod")` { + t.Fatalf("unexpected OR LogsQL: %q", orQuery) + } +} + +func TestVictoriaLogsLogsRequestAndResponse(t *testing.T) { + limit := int32(10) + input := &toolquery.LogsQueryInput{ + Query: "error", + Limit: &limit, + Range: &toolquery.TimeRange{ + Start: timestamppb.New(time.Unix(1704067200, 0).UTC()), + End: timestamppb.New(time.Unix(1704070800, 0).UTC()), + }, + Facets: []*toolquery.LogsQueryFacet{{Name: "service", Value: "api"}}, + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + t.Fatalf("unexpected method: %s", r.Method) + } + if r.URL.Path != "/select/logsql/query" { + t.Fatalf("unexpected path: %s", r.URL.Path) + } + if got := r.Header.Get("AccountID"); got != "12" { + t.Fatalf("unexpected AccountID: %q", got) + } + if got := r.Header.Get("ProjectID"); got != "34" { + t.Fatalf("unexpected ProjectID: %q", got) + } + if err := r.ParseForm(); err != nil { + t.Fatalf("parse form: %v", err) + } + assertQueryValues(t, r.Form, map[string]string{ + "query": `error service:="api"`, + "limit": "10", + "start": "2024-01-01T00:00:00Z", + "end": "2024-01-01T01:00:00Z", + }) + w.Header().Set("Content-Type", "application/stream+json") + _, _ = io.WriteString(w, `{ "_msg":"boom","_time":"2024-01-01T00:00:00Z","_stream":"{}","level":"error"}`+"\n") + _, _ = io.WriteString(w, `{ "_msg":"later","_time":"2024-01-01T00:05:00Z","pod":"api-1"}`+"\n") + })) + defer server.Close() + + accountID := "12" + projectID := "34" + provider := NewVictoriaLogsProvider(&toolquery.VictoriaLogsConnection{ + Url: server.URL, + AccountId: &accountID, + ProjectId: &projectID, + }) + output, err := provider.Logs(context.Background(), input) + if err != nil { + t.Fatalf("victoria logs Logs failed: %v", err) + } + if len(output.GetLogs()) != 2 { + t.Fatalf("unexpected log count: %d", len(output.GetLogs())) + } + if output.Logs[0].GetMessage() != "boom" { + t.Fatalf("unexpected first message: %q", output.Logs[0].GetMessage()) + } + if output.Logs[0].GetLabels()["level"] != "error" { + t.Fatalf("unexpected labels: %#v", output.Logs[0].GetLabels()) + } + if got := output.Logs[1].GetTimestamp().AsTime().Unix(); got != 1704067500 { + t.Fatalf("unexpected second timestamp: %d", got) + } +} + +func TestVictoriaLogsLogAggregateRequestAndResponse(t *testing.T) { + input := logAggregateTestInput(toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_OR) + input.Query = "error" + input.Facets = []*toolquery.LogsQueryFacet{ + {Name: "service", Value: "api"}, + {Name: "env", Value: "prod"}, + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/select/logsql/hits" { + t.Fatalf("unexpected path: %s", r.URL.Path) + } + if err := r.ParseForm(); err != nil { + t.Fatalf("parse form: %v", err) + } + assertQueryValues(t, r.Form, map[string]string{ + "query": `error (service:="api" OR env:="prod")`, + "start": "2024-01-01T00:00:00Z", + "end": "2024-01-01T01:00:00Z", + "step": "5m", + }) + w.Header().Set("Content-Type", "application/json") + _, _ = io.WriteString(w, `{ + "hits": [ + {"timestamps": ["2024-01-01T00:00:00Z", "2024-01-01T00:05:00Z"], "values": [3, 8]} + ] + }`) + })) + defer server.Close() + + provider := NewVictoriaLogsProvider(&toolquery.VictoriaLogsConnection{Url: server.URL}) + output, err := provider.LogAggregate(context.Background(), input) + if err != nil { + t.Fatalf("victoria logs LogAggregate failed: %v", err) + } + assertAggregateBuckets(t, output, []int64{1704067200, 1704067500}, []int64{3, 8}) +} diff --git a/go/cloud-query/internal/tools/victoria_logs_facets.go b/go/cloud-query/internal/tools/victoria_logs_facets.go new file mode 100644 index 0000000000..28012a0817 --- /dev/null +++ b/go/cloud-query/internal/tools/victoria_logs_facets.go @@ -0,0 +1,42 @@ +package tools + +import ( + "fmt" + "strings" + + "github.com/pluralsh/console/go/cloud-query/internal/proto/toolquery" +) + +func mergeVictoriaLogsQueryWithFacets(query string, facets []*toolquery.LogsQueryFacet, operator toolquery.LogQueryOperator) string { + filters := make([]string, 0, len(facets)) + for _, facet := range facets { + name := strings.TrimSpace(facet.GetName()) + if name == "" { + continue + } + filters = append(filters, fmt.Sprintf(`%s:="%s"`, victoriaLogsQuoteIdent(name), escapeDoubleQuoted(facet.GetValue()))) + } + if len(filters) == 0 { + return query + } + + q := strings.TrimSpace(query) + facetExpr := strings.Join(filters, " ") + if operator == toolquery.LogQueryOperator_LOG_QUERY_OPERATOR_OR && len(filters) > 1 { + facetExpr = "(" + strings.Join(filters, " OR ") + ")" + } + if q == "" { + return facetExpr + } + return q + " " + facetExpr +} + +func victoriaLogsQuoteIdent(name string) string { + for _, r := range name { + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_' { + continue + } + return `"` + strings.ReplaceAll(name, `"`, `\"`) + `"` + } + return name +} diff --git a/go/controller/api/v1alpha1/deploymentsettings_types.go b/go/controller/api/v1alpha1/deploymentsettings_types.go index 12672f16cd..30bf282802 100644 --- a/go/controller/api/v1alpha1/deploymentsettings_types.go +++ b/go/controller/api/v1alpha1/deploymentsettings_types.go @@ -779,6 +779,7 @@ func (in *AISettings) Attributes(ctx context.Context, c client.Client, namespace AccessToken: secret, Region: lo.ToPtr(in.Bedrock.Region), EmbeddingModel: in.Bedrock.EmbeddingModel, + Endpoint: in.Bedrock.Endpoint, ProxyModels: lo.ToSlicePtr(in.Bedrock.ProxyModels), AWSSecretAccessKey: secretKey, AWSAccessKeyID: in.Bedrock.AwsAccessKeyID, @@ -1110,6 +1111,14 @@ type BedrockSettings struct { // +kubebuilder:validation:Optional EmbeddingModel *string `json:"embeddingModel,omitempty"` + // Endpoint selects the AWS Bedrock API surface. RUNTIME (the default) uses InvokeModel or + // Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. + // + // +kubebuilder:default=RUNTIME + // +kubebuilder:validation:Enum=RUNTIME;MANTLE + // +kubebuilder:validation:Optional + Endpoint *console.BedrockEndpoint `json:"endpoint,omitempty"` + // ProxyModels lists additional Bedrock model or inference profile IDs exposed through the Nexus // OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. // diff --git a/go/controller/api/v1alpha1/workbenchtool_types.go b/go/controller/api/v1alpha1/workbenchtool_types.go index 5e799c438f..17b67c7f9e 100644 --- a/go/controller/api/v1alpha1/workbenchtool_types.go +++ b/go/controller/api/v1alpha1/workbenchtool_types.go @@ -126,7 +126,7 @@ type WorkbenchToolSpec struct { // The type of tool. // +kubebuilder:validation:Required - // +kubebuilder:validation:Enum:=HTTP;ELASTIC;DATADOG;PROMETHEUS;LOKI;TEMPO;SENTRY;MCP;LINEAR;ATLASSIAN;SPLUNK;DYNATRACE;CLOUDWATCH;AZURE;CLOUD;JAEGER;EXA;GITHUB;SLACK;TEAMS;GITLAB;BITBUCKET;BITBUCKET_DATACENTER;AZURE_DEVOPS;PAGERDUTY;OPENSEARCH;LAMBDA;CLOUD_RUN;AZURE_FUNCTION;DOCKER + // +kubebuilder:validation:Enum:=HTTP;ELASTIC;DATADOG;PROMETHEUS;LOKI;TEMPO;SENTRY;MCP;LINEAR;ATLASSIAN;SPLUNK;DYNATRACE;CLOUDWATCH;AZURE;CLOUD;JAEGER;EXA;GITHUB;SLACK;TEAMS;GITLAB;BITBUCKET;BITBUCKET_DATACENTER;AZURE_DEVOPS;PAGERDUTY;OPENSEARCH;LAMBDA;CLOUD_RUN;AZURE_FUNCTION;DOCKER;VICTORIA_LOGS Tool console.WorkbenchToolType `json:"tool"` // Categories for the tool. @@ -187,6 +187,10 @@ type WorkbenchToolConfiguration struct { // +kubebuilder:validation:Optional Loki *WorkbenchToolLokiConfig `json:"loki,omitempty"` + // VictoriaLogs connection (logs). + // +kubebuilder:validation:Optional + VictoriaLogs *WorkbenchToolVictoriaLogsConfig `json:"victoriaLogs,omitempty"` + // Tempo connection (traces). // +kubebuilder:validation:Optional Tempo *WorkbenchToolTempoConfig `json:"tempo,omitempty"` @@ -305,6 +309,11 @@ func (c *WorkbenchToolConfiguration) Attributes(ctx context.Context, cl client.C return nil, err } + victoriaLogs, err := c.VictoriaLogs.Attributes(ctx, cl, namespace) + if err != nil { + return nil, err + } + tempo, err := c.Tempo.Attributes(ctx, cl, namespace) if err != nil { return nil, err @@ -406,6 +415,7 @@ func (c *WorkbenchToolConfiguration) Attributes(ctx context.Context, cl client.C Opensearch: opensearch, Prometheus: prometheus, Loki: loki, + VictoriaLogs: victoriaLogs, Tempo: tempo, Jaeger: jaeger, Splunk: splunk, @@ -738,6 +748,64 @@ func (c *WorkbenchToolLokiConfig) Attributes(ctx context.Context, cl client.Clie return attr, nil } +// WorkbenchToolVictoriaLogsConfig defines a VictoriaLogs connection. +type WorkbenchToolVictoriaLogsConfig struct { + // VictoriaLogs base URL. + // +kubebuilder:validation:Required + URL string `json:"url"` + + // Reference to a secret key containing the bearer token or api key. + // +kubebuilder:validation:Optional + TokenSecretRef *corev1.SecretKeySelector `json:"tokenSecretRef,omitempty"` + + // Basic auth username. + // +kubebuilder:validation:Optional + Username *string `json:"username,omitempty"` + + // Reference to a secret key containing the basic auth password. + // +kubebuilder:validation:Optional + PasswordSecretRef *corev1.SecretKeySelector `json:"passwordSecretRef,omitempty"` + + // Optional AccountID tenant header. + // +kubebuilder:validation:Optional + AccountID *string `json:"accountId,omitempty"` + + // Optional ProjectID tenant header. + // +kubebuilder:validation:Optional + ProjectID *string `json:"projectId,omitempty"` +} + +func (c *WorkbenchToolVictoriaLogsConfig) Attributes(ctx context.Context, cl client.Client, namespace string) (*console.WorkbenchToolVictoriaLogsConnectionAttributes, error) { + if c == nil { + return nil, nil + } + + attr := &console.WorkbenchToolVictoriaLogsConnectionAttributes{ + URL: c.URL, + Username: c.Username, + AccountID: c.AccountID, + ProjectID: c.ProjectID, + } + + if c.TokenSecretRef != nil { + token, err := utils.GetSecretKey(ctx, cl, c.TokenSecretRef, namespace) + if err != nil { + return nil, err + } + attr.Token = lo.ToPtr(token) + } + + if c.PasswordSecretRef != nil { + password, err := utils.GetSecretKey(ctx, cl, c.PasswordSecretRef, namespace) + if err != nil { + return nil, err + } + attr.Password = lo.ToPtr(password) + } + + return attr, nil +} + // WorkbenchToolTempoConfig defines a tempo connection. type WorkbenchToolTempoConfig struct { // Tempo base URL. @@ -845,10 +913,16 @@ type WorkbenchToolSplunkConfig struct { // +kubebuilder:validation:Required URL string `json:"url"` - // Reference to a secret key containing the bearer token. + // Reference to a secret key containing the authentication token. // +kubebuilder:validation:Optional TokenSecretRef *corev1.SecretKeySelector `json:"tokenSecretRef,omitempty"` + // Authorization realm used for token authentication. + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Enum:=BEARER;SPLUNK + // +kubebuilder:default:=BEARER + TokenType *console.SplunkTokenType `json:"tokenType,omitempty"` + // Basic auth username. // +kubebuilder:validation:Optional Username *string `json:"username,omitempty"` @@ -864,8 +938,9 @@ func (c *WorkbenchToolSplunkConfig) Attributes(ctx context.Context, cl client.Cl } attr := &console.WorkbenchToolSplunkConnectionAttributes{ - URL: c.URL, - Username: c.Username, + URL: c.URL, + TokenType: lo.CoalesceOrEmpty(c.TokenType, lo.ToPtr(console.SplunkTokenTypeBearer)), + Username: c.Username, } if c.TokenSecretRef != nil { diff --git a/go/controller/api/v1alpha1/zz_generated.deepcopy.go b/go/controller/api/v1alpha1/zz_generated.deepcopy.go index dd8d71993a..a2b026af27 100644 --- a/go/controller/api/v1alpha1/zz_generated.deepcopy.go +++ b/go/controller/api/v1alpha1/zz_generated.deepcopy.go @@ -581,6 +581,11 @@ func (in *BedrockSettings) DeepCopyInto(out *BedrockSettings) { *out = new(string) **out = **in } + if in.Endpoint != nil { + in, out := &in.Endpoint, &out.Endpoint + *out = new(client.BedrockEndpoint) + **out = **in + } if in.ProxyModels != nil { in, out := &in.ProxyModels, &out.ProxyModels *out = make([]string, len(*in)) @@ -11259,6 +11264,11 @@ func (in *WorkbenchToolConfiguration) DeepCopyInto(out *WorkbenchToolConfigurati *out = new(WorkbenchToolLokiConfig) (*in).DeepCopyInto(*out) } + if in.VictoriaLogs != nil { + in, out := &in.VictoriaLogs, &out.VictoriaLogs + *out = new(WorkbenchToolVictoriaLogsConfig) + (*in).DeepCopyInto(*out) + } if in.Tempo != nil { in, out := &in.Tempo, &out.Tempo *out = new(WorkbenchToolTempoConfig) @@ -12004,6 +12014,11 @@ func (in *WorkbenchToolSplunkConfig) DeepCopyInto(out *WorkbenchToolSplunkConfig *out = new(v1.SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.TokenType != nil { + in, out := &in.TokenType, &out.TokenType + *out = new(client.SplunkTokenType) + **out = **in + } if in.Username != nil { in, out := &in.Username, &out.Username *out = new(string) @@ -12077,6 +12092,46 @@ func (in *WorkbenchToolTempoConfig) DeepCopy() *WorkbenchToolTempoConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WorkbenchToolVictoriaLogsConfig) DeepCopyInto(out *WorkbenchToolVictoriaLogsConfig) { + *out = *in + if in.TokenSecretRef != nil { + in, out := &in.TokenSecretRef, &out.TokenSecretRef + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.Username != nil { + in, out := &in.Username, &out.Username + *out = new(string) + **out = **in + } + if in.PasswordSecretRef != nil { + in, out := &in.PasswordSecretRef, &out.PasswordSecretRef + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.AccountID != nil { + in, out := &in.AccountID, &out.AccountID + *out = new(string) + **out = **in + } + if in.ProjectID != nil { + in, out := &in.ProjectID, &out.ProjectID + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkbenchToolVictoriaLogsConfig. +func (in *WorkbenchToolVictoriaLogsConfig) DeepCopy() *WorkbenchToolVictoriaLogsConfig { + if in == nil { + return nil + } + out := new(WorkbenchToolVictoriaLogsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WorkbenchWebhook) DeepCopyInto(out *WorkbenchWebhook) { *out = *in diff --git a/go/controller/cmd/args/args.go b/go/controller/cmd/args/args.go index ba3c0ee078..086290901d 100644 --- a/go/controller/cmd/args/args.go +++ b/go/controller/cmd/args/args.go @@ -28,6 +28,8 @@ var ( "The url of the console api to fetch services from") argConsoleToken = flag.String("console-token", utils.GetEnv("CONSOLE_TOKEN", ""), "The console token to auth to console api with. Can also be set via CONSOLE_TOKEN environment variable.") + argConsoleInsecureSkipTLSVerify = flag.Bool("console-insecure-skip-tls-verify", false, + "Skip verification of the Console TLS certificate.") argMetricsBindAddress = flag.String("metrics-bind-address", defaultMetricsAddr, "The address the metric endpoint binds to.") argHealthProbeBindAddress = flag.String("health-probe-bind-address", defaultHealthProbeAddr, @@ -115,6 +117,10 @@ func ConsoleToken() string { return *argConsoleToken } +func ConsoleInsecureSkipTLSVerify() bool { + return *argConsoleInsecureSkipTLSVerify +} + func MetricsBindAddress() string { if len(*argMetricsBindAddress) == 0 { return defaultMetricsAddr diff --git a/go/controller/cmd/main.go b/go/controller/cmd/main.go index ab8941db75..5ea0176a68 100644 --- a/go/controller/cmd/main.go +++ b/go/controller/cmd/main.go @@ -115,7 +115,7 @@ func main() { } controllers, shardedControllers, err := args.Reconcilers().ToControllers(mgr, args.ConsoleUrl(), - args.ConsoleToken(), args.DatadogEnabled(), credentialsCache) + args.ConsoleToken(), args.DatadogEnabled(), args.ConsoleInsecureSkipTLSVerify(), credentialsCache) if err != nil { setupLog.Error(err, "error when creating controllers") os.Exit(1) //nolint:gocritic diff --git a/go/controller/config/crd/bases/deployments.plural.sh_deploymentsettings.yaml b/go/controller/config/crd/bases/deployments.plural.sh_deploymentsettings.yaml index 8e47572ebe..48b5520e5f 100644 --- a/go/controller/config/crd/bases/deployments.plural.sh_deploymentsettings.yaml +++ b/go/controller/config/crd/bases/deployments.plural.sh_deploymentsettings.yaml @@ -255,6 +255,15 @@ spec: description: EmbeddingModel is the Bedrock model or inference profile for embeddings. Same ID formats as modelId. type: string + endpoint: + default: RUNTIME + description: |- + Endpoint selects the AWS Bedrock API surface. RUNTIME (the default) uses InvokeModel or + Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. + enum: + - RUNTIME + - MANTLE + type: string modelId: description: |- ModelID is the primary AWS Bedrock model or inference profile identifier. diff --git a/go/controller/config/crd/bases/deployments.plural.sh_workbenchtools.yaml b/go/controller/config/crd/bases/deployments.plural.sh_workbenchtools.yaml index 9163c27e28..a86f2f722a 100644 --- a/go/controller/config/crd/bases/deployments.plural.sh_workbenchtools.yaml +++ b/go/controller/config/crd/bases/deployments.plural.sh_workbenchtools.yaml @@ -1590,7 +1590,7 @@ spec: type: object x-kubernetes-map-type: atomic tokenSecretRef: - description: Reference to a secret key containing the bearer + description: Reference to a secret key containing the authentication token. properties: key: @@ -1614,6 +1614,13 @@ spec: - key type: object x-kubernetes-map-type: atomic + tokenType: + default: BEARER + description: Authorization realm used for token authentication. + enum: + - BEARER + - SPLUNK + type: string url: description: Splunk base URL. type: string @@ -1727,6 +1734,74 @@ spec: required: - url type: object + victoriaLogs: + description: VictoriaLogs connection (logs). + properties: + accountId: + description: Optional AccountID tenant header. + type: string + passwordSecretRef: + description: Reference to a secret key containing the basic + auth password. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + projectId: + description: Optional ProjectID tenant header. + type: string + tokenSecretRef: + description: Reference to a secret key containing the bearer + token or api key. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + url: + description: VictoriaLogs base URL. + type: string + username: + description: Basic auth username. + type: string + required: + - url + type: object type: object mcpServerRef: description: The mcp server for this tool. @@ -1917,6 +1992,7 @@ spec: - CLOUD_RUN - AZURE_FUNCTION - DOCKER + - VICTORIA_LOGS type: string required: - tool diff --git a/go/controller/config/samples/workbench.yaml b/go/controller/config/samples/workbench.yaml index 8ed7d7211d..09fdf631b5 100644 --- a/go/controller/config/samples/workbench.yaml +++ b/go/controller/config/samples/workbench.yaml @@ -157,6 +157,31 @@ spec: --- apiVersion: deployments.plural.sh/v1alpha1 kind: WorkbenchTool +metadata: + labels: + app.kubernetes.io/name: workbenchtool + app.kubernetes.io/instance: workbenchtool-victoria-logs-sample + app.kubernetes.io/part-of: controller + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/created-by: controller + name: workbenchtool-victoria-logs-sample + namespace: default +spec: + name: workbenchtool_victoria_logs_sample + tool: VICTORIA_LOGS + categories: + - LOGS + configuration: + victoriaLogs: + url: https://victorialogs.example.com + tokenSecretRef: + name: workbench-tool-creds + key: token + accountId: "12" + projectId: "34" +--- +apiVersion: deployments.plural.sh/v1alpha1 +kind: WorkbenchTool metadata: labels: app.kubernetes.io/name: workbenchtool @@ -878,6 +903,8 @@ spec: namespace: default - name: workbenchtool-loki-sample namespace: default + - name: workbenchtool-victoria-logs-sample + namespace: default - name: workbenchtool-elastic-sample namespace: default - name: workbenchtool-opensearch-sample diff --git a/go/controller/docs/api.md b/go/controller/docs/api.md index b2b9f18fb5..395def8455 100644 --- a/go/controller/docs/api.md +++ b/go/controller/docs/api.md @@ -388,6 +388,7 @@ _Appears in:_ | `modelId` _string_ | ModelID is the primary AWS Bedrock model or inference profile identifier.
Use a egional inference profile ID with three dot-separated segments (e.g. us.anthropic.claude-3-5-sonnet-20241022-v2:0,
global.anthropic.claude-haiku-4-5-20251001-v1:0). | | Optional: \{\}
| | `toolModelId` _string_ | ToolModelId is the Bedrock model or inference profile for tool calling. Same ID formats as modelId. | | Optional: \{\}
| | `embeddingModel` _string_ | EmbeddingModel is the Bedrock model or inference profile for embeddings. Same ID formats as modelId. | | Optional: \{\}
| +| `endpoint` _[BedrockEndpoint](#bedrockendpoint)_ | Endpoint selects the AWS Bedrock API surface. RUNTIME (the default) uses InvokeModel or
Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. | RUNTIME | Enum: [RUNTIME MANTLE]
Optional: \{\}
| | `proxyModels` _string array_ | ProxyModels lists additional Bedrock model or inference profile IDs exposed through the Nexus
OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. | | Optional: \{\}
| | `region` _string_ | Region is the AWS region the model is hosted in | | Required: \{\}
| | `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | TokenSecretRef is a reference to the local secret holding the token to access
the configured AI provider. | | Optional: \{\}
| @@ -6103,6 +6104,7 @@ _Appears in:_ | `opensearch` _[WorkbenchToolOpensearchConfig](#workbenchtoolopensearchconfig)_ | AWS OpenSearch connection (logs). | | Optional: \{\}
| | `prometheus` _[WorkbenchToolPrometheusConfig](#workbenchtoolprometheusconfig)_ | Prometheus connection (metrics). | | Optional: \{\}
| | `loki` _[WorkbenchToolLokiConfig](#workbenchtoollokiconfig)_ | Loki connection (logs). | | Optional: \{\}
| +| `victoriaLogs` _[WorkbenchToolVictoriaLogsConfig](#workbenchtoolvictorialogsconfig)_ | VictoriaLogs connection (logs). | | Optional: \{\}
| | `tempo` _[WorkbenchToolTempoConfig](#workbenchtooltempoconfig)_ | Tempo connection (traces). | | Optional: \{\}
| | `jaeger` _[WorkbenchToolJaegerConfig](#workbenchtooljaegerconfig)_ | Jaeger connection (traces). | | Optional: \{\}
| | `splunk` _[WorkbenchToolSplunkConfig](#workbenchtoolsplunkconfig)_ | Splunk connection (logs). | | Optional: \{\}
| @@ -6475,7 +6477,7 @@ _Appears in:_ | Field | Description | Default | Validation | | --- | --- | --- | --- | | `name` _string_ | The name of the tool (a-z, 0-9, underscores). If not set, metadata.name is used. | | Optional: \{\}
Pattern: `^[a-z0-9_]+$`
Type: string
| -| `tool` _[WorkbenchToolType](#workbenchtooltype)_ | The type of tool. | | Enum: [HTTP ELASTIC DATADOG PROMETHEUS LOKI TEMPO SENTRY MCP LINEAR ATLASSIAN SPLUNK DYNATRACE CLOUDWATCH AZURE CLOUD JAEGER EXA GITHUB SLACK TEAMS GITLAB BITBUCKET BITBUCKET_DATACENTER AZURE_DEVOPS PAGERDUTY OPENSEARCH LAMBDA CLOUD_RUN AZURE_FUNCTION DOCKER]
Required: \{\}
| +| `tool` _[WorkbenchToolType](#workbenchtooltype)_ | The type of tool. | | Enum: [HTTP ELASTIC DATADOG PROMETHEUS LOKI TEMPO SENTRY MCP LINEAR ATLASSIAN SPLUNK DYNATRACE CLOUDWATCH AZURE CLOUD JAEGER EXA GITHUB SLACK TEAMS GITLAB BITBUCKET BITBUCKET_DATACENTER AZURE_DEVOPS PAGERDUTY OPENSEARCH LAMBDA CLOUD_RUN AZURE_FUNCTION DOCKER VICTORIA_LOGS]
Required: \{\}
| | `categories` _WorkbenchToolCategory array_ | Categories for the tool. | | Optional: \{\}
| | `approval` _boolean_ | Whether this tool requires approval before execution. | | Optional: \{\}
| | `projectRef` _[ObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#objectreference-v1-core)_ | The project for this tool. | | Optional: \{\}
| @@ -6501,7 +6503,8 @@ _Appears in:_ | Field | Description | Default | Validation | | --- | --- | --- | --- | | `url` _string_ | Splunk base URL. | | Required: \{\}
| -| `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the bearer token. | | Optional: \{\}
| +| `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the authentication token. | | Optional: \{\}
| +| `tokenType` _[SplunkTokenType](#splunktokentype)_ | Authorization realm used for token authentication. | BEARER | Enum: [BEARER SPLUNK]
Optional: \{\}
| | `username` _string_ | Basic auth username. | | Optional: \{\}
| | `passwordSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the basic auth password. | | Optional: \{\}
| @@ -6544,6 +6547,27 @@ _Appears in:_ | `tenantId` _string_ | Optional tenant id. | | Optional: \{\}
| +#### WorkbenchToolVictoriaLogsConfig + + + +WorkbenchToolVictoriaLogsConfig defines a VictoriaLogs connection. + + + +_Appears in:_ +- [WorkbenchToolConfiguration](#workbenchtoolconfiguration) + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `url` _string_ | VictoriaLogs base URL. | | Required: \{\}
| +| `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the bearer token or api key. | | Optional: \{\}
| +| `username` _string_ | Basic auth username. | | Optional: \{\}
| +| `passwordSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the basic auth password. | | Optional: \{\}
| +| `accountId` _string_ | Optional AccountID tenant header. | | Optional: \{\}
| +| `projectId` _string_ | Optional ProjectID tenant header. | | Optional: \{\}
| + + #### WorkbenchWebhook diff --git a/go/controller/internal/client/console.go b/go/controller/internal/client/console.go index 8742270fd6..c5f9ffce25 100644 --- a/go/controller/internal/client/console.go +++ b/go/controller/internal/client/console.go @@ -10,9 +10,10 @@ import ( ) type client struct { - ctx context.Context - url string - consoleClient console.ConsoleClient + ctx context.Context + url string + insecureSkipTLSVerify bool + consoleClient console.ConsoleClient } type ConsoleClient interface { @@ -238,15 +239,16 @@ type ConsoleClient interface { RunSentinel(ctx context.Context, id string, overrides *console.SentinelRunOverrides) (*string, error) } -func New(url, token string, datadogEnabled bool) ConsoleClient { +func New(url, token string, datadogEnabled, insecureSkipTLSVerify bool) ConsoleClient { interceptors := []clientv2.RequestInterceptor{console.PersistedQueryInterceptor} if datadogEnabled { interceptors = append(interceptors, console.DatadogTracingInterceptor) } return &client{ - consoleClient: console.New(http.NewHttpClient(token), url, nil, interceptors...), - url: url, - ctx: context.Background(), + consoleClient: console.New(http.NewHttpClient(token, insecureSkipTLSVerify), url, nil, interceptors...), + url: url, + insecureSkipTLSVerify: insecureSkipTLSVerify, + ctx: context.Background(), } } diff --git a/go/controller/internal/client/credentials.go b/go/controller/internal/client/credentials.go index 7cdb72d5d0..db8b2d240c 100644 --- a/go/controller/internal/client/credentials.go +++ b/go/controller/internal/client/credentials.go @@ -14,6 +14,6 @@ func (c *client) UseCredentials(namespace string, credentialsCache credentials.N return nc.NamespaceCredentials, fmt.Errorf("cannot use %s namespace credentials, got error: %s", nc.NamespaceCredentials, nc.Err.Error()) } - c.consoleClient = console.New(http.NewHttpClient(nc.Token), c.url, nil) + c.consoleClient = console.New(http.NewHttpClient(nc.Token, c.insecureSkipTLSVerify), c.url, nil) return nc.NamespaceCredentials, nil } diff --git a/go/controller/internal/identity/cache.go b/go/controller/internal/identity/cache.go index 1066d7f33a..60c5ce693c 100644 --- a/go/controller/internal/identity/cache.go +++ b/go/controller/internal/identity/cache.go @@ -14,7 +14,7 @@ var cache *identityCache func Cache() IdentityCache { if cache == nil { klog.V(log.LogLevelDefault).InfoS("initializing user group cache") - consoleClient := client.New(args.ConsoleUrl(), args.ConsoleToken(), args.DatadogEnabled()) + consoleClient := client.New(args.ConsoleUrl(), args.ConsoleToken(), args.DatadogEnabled(), args.ConsoleInsecureSkipTLSVerify()) cache = &identityCache{ consoleClient: consoleClient, userCache: pollycache.NewCache[string](args.WipeCacheInterval(), func(email string) (*string, error) { diff --git a/go/controller/internal/plural/cache.go b/go/controller/internal/plural/cache.go index 42443784ef..49ac7e8579 100644 --- a/go/controller/internal/plural/cache.go +++ b/go/controller/internal/plural/cache.go @@ -15,7 +15,7 @@ func Cache() ClusterCache { if cache == nil { klog.V(log.LogLevelDefault).InfoS("initializing cluster cache") - consoleClient := client.New(args.ConsoleUrl(), args.ConsoleToken(), args.DatadogEnabled()) + consoleClient := client.New(args.ConsoleUrl(), args.ConsoleToken(), args.DatadogEnabled(), args.ConsoleInsecureSkipTLSVerify()) cache = &pluralCache{ consoleClient: consoleClient, diff --git a/go/controller/internal/types/reconciler.go b/go/controller/internal/types/reconciler.go index 4c4edb0aba..40bd20e254 100644 --- a/go/controller/internal/types/reconciler.go +++ b/go/controller/internal/types/reconciler.go @@ -113,13 +113,13 @@ func ShardedReconcilers() ReconcilerList { } // ToControllers returns a list of Controller instances based on this Reconciler array. -func (rl ReconcilerList) ToControllers(mgr ctrl.Manager, url, token string, datadogEnabled bool, +func (rl ReconcilerList) ToControllers(mgr ctrl.Manager, url, token string, datadogEnabled, insecureSkipTLSVerify bool, credentialsCache credentials.NamespaceCredentialsCache) ([]Controller, []Processor, error) { controllers := make([]Controller, len(rl)) shardedReconcilersList := ShardedReconcilers() shardedControllers := make([]Processor, 0, len(shardedReconcilersList)) for i, r := range rl { - controller, err := r.ToController(mgr, client.New(url, token, datadogEnabled), credentialsCache) + controller, err := r.ToController(mgr, client.New(url, token, datadogEnabled, insecureSkipTLSVerify), credentialsCache) if err != nil { return nil, nil, err } diff --git a/go/helm-test/test/console/common.go b/go/helm-test/test/console/common.go index 8794987763..141d965dc6 100644 --- a/go/helm-test/test/console/common.go +++ b/go/helm-test/test/console/common.go @@ -69,6 +69,7 @@ type KAS struct { Deployment common.ManifestKey Service common.ManifestKey Ingress common.ManifestKey + ConfigMap common.ManifestKey } type Operator struct { @@ -177,6 +178,13 @@ func DefaultResources(prefix string) struct { Kind: common.KindIngress, }, }, + ConfigMap: common.ManifestKey{ + Name: fmt.Sprintf("%s-kas-config", prefix), + GroupKind: schema.GroupKind{ + Group: common.GroupCore, + Kind: "ConfigMap", + }, + }, }, Operator: Operator{ Deployment: common.ManifestKey{ diff --git a/go/helm-test/test/console/core_test.go b/go/helm-test/test/console/core_test.go index ef06238530..1835137216 100644 --- a/go/helm-test/test/console/core_test.go +++ b/go/helm-test/test/console/core_test.go @@ -3,6 +3,9 @@ package console_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/samber/lo" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/pluralsh/console/go/helm-test/internal/common" "github.com/pluralsh/console/go/helm-test/test/console" @@ -63,6 +66,61 @@ var _ = Describe("Core", func() { }) }) + Context(chartEntry.Name+" with pod TLS enabled", Ordered, func() { + var ( + err error + manifests common.ManifestMap + resources = chartEntry.Resources() + ) + + BeforeAll(func() { + manifests, err = chartEntry.Load(map[string]interface{}{ + "console": map[string]interface{}{ + "tls": map[string]interface{}{"enabled": true}, + }, + "controller": map[string]interface{}{ + "console": map[string]interface{}{ + "tls": map[string]interface{}{"enabled": true}, + }, + }, + }) + Expect(err).NotTo(HaveOccurred()) + }) + + It("uses HTTPS for KAS token exchange and skips certificate verification", func() { + deployment := deploymentFromManifests(manifests, resources.Kas.Deployment) + container, found := lo.Find(deployment.Spec.Template.Spec.Containers, func(container corev1.Container) bool { + return container.Name == "api" + }) + Expect(found).To(BeTrue()) + Expect(container.Args).To(ContainElements( + "--token-exchange-endpoint=https://$(CONSOLE_HOST)/v1/dashboard/cluster", + "--token-exchange-skip-tls-verify", + )) + }) + + It("uses HTTPS for KAS GraphQL calls and skips certificate verification", func() { + configMap, found := manifests[resources.Kas.ConfigMap.String()] + Expect(found).To(BeTrue()) + config, found, err := unstructured.NestedString(configMap.Object, "data", "config.yaml") + Expect(err).NotTo(HaveOccurred()) + Expect(found).To(BeTrue()) + Expect(config).To(ContainSubstring("plural_url: \"https://console.")) + Expect(config).To(ContainSubstring(":4000/gql\"")) + Expect(config).To(ContainSubstring("plural_insecure_skip_tls_verify: true")) + }) + + It("uses HTTPS for operator GraphQL calls", func() { + deployment := deploymentFromManifests(manifests, resources.Operator.Deployment) + container, found := lo.Find(deployment.Spec.Template.Spec.Containers, func(container corev1.Container) bool { + return container.Name == "manager" + }) + Expect(found).To(BeTrue()) + Expect(container.Args).To(ContainElement(MatchRegexp(`^--console-url=https://console\..*:4000/gql$`))) + Expect(container.Args).To(ContainElement("--console-insecure-skip-tls-verify")) + }) + }) + Context(chartEntry.Name+" with dedicated kas hostname", Ordered, func() { var ( err error diff --git a/go/helm-test/test/controller/rbac_test.go b/go/helm-test/test/controller/rbac_test.go new file mode 100644 index 0000000000..c843a038a1 --- /dev/null +++ b/go/helm-test/test/controller/rbac_test.go @@ -0,0 +1,197 @@ +package controller_test + +import ( + "strings" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "helm.sh/helm/v3/pkg/chart" + rbacv1 "k8s.io/api/rbac/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" + "sigs.k8s.io/yaml" + + "github.com/pluralsh/console/go/helm-test/internal/common" +) + +const ( + controllerChartPath = "../../../../charts/controller" + deploymentsAPIGroup = "deployments.plural.sh" +) + +var managerRoleKey = common.ManifestKey{ + Name: "console-operator-manager-role", + GroupKind: schema.GroupKind{ + Group: "rbac.authorization.k8s.io", + Kind: "ClusterRole", + }, +} + +var _ = Describe("RBAC", func() { + It("explicitly enumerates all resources and verbs", func() { + chart, manifests := renderControllerChart(nil) + role := managerRole(manifests) + + for _, manifest := range manifests { + if manifest.GetKind() != "Role" && manifest.GetKind() != "ClusterRole" { + continue + } + + for _, rule := range policyRules(manifest) { + Expect(rule.Resources).NotTo(ContainElement("*")) + Expect(rule.Verbs).NotTo(ContainElement("*")) + } + } + + resources := crdResources(chart.CRDObjects()) + Expect(ruleFor(role.Rules, "").Resources).To(ConsistOf(resources)) + Expect(ruleFor(role.Rules, "").Verbs).To(ConsistOf( + "create", + "delete", + "deletecollection", + "get", + "list", + "patch", + "update", + "watch", + )) + Expect(ruleFor(role.Rules, "/finalizers").Resources).To(ConsistOf(withSuffix(resources, "/finalizers"))) + Expect(ruleFor(role.Rules, "/finalizers").Verbs).To(ConsistOf("update")) + Expect(ruleFor(role.Rules, "/status").Resources).To(ConsistOf(withSuffix(resources, "/status"))) + Expect(ruleFor(role.Rules, "/status").Verbs).To(ConsistOf("get", "patch", "update")) + }) + + It("allows explicit RBAC resources and verbs to be configured", func() { + _, manifests := renderControllerChart(map[string]interface{}{ + "rbac": map[string]interface{}{ + "deploymentsPlural": map[string]interface{}{ + "resources": []string{"widgets"}, + "verbs": []string{"get", "list"}, + }, + }, + }) + role := managerRole(manifests) + + Expect(ruleFor(role.Rules, "").Resources).To(ConsistOf("widgets")) + Expect(ruleFor(role.Rules, "").Verbs).To(ConsistOf("get", "list")) + Expect(ruleFor(role.Rules, "/finalizers").Resources).To(ConsistOf("widgets/finalizers")) + Expect(ruleFor(role.Rules, "/status").Resources).To(ConsistOf("widgets/status")) + }) + + DescribeTable("rejects RBAC wildcards", + func(values map[string]interface{}) { + chart, err := common.LoadChart(common.WithLocalPath(controllerChartPath)) + Expect(err).NotTo(HaveOccurred()) + + _, err = common.RenderChart(chart, values) + Expect(err).To(MatchError(ContainSubstring("wildcards are not allowed"))) + }, + Entry("in resources", map[string]interface{}{ + "rbac": map[string]interface{}{ + "deploymentsPlural": map[string]interface{}{ + "resources": []string{"*"}, + }, + }, + }), + Entry("in verbs", map[string]interface{}{ + "rbac": map[string]interface{}{ + "deploymentsPlural": map[string]interface{}{ + "verbs": []string{"*"}, + }, + }, + }), + ) +}) + +func renderControllerChart(values map[string]interface{}) (*chart.Chart, common.ManifestMap) { + GinkgoHelper() + + loadedChart, err := common.LoadChart(common.WithLocalPath(controllerChartPath)) + Expect(err).NotTo(HaveOccurred()) + + manifestList, err := common.RenderChart(loadedChart, values) + Expect(err).NotTo(HaveOccurred()) + + manifests, err := common.NewManifestMap(manifestList) + Expect(err).NotTo(HaveOccurred()) + + return loadedChart, manifests +} + +func managerRole(manifests common.ManifestMap) rbacv1.ClusterRole { + GinkgoHelper() + + rawRole, exists := manifests[managerRoleKey.String()] + Expect(exists).To(BeTrue()) + + var role rbacv1.ClusterRole + Expect(runtime.DefaultUnstructuredConverter.FromUnstructured(rawRole.UnstructuredContent(), &role)).To(Succeed()) + + return role +} + +func policyRules(manifest *unstructured.Unstructured) []rbacv1.PolicyRule { + GinkgoHelper() + + switch manifest.GetKind() { + case "Role": + var role rbacv1.Role + Expect(runtime.DefaultUnstructuredConverter.FromUnstructured(manifest.UnstructuredContent(), &role)).To(Succeed()) + return role.Rules + case "ClusterRole": + var role rbacv1.ClusterRole + Expect(runtime.DefaultUnstructuredConverter.FromUnstructured(manifest.UnstructuredContent(), &role)).To(Succeed()) + return role.Rules + default: + return nil + } +} + +func crdResources(objects []chart.CRD) []string { + GinkgoHelper() + + resources := sets.New[string]() + for _, object := range objects { + var definition apiextensionsv1.CustomResourceDefinition + Expect(yaml.Unmarshal(object.File.Data, &definition)).To(Succeed()) + resources.Insert(definition.Spec.Names.Plural) + } + + return sets.List(resources) +} + +func ruleFor(rules []rbacv1.PolicyRule, suffix string) rbacv1.PolicyRule { + GinkgoHelper() + + for _, rule := range rules { + if !sets.New(rule.APIGroups...).Has(deploymentsAPIGroup) { + continue + } + + matches := len(rule.Resources) > 0 + for _, resource := range rule.Resources { + if suffix == "" { + matches = matches && !strings.Contains(resource, "/") + } else { + matches = matches && strings.HasSuffix(resource, suffix) + } + } + if matches { + return rule + } + } + + Fail("could not find deployments.plural.sh RBAC rule for suffix " + suffix) + return rbacv1.PolicyRule{} +} + +func withSuffix(resources []string, suffix string) []string { + result := make([]string, 0, len(resources)) + for _, resource := range resources { + result = append(result, resource+suffix) + } + return result +} diff --git a/go/helm-test/test/controller/suite_test.go b/go/helm-test/test/controller/suite_test.go new file mode 100644 index 0000000000..3116b301d7 --- /dev/null +++ b/go/helm-test/test/controller/suite_test.go @@ -0,0 +1,13 @@ +package controller_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestControllerChart(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Controller Chart Suite") +} diff --git a/go/kubernetes-agent/api/pkg/client/args/args.go b/go/kubernetes-agent/api/pkg/client/args/args.go index 48b9c36f3f..36726707b7 100644 --- a/go/kubernetes-agent/api/pkg/client/args/args.go +++ b/go/kubernetes-agent/api/pkg/client/args/args.go @@ -24,6 +24,7 @@ var ( argCacheEnabled = pflag.Bool("cache-enabled", true, "whether client cache should be enabled or not") argClusterContextEnabled = pflag.Bool("cluster-context-enabled", false, "whether multi-cluster cache context support should be enabled or not") argTokenExchangeEndpoint = pflag.String("token-exchange-endpoint", "", "endpoint used in multi-cluster cache to exchange tokens for context identifiers") + argTokenExchangeSkipTLS = pflag.Bool("token-exchange-skip-tls-verify", false, "whether certificate verification should be skipped for the token exchange endpoint") argCacheSize = pflag.Int("cache-size", 1000, "max number of cache entries") argCacheTTL = pflag.Duration("cache-ttl", 10*time.Minute, "cache entry TTL") argCacheRefreshDebounce = pflag.Duration("cache-refresh-debounce", 5*time.Second, "minimal time between cache refreshes in the background") @@ -47,6 +48,10 @@ func TokenExchangeEndpoint() string { return *argTokenExchangeEndpoint } +func TokenExchangeSkipTLSVerify() bool { + return *argTokenExchangeSkipTLS +} + func CacheSize() int { return *argCacheSize } diff --git a/go/kubernetes-agent/api/pkg/client/cache/key.go b/go/kubernetes-agent/api/pkg/client/cache/key.go index df960e4e57..a1e8ecc474 100644 --- a/go/kubernetes-agent/api/pkg/client/cache/key.go +++ b/go/kubernetes-agent/api/pkg/client/cache/key.go @@ -15,6 +15,7 @@ package cache import ( + "crypto/tls" "encoding/json" "fmt" "io" @@ -124,7 +125,11 @@ func (k Key) SHA() (sha string, err error) { // exchangeToken exchanges the token for context identifier using the external source of truth // configured via `token-exchange-endpoint` flag. func (k Key) exchangeToken(token string) (string, error) { - client := &http.Client{Transport: &tokenExchangeTransport{token, http.DefaultTransport}} + transport := http.DefaultTransport.(*http.Transport).Clone() + if args.TokenExchangeSkipTLSVerify() { + transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //nolint:gosec + } + client := &http.Client{Transport: &tokenExchangeTransport{token, transport}} response, err := client.Get(args.TokenExchangeEndpoint()) if err != nil { return "", err diff --git a/go/kubernetes-agent/api/pkg/client/cache/key_test.go b/go/kubernetes-agent/api/pkg/client/cache/key_test.go new file mode 100644 index 0000000000..e31844374e --- /dev/null +++ b/go/kubernetes-agent/api/pkg/client/cache/key_test.go @@ -0,0 +1,30 @@ +package cache + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/spf13/pflag" + "github.com/stretchr/testify/require" +) + +func TestExchangeTokenSkipsTLSVerification(t *testing.T) { + server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, request *http.Request) { + require.Equal(t, "Bearer token", request.Header.Get("Authorization")) + _, err := w.Write([]byte("context")) + require.NoError(t, err) + })) + defer server.Close() + + require.NoError(t, pflag.Set("token-exchange-endpoint", server.URL)) + require.NoError(t, pflag.Set("token-exchange-skip-tls-verify", "true")) + t.Cleanup(func() { + require.NoError(t, pflag.Set("token-exchange-endpoint", "")) + require.NoError(t, pflag.Set("token-exchange-skip-tls-verify", "false")) + }) + + context, err := (Key{}).exchangeToken("token") + require.NoError(t, err) + require.Equal(t, "context", context) +} diff --git a/go/kubernetes-agent/kas/cmd/kas/kasapp/configured_app.go b/go/kubernetes-agent/kas/cmd/kas/kasapp/configured_app.go index 2139f47879..bb4beafa3d 100644 --- a/go/kubernetes-agent/kas/cmd/kas/kasapp/configured_app.go +++ b/go/kubernetes-agent/kas/cmd/kas/kasapp/configured_app.go @@ -336,7 +336,8 @@ func (a *ConfiguredApp) constructPluralRpcApiFactory(errRep errz.ErrReporter, se dt, gapi.IsCacheableError, ), - PluralURL: a.Configuration.PluralUrl, + PluralURL: a.Configuration.PluralUrl, + InsecureSkipTLSVerify: a.Configuration.PluralInsecureSkipTlsVerify, } return f.New, fAgent.New } diff --git a/go/kubernetes-agent/kas/cmd/kas/kasapp/plural/agent_rpc_api.go b/go/kubernetes-agent/kas/cmd/kas/kasapp/plural/agent_rpc_api.go index 037dbae1cf..33d57eece1 100644 --- a/go/kubernetes-agent/kas/cmd/kas/kasapp/plural/agent_rpc_api.go +++ b/go/kubernetes-agent/kas/cmd/kas/kasapp/plural/agent_rpc_api.go @@ -14,9 +14,10 @@ import ( type ServerAgentRpcApi struct { modserver2.RpcApi - Token api.AgentToken - AgentInfoCache *cache.CacheWithErr[api.AgentToken, *api.AgentInfo] - PluralURL string + Token api.AgentToken + AgentInfoCache *cache.CacheWithErr[api.AgentToken, *api.AgentInfo] + PluralURL string + InsecureSkipTLSVerify bool } func (a *ServerAgentRpcApi) AgentToken() api.AgentToken { @@ -29,14 +30,15 @@ func (a *ServerAgentRpcApi) AgentInfo(ctx context.Context, log *zap.Logger) (*ap func (a *ServerAgentRpcApi) getAgentInfoCached(ctx context.Context) (*api.AgentInfo, error) { return a.AgentInfoCache.GetItem(ctx, a.Token, func() (*api.AgentInfo, error) { - return plural.GetAgentInfo(ctx, a.Token, a.PluralURL) + return plural.GetAgentInfo(ctx, a.Token, a.PluralURL, a.InsecureSkipTLSVerify) }) } type ServerAgentRpcApiFactory struct { - RPCApiFactory modserver2.RpcApiFactory - AgentInfoCache *cache.CacheWithErr[api.AgentToken, *api.AgentInfo] - PluralURL string + RPCApiFactory modserver2.RpcApiFactory + AgentInfoCache *cache.CacheWithErr[api.AgentToken, *api.AgentInfo] + PluralURL string + InsecureSkipTLSVerify bool } func (f *ServerAgentRpcApiFactory) New(ctx context.Context, fullMethodName string) (modserver2.AgentRpcApi, error) { @@ -45,9 +47,10 @@ func (f *ServerAgentRpcApiFactory) New(ctx context.Context, fullMethodName strin return nil, err } return &ServerAgentRpcApi{ - RpcApi: f.RPCApiFactory(ctx, fullMethodName), - Token: api.AgentToken(token), - AgentInfoCache: f.AgentInfoCache, - PluralURL: f.PluralURL, + RpcApi: f.RPCApiFactory(ctx, fullMethodName), + Token: api.AgentToken(token), + AgentInfoCache: f.AgentInfoCache, + PluralURL: f.PluralURL, + InsecureSkipTLSVerify: f.InsecureSkipTLSVerify, }, nil } diff --git a/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.go b/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.go index 26fdf45819..52894e53c6 100644 --- a/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.go +++ b/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.go @@ -1875,9 +1875,11 @@ type ConfigurationFile struct { // Private API for kas->kas communication. PrivateApi *PrivateApiCF `protobuf:"bytes,5,opt,name=private_api,proto3" json:"private_api,omitempty"` // Plural URL address - PluralUrl string `protobuf:"bytes,6,opt,name=plural_url,proto3" json:"plural_url,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + PluralUrl string `protobuf:"bytes,6,opt,name=plural_url,proto3" json:"plural_url,omitempty"` + // Skip TLS certificate verification when connecting to Plural Console. + PluralInsecureSkipTlsVerify bool `protobuf:"varint,7,opt,name=plural_insecure_skip_tls_verify,proto3" json:"plural_insecure_skip_tls_verify,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ConfigurationFile) Reset() { @@ -1952,6 +1954,13 @@ func (x *ConfigurationFile) GetPluralUrl() string { return "" } +func (x *ConfigurationFile) GetPluralInsecureSkipTlsVerify() bool { + if x != nil { + return x.PluralInsecureSkipTlsVerify + } + return false +} + var File_pkg_kascfg_kascfg_proto protoreflect.FileDescriptor const file_pkg_kascfg_kascfg_proto_rawDesc = "" + @@ -2105,7 +2114,7 @@ const file_pkg_kascfg_kascfg_proto_rawDesc = "" + "\x05ApiCF\x12B\n" + "\x06listen\x18\x01 \x01(\v2 .plural.agent.kascfg.ListenApiCFB\b\xfaB\x05\x8a\x01\x02\x10\x01R\x06listen\"Y\n" + "\fPrivateApiCF\x12I\n" + - "\x06listen\x18\x01 \x01(\v2'.plural.agent.kascfg.ListenPrivateApiCFB\b\xfaB\x05\x8a\x01\x02\x10\x01R\x06listen\"\xf8\x02\n" + + "\x06listen\x18\x01 \x01(\v2'.plural.agent.kascfg.ListenPrivateApiCFB\b\xfaB\x05\x8a\x01\x02\x10\x01R\x06listen\"\xc2\x03\n" + "\x11ConfigurationFile\x122\n" + "\x05agent\x18\x01 \x01(\v2\x1c.plural.agent.kascfg.AgentCFR\x05agent\x12J\n" + "\robservability\x18\x02 \x01(\v2$.plural.agent.kascfg.ObservabilityCFR\robservability\x12<\n" + @@ -2114,7 +2123,8 @@ const file_pkg_kascfg_kascfg_proto_rawDesc = "" + "\vprivate_api\x18\x05 \x01(\v2!.plural.agent.kascfg.PrivateApiCFB\b\xfaB\x05\x8a\x01\x02\x10\x01R\vprivate_api\x12\x1e\n" + "\n" + "plural_url\x18\x06 \x01(\tR\n" + - "plural_url*:\n" + + "plural_url\x12H\n" + + "\x1fplural_insecure_skip_tls_verify\x18\a \x01(\bR\x1fplural_insecure_skip_tls_verify*:\n" + "\x0elog_level_enum\x12\b\n" + "\x04info\x10\x00\x12\t\n" + "\x05debug\x10\x01\x12\b\n" + diff --git a/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.validate.go b/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.validate.go index f64e436f8d..22243b7109 100644 --- a/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.validate.go +++ b/go/kubernetes-agent/kas/pkg/kascfg/kascfg.pb.validate.go @@ -4184,6 +4184,8 @@ func (m *ConfigurationFile) validate(all bool) error { // no validation rules for PluralUrl + // no validation rules for PluralInsecureSkipTlsVerify + if len(errors) > 0 { return ConfigurationFileMultiError(errors) } diff --git a/go/kubernetes-agent/kas/pkg/kascfg/kascfg.proto b/go/kubernetes-agent/kas/pkg/kascfg/kascfg.proto index 14391a2b7c..01c64dd913 100644 --- a/go/kubernetes-agent/kas/pkg/kascfg/kascfg.proto +++ b/go/kubernetes-agent/kas/pkg/kascfg/kascfg.proto @@ -346,4 +346,6 @@ message ConfigurationFile { PrivateApiCF private_api = 5 [json_name = "private_api", (validate.rules).message.required = true]; // Plural URL address string plural_url = 6 [json_name = "plural_url"]; + // Skip TLS certificate verification when connecting to Plural Console. + bool plural_insecure_skip_tls_verify = 7 [json_name = "plural_insecure_skip_tls_verify"]; } diff --git a/go/kubernetes-agent/kas/pkg/kascfg/kascfg_proto_docs.md b/go/kubernetes-agent/kas/pkg/kascfg/kascfg_proto_docs.md index f5d54a0ebb..9fe64b44bf 100644 --- a/go/kubernetes-agent/kas/pkg/kascfg/kascfg_proto_docs.md +++ b/go/kubernetes-agent/kas/pkg/kascfg/kascfg_proto_docs.md @@ -109,6 +109,7 @@ ConfigurationFile represents kas configuration file. | api | [ApiCF](#plural-agent-kascfg-ApiCF) | | Public API. | | private_api | [PrivateApiCF](#plural-agent-kascfg-PrivateApiCF) | | Private API for kas->kas communication. | | plural_url | [string](#string) | | Plural URL address | +| plural_insecure_skip_tls_verify | [bool](#bool) | | Skip TLS certificate verification when connecting to Plural Console. | diff --git a/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/factory.go b/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/factory.go index 483ba7595b..c746fde04b 100644 --- a/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/factory.go +++ b/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/factory.go @@ -78,14 +78,16 @@ func (f *Factory) New(config *modserver.Config) (modserver.Module, error) { m := &module{ log: config.Log, proxy: kubernetesApiProxy{ - log: config.Log, - api: config.Api, - kubernetesApiClient: rpc.NewKubernetesApiClient(config.AgentConn), - pluralUrl: config.Config.PluralUrl, - jwtTokenAuthorizer: api.NewJWTProxyAuthorizer(config.Log, jwtSecret), + log: config.Log, + api: config.Api, + kubernetesApiClient: rpc.NewKubernetesApiClient(config.AgentConn), + pluralUrl: config.Config.PluralUrl, + pluralInsecureSkipTLSVerify: config.Config.PluralInsecureSkipTlsVerify, + jwtTokenAuthorizer: api.NewJWTProxyAuthorizer(config.Log, jwtSecret), auditLogger: api.NewAuditLogBatcher( config.Log, config.Config.PluralUrl, + config.Config.PluralInsecureSkipTlsVerify, k8sApi.AuditLogFlushInterval.AsDuration(), k8sApi.AuditLogDrainTimeout.AsDuration(), int(k8sApi.AuditLogFlushEvents), diff --git a/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/proxy.go b/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/proxy.go index 0486da5015..ff4d0cfaf9 100644 --- a/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/proxy.go +++ b/go/kubernetes-agent/kas/pkg/module/kubernetes_api/server/proxy.go @@ -76,32 +76,33 @@ type proxyUserCacheKey struct { } type kubernetesApiProxy struct { - log *zap.Logger - api modserver.Api - kubernetesApiClient rpc2.KubernetesApiClient - pluralUrl string - jwtTokenAuthorizer *pluralapi.JWTProxyAuthorizer - auditLogger *pluralapi.AuditLogBatcher - allowedOriginUrls []string - allowedAgentsCache *cache.CacheWithErr[string, *pluralapi.AllowedAgentsForJob] - authorizeProxyUserCache *cache.CacheWithErr[proxyUserCacheKey, *pluralapi.AuthorizeProxyUserResponse] - requestCounter usage_metrics.Counter - ciTunnelUsersCounter usage_metrics.UniqueCounter - ciAccessRequestCounter usage_metrics.Counter - ciAccessUsersCounter usage_metrics.UniqueCounter - ciAccessAgentsCounter usage_metrics.UniqueCounter - userAccessRequestCounter usage_metrics.Counter - userAccessUsersCounter usage_metrics.UniqueCounter - userAccessAgentsCounter usage_metrics.UniqueCounter - patAccessRequestCounter usage_metrics.Counter - patAccessUsersCounter usage_metrics.UniqueCounter - patAccessAgentsCounter usage_metrics.UniqueCounter - responseSerializer runtime.NegotiatedSerializer - traceProvider trace.TracerProvider - tracePropagator propagation.TextMapPropagator - meterProvider metric.MeterProvider - serverName string - serverVia string + log *zap.Logger + api modserver.Api + kubernetesApiClient rpc2.KubernetesApiClient + pluralUrl string + pluralInsecureSkipTLSVerify bool + jwtTokenAuthorizer *pluralapi.JWTProxyAuthorizer + auditLogger *pluralapi.AuditLogBatcher + allowedOriginUrls []string + allowedAgentsCache *cache.CacheWithErr[string, *pluralapi.AllowedAgentsForJob] + authorizeProxyUserCache *cache.CacheWithErr[proxyUserCacheKey, *pluralapi.AuthorizeProxyUserResponse] + requestCounter usage_metrics.Counter + ciTunnelUsersCounter usage_metrics.UniqueCounter + ciAccessRequestCounter usage_metrics.Counter + ciAccessUsersCounter usage_metrics.UniqueCounter + ciAccessAgentsCounter usage_metrics.UniqueCounter + userAccessRequestCounter usage_metrics.Counter + userAccessUsersCounter usage_metrics.UniqueCounter + userAccessAgentsCounter usage_metrics.UniqueCounter + patAccessRequestCounter usage_metrics.Counter + patAccessUsersCounter usage_metrics.UniqueCounter + patAccessAgentsCounter usage_metrics.UniqueCounter + responseSerializer runtime.NegotiatedSerializer + traceProvider trace.TracerProvider + tracePropagator propagation.TextMapPropagator + meterProvider metric.MeterProvider + serverName string + serverVia string // urlPathPrefix is guaranteed to end with / by defaulting. urlPathPrefix string listenerGracePeriod time.Duration @@ -295,7 +296,7 @@ func (p *kubernetesApiProxy) authorizeProxyUser(ctx context.Context, log *zap.Lo accessKey: accessKey, } auth, err := p.authorizeProxyUserCache.GetItem(ctx, key, func() (*pluralapi.AuthorizeProxyUserResponse, error) { - return pluralapi.AuthorizeProxyUser(ctx, accessKey, clusterId, p.pluralUrl) + return pluralapi.AuthorizeProxyUser(ctx, accessKey, clusterId, p.pluralUrl, p.pluralInsecureSkipTLSVerify) }) if err != nil { switch { diff --git a/go/kubernetes-agent/kas/pkg/plural/api/audit_logger.go b/go/kubernetes-agent/kas/pkg/plural/api/audit_logger.go index fffb778b55..b59115c2ae 100644 --- a/go/kubernetes-agent/kas/pkg/plural/api/audit_logger.go +++ b/go/kubernetes-agent/kas/pkg/plural/api/audit_logger.go @@ -37,25 +37,27 @@ type auditLogTokenBucket struct { } type AuditLogBatcher struct { - log *zap.Logger - pluralURL string - flushEvery time.Duration - flushAt int - drainTimeout time.Duration + log *zap.Logger + pluralURL string + insecureSkipTLSVerify bool + flushEvery time.Duration + flushAt int + drainTimeout time.Duration queue chan AuditLogEvent flushNow chan struct{} } -func NewAuditLogBatcher(log *zap.Logger, pluralURL string, flushEvery, drainTimeout time.Duration, flushAt int) *AuditLogBatcher { +func NewAuditLogBatcher(log *zap.Logger, pluralURL string, insecureSkipTLSVerify bool, flushEvery, drainTimeout time.Duration, flushAt int) *AuditLogBatcher { return &AuditLogBatcher{ - log: log, - pluralURL: pluralURL, - flushEvery: flushEvery, - flushAt: flushAt, - drainTimeout: drainTimeout, - queue: make(chan AuditLogEvent, defaultAuditLogQueueSize), - flushNow: make(chan struct{}, 1), + log: log, + pluralURL: pluralURL, + insecureSkipTLSVerify: insecureSkipTLSVerify, + flushEvery: flushEvery, + flushAt: flushAt, + drainTimeout: drainTimeout, + queue: make(chan AuditLogEvent, defaultAuditLogQueueSize), + flushNow: make(chan struct{}, 1), } } @@ -154,7 +156,7 @@ func addAuditLogEventToBuckets(buckets map[string]*auditLogTokenBucket, totalEve func (b *AuditLogBatcher) flush(buckets map[string]*auditLogTokenBucket, totalEvents int) int { for token, bucket := range buckets { - client := plural.New(b.pluralURL, token) + client := plural.New(b.pluralURL, token, b.insecureSkipTLSVerify) audits := lo.Map(lo.Values(bucket.events), func(event AuditLogEvent, _ int) console.ClusterAuditAttributes { return console.ClusterAuditAttributes{ diff --git a/go/kubernetes-agent/kas/pkg/plural/api/authorize_proxy_user.go b/go/kubernetes-agent/kas/pkg/plural/api/authorize_proxy_user.go index 0ddd1d9780..818fe499c6 100644 --- a/go/kubernetes-agent/kas/pkg/plural/api/authorize_proxy_user.go +++ b/go/kubernetes-agent/kas/pkg/plural/api/authorize_proxy_user.go @@ -9,8 +9,8 @@ import ( "github.com/pluralsh/console/go/polly/algorithms" ) -func AuthorizeProxyUser(ctx context.Context, token, clusterId, pluralURL string) (*AuthorizeProxyUserResponse, error) { - client := plural.NewUnauthorized(pluralURL) +func AuthorizeProxyUser(ctx context.Context, token, clusterId, pluralURL string, insecureSkipTLSVerify bool) (*AuthorizeProxyUserResponse, error) { + client := plural.NewUnauthorized(pluralURL, insecureSkipTLSVerify) resp, err := client.Console.TokenExchange(ctx, fmt.Sprintf("plrl:%s:%s", clusterId, token)) if err != nil { return nil, err diff --git a/go/kubernetes-agent/kas/pkg/plural/client.go b/go/kubernetes-agent/kas/pkg/plural/client.go index 5dff89df7a..303d4243dd 100644 --- a/go/kubernetes-agent/kas/pkg/plural/client.go +++ b/go/kubernetes-agent/kas/pkg/plural/client.go @@ -2,6 +2,7 @@ package plural import ( "context" + "crypto/tls" "net/http" console "github.com/pluralsh/console/go/client" @@ -22,11 +23,20 @@ type Client struct { Console console.ConsoleClient } -func New(url, token string) *Client { +func transport(insecureSkipTLSVerify bool) http.RoundTripper { + base := http.DefaultTransport.(*http.Transport).Clone() + if insecureSkipTLSVerify { + base.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //nolint:gosec + } + return base +} + +func New(url, token string, insecureSkipTLSVerify ...bool) *Client { + insecure := len(insecureSkipTLSVerify) > 0 && insecureSkipTLSVerify[0] httpClient := http.Client{ Transport: &authedTransport{ token: token, - wrapped: http.DefaultTransport, + wrapped: transport(insecure), }, } @@ -36,9 +46,10 @@ func New(url, token string) *Client { } } -func NewUnauthorized(url string) *Client { +func NewUnauthorized(url string, insecureSkipTLSVerify ...bool) *Client { + insecure := len(insecureSkipTLSVerify) > 0 && insecureSkipTLSVerify[0] return &Client{ - Console: console.New(http.DefaultClient, url, nil), + Console: console.New(&http.Client{Transport: transport(insecure)}, url, nil), ctx: context.Background(), } } diff --git a/go/kubernetes-agent/kas/pkg/plural/client_test.go b/go/kubernetes-agent/kas/pkg/plural/client_test.go new file mode 100644 index 0000000000..74d2314540 --- /dev/null +++ b/go/kubernetes-agent/kas/pkg/plural/client_test.go @@ -0,0 +1,24 @@ +package plural + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestTransportSkipsTLSVerification(t *testing.T) { + server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer server.Close() + + request, err := http.NewRequest(http.MethodGet, server.URL, nil) + require.NoError(t, err) + + response, err := transport(true).RoundTrip(request) + require.NoError(t, err) + defer response.Body.Close() + require.Equal(t, http.StatusOK, response.StatusCode) +} diff --git a/go/kubernetes-agent/kas/pkg/plural/get_agent_info.go b/go/kubernetes-agent/kas/pkg/plural/get_agent_info.go index c7aea0ecb2..1184680fc3 100644 --- a/go/kubernetes-agent/kas/pkg/plural/get_agent_info.go +++ b/go/kubernetes-agent/kas/pkg/plural/get_agent_info.go @@ -7,8 +7,8 @@ import ( "github.com/pluralsh/console/go/kubernetes-agent/pkg/tool/uuid" ) -func GetAgentInfo(ctx context.Context, agentToken api.AgentToken, pluralURL string) (*api.AgentInfo, error) { - client := New(pluralURL, string(agentToken)) +func GetAgentInfo(ctx context.Context, agentToken api.AgentToken, pluralURL string, insecureSkipTLSVerify bool) (*api.AgentInfo, error) { + client := New(pluralURL, string(agentToken), insecureSkipTLSVerify) cluster, err := client.Console.MyCluster(ctx) if err != nil { return nil, err diff --git a/go/nexus/go.mod b/go/nexus/go.mod index 63cfece8cb..1f009132e5 100644 --- a/go/nexus/go.mod +++ b/go/nexus/go.mod @@ -5,7 +5,7 @@ go 1.26.5 require ( github.com/bytedance/sonic v1.15.1 github.com/go-chi/chi/v5 v5.2.5 - github.com/maximhq/bifrost/core v1.5.17 + github.com/maximhq/bifrost/core v1.7.15 github.com/samber/lo v1.53.0 github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 @@ -23,7 +23,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect - github.com/andybalholm/brotli v1.2.1 // indirect + github.com/andybalholm/brotli v1.2.2 // indirect github.com/aws/aws-sdk-go-v2 v1.42.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.19 // indirect @@ -43,12 +43,13 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.42.2 // indirect github.com/aws/smithy-go v1.27.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect - github.com/buger/jsonparser v1.1.2 // indirect + github.com/buger/jsonparser v1.2.0 // indirect github.com/bytedance/gopkg v0.1.4 // indirect github.com/bytedance/sonic/loader v0.5.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/fasthttp/websocket v1.5.12 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect @@ -67,6 +68,7 @@ require ( github.com/rogpeppe/go-internal v1.15.0 // indirect github.com/rs/zerolog v1.34.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect diff --git a/go/nexus/go.sum b/go/nexus/go.sum index abc8376cd0..3bb0324f18 100644 --- a/go/nexus/go.sum +++ b/go/nexus/go.sum @@ -14,8 +14,8 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= -github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro= -github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/andybalholm/brotli v1.2.2 h1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM= +github.com/andybalholm/brotli v1.2.2/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= @@ -54,8 +54,8 @@ github.com/aws/smithy-go v1.27.1 h1:4T340VFndXtADGF52gYa1POyL7s9E4Z1OeZ1hCscIw8= github.com/aws/smithy-go v1.27.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= -github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= -github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/buger/jsonparser v1.2.0 h1:4EFcvK1kD4jyj6YqNK6skK6w+y7FHHBR+XBCtxwu/6g= +github.com/buger/jsonparser v1.2.0/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoOw= @@ -121,8 +121,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/maximhq/bifrost/core v1.5.17 h1:i/ICXsOLdyOoo4zX9EdC6i6N2t5QbF9JzGaVEVoZQG8= -github.com/maximhq/bifrost/core v1.5.17/go.mod h1:7vry9xB5kmjT3smAVVQ2+mtfTmmeSN+7N1b8r1buaTI= +github.com/maximhq/bifrost/core v1.7.15 h1:LOq+gnxqpex6Kok0l3GxyMoi04IBOT9uhzvkgV+uUv4= +github.com/maximhq/bifrost/core v1.7.15/go.mod h1:XQGQ99V6iW2yRbq4zg5+LfDcJMR06x/Ie4HuC8FWEDI= github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= diff --git a/go/nexus/internal/console/client_cache.go b/go/nexus/internal/console/client_cache.go index 4e095de0fa..88f77ffbf3 100644 --- a/go/nexus/internal/console/client_cache.go +++ b/go/nexus/internal/console/client_cache.go @@ -2,6 +2,7 @@ package console import ( "context" + "sync" "time" "github.com/pluralsh/console/go/nexus/internal/log" @@ -11,6 +12,7 @@ import ( type clientCache struct { logger *zap.Logger + mu sync.RWMutex config *pb.AiConfig configGetter func(_ context.Context) (*pb.AiConfig, error) ttl time.Duration @@ -18,9 +20,21 @@ type clientCache struct { } func (in *clientCache) GetAiConfig(ctx context.Context) (*pb.AiConfig, error) { - if time.Since(in.updated) < in.ttl && in.config != nil { - in.logger.Debug("returning cached AI config", zap.Duration("ttl", in.ttl), zap.Duration("age", time.Since(in.updated))) - return in.config, nil + in.mu.RLock() + config, age, ok := in.cachedConfigLocked() + in.mu.RUnlock() + if ok { + in.logger.Debug("returning cached AI config", zap.Duration("ttl", in.ttl), zap.Duration("age", age)) + return config, nil + } + + in.mu.Lock() + defer in.mu.Unlock() + + // Another caller may have refreshed the cache while this caller waited. + if config, age, ok := in.cachedConfigLocked(); ok { + in.logger.Debug("returning cached AI config", zap.Duration("ttl", in.ttl), zap.Duration("age", age)) + return config, nil } in.logger.Debug("fetching new AI config from Console") @@ -31,9 +45,16 @@ func (in *clientCache) GetAiConfig(ctx context.Context) (*pb.AiConfig, error) { in.config = aiConfig in.updated = time.Now() + return aiConfig, nil } +// cachedConfigLocked must be called while holding either mu's read or write lock. +func (in *clientCache) cachedConfigLocked() (*pb.AiConfig, time.Duration, bool) { + age := time.Since(in.updated) + return in.config, age, in.config != nil && age < in.ttl +} + func newClientCache(getter func(_ context.Context) (*pb.AiConfig, error), ttl time.Duration) *clientCache { return &clientCache{ logger: log.Logger().With(zap.String("component", "console-client-cache")), diff --git a/go/nexus/internal/console/client_cache_test.go b/go/nexus/internal/console/client_cache_test.go new file mode 100644 index 0000000000..c0596927cc --- /dev/null +++ b/go/nexus/internal/console/client_cache_test.go @@ -0,0 +1,60 @@ +package console + +import ( + "context" + "sync" + "sync/atomic" + "testing" + "time" + + pb "github.com/pluralsh/console/go/nexus/internal/proto" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +func TestClientCacheConcurrentMissesShareRefresh(t *testing.T) { + const callers = 32 + + var calls atomic.Int32 + release := make(chan struct{}) + config := &pb.AiConfig{Enabled: true} + cache := &clientCache{ + logger: zap.NewNop(), + configGetter: func(context.Context) (*pb.AiConfig, error) { + calls.Add(1) + <-release + return config, nil + }, + ttl: time.Minute, + } + + results := make(chan *pb.AiConfig, callers) + errors := make(chan error, callers) + var wg sync.WaitGroup + wg.Add(callers) + + for range callers { + go func() { + defer wg.Done() + result, err := cache.GetAiConfig(context.Background()) + results <- result + errors <- err + }() + } + + require.Eventually(t, func() bool { + return calls.Load() == 1 + }, time.Second, time.Millisecond) + close(release) + wg.Wait() + close(results) + close(errors) + + for err := range errors { + require.NoError(t, err) + } + for result := range results { + require.Same(t, config, result) + } + require.Equal(t, int32(1), calls.Load()) +} diff --git a/go/nexus/internal/proto/console.pb.go b/go/nexus/internal/proto/console.pb.go index 2d8c7958dc..ffbd4b7af9 100644 --- a/go/nexus/internal/proto/console.pb.go +++ b/go/nexus/internal/proto/console.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 +// protoc-gen-go v1.36.11-devel // protoc v6.31.1 // source: console.proto @@ -74,6 +74,52 @@ func (OpenAiMethod) EnumDescriptor() ([]byte, []int) { return file_console_proto_rawDescGZIP(), []int{0} } +type BedrockEndpoint int32 + +const ( + BedrockEndpoint_RUNTIME BedrockEndpoint = 0 + BedrockEndpoint_MANTLE BedrockEndpoint = 1 +) + +// Enum value maps for BedrockEndpoint. +var ( + BedrockEndpoint_name = map[int32]string{ + 0: "RUNTIME", + 1: "MANTLE", + } + BedrockEndpoint_value = map[string]int32{ + "RUNTIME": 0, + "MANTLE": 1, + } +) + +func (x BedrockEndpoint) Enum() *BedrockEndpoint { + p := new(BedrockEndpoint) + *p = x + return p +} + +func (x BedrockEndpoint) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BedrockEndpoint) Descriptor() protoreflect.EnumDescriptor { + return file_console_proto_enumTypes[1].Descriptor() +} + +func (BedrockEndpoint) Type() protoreflect.EnumType { + return &file_console_proto_enumTypes[1] +} + +func (x BedrockEndpoint) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BedrockEndpoint.Descriptor instead. +func (BedrockEndpoint) EnumDescriptor() ([]byte, []int) { + return file_console_proto_rawDescGZIP(), []int{1} +} + type AiConfigRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -581,6 +627,7 @@ type BedrockConfig struct { AwsSecretAccessKey *string `protobuf:"bytes,7,opt,name=awsSecretAccessKey,proto3,oneof" json:"awsSecretAccessKey,omitempty"` ProxyModels []string `protobuf:"bytes,8,rep,name=proxyModels,proto3" json:"proxyModels,omitempty"` Deployments map[string]string `protobuf:"bytes,9,rep,name=deployments,proto3" json:"deployments,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Endpoint *BedrockEndpoint `protobuf:"varint,10,opt,name=endpoint,proto3,enum=plrl.BedrockEndpoint,oneof" json:"endpoint,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -678,6 +725,13 @@ func (x *BedrockConfig) GetDeployments() map[string]string { return nil } +func (x *BedrockConfig) GetEndpoint() BedrockEndpoint { + if x != nil && x.Endpoint != nil { + return *x.Endpoint + } + return BedrockEndpoint_RUNTIME +} + type AzureOpenAiConfig struct { state protoimpl.MessageState `protogen:"open.v1"` ApiVersion *string `protobuf:"bytes,1,opt,name=apiVersion,proto3,oneof" json:"apiVersion,omitempty"` @@ -1256,7 +1310,7 @@ const file_console_proto_rawDesc = "" + "_toolModelB\n" + "\n" + "\b_projectB\v\n" + - "\t_location\"\xcc\x04\n" + + "\t_location\"\x91\x05\n" + "\rBedrockConfig\x12\x1d\n" + "\amodelId\x18\x01 \x01(\tH\x00R\amodelId\x88\x01\x01\x12%\n" + "\vtoolModelId\x18\x02 \x01(\tH\x01R\vtoolModelId\x88\x01\x01\x12%\n" + @@ -1266,7 +1320,9 @@ const file_console_proto_rawDesc = "" + "\x0eawsAccessKeyId\x18\x06 \x01(\tH\x05R\x0eawsAccessKeyId\x88\x01\x01\x123\n" + "\x12awsSecretAccessKey\x18\a \x01(\tH\x06R\x12awsSecretAccessKey\x88\x01\x01\x12 \n" + "\vproxyModels\x18\b \x03(\tR\vproxyModels\x12F\n" + - "\vdeployments\x18\t \x03(\v2$.plrl.BedrockConfig.DeploymentsEntryR\vdeployments\x1a>\n" + + "\vdeployments\x18\t \x03(\v2$.plrl.BedrockConfig.DeploymentsEntryR\vdeployments\x126\n" + + "\bendpoint\x18\n" + + " \x01(\x0e2\x15.plrl.BedrockEndpointH\aR\bendpoint\x88\x01\x01\x1a>\n" + "\x10DeploymentsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\n" + @@ -1277,7 +1333,8 @@ const file_console_proto_rawDesc = "" + "\a_regionB\x13\n" + "\x11_embeddingModelIdB\x11\n" + "\x0f_awsAccessKeyIdB\x15\n" + - "\x13_awsSecretAccessKey\"\xf0\x03\n" + + "\x13_awsSecretAccessKeyB\v\n" + + "\t_endpoint\"\xf0\x03\n" + "\x11AzureOpenAiConfig\x12#\n" + "\n" + "apiVersion\x18\x01 \x01(\tH\x00R\n" + @@ -1332,7 +1389,11 @@ const file_console_proto_rawDesc = "" + "\x1aOPEN_AI_METHOD_UNSPECIFIED\x10\x00\x12\b\n" + "\x04CHAT\x10\x01\x12\r\n" + "\tRESPONSES\x10\x02\x12\b\n" + - "\x04AUTO\x10\x032\x88\x03\n" + + "\x04AUTO\x10\x03**\n" + + "\x0fBedrockEndpoint\x12\v\n" + + "\aRUNTIME\x10\x00\x12\n" + + "\n" + + "\x06MANTLE\x10\x012\x88\x03\n" + "\fPluralServer\x12E\n" + "\fMeterMetrics\x12\x19.plrl.MeterMetricsRequest\x1a\x1a.plrl.MeterMetricsResponse\x124\n" + "\vGetAiConfig\x12\x15.plrl.AiConfigRequest\x1a\x0e.plrl.AiConfig\x12U\n" + @@ -1352,56 +1413,58 @@ func file_console_proto_rawDescGZIP() []byte { return file_console_proto_rawDescData } -var file_console_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_console_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_console_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_console_proto_goTypes = []any{ (OpenAiMethod)(0), // 0: plrl.OpenAiMethod - (*AiConfigRequest)(nil), // 1: plrl.AiConfigRequest - (*AiConfig)(nil), // 2: plrl.AiConfig - (*OpenAiTokenExchange)(nil), // 3: plrl.OpenAiTokenExchange - (*OpenAiConfig)(nil), // 4: plrl.OpenAiConfig - (*AnthropicConfig)(nil), // 5: plrl.AnthropicConfig - (*VertexAiConfig)(nil), // 6: plrl.VertexAiConfig - (*BedrockConfig)(nil), // 7: plrl.BedrockConfig - (*AzureOpenAiConfig)(nil), // 8: plrl.AzureOpenAiConfig - (*ProxyAuthenticationRequest)(nil), // 9: plrl.ProxyAuthenticationRequest - (*ProxyAuthenticationResponse)(nil), // 10: plrl.ProxyAuthenticationResponse - (*VerifyClusterRequest)(nil), // 11: plrl.VerifyClusterRequest - (*VerifyClusterResponse)(nil), // 12: plrl.VerifyClusterResponse - (*ObservabilityConfig)(nil), // 13: plrl.ObservabilityConfig - (*MeterMetricsRequest)(nil), // 14: plrl.MeterMetricsRequest - (*MeterMetricsResponse)(nil), // 15: plrl.MeterMetricsResponse - (*ObservabilityConfigRequest)(nil), // 16: plrl.ObservabilityConfigRequest - nil, // 17: plrl.BedrockConfig.DeploymentsEntry - nil, // 18: plrl.AzureOpenAiConfig.DeploymentsEntry + (BedrockEndpoint)(0), // 1: plrl.BedrockEndpoint + (*AiConfigRequest)(nil), // 2: plrl.AiConfigRequest + (*AiConfig)(nil), // 3: plrl.AiConfig + (*OpenAiTokenExchange)(nil), // 4: plrl.OpenAiTokenExchange + (*OpenAiConfig)(nil), // 5: plrl.OpenAiConfig + (*AnthropicConfig)(nil), // 6: plrl.AnthropicConfig + (*VertexAiConfig)(nil), // 7: plrl.VertexAiConfig + (*BedrockConfig)(nil), // 8: plrl.BedrockConfig + (*AzureOpenAiConfig)(nil), // 9: plrl.AzureOpenAiConfig + (*ProxyAuthenticationRequest)(nil), // 10: plrl.ProxyAuthenticationRequest + (*ProxyAuthenticationResponse)(nil), // 11: plrl.ProxyAuthenticationResponse + (*VerifyClusterRequest)(nil), // 12: plrl.VerifyClusterRequest + (*VerifyClusterResponse)(nil), // 13: plrl.VerifyClusterResponse + (*ObservabilityConfig)(nil), // 14: plrl.ObservabilityConfig + (*MeterMetricsRequest)(nil), // 15: plrl.MeterMetricsRequest + (*MeterMetricsResponse)(nil), // 16: plrl.MeterMetricsResponse + (*ObservabilityConfigRequest)(nil), // 17: plrl.ObservabilityConfigRequest + nil, // 18: plrl.BedrockConfig.DeploymentsEntry + nil, // 19: plrl.AzureOpenAiConfig.DeploymentsEntry } var file_console_proto_depIdxs = []int32{ - 4, // 0: plrl.AiConfig.openai:type_name -> plrl.OpenAiConfig - 5, // 1: plrl.AiConfig.anthropic:type_name -> plrl.AnthropicConfig - 6, // 2: plrl.AiConfig.vertexAi:type_name -> plrl.VertexAiConfig - 7, // 3: plrl.AiConfig.bedrock:type_name -> plrl.BedrockConfig - 8, // 4: plrl.AiConfig.azure:type_name -> plrl.AzureOpenAiConfig - 4, // 5: plrl.AiConfig.openaiCompatible:type_name -> plrl.OpenAiConfig - 4, // 6: plrl.AiConfig.xai:type_name -> plrl.OpenAiConfig - 3, // 7: plrl.OpenAiConfig.tokenExchange:type_name -> plrl.OpenAiTokenExchange + 5, // 0: plrl.AiConfig.openai:type_name -> plrl.OpenAiConfig + 6, // 1: plrl.AiConfig.anthropic:type_name -> plrl.AnthropicConfig + 7, // 2: plrl.AiConfig.vertexAi:type_name -> plrl.VertexAiConfig + 8, // 3: plrl.AiConfig.bedrock:type_name -> plrl.BedrockConfig + 9, // 4: plrl.AiConfig.azure:type_name -> plrl.AzureOpenAiConfig + 5, // 5: plrl.AiConfig.openaiCompatible:type_name -> plrl.OpenAiConfig + 5, // 6: plrl.AiConfig.xai:type_name -> plrl.OpenAiConfig + 4, // 7: plrl.OpenAiConfig.tokenExchange:type_name -> plrl.OpenAiTokenExchange 0, // 8: plrl.OpenAiConfig.method:type_name -> plrl.OpenAiMethod - 17, // 9: plrl.BedrockConfig.deployments:type_name -> plrl.BedrockConfig.DeploymentsEntry - 18, // 10: plrl.AzureOpenAiConfig.deployments:type_name -> plrl.AzureOpenAiConfig.DeploymentsEntry - 14, // 11: plrl.PluralServer.MeterMetrics:input_type -> plrl.MeterMetricsRequest - 1, // 12: plrl.PluralServer.GetAiConfig:input_type -> plrl.AiConfigRequest - 16, // 13: plrl.PluralServer.GetObservabilityConfig:input_type -> plrl.ObservabilityConfigRequest - 9, // 14: plrl.PluralServer.ProxyAuthentication:input_type -> plrl.ProxyAuthenticationRequest - 11, // 15: plrl.PluralServer.VerifyCluster:input_type -> plrl.VerifyClusterRequest - 15, // 16: plrl.PluralServer.MeterMetrics:output_type -> plrl.MeterMetricsResponse - 2, // 17: plrl.PluralServer.GetAiConfig:output_type -> plrl.AiConfig - 13, // 18: plrl.PluralServer.GetObservabilityConfig:output_type -> plrl.ObservabilityConfig - 10, // 19: plrl.PluralServer.ProxyAuthentication:output_type -> plrl.ProxyAuthenticationResponse - 12, // 20: plrl.PluralServer.VerifyCluster:output_type -> plrl.VerifyClusterResponse - 16, // [16:21] is the sub-list for method output_type - 11, // [11:16] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 18, // 9: plrl.BedrockConfig.deployments:type_name -> plrl.BedrockConfig.DeploymentsEntry + 1, // 10: plrl.BedrockConfig.endpoint:type_name -> plrl.BedrockEndpoint + 19, // 11: plrl.AzureOpenAiConfig.deployments:type_name -> plrl.AzureOpenAiConfig.DeploymentsEntry + 15, // 12: plrl.PluralServer.MeterMetrics:input_type -> plrl.MeterMetricsRequest + 2, // 13: plrl.PluralServer.GetAiConfig:input_type -> plrl.AiConfigRequest + 17, // 14: plrl.PluralServer.GetObservabilityConfig:input_type -> plrl.ObservabilityConfigRequest + 10, // 15: plrl.PluralServer.ProxyAuthentication:input_type -> plrl.ProxyAuthenticationRequest + 12, // 16: plrl.PluralServer.VerifyCluster:input_type -> plrl.VerifyClusterRequest + 16, // 17: plrl.PluralServer.MeterMetrics:output_type -> plrl.MeterMetricsResponse + 3, // 18: plrl.PluralServer.GetAiConfig:output_type -> plrl.AiConfig + 14, // 19: plrl.PluralServer.GetObservabilityConfig:output_type -> plrl.ObservabilityConfig + 11, // 20: plrl.PluralServer.ProxyAuthentication:output_type -> plrl.ProxyAuthenticationResponse + 13, // 21: plrl.PluralServer.VerifyCluster:output_type -> plrl.VerifyClusterResponse + 17, // [17:22] is the sub-list for method output_type + 12, // [12:17] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_console_proto_init() } @@ -1421,7 +1484,7 @@ func file_console_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_console_proto_rawDesc), len(file_console_proto_rawDesc)), - NumEnums: 1, + NumEnums: 2, NumMessages: 18, NumExtensions: 0, NumServices: 1, diff --git a/go/nexus/internal/router/account.go b/go/nexus/internal/router/account.go index 1a922765cd..aaa649ff04 100644 --- a/go/nexus/internal/router/account.go +++ b/go/nexus/internal/router/account.go @@ -7,6 +7,7 @@ import ( "github.com/maximhq/bifrost/core/schemas" "github.com/pluralsh/console/go/nexus/internal/console" "github.com/pluralsh/console/go/nexus/internal/log" + pb "github.com/pluralsh/console/go/nexus/internal/proto" "github.com/pluralsh/console/go/nexus/internal/tokenexchange" "go.uber.org/zap" ) @@ -114,7 +115,14 @@ func (in *Account) GetConfiguredProviders() ([]schemas.ModelProvider, error) { } if cfg := aiConfig.GetBedrock(); cfg != nil { - providers = append(providers, schemas.Bedrock) + provider := bedrockProvider(cfg) + providers = append(providers, provider) + + // Bedrock Mantle does not expose embeddings. Keep the runtime provider configured + // for the embedding model, matching ReqLLM's runtime-only embedding behavior. + if provider == schemas.BedrockMantle && cfg.GetEmbeddingModelId() != "" { + providers = append(providers, schemas.Bedrock) + } } if cfg := aiConfig.GetAzure(); cfg != nil { @@ -180,7 +188,7 @@ func (in *Account) GetConfigForProvider(provider schemas.ModelProvider) (*schema case schemas.Vertex: // Vertex uses project/location + auth in keys; no base URL override required. - case schemas.Bedrock: + case schemas.Bedrock, schemas.BedrockMantle: // Bedrock uses AWS region + credentials in keys; no base URL override required. case schemas.Azure: @@ -189,3 +197,11 @@ func (in *Account) GetConfigForProvider(provider schemas.ModelProvider) (*schema return config, nil } + +func bedrockProvider(config *pb.BedrockConfig) schemas.ModelProvider { + if config != nil && config.GetEndpoint() == pb.BedrockEndpoint_MANTLE { + return schemas.BedrockMantle + } + + return schemas.Bedrock +} diff --git a/go/nexus/internal/router/account_keys.go b/go/nexus/internal/router/account_keys.go index afa745a493..249a722664 100644 --- a/go/nexus/internal/router/account_keys.go +++ b/go/nexus/internal/router/account_keys.go @@ -34,7 +34,9 @@ func (in *Account) GetKeysForProvider(ctx context.Context, provider schemas.Mode case schemas.Vertex: return in.handleVertexKeys(aiConfig.GetVertexAi()) case schemas.Bedrock: - return in.handleBedrockKeys(aiConfig.GetBedrock()) + return in.handleBedrockKeys(aiConfig.GetBedrock(), schemas.Bedrock) + case schemas.BedrockMantle: + return in.handleBedrockKeys(aiConfig.GetBedrock(), schemas.BedrockMantle) case schemas.Azure: return in.handleAzureKeys(aiConfig.GetAzure()) default: @@ -60,7 +62,7 @@ func (in *Account) handleOpenAIKeys(ctx context.Context, config *pb.OpenAiConfig return []schemas.Key{ { - Value: schemas.EnvVar{ + Value: schemas.SecretVar{ Val: apiKey, }, Models: in.filterModels(append( @@ -102,7 +104,7 @@ func (in *Account) handleAnthropicKeys(config *pb.AnthropicConfig) ([]schemas.Ke return []schemas.Key{ { - Value: schemas.EnvVar{ + Value: schemas.SecretVar{ Val: config.GetApiKey(), }, Models: in.filterModels(append( @@ -134,13 +136,13 @@ func (in *Account) handleVertexKeys(config *pb.VertexAiConfig) ([]schemas.Key, e config.GetEmbeddingModel(), }, config.GetProxyModels()...)), VertexKeyConfig: &schemas.VertexKeyConfig{ - ProjectID: schemas.EnvVar{ + ProjectID: schemas.SecretVar{ Val: config.GetProject(), }, - Region: schemas.EnvVar{ + Region: schemas.SecretVar{ Val: config.GetLocation(), }, - AuthCredentials: schemas.EnvVar{ + AuthCredentials: schemas.SecretVar{ Val: config.GetServiceAccountJson(), }, }, @@ -150,38 +152,77 @@ func (in *Account) handleVertexKeys(config *pb.VertexAiConfig) ([]schemas.Key, e }, nil } -func (in *Account) handleBedrockKeys(config *pb.BedrockConfig) ([]schemas.Key, error) { +func (in *Account) handleBedrockKeys(config *pb.BedrockConfig, provider schemas.ModelProvider) ([]schemas.Key, error) { if config == nil { return nil, fmt.Errorf("bedrock not configured") } + if provider == schemas.BedrockMantle && bedrockProvider(config) != schemas.BedrockMantle { + return nil, fmt.Errorf("bedrock mantle not configured") + } in.logger.Debug("Bedrock configuration", + zap.String("endpoint", string(provider)), zap.String("model", config.GetModelId()), zap.String("tool_model", config.GetToolModelId()), zap.String("embedding_model", config.GetEmbeddingModelId()), ) + key := schemas.Key{ + Value: schemas.SecretVar{Val: config.GetAccessToken()}, + Models: in.bedrockModels(config, provider), + UseForBatchAPI: lo.ToPtr(provider == schemas.Bedrock), + Weight: 1.0, + } + + accessKey := schemas.SecretVar{Val: config.GetAwsAccessKeyId()} + secretKey := schemas.SecretVar{Val: config.GetAwsSecretAccessKey()} + region := &schemas.SecretVar{Val: config.GetRegion()} + + if provider == schemas.BedrockMantle { + key.BedrockMantleKeyConfig = &schemas.BedrockMantleKeyConfig{ + AccessKey: accessKey, + SecretKey: secretKey, + Region: region, + } + } else { + if bedrockProvider(config) == schemas.BedrockMantle { + key.Aliases = in.bedrockEmbeddingDeployments(config) + } else { + key.Aliases = in.bedrockDeployments(config) + } + key.BedrockKeyConfig = &schemas.BedrockKeyConfig{ + AccessKey: accessKey, + SecretKey: secretKey, + Region: region, + } + } + return []schemas.Key{ - { - Models: in.toBedrockModels(config), - Aliases: schemas.KeyAliases(in.toBedrockDeployments(config)), - BedrockKeyConfig: &schemas.BedrockKeyConfig{ - AccessKey: schemas.EnvVar{ - Val: config.GetAwsAccessKeyId(), - }, - SecretKey: schemas.EnvVar{ - Val: config.GetAwsSecretAccessKey(), - }, - Region: &schemas.EnvVar{ - Val: config.GetRegion(), - }, - }, - UseForBatchAPI: lo.ToPtr(true), - Weight: 1.0, - }, + key, }, nil } +func (in *Account) bedrockModels(config *pb.BedrockConfig, provider schemas.ModelProvider) []string { + if provider == schemas.BedrockMantle { + return in.filterModels(append(config.GetProxyModels(), config.GetModelId(), config.GetToolModelId())) + } + + if bedrockProvider(config) == schemas.BedrockMantle { + return in.filterModels([]string{config.GetEmbeddingModelId()}) + } + + return in.toBedrockModels(config) +} + +func (in *Account) bedrockEmbeddingDeployments(config *pb.BedrockConfig) schemas.KeyAliases { + aliases := make(schemas.KeyAliases) + if modelID := config.GetEmbeddingModelId(); modelID != "" { + inferenceProfileID, model := in.parseModelID(modelID) + aliases[model] = schemas.AliasConfig{ModelID: inferenceProfileID} + } + return aliases +} + // toBedrockModels returns client-facing model IDs registered on the Bifrost key. // Configured values may be foundation model IDs (e.g. anthropic.claude-3-5-sonnet-20241022-v2:0) // or regional inference profile IDs with three dot-separated segments (e.g. @@ -212,8 +253,8 @@ func (in *Account) toBedrockModels(config *pb.BedrockConfig) []string { // // Inference Profile ID: global.anthropic.claude-haiku-4-5-20251001-v1:0 // Model ID: anthropic.claude-haiku-4-5-20251001-v1:0 -func (in *Account) toBedrockDeployments(config *pb.BedrockConfig) map[string]string { - deployments := in.filterDeployments(config.GetDeployments()) +func (in *Account) bedrockDeployments(config *pb.BedrockConfig) schemas.KeyAliases { + deployments := in.toKeyAliases(config.GetDeployments()) models := append(config.GetProxyModels(), config.GetModelId(), config.GetToolModelId(), config.GetEmbeddingModelId()) // Augment configured deployments with provided profiles ids. @@ -223,7 +264,7 @@ func (in *Account) toBedrockDeployments(config *pb.BedrockConfig) map[string]str } inferenceProfileID, model := in.parseModelID(modelID) - deployments[model] = inferenceProfileID + deployments[model] = schemas.AliasConfig{ModelID: inferenceProfileID} } return deployments @@ -263,12 +304,12 @@ func (in *Account) handleAzureKeys(config *pb.AzureOpenAiConfig) ([]schemas.Key, config.GetToolModel(), config.GetEmbeddingModel(), }, config.GetProxyModels()...)), - Aliases: schemas.KeyAliases(in.filterDeployments(config.GetDeployments())), - Value: schemas.EnvVar{ + Aliases: in.toKeyAliases(config.GetDeployments()), + Value: schemas.SecretVar{ Val: config.GetAccessToken(), }, AzureKeyConfig: &schemas.AzureKeyConfig{ - Endpoint: schemas.EnvVar{ + Endpoint: schemas.SecretVar{ // We need to remove the suffix since console deployment settings enforce it currently. Val: strings.TrimSuffix(config.GetEndpoint(), "/openai/deployments"), }, @@ -285,12 +326,12 @@ func (in *Account) filterModels(models []string) []string { }) } -func (in *Account) filterDeployments(deployments map[string]string) map[string]string { - result := make(map[string]string) +func (in *Account) toKeyAliases(deployments map[string]string) schemas.KeyAliases { + result := make(schemas.KeyAliases) for model, deployment := range deployments { if len(model) > 0 && len(deployment) > 0 { - result[model] = deployment + result[model] = schemas.AliasConfig{ModelID: deployment} } } diff --git a/go/nexus/internal/router/account_keys_test.go b/go/nexus/internal/router/account_keys_test.go index afb1088081..8f528de433 100644 --- a/go/nexus/internal/router/account_keys_test.go +++ b/go/nexus/internal/router/account_keys_test.go @@ -118,6 +118,92 @@ func TestHandleOpenAIKeys_tokenExchangeEnabledIncomplete(t *testing.T) { require.Error(t, err) } +func TestAccountBedrockRuntimeEndpointIsDefault(t *testing.T) { + cfg := &pb.AiConfig{ + Enabled: true, + Bedrock: &pb.BedrockConfig{ + ModelId: lo.ToPtr("anthropic.claude-sonnet-4-6"), + Region: lo.ToPtr("us-east-1"), + }, + } + acct := &Account{ + consoleClient: &mockConsoleClient{cfg: cfg}, + tokenCache: tokenexchange.NewCache(), + logger: zap.NewNop(), + } + + providers, err := acct.GetConfiguredProviders() + require.NoError(t, err) + require.Contains(t, providers, schemas.Bedrock) + require.NotContains(t, providers, schemas.BedrockMantle) + + provider, model, _, err := (&OpenAIRouter{consoleClient: acct.consoleClient}).resolveModel( + context.Background(), + "bedrock/anthropic.claude-sonnet-4-6", + ) + require.NoError(t, err) + require.Equal(t, schemas.Bedrock, provider) + require.Equal(t, "anthropic.claude-sonnet-4-6", model) + + keys, err := acct.GetKeysForProvider(context.Background(), schemas.Bedrock) + require.NoError(t, err) + require.Len(t, keys, 1) + require.NotNil(t, keys[0].BedrockKeyConfig) + require.Nil(t, keys[0].BedrockMantleKeyConfig) + require.Empty(t, keys[0].BedrockKeyConfig.AccessKey.GetValue()) + require.Empty(t, keys[0].BedrockKeyConfig.SecretKey.GetValue()) +} + +func TestAccountBedrockMantleEndpointUsesMantleAndRuntimeEmbeddings(t *testing.T) { + endpoint := pb.BedrockEndpoint_MANTLE + cfg := &pb.AiConfig{ + Enabled: true, + Bedrock: &pb.BedrockConfig{ + ModelId: lo.ToPtr("anthropic.claude-sonnet-4-6"), + ToolModelId: lo.ToPtr("openai.gpt-5.4"), + EmbeddingModelId: lo.ToPtr("cohere.embed-english-v3"), + ProxyModels: []string{"google.gemma-4-27b"}, + AccessToken: lo.ToPtr("bedrock-token"), + Region: lo.ToPtr("us-west-2"), + Endpoint: &endpoint, + }, + } + acct := &Account{ + consoleClient: &mockConsoleClient{cfg: cfg}, + tokenCache: tokenexchange.NewCache(), + logger: zap.NewNop(), + } + + providers, err := acct.GetConfiguredProviders() + require.NoError(t, err) + require.ElementsMatch(t, []schemas.ModelProvider{schemas.BedrockMantle, schemas.Bedrock}, providers) + + provider, model, _, err := (&OpenAIRouter{consoleClient: acct.consoleClient}).resolveModel( + context.Background(), + "bedrock/anthropic.claude-sonnet-4-6", + ) + require.NoError(t, err) + require.Equal(t, schemas.BedrockMantle, provider) + require.Equal(t, "anthropic.claude-sonnet-4-6", model) + + mantleKeys, err := acct.GetKeysForProvider(context.Background(), schemas.BedrockMantle) + require.NoError(t, err) + require.Len(t, mantleKeys, 1) + require.Nil(t, mantleKeys[0].BedrockKeyConfig) + require.NotNil(t, mantleKeys[0].BedrockMantleKeyConfig) + require.Equal(t, "bedrock-token", mantleKeys[0].Value.GetValue()) + require.ElementsMatch(t, + []string{"anthropic.claude-sonnet-4-6", "openai.gpt-5.4", "google.gemma-4-27b"}, + mantleKeys[0].Models, + ) + + runtimeKeys, err := acct.GetKeysForProvider(context.Background(), schemas.Bedrock) + require.NoError(t, err) + require.Len(t, runtimeKeys, 1) + require.NotNil(t, runtimeKeys[0].BedrockKeyConfig) + require.Equal(t, []string{"cohere.embed-english-v3"}, []string(runtimeKeys[0].Models)) +} + func TestAccountOpenAICompatibleProvider(t *testing.T) { chat := pb.OpenAiMethod_CHAT cfg := &pb.AiConfig{ diff --git a/go/nexus/internal/router/openai.go b/go/nexus/internal/router/openai.go index a4084ed80d..555b7f1e17 100644 --- a/go/nexus/internal/router/openai.go +++ b/go/nexus/internal/router/openai.go @@ -68,6 +68,15 @@ func (in *OpenAIRouter) resolveModel(ctx context.Context, model string) (schemas return "", "", nil, fmt.Errorf("provider not configured: %s", provider) } return provider, parts[1], aiConfig.GetXai(), nil + case schemas.Bedrock: + aiConfig, err := in.consoleClient.GetAiConfig(ctx) + if err != nil { + return "", "", nil, fmt.Errorf("failed to load AI config: %w", err) + } + if aiConfig.GetBedrock() == nil { + return "", "", nil, fmt.Errorf("provider not configured: %s", provider) + } + return bedrockProvider(aiConfig.GetBedrock()), parts[1], nil, nil } if !schemas.IsKnownProvider(parts[0]) { diff --git a/go/observability-proxy/internal/proto/console.pb.go b/go/observability-proxy/internal/proto/console.pb.go index 2d8c7958dc..ffbd4b7af9 100644 --- a/go/observability-proxy/internal/proto/console.pb.go +++ b/go/observability-proxy/internal/proto/console.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.11 +// protoc-gen-go v1.36.11-devel // protoc v6.31.1 // source: console.proto @@ -74,6 +74,52 @@ func (OpenAiMethod) EnumDescriptor() ([]byte, []int) { return file_console_proto_rawDescGZIP(), []int{0} } +type BedrockEndpoint int32 + +const ( + BedrockEndpoint_RUNTIME BedrockEndpoint = 0 + BedrockEndpoint_MANTLE BedrockEndpoint = 1 +) + +// Enum value maps for BedrockEndpoint. +var ( + BedrockEndpoint_name = map[int32]string{ + 0: "RUNTIME", + 1: "MANTLE", + } + BedrockEndpoint_value = map[string]int32{ + "RUNTIME": 0, + "MANTLE": 1, + } +) + +func (x BedrockEndpoint) Enum() *BedrockEndpoint { + p := new(BedrockEndpoint) + *p = x + return p +} + +func (x BedrockEndpoint) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BedrockEndpoint) Descriptor() protoreflect.EnumDescriptor { + return file_console_proto_enumTypes[1].Descriptor() +} + +func (BedrockEndpoint) Type() protoreflect.EnumType { + return &file_console_proto_enumTypes[1] +} + +func (x BedrockEndpoint) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BedrockEndpoint.Descriptor instead. +func (BedrockEndpoint) EnumDescriptor() ([]byte, []int) { + return file_console_proto_rawDescGZIP(), []int{1} +} + type AiConfigRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -581,6 +627,7 @@ type BedrockConfig struct { AwsSecretAccessKey *string `protobuf:"bytes,7,opt,name=awsSecretAccessKey,proto3,oneof" json:"awsSecretAccessKey,omitempty"` ProxyModels []string `protobuf:"bytes,8,rep,name=proxyModels,proto3" json:"proxyModels,omitempty"` Deployments map[string]string `protobuf:"bytes,9,rep,name=deployments,proto3" json:"deployments,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Endpoint *BedrockEndpoint `protobuf:"varint,10,opt,name=endpoint,proto3,enum=plrl.BedrockEndpoint,oneof" json:"endpoint,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -678,6 +725,13 @@ func (x *BedrockConfig) GetDeployments() map[string]string { return nil } +func (x *BedrockConfig) GetEndpoint() BedrockEndpoint { + if x != nil && x.Endpoint != nil { + return *x.Endpoint + } + return BedrockEndpoint_RUNTIME +} + type AzureOpenAiConfig struct { state protoimpl.MessageState `protogen:"open.v1"` ApiVersion *string `protobuf:"bytes,1,opt,name=apiVersion,proto3,oneof" json:"apiVersion,omitempty"` @@ -1256,7 +1310,7 @@ const file_console_proto_rawDesc = "" + "_toolModelB\n" + "\n" + "\b_projectB\v\n" + - "\t_location\"\xcc\x04\n" + + "\t_location\"\x91\x05\n" + "\rBedrockConfig\x12\x1d\n" + "\amodelId\x18\x01 \x01(\tH\x00R\amodelId\x88\x01\x01\x12%\n" + "\vtoolModelId\x18\x02 \x01(\tH\x01R\vtoolModelId\x88\x01\x01\x12%\n" + @@ -1266,7 +1320,9 @@ const file_console_proto_rawDesc = "" + "\x0eawsAccessKeyId\x18\x06 \x01(\tH\x05R\x0eawsAccessKeyId\x88\x01\x01\x123\n" + "\x12awsSecretAccessKey\x18\a \x01(\tH\x06R\x12awsSecretAccessKey\x88\x01\x01\x12 \n" + "\vproxyModels\x18\b \x03(\tR\vproxyModels\x12F\n" + - "\vdeployments\x18\t \x03(\v2$.plrl.BedrockConfig.DeploymentsEntryR\vdeployments\x1a>\n" + + "\vdeployments\x18\t \x03(\v2$.plrl.BedrockConfig.DeploymentsEntryR\vdeployments\x126\n" + + "\bendpoint\x18\n" + + " \x01(\x0e2\x15.plrl.BedrockEndpointH\aR\bendpoint\x88\x01\x01\x1a>\n" + "\x10DeploymentsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\n" + @@ -1277,7 +1333,8 @@ const file_console_proto_rawDesc = "" + "\a_regionB\x13\n" + "\x11_embeddingModelIdB\x11\n" + "\x0f_awsAccessKeyIdB\x15\n" + - "\x13_awsSecretAccessKey\"\xf0\x03\n" + + "\x13_awsSecretAccessKeyB\v\n" + + "\t_endpoint\"\xf0\x03\n" + "\x11AzureOpenAiConfig\x12#\n" + "\n" + "apiVersion\x18\x01 \x01(\tH\x00R\n" + @@ -1332,7 +1389,11 @@ const file_console_proto_rawDesc = "" + "\x1aOPEN_AI_METHOD_UNSPECIFIED\x10\x00\x12\b\n" + "\x04CHAT\x10\x01\x12\r\n" + "\tRESPONSES\x10\x02\x12\b\n" + - "\x04AUTO\x10\x032\x88\x03\n" + + "\x04AUTO\x10\x03**\n" + + "\x0fBedrockEndpoint\x12\v\n" + + "\aRUNTIME\x10\x00\x12\n" + + "\n" + + "\x06MANTLE\x10\x012\x88\x03\n" + "\fPluralServer\x12E\n" + "\fMeterMetrics\x12\x19.plrl.MeterMetricsRequest\x1a\x1a.plrl.MeterMetricsResponse\x124\n" + "\vGetAiConfig\x12\x15.plrl.AiConfigRequest\x1a\x0e.plrl.AiConfig\x12U\n" + @@ -1352,56 +1413,58 @@ func file_console_proto_rawDescGZIP() []byte { return file_console_proto_rawDescData } -var file_console_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_console_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_console_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_console_proto_goTypes = []any{ (OpenAiMethod)(0), // 0: plrl.OpenAiMethod - (*AiConfigRequest)(nil), // 1: plrl.AiConfigRequest - (*AiConfig)(nil), // 2: plrl.AiConfig - (*OpenAiTokenExchange)(nil), // 3: plrl.OpenAiTokenExchange - (*OpenAiConfig)(nil), // 4: plrl.OpenAiConfig - (*AnthropicConfig)(nil), // 5: plrl.AnthropicConfig - (*VertexAiConfig)(nil), // 6: plrl.VertexAiConfig - (*BedrockConfig)(nil), // 7: plrl.BedrockConfig - (*AzureOpenAiConfig)(nil), // 8: plrl.AzureOpenAiConfig - (*ProxyAuthenticationRequest)(nil), // 9: plrl.ProxyAuthenticationRequest - (*ProxyAuthenticationResponse)(nil), // 10: plrl.ProxyAuthenticationResponse - (*VerifyClusterRequest)(nil), // 11: plrl.VerifyClusterRequest - (*VerifyClusterResponse)(nil), // 12: plrl.VerifyClusterResponse - (*ObservabilityConfig)(nil), // 13: plrl.ObservabilityConfig - (*MeterMetricsRequest)(nil), // 14: plrl.MeterMetricsRequest - (*MeterMetricsResponse)(nil), // 15: plrl.MeterMetricsResponse - (*ObservabilityConfigRequest)(nil), // 16: plrl.ObservabilityConfigRequest - nil, // 17: plrl.BedrockConfig.DeploymentsEntry - nil, // 18: plrl.AzureOpenAiConfig.DeploymentsEntry + (BedrockEndpoint)(0), // 1: plrl.BedrockEndpoint + (*AiConfigRequest)(nil), // 2: plrl.AiConfigRequest + (*AiConfig)(nil), // 3: plrl.AiConfig + (*OpenAiTokenExchange)(nil), // 4: plrl.OpenAiTokenExchange + (*OpenAiConfig)(nil), // 5: plrl.OpenAiConfig + (*AnthropicConfig)(nil), // 6: plrl.AnthropicConfig + (*VertexAiConfig)(nil), // 7: plrl.VertexAiConfig + (*BedrockConfig)(nil), // 8: plrl.BedrockConfig + (*AzureOpenAiConfig)(nil), // 9: plrl.AzureOpenAiConfig + (*ProxyAuthenticationRequest)(nil), // 10: plrl.ProxyAuthenticationRequest + (*ProxyAuthenticationResponse)(nil), // 11: plrl.ProxyAuthenticationResponse + (*VerifyClusterRequest)(nil), // 12: plrl.VerifyClusterRequest + (*VerifyClusterResponse)(nil), // 13: plrl.VerifyClusterResponse + (*ObservabilityConfig)(nil), // 14: plrl.ObservabilityConfig + (*MeterMetricsRequest)(nil), // 15: plrl.MeterMetricsRequest + (*MeterMetricsResponse)(nil), // 16: plrl.MeterMetricsResponse + (*ObservabilityConfigRequest)(nil), // 17: plrl.ObservabilityConfigRequest + nil, // 18: plrl.BedrockConfig.DeploymentsEntry + nil, // 19: plrl.AzureOpenAiConfig.DeploymentsEntry } var file_console_proto_depIdxs = []int32{ - 4, // 0: plrl.AiConfig.openai:type_name -> plrl.OpenAiConfig - 5, // 1: plrl.AiConfig.anthropic:type_name -> plrl.AnthropicConfig - 6, // 2: plrl.AiConfig.vertexAi:type_name -> plrl.VertexAiConfig - 7, // 3: plrl.AiConfig.bedrock:type_name -> plrl.BedrockConfig - 8, // 4: plrl.AiConfig.azure:type_name -> plrl.AzureOpenAiConfig - 4, // 5: plrl.AiConfig.openaiCompatible:type_name -> plrl.OpenAiConfig - 4, // 6: plrl.AiConfig.xai:type_name -> plrl.OpenAiConfig - 3, // 7: plrl.OpenAiConfig.tokenExchange:type_name -> plrl.OpenAiTokenExchange + 5, // 0: plrl.AiConfig.openai:type_name -> plrl.OpenAiConfig + 6, // 1: plrl.AiConfig.anthropic:type_name -> plrl.AnthropicConfig + 7, // 2: plrl.AiConfig.vertexAi:type_name -> plrl.VertexAiConfig + 8, // 3: plrl.AiConfig.bedrock:type_name -> plrl.BedrockConfig + 9, // 4: plrl.AiConfig.azure:type_name -> plrl.AzureOpenAiConfig + 5, // 5: plrl.AiConfig.openaiCompatible:type_name -> plrl.OpenAiConfig + 5, // 6: plrl.AiConfig.xai:type_name -> plrl.OpenAiConfig + 4, // 7: plrl.OpenAiConfig.tokenExchange:type_name -> plrl.OpenAiTokenExchange 0, // 8: plrl.OpenAiConfig.method:type_name -> plrl.OpenAiMethod - 17, // 9: plrl.BedrockConfig.deployments:type_name -> plrl.BedrockConfig.DeploymentsEntry - 18, // 10: plrl.AzureOpenAiConfig.deployments:type_name -> plrl.AzureOpenAiConfig.DeploymentsEntry - 14, // 11: plrl.PluralServer.MeterMetrics:input_type -> plrl.MeterMetricsRequest - 1, // 12: plrl.PluralServer.GetAiConfig:input_type -> plrl.AiConfigRequest - 16, // 13: plrl.PluralServer.GetObservabilityConfig:input_type -> plrl.ObservabilityConfigRequest - 9, // 14: plrl.PluralServer.ProxyAuthentication:input_type -> plrl.ProxyAuthenticationRequest - 11, // 15: plrl.PluralServer.VerifyCluster:input_type -> plrl.VerifyClusterRequest - 15, // 16: plrl.PluralServer.MeterMetrics:output_type -> plrl.MeterMetricsResponse - 2, // 17: plrl.PluralServer.GetAiConfig:output_type -> plrl.AiConfig - 13, // 18: plrl.PluralServer.GetObservabilityConfig:output_type -> plrl.ObservabilityConfig - 10, // 19: plrl.PluralServer.ProxyAuthentication:output_type -> plrl.ProxyAuthenticationResponse - 12, // 20: plrl.PluralServer.VerifyCluster:output_type -> plrl.VerifyClusterResponse - 16, // [16:21] is the sub-list for method output_type - 11, // [11:16] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 18, // 9: plrl.BedrockConfig.deployments:type_name -> plrl.BedrockConfig.DeploymentsEntry + 1, // 10: plrl.BedrockConfig.endpoint:type_name -> plrl.BedrockEndpoint + 19, // 11: plrl.AzureOpenAiConfig.deployments:type_name -> plrl.AzureOpenAiConfig.DeploymentsEntry + 15, // 12: plrl.PluralServer.MeterMetrics:input_type -> plrl.MeterMetricsRequest + 2, // 13: plrl.PluralServer.GetAiConfig:input_type -> plrl.AiConfigRequest + 17, // 14: plrl.PluralServer.GetObservabilityConfig:input_type -> plrl.ObservabilityConfigRequest + 10, // 15: plrl.PluralServer.ProxyAuthentication:input_type -> plrl.ProxyAuthenticationRequest + 12, // 16: plrl.PluralServer.VerifyCluster:input_type -> plrl.VerifyClusterRequest + 16, // 17: plrl.PluralServer.MeterMetrics:output_type -> plrl.MeterMetricsResponse + 3, // 18: plrl.PluralServer.GetAiConfig:output_type -> plrl.AiConfig + 14, // 19: plrl.PluralServer.GetObservabilityConfig:output_type -> plrl.ObservabilityConfig + 11, // 20: plrl.PluralServer.ProxyAuthentication:output_type -> plrl.ProxyAuthenticationResponse + 13, // 21: plrl.PluralServer.VerifyCluster:output_type -> plrl.VerifyClusterResponse + 17, // [17:22] is the sub-list for method output_type + 12, // [12:17] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_console_proto_init() } @@ -1421,7 +1484,7 @@ func file_console_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_console_proto_rawDesc), len(file_console_proto_rawDesc)), - NumEnums: 1, + NumEnums: 2, NumMessages: 18, NumExtensions: 0, NumServices: 1, diff --git a/go/polly/http/client.go b/go/polly/http/client.go index 254c989e6e..41b2049133 100644 --- a/go/polly/http/client.go +++ b/go/polly/http/client.go @@ -3,6 +3,7 @@ package http import ( "compress/gzip" "context" + "crypto/tls" "fmt" "net/http" "time" @@ -87,7 +88,12 @@ func newRetryableClient(transport http.RoundTripper, retryMax int, retryWaitMin, return rc.StandardClient() } -func NewHttpClient(token string) *http.Client { - transport := &tokenTransport{token: token, wrapped: http.DefaultTransport} +func NewHttpClient(token string, insecureSkipTLSVerify ...bool) *http.Client { + baseTransport := http.DefaultTransport.(*http.Transport).Clone() + if len(insecureSkipTLSVerify) > 0 && insecureSkipTLSVerify[0] { + baseTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //nolint:gosec + } + + transport := &tokenTransport{token: token, wrapped: baseTransport} return newRetryableClient(transport, 3, 1*time.Second, 10*time.Second) } diff --git a/go/polly/http/client_test.go b/go/polly/http/client_test.go index 8d23c19b34..897e93dcf2 100644 --- a/go/polly/http/client_test.go +++ b/go/polly/http/client_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "net/http/httptest" "strings" "testing" "time" @@ -320,3 +321,16 @@ func TestNewHttpClient(t *testing.T) { require.NotNil(t, client) require.NotNil(t, client.Transport) } + +func TestNewHttpClient_InsecureSkipTLSVerify(t *testing.T) { + server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer server.Close() + + client := NewHttpClient("my-token", true) + response, err := client.Get(server.URL) + require.NoError(t, err) + defer response.Body.Close() + assert.Equal(t, http.StatusOK, response.StatusCode) +} diff --git a/js/console/public/setup-guides/tools/splunk.md b/js/console/public/setup-guides/tools/splunk.md index b8fac4acce..585b47f352 100644 --- a/js/console/public/setup-guides/tools/splunk.md +++ b/js/console/public/setup-guides/tools/splunk.md @@ -37,21 +37,39 @@ For local or self-signed TLS certificates, append `?insecure_skip_verify=true` t Create a dedicated integration identity. Do **not** use an HTTP Event Collector (HEC) token from **Settings → Data Inputs → HTTP Event Collector**. HEC tokens ingest events; they cannot call the search REST API. -### Option A: authentication token (recommended) +### Option A: Bearer authentication token (recommended) -These are JWT authentication tokens from **Settings → Tokens**, not HEC tokens. +Choose **Bearer** in **Token type** for a JWT authentication token. These tokens are created in **Settings → Tokens** and are sent as `Authorization: Bearer `. They are not HEC tokens. 1. Enable token authentication if it is off: **Settings → Tokens → Token Settings → Enable token authentication**. This requires the `edit_tokens_settings` capability (typically `admin` or `sc_admin`). 2. Create the dedicated user and role described below. 3. Go to **Settings → Tokens → New Token**. 4. Set **User** to that dedicated user and **Audience** to a short purpose string such as `plural-workbench`. 5. Create the token and copy it immediately. Splunk will not show the full value again. -6. Paste it into **Bearer token**. Leave **Username** and **Password** empty. +6. Paste it into **Authentication token**, select **Bearer** as **Token type**, and leave **Username** and **Password** empty. -### Option B: username and password +Administrators can also create the same type of token with `POST /services/authorization/tokens`. See [Create authentication tokens](https://help.splunk.com/en/splunk-cloud-platform/administer/manage-users-and-security/10.5.2605/authenticate-into-the-splunk-platform-with-tokens/create-authentication-tokens) in the Splunk documentation. + +### Option B: Splunk session key + +Choose **Splunk** in **Token type** only when the value is a session key returned by `POST /services/auth/login`. The integration sends it as `Authorization: Splunk `. + +Create a session key using the dedicated user's username and password: + +```shell +curl -sS -k https://:8089/services/auth/login \ + --data-urlencode username= \ + --data-urlencode password= +``` + +Copy the value inside `...` into **Authentication token**, then select **Splunk** as **Token type**. Leave **Username** and **Password** empty. + +Session keys expire according to the Splunk session timeout, so Bearer authentication tokens are usually a better choice for a persistent workbench connection. See [Authentication with HTTP Authorization tokens](https://help.splunk.com/en/splunk-enterprise/leverage-rest-apis/rest-api-user-manual/10.4/rest-api-user-manual/basic-concepts-about-the-splunk-platform-rest-api#authentication-with-http-authorization-tokens) for the session-key flow. + +### Option C: username and password 1. Create the dedicated user described below and set a password. -2. Fill **Username** and **Password**. Leave **Bearer token** empty. +2. Fill **Username** and **Password**. Leave **Authentication token** empty. **Token type** is ignored when no token is supplied. ## Grant permissions for the search export API @@ -88,7 +106,8 @@ If these are empty or omit the target index, the export call can succeed with no ## Complete the configuration - **URL:** management/REST API base URL (`https://:8089`, no search path) -- **Bearer token:** authentication token from **Settings → Tokens**, or +- **Authentication token:** either a JWT authentication token or session key +- **Token type:** **Bearer** for JWT tokens from **Settings → Tokens** (default), or **Splunk** for session keys from `/services/auth/login` - **Username** + **Password:** dedicated service user After saving, attach the tool to a workbench and run a log query against an index the role can search. diff --git a/js/console/public/setup-guides/tools/victoria_logs.md b/js/console/public/setup-guides/tools/victoria_logs.md new file mode 100644 index 0000000000..f66e437c2c --- /dev/null +++ b/js/console/public/setup-guides/tools/victoria_logs.md @@ -0,0 +1,24 @@ +# VictoriaLogs tool setup + +Use this guide to fill `URL` plus optional auth and tenant fields (`Username`, `Password`, `Account ID`, `Project ID`, `Bearer token / API key`). + +## 1) Prepare VictoriaLogs query access + +VictoriaLogs query APIs live under `/select/logsql/*` and use LogsQL, not Loki LogQL. Typical auth is: +- Basic auth at a gateway/proxy (vmauth, nginx, etc.) +- Bearer token auth +- Tenant routing via `AccountID` and `ProjectID` request headers (default `0:0`) + +## 2) Create least-privilege credentials + +- Create an integration account/token with query/read access only. +- If the cluster is multi-tenant, scope the tool to the needed AccountID/ProjectID pair. + +## 3) Fill the Workbench tool form + +- `URL`: VictoriaLogs query base URL, for example `http://victoria-logs:9428` +- `Username` / `Password`: optional basic auth +- `Account ID` / `Project ID`: set when querying a non-default tenant +- `Bearer token / API key`: optional token auth + +Queries sent by this tool are LogsQL, for example `error`, `{app="nginx"} "timeout"`, or `status:>=500`. diff --git a/js/console/src/components/settings/ai/AISettingsProviders.tsx b/js/console/src/components/settings/ai/AISettingsProviders.tsx index e106c1f6da..52bf34023a 100644 --- a/js/console/src/components/settings/ai/AISettingsProviders.tsx +++ b/js/console/src/components/settings/ai/AISettingsProviders.tsx @@ -7,6 +7,7 @@ import { AiProvider, AiSettings, AiSettingsAttributes, + BedrockEndpoint, ModelDefault, OpenAiMethod, } from '../../../generated/graphql.ts' @@ -23,6 +24,51 @@ const bedrockEmbeddingModelTooltip = 'Bedrock model used for embeddings and vector search.' const bedrockToolModelTooltip = 'Bedrock model used for tool calls and general chat, which are less frequent and benefit from more complex reasoning.' +const bedrockRegionTooltip = 'AWS region where your Bedrock models are hosted.' +const bedrockEndpointTooltip = + 'Bedrock API surface. Runtime uses InvokeModel or Converse; Mantle uses the Anthropic/OpenAI-compatible APIs.' + +const DEFAULT_BEDROCK_REGION = 'us-east-1' + +// Usable Amazon Bedrock commercial and GovCloud regions. +// https://docs.aws.amazon.com/general/latest/gr/bedrock.html +const BEDROCK_REGIONS = [ + { value: 'us-east-1', label: 'US East (N. Virginia)' }, + { value: 'us-east-2', label: 'US East (Ohio)' }, + { value: 'us-west-1', label: 'US West (N. California)' }, + { value: 'us-west-2', label: 'US West (Oregon)' }, + { value: 'ca-central-1', label: 'Canada (Central)' }, + { value: 'ca-west-1', label: 'Canada West (Calgary)' }, + { value: 'mx-central-1', label: 'Mexico (Central)' }, + { value: 'sa-east-1', label: 'South America (São Paulo)' }, + { value: 'eu-central-1', label: 'Europe (Frankfurt)' }, + { value: 'eu-central-2', label: 'Europe (Zurich)' }, + { value: 'eu-north-1', label: 'Europe (Stockholm)' }, + { value: 'eu-south-1', label: 'Europe (Milan)' }, + { value: 'eu-south-2', label: 'Europe (Spain)' }, + { value: 'eu-west-1', label: 'Europe (Ireland)' }, + { value: 'eu-west-2', label: 'Europe (London)' }, + { value: 'eu-west-3', label: 'Europe (Paris)' }, + { value: 'af-south-1', label: 'Africa (Cape Town)' }, + { value: 'il-central-1', label: 'Israel (Tel Aviv)' }, + { value: 'me-central-1', label: 'Middle East (UAE)' }, + { value: 'me-south-1', label: 'Middle East (Bahrain)' }, + { value: 'ap-east-2', label: 'Asia Pacific (Taipei)' }, + { value: 'ap-northeast-1', label: 'Asia Pacific (Tokyo)' }, + { value: 'ap-northeast-2', label: 'Asia Pacific (Seoul)' }, + { value: 'ap-northeast-3', label: 'Asia Pacific (Osaka)' }, + { value: 'ap-south-1', label: 'Asia Pacific (Mumbai)' }, + { value: 'ap-south-2', label: 'Asia Pacific (Hyderabad)' }, + { value: 'ap-southeast-1', label: 'Asia Pacific (Singapore)' }, + { value: 'ap-southeast-2', label: 'Asia Pacific (Sydney)' }, + { value: 'ap-southeast-3', label: 'Asia Pacific (Jakarta)' }, + { value: 'ap-southeast-4', label: 'Asia Pacific (Melbourne)' }, + { value: 'ap-southeast-5', label: 'Asia Pacific (Malaysia)' }, + { value: 'ap-southeast-6', label: 'Asia Pacific (New Zealand)' }, + { value: 'ap-southeast-7', label: 'Asia Pacific (Thailand)' }, + { value: 'us-gov-east-1', label: 'AWS GovCloud (US-East)' }, + { value: 'us-gov-west-1', label: 'AWS GovCloud (US-West)' }, +] as const export const aiProviderToLabel = { [AiProvider.Openai]: 'OpenAI', @@ -66,17 +112,19 @@ export function initialSettingsAttributes( }, } : {}), - ...(ai.bedrock - ? { - bedrock: { + bedrock: { + ...(ai.bedrock + ? { modelId: ai.bedrock.modelId, toolModelId: ai.bedrock.toolModelId, embeddingModel: ai.bedrock.embeddingModel, awsAccessKeyId: ai.bedrock.accessKeyId, - awsSecretAccessKey: '', - }, - } - : {}), + } + : {}), + awsSecretAccessKey: '', + endpoint: ai.bedrock?.endpoint ?? BedrockEndpoint.Runtime, + region: ai.bedrock?.region ?? DEFAULT_BEDROCK_REGION, + }, ...(ai.ollama ? { ollama: { @@ -137,7 +185,13 @@ export function initialSettingsAttributes( } : {}), } - : {} + : { + bedrock: { + awsSecretAccessKey: '', + endpoint: BedrockEndpoint.Runtime, + region: DEFAULT_BEDROCK_REGION, + }, + } } export function validateAttributes( @@ -157,19 +211,11 @@ export function validateAttributes( case AiProvider.Anthropic: return !!settings.anthropic?.accessToken case AiProvider.Bedrock: - return true + return !!settings.bedrock?.region case AiProvider.Ollama: - return !!( - settings.ollama?.model && - settings.ollama?.url && - settings.ollama?.authorization - ) + return !!(settings.ollama?.model && settings.ollama?.url) case AiProvider.Azure: - return !!( - settings.azure?.apiVersion && - settings.azure?.endpoint && - settings.azure?.accessToken - ) + return !!(settings.azure?.endpoint && settings.azure?.accessToken) case AiProvider.Vertex: return !!(settings.vertex?.project && settings.vertex?.location) default: @@ -350,8 +396,34 @@ export function BedrockSettings({ update: NonNullable> ) => void }) { + const region = settings?.region ?? DEFAULT_BEDROCK_REGION + const regionOptions = + region && !BEDROCK_REGIONS.some(({ value }) => value === region) + ? [...BEDROCK_REGIONS, { value: region, label: region }] + : BEDROCK_REGIONS + return ( <> + + + + + + ) } @@ -473,8 +569,7 @@ export function OllamaSettings({ = { [WorkbenchToolType.Elastic]: extractElasticMetadata, [WorkbenchToolType.Opensearch]: extractOpensearchMetadata, [WorkbenchToolType.Loki]: extractLokiMetadata, + [WorkbenchToolType.VictoriaLogs]: extractVictoriaLogsMetadata, [WorkbenchToolType.Prometheus]: extractPrometheusMetadata, [WorkbenchToolType.Tempo]: extractTempoMetadata, [WorkbenchToolType.Atlassian]: extractAtlassianMetadata, @@ -158,6 +159,17 @@ function extractLokiMetadata( ] } +function extractVictoriaLogsMetadata( + configuration: WorkbenchToolConfiguration | null +): MetadataRow[] { + return [ + { label: 'URL', value: configuration?.victoriaLogs?.url }, + { label: 'User', value: configuration?.victoriaLogs?.username }, + { label: 'Account ID', value: configuration?.victoriaLogs?.accountId }, + { label: 'Project ID', value: configuration?.victoriaLogs?.projectId }, + ] +} + function extractPrometheusMetadata( configuration: WorkbenchToolConfiguration | null ): MetadataRow[] { diff --git a/js/console/src/components/workbenches/tools/WorkbenchToolForm.tsx b/js/console/src/components/workbenches/tools/WorkbenchToolForm.tsx index d8d2d90bd6..6f3135753d 100644 --- a/js/console/src/components/workbenches/tools/WorkbenchToolForm.tsx +++ b/js/console/src/components/workbenches/tools/WorkbenchToolForm.tsx @@ -17,6 +17,7 @@ import { FormBindings } from 'components/utils/bindings' import { PolicyBindingFragment, Provider, + SplunkTokenType, WorkbenchToolCategory, WorkbenchToolAttributes, WorkbenchToolConfigurationAttributes, @@ -230,6 +231,8 @@ export function WorkbenchToolForm({ })) && (type !== WorkbenchToolType.Opensearch || opensearchConfigurationIsComplete(state.configuration?.opensearch)) && + (type !== WorkbenchToolType.VictoriaLogs || + !!(state.configuration?.victoriaLogs?.url ?? '').trim()) && (type !== WorkbenchToolType.Gitlab || hasRegisteredScm || scmTokenIsSet(state.configuration?.gitlab?.token)) && @@ -652,6 +655,12 @@ export const INITIAL_TOOL_CONFIG_BY_TYPE: { const { url, username, tenantId } = config?.loki ?? {} return { loki: { url: url ?? '', username, tenantId } } }, + [WorkbenchToolType.VictoriaLogs]: (config) => { + const { url, username, accountId, projectId } = config?.victoriaLogs ?? {} + return { + victoriaLogs: { url: url ?? '', username, accountId, projectId }, + } + }, [WorkbenchToolType.Prometheus]: (config) => { const { url, username, tenantId, awsSigv4, awsAccessKeyId, awsRegion } = config?.prometheus ?? {} @@ -707,8 +716,14 @@ export const INITIAL_TOOL_CONFIG_BY_TYPE: { }, [WorkbenchToolType.AzureDevops]: () => ({ azureDevops: { token: '' } }), [WorkbenchToolType.Splunk]: (config) => { - const { url, username } = config?.splunk ?? {} - return { splunk: { url: url ?? '', username } } + const { url, tokenType, username } = config?.splunk ?? {} + return { + splunk: { + url: url ?? '', + tokenType: tokenType ?? SplunkTokenType.Bearer, + username, + }, + } }, [WorkbenchToolType.Cloudwatch]: (config) => { const { region, logGroupNames, roleArn, roleSessionName } = diff --git a/js/console/src/components/workbenches/tools/WorkbenchToolFormFields.tsx b/js/console/src/components/workbenches/tools/WorkbenchToolFormFields.tsx index 04f8574389..dab5233cfe 100644 --- a/js/console/src/components/workbenches/tools/WorkbenchToolFormFields.tsx +++ b/js/console/src/components/workbenches/tools/WorkbenchToolFormFields.tsx @@ -19,6 +19,7 @@ import { InputRevealer } from 'components/cd/providers/InputRevealer' import { EditableDiv } from 'components/utils/EditableDiv' import { HelmAuthProvider, + SplunkTokenType, WorkbenchToolHttpMethod, WorkbenchToolType, } from 'generated/graphql' @@ -81,6 +82,8 @@ export function WorkbenchToolFormFields({ return render(type, HttpFormFields) case WorkbenchToolType.Loki: return render(type, UrlUsernamePasswordTokenTenantFormFields) + case WorkbenchToolType.VictoriaLogs: + return render(type, VictoriaLogsFormFields) case WorkbenchToolType.Prometheus: return render(type, PrometheusFormFields) case WorkbenchToolType.Tempo: @@ -541,6 +544,53 @@ function UrlUsernamePasswordTokenTenantFormFields< ) } +function VictoriaLogsFormFields({ + config: c, + setConfig: set, +}: ToolFormFieldProps) { + return ( + <> + set({ ...c, url: e.target.value })} + /> + set({ ...c, username: e.target.value || undefined })} + /> + set({ ...c, password: e.target.value || undefined })} + /> + set({ ...c, accountId: e.target.value || undefined })} + /> + set({ ...c, projectId: e.target.value || undefined })} + /> + set({ ...c, token: e.target.value || undefined })} + /> + + ) +} + function PrometheusFormFields({ config: c, setConfig: set, @@ -999,11 +1049,36 @@ function SplunkFormFields({ onChange={(e) => set({ ...c, password: e.target.value || undefined })} /> set({ ...c, token: e.target.value || undefined })} /> + + + ) } diff --git a/js/console/src/components/workbenches/tools/workbenchToolSetupGuides.ts b/js/console/src/components/workbenches/tools/workbenchToolSetupGuides.ts index bc87ee1702..aadf396551 100644 --- a/js/console/src/components/workbenches/tools/workbenchToolSetupGuides.ts +++ b/js/console/src/components/workbenches/tools/workbenchToolSetupGuides.ts @@ -8,6 +8,7 @@ const TOOL_SETUP_GUIDE_MARKDOWN_PATHS: Partial< [WorkbenchToolType.Opensearch]: '/setup-guides/tools/opensearch.md', [WorkbenchToolType.Prometheus]: '/setup-guides/tools/prometheus.md', [WorkbenchToolType.Loki]: '/setup-guides/tools/loki.md', + [WorkbenchToolType.VictoriaLogs]: '/setup-guides/tools/victoria_logs.md', [WorkbenchToolType.Tempo]: '/setup-guides/tools/tempo.md', [WorkbenchToolType.Jaeger]: '/setup-guides/tools/jaeger.md', [WorkbenchToolType.Datadog]: '/setup-guides/tools/datadog.md', @@ -42,6 +43,8 @@ const TOOL_SETUP_GUIDE_DOC_URLS: Partial> = { 'https://prometheus.io/docs/guides/basic-auth/', [WorkbenchToolType.Loki]: 'https://grafana.com/docs/loki/latest/operations/authentication/', + [WorkbenchToolType.VictoriaLogs]: + 'https://docs.victoriametrics.com/victorialogs/querying/', [WorkbenchToolType.Tempo]: 'https://grafana.com/docs/tempo/latest/setup/operator/grafana_datasource/', [WorkbenchToolType.Jaeger]: 'https://www.jaegertracing.io/docs/latest/apis/', diff --git a/js/console/src/components/workbenches/tools/workbenchToolsUtils.tsx b/js/console/src/components/workbenches/tools/workbenchToolsUtils.tsx index 50bb4e4348..499658aa3a 100644 --- a/js/console/src/components/workbenches/tools/workbenchToolsUtils.tsx +++ b/js/console/src/components/workbenches/tools/workbenchToolsUtils.tsx @@ -29,6 +29,7 @@ import { SplunkLogoIcon, TempoLogoIcon, ToolsIcon, + VictoriaLogsLogoIcon, VSphereLogoIcon, } from '@pluralsh/design-system' import { @@ -48,6 +49,7 @@ const CONFIGURABLE_WORKBENCH_TOOL_TYPES = [ WorkbenchToolType.Opensearch, WorkbenchToolType.Http, WorkbenchToolType.Loki, + WorkbenchToolType.VictoriaLogs, WorkbenchToolType.Prometheus, WorkbenchToolType.Tempo, WorkbenchToolType.Jaeger, @@ -86,6 +88,7 @@ export const CONFIGURABLE_TOOL_TYPE_TO_CONFIG_KEY = { [WorkbenchToolType.Opensearch]: 'opensearch', [WorkbenchToolType.Prometheus]: 'prometheus', [WorkbenchToolType.Loki]: 'loki', + [WorkbenchToolType.VictoriaLogs]: 'victoriaLogs', [WorkbenchToolType.Tempo]: 'tempo', [WorkbenchToolType.Jaeger]: 'jaeger', [WorkbenchToolType.Datadog]: 'datadog', @@ -167,6 +170,7 @@ const WORKBENCH_TOOL_LABELS: Record< [WorkbenchToolType.Opensearch]: 'OpenSearch', [WorkbenchToolType.Prometheus]: 'Prometheus', [WorkbenchToolType.Loki]: 'Loki', + [WorkbenchToolType.VictoriaLogs]: 'VictoriaLogs', [WorkbenchToolType.Tempo]: 'Tempo', [WorkbenchToolType.Datadog]: 'Datadog', [WorkbenchToolType.Atlassian]: 'Atlassian', @@ -239,6 +243,7 @@ export const TOOL_TYPE_TO_CATEGORIES: Record< [WorkbenchToolType.Opensearch]: [WorkbenchToolCategory.Logs], [WorkbenchToolType.Prometheus]: [WorkbenchToolCategory.Metrics], [WorkbenchToolType.Loki]: [WorkbenchToolCategory.Logs], + [WorkbenchToolType.VictoriaLogs]: [WorkbenchToolCategory.Logs], [WorkbenchToolType.Tempo]: [WorkbenchToolCategory.Traces], [WorkbenchToolType.Atlassian]: [WorkbenchToolCategory.Ticketing], [WorkbenchToolType.Linear]: [WorkbenchToolCategory.Ticketing], @@ -294,6 +299,8 @@ const CONFIGURABLE_TOOL_TYPE_CARD_DESCRIPTIONS: Record< [WorkbenchToolType.Prometheus]: 'Query metrics from Prometheus or Prometheus-compatible stores.', [WorkbenchToolType.Loki]: 'Query log data from Grafana Loki.', + [WorkbenchToolType.VictoriaLogs]: + 'Query logs from VictoriaLogs using LogsQL.', [WorkbenchToolType.Tempo]: 'Query trace data from Grafana Tempo for distributed tracing.', [WorkbenchToolType.Atlassian]: @@ -510,6 +517,7 @@ const toolToIcon: Record< [WorkbenchToolType.Elastic]: ElasticsearchLogoIcon, [WorkbenchToolType.Opensearch]: OpenSearchLogoIcon, [WorkbenchToolType.Loki]: LokiLogoIcon, + [WorkbenchToolType.VictoriaLogs]: VictoriaLogsLogoIcon, [WorkbenchToolType.Prometheus]: PrometheusLogoIcon, [WorkbenchToolType.Tempo]: TempoLogoIcon, [WorkbenchToolType.Http]: ToolsIcon, diff --git a/js/console/src/components/workbenches/workbench/job/WorkbenchJobActivities.tsx b/js/console/src/components/workbenches/workbench/job/WorkbenchJobActivities.tsx index 6d7c9bae22..b28ce88ec7 100644 --- a/js/console/src/components/workbenches/workbench/job/WorkbenchJobActivities.tsx +++ b/js/console/src/components/workbenches/workbench/job/WorkbenchJobActivities.tsx @@ -45,7 +45,7 @@ export function WorkbenchJobActivities({ const { data, loading, error } = useWorkbenchJobActivitiesQuery({ variables: { id: jobId }, fetchPolicy: 'cache-and-network', - pollInterval: 30_000, + pollInterval: 15_000, }) const job = data?.workbenchJob @@ -60,7 +60,10 @@ export function WorkbenchJobActivities({ const [openIds, setOpenIds] = useState([]) - const { textStreamMap, jobLevelThinking } = useWorkbenchJobStreams(jobId) + const { textStreamMap, jobLevelThinking } = useWorkbenchJobStreams( + jobId, + !!data + ) const userPromptIndices = useMemo(() => { const indices = [0] // 0 is initial user prompt in topContent diff --git a/js/console/src/components/workbenches/workbench/job/useWorkbenchJobStreams.tsx b/js/console/src/components/workbenches/workbench/job/useWorkbenchJobStreams.tsx index 37342af25b..dafe1c9805 100644 --- a/js/console/src/components/workbenches/workbench/job/useWorkbenchJobStreams.tsx +++ b/js/console/src/components/workbenches/workbench/job/useWorkbenchJobStreams.tsx @@ -35,7 +35,10 @@ export type WorkbenchJobLevelThinkingItem = WorkbenchJobProgressFragment & { } // only returns a map of the ephemeral text streams, others subs are added to Apollo cache -export function useWorkbenchJobStreams(jobId: Nullable) { +export function useWorkbenchJobStreams( + jobId: Nullable, + activityQueryLoaded: boolean +) { const client = useApolloClient() const [textStreamMap, setTextStreamMap] = useState( {} @@ -94,7 +97,7 @@ export function useWorkbenchJobStreams(jobId: Nullable) { }) useWorkbenchJobActivityDeltaSubscription({ variables: { jobId: jobId ?? '' }, - skip: !jobId, + skip: !jobId || !activityQueryLoaded, ignoreResults: true, onData: ({ data: { data } }) => { const activityDelta = data?.workbenchJobActivityDelta diff --git a/js/console/src/generated/graphql.ts b/js/console/src/generated/graphql.ts index 628f6308b7..dce764370d 100644 --- a/js/console/src/generated/graphql.ts +++ b/js/console/src/generated/graphql.ts @@ -1790,6 +1790,8 @@ export type BedrockAiAttributes = { deployments?: InputMaybe; /** Bedrock model or inference profile for embeddings. Same ID formats as modelId. */ embeddingModel?: InputMaybe; + /** AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. */ + endpoint?: InputMaybe; /** AWS Bedrock model or inference profile identifier. Use a foundation model ID (e.g. anthropic.claude-3-5-sonnet-20241022-v2:0) or a regional inference profile ID with three dot-separated segments (e.g. us.anthropic.claude-3-5-sonnet-20241022-v2:0, global.anthropic.claude-haiku-4-5-20251001-v1:0). Nexus registers the bare model ID for routing and auto-maps 3-part profile IDs to Bifrost aliases. */ modelId?: InputMaybe; /** Additional Bedrock model or inference profile IDs exposed through the Nexus OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. */ @@ -1809,6 +1811,8 @@ export type BedrockAiSettings = { deployments?: Maybe; /** Bedrock model or inference profile for embeddings. Same ID formats as modelId. */ embeddingModel?: Maybe; + /** AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. */ + endpoint?: Maybe; /** AWS Bedrock model or inference profile identifier. Use a foundation model ID (e.g. anthropic.claude-3-5-sonnet-20241022-v2:0) or a regional inference profile ID with three dot-separated segments (e.g. us.anthropic.claude-3-5-sonnet-20241022-v2:0, global.anthropic.claude-haiku-4-5-20251001-v1:0). Nexus registers the bare model ID for routing and auto-maps 3-part profile IDs to Bifrost aliases. Omit for Plural defaults. */ modelId?: Maybe; /** Additional Bedrock model or inference profile IDs exposed through the Nexus OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. */ @@ -1819,6 +1823,11 @@ export type BedrockAiSettings = { toolModelId?: Maybe; }; +export enum BedrockEndpoint { + Mantle = 'MANTLE', + Runtime = 'RUNTIME' +} + export type BindingAttributes = { groupId?: InputMaybe; id?: InputMaybe; @@ -15003,6 +15012,11 @@ export enum SortDirection { Desc = 'DESC' } +export enum SplunkTokenType { + Bearer = 'BEARER', + Splunk = 'SPLUNK' +} + export type StackAttributes = { /** user id to use for default Plural authentication in this stack */ actorId?: InputMaybe; @@ -18218,6 +18232,8 @@ export type WorkbenchToolConfiguration = { teams?: Maybe; /** tempo connection (no secrets) */ tempo?: Maybe; + /** victoria logs connection (no secrets) */ + victoriaLogs?: Maybe; }; export type WorkbenchToolConfigurationAttributes = { @@ -18277,6 +18293,8 @@ export type WorkbenchToolConfigurationAttributes = { teams?: InputMaybe; /** tempo connection (traces) */ tempo?: InputMaybe; + /** victoria logs connection (logs) */ + victoriaLogs?: InputMaybe; }; export type WorkbenchToolConnection = { @@ -18649,6 +18667,8 @@ export type WorkbenchToolSlackConnectionAttributes = { export type WorkbenchToolSplunkConnection = { __typename?: 'WorkbenchToolSplunkConnection'; + /** authorization realm for token authentication */ + tokenType?: Maybe; /** splunk base url */ url?: Maybe; /** basic auth username */ @@ -18658,8 +18678,10 @@ export type WorkbenchToolSplunkConnection = { export type WorkbenchToolSplunkConnectionAttributes = { /** basic auth password */ password?: InputMaybe; - /** bearer token */ + /** splunk authentication token */ token?: InputMaybe; + /** authorization realm for token authentication */ + tokenType?: InputMaybe; /** splunk base url */ url: Scalars['String']['input']; /** basic auth username */ @@ -18736,9 +18758,37 @@ export enum WorkbenchToolType { Slack = 'SLACK', Splunk = 'SPLUNK', Teams = 'TEAMS', - Tempo = 'TEMPO' + Tempo = 'TEMPO', + VictoriaLogs = 'VICTORIA_LOGS' } +export type WorkbenchToolVictoriaLogsConnection = { + __typename?: 'WorkbenchToolVictoriaLogsConnection'; + /** optional AccountID tenant header */ + accountId?: Maybe; + /** optional ProjectID tenant header */ + projectId?: Maybe; + /** victoria logs base url */ + url?: Maybe; + /** basic auth username */ + username?: Maybe; +}; + +export type WorkbenchToolVictoriaLogsConnectionAttributes = { + /** optional AccountID tenant header */ + accountId?: InputMaybe; + /** basic auth password */ + password?: InputMaybe; + /** optional ProjectID tenant header */ + projectId?: InputMaybe; + /** bearer token or api key */ + token?: InputMaybe; + /** victoria logs base url */ + url: Scalars['String']['input']; + /** basic auth username */ + username?: InputMaybe; +}; + export type WorkbenchUsageTimeseries = { __typename?: 'WorkbenchUsageTimeseries'; /** number of input tokens consumed during this interval */ @@ -20316,9 +20366,9 @@ export type HttpConnectionFragment = { __typename?: 'HttpConnection', host: stri export type SmtpSettingsFragment = { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean }; -export type AiSettingsFragment = { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | null } | null }; +export type AiSettingsFragment = { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, endpoint?: BedrockEndpoint | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | null } | null }; -export type DeploymentSettingsFragment = { __typename?: 'DeploymentSettings', id: string, name: string, enabled: boolean, selfManaged?: boolean | null, insertedAt?: string | null, updatedAt?: string | null, onboarded?: boolean | null, agentHelmValues?: string | null, agentHelmValuesTemplateable?: boolean | null, latestK8sVsn: string, logging?: { __typename?: 'LoggingSettings', enabled?: boolean | null, driver?: LogDriver | null } | null, lokiConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, prometheusConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, artifactRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, deployerRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, createBindings?: 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, smtp?: { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean } | null, ai?: { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | 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, gitBindings?: 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 DeploymentSettingsFragment = { __typename?: 'DeploymentSettings', id: string, name: string, enabled: boolean, selfManaged?: boolean | null, insertedAt?: string | null, updatedAt?: string | null, onboarded?: boolean | null, agentHelmValues?: string | null, agentHelmValuesTemplateable?: boolean | null, latestK8sVsn: string, logging?: { __typename?: 'LoggingSettings', enabled?: boolean | null, driver?: LogDriver | null } | null, lokiConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, prometheusConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, artifactRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, deployerRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, createBindings?: 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, smtp?: { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean } | null, ai?: { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, endpoint?: BedrockEndpoint | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | 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, gitBindings?: 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 ObservabilityProviderFragment = { __typename?: 'ObservabilityProvider', id: string, name: string, type: ObservabilityProviderType, insertedAt?: string | null, updatedAt?: string | null }; @@ -20327,7 +20377,7 @@ export type ObservabilityWebhookFragment = { __typename?: 'ObservabilityWebhook' export type DeploymentSettingsQueryVariables = Exact<{ [key: string]: never; }>; -export type DeploymentSettingsQuery = { __typename?: 'RootQueryType', deploymentSettings?: { __typename?: 'DeploymentSettings', id: string, name: string, enabled: boolean, selfManaged?: boolean | null, insertedAt?: string | null, updatedAt?: string | null, onboarded?: boolean | null, agentHelmValues?: string | null, agentHelmValuesTemplateable?: boolean | null, latestK8sVsn: string, logging?: { __typename?: 'LoggingSettings', enabled?: boolean | null, driver?: LogDriver | null } | null, lokiConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, prometheusConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, artifactRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, deployerRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, createBindings?: 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, smtp?: { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean } | null, ai?: { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | 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, gitBindings?: 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, availableModels?: Array<{ __typename?: 'AvailableModel', provider: AiProvider, model: string } | null> | null, defaultModels?: Array<{ __typename?: 'ModelDefault', provider: AiProvider, model?: string | null, toolModel?: string | null, embeddingModel?: string | null } | null> | null }; +export type DeploymentSettingsQuery = { __typename?: 'RootQueryType', deploymentSettings?: { __typename?: 'DeploymentSettings', id: string, name: string, enabled: boolean, selfManaged?: boolean | null, insertedAt?: string | null, updatedAt?: string | null, onboarded?: boolean | null, agentHelmValues?: string | null, agentHelmValuesTemplateable?: boolean | null, latestK8sVsn: string, logging?: { __typename?: 'LoggingSettings', enabled?: boolean | null, driver?: LogDriver | null } | null, lokiConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, prometheusConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, artifactRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, deployerRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, createBindings?: 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, smtp?: { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean } | null, ai?: { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, endpoint?: BedrockEndpoint | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | 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, gitBindings?: 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, availableModels?: Array<{ __typename?: 'AvailableModel', provider: AiProvider, model: string } | null> | null, defaultModels?: Array<{ __typename?: 'ModelDefault', provider: AiProvider, model?: string | null, toolModel?: string | null, embeddingModel?: string | null } | null> | null }; export type ObservabilityProvidersQueryVariables = Exact<{ first?: InputMaybe; @@ -20358,7 +20408,7 @@ export type UpdateDeploymentSettingsMutationVariables = Exact<{ }>; -export type UpdateDeploymentSettingsMutation = { __typename?: 'RootMutationType', updateDeploymentSettings?: { __typename?: 'DeploymentSettings', id: string, name: string, enabled: boolean, selfManaged?: boolean | null, insertedAt?: string | null, updatedAt?: string | null, onboarded?: boolean | null, agentHelmValues?: string | null, agentHelmValuesTemplateable?: boolean | null, latestK8sVsn: string, logging?: { __typename?: 'LoggingSettings', enabled?: boolean | null, driver?: LogDriver | null } | null, lokiConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, prometheusConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, artifactRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, deployerRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, createBindings?: 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, smtp?: { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean } | null, ai?: { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | 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, gitBindings?: 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 UpdateDeploymentSettingsMutation = { __typename?: 'RootMutationType', updateDeploymentSettings?: { __typename?: 'DeploymentSettings', id: string, name: string, enabled: boolean, selfManaged?: boolean | null, insertedAt?: string | null, updatedAt?: string | null, onboarded?: boolean | null, agentHelmValues?: string | null, agentHelmValuesTemplateable?: boolean | null, latestK8sVsn: string, logging?: { __typename?: 'LoggingSettings', enabled?: boolean | null, driver?: LogDriver | null } | null, lokiConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, prometheusConnection?: { __typename?: 'HttpConnection', host: string, user?: string | null } | null, artifactRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, deployerRepository?: { __typename?: 'GitRepository', id: string, url: string, health?: GitHealth | null, authMethod?: AuthMethod | null, editable?: boolean | null, error?: string | null, insertedAt?: string | null, pulledAt?: string | null, updatedAt?: string | null, urlFormat?: string | null, httpsPath?: string | null, recurseSubmodules?: boolean | null } | null, createBindings?: 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, smtp?: { __typename?: 'SmtpSettings', server: string, port: number, sender: string, user: string, ssl: boolean } | null, ai?: { __typename?: 'AiSettings', enabled?: boolean | null, toolsEnabled?: boolean | null, provider?: AiProvider | null, toolProvider?: AiProvider | null, embeddingProvider?: AiProvider | null, logAnalysis?: boolean | null, anthropic?: { __typename?: 'AnthropicSettings', model?: string | null, toolModel?: string | null } | null, openai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, openaiCompatible?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, xai?: { __typename?: 'OpenaiSettings', baseUrl?: string | null, model?: string | null, toolModel?: string | null, embeddingModel?: string | null, method?: OpenAiMethod | null } | null, azure?: { __typename?: 'AzureOpenaiSettings', apiVersion?: string | null, endpoint: string, model?: string | null, embeddingModel?: string | null, toolModel?: string | null } | null, ollama?: { __typename?: 'OllamaSettings', model: string, toolModel?: string | null, url: string } | null, vertex?: { __typename?: 'VertexAiSettings', model?: string | null, embeddingModel?: string | null, toolModel?: string | null, project: string, location: string, endpoint?: string | null } | null, bedrock?: { __typename?: 'BedrockAiSettings', modelId?: string | null, toolModelId?: string | null, embeddingModel?: string | null, endpoint?: BedrockEndpoint | null, accessKeyId?: string | null, region?: string | null } | null, analysisRates?: { __typename?: 'AiAnalysisRates', fast?: number | null, slow?: number | null } | null, vectorStore?: { __typename?: 'VectorStoreSettings', enabled?: boolean | null, store?: VectorStore | 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, gitBindings?: 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 UpsertObservabilityProviderMutationVariables = Exact<{ attributes: ObservabilityProviderAttributes; @@ -22636,11 +22686,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, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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 WorkbenchFragment = { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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, 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, 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 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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, tool?: { __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, 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 }; @@ -22754,7 +22804,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, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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 WorkbenchQuery = { __typename?: 'RootQueryType', workbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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 }; @@ -23068,14 +23118,14 @@ export type WorkbenchToolQueryVariables = Exact<{ }>; -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 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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 CreateWorkbenchMutation = { __typename?: 'RootMutationType', createWorkbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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']; @@ -23083,7 +23133,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, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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 UpdateWorkbenchMutation = { __typename?: 'RootMutationType', updateWorkbench?: { __typename?: 'Workbench', systemPrompt?: string | null, id: string, name: string, description?: string | null, agentRuntime?: { __typename?: 'AgentRuntime', id: string, name: string, allowedRepositories?: Array | null, 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, verification?: boolean | null, model?: { __typename?: 'WorkbenchJobModel', provider?: AiProvider | null, model?: string | null } | null, coding?: { __typename?: 'WorkbenchJobCodingModes', approval?: boolean | null, babysit?: boolean | null, review?: boolean | null } | null, budget?: { __typename?: 'WorkbenchJobBudget', cost?: number | null, tokens?: number | null } | null, kubernetes?: { __typename?: 'WorkbenchJobKubernetesModes', update?: boolean | null, delete?: boolean | null, exec?: boolean | null, drain?: boolean | null, excludeNamespaces?: Array | null, requireNamespaces?: Array | null } | null } | null, budget?: { __typename?: 'WorkbenchBudget', enabled?: boolean | null, maximum?: number | null, minFree?: number | null, unit?: WorkbenchBudgetUnit | null, last?: number | null, lastUpdated?: string | 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, workbenchKnowledge?: { __typename?: 'WorkbenchKnowledgeConnection', edges?: Array<{ __typename?: 'WorkbenchKnowledgeEdge', node?: { __typename?: 'WorkbenchKnowledge', id: string, name?: string | null, description?: string | null, knowledge?: string | null, labels?: Array | null, usages?: number | null, lastUsedAt?: string | 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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 UpdateWorkbenchKnowledgeMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -23143,7 +23193,7 @@ export type CreateWorkbenchToolMutationVariables = Exact<{ }>; -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 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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']; @@ -23151,7 +23201,7 @@ export type UpdateWorkbenchToolMutationVariables = Exact<{ }>; -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 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, victoriaLogs?: { __typename?: 'WorkbenchToolVictoriaLogsConnection', url?: string | null, username?: string | null, accountId?: string | null, projectId?: 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, tokenType?: SplunkTokenType | 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']; @@ -25574,6 +25624,7 @@ export const AiSettingsFragmentDoc = gql` modelId toolModelId embeddingModel + endpoint accessKeyId region } @@ -28620,6 +28671,12 @@ export const WorkbenchToolFragmentDoc = gql` username tenantId } + victoriaLogs { + url + username + accountId + projectId + } prometheus { url username @@ -28656,6 +28713,7 @@ export const WorkbenchToolFragmentDoc = gql` } splunk { url + tokenType username } cloudwatch { @@ -48028,7 +48086,7 @@ export const WorkbenchJobActivitiesDocument = gql` grade } } - activities(first: 100) { + activities(first: 1000) { edges { node { ...WorkbenchJobActivity diff --git a/js/console/src/generated/persisted-queries/client.json b/js/console/src/generated/persisted-queries/client.json index 2139abb470..a2cc55872d 100644 --- a/js/console/src/generated/persisted-queries/client.json +++ b/js/console/src/generated/persisted-queries/client.json @@ -752,10 +752,10 @@ "name": "SyncGlobalService", "body": "mutation SyncGlobalService($id: ID!) {\n syncGlobalService(id: $id) {\n ...GlobalService\n __typename\n }\n}\n\nfragment GlobalService on GlobalService {\n id\n distro\n name\n project {\n ...ProjectTiny\n __typename\n }\n cascade {\n delete\n detach\n __typename\n }\n provider {\n id\n name\n cloud\n namespace\n __typename\n }\n reparent\n service {\n ...ServiceDeploymentsRow\n __typename\n }\n tags {\n name\n value\n __typename\n }\n template {\n ...ServiceTemplateWithoutConfiguration\n __typename\n }\n parent {\n id\n name\n __typename\n }\n insertedAt\n updatedAt\n mgmt\n __typename\n}\n\nfragment ProjectTiny on Project {\n id\n name\n default\n description\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 group\n version\n kind\n name\n namespace\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n group\n version\n kind\n name\n namespace\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 ServiceTemplateWithoutConfiguration on ServiceTemplate {\n contexts\n dependencies {\n id\n name\n status\n __typename\n }\n git {\n folder\n ref\n __typename\n }\n helm {\n chart\n git {\n folder\n ref\n __typename\n }\n ignoreCrds\n ignoreHooks\n release\n repository {\n name\n namespace\n __typename\n }\n set {\n name\n value\n __typename\n }\n url\n values\n valuesFiles\n version\n __typename\n }\n kustomize {\n path\n enableHelm\n __typename\n }\n name\n namespace\n repository {\n ...GitRepository\n __typename\n }\n repositoryId\n syncConfig {\n createNamespace\n enforceNamespace\n namespaceMetadata {\n annotations\n labels\n __typename\n }\n __typename\n }\n templated\n __typename\n}\n\nfragment GitRepository on GitRepository {\n id\n url\n health\n authMethod\n editable\n error\n insertedAt\n pulledAt\n updatedAt\n urlFormat\n httpsPath\n recurseSubmodules\n __typename\n}" }, - "sha256:a898a5abe6572fbb64a6952aa3bc4a037e2690c7e2a89693afc97cf10b2aab34": { + "sha256:cfdeeca184752cef9c97961acfd6563c173699c0ea67c7407f4c751541415809": { "type": "query", "name": "DeploymentSettings", - "body": "query DeploymentSettings {\n deploymentSettings {\n ...DeploymentSettings\n __typename\n }\n availableModels {\n provider\n model\n __typename\n }\n defaultModels {\n provider\n model\n toolModel\n embeddingModel\n __typename\n }\n}\n\nfragment DeploymentSettings on DeploymentSettings {\n id\n name\n enabled\n selfManaged\n insertedAt\n updatedAt\n onboarded\n agentHelmValues\n agentHelmValuesTemplateable\n logging {\n enabled\n driver\n __typename\n }\n latestK8sVsn\n lokiConnection {\n ...HttpConnection\n __typename\n }\n prometheusConnection {\n ...HttpConnection\n __typename\n }\n artifactRepository {\n ...GitRepository\n __typename\n }\n deployerRepository {\n ...GitRepository\n __typename\n }\n createBindings {\n ...PolicyBinding\n __typename\n }\n smtp {\n ...SmtpSettings\n __typename\n }\n ai {\n ...AiSettings\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n gitBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment HttpConnection on HttpConnection {\n host\n user\n __typename\n}\n\nfragment GitRepository on GitRepository {\n id\n url\n health\n authMethod\n editable\n error\n insertedAt\n pulledAt\n updatedAt\n urlFormat\n httpsPath\n recurseSubmodules\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 SmtpSettings on SmtpSettings {\n server\n port\n sender\n user\n ssl\n __typename\n}\n\nfragment AiSettings on AiSettings {\n anthropic {\n model\n toolModel\n __typename\n }\n openai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n openaiCompatible {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n xai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n azure {\n apiVersion\n endpoint\n model\n embeddingModel\n toolModel\n __typename\n }\n ollama {\n model\n toolModel\n url\n __typename\n }\n vertex {\n model\n embeddingModel\n toolModel\n project\n location\n endpoint\n __typename\n }\n bedrock {\n modelId\n toolModelId\n embeddingModel\n accessKeyId\n region\n __typename\n }\n enabled\n toolsEnabled\n provider\n toolProvider\n embeddingProvider\n analysisRates {\n fast\n slow\n __typename\n }\n logAnalysis\n vectorStore {\n enabled\n store\n __typename\n }\n __typename\n}" + "body": "query DeploymentSettings {\n deploymentSettings {\n ...DeploymentSettings\n __typename\n }\n availableModels {\n provider\n model\n __typename\n }\n defaultModels {\n provider\n model\n toolModel\n embeddingModel\n __typename\n }\n}\n\nfragment DeploymentSettings on DeploymentSettings {\n id\n name\n enabled\n selfManaged\n insertedAt\n updatedAt\n onboarded\n agentHelmValues\n agentHelmValuesTemplateable\n logging {\n enabled\n driver\n __typename\n }\n latestK8sVsn\n lokiConnection {\n ...HttpConnection\n __typename\n }\n prometheusConnection {\n ...HttpConnection\n __typename\n }\n artifactRepository {\n ...GitRepository\n __typename\n }\n deployerRepository {\n ...GitRepository\n __typename\n }\n createBindings {\n ...PolicyBinding\n __typename\n }\n smtp {\n ...SmtpSettings\n __typename\n }\n ai {\n ...AiSettings\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n gitBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment HttpConnection on HttpConnection {\n host\n user\n __typename\n}\n\nfragment GitRepository on GitRepository {\n id\n url\n health\n authMethod\n editable\n error\n insertedAt\n pulledAt\n updatedAt\n urlFormat\n httpsPath\n recurseSubmodules\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 SmtpSettings on SmtpSettings {\n server\n port\n sender\n user\n ssl\n __typename\n}\n\nfragment AiSettings on AiSettings {\n anthropic {\n model\n toolModel\n __typename\n }\n openai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n openaiCompatible {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n xai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n azure {\n apiVersion\n endpoint\n model\n embeddingModel\n toolModel\n __typename\n }\n ollama {\n model\n toolModel\n url\n __typename\n }\n vertex {\n model\n embeddingModel\n toolModel\n project\n location\n endpoint\n __typename\n }\n bedrock {\n modelId\n toolModelId\n embeddingModel\n endpoint\n accessKeyId\n region\n __typename\n }\n enabled\n toolsEnabled\n provider\n toolProvider\n embeddingProvider\n analysisRates {\n fast\n slow\n __typename\n }\n logAnalysis\n vectorStore {\n enabled\n store\n __typename\n }\n __typename\n}" }, "sha256:05c1879e0a8b58728d04b81556cc619931e23e2efacd14b727d6dbfc0f824db1": { "type": "query", @@ -772,10 +772,10 @@ "name": "ObservabilityWebhook", "body": "query ObservabilityWebhook($id: ID, $name: String) {\n observabilityWebhook(id: $id, name: $name) {\n ...ObservabilityWebhook\n __typename\n }\n}\n\nfragment ObservabilityWebhook on ObservabilityWebhook {\n id\n name\n type\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:13a3bc3cc1edb7def568ccd0d9b63c7848d1ef219730efcfdf711c215322b625": { + "sha256:97f8b9a3e68a01dcb05debd0ec5f2d8d24ea722062a950920567f615a6e63775": { "type": "mutation", "name": "UpdateDeploymentSettings", - "body": "mutation UpdateDeploymentSettings($attributes: DeploymentSettingsAttributes!) {\n updateDeploymentSettings(attributes: $attributes) {\n ...DeploymentSettings\n __typename\n }\n}\n\nfragment DeploymentSettings on DeploymentSettings {\n id\n name\n enabled\n selfManaged\n insertedAt\n updatedAt\n onboarded\n agentHelmValues\n agentHelmValuesTemplateable\n logging {\n enabled\n driver\n __typename\n }\n latestK8sVsn\n lokiConnection {\n ...HttpConnection\n __typename\n }\n prometheusConnection {\n ...HttpConnection\n __typename\n }\n artifactRepository {\n ...GitRepository\n __typename\n }\n deployerRepository {\n ...GitRepository\n __typename\n }\n createBindings {\n ...PolicyBinding\n __typename\n }\n smtp {\n ...SmtpSettings\n __typename\n }\n ai {\n ...AiSettings\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n gitBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment HttpConnection on HttpConnection {\n host\n user\n __typename\n}\n\nfragment GitRepository on GitRepository {\n id\n url\n health\n authMethod\n editable\n error\n insertedAt\n pulledAt\n updatedAt\n urlFormat\n httpsPath\n recurseSubmodules\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 SmtpSettings on SmtpSettings {\n server\n port\n sender\n user\n ssl\n __typename\n}\n\nfragment AiSettings on AiSettings {\n anthropic {\n model\n toolModel\n __typename\n }\n openai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n openaiCompatible {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n xai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n azure {\n apiVersion\n endpoint\n model\n embeddingModel\n toolModel\n __typename\n }\n ollama {\n model\n toolModel\n url\n __typename\n }\n vertex {\n model\n embeddingModel\n toolModel\n project\n location\n endpoint\n __typename\n }\n bedrock {\n modelId\n toolModelId\n embeddingModel\n accessKeyId\n region\n __typename\n }\n enabled\n toolsEnabled\n provider\n toolProvider\n embeddingProvider\n analysisRates {\n fast\n slow\n __typename\n }\n logAnalysis\n vectorStore {\n enabled\n store\n __typename\n }\n __typename\n}" + "body": "mutation UpdateDeploymentSettings($attributes: DeploymentSettingsAttributes!) {\n updateDeploymentSettings(attributes: $attributes) {\n ...DeploymentSettings\n __typename\n }\n}\n\nfragment DeploymentSettings on DeploymentSettings {\n id\n name\n enabled\n selfManaged\n insertedAt\n updatedAt\n onboarded\n agentHelmValues\n agentHelmValuesTemplateable\n logging {\n enabled\n driver\n __typename\n }\n latestK8sVsn\n lokiConnection {\n ...HttpConnection\n __typename\n }\n prometheusConnection {\n ...HttpConnection\n __typename\n }\n artifactRepository {\n ...GitRepository\n __typename\n }\n deployerRepository {\n ...GitRepository\n __typename\n }\n createBindings {\n ...PolicyBinding\n __typename\n }\n smtp {\n ...SmtpSettings\n __typename\n }\n ai {\n ...AiSettings\n __typename\n }\n readBindings {\n ...PolicyBinding\n __typename\n }\n writeBindings {\n ...PolicyBinding\n __typename\n }\n gitBindings {\n ...PolicyBinding\n __typename\n }\n __typename\n}\n\nfragment HttpConnection on HttpConnection {\n host\n user\n __typename\n}\n\nfragment GitRepository on GitRepository {\n id\n url\n health\n authMethod\n editable\n error\n insertedAt\n pulledAt\n updatedAt\n urlFormat\n httpsPath\n recurseSubmodules\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 SmtpSettings on SmtpSettings {\n server\n port\n sender\n user\n ssl\n __typename\n}\n\nfragment AiSettings on AiSettings {\n anthropic {\n model\n toolModel\n __typename\n }\n openai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n openaiCompatible {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n xai {\n baseUrl\n model\n toolModel\n embeddingModel\n method\n __typename\n }\n azure {\n apiVersion\n endpoint\n model\n embeddingModel\n toolModel\n __typename\n }\n ollama {\n model\n toolModel\n url\n __typename\n }\n vertex {\n model\n embeddingModel\n toolModel\n project\n location\n endpoint\n __typename\n }\n bedrock {\n modelId\n toolModelId\n embeddingModel\n endpoint\n accessKeyId\n region\n __typename\n }\n enabled\n toolsEnabled\n provider\n toolProvider\n embeddingProvider\n analysisRates {\n fast\n slow\n __typename\n }\n logAnalysis\n vectorStore {\n enabled\n store\n __typename\n }\n __typename\n}" }, "sha256:4ec33a10dc37fa1526249391223660af05140af4b55aa301f57c40644ad32b39": { "type": "mutation", @@ -1972,10 +1972,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 group\n version\n kind\n name\n namespace\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n service {\n id\n name\n cluster {\n ...ClusterMinimal\n __typename\n }\n __typename\n }\n serviceComponent {\n id\n group\n version\n kind\n name\n namespace\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:bc3bb1b6ca34d24353e21617d56ff59a910313e96158a1fc23f5853545c0bcef": { + "sha256:3410568fb29e4a607727eb000b477147ef83441dbf0e4578f90a3bc1c0e1641f": { "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 allowedRepositories\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 ...WorkbenchJobModesFields\n __typename\n }\n budget {\n enabled\n maximum\n minFree\n unit\n last\n lastUpdated\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 workbenchKnowledge(first: 50) {\n edges {\n node {\n id\n name\n description\n knowledge\n labels\n usages\n lastUsedAt\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 WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\n __typename\n }\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}" + "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 allowedRepositories\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 ...WorkbenchJobModesFields\n __typename\n }\n budget {\n enabled\n maximum\n minFree\n unit\n last\n lastUpdated\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 workbenchKnowledge(first: 50) {\n edges {\n node {\n id\n name\n description\n knowledge\n labels\n usages\n lastUsedAt\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 WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\n __typename\n }\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 victoriaLogs {\n url\n username\n accountId\n projectId\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 tokenType\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", @@ -2112,10 +2112,10 @@ "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:3efbdb7f62a58037ec58f5159b01e779ebcbe4232890f0c791e7e85c6c9fae35": { + "sha256:57aff4e3a005a3cc4136f7a8baa3fc514c0af9156129d93f7f9dcc852907b5b0": { "type": "query", "name": "WorkbenchJobActivities", - "body": "query WorkbenchJobActivities($id: ID!) {\n workbenchJob(id: $id) {\n id\n status\n prompt\n insertedAt\n modes {\n ...WorkbenchJobModesFields\n __typename\n }\n workbench {\n id\n agentRuntime {\n allowedRepositories\n __typename\n }\n configuration {\n coding {\n repositories\n __typename\n }\n __typename\n }\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 queuedPrompts(first: 100) {\n edges {\n node {\n ...QueuedPromptTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\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 explanation\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 kubeDrain {\n handle\n node\n explanation\n __typename\n }\n kubeExec {\n handle\n command\n namespace\n pod\n container\n explanation\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 QueuedPromptTiny on QueuedPrompt {\n id\n prompt\n dequeableAt\n insertedAt\n user {\n id\n name\n __typename\n }\n __typename\n}" + "body": "query WorkbenchJobActivities($id: ID!) {\n workbenchJob(id: $id) {\n id\n status\n prompt\n insertedAt\n modes {\n ...WorkbenchJobModesFields\n __typename\n }\n workbench {\n id\n agentRuntime {\n allowedRepositories\n __typename\n }\n configuration {\n coding {\n repositories\n __typename\n }\n __typename\n }\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: 1000) {\n edges {\n node {\n ...WorkbenchJobActivity\n __typename\n }\n __typename\n }\n __typename\n }\n queuedPrompts(first: 100) {\n edges {\n node {\n ...QueuedPromptTiny\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\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 explanation\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 kubeDrain {\n handle\n node\n explanation\n __typename\n }\n kubeExec {\n handle\n command\n namespace\n pod\n container\n explanation\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 QueuedPromptTiny on QueuedPrompt {\n id\n prompt\n dequeableAt\n insertedAt\n user {\n id\n name\n __typename\n }\n __typename\n}" }, "sha256:361b6e8ad6e7d418ea34d8fc660c501c016771a0dedeeeb8cad5c3441fccca2d": { "type": "query", @@ -2162,20 +2162,20 @@ "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 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:53680cf7767fe323b55d30ed33f9914ad4694bc246edb87d7e8d58093de140c0": { + "sha256:6bd0d3a4bffda6105045ac6f39d6f7da7163ebcedaaca9e599df1a2754973cc7": { "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 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}" + "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 victoriaLogs {\n url\n username\n accountId\n projectId\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 tokenType\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:f9a0c73f54ab265abd3c21d2dae4c2766f06275b0942f1985a39a736d596fbcc": { + "sha256:2714b78db9212b8236f8a5d8b5c83873f359071512e7420e148f3b45aa843a72": { "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 allowedRepositories\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 ...WorkbenchJobModesFields\n __typename\n }\n budget {\n enabled\n maximum\n minFree\n unit\n last\n lastUpdated\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 workbenchKnowledge(first: 50) {\n edges {\n node {\n id\n name\n description\n knowledge\n labels\n usages\n lastUsedAt\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 WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\n __typename\n }\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}" + "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 allowedRepositories\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 ...WorkbenchJobModesFields\n __typename\n }\n budget {\n enabled\n maximum\n minFree\n unit\n last\n lastUpdated\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 workbenchKnowledge(first: 50) {\n edges {\n node {\n id\n name\n description\n knowledge\n labels\n usages\n lastUsedAt\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 WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\n __typename\n }\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 victoriaLogs {\n url\n username\n accountId\n projectId\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 tokenType\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:be197bbe89bbd2d510ac939341d5cb95925d8cfcf7f1a0be94e67d057dcd9997": { + "sha256:73affa5bbbce8009602de3c0af465f7dd5278508aeb825136350e9bd10b4f79e": { "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 allowedRepositories\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 ...WorkbenchJobModesFields\n __typename\n }\n budget {\n enabled\n maximum\n minFree\n unit\n last\n lastUpdated\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 workbenchKnowledge(first: 50) {\n edges {\n node {\n id\n name\n description\n knowledge\n labels\n usages\n lastUsedAt\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 WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\n __typename\n }\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}" + "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 allowedRepositories\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 ...WorkbenchJobModesFields\n __typename\n }\n budget {\n enabled\n maximum\n minFree\n unit\n last\n lastUpdated\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 workbenchKnowledge(first: 50) {\n edges {\n node {\n id\n name\n description\n knowledge\n labels\n usages\n lastUsedAt\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 WorkbenchJobModesFields on WorkbenchJobModes {\n plan\n verification\n model {\n provider\n model\n __typename\n }\n coding {\n approval\n babysit\n review\n __typename\n }\n budget {\n cost\n tokens\n __typename\n }\n kubernetes {\n update\n delete\n exec\n drain\n excludeNamespaces\n requireNamespaces\n __typename\n }\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 victoriaLogs {\n url\n username\n accountId\n projectId\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 tokenType\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:9d48f13216f613d1a0265a4c8453d9ac1dfe8a3f75e1875a63d591c76afee930": { "type": "mutation", @@ -2212,15 +2212,15 @@ "name": "DeleteWorkbench", "body": "mutation DeleteWorkbench($id: ID!) {\n deleteWorkbench(id: $id) {\n id\n __typename\n }\n}" }, - "sha256:80ab043927385b3aad0e630266cca291616e58e827f9e64ae569832bcb8be2ac": { + "sha256:6efc5f77e9163da9648bf6fd177e58d17384f377beaf02c42b410559a22601e1": { "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 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}" + "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 victoriaLogs {\n url\n username\n accountId\n projectId\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 tokenType\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:a172236ffe1b891da22ca7ccf0645567d5d78b0d8c501d46d2e915d30b9aa69e": { + "sha256:8f2b24e0bc991b7f6a86067090cb53fb0f888f90e5935bc0f53095d1808ad6a9": { "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 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}" + "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 victoriaLogs {\n url\n username\n accountId\n projectId\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 tokenType\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", diff --git a/js/console/src/graph/cd/globalSettings.graphql b/js/console/src/graph/cd/globalSettings.graphql index 42c70746e2..73c831e58e 100644 --- a/js/console/src/graph/cd/globalSettings.graphql +++ b/js/console/src/graph/cd/globalSettings.graphql @@ -61,6 +61,7 @@ fragment AiSettings on AiSettings { modelId toolModelId embeddingModel + endpoint accessKeyId region } diff --git a/js/console/src/graph/workbench.graphql b/js/console/src/graph/workbench.graphql index bfcfe78427..e6962f4d0a 100644 --- a/js/console/src/graph/workbench.graphql +++ b/js/console/src/graph/workbench.graphql @@ -228,6 +228,12 @@ fragment WorkbenchTool on WorkbenchTool { username tenantId } + victoriaLogs { + url + username + accountId + projectId + } prometheus { url username @@ -264,6 +270,7 @@ fragment WorkbenchTool on WorkbenchTool { } splunk { url + tokenType username } cloudwatch { @@ -1311,7 +1318,7 @@ query WorkbenchJobActivities($id: ID!) { grade } } - activities(first: 100) { + activities(first: 1000) { edges { node { ...WorkbenchJobActivity diff --git a/js/console/src/helpers/client.ts b/js/console/src/helpers/client.ts index 04e2cd86a4..92e4b857d1 100644 --- a/js/console/src/helpers/client.ts +++ b/js/console/src/helpers/client.ts @@ -13,6 +13,7 @@ import { getMainDefinition } from '@apollo/client/utilities' import { createLink } from 'apollo-absinthe-upload-link' import { createClient } from 'graphql-ws' import { Socket as PhoenixSocket } from 'phoenix' +import { mergeConnectionsByNodeId } from 'utils/graphql' import fragments from '../generated/fragments.json' import { fetchToken } from './auth' @@ -164,6 +165,20 @@ export function buildClient( }, }, }, + WorkbenchJob: { + fields: { + // Poll responses can have been resolved before a subscription event + // arrives. Preserve activity edges added by the subscription when + // that older response is written to the cache. + activities: { + merge(existing, incoming, options) { + if (options.args?.status || options.args?.type) return incoming + + return mergeConnectionsByNodeId(existing, incoming, options) + }, + }, + }, + }, }, }), }) diff --git a/js/console/src/utils/graphql.test.ts b/js/console/src/utils/graphql.test.ts new file mode 100644 index 0000000000..3c983c6a35 --- /dev/null +++ b/js/console/src/utils/graphql.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from 'vitest' +import { mergeConnectionsByNodeId } from './graphql' + +const options = { + readField: (_field, node) => node?.id, +} + +describe('mergeConnectionsByNodeId', () => { + it('preserves subscription edges missing from a stale poll response', () => { + const existing = { + edges: [{ node: { id: 'old' } }, { node: { id: 'subscribed' } }], + pageInfo: { hasNextPage: false }, + } + const incoming = { + edges: [{ node: { id: 'old' } }], + pageInfo: { hasNextPage: true }, + } + + expect( + mergeConnectionsByNodeId(existing, incoming, options).edges.map( + (edge) => edge.node.id + ) + ).toEqual(['old', 'subscribed']) + }) + + it('prefers incoming edges when an activity is present in both', () => { + const existing = { + edges: [{ node: { id: 'activity', status: 'running' } }], + } + const incoming = { + edges: [{ node: { id: 'activity', status: 'successful' } }], + } + + expect(mergeConnectionsByNodeId(existing, incoming, options)).toEqual( + incoming + ) + }) +}) diff --git a/js/console/src/utils/graphql.ts b/js/console/src/utils/graphql.ts index 9690ad88ac..979dc47c5e 100644 --- a/js/console/src/utils/graphql.ts +++ b/js/console/src/utils/graphql.ts @@ -148,6 +148,28 @@ export function appendConnectionToEnd(prev, next, key) { } } +export function mergeConnectionsByNodeId(existing, incoming, { readField }) { + if (!existing) return incoming + if (!incoming) return existing + + const incomingEdges = incoming.edges ?? [] + const incomingIds = new Set( + incomingEdges + .map((edge) => readField('id', edge?.node)) + .filter(isNonNullable) + ) + const existingOnlyEdges = (existing.edges ?? []).filter((edge) => { + const id = readField('id', edge?.node) + + return !id || !incomingIds.has(id) + }) + + return { + ...incoming, + edges: [...incomingEdges, ...existingOnlyEdges], + } +} + export function removeConnection(prev, val, key) { return { ...prev, diff --git a/js/design-system/src/components/icons/VictoriaLogsLogoIcon.tsx b/js/design-system/src/components/icons/VictoriaLogsLogoIcon.tsx new file mode 100644 index 0000000000..a9473eb54f --- /dev/null +++ b/js/design-system/src/components/icons/VictoriaLogsLogoIcon.tsx @@ -0,0 +1,16 @@ +import createIcon from './createIcon' + +// Source: https://github.com/VictoriaMetrics/VictoriaLogs/blob/master/app/vlselect/vmui/favicon.svg +export default createIcon(({ size, color, fullColor }) => ( + + + + + +)) diff --git a/js/design-system/src/icons.ts b/js/design-system/src/icons.ts index 88007fb3a7..1824069528 100644 --- a/js/design-system/src/icons.ts +++ b/js/design-system/src/icons.ts @@ -326,6 +326,7 @@ export { default as UnknownIcon } from './components/icons/UnknownIcon' export { default as UpdatesIcon } from './components/icons/UpdatesIcon' export { default as VerifiedIcon } from './components/icons/VerifiedIcon' export { default as VertexLogoIcon } from './components/icons/VertexLogoIcon' +export { default as VictoriaLogsLogoIcon } from './components/icons/VictoriaLogsLogoIcon' export { default as VideoIcon } from './components/icons/VideoIcon' export { default as VirtualClusterIcon } from './components/icons/VirtualCluster' export { default as VSphereLogoIcon } from './components/icons/VSphereLogoIcon' diff --git a/js/documentation/pages/api-reference/kubernetes/management-api-reference.md b/js/documentation/pages/api-reference/kubernetes/management-api-reference.md index b2b9f18fb5..395def8455 100644 --- a/js/documentation/pages/api-reference/kubernetes/management-api-reference.md +++ b/js/documentation/pages/api-reference/kubernetes/management-api-reference.md @@ -388,6 +388,7 @@ _Appears in:_ | `modelId` _string_ | ModelID is the primary AWS Bedrock model or inference profile identifier.
Use a egional inference profile ID with three dot-separated segments (e.g. us.anthropic.claude-3-5-sonnet-20241022-v2:0,
global.anthropic.claude-haiku-4-5-20251001-v1:0). | | Optional: \{\}
| | `toolModelId` _string_ | ToolModelId is the Bedrock model or inference profile for tool calling. Same ID formats as modelId. | | Optional: \{\}
| | `embeddingModel` _string_ | EmbeddingModel is the Bedrock model or inference profile for embeddings. Same ID formats as modelId. | | Optional: \{\}
| +| `endpoint` _[BedrockEndpoint](#bedrockendpoint)_ | Endpoint selects the AWS Bedrock API surface. RUNTIME (the default) uses InvokeModel or
Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs. | RUNTIME | Enum: [RUNTIME MANTLE]
Optional: \{\}
| | `proxyModels` _string array_ | ProxyModels lists additional Bedrock model or inference profile IDs exposed through the Nexus
OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId. | | Optional: \{\}
| | `region` _string_ | Region is the AWS region the model is hosted in | | Required: \{\}
| | `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | TokenSecretRef is a reference to the local secret holding the token to access
the configured AI provider. | | Optional: \{\}
| @@ -6103,6 +6104,7 @@ _Appears in:_ | `opensearch` _[WorkbenchToolOpensearchConfig](#workbenchtoolopensearchconfig)_ | AWS OpenSearch connection (logs). | | Optional: \{\}
| | `prometheus` _[WorkbenchToolPrometheusConfig](#workbenchtoolprometheusconfig)_ | Prometheus connection (metrics). | | Optional: \{\}
| | `loki` _[WorkbenchToolLokiConfig](#workbenchtoollokiconfig)_ | Loki connection (logs). | | Optional: \{\}
| +| `victoriaLogs` _[WorkbenchToolVictoriaLogsConfig](#workbenchtoolvictorialogsconfig)_ | VictoriaLogs connection (logs). | | Optional: \{\}
| | `tempo` _[WorkbenchToolTempoConfig](#workbenchtooltempoconfig)_ | Tempo connection (traces). | | Optional: \{\}
| | `jaeger` _[WorkbenchToolJaegerConfig](#workbenchtooljaegerconfig)_ | Jaeger connection (traces). | | Optional: \{\}
| | `splunk` _[WorkbenchToolSplunkConfig](#workbenchtoolsplunkconfig)_ | Splunk connection (logs). | | Optional: \{\}
| @@ -6475,7 +6477,7 @@ _Appears in:_ | Field | Description | Default | Validation | | --- | --- | --- | --- | | `name` _string_ | The name of the tool (a-z, 0-9, underscores). If not set, metadata.name is used. | | Optional: \{\}
Pattern: `^[a-z0-9_]+$`
Type: string
| -| `tool` _[WorkbenchToolType](#workbenchtooltype)_ | The type of tool. | | Enum: [HTTP ELASTIC DATADOG PROMETHEUS LOKI TEMPO SENTRY MCP LINEAR ATLASSIAN SPLUNK DYNATRACE CLOUDWATCH AZURE CLOUD JAEGER EXA GITHUB SLACK TEAMS GITLAB BITBUCKET BITBUCKET_DATACENTER AZURE_DEVOPS PAGERDUTY OPENSEARCH LAMBDA CLOUD_RUN AZURE_FUNCTION DOCKER]
Required: \{\}
| +| `tool` _[WorkbenchToolType](#workbenchtooltype)_ | The type of tool. | | Enum: [HTTP ELASTIC DATADOG PROMETHEUS LOKI TEMPO SENTRY MCP LINEAR ATLASSIAN SPLUNK DYNATRACE CLOUDWATCH AZURE CLOUD JAEGER EXA GITHUB SLACK TEAMS GITLAB BITBUCKET BITBUCKET_DATACENTER AZURE_DEVOPS PAGERDUTY OPENSEARCH LAMBDA CLOUD_RUN AZURE_FUNCTION DOCKER VICTORIA_LOGS]
Required: \{\}
| | `categories` _WorkbenchToolCategory array_ | Categories for the tool. | | Optional: \{\}
| | `approval` _boolean_ | Whether this tool requires approval before execution. | | Optional: \{\}
| | `projectRef` _[ObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#objectreference-v1-core)_ | The project for this tool. | | Optional: \{\}
| @@ -6501,7 +6503,8 @@ _Appears in:_ | Field | Description | Default | Validation | | --- | --- | --- | --- | | `url` _string_ | Splunk base URL. | | Required: \{\}
| -| `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the bearer token. | | Optional: \{\}
| +| `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the authentication token. | | Optional: \{\}
| +| `tokenType` _[SplunkTokenType](#splunktokentype)_ | Authorization realm used for token authentication. | BEARER | Enum: [BEARER SPLUNK]
Optional: \{\}
| | `username` _string_ | Basic auth username. | | Optional: \{\}
| | `passwordSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the basic auth password. | | Optional: \{\}
| @@ -6544,6 +6547,27 @@ _Appears in:_ | `tenantId` _string_ | Optional tenant id. | | Optional: \{\}
| +#### WorkbenchToolVictoriaLogsConfig + + + +WorkbenchToolVictoriaLogsConfig defines a VictoriaLogs connection. + + + +_Appears in:_ +- [WorkbenchToolConfiguration](#workbenchtoolconfiguration) + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `url` _string_ | VictoriaLogs base URL. | | Required: \{\}
| +| `tokenSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the bearer token or api key. | | Optional: \{\}
| +| `username` _string_ | Basic auth username. | | Optional: \{\}
| +| `passwordSecretRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#secretkeyselector-v1-core)_ | Reference to a secret key containing the basic auth password. | | Optional: \{\}
| +| `accountId` _string_ | Optional AccountID tenant header. | | Optional: \{\}
| +| `projectId` _string_ | Optional ProjectID tenant header. | | Optional: \{\}
| + + #### WorkbenchWebhook diff --git a/js/documentation/pages/plural-features/plural-ai/ai-agent/configure-agent.md b/js/documentation/pages/plural-features/plural-ai/ai-agent/configure-agent.md index 8bd1b3f62d..24d9a0d7d2 100644 --- a/js/documentation/pages/plural-features/plural-ai/ai-agent/configure-agent.md +++ b/js/documentation/pages/plural-features/plural-ai/ai-agent/configure-agent.md @@ -10,7 +10,7 @@ description: Configure agent runtimes and run agent tasks. ## Configure an AgentRuntime -Use `AgentRuntime` to define the provider, credentials, and runtime options. +Use `AgentRuntime` to define the provider and runtime options. With `aiProxy: true`, provider API keys are unnecessary because requests are routed through the Console AI proxy. For field-level details, see the [AgentRuntime API reference](/api-reference/kubernetes/agent-api-reference#agentruntime) and [AgentRuntimeSpec API reference](/api-reference/kubernetes/agent-api-reference#agentruntimespec). ```yaml @@ -21,14 +21,15 @@ metadata: namespace: plrl-agents spec: targetNamespace: plrl-agents - type: CLAUDE + type: CODEX default: true aiProxy: true config: - claude: - apiKeySecretRef: - name: ai-config - key: anthropic + codex: + # if not using ai proxy, can provide an explicit token + # apiKeySecretRef: + # name: ai-config + # key: openai model: claude-3-5-sonnet-latest ``` diff --git a/js/documentation/pages/plural-features/policy-management/stack-policies.md b/js/documentation/pages/plural-features/policy-management/stack-policies.md index 572f400588..32321c31c8 100644 --- a/js/documentation/pages/plural-features/policy-management/stack-policies.md +++ b/js/documentation/pages/plural-features/policy-management/stack-policies.md @@ -17,7 +17,20 @@ Plural evaluates a stack policy with the following top-level input: | `input.run_type` | The run operation: `plan`, `apply`, or `destroy` | | `input.stack` | Stack metadata, including its name, project, and Git configuration | | `input.commit` | Metadata for the commit associated with the run | -| `input.actor` | The initiating user, including `id`, `name`, `email`, and `groups` when available | +| `input.actor` | The initiating user, including identity, service-account status, roles, and groups | +| `input.costs` | Infracost resources reported for the run, or an empty array when no cost data is available | +| `input.violations` | Vulnerability and misconfiguration findings reported for the run, or an empty array when none are available | + +The `input.actor` object contains: + +| Field | Type | Description | +|---|---|---| +| `id` | string | User ID | +| `name` | string | User display name | +| `email` | string | User email address | +| `service_account` | boolean | Whether the actor is a service account | +| `roles.admin` | boolean | Whether the actor is a Plural administrator | +| `groups` | string array | Names of the groups the actor belongs to | Each entry in `input.plan.resource_changes` contains: @@ -26,11 +39,74 @@ Each entry in `input.plan.resource_changes` contains: | `address` | Full Terraform resource address | | `type` | Terraform resource type, such as `aws_eks_cluster` | | `name` | Resource name | -| `provider` | Short provider name | +| `provider_name` | Short provider name | | `change.actions` | Planned actions, such as `create`, `update`, `delete`, or `replace` | | `change.before` | Resource state before the run | | `change.after` | Expected resource state after the run | +### Cost data + +Each entry in `input.costs` contains: + +| Field | Type | Description | +|---|---|---| +| `resource_scope` | string | Infracost scope: `breakdown`, `past_breakdown`, `diff`, or `free` | +| `project_name` | string or null | Infracost project containing the resource | +| `name` | string | Resource name, such as `aws_instance.web` | +| `resource_type` | string or null | Infrastructure resource type | +| `hourly_cost` | number or null | Estimated hourly cost | +| `monthly_cost` | number or null | Estimated monthly cost | +| `monthly_usage_cost` | number or null | Usage-based portion of the estimated monthly cost | +| `raw_resource` | object or null | Provider-specific details supplied by Infracost | + +For example, a policy can reject a run when any resource adds more than $100 in estimated monthly cost: + +```rego +deny[{"msg": sprintf("%s costs more than $100 per month", [cost.name])}] if { + some cost in input.costs + cost.resource_scope == "diff" + cost.monthly_cost > 100 +} +``` + +### Vulnerability data + +Each entry in `input.violations` contains: + +| Field | Type | Description | +|---|---|---| +| `severity` | string | Finding severity: `unknown`, `low`, `medium`, `high`, or `critical` | +| `policy_id` | string | Identifier of the policy that produced the finding | +| `policy_url` | string or null | URL with more information about the policy | +| `policy_module` | string or null | Policy module that produced the finding | +| `title` | string | Short finding title | +| `description` | string or null | Detailed description of the finding | +| `resolution` | string or null | Recommended remediation | +| `causes` | array | Source locations that caused the finding | + +Each entry in a violation's `causes` array contains: + +| Field | Type | Description | +|---|---|---| +| `resource` | string | Infrastructure resource associated with the finding | +| `filename` | string or null | Source file containing the finding | +| `start` | integer | First affected line | +| `end` | integer | Last affected line | +| `lines` | array | Affected source lines | + +Each entry in `lines` contains `content` (string), `line` (integer), `first` (boolean or null), and `last` (boolean or null). + +For example, a policy can reject runs with critical findings: + +```rego +deny[{"msg": sprintf("critical finding: %s", [violation.title])}] if { + some violation in input.violations + violation.severity == "critical" +} +``` + +Cost and vulnerability data is only available when the stack runner reports it before the run reaches approval. Policies should treat the corresponding empty array as no reported data, not proof that a scan or estimate completed successfully. + ## Decisions A stack policy can produce: diff --git a/js/documentation/pages/plural-features/policy-management/workbench-policies.md b/js/documentation/pages/plural-features/policy-management/workbench-policies.md index 6b3e436063..d6ff157c7a 100644 --- a/js/documentation/pages/plural-features/policy-management/workbench-policies.md +++ b/js/documentation/pages/plural-features/policy-management/workbench-policies.md @@ -17,7 +17,18 @@ A policy cannot make an unavailable tool accessible or grant permissions the act |---|---| | `input.tool_name` | Name of the tool being called | | `input.tool` | Arguments supplied to the tool, represented as an object | -| `input.actor` | Current user, including `id`, `name`, `email`, and a `groups` array when available | +| `input.actor` | Current user, including identity, service-account status, roles, and groups | + +The `input.actor` object contains: + +| Field | Type | Description | +|---|---|---| +| `id` | string | User ID | +| `name` | string | User display name | +| `email` | string | User email address | +| `service_account` | boolean | Whether the actor is a service account | +| `roles.admin` | boolean | Whether the actor is a Plural administrator | +| `groups` | string array | Names of the groups the actor belongs to | The shape of `input.tool` depends on the tool. For example, a Kubernetes operation can include a `namespace`, while a logging tool can include an index and query. Select a past evaluation in the [policy simulator](/plural-features/policy-management/simulating-policies) to inspect the real input for a tool before writing rules against it. diff --git a/lib/cloud_query/toolquery.pb.ex b/lib/cloud_query/toolquery.pb.ex index 1000bd23f9..c960d84b44 100644 --- a/lib/cloud_query/toolquery.pb.ex +++ b/lib/cloud_query/toolquery.pb.ex @@ -1,3 +1,16 @@ +defmodule Toolquery.SplunkTokenType do + @moduledoc false + + use Protobuf, + enum: true, + full_name: "toolquery.SplunkTokenType", + protoc_gen_elixir_version: "0.16.0", + syntax: :proto3 + + field :BEARER, 0 + field :SPLUNK, 1 +end + defmodule Toolquery.LogQueryOperator do @moduledoc false @@ -99,6 +112,22 @@ defmodule Toolquery.LokiConnection do field :password, 5, proto3_optional: true, type: :string end +defmodule Toolquery.VictoriaLogsConnection do + @moduledoc false + + use Protobuf, + full_name: "toolquery.VictoriaLogsConnection", + protoc_gen_elixir_version: "0.16.0", + syntax: :proto3 + + field :url, 1, type: :string + field :token, 2, proto3_optional: true, type: :string + field :username, 3, proto3_optional: true, type: :string + field :password, 4, proto3_optional: true, type: :string + field :account_id, 5, proto3_optional: true, type: :string, json_name: "accountId" + field :project_id, 6, proto3_optional: true, type: :string, json_name: "projectId" +end + defmodule Toolquery.TempoConnection do @moduledoc false @@ -140,6 +169,7 @@ defmodule Toolquery.SplunkConnection do field :token, 2, proto3_optional: true, type: :string field :username, 3, proto3_optional: true, type: :string field :password, 4, proto3_optional: true, type: :string + field :token_type, 5, type: Toolquery.SplunkTokenType, json_name: "tokenType", enum: true end defmodule Toolquery.DynatraceConnection do @@ -206,6 +236,11 @@ defmodule Toolquery.ToolConnection do field :azure, 9, type: Toolquery.AzureConnection, oneof: 0 field :jaeger, 10, type: Toolquery.JaegerConnection, oneof: 0 field :opensearch, 11, type: Toolquery.OpensearchConnection, oneof: 0 + + field :victoria_logs, 12, + type: Toolquery.VictoriaLogsConnection, + json_name: "victoriaLogs", + oneof: 0 end defmodule Toolquery.TimeRange do diff --git a/lib/console/ai/evidence/stack_state.ex b/lib/console/ai/evidence/stack_state.ex deleted file mode 100644 index c67ca1cf1b..0000000000 --- a/lib/console/ai/evidence/stack_state.ex +++ /dev/null @@ -1,43 +0,0 @@ -defimpl Console.AI.Evidence, for: Console.Schema.StackState do - use Console.AI.Evidence.Base - import Console.AI.Fixer.Base - alias Console.Repo - alias Console.Deployments.Stacks - alias Console.Schema.{StackState, StackRun} - - def custom(_), do: true - - def generate(%StackState{run: %StackRun{} = run} = state), - do: history([state_description(state) | fetch_code(run)]) - - def insight(%StackState{insight: insight}), do: insight - - def preload(state), do: Repo.preload(state, [insight: :evidence, run: [:stack, :cluster, :errors, :repository]]) - - defp state_description(%StackState{run: %StackRun{} = run} = state) do - {:user, """ - The Plural stack #{run.stack.name} has a terraform plan generated and the user will want to understand what it means, in particular: - - * expected blast radius of the change - * if any critical systems can be affected by the change - * whether it's safe to apply - - The plan itself is recorded below: - - ``` - #{state.plan} - ``` - - It is sourcing #{run.type} configuration from the git repository at #{run.repository.url} from the folder #{run.git.folder} at ref #{run.git.ref}. - """} - end - - defp fetch_code(%StackRun{} = run) do - with {:ok, f} <- Stacks.tarstream(run), - {:ok, msgs} <- code_prompt(f, run.git.folder, "I'll also include the relevant #{run.type} code below, listed in the format #{file_fmt()}") do - msgs - else - _ -> [] - end - end -end diff --git a/lib/console/ai/plan.ex b/lib/console/ai/plan.ex new file mode 100644 index 0000000000..1929c71885 --- /dev/null +++ b/lib/console/ai/plan.ex @@ -0,0 +1,72 @@ +defmodule Console.AI.Plan do + @moduledoc """ + Generates an IaC plan summary and posts it as a PR review comment. + + This is intentionally not an AI insight: the only consumer is the GitHub/GitLab + comment, so there is no memoized insight record to persist. + """ + import Console.AI.Fixer.Base + alias Console.Repo + alias Console.AI.{Provider, Cron, Chat.Engine, Tools.PlanSummary} + alias Console.Deployments.Stacks + alias Console.Schema.{StackRun, StackState, PullRequest, GitRepository} + + @spec enqueue(StackRun.t) :: {:ok, pid} | :ok + def enqueue(%StackRun{id: id} = run) do + Cron.if_enabled(fn -> + case Repo.preload(run, [:pull_request, :state]) do + %StackRun{pull_request: %PullRequest{}, state: %StackState{plan: p}} = run when is_binary(p) -> + me = node() + case Console.ClusterRing.node(id) do + ^me -> Console.AI.TaskSupervisor + node -> {Console.AI.TaskSupervisor, node} + end + |> Task.Supervisor.start_child(fn -> comment(run) end) + _ -> :ok + end + end) + end + def enqueue(_), do: :ok + + @spec comment(StackRun.t) :: {:ok, StackRun.t} | :ok | Console.error + def comment(%StackRun{} = run) do + run = Repo.preload(run, [:pull_request, :repository, :stack, :state]) + with {:ok, markdown} <- summarize(run), + do: Stacks.post_plan_comment(run, markdown) + end + + defp summarize(%StackRun{state: %StackState{} = state} = run) do + history = + [prompt(run, state) | fetch_code(run)] + |> Engine.fit_context_window(PlanSummary.preface()) + + Provider.simple_tool_call(history, PlanSummary, client: :default, preface: PlanSummary.preface()) + end + + defp prompt(%StackRun{stack: stack, repository: %GitRepository{} = repo, git: git, type: type}, %StackState{plan: plan}) do + {:user, """ + The Plural stack #{stack.name} has a terraform plan generated and the user will want to understand what it means, in particular: + + * expected blast radius of the change + * if any critical systems can be affected by the change + * whether it's safe to apply + + The plan itself is recorded below: + + ``` + #{plan} + ``` + + It is sourcing #{type} configuration from the git repository at #{repo.url} from the folder #{git.folder} at ref #{git.ref}. + """} + end + + defp fetch_code(%StackRun{} = run) do + with {:ok, f} <- Stacks.tarstream(run), + {:ok, msgs} <- code_prompt(f, run.git.folder, "I'll also include the relevant #{run.type} code below, listed in the format #{file_fmt()}") do + msgs + else + _ -> [] + end + end +end diff --git a/lib/console/ai/provider/bedrock.ex b/lib/console/ai/provider/bedrock.ex index 4a9bcb1644..99e1c890dd 100644 --- a/lib/console/ai/provider/bedrock.ex +++ b/lib/console/ai/provider/bedrock.ex @@ -8,7 +8,7 @@ defmodule Console.AI.Bedrock do require Logger - defstruct [:access_token, :model_id, :tool_model_id, :region, :embedding_model, :aws_access_key_id, :aws_secret_access_key, :stream] + defstruct [:access_token, :model_id, :tool_model_id, :region, :embedding_model, :aws_access_key_id, :aws_secret_access_key, :endpoint, :stream] @type t :: %__MODULE__{} @@ -24,6 +24,7 @@ defmodule Console.AI.Bedrock do aws_secret_access_key: opts.aws_secret_access_key, access_token: opts.access_token, region: opts.region, + endpoint: opts.endpoint || :runtime, stream: Stream.stream(), } end @@ -35,9 +36,15 @@ defmodule Console.AI.Bedrock do """ @spec completion(t(), Console.AI.Provider.history, keyword) :: {:ok, binary} | Console.error def completion(%__MODULE__{} = bedrock, messages, opts) do + model = select_model(bedrock, opts[:model], opts[:client]) + messages |> reqllm_messages() - |> generate_text("amazon-bedrock:#{select_model(bedrock, opts[:model], opts[:client])}", bedrock.stream, base_opts(Keyword.put(provider_options(bedrock), :tools, tools(opts)), opts)) + |> generate_text( + "amazon-bedrock:#{model}", + bedrock.stream, + request_opts(model, Keyword.put(provider_options(bedrock), :tools, tools(opts)), opts) + ) |> reqllm_result() end @@ -46,11 +53,16 @@ defmodule Console.AI.Bedrock do """ @spec tool_call(t(), Console.AI.Provider.history, [atom], keyword) :: {:ok, binary} | {:ok, [Console.AI.Tool.t]} | Console.error def tool_call(%__MODULE__{} = bedrock, messages, tools, opts) do + model = select_model(bedrock, opts[:model], opts[:client] || :tool) provider_opts = Keyword.put(provider_options(bedrock), :tools, reqllm_tools(tools)) messages |> reqllm_messages() - |> generate_text("amazon-bedrock:#{select_model(bedrock, opts[:model], opts[:client] || :tool)}", bedrock.stream, base_opts(provider_opts, opts)) + |> generate_text( + "amazon-bedrock:#{model}", + bedrock.stream, + request_opts(model, provider_opts, opts) + ) |> reqllm_result() |> tool_calls() end @@ -79,8 +91,8 @@ defmodule Console.AI.Bedrock do def tools?(), do: true - def provider_options(%__MODULE__{region: region, access_token: token} = bedrock) do - [region: region, access_token: token] + def provider_options(%__MODULE__{region: region, access_token: token, endpoint: endpoint} = bedrock) do + [region: region, api_key: token, endpoint: endpoint || :runtime] |> Enum.concat(if is_nil(token), do: aws_auth(bedrock), else: []) |> Enum.filter(fn {_, v} -> not is_nil(v) end) end @@ -95,6 +107,21 @@ defmodule Console.AI.Bedrock do defp maybe_truncate(embeddings, "cohere.embed-english-v3"), do: Enum.map(embeddings, &Enum.take(&1, 512)) defp maybe_truncate(embeddings, _), do: embeddings + defp request_opts(model, provider_opts, opts) do + provider_opts + |> base_opts(opts) + |> maybe_set_gpt56_reasoning_low(model) + end + + defp maybe_set_gpt56_reasoning_low(opts, model) do + if String.starts_with?(model, ["gpt-5.6", "openai.gpt-5.6"]) or + String.contains?(model, ".openai.gpt-5.6") do + Keyword.put(opts, :reasoning_effort, :low) + else + opts + end + end + defp aws_auth(%__MODULE__{aws_access_key_id: aid, aws_secret_access_key: sak}) when is_binary(aid) and is_binary(sak), do: [access_key_id: aid, secret_access_key: sak] defp aws_auth(_) do diff --git a/lib/console/ai/pubsub/consumer.ex b/lib/console/ai/pubsub/consumer.ex index 8f287b8a6e..d8495ed4b3 100644 --- a/lib/console/ai/pubsub/consumer.ex +++ b/lib/console/ai/pubsub/consumer.ex @@ -5,7 +5,7 @@ defmodule Console.AI.PubSub.Consumer do protocol: Console.AI.PubSub.Insightful import Console.Services.Base, only: [handle_notify: 2] alias Console.PubSub - alias Console.Schema.{AiInsight, Service, Stack, StackState, Alert} + alias Console.Schema.{AiInsight, Service, Stack, Alert} alias Console.AI.{PubSub.Insightful, Cron} require Logger @@ -25,8 +25,6 @@ defmodule Console.AI.PubSub.Consumer do handle_notify(PubSub.ServiceInsight, {svc, insight}) %AiInsight{stack: %Stack{} = stack} -> handle_notify(PubSub.StackInsight, {stack, insight}) - %AiInsight{stack_state: %StackState{} = state} -> - handle_notify(PubSub.StackStateInsight, {state, insight}) %AiInsight{alert: %Alert{} = alert} -> handle_notify(PubSub.AlertInsight, {alert, insight}) _ -> :ok diff --git a/lib/console/ai/pubsub/protocol.ex b/lib/console/ai/pubsub/protocol.ex index 68f5d4ce51..2ee15ea293 100644 --- a/lib/console/ai/pubsub/protocol.ex +++ b/lib/console/ai/pubsub/protocol.ex @@ -26,34 +26,9 @@ defimpl Console.AI.PubSub.Insightful, for: Console.PubSub.ServiceUpdated do def resource(_), do: :ok end -defimpl Console.AI.PubSub.Insightful, for: Console.PubSub.StackRunUpdated do - alias Console.Schema.{StackRun, StackState} - - def resource(%@for{item: %StackRun{status: :pending_approval} = run}), - do: get_state(run) - def resource(%@for{item: %StackRun{status: :successful, pull_request_id: id} = run}) when is_binary(id), - do: get_state(run) - def resource(_), do: :ok - - defp get_state(run) do - case Console.Repo.preload(run, [:state]) do - %StackRun{state: %StackState{plan: p} = state} when is_binary(p) and byte_size(p) > 0 -> - {:ok, state} - _ -> :ok - end - end -end - defimpl Console.AI.PubSub.Insightful, for: Console.PubSub.StackRunCompleted do - alias Console.Schema.{StackState, StackRun} + alias Console.Schema.StackRun - def resource(%@for{item: %StackRun{status: :successful, pull_request_id: id} = run}) when is_binary(id) do - case Console.Repo.preload(run, [:state]) do - %StackRun{state: %StackState{plan: p} = state} when is_binary(p) and byte_size(p) > 0 -> - {:ok, state} - _ -> :ok - end - end def resource(%@for{item: %StackRun{status: :failed} = run}), do: {:ok, run} def resource(_), do: :ok end diff --git a/lib/console/ai/tool.ex b/lib/console/ai/tool.ex index 77702bccbf..558d1f6864 100644 --- a/lib/console/ai/tool.ex +++ b/lib/console/ai/tool.ex @@ -16,6 +16,7 @@ defmodule Console.AI.Tool do alias Console.AI.Chat.Knowledge alias Console.Deployments.{Git, Settings, Agents} alias Console.Deployments.Policy, as: PolicySvc + alias Console.Deployments.Policy.Input, as: PolicyInput @type t :: %__MODULE__{} @@ -184,7 +185,7 @@ defmodule Console.AI.Tool do end end - defp maybe_actor(input), do: Map.put(input, "actor", PolicySvc.actor(actor())) + defp maybe_actor(input), do: Map.put(input, "actor", PolicyInput.actor(actor())) defp compile_policies(policies) do with {:ok, engine} <- Regolix.new(), diff --git a/lib/console/ai/tools/plan_summary.ex b/lib/console/ai/tools/plan_summary.ex new file mode 100644 index 0000000000..8de7096ec3 --- /dev/null +++ b/lib/console/ai/tools/plan_summary.ex @@ -0,0 +1,53 @@ +defmodule Console.AI.Tools.PlanSummary do + use Ecto.Schema + import Ecto.Changeset + require EEx + + embedded_schema do + field :summary, :string + field :blast_radius, :string + field :critical_systems, {:array, :string} + field :notable_changes, {:array, :string} + field :safety, :string + end + + @valid ~w(summary blast_radius critical_systems notable_changes safety)a + + def changeset(model, attrs) do + model + |> cast(attrs, @valid) + |> validate_required(@valid) + end + + @json_schema Console.priv_file!("tools/plan_summary.json") |> Jason.decode!() + + def json_schema(), do: @json_schema + def name(), do: "plural_plan_summary" + def description(), do: "Summarize an infrastructure-as-code plan (for example a terraform plan). All text fields should be in commonmark markdown format" + + def preface() do + """ + You're a seasoned devops engineer with experience in Kubernetes, GitOps and Infrastructure as Code. + Summarize what this infrastructure plan will do so a non-expert can decide whether it is safe to apply. + Call out blast radius, any critical systems that could be affected, the notable resource changes, and a clear safety assessment. + Do not frame this as a root-cause analysis of an incident; there is no failure to diagnose. + + - Use Markdown formatting (e.g., `inline code`, ```code fences```, lists, tables). + - When using markdown, use backticks to format file, directory, function, and class names. + """ + end + + def implement(%__MODULE__{} = plan) do + plan_template( + summary: plan.summary, + blast_radius: plan.blast_radius, + critical_systems: plan.critical_systems || [], + notable_changes: plan.notable_changes || [], + safety: plan.safety + ) + |> String.trim() + |> then(& {:ok, &1}) + end + + EEx.function_from_file(:defp, :plan_template, Path.join([:code.priv_dir(:console), "plan_summary.md.eex"]), [:assigns]) +end diff --git a/lib/console/ai/tools/workbench/canvas/logs.ex b/lib/console/ai/tools/workbench/canvas/logs.ex index ef6731d2f0..b163fceea9 100644 --- a/lib/console/ai/tools/workbench/canvas/logs.ex +++ b/lib/console/ai/tools/workbench/canvas/logs.ex @@ -2,7 +2,6 @@ defmodule Console.AI.Tools.Workbench.Canvas.LogsBlock do use Console.AI.Tools.Workbench.Base import Console.AI.Tools.Workbench.Canvas.MetricsBlock, only: [validate_tool: 3] alias Console.AI.Workbench.Canvas - alias Console.AI.Tools.Workbench.Observability alias Console.Schema.WorkbenchJobResult.{CanvasBlock, ToolGraph} embedded_schema do @@ -28,8 +27,6 @@ defmodule Console.AI.Tools.Workbench.Canvas.LogsBlock do |> validate_required([:identifier]) end - @logs_tools [Observability.Logs, Observability.Plrl.Logs] - def implement(%__MODULE__{env: env, layout: layout, props: props} = model) do block = %CanvasBlock{ identifier: model.identifier, @@ -38,7 +35,7 @@ defmodule Console.AI.Tools.Workbench.Canvas.LogsBlock do content: %CanvasBlock.Content{logs: props} } - with {:ok, _} <- validate_tool(env, props.query, @logs_tools), + with {:ok, _} <- validate_tool(env, props.query, :logs), {:ok, canvas} <- Canvas.insert(Canvas.canvas(), block) do Canvas.save(canvas) {:ok, "added logs block #{model.identifier} to canvas"} diff --git a/lib/console/ai/tools/workbench/canvas/metrics.ex b/lib/console/ai/tools/workbench/canvas/metrics.ex index c83be0c284..c62e06e824 100644 --- a/lib/console/ai/tools/workbench/canvas/metrics.ex +++ b/lib/console/ai/tools/workbench/canvas/metrics.ex @@ -1,9 +1,6 @@ defmodule Console.AI.Tools.Workbench.Canvas.MetricsBlock do use Console.AI.Tools.Workbench.Base - alias Console.AI.Tool - alias Console.AI.Workbench.Canvas - alias Console.AI.Tools.Workbench.Observability - alias Console.AI.Workbench.Subagents + alias Console.AI.Workbench.{Canvas, Toolchain} alias Console.Schema.WorkbenchJobResult.{CanvasBlock, ToolGraph, ToolQuery} embedded_schema do @@ -29,8 +26,6 @@ defmodule Console.AI.Tools.Workbench.Canvas.MetricsBlock do |> validate_required([:identifier]) end - @metrics_tools [Observability.Metrics, Observability.Plrl.Metrics] - def implement(%__MODULE__{env: env,layout: layout, props: props} = model) do block = %CanvasBlock{ identifier: model.identifier, @@ -39,25 +34,17 @@ defmodule Console.AI.Tools.Workbench.Canvas.MetricsBlock do content: %CanvasBlock.Content{metrics: props} } - with {:ok, _} <- validate_tool(env, props.query, @metrics_tools), + with {:ok, _} <- validate_tool(env, props.query, :metrics), {:ok, canvas} <- Canvas.insert(Canvas.canvas(), block) do Canvas.save(canvas) {:ok, "added metrics block #{model.identifier} to canvas"} end end - def validate_tool(%Console.AI.Workbench.Environment{} = env, %ToolQuery{tool_name: name, tool_args: args}, valid_tools) do - tools = Subagents.Observability.tools(env) - with tool when not is_nil(tool) <- Enum.find(tools, & Tool.name(&1) == name), - {:ok, %mod{} = t} <- Tool.validate(tool, args), - true <- Enum.member?(valid_tools, mod) do - {:ok, t} - else - {:error, err} -> {:error, "failed to validate tool call: #{name}, result: #{inspect(err)}"} - {:ok, %{}} -> {:error, "tool #{name} not valid for querying on the fly, must be a metrics or logs capable tool"} - nil -> {:error, "tool #{name} not found"} - false -> {:error, "tool #{name} not a valid metrics or logs capable tool name"} - _ -> {:error, "tool #{name} not valid for querying on the fly"} - end - end + def validate_tool( + %Console.AI.Workbench.Environment{job: job, user: user}, + %ToolQuery{tool_name: name, tool_args: args}, + type + ), + do: Toolchain.validate(job, type, name, args, user) end diff --git a/lib/console/ai/tools/workbench/canvas/traces.ex b/lib/console/ai/tools/workbench/canvas/traces.ex index b78666aab4..02b4d19f06 100644 --- a/lib/console/ai/tools/workbench/canvas/traces.ex +++ b/lib/console/ai/tools/workbench/canvas/traces.ex @@ -2,7 +2,6 @@ defmodule Console.AI.Tools.Workbench.Canvas.TracesBlock do use Console.AI.Tools.Workbench.Base import Console.AI.Tools.Workbench.Canvas.MetricsBlock, only: [validate_tool: 3] alias Console.AI.Workbench.Canvas - alias Console.AI.Tools.Workbench.Observability alias Console.Schema.WorkbenchJobResult.{CanvasBlock, ToolGraph} embedded_schema do @@ -29,8 +28,6 @@ defmodule Console.AI.Tools.Workbench.Canvas.TracesBlock do |> validate_required([:identifier]) end - @traces_tools [Observability.Traces] - def implement(%__MODULE__{env: env, layout: layout, props: props} = model) do block = %CanvasBlock{ identifier: model.identifier, @@ -39,7 +36,7 @@ defmodule Console.AI.Tools.Workbench.Canvas.TracesBlock do content: %CanvasBlock.Content{traces: props} } - with {:ok, _} <- validate_tool(env, props.query, @traces_tools), + with {:ok, _} <- validate_tool(env, props.query, :traces), {:ok, canvas} <- Canvas.insert(Canvas.canvas(), block) do Canvas.save(canvas) {:ok, "added traces block #{model.identifier} to canvas"} diff --git a/lib/console/ai/tools/workbench/complete.ex b/lib/console/ai/tools/workbench/complete.ex index 581827e311..222688ef2d 100644 --- a/lib/console/ai/tools/workbench/complete.ex +++ b/lib/console/ai/tools/workbench/complete.ex @@ -1,10 +1,13 @@ defmodule Console.AI.Tools.Workbench.Complete do use Console.AI.Tools.Workbench.Base - alias Console.Schema.WorkbenchJobActivity + alias Console.Schema.{User, WorkbenchJob, WorkbenchJobActivity} alias Console.Schema.WorkbenchJobResult alias Console.Schema.WorkbenchJobResult.ToolQuery + alias Console.AI.Workbench.Toolchain embedded_schema do + field :job, :map, virtual: true + field :user, :map, virtual: true field :conclusion, :string field :topology, :string field :criticism, :string @@ -19,8 +22,11 @@ defmodule Console.AI.Tools.Workbench.Complete do @json_schema Console.priv_file!("tools/workbench/complete.json") |> Jason.decode!() def name(), do: "workbench_complete" + def name(_), do: name() def json_schema(), do: @json_schema + def json_schema(_), do: json_schema() def description(), do: "Complete the workbench job, with the final conclusion given and any relevant metrics or logs to include in the result metadata. Be sure to always mark the final status of all todos as well." + def description(_), do: description() def changeset(model, attrs) do model @@ -39,5 +45,7 @@ defmodule Console.AI.Tools.Workbench.Complete do |> validate_required([:conclusion]) end - def implement(result), do: {:ok, result} + def implement(%__MODULE__{job: %WorkbenchJob{} = job, user: %User{} = user} = result) do + with :ok <- Toolchain.validate_result(job, result, user), do: {:ok, result} + end end diff --git a/lib/console/ai/tools/workbench/infrastructure/api_discovery.ex b/lib/console/ai/tools/workbench/infrastructure/api_discovery.ex new file mode 100644 index 0000000000..284a1e1927 --- /dev/null +++ b/lib/console/ai/tools/workbench/infrastructure/api_discovery.ex @@ -0,0 +1,60 @@ +defmodule Console.AI.Tools.Workbench.Infrastructure.ApiDiscovery do + use Console.AI.Tools.Agent.Base + alias Console.Deployments.{Clusters, Policies} + alias Console.Schema.{Cluster, User} + + embedded_schema do + field :user, :map, virtual: true + field :cluster, :string + field :group, :string + field :version, :string + field :kind, :string + end + + @valid ~w(cluster group version kind)a + @json_schema Console.priv_file!("tools/workbench/infrastructure/api_discovery.json") + |> Jason.decode!() + + def changeset(model, attrs) do + model + |> cast(attrs, @valid) + |> validate_required([:cluster]) + end + + def json_schema(_), do: @json_schema + def name(_), do: "api_discovery" + + def description(_) do + "Lists Kubernetes API groups, versions, kinds, and plural resource names available on a cluster, with optional group, version, and kind filters. Use this to discover the exact API before inspecting its schema or querying resources." + end + + def implement(%__MODULE__{user: %User{} = user, cluster: handle} = tool) do + with {:cluster, %Cluster{} = cluster} <- + {:cluster, Clusters.get_cluster_by_handle(handle)}, + {:access, {:ok, %Cluster{} = cluster}} <- + {:access, Policies.allow(cluster, user, :read)}, + %{} = discovery <- Clusters.api_discovery(cluster) do + discovery + |> Enum.filter(fn {{group, version, kind}, _} -> + matches?(group, tool.group) and + matches?(version, tool.version) and + matches?(kind, tool.kind) + end) + |> Enum.map(fn {{group, version, kind}, plural} -> + %{group: group, version: version, kind: kind, plural: plural} + end) + |> Jason.encode() + else + {:cluster, _} -> {:error, "No cluster found matching handle=#{handle}"} + {:access, error} -> error + error -> error + end + end + + defp matches?(_, nil), do: true + + defp matches?(value, filter) when is_binary(value) and is_binary(filter), + do: String.contains?(String.downcase(value), String.downcase(filter)) + + defp matches?(_, _), do: false +end diff --git a/lib/console/ai/tools/workbench/infrastructure/api_spec.ex b/lib/console/ai/tools/workbench/infrastructure/api_spec.ex new file mode 100644 index 0000000000..0687a5acae --- /dev/null +++ b/lib/console/ai/tools/workbench/infrastructure/api_spec.ex @@ -0,0 +1,51 @@ +defmodule Console.AI.Tools.Workbench.Infrastructure.ApiSpec do + use Console.AI.Tools.Agent.Base + alias Console.Deployments.{Clusters, Policies} + alias Console.Schema.{Cluster, User} + + embedded_schema do + field :user, :map, virtual: true + field :cluster, :string + field :group, :string + field :version, :string + field :query, :string + end + + @valid ~w(cluster group version query)a + @json_schema Console.priv_file!("tools/workbench/infrastructure/api_spec.json") + |> Jason.decode!() + + def changeset(model, attrs) do + model + |> cast(attrs, @valid) + |> validate_required(@valid) + end + + def json_schema(_), do: @json_schema + def name(_), do: "api_spec" + + def description(_) do + "Searches a Kubernetes cluster's OpenAPI schema for kinds in a specific API group and version. Use api_discovery first to identify the exact group and version. This is the source of truth for CRD schemas installed on that cluster." + end + + def implement(%__MODULE__{user: %User{} = user, cluster: handle} = tool) do + with {:cluster, %Cluster{} = cluster} <- + {:cluster, Clusters.get_cluster_by_handle(handle)}, + {:access, {:ok, %Cluster{} = cluster}} <- + {:access, Policies.allow(cluster, user, :read)}, + {:ok, %{"components" => %{"schemas" => schemas}}} <- + Clusters.api_spec(cluster, tool.group, tool.version) do + schemas + |> Enum.filter(fn {name, _} -> + String.contains?(String.downcase(name), String.downcase(tool.query)) + end) + |> Enum.take(5) + |> Map.new() + |> Jason.encode() + else + {:cluster, _} -> {:error, "No cluster found matching handle=#{handle}"} + {:access, error} -> error + error -> error + end + end +end diff --git a/lib/console/ai/tools/workbench/monitoring.ex b/lib/console/ai/tools/workbench/monitoring.ex index 7d24c9e335..7168bbf832 100644 --- a/lib/console/ai/tools/workbench/monitoring.ex +++ b/lib/console/ai/tools/workbench/monitoring.ex @@ -5,6 +5,7 @@ defmodule Console.AI.Tools.Workbench.Monitoring do import Console.GraphQl.Resolvers.Deployments.Base, only: [maybe_search: 3] alias Console.AI.Tools.Workbench.Monitoring.{ DashboardDelete, + DashboardGraphDelete, DashboardGet, DashboardList, DashboardUpsert, @@ -31,6 +32,7 @@ defmodule Console.AI.Tools.Workbench.Monitoring do def write_tools(%WorkbenchJob{} = job, %User{} = user) do [ %DashboardUpsert{job: job, user: user}, + %DashboardGraphDelete{job: job, user: user}, %DashboardDelete{job: job, user: user}, %MonitorUpsert{job: job, user: user}, %MonitorDelete{job: job, user: user} @@ -59,27 +61,46 @@ defmodule Console.AI.Tools.Workbench.Monitoring do def upsert_dashboard( %WorkbenchJob{} = job, %User{} = user, - id, - %DashboardUpsert.Attributes{} = attrs + name, + %Dashboard.Graph{} = graph, + settings ) do - attrs = - attrs - |> Console.mapify() - |> Map.put(:workbench_id, job.workbench_id) - case id do - id when is_binary(id) and byte_size(id) > 0 -> - with {:ok, _} <- dashboard(job, id), do: Observability.update_dashboard(attrs, id, user) - - _ -> - Observability.create_dashboard(attrs, user) + case dashboard_by_name(job, name) do + %Dashboard{} = dashboard -> + dashboard + |> dashboard_attrs() + |> apply_dashboard_settings(settings) + |> Map.put(:graphs, upsert_graph(dashboard.graphs, graph)) + |> Observability.update_dashboard(dashboard.id, user) + + nil -> + settings + |> new_dashboard_attrs(name) + |> Map.put(:graphs, [Console.mapify(graph)]) + |> Map.put(:workbench_id, job.workbench_id) + |> Observability.create_dashboard(user) end |> associate_and_take(job, @dashboard_fields) end - def delete_dashboard(%WorkbenchJob{} = job, %User{} = user, id) do - with {:ok, dashboard} <- dashboard(job, id), + def delete_dashboard_graph(%WorkbenchJob{} = job, %User{} = user, name, identifier) do + with %Dashboard{} = dashboard <- dashboard_by_name(job, name), + {:ok, graphs} <- delete_graph(dashboard.graphs, identifier) do + Observability.update_dashboard(%{graphs: graphs}, dashboard.id, user) + |> associate_and_take(job, @dashboard_fields) + else + nil -> {:error, "dashboard not found in this workbench"} + error -> error + end + end + + def delete_dashboard(%WorkbenchJob{} = job, %User{} = user, name) do + with %Dashboard{} = dashboard <- dashboard_by_name(job, name), {:ok, _} <- Observability.delete_dashboard(dashboard.id, user) do - {:ok, "Deleted dashboard #{dashboard.name} (#{dashboard.id})"} + {:ok, "Deleted dashboard #{dashboard.name}"} + else + nil -> {:error, "dashboard not found in this workbench"} + error -> error end end @@ -138,6 +159,57 @@ defmodule Console.AI.Tools.Workbench.Monitoring do end end + defp dashboard_by_name(%WorkbenchJob{workbench_id: workbench_id}, name), + do: Repo.get_by(Dashboard, name: name, workbench_id: workbench_id) + + defp dashboard_attrs(%Dashboard{} = dashboard) do + dashboard + |> Map.take(~w(name description inputs)a) + |> Console.mapify() + end + + defp new_dashboard_attrs(nil, name), do: %{name: name} + + defp new_dashboard_attrs(%DashboardUpsert.Settings{} = settings, name) do + %{name: name} + |> apply_dashboard_settings(settings) + end + + defp apply_dashboard_settings(attrs, nil), do: attrs + + defp apply_dashboard_settings(attrs, %DashboardUpsert.Settings{} = settings) do + attrs + |> maybe_put(:name, settings.name) + |> maybe_put(:description, settings.description) + |> maybe_put_inputs(settings.inputs) + end + + defp maybe_put(attrs, _, nil), do: attrs + defp maybe_put(attrs, key, value), do: Map.put(attrs, key, value) + + defp maybe_put_inputs(attrs, []), do: attrs + defp maybe_put_inputs(attrs, inputs), do: Map.put(attrs, :inputs, Console.mapify(inputs)) + + defp upsert_graph(graphs, %Dashboard.Graph{identifier: identifier} = graph) do + graph = Console.mapify(graph) + + Enum.reduce(graphs, {[], false}, fn + %Dashboard.Graph{identifier: ^identifier}, {updated, _} -> {[graph | updated], true} + g, {updated, found} -> {[Console.mapify(g) | updated], found} + end) + |> case do + {updated, true} -> Enum.reverse(updated) + {updated, _} -> Enum.reverse([graph | updated]) + end + end + + defp delete_graph(graphs, identifier) do + case Enum.split_with(graphs, &(&1.identifier == identifier)) do + {[], _} -> {:error, "graph #{identifier} not found"} + {_, remaining} -> {:ok, Enum.map(remaining, &Console.mapify/1)} + end + end + defp monitor(%WorkbenchJob{workbench_id: workbench_id}, id) do case Repo.get_by(Monitor, id: id, workbench_id: workbench_id) do %Monitor{} = monitor -> {:ok, monitor} diff --git a/lib/console/ai/tools/workbench/monitoring/dashboard_delete.ex b/lib/console/ai/tools/workbench/monitoring/dashboard_delete.ex index 78746c2f06..2c2c8938b8 100644 --- a/lib/console/ai/tools/workbench/monitoring/dashboard_delete.ex +++ b/lib/console/ai/tools/workbench/monitoring/dashboard_delete.ex @@ -5,21 +5,22 @@ defmodule Console.AI.Tools.Workbench.Monitoring.DashboardDelete do embedded_schema do field :job, :map, virtual: true field :user, :map, virtual: true - field :dashboard_id, :string + field :dashboard_name, :string end - @json_schema Console.priv_file!("tools/workbench/monitoring/dashboard_id.json") |> Jason.decode!() + @json_schema Console.priv_file!("tools/workbench/monitoring/dashboard_delete.json") + |> Jason.decode!() def name(_), do: "workbench_dashboard_delete" def json_schema(_), do: @json_schema - def description(_), do: "Delete a dashboard belonging to this workbench." + def description(_), do: "Permanently delete a named dashboard belonging to this workbench." def changeset(model, attrs) do model - |> cast(attrs, [:dashboard_id]) - |> validate_required([:dashboard_id]) + |> cast(attrs, [:dashboard_name]) + |> validate_required([:dashboard_name]) end - def implement(%__MODULE__{job: job, user: user, dashboard_id: id}), - do: Monitoring.delete_dashboard(job, user, id) + def implement(%__MODULE__{job: job, user: user, dashboard_name: name}), + do: Monitoring.delete_dashboard(job, user, name) end diff --git a/lib/console/ai/tools/workbench/monitoring/dashboard_graph_delete.ex b/lib/console/ai/tools/workbench/monitoring/dashboard_graph_delete.ex new file mode 100644 index 0000000000..0e7352bd63 --- /dev/null +++ b/lib/console/ai/tools/workbench/monitoring/dashboard_graph_delete.ex @@ -0,0 +1,34 @@ +defmodule Console.AI.Tools.Workbench.Monitoring.DashboardGraphDelete do + use Console.AI.Tools.Workbench.Base + alias Console.AI.Tools.Workbench.Monitoring + + embedded_schema do + field :job, :map, virtual: true + field :user, :map, virtual: true + field :dashboard_name, :string + field :graph_identifier, :string + end + + @json_schema Console.priv_file!("tools/workbench/monitoring/dashboard_graph_delete.json") + |> Jason.decode!() + + def name(_), do: "workbench_dashboard_graph_delete" + def json_schema(_), do: @json_schema + + def description(_), + do: "Delete one graph, identified by its unique identifier, from a named workbench dashboard." + + def changeset(model, attrs) do + model + |> cast(attrs, [:dashboard_name, :graph_identifier]) + |> validate_required([:dashboard_name, :graph_identifier]) + end + + def implement(%__MODULE__{ + job: job, + user: user, + dashboard_name: name, + graph_identifier: identifier + }), + do: Monitoring.delete_dashboard_graph(job, user, name, identifier) +end diff --git a/lib/console/ai/tools/workbench/monitoring/dashboard_upsert.ex b/lib/console/ai/tools/workbench/monitoring/dashboard_upsert.ex index 2da125f80c..c6a6c03652 100644 --- a/lib/console/ai/tools/workbench/monitoring/dashboard_upsert.ex +++ b/lib/console/ai/tools/workbench/monitoring/dashboard_upsert.ex @@ -2,31 +2,29 @@ defmodule Console.AI.Tools.Workbench.Monitoring.DashboardUpsert do use Console.AI.Tools.Workbench.Base alias Console.AI.Tools.Workbench.Monitoring - defmodule Attributes do + defmodule Settings do use Console.AI.Tools.Workbench.Base alias Console.Schema.Dashboard embedded_schema do field :name, :string field :description, :string - embeds_many :graphs, Dashboard.Graph embeds_many :inputs, Dashboard.Input end def changeset(model, attrs) do model |> cast(attrs, [:name, :description]) - |> cast_embed(:graphs) |> cast_embed(:inputs) - |> validate_required([:name]) end end embedded_schema do field :job, :map, virtual: true field :user, :map, virtual: true - field :dashboard_id, :string - embeds_one :attributes, Attributes + field :dashboard_name, :string + embeds_one :graph, Console.Schema.Dashboard.Graph + embeds_one :settings, Settings end @json_schema_path Console.priv_filename("tools/workbench/monitoring/dashboard_upsert.json") @@ -37,14 +35,23 @@ defmodule Console.AI.Tools.Workbench.Monitoring.DashboardUpsert do def json_schema(_), do: @json_schema def description(_), - do: "Create a dashboard in this workbench, or update one when dashboard_id is provided. Graph layout rectangles must not overlap." + do: + "Insert or replace one graph in a dashboard, creating the dashboard when its name does not exist. Optional settings update dashboard metadata and inputs. Graph layout rectangles must not overlap." def changeset(model, attrs) do model - |> cast(attrs, [:dashboard_id]) - |> cast_embed(:attributes, required: true) + |> cast(attrs, [:dashboard_name]) + |> cast_embed(:graph, required: true) + |> cast_embed(:settings) + |> validate_required([:dashboard_name]) end - def implement(%__MODULE__{job: job, user: user, dashboard_id: id, attributes: attrs}), - do: Monitoring.upsert_dashboard(job, user, id, attrs) + def implement(%__MODULE__{ + job: job, + user: user, + dashboard_name: name, + graph: graph, + settings: settings + }), + do: Monitoring.upsert_dashboard(job, user, name, graph, settings) end diff --git a/lib/console/ai/tools/workbench/observability/external/azure.ex b/lib/console/ai/tools/workbench/observability/external/azure.ex new file mode 100644 index 0000000000..ba3c68d516 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/azure.ex @@ -0,0 +1,216 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Azure do + @moduledoc false + + alias Console.AI.Tools.Workbench.Observability.External.Support + alias Console.Schema.WorkbenchTool + + @dashboard_api_version "2020-09-01-preview" + @metric_alerts_api_version "2018-03-01" + @scheduled_query_rules_api_version "2021-08-01" + + def list_dashboards(%WorkbenchTool{configuration: %{azure: %{} = config}}, opts) do + with :ok <- Support.unsupported_search(opts, "azure", "dashboard"), + {:ok, token} <- token(config), + {:ok, path, params} <- dashboard_page_request(config, opts[:cursor]), + {:ok, %{"value" => dashboards} = result} <- request(token, path, params) do + dashboards = Enum.map(dashboards, &normalize_dashboard/1) + {:ok, Support.page(:dashboards, dashboards, opts, next_cursor: result["nextLink"])} + end + end + + def get_dashboard( + %WorkbenchTool{configuration: %{azure: %{} = config}}, + dashboard_id, + _opts + ) do + with {:ok, token} <- token(config), + {:ok, dashboard} <- + request(token, dashboard_path(dashboard_id, config.subscription_id), + params: %{"api-version" => @dashboard_api_version} + ) do + {:ok, normalize_dashboard(dashboard)} + end + end + + def list_monitors(%WorkbenchTool{configuration: %{azure: %{} = config}}, opts) do + with :ok <- Support.unsupported_search(opts, "azure", "monitor"), + {:ok, token} <- token(config), + {:ok, monitors, next_cursor} <- list_monitor_page(token, config, opts) do + {:ok, Support.page(:monitors, monitors, opts, next_cursor: next_cursor)} + end + end + + def get_monitor( + %WorkbenchTool{configuration: %{azure: %{} = config}}, + monitor_id, + _opts + ) do + with {:ok, token} <- token(config), + {:ok, monitor} <- + request(token, monitor_path(monitor_id, config.subscription_id), + params: %{"api-version" => monitor_api_version(monitor_id)} + ) do + {:ok, normalize_monitor(monitor)} + end + end + + defp token(%{ + tenant_id: tenant_id, + client_id: client_id, + client_secret: client_secret + }) + when is_binary(tenant_id) and byte_size(tenant_id) > 0 and is_binary(client_id) and + byte_size(client_id) > 0 and is_binary(client_secret) and + byte_size(client_secret) > 0 do + Req.new(base_url: "https://login.microsoftonline.com") + |> then( + &Support.request( + __MODULE__, + &1, + :post, + "/#{Support.encode_path(tenant_id)}/oauth2/v2.0/token", + form: %{ + "client_id" => client_id, + "client_secret" => client_secret, + "grant_type" => "client_credentials", + "scope" => "https://management.azure.com/.default" + } + ) + ) + |> case do + {:ok, %{"access_token" => token}} -> {:ok, token} + {:ok, _} -> {:error, "azure token response did not include an access token"} + error -> error + end + end + + defp token(_), do: {:error, "azure access requires tenant, client, and secret"} + + defp request(token, path, opts) do + Req.new( + base_url: "https://management.azure.com", + auth: {:bearer, token}, + headers: %{"accept" => "application/json"} + ) + |> then(&Support.request(__MODULE__, &1, :get, path, opts)) + end + + defp list_monitor_page(token, config, opts) do + with {:ok, collection, path, req_opts} <- monitor_page_request(config, opts[:cursor]), + {:ok, %{"value" => items} = result} <- request(token, path, req_opts) do + monitors = Enum.map(items, &normalize_monitor/1) + next_link = result["nextLink"] + + cond do + collection == :metric_alerts and is_nil(next_link) and monitors == [] and + opts[:cursor] in [nil, ""] -> + list_monitor_page(token, config, Keyword.put(opts, :cursor, "scheduledQueryRules")) + + collection == :metric_alerts and is_nil(next_link) -> + {:ok, monitors, "scheduledQueryRules"} + + true -> + {:ok, monitors, encode_monitor_cursor(collection, next_link)} + end + end + end + + defp dashboard_path("/subscriptions/" <> _ = id, _), do: id + + defp dashboard_path(id, subscription_id), + do: + "/subscriptions/#{Support.encode_path(subscription_id)}/providers/Microsoft.Portal/dashboards/#{Support.encode_path(id)}" + + defp monitor_path("/subscriptions/" <> _ = id, _), do: id + + defp monitor_path(id, subscription_id), + do: + "/subscriptions/#{Support.encode_path(subscription_id)}/providers/Microsoft.Insights/metricAlerts/#{Support.encode_path(id)}" + + defp monitor_api_version(id) do + if String.contains?(String.downcase(to_string(id)), "scheduledqueryrules") do + @scheduled_query_rules_api_version + else + @metric_alerts_api_version + end + end + + defp dashboard_page_request(config, cursor) when cursor in [nil, ""] do + {:ok, + "/subscriptions/#{Support.encode_path(config.subscription_id)}/providers/Microsoft.Portal/dashboards", + [params: %{"api-version" => @dashboard_api_version}]} + end + + defp dashboard_page_request(_, cursor), do: azure_next_link(cursor, "dashboard") + + defp monitor_page_request(config, cursor) when cursor in [nil, ""] do + {:ok, :metric_alerts, metric_alerts_path(config), + [params: %{"api-version" => @metric_alerts_api_version}]} + end + + defp monitor_page_request(config, "scheduledQueryRules") do + {:ok, :scheduled_query_rules, scheduled_query_rules_path(config), + [params: %{"api-version" => @scheduled_query_rules_api_version}]} + end + + defp monitor_page_request(_, "metricAlerts|" <> cursor) do + with {:ok, path, opts} <- azure_next_link(cursor, "monitor") do + {:ok, :metric_alerts, path, opts} + end + end + + defp monitor_page_request(_, "scheduledQueryRules|" <> cursor) do + with {:ok, path, opts} <- azure_next_link(cursor, "monitor") do + {:ok, :scheduled_query_rules, path, opts} + end + end + + defp monitor_page_request(_, _), + do: {:error, "invalid azure monitor pagination cursor"} + + defp metric_alerts_path(config), + do: + "/subscriptions/#{Support.encode_path(config.subscription_id)}/providers/Microsoft.Insights/metricAlerts" + + defp scheduled_query_rules_path(config), + do: + "/subscriptions/#{Support.encode_path(config.subscription_id)}/providers/Microsoft.Insights/scheduledQueryRules" + + defp encode_monitor_cursor(_collection, nil), do: nil + + defp encode_monitor_cursor(:metric_alerts, next_link), + do: "metricAlerts|#{next_link}" + + defp encode_monitor_cursor(:scheduled_query_rules, next_link), + do: "scheduledQueryRules|#{next_link}" + + defp azure_next_link(cursor, resource) do + case URI.parse(cursor) do + %URI{scheme: "https", host: "management.azure.com", path: path, query: query} -> + {:ok, path <> if(query, do: "?#{query}", else: ""), []} + + _ -> + {:error, "invalid azure #{resource} pagination cursor"} + end + end + + defp normalize_dashboard(dashboard) do + Support.item( + dashboard["id"], + dashboard["name"], + get_in(dashboard, ["tags", "description"]), + nil, + dashboard + ) + end + + defp normalize_monitor(monitor) do + Support.item( + monitor["id"], + monitor["name"], + get_in(monitor, ["properties", "description"]), + nil, + monitor + ) + end +end diff --git a/lib/console/ai/tools/workbench/observability/external/client.ex b/lib/console/ai/tools/workbench/observability/external/client.ex new file mode 100644 index 0000000000..3fc5296f1d --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/client.ex @@ -0,0 +1,65 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Client do + @moduledoc false + + alias Console.Schema.WorkbenchTool + alias Console.AI.Tools.Workbench.Observability.External.{ + Azure, + Cloudwatch, + Datadog, + Dynatrace, + Sentry, + Splunk + } + + @providers %{ + azure: Azure, + cloudwatch: Cloudwatch, + datadog: Datadog, + dynatrace: Dynatrace, + sentry: Sentry, + splunk: Splunk + } + + def supports?(%WorkbenchTool{tool: tool}), do: Map.has_key?(@providers, tool) + + def list_dashboards(%WorkbenchTool{} = tool, q, limit, scope \\ nil, cursor \\ nil) do + with {:ok, provider} <- provider(tool) do + provider.list_dashboards(tool, + q: q, + limit: limit, + scope: scope, + cursor: cursor + ) + end + end + + def get_dashboard(%WorkbenchTool{} = tool, dashboard_id, scope \\ nil) do + with {:ok, provider} <- provider(tool) do + provider.get_dashboard(tool, dashboard_id, scope: scope) + end + end + + def list_monitors(%WorkbenchTool{} = tool, q, limit, scope \\ nil, cursor \\ nil) do + with {:ok, provider} <- provider(tool) do + provider.list_monitors(tool, + q: q, + limit: limit, + scope: scope, + cursor: cursor + ) + end + end + + def get_monitor(%WorkbenchTool{} = tool, monitor_id, scope \\ nil) do + with {:ok, provider} <- provider(tool) do + provider.get_monitor(tool, monitor_id, scope: scope) + end + end + + defp provider(%WorkbenchTool{tool: tool}) do + case Map.fetch(@providers, tool) do + {:ok, provider} -> {:ok, provider} + :error -> {:error, "external observability resources are not supported for this tool"} + end + end +end diff --git a/lib/console/ai/tools/workbench/observability/external/cloudwatch.ex b/lib/console/ai/tools/workbench/observability/external/cloudwatch.ex new file mode 100644 index 0000000000..18cc1c565d --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/cloudwatch.ex @@ -0,0 +1,114 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Cloudwatch do + @moduledoc false + + alias Console.AI.Tools.Workbench.Observability.External.Support + alias Console.Schema.WorkbenchTool + + def list_dashboards(%WorkbenchTool{configuration: %{cloudwatch: %{} = config}}, opts) do + operation = + [ + dashboard_name_prefix: opts[:q], + next_token: opts[:cursor] + ] + |> Enum.reject(fn {_, value} -> is_nil(value) end) + |> ExAws.Cloudwatch.list_dashboards() + + with {:ok, %{body: %{dashboards: dashboards, next_token: next_cursor}}} <- + ExAws.request(operation, aws_config(config)) do + dashboards = Enum.map(dashboards, &normalize_dashboard/1) + {:ok, Support.page(:dashboards, dashboards, opts, next_cursor: empty_to_nil(next_cursor))} + end + end + + def get_dashboard( + %WorkbenchTool{configuration: %{cloudwatch: %{} = config}}, + dashboard_id, + _opts + ) do + operation = ExAws.Cloudwatch.get_dashboard(dashboard_name: dashboard_id) + + with {:ok, %{body: body}} <- ExAws.request(operation, aws_config(config)) do + definition = + body.dashboard_body + |> Jason.decode() + |> case do + {:ok, definition} -> definition + _ -> %{} + end + + {:ok, + Support.item( + body.dashboard_name, + body.dashboard_name, + nil, + body.dashboard_arn, + definition + )} + end + end + + def list_monitors(%WorkbenchTool{configuration: %{cloudwatch: %{} = config}}, opts) do + operation = + [ + alarm_name_prefix: opts[:q], + next_token: opts[:cursor], + max_records: opts[:limit] + ] + |> Enum.reject(fn {_, value} -> is_nil(value) end) + |> ExAws.Cloudwatch.describe_alarms() + + with {:ok, %{body: %{alarms: alarms, next_token: next_cursor}}} <- + ExAws.request(operation, aws_config(config)) do + monitors = Enum.map(alarms, &normalize_monitor/1) + {:ok, Support.page(:monitors, monitors, opts, next_cursor: empty_to_nil(next_cursor))} + end + end + + def get_monitor( + %WorkbenchTool{configuration: %{cloudwatch: %{} = config}}, + monitor_id, + _opts + ) do + operation = ExAws.Cloudwatch.describe_alarms(alarm_names: [monitor_id]) + + with {:ok, %{body: %{alarms: [alarm | _]}}} <- + ExAws.request(operation, aws_config(config)) do + {:ok, normalize_monitor(alarm)} + else + {:ok, %{body: %{alarms: []}}} -> {:error, "cloudwatch alarm not found"} + error -> error + end + end + + defp aws_config(config) do + [ + region: config.region, + access_key_id: config.access_key_id, + secret_access_key: config.secret_access_key + ] + |> Enum.reject(fn {_, value} -> value in [nil, ""] end) + end + + defp normalize_dashboard(dashboard) do + Support.item( + dashboard.dashboard_name, + dashboard.dashboard_name, + nil, + dashboard.dashboard_arn, + %{last_modified: dashboard.last_modified, size: dashboard.size} + ) + end + + defp normalize_monitor(alarm) do + Support.item( + alarm.alarm_name, + alarm.alarm_name, + alarm.alarm_description, + alarm.alarm_arn, + alarm + ) + end + + defp empty_to_nil(value) when value in [nil, ""], do: nil + defp empty_to_nil(value), do: value +end diff --git a/lib/console/ai/tools/workbench/observability/external/datadog.ex b/lib/console/ai/tools/workbench/observability/external/datadog.ex new file mode 100644 index 0000000000..f392f939c0 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/datadog.ex @@ -0,0 +1,124 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Datadog do + @moduledoc false + + alias Console.AI.Tools.Workbench.Observability.External.Support + alias Console.Schema.WorkbenchTool + + def list_dashboards( + %WorkbenchTool{configuration: %{datadog: %{} = config}}, + opts + ) do + with :ok <- credentials(config), + :ok <- Support.unsupported_search(opts, "datadog", "dashboard"), + {:ok, offset} <- Support.offset_cursor(opts[:cursor]), + {:ok, %{"dashboards" => dashboards} = result} <- + request(config, "/api/v1/dashboard", + params: %{"count" => opts[:limit], "start" => offset} + ) do + dashboards = Enum.map(dashboards, &normalize_dashboard/1) + total = result["total"] + next_cursor = Support.next_offset_cursor(offset, length(dashboards), total) + {:ok, Support.page(:dashboards, dashboards, opts, total: total, next_cursor: next_cursor)} + end + end + + def get_dashboard( + %WorkbenchTool{configuration: %{datadog: %{} = config}}, + dashboard_id, + _opts + ) do + with :ok <- credentials(config), + {:ok, dashboard} <- + request( + config, + "/api/v1/dashboard/#{Support.encode_path(dashboard_id)}" + ) do + {:ok, normalize_dashboard(dashboard)} + end + end + + def list_monitors( + %WorkbenchTool{configuration: %{datadog: %{} = config}}, + opts + ) do + with :ok <- credentials(config), + {:ok, page} <- Support.offset_cursor(opts[:cursor]), + {:ok, result} <- + request(config, "/api/v1/monitor/search", + params: + Support.params(%{ + "query" => opts[:q], + "page" => page, + "per_page" => opts[:limit] + }) + ) do + monitors = Enum.map(result["monitors"] || [], &normalize_monitor/1) + total = get_in(result, ["metadata", "total_count"]) + next_cursor = Support.next_page_cursor(page, length(monitors), opts[:limit], total) + + {:ok, Support.page(:monitors, monitors, opts, total: total, next_cursor: next_cursor)} + end + end + + def get_monitor( + %WorkbenchTool{configuration: %{datadog: %{} = config}}, + monitor_id, + _opts + ) do + with :ok <- credentials(config), + {:ok, monitor} <- + request( + config, + "/api/v1/monitor/#{Support.encode_path(monitor_id)}" + ) do + {:ok, normalize_monitor(monitor)} + end + end + + defp request(config, path, opts \\ []) do + Req.new( + base_url: api_base(config.site), + headers: %{ + "accept" => "application/json", + "dd-api-key" => config.api_key, + "dd-application-key" => config.app_key + } + ) + |> then(&Support.request(__MODULE__, &1, :get, path, opts)) + end + + defp credentials(%{api_key: api_key, app_key: app_key}) + when is_binary(api_key) and byte_size(api_key) > 0 and is_binary(app_key) and + byte_size(app_key) > 0, + do: :ok + + defp credentials(_), + do: {:error, "datadog access requires API and application keys"} + + defp api_base(site) do + case String.trim(to_string(site || "")) do + "" -> "https://api.datadoghq.com" + site -> "https://api.#{site}" + end + end + + defp normalize_dashboard(dashboard) do + Support.item( + dashboard["id"], + dashboard["title"], + dashboard["description"], + dashboard["url"], + dashboard + ) + end + + defp normalize_monitor(monitor) do + Support.item( + to_string(monitor["id"]), + monitor["name"], + monitor["message"] || monitor["query"], + monitor["url"], + monitor + ) + end +end diff --git a/lib/console/ai/tools/workbench/observability/external/dynatrace.ex b/lib/console/ai/tools/workbench/observability/external/dynatrace.ex new file mode 100644 index 0000000000..2a0eb22d23 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/dynatrace.ex @@ -0,0 +1,150 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Dynatrace do + @moduledoc false + + alias Console.AI.Tools.Workbench.Observability.External.Support + alias Console.Schema.WorkbenchTool + + @monitor_schema_ids "builtin:davis.anomaly-detectors,builtin:anomaly-detection.metric-events" + @monitor_fields "objectId,schemaId,summary,searchSummary,scope,value" + + def list_dashboards(%WorkbenchTool{configuration: %{dynatrace: %{} = config}}, opts) do + with {:ok, %{"documents" => documents} = result} <- + request(config, "/platform/document/v1/documents", + params: + Support.params(%{ + "filter" => dashboard_filter(opts[:q]), + "page-size" => opts[:limit], + "page-key" => opts[:cursor] + }) + ) do + dashboards = Enum.map(documents, &normalize_dashboard/1) + {:ok, Support.page(:dashboards, dashboards, opts, next_cursor: result["nextPageKey"])} + end + end + + def get_dashboard( + %WorkbenchTool{configuration: %{dynatrace: %{} = config}}, + dashboard_id, + _opts + ) do + with {:ok, dashboard} <- + request( + config, + "/platform/document/v1/documents/#{Support.encode_path(dashboard_id)}" + ) do + {:ok, normalize_dashboard(dashboard)} + end + end + + def list_monitors(%WorkbenchTool{configuration: %{dynatrace: %{} = config}}, opts) do + with {:ok, %{"items" => items} = result} <- + request(config, "/platform/classic/environment-api/v2/settings/objects", + params: monitor_params(opts) + ) do + monitors = Enum.map(items, &normalize_monitor/1) + total = result["totalCount"] + + {:ok, + Support.page(:monitors, monitors, opts, + total: total, + next_cursor: result["nextPageKey"] + )} + end + end + + def get_monitor( + %WorkbenchTool{configuration: %{dynatrace: %{} = config}}, + monitor_id, + _opts + ) do + with {:ok, monitor} <- + request( + config, + "/platform/classic/environment-api/v2/settings/objects/#{Support.encode_path(monitor_id)}" + ) do + {:ok, normalize_monitor(monitor)} + end + end + + defp request(config, path, opts \\ []) + + defp request(%{url: url, platform_token: token}, path, opts) + when is_binary(url) and byte_size(url) > 0 and is_binary(token) and + byte_size(token) > 0 do + Req.new( + base_url: String.trim_trailing(url, "/"), + auth: {:bearer, token}, + headers: %{"accept" => "application/json"} + ) + |> then(&Support.request(__MODULE__, &1, :get, path, opts)) + end + + defp request(_, _, _), + do: {:error, "dynatrace access requires a URL and platform token"} + + defp monitor_params(opts) do + case opts[:cursor] do + cursor when cursor in [nil, ""] -> + Support.params(%{ + "schemaIds" => @monitor_schema_ids, + "pageSize" => opts[:limit], + "fields" => @monitor_fields, + "filter" => monitor_filter(opts[:q]) + }) + + cursor -> + %{"nextPageKey" => cursor} + end + end + + defp dashboard_filter(q) when is_binary(q) and byte_size(q) > 0, + do: "type = 'dashboard' and name contains '#{escape_filter(q)}'" + + defp dashboard_filter(_), do: "type = 'dashboard'" + + defp monitor_filter(q) when is_binary(q) and byte_size(q) > 0 do + escaped = escape_filter(q) + "value.title contains '#{escaped}' or value.summary contains '#{escaped}'" + end + + defp monitor_filter(_), do: nil + + defp escape_filter(value) do + value + |> String.replace("\\", "\\\\") + |> String.replace("'", "\\'") + end + + defp normalize_dashboard(document) do + content = + case document["content"] do + content when is_map(content) -> content + content when is_binary(content) -> + case Jason.decode(content) do + {:ok, decoded} -> decoded + _ -> %{"content" => content} + end + _ -> document + end + + Support.item( + document["id"], + document["name"] || content["name"], + document["description"] || content["description"], + nil, + content + ) + end + + defp normalize_monitor(object) do + value = object["value"] || %{} + + Support.item( + object["objectId"], + value["title"] || value["summary"] || object["summary"], + value["description"] || object["searchSummary"], + nil, + object + ) + end +end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/sentry.ex b/lib/console/ai/tools/workbench/observability/external/sentry.ex similarity index 52% rename from lib/console/ai/tools/workbench/observability/external_dashboards/sentry.ex rename to lib/console/ai/tools/workbench/observability/external/sentry.ex index 7e3430d1e9..ad591d6699 100644 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/sentry.ex +++ b/lib/console/ai/tools/workbench/observability/external/sentry.ex @@ -1,10 +1,10 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do +defmodule Console.AI.Tools.Workbench.Observability.External.Sentry do @moduledoc false - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support + alias Console.AI.Tools.Workbench.Observability.External.Support alias Console.Schema.WorkbenchTool - def list( + def list_dashboards( %WorkbenchTool{configuration: %{sentry: %{} = config}}, opts ) do @@ -14,20 +14,18 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do config, "/organizations/#{Support.encode_path(organization)}/dashboards/", params: - %{ + Support.params(%{ "per_page" => opts[:limit], "cursor" => opts[:cursor], "query" => opts[:q] - } - |> Enum.reject(fn {_, value} -> is_nil(value) end) - |> Map.new() + }) ) do - dashboards = Enum.map(response.body, &normalize/1) - {:ok, Support.page(dashboards, opts, next_cursor: next_cursor(response))} + dashboards = Enum.map(response.body, &normalize_dashboard/1) + {:ok, Support.page(:dashboards, dashboards, opts, next_cursor: Support.link_next_cursor(response))} end end - def get( + def get_dashboard( %WorkbenchTool{configuration: %{sentry: %{} = config}}, dashboard_id, opts @@ -38,13 +36,49 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do config, "/organizations/#{Support.encode_path(organization)}/dashboards/#{Support.encode_path(dashboard_id)}/" ) do - {:ok, normalize(dashboard)} + {:ok, normalize_dashboard(dashboard)} + end + end + + def list_monitors( + %WorkbenchTool{configuration: %{sentry: %{} = config}}, + opts + ) do + with {:ok, organization} <- scope(opts), + {:ok, response} <- + request_page( + config, + "/organizations/#{Support.encode_path(organization)}/alert-rules/", + params: + Support.params(%{ + "per_page" => opts[:limit], + "cursor" => opts[:cursor], + "query" => opts[:q] + }) + ) do + monitors = Enum.map(response.body, &normalize_monitor/1) + {:ok, Support.page(:monitors, monitors, opts, next_cursor: Support.link_next_cursor(response))} + end + end + + def get_monitor( + %WorkbenchTool{configuration: %{sentry: %{} = config}}, + monitor_id, + opts + ) do + with {:ok, organization} <- scope(opts), + {:ok, monitor} <- + request( + config, + "/organizations/#{Support.encode_path(organization)}/alert-rules/#{Support.encode_path(monitor_id)}/" + ) do + {:ok, normalize_monitor(monitor)} end end defp scope(opts) do case String.trim(to_string(opts[:scope] || "")) do - "" -> {:error, "sentry dashboard access requires an organization slug in scope"} + "" -> {:error, "sentry access requires an organization slug in scope"} scope -> {:ok, scope} end end @@ -59,7 +93,7 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do |> then(&Support.request(__MODULE__, &1, :get, path)) end - defp request(_, _), do: {:error, "sentry dashboard access requires an access token"} + defp request(_, _), do: {:error, "sentry access requires an access token"} defp request_page(%{access_token: token} = config, path, opts) when is_binary(token) and byte_size(token) > 0 do @@ -72,19 +106,7 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do end defp request_page(_, _, _), - do: {:error, "sentry dashboard access requires an access token"} - - defp next_cursor(response) do - with [link | _] <- Req.Response.get_header(response, "link"), - [_, url] <- Regex.run(~r/<([^>]+)>;\s*rel="next"/, link), - %URI{query: query} when is_binary(query) <- URI.parse(url) do - query - |> URI.decode_query() - |> Map.get("cursor") - else - _ -> nil - end - end + do: {:error, "sentry access requires an access token"} defp api_base(url) do url @@ -104,8 +126,8 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do |> Kernel.<>("/api/0") end - defp normalize(dashboard) do - Support.dashboard( + defp normalize_dashboard(dashboard) do + Support.item( to_string(dashboard["id"]), dashboard["title"], dashboard["description"], @@ -113,4 +135,14 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Sentry do dashboard ) end + + defp normalize_monitor(monitor) do + Support.item( + to_string(monitor["id"]), + monitor["name"], + monitor["query"], + nil, + monitor + ) + end end diff --git a/lib/console/ai/tools/workbench/observability/external/splunk.ex b/lib/console/ai/tools/workbench/observability/external/splunk.ex new file mode 100644 index 0000000000..34b1f41319 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/splunk.ex @@ -0,0 +1,156 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Splunk do + @moduledoc false + + alias Console.AI.Tools.Workbench.Observability.External.Support + alias Console.Schema.WorkbenchTool + + def list_dashboards(%WorkbenchTool{configuration: %{splunk: %{} = config}}, opts) do + with {:ok, offset} <- Support.offset_cursor(opts[:cursor]), + {:ok, %{"entry" => entries} = result} <- + request(config, "/servicesNS/-/-/data/ui/views", + params: + Support.params(%{ + "output_mode" => "json", + "count" => opts[:limit], + "offset" => offset, + "search" => dashboard_search(opts[:q]) + }) + ) do + dashboards = Enum.map(entries, &normalize_dashboard/1) + total = get_in(result, ["paging", "total"]) + next_cursor = Support.next_offset_cursor(offset, length(dashboards), total) + {:ok, Support.page(:dashboards, dashboards, opts, total: total, next_cursor: next_cursor)} + end + end + + def get_dashboard( + %WorkbenchTool{configuration: %{splunk: %{} = config}}, + dashboard_id, + _opts + ) do + with {:ok, %{"entry" => [entry | _]}} <- + request( + config, + "/servicesNS/-/-/data/ui/views/#{Support.encode_path(dashboard_id)}", + params: %{"output_mode" => "json"} + ) do + {:ok, normalize_dashboard(entry)} + else + {:ok, %{"entry" => []}} -> {:error, "splunk dashboard not found"} + error -> error + end + end + + def list_monitors(%WorkbenchTool{configuration: %{splunk: %{} = config}}, opts) do + with {:ok, offset} <- Support.offset_cursor(opts[:cursor]), + {:ok, %{"entry" => entries} = result} <- + request(config, "/servicesNS/-/-/saved/searches", + params: + Support.params(%{ + "output_mode" => "json", + "count" => opts[:limit], + "offset" => offset, + "search" => alert_search(opts[:q]) + }) + ) do + monitors = Enum.map(entries, &normalize_monitor/1) + total = get_in(result, ["paging", "total"]) + next_cursor = Support.next_offset_cursor(offset, length(monitors), total) + {:ok, Support.page(:monitors, monitors, opts, total: total, next_cursor: next_cursor)} + end + end + + def get_monitor( + %WorkbenchTool{configuration: %{splunk: %{} = config}}, + monitor_id, + _opts + ) do + with {:ok, %{"entry" => [entry | _]}} <- + request( + config, + "/servicesNS/-/-/saved/searches/#{Support.encode_path(monitor_id)}", + params: %{"output_mode" => "json"} + ) do + {:ok, normalize_monitor(entry)} + else + {:ok, %{"entry" => []}} -> {:error, "splunk alert not found"} + error -> error + end + end + + defp request(%{url: url} = config, path, opts) + when is_binary(url) and byte_size(url) > 0 do + case auth(config) do + {:ok, auth_headers, auth_opts} -> + Req.new( + [ + base_url: String.trim_trailing(url, "/"), + headers: Map.merge(%{"accept" => "application/json"}, auth_headers) + ] ++ auth_opts + ) + |> then(&Support.request(__MODULE__, &1, :get, path, opts)) + + error -> + error + end + end + + defp request(_, _, _), + do: {:error, "splunk access requires a URL and credentials"} + + defp auth(%{token: token} = config) when is_binary(token) and byte_size(token) > 0, + do: {:ok, %{"authorization" => "#{token_realm(config.token_type)} #{token}"}, []} + + defp auth(%{username: username, password: password}) + when is_binary(username) and byte_size(username) > 0 and is_binary(password) and + byte_size(password) > 0, + do: {:ok, %{}, [auth: {:basic, "#{username}:#{password}"}]} + + defp auth(_), do: {:error, "splunk access requires a token or username and password"} + + defp token_realm(:splunk), do: "Splunk" + defp token_realm(_), do: "Bearer" + + defp dashboard_search(q) when is_binary(q) and byte_size(q) > 0, + do: ~s(name="*#{escape_search(q)}*" OR label="*#{escape_search(q)}*") + + defp dashboard_search(_), do: nil + + defp alert_search(q) when is_binary(q) and byte_size(q) > 0 do + escaped = escape_search(q) + "alert.track=1 AND (name=\"*#{escaped}*\" OR title=\"*#{escaped}*\")" + end + + defp alert_search(_), do: "alert.track=1" + + defp escape_search(value) do + value + |> String.replace("\\", "\\\\") + |> String.replace("\"", "\\\"") + |> String.replace("*", "\\*") + end + + defp normalize_dashboard(entry) do + content = entry["content"] || %{} + + Support.item( + entry["name"], + content["label"] || entry["name"], + content["description"], + entry["links"] && entry["links"]["alternate"], + entry + ) + end + + defp normalize_monitor(entry) do + content = entry["content"] || %{} + + Support.item( + entry["name"], + content["label"] || entry["name"], + content["description"], + entry["links"] && entry["links"]["alternate"], + entry + ) + end +end diff --git a/lib/console/ai/tools/workbench/observability/external/support.ex b/lib/console/ai/tools/workbench/observability/external/support.ex new file mode 100644 index 0000000000..33a33d3190 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external/support.ex @@ -0,0 +1,102 @@ +defmodule Console.AI.Tools.Workbench.Observability.External.Support do + @moduledoc false + + def page(resource, items, opts, pagination \\ []) + when resource in [:dashboards, :monitors] do + %{ + resource => items, + limit: opts[:limit], + next_cursor: pagination[:next_cursor], + total: pagination[:total] + } + end + + def item(id, title, description, url, definition) do + %{ + id: id, + title: title, + description: description, + url: url, + definition: definition + } + end + + def params(map) do + map + |> Enum.reject(fn {_, value} -> is_nil(value) or value == "" end) + |> Map.new() + end + + def next_offset_cursor(offset, count, total) + when is_integer(total) and offset + count < total, + do: Integer.to_string(offset + count) + + def next_offset_cursor(_, _, _), do: nil + + def next_page_cursor(page, count, limit, total \\ nil) + + def next_page_cursor(page, _count, limit, total) + when is_integer(total) and is_integer(limit) and limit > 0 and + (page + 1) * limit < total, + do: Integer.to_string(page + 1) + + def next_page_cursor(page, count, limit, nil) + when is_integer(count) and is_integer(limit) and count >= limit and limit > 0, + do: Integer.to_string(page + 1) + + def next_page_cursor(_, _, _, _), do: nil + + def link_next_cursor(response) do + with [link | _] <- Req.Response.get_header(response, "link"), + [_, url] <- Regex.run(~r/<([^>]+)>;\s*rel="next"/, link), + %URI{query: query} when is_binary(query) <- URI.parse(url) do + URI.decode_query(query) |> Map.get("cursor") + else + _ -> nil + end + end + + def request(module, request, method, path, opts \\ []) do + with {:ok, response} <- request_response(module, request, method, path, opts) do + {:ok, response.body} + end + end + + def request_response(module, request, method, path, opts \\ []) do + request + |> Req.merge(Console.conf(module) || []) + |> Req.request( + [method: method, url: path] + |> Keyword.merge(opts) + ) + |> decode_response() + end + + def encode_path(value), do: URI.encode(value, &URI.char_unreserved?/1) + + def unsupported_search(opts, provider, resource \\ "resource") do + case String.trim(to_string(opts[:q] || "")) do + "" -> :ok + _ -> {:error, "#{provider} does not support server-side #{resource} search"} + end + end + + def offset_cursor(nil), do: {:ok, 0} + def offset_cursor(""), do: {:ok, 0} + + def offset_cursor(cursor) when is_binary(cursor) do + case Integer.parse(cursor) do + {offset, ""} when offset >= 0 -> {:ok, offset} + _ -> {:error, "invalid pagination cursor"} + end + end + + defp decode_response({:ok, %Req.Response{status: status} = response}) + when status in 200..299, + do: {:ok, response} + + defp decode_response({:ok, %Req.Response{status: status, body: body}}), + do: {:error, {:external_observability_api, status, body}} + + defp decode_response({:error, reason}), do: {:error, reason} +end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboard.ex b/lib/console/ai/tools/workbench/observability/external_dashboard.ex index d0c6324b65..6586b3acbb 100644 --- a/lib/console/ai/tools/workbench/observability/external_dashboard.ex +++ b/lib/console/ai/tools/workbench/observability/external_dashboard.ex @@ -1,6 +1,6 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboard do use Console.AI.Tools.Workbench.Base - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Client + alias Console.AI.Tools.Workbench.Observability.External.Client embedded_schema do field :tool, :map, virtual: true @@ -30,7 +30,7 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboard do dashboard_id: dashboard_id, scope: scope }) do - with {:ok, dashboard} <- Client.get(tool, dashboard_id, scope) do + with {:ok, dashboard} <- Client.get_dashboard(tool, dashboard_id, scope) do Jason.encode(dashboard) end end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards.ex b/lib/console/ai/tools/workbench/observability/external_dashboards.ex index b864fb5906..77ee2ce55c 100644 --- a/lib/console/ai/tools/workbench/observability/external_dashboards.ex +++ b/lib/console/ai/tools/workbench/observability/external_dashboards.ex @@ -1,6 +1,6 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards do use Console.AI.Tools.Workbench.Base - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Client + alias Console.AI.Tools.Workbench.Observability.External.Client @default_limit 25 @max_limit 100 @@ -37,7 +37,7 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards do scope: scope, cursor: cursor }) do - with {:ok, dashboards} <- Client.list(tool, q, limit, scope, cursor) do + with {:ok, dashboards} <- Client.list_dashboards(tool, q, limit, scope, cursor) do Jason.encode(dashboards) end end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/azure.ex b/lib/console/ai/tools/workbench/observability/external_dashboards/azure.ex deleted file mode 100644 index 6386091384..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/azure.ex +++ /dev/null @@ -1,105 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Azure do - @moduledoc false - - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support - alias Console.Schema.WorkbenchTool - - @api_version "2020-09-01-preview" - - def list(%WorkbenchTool{configuration: %{azure: %{} = config}}, opts) do - with :ok <- Support.unsupported_search(opts, "azure"), - {:ok, token} <- token(config), - {:ok, path, params} <- page_request(config, opts[:cursor]), - {:ok, %{"value" => dashboards} = result} <- request(token, path, params) do - dashboards = Enum.map(dashboards, &normalize/1) - {:ok, Support.page(dashboards, opts, next_cursor: result["nextLink"])} - end - end - - def get( - %WorkbenchTool{configuration: %{azure: %{} = config}}, - dashboard_id, - _opts - ) do - with {:ok, token} <- token(config), - {:ok, dashboard} <- - request(token, dashboard_path(dashboard_id, config.subscription_id), - params: %{"api-version" => @api_version} - ) do - {:ok, normalize(dashboard)} - end - end - - defp token(%{ - tenant_id: tenant_id, - client_id: client_id, - client_secret: client_secret - }) - when is_binary(tenant_id) and byte_size(tenant_id) > 0 and is_binary(client_id) and - byte_size(client_id) > 0 and is_binary(client_secret) and - byte_size(client_secret) > 0 do - Req.new(base_url: "https://login.microsoftonline.com") - |> then( - &Support.request( - __MODULE__, - &1, - :post, - "/#{Support.encode_path(tenant_id)}/oauth2/v2.0/token", - form: %{ - "client_id" => client_id, - "client_secret" => client_secret, - "grant_type" => "client_credentials", - "scope" => "https://management.azure.com/.default" - } - ) - ) - |> case do - {:ok, %{"access_token" => token}} -> {:ok, token} - {:ok, _} -> {:error, "azure token response did not include an access token"} - error -> error - end - end - - defp token(_), do: {:error, "azure dashboard access requires tenant, client, and secret"} - - defp request(token, path, opts) do - Req.new( - base_url: "https://management.azure.com", - auth: {:bearer, token}, - headers: %{"accept" => "application/json"} - ) - |> then(&Support.request(__MODULE__, &1, :get, path, opts)) - end - - defp dashboard_path("/subscriptions/" <> _ = id, _), do: id - - defp dashboard_path(id, subscription_id), - do: - "/subscriptions/#{Support.encode_path(subscription_id)}/providers/Microsoft.Portal/dashboards/#{Support.encode_path(id)}" - - defp page_request(config, cursor) when cursor in [nil, ""] do - {:ok, - "/subscriptions/#{Support.encode_path(config.subscription_id)}/providers/Microsoft.Portal/dashboards", - [params: %{"api-version" => @api_version}]} - end - - defp page_request(_, cursor) do - case URI.parse(cursor) do - %URI{scheme: "https", host: "management.azure.com", path: path, query: query} -> - {:ok, path <> if(query, do: "?#{query}", else: ""), []} - - _ -> - {:error, "invalid azure dashboard pagination cursor"} - end - end - - defp normalize(dashboard) do - Support.dashboard( - dashboard["id"], - dashboard["name"], - get_in(dashboard, ["tags", "description"]), - nil, - dashboard - ) - end -end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/cloudwatch.ex b/lib/console/ai/tools/workbench/observability/external_dashboards/cloudwatch.ex deleted file mode 100644 index e3ffcf9836..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/cloudwatch.ex +++ /dev/null @@ -1,71 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Cloudwatch do - @moduledoc false - - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support - alias Console.Schema.WorkbenchTool - - def list(%WorkbenchTool{configuration: %{cloudwatch: %{} = config}}, opts) do - operation = - [ - dashboard_name_prefix: opts[:q], - next_token: opts[:cursor] - ] - |> Enum.reject(fn {_, value} -> is_nil(value) end) - |> ExAws.Cloudwatch.list_dashboards() - - with {:ok, %{body: %{dashboards: dashboards, next_token: next_cursor}}} <- - ExAws.request(operation, aws_config(config)) do - dashboards = Enum.map(dashboards, &normalize/1) - {:ok, Support.page(dashboards, opts, next_cursor: empty_to_nil(next_cursor))} - end - end - - def get( - %WorkbenchTool{configuration: %{cloudwatch: %{} = config}}, - dashboard_id, - _opts - ) do - operation = ExAws.Cloudwatch.get_dashboard(dashboard_name: dashboard_id) - - with {:ok, %{body: body}} <- ExAws.request(operation, aws_config(config)) do - definition = - body.dashboard_body - |> Jason.decode() - |> case do - {:ok, definition} -> definition - _ -> %{} - end - - {:ok, - Support.dashboard( - body.dashboard_name, - body.dashboard_name, - nil, - body.dashboard_arn, - definition - )} - end - end - - defp aws_config(config) do - [ - region: config.region, - access_key_id: config.access_key_id, - secret_access_key: config.secret_access_key - ] - |> Enum.reject(fn {_, value} -> value in [nil, ""] end) - end - - defp normalize(dashboard) do - Support.dashboard( - dashboard.dashboard_name, - dashboard.dashboard_name, - nil, - dashboard.dashboard_arn, - %{last_modified: dashboard.last_modified, size: dashboard.size} - ) - end - - defp empty_to_nil(value) when value in [nil, ""], do: nil - defp empty_to_nil(value), do: value -end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/datadog.ex b/lib/console/ai/tools/workbench/observability/external_dashboards/datadog.ex deleted file mode 100644 index 4cfa1ae8a3..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/datadog.ex +++ /dev/null @@ -1,82 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Datadog do - @moduledoc false - - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support - alias Console.Schema.WorkbenchTool - - def list( - %WorkbenchTool{configuration: %{datadog: %{} = config}}, - opts - ) do - with :ok <- credentials(config), - :ok <- Support.unsupported_search(opts, "datadog"), - {:ok, offset} <- Support.offset_cursor(opts[:cursor]), - {:ok, %{"dashboards" => dashboards} = result} <- - request(config, "/api/v1/dashboard", - params: %{"count" => opts[:limit], "start" => offset} - ) do - dashboards = Enum.map(dashboards, &normalize/1) - total = result["total"] - next_cursor = next_cursor(offset, length(dashboards), total) - {:ok, Support.page(dashboards, opts, total: total, next_cursor: next_cursor)} - end - end - - def get( - %WorkbenchTool{configuration: %{datadog: %{} = config}}, - dashboard_id, - _opts - ) do - with :ok <- credentials(config), - {:ok, dashboard} <- - request( - config, - "/api/v1/dashboard/#{Support.encode_path(dashboard_id)}" - ) do - {:ok, normalize(dashboard)} - end - end - - defp request(config, path, opts \\ []) do - Req.new( - base_url: api_base(config.site), - headers: %{ - "accept" => "application/json", - "dd-api-key" => config.api_key, - "dd-application-key" => config.app_key - } - ) - |> then(&Support.request(__MODULE__, &1, :get, path, opts)) - end - - defp credentials(%{api_key: api_key, app_key: app_key}) - when is_binary(api_key) and byte_size(api_key) > 0 and is_binary(app_key) and - byte_size(app_key) > 0, - do: :ok - - defp credentials(_), - do: {:error, "datadog dashboard access requires API and application keys"} - - defp api_base(site) do - case String.trim(to_string(site || "")) do - "" -> "https://api.datadoghq.com" - site -> "https://api.#{site}" - end - end - - defp next_cursor(offset, count, total) - when is_integer(total) and offset + count < total, - do: Integer.to_string(offset + count) - - defp next_cursor(_, _, _), do: nil - - defp normalize(dashboard) do - Support.dashboard( - dashboard["id"], - dashboard["title"], - dashboard["description"], - dashboard["url"], - dashboard - ) - end -end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/dynatrace.ex b/lib/console/ai/tools/workbench/observability/external_dashboards/dynatrace.ex deleted file mode 100644 index 35b6e75241..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/dynatrace.ex +++ /dev/null @@ -1,85 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Dynatrace do - @moduledoc false - - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support - alias Console.Schema.WorkbenchTool - - def list(%WorkbenchTool{configuration: %{dynatrace: %{} = config}}, opts) do - with {:ok, %{"documents" => documents} = result} <- - request(config, "/platform/document/v1/documents", - params: - %{ - "filter" => filter(opts[:q]), - "page-size" => opts[:limit], - "page-key" => opts[:cursor] - } - |> Enum.reject(fn {_, value} -> is_nil(value) end) - |> Map.new() - ) do - dashboards = Enum.map(documents, &normalize/1) - {:ok, Support.page(dashboards, opts, next_cursor: result["nextPageKey"])} - end - end - - def get( - %WorkbenchTool{configuration: %{dynatrace: %{} = config}}, - dashboard_id, - _opts - ) do - with {:ok, dashboard} <- - request( - config, - "/platform/document/v1/documents/#{Support.encode_path(dashboard_id)}" - ) do - {:ok, normalize(dashboard)} - end - end - - defp request(config, path, opts \\ []) - - defp request(%{url: url, platform_token: token}, path, opts) - when is_binary(url) and byte_size(url) > 0 and is_binary(token) and - byte_size(token) > 0 do - Req.new( - base_url: String.trim_trailing(url, "/"), - auth: {:bearer, token}, - headers: %{"accept" => "application/json"} - ) - |> then(&Support.request(__MODULE__, &1, :get, path, opts)) - end - - defp request(_, _, _), - do: {:error, "dynatrace dashboard access requires a URL and platform token"} - - defp filter(q) when is_binary(q) and byte_size(q) > 0, - do: "type = 'dashboard' and name contains '#{escape_filter(q)}'" - - defp filter(_), do: "type = 'dashboard'" - - defp escape_filter(value) do - value - |> String.replace("\\", "\\\\") - |> String.replace("'", "\\'") - end - - defp normalize(document) do - content = - case document["content"] do - content when is_map(content) -> content - content when is_binary(content) -> - case Jason.decode(content) do - {:ok, decoded} -> decoded - _ -> %{"content" => content} - end - _ -> document - end - - Support.dashboard( - document["id"], - document["name"] || content["name"], - document["description"] || content["description"], - nil, - content - ) - end -end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/splunk.ex b/lib/console/ai/tools/workbench/observability/external_dashboards/splunk.ex deleted file mode 100644 index 776845d716..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/splunk.ex +++ /dev/null @@ -1,105 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Splunk do - @moduledoc false - - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support - alias Console.Schema.WorkbenchTool - - def list(%WorkbenchTool{configuration: %{splunk: %{} = config}}, opts) do - with {:ok, offset} <- Support.offset_cursor(opts[:cursor]), - {:ok, %{"entry" => entries} = result} <- - request(config, "/servicesNS/-/-/data/ui/views", - params: - %{ - "output_mode" => "json", - "count" => opts[:limit], - "offset" => offset, - "search" => search(opts[:q]) - } - |> Enum.reject(fn {_, value} -> is_nil(value) end) - |> Map.new() - ) do - dashboards = Enum.map(entries, &normalize/1) - total = get_in(result, ["paging", "total"]) - next_cursor = next_cursor(offset, length(dashboards), total) - {:ok, Support.page(dashboards, opts, total: total, next_cursor: next_cursor)} - end - end - - def get( - %WorkbenchTool{configuration: %{splunk: %{} = config}}, - dashboard_id, - _opts - ) do - with {:ok, %{"entry" => [entry | _]}} <- - request( - config, - "/servicesNS/-/-/data/ui/views/#{Support.encode_path(dashboard_id)}", - params: %{"output_mode" => "json"} - ) do - {:ok, normalize(entry)} - else - {:ok, %{"entry" => []}} -> {:error, "splunk dashboard not found"} - error -> error - end - end - - defp request(%{url: url} = config, path, opts) - when is_binary(url) and byte_size(url) > 0 do - case auth(config) do - {:ok, auth_headers, auth_opts} -> - Req.new( - [ - base_url: String.trim_trailing(url, "/"), - headers: Map.merge(%{"accept" => "application/json"}, auth_headers) - ] ++ auth_opts - ) - |> then(&Support.request(__MODULE__, &1, :get, path, opts)) - - error -> - error - end - end - - defp request(_, _, _), - do: {:error, "splunk dashboard access requires a URL and credentials"} - - defp auth(%{token: token}) when is_binary(token) and byte_size(token) > 0, - do: {:ok, %{"authorization" => "Bearer #{token}"}, []} - - defp auth(%{username: username, password: password}) - when is_binary(username) and byte_size(username) > 0 and is_binary(password) and - byte_size(password) > 0, - do: {:ok, %{}, [auth: {:basic, "#{username}:#{password}"}]} - - defp auth(_), do: {:error, "splunk dashboard access requires a token or username and password"} - - defp search(q) when is_binary(q) and byte_size(q) > 0, - do: ~s(name="*#{escape_search(q)}*" OR label="*#{escape_search(q)}*") - - defp search(_), do: nil - - defp escape_search(value) do - value - |> String.replace("\\", "\\\\") - |> String.replace("\"", "\\\"") - |> String.replace("*", "\\*") - end - - defp next_cursor(offset, count, total) - when is_integer(total) and offset + count < total, - do: Integer.to_string(offset + count) - - defp next_cursor(_, _, _), do: nil - - defp normalize(entry) do - content = entry["content"] || %{} - - Support.dashboard( - entry["name"], - content["label"] || entry["name"], - content["description"], - entry["links"] && entry["links"]["alternate"], - entry - ) - end -end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards/support.ex b/lib/console/ai/tools/workbench/observability/external_dashboards/support.ex deleted file mode 100644 index a895d49027..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards/support.ex +++ /dev/null @@ -1,75 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Support do - @moduledoc false - - def page(dashboards, opts, pagination \\ []) do - %{ - dashboards: dashboards, - limit: opts[:limit], - next_cursor: pagination[:next_cursor], - total: pagination[:total] - } - end - - def dashboard(id, title, description, url, definition) do - %{ - id: id, - title: title, - description: description, - url: url, - definition: definition - } - end - - def decode({:ok, %Req.Response{status: status, body: body}}) - when status in 200..299, - do: {:ok, body} - - def decode({:ok, %Req.Response{status: status, body: body}}), - do: {:error, {:external_dashboard_api, status, body}} - - def decode({:error, reason}), do: {:error, reason} - - def request(module, request, method, path, opts \\ []) do - with {:ok, response} <- request_response(module, request, method, path, opts) do - {:ok, response.body} - end - end - - def request_response(module, request, method, path, opts \\ []) do - request - |> Req.merge(Console.conf(module) || []) - |> Req.request( - [method: method, url: path] - |> Keyword.merge(opts) - ) - |> decode_response() - end - - def encode_path(value), do: URI.encode(value, &URI.char_unreserved?/1) - - def unsupported_search(opts, provider) do - case String.trim(to_string(opts[:q] || "")) do - "" -> :ok - _ -> {:error, "#{provider} does not support server-side dashboard search"} - end - end - - def offset_cursor(nil), do: {:ok, 0} - def offset_cursor(""), do: {:ok, 0} - - def offset_cursor(cursor) when is_binary(cursor) do - case Integer.parse(cursor) do - {offset, ""} when offset >= 0 -> {:ok, offset} - _ -> {:error, "invalid dashboard pagination cursor"} - end - end - - defp decode_response({:ok, %Req.Response{status: status} = response}) - when status in 200..299, - do: {:ok, response} - - defp decode_response({:ok, %Req.Response{status: status, body: body}}), - do: {:error, {:external_dashboard_api, status, body}} - - defp decode_response({:error, reason}), do: {:error, reason} -end diff --git a/lib/console/ai/tools/workbench/observability/external_dashboards_client.ex b/lib/console/ai/tools/workbench/observability/external_dashboards_client.ex deleted file mode 100644 index 16b2e9eabd..0000000000 --- a/lib/console/ai/tools/workbench/observability/external_dashboards_client.ex +++ /dev/null @@ -1,48 +0,0 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboards.Client do - @moduledoc false - - alias Console.Schema.WorkbenchTool - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.{ - Azure, - Cloudwatch, - Datadog, - Dynatrace, - Sentry, - Splunk - } - - @providers %{ - azure: Azure, - cloudwatch: Cloudwatch, - datadog: Datadog, - dynatrace: Dynatrace, - sentry: Sentry, - splunk: Splunk - } - - def supports?(%WorkbenchTool{tool: tool}), do: Map.has_key?(@providers, tool) - - def list(%WorkbenchTool{} = tool, q, limit, scope \\ nil, cursor \\ nil) do - with {:ok, provider} <- provider(tool) do - provider.list(tool, - q: q, - limit: limit, - scope: scope, - cursor: cursor - ) - end - end - - def get(%WorkbenchTool{} = tool, dashboard_id, scope \\ nil) do - with {:ok, provider} <- provider(tool) do - provider.get(tool, dashboard_id, scope: scope) - end - end - - defp provider(%WorkbenchTool{tool: tool}) do - case Map.fetch(@providers, tool) do - {:ok, provider} -> {:ok, provider} - :error -> {:error, "external dashboards are not supported for this tool"} - end - end -end diff --git a/lib/console/ai/tools/workbench/observability/external_monitor.ex b/lib/console/ai/tools/workbench/observability/external_monitor.ex new file mode 100644 index 0000000000..e36393e645 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external_monitor.ex @@ -0,0 +1,37 @@ +defmodule Console.AI.Tools.Workbench.Observability.ExternalMonitor do + use Console.AI.Tools.Workbench.Base + alias Console.AI.Tools.Workbench.Observability.External.Client + + embedded_schema do + field :tool, :map, virtual: true + field :monitor_id, :string + field :scope, :string + end + + @json_schema Console.priv_file!("tools/workbench/observability/external_monitor.json") + |> Jason.decode!() + + def name(%__MODULE__{tool: %{name: name}}), + do: "workbench_observability_monitor_#{name}" + + def json_schema(_), do: @json_schema + + def description(%__MODULE__{tool: %{name: name}}), + do: "Fetch one external monitor or alert rule from the #{name} observability connection, including its full provider definition, so it can be reinterpreted as a Plural monitor." + + def changeset(model, attrs) do + model + |> cast(attrs, [:monitor_id, :scope]) + |> validate_required([:monitor_id]) + end + + def implement(%__MODULE__{ + tool: tool, + monitor_id: monitor_id, + scope: scope + }) do + with {:ok, monitor} <- Client.get_monitor(tool, monitor_id, scope) do + Jason.encode(monitor) + end + end +end diff --git a/lib/console/ai/tools/workbench/observability/external_monitors.ex b/lib/console/ai/tools/workbench/observability/external_monitors.ex new file mode 100644 index 0000000000..add2a736e6 --- /dev/null +++ b/lib/console/ai/tools/workbench/observability/external_monitors.ex @@ -0,0 +1,44 @@ +defmodule Console.AI.Tools.Workbench.Observability.ExternalMonitors do + use Console.AI.Tools.Workbench.Base + alias Console.AI.Tools.Workbench.Observability.External.Client + + @default_limit 25 + @max_limit 100 + + embedded_schema do + field :tool, :map, virtual: true + field :q, :string + field :limit, :integer, default: @default_limit + field :scope, :string + field :cursor, :string + end + + @json_schema Console.priv_file!("tools/workbench/observability/external_monitors.json") + |> Jason.decode!() + + def name(%__MODULE__{tool: %{name: name}}), + do: "workbench_observability_monitors_#{name}" + + def json_schema(_), do: @json_schema + + def description(%__MODULE__{tool: %{name: name}}), + do: "Search external monitors and alert rules from the #{name} observability connection in pages of up to #{@max_limit} for inspection or reinterpretation as Plural monitors." + + def changeset(model, attrs) do + model + |> cast(attrs, [:q, :limit, :scope, :cursor]) + |> validate_number(:limit, greater_than: 0, less_than_or_equal_to: @max_limit) + end + + def implement(%__MODULE__{ + tool: tool, + q: q, + limit: limit, + scope: scope, + cursor: cursor + }) do + with {:ok, monitors} <- Client.list_monitors(tool, q, limit, scope, cursor) do + Jason.encode(monitors) + end + end +end diff --git a/lib/console/ai/tools/workbench/observability/log_aggregate.ex b/lib/console/ai/tools/workbench/observability/log_aggregate.ex index 6c97c3f74a..319f402c5a 100644 --- a/lib/console/ai/tools/workbench/observability/log_aggregate.ex +++ b/lib/console/ai/tools/workbench/observability/log_aggregate.ex @@ -18,7 +18,7 @@ defmodule Console.AI.Tools.Workbench.Observability.LogAggregate do field :tool, :map, virtual: true field :query, :string field :bucket_size, :string - field :operator, Console.Schema.Monitor.Operator, default: :and + field :operator, Console.Schema.Monitor.Operator, default: :or embeds_one :options, Options, on_replace: :update, primary_key: false do embeds_one :azure, Azure, on_replace: :update, primary_key: false do @@ -43,15 +43,16 @@ defmodule Console.AI.Tools.Workbench.Observability.LogAggregate do def name(%__MODULE__{tool: %{name: name}}), do: "workbench_observability_log_aggregate_#{name}" def description(%__MODULE__{tool: %{name: name} = tool}), - do: String.trim("Aggregate log counts from the #{name} observability connection. #{Metrics.provider_hint(tool)}") + do: String.trim("Aggregate log counts from the #{name} observability connection. Leave the query empty to aggregate logs without a text filter. #{Metrics.provider_hint(tool)}#{query_hint(tool)}#{facet_hint(tool)}") def changeset(model, attrs) do model |> cast(attrs, @valid) |> cast_embed(:options, with: &options_changeset/2) |> cast_embed(:time_range) + |> TimeRange.put_default() |> cast_embed(:facets, with: &facet_changeset/2) - |> validate_required([:query, :bucket_size]) + |> validate_required([:bucket_size]) end def implement(%__MODULE__{} = tool) do @@ -63,7 +64,7 @@ defmodule Console.AI.Tools.Workbench.Observability.LogAggregate do def structured(%__MODULE__{} = tool) do with {:ok, conn} <- Client.connect(), - {:ok, input} <- input(Map.put_new(tool, :time_range, TimeRange.default())), + {:ok, input} <- input(TimeRange.ensure(tool)), {:ok, %LogAggregateOutput{} = output} <- Stub.log_aggregate(conn, input, Client.logs_rpc_opts()) do {:ok, Enum.map(output.buckets, &to_bucket/1)} @@ -85,7 +86,7 @@ defmodule Console.AI.Tools.Workbench.Observability.LogAggregate do {:ok, %LogAggregateInput{ connection: connection, - query: query, + query: query || "", range: TimeRange.to_proto(time_range), bucket_size: bucket_size, facets: to_facets(facets), @@ -128,6 +129,13 @@ defmodule Console.AI.Tools.Workbench.Observability.LogAggregate do defp logs_options(_, _), do: nil + defp query_hint(%{tool: :elastic}), do: " Elasticsearch analyzes the query against the \"message\" field only. Terms use the selected operator, which defaults to OR. Use an empty query or \"*\" to match all log messages." + defp query_hint(%{tool: :loki}), do: " An empty query uses the supplied facets as the LogQL stream selector. Without facets, it defaults to `{job=~\".+\"}`, so only streams with a nonempty `job` label are returned." + defp query_hint(_), do: "" + + defp facet_hint(%{tool: :elastic}), do: " Facets are exact-match term filters and are combined with AND. Use the mapped field name, typically a keyword field such as \"cluster.name.keyword\" or \"kubernetes.namespace.keyword\"." + defp facet_hint(_), do: "" + defp blank_to_nil(value) do case String.trim(to_string(value || "")) do "" -> nil diff --git a/lib/console/ai/tools/workbench/observability/logs.ex b/lib/console/ai/tools/workbench/observability/logs.ex index dc02f58e81..a79f553402 100644 --- a/lib/console/ai/tools/workbench/observability/logs.ex +++ b/lib/console/ai/tools/workbench/observability/logs.ex @@ -40,15 +40,16 @@ defmodule Console.AI.Tools.Workbench.Observability.Logs do def json_schema(%{tool: %{tool: :azure}}), do: @azure_schema def json_schema(_), do: @default_schema def name(%__MODULE__{tool: %{name: n}}), do: "workbench_observability_logs_#{n}" - def description(%__MODULE__{tool: %{name: n} = t}), do: String.trim("Gather logs from the #{n} observability connection. #{Metrics.provider_hint(t)}#{facet_hint(t)}") + def description(%__MODULE__{tool: %{name: n} = t}), + do: String.trim("Gather logs from the #{n} observability connection. Leave the query empty to page logs without a text filter. #{Metrics.provider_hint(t)}#{query_hint(t)}#{facet_hint(t)}") def changeset(model, attrs) do model |> cast(attrs, @valid) |> cast_embed(:options, with: &options_changeset/2) |> cast_embed(:time_range) + |> TimeRange.put_default() |> cast_embed(:facets, with: &facet_changeset/2) - |> validate_required([:query]) end defp options_changeset(model, attrs) do @@ -71,7 +72,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Logs do def implement(%__MODULE__{} = tool) do with {:ok, conn} <- Client.connect(), - {:ok, input} <- input(Map.put_new(tool, :time_range, TimeRange.default())), + {:ok, input} <- input(TimeRange.ensure(tool)), {:ok, %LogsQueryOutput{} = output} <- Stub.logs(conn, input, Client.logs_rpc_opts()), {:ok, content} <- Protobuf.JSON.encode(output) do {:ok, %{content: Output.truncate(content), logs: Enum.map(Enum.take(output.logs, @log_limit), &to_log/1)}} @@ -80,7 +81,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Logs do def structured(%__MODULE__{} = tool) do with {:ok, conn} <- Client.connect(), - {:ok, input} <- input(Map.put_new(tool, :time_range, TimeRange.default())), + {:ok, input} <- input(TimeRange.ensure(tool)), {:ok, %LogsQueryOutput{} = output} <- Stub.logs(conn, input, Client.logs_rpc_opts()) do {:ok, Enum.map(output.logs, &to_log/1)} end @@ -98,7 +99,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Logs do with {:ok, connection} <- Conversion.to_proto(tool) do {:ok, %LogsQueryInput{ connection: connection, - query: q, + query: q || "", limit: l, facets: to_facets(fs), range: TimeRange.to_proto(tr), @@ -121,9 +122,14 @@ defmodule Console.AI.Tools.Workbench.Observability.Logs do defp facet_hint(%{tool: :datadog}), do: " This tool supports facets for filtering logs, which will be appended to the query as \"{facet-name}:{facet-value}\" (space-separated AND conditions)." defp facet_hint(%{tool: :splunk}), do: " This tool supports facets for filtering logs, which will be appended to the first search stage as \"{facet-name}=\"{facet-value}\"\"." defp facet_hint(%{tool: :loki}), do: " This tool supports facets for filtering logs, which will be merged into the LogQL label selector as \"{facet-name}=\"{facet-value}\"\"." - defp facet_hint(%{tool: :elastic}), do: " This tool supports facets for filtering logs, which will be applied as exact-match term filters on the \"{facet-name}\" field." + defp facet_hint(%{tool: :victoria_logs}), do: " This tool supports facets for filtering logs, which will be appended to the LogsQL query as \"{facet-name}:=\"{facet-value}\"\"." + defp facet_hint(%{tool: :elastic}), do: " Facets are exact-match term filters and are combined with AND. Use the mapped field name, typically a keyword field such as \"cluster.name.keyword\" or \"kubernetes.namespace.keyword\"." defp facet_hint(_), do: " Facets are not supported for this tool." + defp query_hint(%{tool: :elastic}), do: " Elasticsearch analyzes the query against the \"message\" field only and combines its terms with OR. Use an empty query or \"*\" to match all log messages." + defp query_hint(%{tool: :loki}), do: " An empty query uses the supplied facets as the LogQL stream selector. Without facets, it defaults to `{job=~\".+\"}`, so only streams with a nonempty `job` label are returned." + defp query_hint(_), do: "" + defp blank_to_nil(v) do case String.trim(to_string(v || "")) do "" -> nil diff --git a/lib/console/ai/tools/workbench/observability/metrics.ex b/lib/console/ai/tools/workbench/observability/metrics.ex index d3d7ad8df9..a2ca846317 100644 --- a/lib/console/ai/tools/workbench/observability/metrics.ex +++ b/lib/console/ai/tools/workbench/observability/metrics.ex @@ -45,6 +45,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Metrics do |> cast(attrs, @valid) |> cast_embed(:options, with: &options_changeset/2) |> cast_embed(:time_range) + |> TimeRange.put_default() |> validate_required([:query]) end @@ -61,7 +62,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Metrics do @metric_limit 500 def implement(%__MODULE__{} = tool) do - tool = Map.put_new(tool, :time_range, TimeRange.default()) + tool = TimeRange.ensure(tool) with :ok <- TimeRange.safe(tool.time_range), {:ok, conn} <- Client.connect(), {:ok, input} <- input(tool), @@ -73,7 +74,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Metrics do def structured(%__MODULE__{} = tool) do with {:ok, conn} <- Client.connect(), - {:ok, input} <- input(Map.put_new(tool, :time_range, TimeRange.default())), + {:ok, input} <- input(TimeRange.ensure(tool)), {:ok, %MetricsQueryOutput{} = output} <- Stub.metrics(conn, input, Client.metrics_rpc_opts()) do {:ok, Enum.map(output.metrics, &mapify/1)} end @@ -120,7 +121,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Metrics do def azure_opts(%{azure: %{} = az}), do: az def azure_opts(_), do: %{} - @known_providers ~w(prometheus cloudwatch datadog elastic loki splunk tempo dynatrace newrelic)a + @known_providers ~w(prometheus cloudwatch datadog elastic loki victoria_logs splunk tempo dynatrace newrelic)a def provider_hint(%Console.Schema.WorkbenchTool{tool: type}) when type in @known_providers, do: "This tool is configured against #{type}, and so you should be able to use its documented query format as needed." diff --git a/lib/console/ai/tools/workbench/observability/plrl_logs.ex b/lib/console/ai/tools/workbench/observability/plrl_logs.ex index 902774e35a..f8c8be7d77 100644 --- a/lib/console/ai/tools/workbench/observability/plrl_logs.ex +++ b/lib/console/ai/tools/workbench/observability/plrl_logs.ex @@ -33,6 +33,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Plrl.Logs do model |> cast(attrs, @valid) |> cast_embed(:time_range) + |> TimeRange.put_default() |> cast_embed(:facets, with: &facet_changeset/2) |> validate_one_present([:service_id, :cluster_id]) end @@ -83,5 +84,9 @@ defmodule Console.AI.Tools.Workbench.Observability.Plrl.Logs do defp to_time(%{start: %{} = start_ts, end: %{} = end_ts}) do %Time{before: end_ts, after: start_ts} end - defp to_time(_), do: %Time{before: Timex.now(), after: Timex.now() |> Timex.shift(minutes: -30)} + + defp to_time(_) do + %{start: start_ts, end: end_ts} = TimeRange.default() + %Time{before: end_ts, after: start_ts} + end end diff --git a/lib/console/ai/tools/workbench/observability/plrl_logs_aggregate.ex b/lib/console/ai/tools/workbench/observability/plrl_logs_aggregate.ex index c97bed11d5..a1a8438237 100644 --- a/lib/console/ai/tools/workbench/observability/plrl_logs_aggregate.ex +++ b/lib/console/ai/tools/workbench/observability/plrl_logs_aggregate.ex @@ -36,6 +36,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Plrl.LogsAggregate do model |> cast(attrs, @valid) |> cast_embed(:time_range) + |> TimeRange.put_default() |> cast_embed(:facets, with: &facet_changeset/2) |> validate_one_present([:service_id, :cluster_id]) |> validate_required([:query, :bucket_size]) diff --git a/lib/console/ai/tools/workbench/observability/plrl_logs_labels.ex b/lib/console/ai/tools/workbench/observability/plrl_logs_labels.ex index e529ba9235..eda8939303 100644 --- a/lib/console/ai/tools/workbench/observability/plrl_logs_labels.ex +++ b/lib/console/ai/tools/workbench/observability/plrl_logs_labels.ex @@ -35,6 +35,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Plrl.LogLabels do model |> cast(attrs, @valid) |> cast_embed(:time_range) + |> TimeRange.put_default() |> cast_embed(:facets, with: &facet_changeset/2) |> validate_one_present([:service_id, :cluster_id]) end diff --git a/lib/console/ai/tools/workbench/observability/plrl_metrics.ex b/lib/console/ai/tools/workbench/observability/plrl_metrics.ex index 3bf87b353d..47e678d00d 100644 --- a/lib/console/ai/tools/workbench/observability/plrl_metrics.ex +++ b/lib/console/ai/tools/workbench/observability/plrl_metrics.ex @@ -24,6 +24,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Plrl.Metrics do model |> cast(attrs, @valid) |> cast_embed(:time_range) + |> TimeRange.put_default() |> validate_required([:query]) end diff --git a/lib/console/ai/tools/workbench/observability/time_range.ex b/lib/console/ai/tools/workbench/observability/time_range.ex index 377411ef77..ed86ed767e 100644 --- a/lib/console/ai/tools/workbench/observability/time_range.ex +++ b/lib/console/ai/tools/workbench/observability/time_range.ex @@ -8,21 +8,34 @@ defmodule Console.AI.Tools.Workbench.Observability.TimeRange do end @valid ~w(start end)a + @default_lookback_minutes 60 + + def default(past \\ @default_lookback_minutes) do + now = Timex.now() - def default(past \\ 30) do %__MODULE__{ - start: Timex.now() |> Timex.shift(minutes: -past), - end: Timex.now(), + start: Timex.shift(now, minutes: -past), + end: now, } end def changeset(model, attrs) do model |> cast(attrs, @valid) - |> put_new_change(:start, fn -> Timex.now() |> Timex.shift(minutes: -30) end) + |> put_new_change(:start, fn -> Timex.now() |> Timex.shift(minutes: -@default_lookback_minutes) end) |> put_new_change(:end, fn -> Timex.now() end) end + def put_default(changeset) do + case get_field(changeset, :time_range) do + nil -> put_embed(changeset, :time_range, default()) + _ -> changeset + end + end + + def ensure(%{time_range: nil} = tool), do: Map.put(tool, :time_range, default()) + def ensure(tool), do: tool + def safe(%__MODULE__{start: s_ts, end: e_ts}, days \\ 7) do case Timex.diff(e_ts, s_ts, :days) < days do true -> :ok diff --git a/lib/console/ai/tools/workbench/observability/traces.ex b/lib/console/ai/tools/workbench/observability/traces.ex index 6651df96d3..0c49a6d827 100644 --- a/lib/console/ai/tools/workbench/observability/traces.ex +++ b/lib/console/ai/tools/workbench/observability/traces.ex @@ -49,6 +49,7 @@ defmodule Console.AI.Tools.Workbench.Observability.Traces do model |> cast(attrs, @valid) |> cast_embed(:time_range) + |> TimeRange.put_default() |> cast_embed(:options, with: &options_changeset/2) |> validate_required([:query]) end @@ -72,6 +73,8 @@ defmodule Console.AI.Tools.Workbench.Observability.Traces do end def implement(%__MODULE__{} = tool) do + tool = TimeRange.ensure(tool) + with {:ok, conn} <- Client.connect(), {:ok, input} <- input(tool), {:ok, %TracesQueryOutput{} = output} <- Stub.traces(conn, input, Client.cloud_query_rpc_opts()), @@ -81,6 +84,8 @@ defmodule Console.AI.Tools.Workbench.Observability.Traces do end def structured(%__MODULE__{} = tool) do + tool = TimeRange.ensure(tool) + with {:ok, conn} <- Client.connect(), {:ok, input} <- input(tool), {:ok, %TracesQueryOutput{} = output} <- Stub.traces(conn, input, Client.cloud_query_rpc_opts()) do diff --git a/lib/console/ai/tools/workbench/observability_result.ex b/lib/console/ai/tools/workbench/observability_result.ex index 2d0d3f80c3..9d8d908c72 100644 --- a/lib/console/ai/tools/workbench/observability_result.ex +++ b/lib/console/ai/tools/workbench/observability_result.ex @@ -1,9 +1,13 @@ defmodule Console.AI.Tools.Workbench.ObservabilityResult do use Console.AI.Tools.Workbench.Base alias Console.Schema.WorkbenchJobActivity + alias Console.Schema.{User, WorkbenchJob} alias Console.Schema.WorkbenchJobResult.ToolQuery + alias Console.AI.Workbench.Toolchain embedded_schema do + field :job, :map, virtual: true + field :user, :map, virtual: true field :output, :string embeds_one :metrics_query, ToolQuery, on_replace: :update @@ -19,10 +23,13 @@ defmodule Console.AI.Tools.Workbench.ObservabilityResult do @json_schema Console.priv_file!("tools/workbench/observability_result.json") |> Jason.decode!() def name(), do: "observability_result" + def name(_), do: name() def json_schema(), do: @json_schema + def json_schema(_), do: json_schema() def description() do "Complete the observability subagent session. The output's first line must specifically describe the work completed or the outcome reached, without a generic heading such as \"Conclusion\" or \"Result\". The remaining output should thoroughly summarize the work done in response to the original prompt so any future agent can understand it without reviewing this session." end + def description(_), do: description() def changeset(model, attrs) do model @@ -37,5 +44,7 @@ defmodule Console.AI.Tools.Workbench.ObservabilityResult do |> validate_required([:output]) end - def implement(%__MODULE__{} = model), do: {:ok, model} + def implement(%__MODULE__{job: %WorkbenchJob{} = job, user: %User{} = user} = model) do + with :ok <- Toolchain.validate_result(job, model, user), do: {:ok, model} + end end diff --git a/lib/console/ai/workbench/conversion.ex b/lib/console/ai/workbench/conversion.ex index 39743e7fd3..799b4229a2 100644 --- a/lib/console/ai/workbench/conversion.ex +++ b/lib/console/ai/workbench/conversion.ex @@ -5,6 +5,7 @@ defmodule Console.AI.Workbench.Conversion do DatadogConnection, PrometheusConnection, LokiConnection, + VictoriaLogsConnection, SplunkConnection, TempoConnection, JaegerConnection, @@ -56,11 +57,25 @@ defmodule Console.AI.Workbench.Conversion do }} end + def to_proto(%WorkbenchTool{tool: :victoria_logs, configuration: %{victoria_logs: %{} = victoria_logs}}) do + {:ok, %ToolConnection{ + connection: {:victoria_logs, %VictoriaLogsConnection{ + url: victoria_logs.url, + token: victoria_logs.token, + username: victoria_logs.username, + password: victoria_logs.password, + account_id: victoria_logs.account_id, + project_id: victoria_logs.project_id, + }} + }} + end + def to_proto(%WorkbenchTool{tool: :splunk, configuration: %{splunk: %{} = splunk}}) do {:ok, %ToolConnection{ connection: {:splunk, %SplunkConnection{ url: splunk.url, token: splunk.token, + token_type: splunk_token_type(splunk.token_type), username: splunk.username, password: splunk.password, }} @@ -150,4 +165,7 @@ defmodule Console.AI.Workbench.Conversion do end def to_proto(_), do: {:error, "No tool connection found"} + + defp splunk_token_type(:splunk), do: :SPLUNK + defp splunk_token_type(_), do: :BEARER end diff --git a/lib/console/ai/workbench/engine.ex b/lib/console/ai/workbench/engine.ex index 4ce9f110e5..419ceb70f1 100644 --- a/lib/console/ai/workbench/engine.ex +++ b/lib/console/ai/workbench/engine.ex @@ -395,7 +395,7 @@ defmodule Console.AI.Workbench.Engine do %FetchNotes{job: job}, %Codemode{tools: []}, Notes, - Complete, + %Complete{job: job, user: env.user}, ] ++ type_tools(job) ++ function_tools(env) ++ kube_tools(job) diff --git a/lib/console/ai/workbench/subagents/infrastructure.ex b/lib/console/ai/workbench/subagents/infrastructure.ex index 36702fdc38..19bb0a6474 100644 --- a/lib/console/ai/workbench/subagents/infrastructure.ex +++ b/lib/console/ai/workbench/subagents/infrastructure.ex @@ -7,6 +7,8 @@ defmodule Console.AI.Workbench.Subagents.Infrastructure do Scratchpad, History, Codemode, + Infrastructure.ApiDiscovery, + Infrastructure.ApiSpec, Infrastructure.RawKubeGet, Infrastructure.RawKubeList, Infrastructure.Cluster, @@ -109,6 +111,8 @@ defmodule Console.AI.Workbench.Subagents.Infrastructure do defp k8s_tools(%Workbench{configuration: %{infrastructure: %{kubernetes: true}}}, %User{} = user) do [ SummarizeComponent, + %ApiDiscovery{user: user}, + %ApiSpec{user: user}, %RawKubeGet{user: user}, %RawKubeList{user: user} ] diff --git a/lib/console/ai/workbench/subagents/observability.ex b/lib/console/ai/workbench/subagents/observability.ex index c7b8af674d..0d7a45a734 100644 --- a/lib/console/ai/workbench/subagents/observability.ex +++ b/lib/console/ai/workbench/subagents/observability.ex @@ -18,23 +18,26 @@ defmodule Console.AI.Workbench.Subagents.Observability do acc: %{}, callback: &callback(activity, environment, &1), tool_search: length(tools) > 10, - pre_enable: [ObservabilityResult | skill_knowledge_pre_enable()], + pre_enable: [%ObservabilityResult{} | skill_knowledge_pre_enable()], continue_msg: "looks like we aren't done, let's continue and if you're done just call observability_result to wrap up" ] ) - |> MemoryEngine.reduce([{:user, prompt}], &reducer/2) + |> MemoryEngine.reduce([{:user, prompt}], &reducer(&1, &2, environment)) |> case do {:ok, attrs} -> attrs {:error, error} -> %{status: :failed, result: %{error: "error running observability subagent: #{inspect(error)}"}} end end - defp reducer(messages, _) do + defp reducer(messages, _, %Environment{}) do case Enum.find(messages, &match?(%ObservabilityResult{}, &1)) do - %ObservabilityResult{} = result -> {:halt, %{ - status: :successful, - result: Console.mapify(result) |> Map.drop([:id]) - }} + %ObservabilityResult{} = result -> + {:halt, + %{ + status: :successful, + result: Console.mapify(result) |> Map.drop([:id, :job, :user]) + }} + _ -> last_message(messages, & {:cont, %{status: :failed, result: %{error: &1}}}) end end @@ -49,7 +52,7 @@ defmodule Console.AI.Workbench.Subagents.Observability do |> Enum.concat(Monitoring.read_tools(job)) |> Enum.concat(skill_knowledge_tools(job, skills) ++ [ Scratchpad, - ObservabilityResult, + %ObservabilityResult{job: job, user: user}, %Codemode{tools: []}, %History{job: job, activities: activities} ]) diff --git a/lib/console/ai/workbench/toolchain.ex b/lib/console/ai/workbench/toolchain.ex index c8743832e0..9f6d8711e6 100644 --- a/lib/console/ai/workbench/toolchain.ex +++ b/lib/console/ai/workbench/toolchain.ex @@ -35,7 +35,52 @@ defmodule Console.AI.Workbench.Toolchain do def labels(%Workbench{} = workbench, name, args, %User{} = user), do: execute(workbench, name, args, user, @label_tools) + @doc "Validates that a named tool exists, accepts the arguments, and supports the requested query type." + def validate(resource, type, name, args, %User{} = user) + when (is_struct(resource, WorkbenchJob) or is_struct(resource, Workbench)) and + type in [:metrics, :logs, :log_aggregate, :traces, :labels] do + validate_call(resource, name, args, user, allowed_tools(type)) + end + + def validate_all(resource, queries, %User{} = user) + when (is_struct(resource, WorkbenchJob) or is_struct(resource, Workbench)) and is_list(queries) do + Enum.reduce_while(queries, :ok, fn {type, name, args}, :ok -> + case validate(resource, type, name, args, user) do + {:ok, _} -> {:cont, :ok} + {:error, _} = error -> {:halt, error} + end + end) + end + + @doc "Validates the persisted observability queries attached to a subagent or workbench result." + def validate_result(resource, result, %User{} = user) + when is_map(result) do + validate_all(resource, result_queries(result), user) + end + + defp result_queries(result) do + [ + {:metrics, [Map.get(result, :metrics_query) | Map.get(result, :metrics_queries, [])]}, + {:logs, Map.get(result, :logs_queries, [])}, + {:traces, [Map.get(result, :traces_query) | Map.get(result, :traces_queries, [])]} + ] + |> Enum.flat_map(fn {type, queries} -> + Enum.flat_map(queries, fn + nil -> [] + query -> [{type, query.tool_name, query.tool_args || %{}}] + end) + end) + end + defp execute(resource, name, args, user, allowed) do + with {:ok, %mod{} = tool} <- validate_call(resource, name, args, user, allowed) do + tool + |> mod.structured() + |> normalize_error() + end + end + + defp validate_call(resource, name, args, user, allowed) do {tools, environment} = execution(resource, user) Tool.context(user: Rbac.preload(user), job: environment.job) @@ -43,14 +88,20 @@ defmodule Console.AI.Workbench.Toolchain do {:ok, tool} <- Tool.policy(tool, args, environment.policies), {:ok, %mod{} = t} <- Tool.validate(tool, args), true <- mod in allowed do - mod.structured(t) + {:ok, t} else {:error, err} -> {:error, "failed to call tool: #{name}, result: #{inspect(err)}"} - nil -> {:error, "tool not found"} - _ -> {:error, "tool not valid for querying on the fly"} + nil -> {:error, "tool #{name} not found"} + _ -> {:error, "tool #{name} not valid for querying on the fly"} end end + defp allowed_tools(:metrics), do: @metrics_tools + defp allowed_tools(:logs), do: @logs_tools + defp allowed_tools(:log_aggregate), do: @log_aggregate_tools + defp allowed_tools(:traces), do: @traces_tools + defp allowed_tools(:labels), do: @label_tools + defp execution(%WorkbenchJob{} = job, user) do environment = env(job) {Subagents.Observability.tools(environment, user), environment} @@ -67,4 +118,9 @@ defmodule Console.AI.Workbench.Toolchain do job = Repo.preload(job, [workbench: [tools: :mcp_server]]) Environment.new(job, job.workbench.tools, []) end + + defp normalize_error({:error, %GRPC.RPCError{message: message}}) when is_binary(message), + do: {:error, message} + + defp normalize_error(result), do: result end diff --git a/lib/console/ai/workbench/tools.ex b/lib/console/ai/workbench/tools.ex index c1d76ebb1d..4bec4acad3 100644 --- a/lib/console/ai/workbench/tools.ex +++ b/lib/console/ai/workbench/tools.ex @@ -16,6 +16,8 @@ defmodule Console.AI.Workbench.Tools do LogAggregate, ExternalDashboard, ExternalDashboards, + ExternalMonitor, + ExternalMonitors, Traces } alias Console.AI.Tools.Workbench.Infrastructure.{CloudSchemas, RawCloudQuery, CloudTables} @@ -121,10 +123,10 @@ defmodule Console.AI.Workbench.Tools do end) |> Enum.flat_map(fn %WorkbenchTool{tool: :sentry} = tool -> - Sentry.Tools.expand(tool) ++ external_dashboard_tools(tool) + Sentry.Tools.expand(tool) ++ external_observability_tools(tool) %WorkbenchTool{categories: [_ | _] = categories} = tool -> Enum.flat_map(categories, &obs_category_tools(tool, &1)) ++ - external_dashboard_tools(tool) + external_observability_tools(tool) _ -> [] end) end @@ -175,11 +177,16 @@ defmodule Console.AI.Workbench.Tools do defp obs_category_tools(%WorkbenchTool{} = tool, :traces), do: [%Traces{tool: tool}] defp obs_category_tools(_, _), do: [] - defp external_dashboard_tools(%WorkbenchTool{tool: provider} = tool) + defp external_observability_tools(%WorkbenchTool{tool: provider} = tool) when provider in [:azure, :cloudwatch, :datadog, :dynatrace, :sentry, :splunk], - do: [%ExternalDashboards{tool: tool}, %ExternalDashboard{tool: tool}] - - defp external_dashboard_tools(_), do: [] + do: [ + %ExternalDashboards{tool: tool}, + %ExternalDashboard{tool: tool}, + %ExternalMonitors{tool: tool}, + %ExternalMonitor{tool: tool} + ] + + defp external_observability_tools(_), do: [] defp expand_integration(%WorkbenchTool{tool: :http} = tool), do: [%Http{tool: tool}] defp expand_integration(%WorkbenchTool{tool: :slack} = tool), do: Slack.Tools.expand(tool) diff --git a/lib/console/deployments/agents.ex b/lib/console/deployments/agents.ex index 7e11e49653..916519ec76 100644 --- a/lib/console/deployments/agents.ex +++ b/lib/console/deployments/agents.ex @@ -147,7 +147,10 @@ defmodule Console.Deployments.Agents do @spec delete_agent_runtime(binary, Cluster.t) :: agent_runtime_resp def delete_agent_runtime(id, %Cluster{id: cluster_id}) do case get_agent_runtime!(id) do - %AgentRuntime{cluster_id: ^cluster_id} = runtime -> Repo.delete(runtime) + %AgentRuntime{cluster_id: ^cluster_id} = runtime -> + runtime + |> AgentRuntime.changeset() + |> Repo.delete() _ -> {:error, "clusters can only delete their own agent runtimes"} end end diff --git a/lib/console/deployments/observability.ex b/lib/console/deployments/observability.ex index 89bf767dc1..39e6d1790a 100644 --- a/lib/console/deployments/observability.ex +++ b/lib/console/deployments/observability.ex @@ -3,6 +3,7 @@ defmodule Console.Deployments.Observability do use Nebulex.Caching import Console.Deployments.Policies import Console.Deployments.Observability.Metrics + alias Console.AI.Workbench.Toolchain alias Console.Deployments.Observability.Monitor, as: MonitorImpl alias Prometheus.Client, as: PrometheusClient alias Console.Deployments.Settings @@ -15,6 +16,7 @@ defmodule Console.Deployments.Observability do Service, Monitor, Dashboard, + Workbench, AlertResolution, DeploymentSettings, ObservabilityProvider, @@ -73,18 +75,41 @@ defmodule Console.Deployments.Observability do @spec create_dashboard(map, User.t()) :: dashboard_resp def create_dashboard(attrs, %User{} = user) do - %Dashboard{} - |> Dashboard.changeset(attrs) - |> allow(user, :write) - |> when_ok(:insert) + changeset = Dashboard.changeset(%Dashboard{}, attrs) + + with :ok <- validate_dashboard_tools(changeset, user), + {:ok, changeset} <- allow(changeset, user, :write), + do: Repo.insert(changeset) end @spec update_dashboard(map, binary, User.t()) :: dashboard_resp def update_dashboard(attrs, id, %User{} = user) do - get_dashboard!(id) - |> Dashboard.changeset(attrs |> Map.delete(:workbench_id) |> Map.delete("workbench_id")) - |> allow(user, :write) - |> when_ok(:update) + changeset = Dashboard.changeset(get_dashboard!(id), Map.drop(attrs, [:workbench_id, "workbench_id"])) + + with :ok <- validate_dashboard_tools(changeset, user), + {:ok, changeset} <- allow(changeset, user, :write), + do: Repo.update(changeset) + end + + defp validate_dashboard_tools(%Ecto.Changeset{valid?: true} = changeset, %User{} = user) do + dashboard = Ecto.Changeset.apply_changes(changeset) + + case Repo.preload(dashboard, :workbench) do + %Dashboard{workbench: %Workbench{} = workbench} = dashboard -> + Toolchain.validate_all(workbench, dashboard_tool_queries(dashboard), user) + _ -> {:error, "dashboard workbench not found"} + end + end + defp validate_dashboard_tools(_, _), do: :ok + + defp dashboard_tool_queries(%Dashboard{graphs: graphs, inputs: inputs}) do + Enum.flat_map(graphs ++ inputs, fn + %{datasource: %{type: type, tool: tool, input: input}} + when type in [:metrics, :logs, :traces, :labels] -> + [{type, tool, input || %{}}] + + _ -> [] + end) end @spec delete_dashboard(binary, User.t()) :: dashboard_resp diff --git a/lib/console/deployments/policy.ex b/lib/console/deployments/policy.ex index cc9a887f12..b7112ef800 100644 --- a/lib/console/deployments/policy.ex +++ b/lib/console/deployments/policy.ex @@ -15,10 +15,9 @@ defmodule Console.Deployments.Policy do Service, ComplianceReportGenerator, User, - Project, - GitRepository, - StackRun + Project } + alias Console.Deployments.Policy.Input alias Console.Deployments.Settings alias Console.Deployments.{Stacks, Workbenches} alias Console.Services.Users @@ -112,56 +111,6 @@ defmodule Console.Deployments.Policy do end end - @doc "Builds the actor payload used as policy input." - def actor(%User{id: id, name: name, email: email, groups: groups}) do - %{ - "id" => id, - "name" => name, - "email" => email, - "groups" => if(is_list(groups), do: Enum.map(groups, & &1.name), else: []) - } - end - def actor(_), do: %{} - - @doc "Builds the stack payload used as policy input." - def stack(%Stack{name: name} = stack) do - %{ - "name" => name, - "project" => stack_project(stack.project), - "git" => stack_git(stack) - } - end - def stack(_), do: %{} - - @doc "Builds the commit payload used as policy input." - def commit(%StackRun{} = run) do - %{ - "sha" => git_field(run.git, :ref), - "message" => run.message, - "committer" => run.committer - } - end - def commit(_), do: %{} - - defp stack_project(%Project{id: id, name: name}), do: %{"id" => id, "name" => name} - defp stack_project(_), do: %{} - - defp stack_git(%Stack{git: git, repository: repo, sha: sha}) do - %{ - "ref" => git_field(git, :ref), - "folder" => git_field(git, :folder), - "sha" => sha, - "url" => repo_url(repo) - } - end - - defp git_field(%{ref: ref}, :ref), do: ref - defp git_field(%{folder: folder}, :folder), do: folder - defp git_field(_, _), do: nil - - defp repo_url(%GitRepository{url: url}), do: url - defp repo_url(_), do: nil - @doc "Joins deny/approve reason objects into a single persisted string." def policy_reason(items, fallback \\ "") def policy_reason(items, fallback) when is_list(items) do @@ -279,22 +228,13 @@ defmodule Console.Deployments.Policy do defp reconcile_binding(%BindingPolicy{} = binding, target) do user = bot() - case evaluate_policy(binding.bind_policy, binding_input(target), [binding.bind_policy_id]) do + case evaluate_policy(binding.bind_policy, Input.binding(target), [binding.bind_policy_id]) do {:ok, %{"bind" => true}} -> attach_binding(binding, target, user) {:ok, %{"bind" => false}} -> detach_binding(binding, target, user) error -> Logger.error("Failed to evaluate binding policy #{binding.id}: #{inspect(error)}") end end - defp binding_input(%Workbench{} = target), do: %{workbench: clean_binding_input(target)} - defp binding_input(%Stack{} = target), do: %{stack: clean_binding_input(target)} - - defp clean_binding_input(target) do - target - |> Map.from_struct() - |> Console.clean() - end - defp attach_binding(%BindingPolicy{} = binding, target, user) do case fetch_attachment(binding, target) do %{} -> :ok diff --git a/lib/console/deployments/policy/input.ex b/lib/console/deployments/policy/input.ex new file mode 100644 index 0000000000..5213fdec70 --- /dev/null +++ b/lib/console/deployments/policy/input.ex @@ -0,0 +1,151 @@ +defmodule Console.Deployments.Policy.Input do + alias Console.Schema.{ + GitRepository, + Project, + Stack, + StackInfracostResource, + StackPolicyViolation, + StackRun, + StackViolationCause, + User, + Workbench + } + + @doc "Builds the target payload used as binding policy input." + def binding(%Workbench{} = target), do: %{workbench: clean_binding_target(target)} + def binding(%Stack{} = target), do: %{stack: clean_binding_target(target)} + + @doc "Builds the actor payload used as policy input." + def actor(%User{ + id: id, + name: name, + email: email, + groups: groups, + roles: roles, + service_account: service_account + }) do + %{ + "id" => id, + "name" => name, + "email" => email, + "service_account" => !!service_account, + "roles" => actor_roles(roles), + "groups" => if(is_list(groups), do: Enum.map(groups, & &1.name), else: []) + } + end + + def actor(_), do: %{} + + defp actor_roles(%{admin: admin}), do: %{"admin" => !!admin} + defp actor_roles(_), do: %{} + + @doc "Builds the stack payload used as policy input." + def stack(%Stack{name: name} = stack) do + %{ + "name" => name, + "project" => stack_project(stack.project), + "git" => stack_git(stack) + } + end + + def stack(_), do: %{} + + @doc "Builds the commit payload used as policy input." + def commit(%StackRun{} = run) do + %{ + "sha" => git_field(run.git, :ref), + "message" => run.message, + "committer" => run.committer + } + end + + def commit(_), do: %{} + + @doc "Builds the cost payload used as policy input." + def costs(resources) when is_list(resources), do: Enum.map(resources, &cost/1) + def costs(_), do: [] + + @doc "Builds the vulnerability violation payload used as policy input." + def violations(violations) when is_list(violations), do: Enum.map(violations, &violation/1) + def violations(_), do: [] + + defp cost(%StackInfracostResource{} = resource) do + %{ + "resource_scope" => resource.resource_scope, + "project_name" => resource.project_name, + "name" => resource.name, + "resource_type" => resource.resource_type, + "hourly_cost" => decimal_float(resource.hourly_cost), + "monthly_cost" => decimal_float(resource.monthly_cost), + "monthly_usage_cost" => decimal_float(resource.monthly_usage_cost), + "raw_resource" => resource.raw_resource + } + end + + defp violation(%StackPolicyViolation{} = violation) do + %{ + "severity" => violation.severity, + "policy_id" => violation.policy_id, + "policy_url" => violation.policy_url, + "policy_module" => violation.policy_module, + "title" => violation.title, + "description" => violation.description, + "resolution" => violation.resolution, + "causes" => violation_causes(violation.causes) + } + end + + defp violation_causes(causes) when is_list(causes), do: Enum.map(causes, &violation_cause/1) + defp violation_causes(_), do: [] + + defp violation_cause(%StackViolationCause{} = cause) do + %{ + "resource" => cause.resource, + "start" => cause.start, + "end" => cause.end, + "filename" => cause.filename, + "lines" => violation_lines(cause.lines) + } + end + + defp violation_lines(lines) when is_list(lines) do + Enum.map(lines, fn line -> + %{ + "content" => line.content, + "line" => line.line, + "first" => line.first, + "last" => line.last + } + end) + end + + defp violation_lines(_), do: [] + + defp decimal_float(%Decimal{} = value), do: Decimal.to_float(value) + defp decimal_float(_), do: nil + + defp clean_binding_target(target) do + target + |> Map.from_struct() + |> Console.clean() + end + + defp stack_project(%Project{id: id, name: name}), do: %{"id" => id, "name" => name} + defp stack_project(_), do: %{} + + defp stack_git(%Stack{git: git, repository: repo, sha: sha}) do + %{ + "ref" => git_field(git, :ref), + "folder" => git_field(git, :folder), + "sha" => sha, + "url" => repo_url(repo) + } + end + + defp git_field(%{ref: ref}, :ref), do: ref + defp git_field(%{folder: folder}, :folder), do: folder + defp git_field(_, _), do: nil + + defp repo_url(%GitRepository{url: url}), do: url + defp repo_url(_), do: nil +end diff --git a/lib/console/deployments/pubsub/recurse.ex b/lib/console/deployments/pubsub/recurse.ex index 5c142c88d0..c99e9bc040 100644 --- a/lib/console/deployments/pubsub/recurse.ex +++ b/lib/console/deployments/pubsub/recurse.ex @@ -190,17 +190,21 @@ end defimpl Console.PubSub.Recurse, for: Console.PubSub.StackRunUpdated do alias Console.Schema.{StackRun, PullRequest, StackState} alias Console.Deployments.Stacks + alias Console.AI.Plan def process(%{item: %{dry_run: true, status: :pending_approval} = run}) do case Console.Repo.preload(run, [:pull_request, :state]) do %StackRun{pull_request: %PullRequest{}, state: %StackState{plan: p}} = run when is_binary(p) -> Stacks.post_comment(run) + Plan.enqueue(run) _ -> :ok end end - def process(%@for{item: %StackRun{status: :pending_approval} = run}), - do: Stacks.stack_run_approval(run) + def process(%@for{item: %StackRun{status: :pending_approval} = run}) do + Plan.enqueue(run) + Stacks.stack_run_approval(run) + end def process(%@for{item: %StackRun{pull_request_id: id, status: status} = run}) when is_binary(id) and status != :queued do @@ -214,19 +218,6 @@ defimpl Console.PubSub.Recurse, for: Console.PubSub.StackRunUpdated do def process(_), do: :ok end -defimpl Console.PubSub.Recurse, for: Console.PubSub.StackStateInsight do - alias Console.Schema.{StackRun, PullRequest, StackState, AiInsight} - alias Console.Deployments.Stacks - - def process(%@for{item: {%StackState{} = state, _}}) do - case Console.Repo.preload(state, [run: [:pull_request, state: :insight]]) do - %StackState{run: %StackRun{pull_request: %PullRequest{}, state: %StackState{insight: %AiInsight{}}} = run} -> - Stacks.post_comment(run) - _ -> :ok - end - end -end - defimpl Console.PubSub.Recurse, for: Console.PubSub.StackRunCreated do alias Console.Schema.{Stack, StackRun, PullRequest} alias Console.Deployments.Stacks @@ -265,6 +256,7 @@ defimpl Console.PubSub.Recurse, for: [Console.PubSub.StackRunCompleted] do Console.Repo.delete(stack) %StackRun{pull_request: %PullRequest{} = pr} = run -> Stacks.post_comment(run) + Console.AI.Plan.enqueue(run) Stacks.dequeue(pr) %StackRun{stack: %Stack{} = stack} -> Workbenches.kick_workbench(run) diff --git a/lib/console/deployments/stacks.ex b/lib/console/deployments/stacks.ex index f7c4d283e3..332e218ee8 100644 --- a/lib/console/deployments/stacks.ex +++ b/lib/console/deployments/stacks.ex @@ -12,6 +12,7 @@ defmodule Console.Deployments.Stacks do alias Console.Services.Users alias Console.AI.{Provider, Tools.ApproveStack} alias Console.Deployments.Policy, as: PolicyEngine + alias Console.Deployments.Policy.Input, as: PolicyInput alias Console.Deployments.Stacks.Plan alias Kazan.Apis.Batch.V1, as: BatchV1 alias Console.Schema.{ @@ -29,7 +30,6 @@ defmodule Console.Deployments.Stacks do CustomStackRun, StackDefinition, StackCron, - AiInsight, StackPolicy } @@ -404,18 +404,8 @@ defmodule Console.Deployments.Stacks do Posts a review comment for a completed pr stack run if possible """ def post_comment(%StackRun{} = run) do - run = Repo.preload(run, [:pull_request, stack: :connection, state: :insight]) + run = Repo.preload(run, [:pull_request, :state, stack: :connection]) case {run, scm_connection(run)} do - {%StackRun{ - id: id, - stack_id: stack_id, - status: :successful, - state: %StackState{insight: %AiInsight{} = insight}, - pull_request: %PullRequest{} = pr - }, %ScmConnection{} = conn} -> - url = Console.url("/stacks/#{stack_id}/runs/#{id}") - Dispatcher.review(conn, %{pr | comment_id: Console.deep_get(run, ~w(scm_state ai_comment_id)a)}, pr_blob("insight", insight: insight, link: url)) - |> save_comment(run, :ai_comment_id) {%StackRun{ id: id, stack_id: stack_id, @@ -453,6 +443,28 @@ defmodule Console.Deployments.Stacks do end end + @doc """ + Posts an AI-generated plan summary as a separate PR review comment. + """ + def post_plan_comment(%StackRun{} = run, text) when is_binary(text) do + run = Repo.preload(run, [:pull_request, stack: :connection]) + case {run, scm_connection(run)} do + {%StackRun{ + id: id, + stack_id: stack_id, + pull_request: %PullRequest{} = pr + }, %ScmConnection{} = conn} -> + url = Console.url("/stacks/#{stack_id}/runs/#{id}") + Dispatcher.review( + conn, + %{pr | comment_id: Console.deep_get(run, ~w(scm_state ai_comment_id)a)}, + pr_blob("insight", text: text, link: url) + ) + |> save_comment(run, :ai_comment_id) + _ -> {:error, "cannot post plan summary for this stack run"} + end + end + defp save_comment({:ok, id}, %StackRun{} = run, field) when is_atom(field) do StackRun.changeset(run, %{scm_state: %{field => id}}) |> Repo.update() @@ -581,7 +593,14 @@ defmodule Console.Deployments.Stacks do """ @spec stack_run_approval(StackRun.t) :: run_resp | :ok def stack_run_approval(%StackRun{status: :pending_approval, approver_id: nil} = run) do - run = Repo.preload(run, [:state, :repository, actor: :groups, stack: [:project, :repository, stack_policies: :policy]]) + run = Repo.preload(run, [ + :state, + :repository, + :infracost_resources, + actor: :groups, + violations: :causes, + stack: [:project, :repository, stack_policies: :policy] + ]) case maybe_policy_approval(run) do {:decide, approval} -> handle_approval(run, approval, :policy) @@ -617,10 +636,12 @@ defmodule Console.Deployments.Stacks do defp stack_policy_input(%StackRun{} = run) do %{ "plan" => stack_plan(run), - "actor" => PolicyEngine.actor(run.actor), + "actor" => PolicyInput.actor(run.actor), "run_type" => Plan.run_type(run), - "stack" => PolicyEngine.stack(run.stack), - "commit" => PolicyEngine.commit(run) + "stack" => PolicyInput.stack(run.stack), + "commit" => PolicyInput.commit(run), + "costs" => PolicyInput.costs(run.infracost_resources), + "violations" => PolicyInput.violations(run.violations) } end diff --git a/lib/console/deployments/workbenches.ex b/lib/console/deployments/workbenches.ex index 43171f5a88..afa6fd1dc5 100644 --- a/lib/console/deployments/workbenches.ex +++ b/lib/console/deployments/workbenches.ex @@ -4,6 +4,7 @@ defmodule Console.Deployments.Workbenches do import Console.Deployments.Policies import Console.AI.Workbench.Mentions import Console.Schema.WorkbenchJobActivity, only: [is_action: 1] + alias Console.AI.Workbench.Toolchain alias Console.Schema.{ User, Workbench, @@ -1408,28 +1409,60 @@ defmodule Console.Deployments.Workbenches do @spec save_canvas([map], binary, WorkbenchJobActivity.t()) :: {:ok, WorkbenchJobActivity.t(), WorkbenchJob.t()} | {:error, any()} def save_canvas(blocks, output, %WorkbenchJobActivity{} = activity) when is_list(blocks) do %WorkbenchJobActivity{workbench_job: %WorkbenchJob{} = job} = - Repo.preload(activity, workbench_job: :result) + Repo.preload(activity, workbench_job: [:result, :user]) blocks = Console.mapify(blocks) - start_transaction() - |> add_operation(:activity, fn _ -> - update_job_activity(%{status: :successful, result: %{output: output, canvas: blocks}}, activity) - end) - |> add_operation(:job, fn _ -> - job - |> WorkbenchJob.changeset(%{result: %{canvas: blocks}}) - |> Repo.update() - end) - |> execute() - |> case do - {:ok, %{activity: activity, job: job}} -> - notify({:ok, job}, :update) - {:ok, activity, job} - err -> err + with :ok <- Toolchain.validate_all(job, canvas_tool_queries(blocks), job.user) do + start_transaction() + |> add_operation(:activity, fn _ -> + update_job_activity(%{status: :successful, result: %{output: output, canvas: blocks}}, activity) + end) + |> add_operation(:job, fn _ -> + job + |> WorkbenchJob.changeset(%{result: %{canvas: blocks}}) + |> Repo.update() + end) + |> execute() + |> case do + {:ok, %{activity: activity, job: job}} -> + notify({:ok, job}, :update) + {:ok, activity, job} + + err -> + err + end end end + defp canvas_tool_queries(blocks) do + Enum.flat_map(blocks, fn block -> + type = map_get(block, :type) + query_type = query_type(type) + content = map_get(block, :content) || %{} + graph = map_get(content, query_type) || %{} + query = map_get(graph, :query) + + case {query_type, query} do + {type, %{} = query} when not is_nil(type) -> + [{type, map_get(query, :tool_name), map_get(query, :tool_args) || %{}}] + + _ -> + [] + end + end) + end + + defp query_type(type) when type in [:metrics, "metrics"], do: :metrics + defp query_type(type) when type in [:logs, "logs"], do: :logs + defp query_type(type) when type in [:traces, "traces"], do: :traces + defp query_type(_), do: nil + + defp map_get(%{} = map, key) when is_atom(key), + do: Map.get(map, key) || Map.get(map, Atom.to_string(key)) + + defp map_get(_, _), do: nil + @doc """ Updates the status of a job, and creates a new recording the change made. """ diff --git a/lib/console/graphql/deployments/settings.ex b/lib/console/graphql/deployments/settings.ex index 79a729cd2e..c82dfe72d7 100644 --- a/lib/console/graphql/deployments/settings.ex +++ b/lib/console/graphql/deployments/settings.ex @@ -8,6 +8,7 @@ defmodule Console.GraphQl.Deployments.Settings do ecto_enum :log_driver, DeploymentSettings.LogDriver ecto_enum :vector_store, DeploymentSettings.VectorStore ecto_enum :open_ai_method, DeploymentSettings.OpenAIMethod + ecto_enum :bedrock_endpoint, DeploymentSettings.BedrockEndpoint ecto_enum :provider, CloudConnection.Provider @bedrock_model_id_doc "AWS Bedrock model or inference profile identifier. Use a foundation model ID (e.g. anthropic.claude-3-5-sonnet-20241022-v2:0) or a regional inference profile ID with three dot-separated segments (e.g. us.anthropic.claude-3-5-sonnet-20241022-v2:0, global.anthropic.claude-haiku-4-5-20251001-v1:0). Nexus registers the bare model ID for routing and auto-maps 3-part profile IDs to Bifrost aliases." @@ -16,6 +17,8 @@ defmodule Console.GraphQl.Deployments.Settings do @bedrock_deployments_doc "Deprecated for most configurations: prefer regional-prefixed inference profile IDs in modelId or proxyModels (aliases are inferred automatically). Still needed for explicit client model name overrides, application inference profile resource IDs (profile suffix only, not full ARN), or when alias mapping cannot be inferred. Maps client-facing model ID to inference profile ID. Example: {\"anthropic.claude-3-5-sonnet-20241022-v2:0\": \"us.anthropic.claude-3-5-sonnet-20241022-v2:0\"}" + @bedrock_endpoint_doc "AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic/OpenAI-compatible APIs." + input_object :project_attributes do field :name, non_null(:string) field :description, :string @@ -286,6 +289,7 @@ defmodule Console.GraphQl.Deployments.Settings do description: "Bedrock model or inference profile for embeddings. Same ID formats as modelId." + field :endpoint, :bedrock_endpoint, description: @bedrock_endpoint_doc field :proxy_models, list_of(:string), description: @bedrock_proxy_models_doc field :deployments, :json, description: @bedrock_deployments_doc end @@ -684,6 +688,7 @@ defmodule Console.GraphQl.Deployments.Settings do description: "Bedrock model or inference profile for embeddings. Same ID formats as modelId." + field :endpoint, :bedrock_endpoint, description: @bedrock_endpoint_doc field :proxy_models, list_of(:string), description: @bedrock_proxy_models_doc field :deployments, :map, description: @bedrock_deployments_doc end diff --git a/lib/console/graphql/deployments/workbench.ex b/lib/console/graphql/deployments/workbench.ex index e512324ec6..824b077fda 100644 --- a/lib/console/graphql/deployments/workbench.ex +++ b/lib/console/graphql/deployments/workbench.ex @@ -5,6 +5,7 @@ defmodule Console.GraphQl.Deployments.Workbench do ecto_enum :workbench_tool_type, Console.Schema.WorkbenchTool.Tool ecto_enum :workbench_tool_category, Console.Schema.WorkbenchTool.Category ecto_enum :workbench_tool_http_method, Console.Schema.WorkbenchTool.HttpMethod + ecto_enum :splunk_token_type, Console.Schema.WorkbenchTool.SplunkTokenType ecto_enum :workbench_job_status, Console.Schema.WorkbenchJob.Status ecto_enum :workbench_job_activity_status, Console.Schema.WorkbenchJobActivity.Status ecto_enum :workbench_job_activity_type, Console.Schema.WorkbenchJobActivity.Type @@ -226,6 +227,7 @@ defmodule Console.GraphQl.Deployments.Workbench do field :opensearch, :workbench_tool_opensearch_connection_attributes, description: "aws opensearch connection (logs)" field :prometheus, :workbench_tool_prometheus_connection_attributes, description: "prometheus connection (metrics)" field :loki, :workbench_tool_loki_connection_attributes, description: "loki connection (logs)" + field :victoria_logs, :workbench_tool_victoria_logs_connection_attributes, description: "victoria logs connection (logs)" field :splunk, :workbench_tool_splunk_connection_attributes, description: "splunk connection (logs)" field :tempo, :workbench_tool_tempo_connection_attributes, description: "tempo connection (traces)" field :jaeger, :workbench_tool_jaeger_connection_attributes, description: "jaeger connection (traces)" @@ -288,6 +290,15 @@ defmodule Console.GraphQl.Deployments.Workbench do field :tenant_id, :string, description: "optional tenant id" end + input_object :workbench_tool_victoria_logs_connection_attributes do + field :url, non_null(:string), description: "victoria logs base url" + field :token, :string, description: "bearer token or api key" + field :username, :string, description: "basic auth username" + field :password, :string, description: "basic auth password" + field :account_id, :string, description: "optional AccountID tenant header" + field :project_id, :string, description: "optional ProjectID tenant header" + end + input_object :workbench_tool_tempo_connection_attributes do field :url, non_null(:string), description: "tempo base url" field :token, :string, description: "bearer token or api key" @@ -304,10 +315,11 @@ defmodule Console.GraphQl.Deployments.Workbench do end input_object :workbench_tool_splunk_connection_attributes do - field :url, non_null(:string), description: "splunk base url" - field :token, :string, description: "bearer token" - field :username, :string, description: "basic auth username" - field :password, :string, description: "basic auth password" + field :url, non_null(:string), description: "splunk base url" + field :token, :string, description: "splunk authentication token" + field :token_type, :splunk_token_type, default_value: :bearer, description: "authorization realm for token authentication" + field :username, :string, description: "basic auth username" + field :password, :string, description: "basic auth password" end input_object :workbench_tool_datadog_connection_attributes do @@ -659,6 +671,7 @@ defmodule Console.GraphQl.Deployments.Workbench do arg :arguments, :json, description: "the arguments for the metrics tool" resolve &Deployments.metrics_tool/3 + middleware ErrorHandler end field :logs_tool, list_of(:workbench_job_activity_log) do @@ -666,6 +679,7 @@ defmodule Console.GraphQl.Deployments.Workbench do arg :arguments, :json, description: "the arguments for the logs tool" resolve &Deployments.logs_tool/3 + middleware ErrorHandler end field :traces_tool, list_of(:workbench_job_activity_trace) do @@ -673,6 +687,7 @@ defmodule Console.GraphQl.Deployments.Workbench do arg :arguments, :json, description: "the arguments for the traces tool" resolve &Deployments.traces_tool/3 + middleware ErrorHandler end field :whimsey, :string, description: "whimsically describes current progress for you", resolve: &Deployments.whimsey_text/3 @@ -1208,6 +1223,7 @@ defmodule Console.GraphQl.Deployments.Workbench do field :opensearch, :workbench_tool_opensearch_connection, description: "aws opensearch connection (no secrets)" field :prometheus, :workbench_tool_prometheus_connection, description: "prometheus connection (no secrets)" field :loki, :workbench_tool_loki_connection, description: "loki connection (no secrets)" + field :victoria_logs, :workbench_tool_victoria_logs_connection, description: "victoria logs connection (no secrets)" field :splunk, :workbench_tool_splunk_connection, description: "splunk connection (no secrets)" field :tempo, :workbench_tool_tempo_connection, description: "tempo connection (no secrets)" field :jaeger, :workbench_tool_jaeger_connection, description: "jaeger connection (no secrets)" @@ -1265,6 +1281,13 @@ defmodule Console.GraphQl.Deployments.Workbench do field :tenant_id, :string, description: "optional tenant id" end + object :workbench_tool_victoria_logs_connection do + field :url, :string, description: "victoria logs base url" + field :username, :string, description: "basic auth username" + field :account_id, :string, description: "optional AccountID tenant header" + field :project_id, :string, description: "optional ProjectID tenant header" + end + object :workbench_tool_tempo_connection do field :url, :string, description: "tempo base url" field :username, :string, description: "basic auth username" @@ -1277,8 +1300,9 @@ defmodule Console.GraphQl.Deployments.Workbench do end object :workbench_tool_splunk_connection do - field :url, :string, description: "splunk base url" - field :username, :string, description: "basic auth username" + field :url, :string, description: "splunk base url" + field :token_type, :splunk_token_type, description: "authorization realm for token authentication" + field :username, :string, description: "basic auth username" end object :workbench_tool_datadog_connection do diff --git a/lib/console/graphql/exceptions/protocol.ex b/lib/console/graphql/exceptions/protocol.ex index 4180d0ff45..9da48e50fd 100644 --- a/lib/console/graphql/exceptions/protocol.ex +++ b/lib/console/graphql/exceptions/protocol.ex @@ -23,3 +23,8 @@ end defimpl Console.GraphQl.Exception, for: Ecto.Query.CastError do def error(_), do: {404, "could not find resource"} end + +defimpl Console.GraphQl.Exception, for: GRPC.RPCError do + def error(%GRPC.RPCError{message: message}) when is_binary(message), do: {400, message} + def error(_), do: {400, "gRPC request failed"} +end diff --git a/lib/console/graphql/middleware/error_handler.ex b/lib/console/graphql/middleware/error_handler.ex index b80b2229d9..f50e12e3ee 100644 --- a/lib/console/graphql/middleware/error_handler.ex +++ b/lib/console/graphql/middleware/error_handler.ex @@ -11,6 +11,7 @@ defmodule Console.Middleware.ErrorHandler do def call(res, _), do: res defp format(%Ecto.Changeset{} = cs), do: resolve_changeset(cs) + defp format(%GRPC.RPCError{message: message}) when is_binary(message), do: message defp format(%Tee{} = tee), do: Tee.output(tee) defp format(%{"message" => msg}), do: msg defp format({:http_error, _, %{"message" => msg}}), do: msg diff --git a/lib/console/grpc/server.ex b/lib/console/grpc/server.ex index f9030d341f..34fcdbad6a 100644 --- a/lib/console/grpc/server.ex +++ b/lib/console/grpc/server.ex @@ -155,11 +155,13 @@ defmodule Console.GRPC.Server do modelId: Map.get(bedrock, :model_id) || defaults[:model], toolModelId: Map.get(bedrock, :tool_model_id) || defaults[:tool_model], embeddingModelId: Map.get(bedrock, :embedding_model) || defaults[:embedding_model], + accessToken: Map.get(bedrock, :access_token), region: Map.get(bedrock, :region), awsAccessKeyId: Map.get(bedrock, :aws_access_key_id), awsSecretAccessKey: Map.get(bedrock, :aws_secret_access_key), proxyModels: proxy_models(bedrock, defaults), - deployments: to_string_map(Map.get(bedrock, :deployments)) + deployments: to_string_map(Map.get(bedrock, :deployments)), + endpoint: bedrock_endpoint_to_pb(Map.get(bedrock, :endpoint)) } end defp to_bedrock_pb(_), do: nil @@ -185,6 +187,9 @@ defmodule Console.GRPC.Server do defp openai_method_to_pb(nil), do: :AUTO defp openai_method_to_pb(_), do: :AUTO + defp bedrock_endpoint_to_pb(:mantle), do: :MANTLE + defp bedrock_endpoint_to_pb(_), do: :RUNTIME + defp proxy_models(config, defaults) defp proxy_models(%{proxy_models: [_ | _] = models}, _), do: models defp proxy_models(_, %{proxy_models: models}) when is_list(models), do: models diff --git a/lib/console/schema/agent_runtime.ex b/lib/console/schema/agent_runtime.ex index 5bf9541c01..90aa35e97f 100644 --- a/lib/console/schema/agent_runtime.ex +++ b/lib/console/schema/agent_runtime.ex @@ -71,6 +71,7 @@ defmodule Console.Schema.AgentRuntime do |> cast_embed(:model, with: &Modes.model_changeset/2) |> unique_constraint(:default, message: "only one default runtime can be set at once") |> unique_constraint(:name, name: :agent_runtimes_cluster_id_name_uniq_index, message: "a runtime with this name already exists for this cluster") + |> foreign_key_constraint(:id, name: :workbenches, match: :prefix, message: "cannot delete due to workbenches referencing this agent runtime") |> validate_length(:name, max: 255) |> validate_required([:name, :type]) |> put_new_change(:create_policy_id, &Ecto.UUID.generate/0) diff --git a/lib/console/schema/deployment_settings.ex b/lib/console/schema/deployment_settings.ex index 5f5c28d2ea..a06a595e8f 100644 --- a/lib/console/schema/deployment_settings.ex +++ b/lib/console/schema/deployment_settings.ex @@ -7,6 +7,7 @@ defmodule Console.Schema.DeploymentSettings do defenum LogDriver, victoria: 0, elastic: 1, opensearch: 2 defenum VectorStore, elastic: 0, opensearch: 1, postgres: 2 defenum OpenAIMethod, chat: 0, responses: 1, auto: 2 + defenum BedrockEndpoint, runtime: 0, mantle: 1 defmodule Connection do use Piazza.Ecto.Schema @@ -321,6 +322,7 @@ defmodule Console.Schema.DeploymentSettings do field :proxy_models, {:array, :string} # Deprecated for most configs; maps client model ID -> inference profile ID when aliases cannot be inferred (e.g. application profile suffixes). field :deployments, :map + field :endpoint, BedrockEndpoint, default: :runtime end embeds_one :vertex, Vertex, on_replace: :update do @@ -470,7 +472,7 @@ defmodule Console.Schema.DeploymentSettings do defp bedrock_changeset(model, attrs) do model - |> cast(attrs, ~w(model_id tool_model_id access_token region embedding_model aws_access_key_id aws_secret_access_key proxy_models deployments)a) + |> cast(attrs, ~w(model_id tool_model_id access_token region embedding_model aws_access_key_id aws_secret_access_key proxy_models deployments endpoint)a) |> trim_changes(~w(access_token aws_access_key_id aws_secret_access_key)a) |> validate_required(~w(region)a) end diff --git a/lib/console/schema/workbench_tool.ex b/lib/console/schema/workbench_tool.ex index 7c2f1276ff..046c0f3cd6 100644 --- a/lib/console/schema/workbench_tool.ex +++ b/lib/console/schema/workbench_tool.ex @@ -35,7 +35,8 @@ defmodule Console.Schema.WorkbenchTool do lambda: 26, cloud_run: 27, azure_function: 28, - docker: 29 + docker: 29, + victoria_logs: 30 defenum Category, metrics: 0, @@ -54,6 +55,7 @@ defmodule Console.Schema.WorkbenchTool do observability: 13 defenum HttpMethod, get: 0, post: 1, put: 2, delete: 3, patch: 4 + defenum SplunkTokenType, bearer: 0, splunk: 1 schema "workbench_tools" do field :tool, Tool @@ -147,11 +149,21 @@ defmodule Console.Schema.WorkbenchTool do field :password, EncryptedString end + embeds_one :victoria_logs, VictoriaLogsConnection, on_replace: :update do + field :url, :string + field :token, EncryptedString + field :username, :string + field :password, EncryptedString + field :account_id, :string + field :project_id, :string + end + embeds_one :splunk, SplunkConnection, on_replace: :update do - field :url, :string - field :token, EncryptedString - field :username, :string - field :password, EncryptedString + field :url, :string + field :token, EncryptedString + field :token_type, SplunkTokenType, default: :bearer + field :username, :string + field :password, EncryptedString end embeds_one :tempo, TempoConnection, on_replace: :update do @@ -375,6 +387,7 @@ defmodule Console.Schema.WorkbenchTool do defp categories(:splunk), do: [:logs] defp categories(:prometheus), do: [:metrics] defp categories(:loki), do: [:logs] + defp categories(:victoria_logs), do: [:logs] defp categories(:elastic), do: [:logs] defp categories(:opensearch), do: [:logs] defp categories(:tempo), do: [:traces] @@ -403,6 +416,7 @@ defmodule Console.Schema.WorkbenchTool do |> cast_embed(:opensearch, with: &opensearch_configuration_changeset/2) |> cast_embed(:prometheus, with: &prom_configuration_changeset/2) |> cast_embed(:loki, with: &loki_configuration_changeset/2) + |> cast_embed(:victoria_logs, with: &victoria_logs_configuration_changeset/2) |> cast_embed(:splunk, with: &splunk_configuration_changeset/2) |> cast_embed(:tempo, with: &tempo_configuration_changeset/2) |> cast_embed(:jaeger, with: &jaeger_configuration_changeset/2) @@ -478,6 +492,12 @@ defmodule Console.Schema.WorkbenchTool do |> validate_required([:url]) end + defp victoria_logs_configuration_changeset(model, attrs) do + model + |> cast(attrs, ~w(url token username password account_id project_id)a) + |> validate_required([:url]) + end + defp tempo_configuration_changeset(model, attrs) do model |> cast(attrs, ~w(url token tenant_id username password)a) @@ -527,7 +547,7 @@ defmodule Console.Schema.WorkbenchTool do defp splunk_configuration_changeset(model, attrs) do model - |> cast(attrs, ~w(url token username password)a) + |> cast(attrs, ~w(url token token_type username password)a) |> then(fn cs -> case {get_field(cs, :token), get_field(cs, :username), get_field(cs, :password)} do {token, _, _} when is_binary(token) and token != "" -> cs diff --git a/lib/console_web/endpoint.ex b/lib/console_web/endpoint.ex index bce136f6ef..ab4bcab9e4 100644 --- a/lib/console_web/endpoint.ex +++ b/lib/console_web/endpoint.ex @@ -43,13 +43,7 @@ defmodule ConsoleWeb.Endpoint do plug ConsoleWeb.ProxyRouter - plug Plug.Parsers, - parsers: [:urlencoded, :multipart, :json], - pass: ["*/*"], - json_decoder: Phoenix.json_library(), - length: 20_000_000, - ready_length: 20_000_000, - body_reader: {ConsoleWeb.CacheBodyReader, :read_body, []} + plug ConsoleWeb.Plugs.Parsers plug Sentry.PlugContext, body_scrubber: {ConsoleWeb.Sentry, :scrub_params} diff --git a/lib/console_web/plugs/parsers.ex b/lib/console_web/plugs/parsers.ex new file mode 100644 index 0000000000..77d44484b7 --- /dev/null +++ b/lib/console_web/plugs/parsers.ex @@ -0,0 +1,18 @@ +defmodule ConsoleWeb.Plugs.Parsers do + @default_length 100_000_000 + + def init(opts) do + Keyword.merge([ + parsers: [:urlencoded, :multipart, :json], + pass: ["*/*"], + json_decoder: Phoenix.json_library(), + body_reader: {ConsoleWeb.CacheBodyReader, :read_body, []} + ], opts) + end + + def call(conn, opts) do + length = Console.conf(:max_request_body_length) || @default_length + + Plug.Parsers.call(conn, Plug.Parsers.init(Keyword.put(opts, :length, length))) + end +end diff --git a/lib/grpc/console.pb.ex b/lib/grpc/console.pb.ex index 28bbd76c2b..1bee81201a 100644 --- a/lib/grpc/console.pb.ex +++ b/lib/grpc/console.pb.ex @@ -13,6 +13,19 @@ defmodule Plrl.OpenAiMethod do field :AUTO, 3 end +defmodule Plrl.BedrockEndpoint do + @moduledoc false + + use Protobuf, + enum: true, + full_name: "plrl.BedrockEndpoint", + protoc_gen_elixir_version: "0.16.0", + syntax: :proto3 + + field :RUNTIME, 0 + field :MANTLE, 1 +end + defmodule Plrl.AiConfigRequest do @moduledoc false @@ -134,6 +147,7 @@ defmodule Plrl.BedrockConfig do field :awsSecretAccessKey, 7, proto3_optional: true, type: :string field :proxyModels, 8, repeated: true, type: :string field :deployments, 9, repeated: true, type: Plrl.BedrockConfig.DeploymentsEntry, map: true + field :endpoint, 10, proto3_optional: true, type: Plrl.BedrockEndpoint, enum: true end defmodule Plrl.AzureOpenAiConfig.DeploymentsEntry do diff --git a/mix.exs b/mix.exs index 1245dd49e5..10da3d761b 100644 --- a/mix.exs +++ b/mix.exs @@ -205,7 +205,8 @@ defmodule Console.MixProject do {:scribe, "~> 0.11"}, {:bandit, "~> 1.12"}, {:caramelize, "~> 1.2"}, - {:req_llm, "~> 1.22"}, + {:req_llm, "~> 1.22", + github: "pluralsh/req_llm", branch: "fix-mantle-max-tokens", override: true}, {:sweet_xml, ">= 0.0.0"}, {:jaqex, "~> 0.1.3"}, {:waffle, "~> 1.1", git: "https://github.com/jopedroliveira/waffle.git", tag: "v1.1.9-azure.3", override: true}, diff --git a/mix.lock b/mix.lock index 8b4c23246e..50bfee8b36 100644 --- a/mix.lock +++ b/mix.lock @@ -157,7 +157,7 @@ "regolix": {:git, "https://github.com/pluralsh/regolix.git", "aa83d90868b71460c2e8357d8ca9c2020a0f0ebc", [tag: "master"]}, "remote_ip": {:hex, :remote_ip, "1.2.0", "fb078e12a44414f4cef5a75963c33008fe169b806572ccd17257c208a7bc760f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "2ff91de19c48149ce19ed230a81d377186e4412552a597d6a5137373e5877cb7"}, "req": {:hex, :req, "0.7.4", "23e9ffec17de032a46a4b15ed65c09793893bf4a7c680f4bbf6227fce6bdf74d", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:finch, "~> 0.21", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "4b192d63253e8dcc6221ef992ea9ebef7d3555166e8423aa5b553e86bc3c69a2"}, - "req_llm": {:hex, :req_llm, "1.22.0", "904c3438865d3be05690b117dc7cacf5d656b4968ac266319742736fd353010b", [:mix], [{:dotenvy, "~> 1.1", [hex: :dotenvy, repo: "hexpm", optional: false]}, {:ex_aws_auth, "~> 1.4", [hex: :ex_aws_auth, repo: "hexpm", optional: true]}, {:goth, "~> 1.4", [hex: :goth, repo: "hexpm", optional: true]}, {:igniter, "~> 0.7", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:jsv, "~> 0.11", [hex: :jsv, repo: "hexpm", optional: false]}, {:llm_db, ">= 2026.9.1 and < 2027.0.0", [hex: :llm_db, repo: "hexpm", optional: false]}, {:nimble_options, "~> 1.1", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:server_sent_events, "~> 1.1.0", [hex: :server_sent_events, repo: "hexpm", optional: false]}, {:splode, "~> 0.3.0", [hex: :splode, repo: "hexpm", optional: false]}, {:websockex, "~> 0.5.1", [hex: :websockex, repo: "hexpm", optional: false]}, {:zoi, "~> 0.14", [hex: :zoi, repo: "hexpm", optional: false]}], "hexpm", "e5811445a65a78a69f953901188e683f31bb120be8f548ed2c4f14ee3f423828"}, + "req_llm": {:git, "https://github.com/pluralsh/req_llm.git", "f1c1bb05b5efa2efe8215f7e5ed8ff8d00765fc8", [branch: "fix-mantle-max-tokens"]}, "reverse_proxy_plug": {:hex, :reverse_proxy_plug, "3.0.2", "38fde2f59bca8b219ef4f1ec0c0849a67c6d9705160e426a2354f35399db5c7b", [:mix], [{:finch, "~> 0.18", [hex: :finch, repo: "hexpm", optional: true]}, {:httpoison, "~> 1.2 or ~> 2.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: false]}, {:req, "~> 0.3.0 or ~> 0.4.0 or ~> 0.5.0", [hex: :req, repo: "hexpm", optional: true]}, {:tesla, "~> 1.4", [hex: :tesla, repo: "hexpm", optional: true]}], "hexpm", "31ae5e068f7f504fba1b5c17c31c87966c720809ac15140c6c181440fbd24eda"}, "rustler": {:hex, :rustler, "0.38.0", "7a8906998ff0d28e3021c0a73264abcda719bda344b2e58307c6805b0f87c9b4", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "704c03c1bf66be12b031c5a389347b91c81c5cb819a24b068b0de36fe4a5652a"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.9.0", "3a052eda09f3d2436364645cc1f13279cf95db310eb0c17b0d8f25484b233aa0", [:mix], [{:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "471d97315bd3bf7b64623418b3693eedd8e47de3d1cb79a0ac8f9da7d770d94c"}, diff --git a/priv/plan_summary.md.eex b/priv/plan_summary.md.eex new file mode 100644 index 0000000000..b3459d87cc --- /dev/null +++ b/priv/plan_summary.md.eex @@ -0,0 +1,23 @@ +## Summary + +<%= @summary %> + +## Blast Radius + +<%= @blast_radius %> + +<%= if @critical_systems not in [nil, []] do %> +## Critical Systems + +<%= Enum.map(@critical_systems, &"* #{&1}") |> Enum.join("\n") %> + +<% end %> +<%= if @notable_changes not in [nil, []] do %> +## Notable Changes + +<%= Enum.map(@notable_changes, &"* #{&1}") |> Enum.join("\n") %> + +<% end %> +## Safety Assessment + +<%= @safety %> diff --git a/priv/pr/insight.md.eex b/priv/pr/insight.md.eex index 895859781e..4821d020e5 100644 --- a/priv/pr/insight.md.eex +++ b/priv/pr/insight.md.eex @@ -3,6 +3,6 @@ Plural AI has generated a summary of what this plan entails [here](<%= @link %>)
Plan Summary -<%= @insight.text %> +<%= @text %>
diff --git a/priv/prompts/workbench/infrastructure.md.eex b/priv/prompts/workbench/infrastructure.md.eex index 63fe782d36..81e0febc9b 100644 --- a/priv/prompts/workbench/infrastructure.md.eex +++ b/priv/prompts/workbench/infrastructure.md.eex @@ -14,6 +14,8 @@ Some guidelines to follow as you're doing this: * Stack searches are useful for finding infrastructure resources that are managed by Plural, usually in the form of terraform. Cloud configuration and base infrastructure resources are often found here. * To understand the contents of a stack, you'll need to use the `stack_search` tool currently, but you can ask it any query and it should give you semantically accurate results associated. * Service searches are useful for finding kubernetes resources that are managed by Plural. Compute-bearing resources like deployments, statefulsets, and daemonsets are often found here and anything related to container image deployment. +* The Kubernetes API discovery and schema tools inspect the API installed on a specific cluster. For questions about CRD fields, validation, or supported versions, use these tools and treat the cluster's OpenAPI schema as the source of truth rather than relying on general Kubernetes knowledge. +* Use `python_sandbox` for freeform, code-based exploration of live cloud or Kubernetes infrastructure. Write Python that calls the mounted k8s get/list and cloud query functions, then filter, join, and compute in-code instead of chaining many one-off tool calls. * All searches are permission-bound, it's possible you'll find forbidden errors if searching something you don't have access to. It can also be useful to include a mermaid diagram of the topology of the infrastructure in question, as it will be used at a higher level to graph the overall theory of how to solve this task. @@ -23,14 +25,13 @@ iterations, especially for providing `Plural Stack: {stack-name}` and `Plural Se ## Python Sandbox Guidance -If k8s or cloud query tools are enabled, you'll be given access to a python sandbox to leverage them programmatically. They'll -return the api results from each in a machine readable, json decoded-like format and you should utilize python to minimize context -usage, perform any needed deterministic computations or express conditional behavior in the course ofany investigation being done. +`python_sandbox` is the tool for freeform, code-based exploration of cloud or Kubernetes infrastructure. If k8s or cloud query tools are enabled, they are mounted as Python functions inside the sandbox. Use it whenever the investigation is open-ended: write a short program that queries live state, walks related objects, filters or joins results, and returns a compact answer — rather than issuing many individual tool calls and reasoning over the raw dumps. -This is especially useful for usecases like FinOps and reporting where aggregates are needed to be scripted, or complex rightsizing queries which has the same aggregation needs, but there are many other uses and the -determinism and efficiency of python should be leveraged to its fullest. +Mounted functions return API results in a machine-readable, JSON-decoded-like format. Drive the investigation in Python so you can minimize context usage, perform deterministic computations, and express conditional behavior (list → filter → get related objects, paginate, compare inventories, etc.) in the script itself. -Generally its best to batch multiple tool calls in one sandbox to reduce roundtrips to the ai inference layer and also it's good to do whatever calculations you want on that data in python versus guessing it post extraction. +This is the right tool for any exploratory infrastructure query, not only reporting. FinOps, inventory, and rightsizing work are common examples because they need aggregation, but the same pattern applies to topology discovery, drift checks, finding misconfigured resources, or walking related Kubernetes objects. + +Generally it is best to batch multiple tool calls in one sandbox invocation to reduce roundtrips to the AI inference layer, and to do calculations on that data in Python versus guessing them after extraction. ## Useful Heuristics @@ -85,9 +86,10 @@ You are producing output for a human user, and should expect them to want to rea 1. If you don't have enough specifics to use a precise tool like a direct kubernetes get or list, you should use the `service_search` or `stack_search` tools to gather more information. These support semantic search and work well with fuzzy inputs. 2. In general summarize_component has the ability to dive deep into a k8s object, but you'll need the Plural-specific context from a service_search or stack_search to gather them. 3. We can offer the ability to directly query kubernetes, but you need to be precise with your inputs and *always* include a Plural cluster handle to make it work. It's also possible user RBAC policies block your query. -4. If you're searching for a kubernetes resource and don't know exactly the namespace/name it might have, you can mix `service_search` with standard k8s tool calls since it has the ability to probe kubernetes objects just with a finely crafted prompt. Both are useful tools in the toolkit. -5. You are also given a workbench_history tool which can be used to search past work outside of this subagent. Use this to grab additional context that might not be present in your prompt, but don't rely on it if the prompt is sufficient. -6. Leverage the `python_sandbox` tool to programmatically explore kuebrnetes and cloud data using the native function tools bound to it. It can have kubernetes get/list functions and cloud sql querying functions mounted in it. +4. For questions about a Kubernetes CRD schema, call `api_discovery` with the cluster handle to identify the exact group and version, then call `api_spec` with that same handle and a kind query. The returned cluster OpenAPI schema is authoritative for fields and validation supported by that cluster. +5. If you're searching for a kubernetes resource and don't know exactly the namespace/name it might have, you can mix `service_search` with standard k8s tool calls since it has the ability to probe kubernetes objects just with a finely crafted prompt. Both are useful tools in the toolkit. +6. You are also given a workbench_history tool which can be used to search past work outside of this subagent. Use this to grab additional context that might not be present in your prompt, but don't rely on it if the prompt is sufficient. +7. Use `python_sandbox` for freeform, code-based exploration of Kubernetes and cloud infrastructure. Kubernetes get/list functions and cloud SQL query functions can be mounted in it; write Python that calls those functions, processes the results, and returns only what you need. Also since many tools require a time anchor, the current time is <%= Timex.now() |> Timex.format!("{ISO:Extended}") %>. @@ -102,7 +104,7 @@ The way to use these tools is relatively simple: 1. Use `cloud_tables_*` to discover table names, then pass the exact tables needed to `cloud_schemas_*` to inspect their schemas without adding unrelated tables to the context. 2. You have a `cloud_query_*` tool to perform a broad sql query against the cloud account. You should always confirm the tables you are using in this query exist in the schema first before calling it, as a plain guess can be an expensive mistake. -3. The `cloud_query_*` tool is mounted in the python sandbox, so you can leverage it programmatically to perform any needed deterministic computations or express conditional behavior in the course of any investigation being done. +3. The `cloud_query_*` tool is mounted in `python_sandbox`. Use the sandbox for freeform, code-based exploration of that cloud account: query tables, filter and aggregate in Python, and branch on what you find instead of issuing one SQL call at a time. <% end %> ## Ideal Output diff --git a/priv/prompts/workbench/job.md.eex b/priv/prompts/workbench/job.md.eex index b3c8a3dea6..7aca1d5ccf 100644 --- a/priv/prompts/workbench/job.md.eex +++ b/priv/prompts/workbench/job.md.eex @@ -6,7 +6,7 @@ the task. You'll be given the following: * the various capabilities of the tools at your disposal, this could be querying observability systems, introspecting infrastructure configuration, and more. * interactions with additional tools like task management software or internal apis. * in addition you'll have some set of the following subagents to delegate work to, any of which could be useful to accomplish your task: - 1. an infrastructure search agent to probe infrastructure state and configuration. This will be useful for querying kubernetes api state and terraform state, but should **not** be used for querying observability systems like log stores or metrics stores. + 1. an infrastructure search agent to probe infrastructure state and configuration. This will be useful for querying kubernetes api state and terraform state, including inspecting the installed API and CRD schemas directly from a cluster. It is **not** for querying observability systems like log stores or metrics stores. 2. a coding agent to either analyze or modify code, generating a pull request<%= if @review do %>, or to review an existing pull request<% end %> 3. an observability agent, to probe observability systems and analyze the outputs 4. a monitoring agent, specifically to inspect, create, update, reinterpret, or delete persistent Plural dashboards and monitors. Use observability for investigation and monitoring for changing dashboard or alerting configuration. @@ -18,7 +18,7 @@ the task. You'll be given the following: Basic guardrails for using these subagents: -* Infrastructure should only be used for querying kubernetes api state and terraform state. It should **not** be used for querying observability systems like log stores or metrics stores, use the observability agent for that. +* Infrastructure should only be used for querying kubernetes api state, Kubernetes API and CRD schemas, and terraform state. It should answer questions about custom-resource fields against the schema installed on the relevant cluster. It should **not** be used for querying observability systems like log stores or metrics stores; use the observability agent for that. * All log, timeseries and trace data should be queried using the observability agent. * Delegate persistent dashboard and monitor creation, updates, imports, and deletion to the monitoring agent. It can query observability data itself to validate the configuration it manages. * When you're ready to inspect code, leverage the coding agent to either analyze or modify code, generating a pull request in write mode. diff --git a/priv/prompts/workbench/monitoring.md.eex b/priv/prompts/workbench/monitoring.md.eex index acb97eed2e..52f56b02dc 100644 --- a/priv/prompts/workbench/monitoring.md.eex +++ b/priv/prompts/workbench/monitoring.md.eex @@ -8,7 +8,7 @@ This subagent is explicitly for dashboard and monitor management. Use it when th 2. List and inspect existing workbench dashboards and monitors before changing them. Reuse established naming, tools, queries, inputs, and layout conventions. 3. Query current logs, metrics, and traces to validate that proposed data sources exist and return useful data. 4. When external dashboard tools are available, inspect the source dashboard and reinterpret its intent using Plural graph types, layouts, variables, and named workbench data sources. External dashboard pagination is normalized across providers: omit `cursor` for the first page, then pass the opaque `next_cursor` returned by each response to fetch the next page. Never construct, decode, or modify a cursor yourself. Do not copy unsupported provider-specific presentation details blindly. -5. Upsert the requested dashboards or monitors. For dashboards, ensure graph identifiers are unique and layout rectangles do not overlap. For monitors, use exactly one typed log or metrics query and a meaningful threshold, schedule, service, and investigation configuration. +5. Upsert the requested dashboards or monitors. Build dashboards one graph at a time by repeatedly upserting the dashboard by name. Ensure graph identifiers are unique and layout rectangles do not overlap. Delete individual graphs by dashboard name and graph identifier, or use the dashboard delete tool when the entire dashboard should be removed. For monitors, use exactly one typed log or metrics query and a meaningful threshold, schedule, service, and investigation configuration. 6. Read the resulting resources back and summarize what was created, updated, or deleted. Dashboard and monitor definitions are also valuable documentation for the system. Their descriptions, graph data sources, variable inputs, queries, thresholds, and current monitor states should inform further observability queries. diff --git a/priv/tools/plan_summary.json b/priv/tools/plan_summary.json new file mode 100644 index 0000000000..aa14cf5164 --- /dev/null +++ b/priv/tools/plan_summary.json @@ -0,0 +1,34 @@ +{ + "type": "object", + "properties": { + "summary": { + "type": "string", + "description": "A short summary of what this infrastructure plan will change. Markdown format is preferred." + }, + "blast_radius": { + "type": "string", + "description": "The expected blast radius of applying this plan: what is in scope, how broad the impact is, and which environments or workloads are touched. Markdown format is preferred." + }, + "critical_systems": { + "type": "array", + "description": "Critical systems, services, or resources that could be affected by applying this plan. Empty if none. Markdown format is preferred.", + "items": { + "type": "string", + "description": "A critical system that could be affected. Markdown format is preferred." + } + }, + "notable_changes": { + "type": "array", + "description": "The most important resource creates, updates, or destroys in this plan. Markdown format is preferred.", + "items": { + "type": "string", + "description": "A notable resource change. Markdown format is preferred." + } + }, + "safety": { + "type": "string", + "description": "Whether it is safe to apply this plan, including any caveats, sequencing requirements, or reasons to wait. Markdown format is preferred." + } + }, + "required": ["summary", "blast_radius", "critical_systems", "notable_changes", "safety"] +} diff --git a/priv/tools/workbench/infrastructure/api_discovery.json b/priv/tools/workbench/infrastructure/api_discovery.json new file mode 100644 index 0000000000..29140c64d5 --- /dev/null +++ b/priv/tools/workbench/infrastructure/api_discovery.json @@ -0,0 +1,22 @@ +{ + "type": "object", + "properties": { + "cluster": { + "type": "string", + "description": "The Plural cluster handle identifying which cluster to inspect" + }, + "group": { + "type": "string", + "description": "Optionally return only APIs whose Kubernetes API group contains this value" + }, + "version": { + "type": "string", + "description": "Optionally return only APIs whose version contains this value" + }, + "kind": { + "type": "string", + "description": "Optionally return only APIs whose resource kind contains this value" + } + }, + "required": ["cluster"] +} diff --git a/priv/tools/workbench/infrastructure/api_spec.json b/priv/tools/workbench/infrastructure/api_spec.json new file mode 100644 index 0000000000..e22e41114c --- /dev/null +++ b/priv/tools/workbench/infrastructure/api_spec.json @@ -0,0 +1,22 @@ +{ + "type": "object", + "properties": { + "cluster": { + "type": "string", + "description": "The Plural cluster handle identifying which cluster to inspect" + }, + "group": { + "type": "string", + "description": "The Kubernetes API group containing the kind" + }, + "version": { + "type": "string", + "description": "The version of the Kubernetes API group" + }, + "query": { + "type": "string", + "description": "A case-insensitive kind or schema name to search for within the API group and version" + } + }, + "required": ["cluster", "group", "version", "query"] +} diff --git a/priv/tools/workbench/monitoring/dashboard_delete.json b/priv/tools/workbench/monitoring/dashboard_delete.json new file mode 100644 index 0000000000..fffe4ea786 --- /dev/null +++ b/priv/tools/workbench/monitoring/dashboard_delete.json @@ -0,0 +1,10 @@ +{ + "type": "object", + "properties": { + "dashboard_name": { + "type": "string", + "description": "Unique name of the dashboard to permanently delete" + } + }, + "required": ["dashboard_name"] +} diff --git a/priv/tools/workbench/monitoring/dashboard_graph_delete.json b/priv/tools/workbench/monitoring/dashboard_graph_delete.json new file mode 100644 index 0000000000..f04fcf7155 --- /dev/null +++ b/priv/tools/workbench/monitoring/dashboard_graph_delete.json @@ -0,0 +1,14 @@ +{ + "type": "object", + "properties": { + "dashboard_name": { + "type": "string", + "description": "Unique name of a dashboard belonging to this workbench" + }, + "graph_identifier": { + "type": "string", + "description": "Unique identifier of the graph to delete" + } + }, + "required": ["dashboard_name", "graph_identifier"] +} diff --git a/priv/tools/workbench/monitoring/dashboard_upsert.json b/priv/tools/workbench/monitoring/dashboard_upsert.json index afd7fcc91b..b7adc87461 100644 --- a/priv/tools/workbench/monitoring/dashboard_upsert.json +++ b/priv/tools/workbench/monitoring/dashboard_upsert.json @@ -1,52 +1,53 @@ { "type": "object", "properties": { - "dashboard_id": { + "dashboard_name": { "type": "string", - "description": "Existing dashboard ID to update; omit to create" + "description": "Unique dashboard name. A dashboard with this name is updated, otherwise it is created." }, - "attributes": { + "graph": { "type": "object", "properties": { - "name": { "type": "string" }, + "identifier": { "type": "string" }, + "title": { "type": "string" }, "description": { "type": "string" }, - "graphs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "identifier": { "type": "string" }, - "title": { "type": "string" }, - "description": { "type": "string" }, - "type": { - "type": "string", - "enum": ["timeseries", "gauge", "logs", "markdown", "table", "stat", "bar", "pie", "heatmap", "traces"] - }, - "markdown": { "type": "string" }, - "options": { "type": "object" }, - "layout": { - "type": "object", - "properties": { - "x": { "type": "integer", "minimum": 0 }, - "y": { "type": "integer", "minimum": 0 }, - "w": { "type": "integer", "minimum": 1 }, - "h": { "type": "integer", "minimum": 1 } - }, - "required": ["x", "y", "w", "h"] - }, - "datasource": { - "type": "object", - "properties": { - "type": { "type": "string", "enum": ["logs", "metrics", "traces", "labels"] }, - "tool": { "type": "string" }, - "input": { "type": "object" } - }, - "required": ["type", "tool", "input"] - } - }, - "required": ["identifier", "type", "layout"] - } + "type": { + "type": "string", + "enum": ["timeseries", "gauge", "logs", "markdown", "table", "stat", "bar", "pie", "heatmap", "traces"] + }, + "markdown": { "type": "string" }, + "options": { "type": "object" }, + "layout": { + "type": "object", + "properties": { + "x": { "type": "integer", "minimum": 0 }, + "y": { "type": "integer", "minimum": 0 }, + "w": { "type": "integer", "minimum": 1 }, + "h": { "type": "integer", "minimum": 1 } + }, + "required": ["x", "y", "w", "h"] }, + "datasource": { + "type": "object", + "properties": { + "type": { "type": "string", "enum": ["logs", "metrics", "traces", "labels"] }, + "tool": { "type": "string" }, + "input": { "type": "object" } + }, + "required": ["type", "tool", "input"] + } + }, + "required": ["identifier", "type", "layout"] + }, + "settings": { + "type": "object", + "description": "Optional dashboard-level settings. Omitted settings preserve their current values.", + "properties": { + "name": { + "type": "string", + "description": "Optional new dashboard name" + }, + "description": { "type": "string" }, "inputs": { "type": "array", "items": { @@ -75,9 +76,8 @@ "required": ["name", "type"] } } - }, - "required": ["name"] + } } }, - "required": ["attributes"] + "required": ["dashboard_name", "graph"] } diff --git a/priv/tools/workbench/observability/external_monitor.json b/priv/tools/workbench/observability/external_monitor.json new file mode 100644 index 0000000000..327d1c1887 --- /dev/null +++ b/priv/tools/workbench/observability/external_monitor.json @@ -0,0 +1,14 @@ +{ + "type": "object", + "properties": { + "monitor_id": { + "type": "string", + "description": "Provider-specific monitor or alert ID returned by the external monitor list tool" + }, + "scope": { + "type": "string", + "description": "Provider scope when required, such as a Sentry organization slug" + } + }, + "required": ["monitor_id"] +} diff --git a/priv/tools/workbench/observability/external_monitors.json b/priv/tools/workbench/observability/external_monitors.json new file mode 100644 index 0000000000..d337f69dad --- /dev/null +++ b/priv/tools/workbench/observability/external_monitors.json @@ -0,0 +1,24 @@ +{ + "type": "object", + "properties": { + "q": { + "type": "string", + "description": "Optional provider-native monitor or alert name search when supported" + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25, + "description": "Requested API page size; providers with a fixed page size may return more" + }, + "scope": { + "type": "string", + "description": "Provider scope when required, such as a Sentry organization slug" + }, + "cursor": { + "type": "string", + "description": "Opaque provider pagination cursor returned by the previous page" + } + } +} diff --git a/priv/tools/workbench/observability/log_aggregate.json b/priv/tools/workbench/observability/log_aggregate.json index 96697840df..f5c25e5359 100644 --- a/priv/tools/workbench/observability/log_aggregate.json +++ b/priv/tools/workbench/observability/log_aggregate.json @@ -3,7 +3,7 @@ "properties": { "query": { "type": "string", - "description": "The query used to select logs to aggregate" + "description": "Optional provider-specific query used to select logs. Leave empty to aggregate logs without a text filter." }, "bucket_size": { "type": "string", @@ -12,7 +12,8 @@ "operator": { "type": "string", "enum": ["and", "or"], - "description": "How facets are combined" + "default": "or", + "description": "How terms in the log query are combined. Facet filters are always combined with AND." }, "facets": { "type": "array", @@ -44,5 +45,5 @@ } } }, - "required": ["query", "bucket_size"] + "required": ["bucket_size"] } diff --git a/priv/tools/workbench/observability/log_aggregate_azure.json b/priv/tools/workbench/observability/log_aggregate_azure.json index cf6a45b125..470ad359a0 100644 --- a/priv/tools/workbench/observability/log_aggregate_azure.json +++ b/priv/tools/workbench/observability/log_aggregate_azure.json @@ -3,7 +3,7 @@ "properties": { "query": { "type": "string", - "description": "The query used to select logs to aggregate" + "description": "Optional provider-specific query used to select logs. Leave empty to aggregate logs without a text filter." }, "bucket_size": { "type": "string", @@ -12,7 +12,8 @@ "operator": { "type": "string", "enum": ["and", "or"], - "description": "How facets are combined" + "default": "or", + "description": "How terms in the log query are combined. Facet filters are always combined with AND." }, "facets": { "type": "array", @@ -59,5 +60,5 @@ } } }, - "required": ["query", "bucket_size"] + "required": ["bucket_size"] } diff --git a/priv/tools/workbench/observability/logs.json b/priv/tools/workbench/observability/logs.json index 1bd3d348ab..b610196fb5 100644 --- a/priv/tools/workbench/observability/logs.json +++ b/priv/tools/workbench/observability/logs.json @@ -3,7 +3,7 @@ "properties": { "query": { "type": "string", - "description": "The query to use to gather logs" + "description": "Optional provider-specific query used to gather logs. Leave empty to page logs without a text filter." }, "facets": { "type": "array", @@ -39,6 +39,5 @@ } } } - }, - "required": ["query"] + } } diff --git a/priv/tools/workbench/observability/logs_azure.json b/priv/tools/workbench/observability/logs_azure.json index 170f52f8a4..3557f60fd6 100644 --- a/priv/tools/workbench/observability/logs_azure.json +++ b/priv/tools/workbench/observability/logs_azure.json @@ -3,7 +3,7 @@ "properties": { "query": { "type": "string", - "description": "The query to use to gather logs" + "description": "Optional provider-specific query used to gather logs. Leave empty to page logs without a text filter." }, "facets": { "type": "array", @@ -56,6 +56,5 @@ } } } - }, - "required": ["query"] + } } diff --git a/proto/console.proto b/proto/console.proto index b2492bb6b9..6b1bd71ac4 100644 --- a/proto/console.proto +++ b/proto/console.proto @@ -66,6 +66,11 @@ message VertexAiConfig { repeated string proxyModels = 9; } +enum BedrockEndpoint { + RUNTIME = 0; + MANTLE = 1; +} + message BedrockConfig { optional string modelId = 1; optional string toolModelId = 2; @@ -76,6 +81,7 @@ message BedrockConfig { optional string awsSecretAccessKey = 7; repeated string proxyModels = 8; map deployments = 9; + optional BedrockEndpoint endpoint = 10; } message AzureOpenAiConfig { diff --git a/rel/runtime.exs b/rel/runtime.exs index 907921a8e5..93dbcf6eb7 100644 --- a/rel/runtime.exs +++ b/rel/runtime.exs @@ -97,6 +97,10 @@ if get_env("CONSOLE_TARBALL_QPS") do config :console, :tarball_qps, String.to_integer(get_env("CONSOLE_TARBALL_QPS")) end +if get_env("CONSOLE_MAX_REQUEST_BODY_LENGTH") do + config :console, :max_request_body_length, String.to_integer(get_env("CONSOLE_MAX_REQUEST_BODY_LENGTH")) +end + if get_env("CONSOLE_CACHE_AGENT_QPS") do config :console, :cache_agent_qps, String.to_integer(get_env("CONSOLE_CACHE_AGENT_QPS")) end diff --git a/schema/schema.graphql b/schema/schema.graphql index 0f92324da2..c0f3d2ff42 100644 --- a/schema/schema.graphql +++ b/schema/schema.graphql @@ -2953,6 +2953,7 @@ enum WorkbenchToolType { CLOUD_RUN AZURE_FUNCTION DOCKER + VICTORIA_LOGS } enum WorkbenchToolCategory { @@ -2980,6 +2981,11 @@ enum WorkbenchToolHttpMethod { PATCH } +enum SplunkTokenType { + BEARER + SPLUNK +} + enum WorkbenchJobStatus { PENDING RUNNING @@ -3476,6 +3482,9 @@ input WorkbenchToolConfigurationAttributes { "loki connection (logs)" loki: WorkbenchToolLokiConnectionAttributes + "victoria logs connection (logs)" + victoriaLogs: WorkbenchToolVictoriaLogsConnectionAttributes + "splunk connection (logs)" splunk: WorkbenchToolSplunkConnectionAttributes @@ -3629,6 +3638,26 @@ input WorkbenchToolLokiConnectionAttributes { tenantId: String } +input WorkbenchToolVictoriaLogsConnectionAttributes { + "victoria logs base url" + url: String! + + "bearer token or api key" + token: String + + "basic auth username" + username: String + + "basic auth password" + password: String + + "optional AccountID tenant header" + accountId: String + + "optional ProjectID tenant header" + projectId: String +} + input WorkbenchToolTempoConnectionAttributes { "tempo base url" url: String! @@ -3664,9 +3693,12 @@ input WorkbenchToolSplunkConnectionAttributes { "splunk base url" url: String! - "bearer token" + "splunk authentication token" token: String + "authorization realm for token authentication" + tokenType: SplunkTokenType + "basic auth username" username: String @@ -5151,6 +5183,9 @@ type WorkbenchToolConfiguration { "loki connection (no secrets)" loki: WorkbenchToolLokiConnection + "victoria logs connection (no secrets)" + victoriaLogs: WorkbenchToolVictoriaLogsConnection + "splunk connection (no secrets)" splunk: WorkbenchToolSplunkConnection @@ -5283,6 +5318,20 @@ type WorkbenchToolLokiConnection { tenantId: String } +type WorkbenchToolVictoriaLogsConnection { + "victoria logs base url" + url: String + + "basic auth username" + username: String + + "optional AccountID tenant header" + accountId: String + + "optional ProjectID tenant header" + projectId: String +} + type WorkbenchToolTempoConnection { "tempo base url" url: String @@ -5306,6 +5355,9 @@ type WorkbenchToolSplunkConnection { "splunk base url" url: String + "authorization realm for token authentication" + tokenType: SplunkTokenType + "basic auth username" username: String } @@ -6678,6 +6730,11 @@ enum OpenAiMethod { AUTO } +enum BedrockEndpoint { + RUNTIME + MANTLE +} + enum Provider { AWS GCP @@ -6998,6 +7055,9 @@ input BedrockAiAttributes { "Bedrock model or inference profile for embeddings. Same ID formats as modelId." embeddingModel: String + "AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic\/OpenAI-compatible APIs." + endpoint: BedrockEndpoint + "Additional Bedrock model or inference profile IDs exposed through the Nexus OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId." proxyModels: [String] @@ -7435,6 +7495,9 @@ type BedrockAiSettings { "Bedrock model or inference profile for embeddings. Same ID formats as modelId." embeddingModel: String + "AWS Bedrock API surface to use. RUNTIME (default) uses InvokeModel or Converse on bedrock-runtime; MANTLE uses the Bedrock Mantle Anthropic\/OpenAI-compatible APIs." + endpoint: BedrockEndpoint + "Additional Bedrock model or inference profile IDs exposed through the Nexus OpenAI-compatible proxy beyond modelId, toolModelId, and embeddingModel. Same ID formats as modelId." proxyModels: [String] diff --git a/test/console/ai/plan_test.exs b/test/console/ai/plan_test.exs new file mode 100644 index 0000000000..5a92e4f9a4 --- /dev/null +++ b/test/console/ai/plan_test.exs @@ -0,0 +1,82 @@ +defmodule Console.AI.PlanTest do + use Console.DataCase, async: false + use Mimic + alias Console.AI.Plan + alias Console.AI.Tools.PlanSummary + + setup do + {:ok, settings: deployment_settings(ai: %{ + enabled: true, + provider: :openai, + openai: %{access_token: "key"} + })} + end + + describe "comment/1" do + test "it generates a plan summary and posts it to the pr" do + git = insert(:git_repository, url: "https://github.com/pluralsh/console.git") + stack = insert(:stack, repository: git, connection: insert(:scm_connection)) + run = insert(:stack_run, + status: :pending_approval, + stack: stack, + repository: git, + git: %{ref: "master", folder: "plural/terraform/aws"}, + pull_request: insert(:pull_request, url: "https://github.com/pluralsh/console/pull/10") + ) + insert(:stack_state, run: run, plan: "some large plan") + + expect(Console.AI.OpenAI, :tool_call, fn _, _, [tool], _ -> + assert tool == PlanSummary + {:ok, [%Console.AI.Tool{ + name: "plural_plan_summary", + arguments: %{ + "summary" => "summary", + "blast_radius" => "limited blast radius", + "critical_systems" => ["api"], + "notable_changes" => ["update aws_instance.web"], + "safety" => "safe to apply" + } + }]} + end) + expect(Tentacat.Pulls.Reviews, :create, fn _, _, _, _, %{"body" => body} -> + assert body =~ "Blast Radius" + assert body =~ "Safety Assessment" + {:ok, %{"id" => "id"}, :ok} + end) + + {:ok, updated} = Plan.comment(run) + + assert updated.scm_state.ai_comment_id == "id" + end + + test "it cannot post a plan summary without a pull request" do + run = insert(:stack_run, status: :pending_approval) + insert(:stack_state, run: run, plan: "some large plan") + + expect(Console.AI.OpenAI, :tool_call, fn _, _, [tool], _ -> + assert tool == PlanSummary + {:ok, [%Console.AI.Tool{ + name: "plural_plan_summary", + arguments: %{ + "summary" => "summary", + "blast_radius" => "limited blast radius", + "critical_systems" => [], + "notable_changes" => [], + "safety" => "safe to apply" + } + }]} + end) + + {:error, "cannot post plan summary for this stack run"} = Plan.comment(run) + end + end + + describe "enqueue/1" do + test "it is a no-op without a pull request" do + run = insert(:stack_run, status: :pending_approval) + insert(:stack_state, run: run, plan: "some large plan") + + :ok = Plan.enqueue(run) + end + end +end diff --git a/test/console/ai/provider/bedrock_test.exs b/test/console/ai/provider/bedrock_test.exs index 607197edc3..4832bfad1f 100644 --- a/test/console/ai/provider/bedrock_test.exs +++ b/test/console/ai/provider/bedrock_test.exs @@ -12,6 +12,44 @@ defmodule Console.AI.Provider.BedrockTest do setup :set_mimic_global + describe "provider_options/1" do + test "uses the runtime endpoint by default" do + bedrock = + Bedrock.new(%BedrockSettings{ + region: @region, + aws_access_key_id: "test-access-key", + aws_secret_access_key: "test-secret-key" + }) + + assert Bedrock.provider_options(bedrock)[:endpoint] == :runtime + end + + test "passes the configured Mantle endpoint to ReqLLM" do + bedrock = + Bedrock.new(%BedrockSettings{ + region: @region, + endpoint: :mantle, + aws_access_key_id: "test-access-key", + aws_secret_access_key: "test-secret-key" + }) + + assert Bedrock.provider_options(bedrock)[:endpoint] == :mantle + end + + test "maps the configured Bedrock bearer token to ReqLLM's API key option" do + bedrock = + Bedrock.new(%BedrockSettings{ + region: @region, + access_token: "bedrock-token" + }) + + options = Bedrock.provider_options(bedrock) + + assert options[:api_key] == "bedrock-token" + refute Keyword.has_key?(options, :access_token) + end + end + describe "tool_call/4" do test "calls the configured inference profile id in the Bedrock runtime REST URL" do bedrock = @@ -61,6 +99,90 @@ defmodule Console.AI.Provider.BedrockTest do end describe "completion/3" do + test "calls and SigV4-signs the configured Bedrock Mantle endpoint" do + model_id = "anthropic.claude-sonnet-4-6" + + bedrock = + Bedrock.new(%BedrockSettings{ + model_id: model_id, + region: @region, + endpoint: :mantle, + aws_access_key_id: "test-access-key", + aws_secret_access_key: "test-secret-key" + }) + + expected_url = "https://bedrock-mantle.#{@region}.api.aws/anthropic/v1/messages" + + expect(Req, :request, fn %Req.Request{} = request -> + assert request.method == :post + assert URI.to_string(request.url) == expected_url + assert Keyword.has_key?(request.request_steps, :aws_sigv4) + + {:ok, + %Req.Response{ + status: 200, + body: %Response{ + id: "test-response", + model: model_id, + context: %ReqLLM.Context{messages: []}, + message: %Message{ + role: :assistant, + content: [%ContentPart{type: :text, text: "hello from mantle"}] + }, + finish_reason: :stop, + usage: @usage, + stream?: false + } + }} + end) + + assert {:ok, "hello from mantle"} = + Bedrock.completion(bedrock, [{:user, "hi"}], []) + end + + test "sets GPT-5.6 reasoning to low without lowering its output token limit" do + model_id = "openai.gpt-5.6-terra" + + bedrock = + Bedrock.new(%BedrockSettings{ + model_id: model_id, + region: @region, + endpoint: :mantle, + aws_access_key_id: "test-access-key", + aws_secret_access_key: "test-secret-key" + }) + + expect(Req, :request, fn %Req.Request{} = request -> + body = Jason.decode!(request.body) + + assert URI.to_string(request.url) == + "https://bedrock-mantle.#{@region}.api.aws/openai/v1/responses" + + assert body["reasoning"] == %{"effort" => "low"} + assert body["max_output_tokens"] == 128_000 + + {:ok, + %Req.Response{ + status: 200, + body: %Response{ + id: "test-response", + model: model_id, + context: %ReqLLM.Context{messages: []}, + message: %Message{ + role: :assistant, + content: [%ContentPart{type: :text, text: "hello with low reasoning"}] + }, + finish_reason: :stop, + usage: @usage, + stream?: false + } + }} + end) + + assert {:ok, "hello with low reasoning"} = + Bedrock.completion(bedrock, [{:user, "hi"}], []) + end + test "calls the configured inference profile id in the Bedrock runtime REST URL" do bedrock = Bedrock.new(%BedrockSettings{ diff --git a/test/console/ai/pubsub/consumer_test.exs b/test/console/ai/pubsub/consumer_test.exs index 2fa7e49b5c..92f5d2027c 100644 --- a/test/console/ai/pubsub/consumer_test.exs +++ b/test/console/ai/pubsub/consumer_test.exs @@ -112,74 +112,3 @@ defmodule Console.AI.PubSub.ConsumerTest do # end # end end - -defmodule Console.AI.PubSub.ConsumerSyncTest do - use Console.DataCase, async: false - use Mimic - alias Console.AI.PubSub.Consumer - alias Console.PubSub - - setup do - {:ok, settings: deployment_settings(ai: %{enabled: true, provider: :openai, openai: %{access_token: "key"}})} - end - - describe "StackRunUpdated" do - test "it will figure out what a terraform plan does" do - git = insert(:git_repository, url: "https://github.com/pluralsh/console.git") - stack = insert(:stack, repository: git) - run = insert(:stack_run, status: :pending_approval, stack: stack, repository: git, git: %{ref: "master", folder: "plural/terraform/aws"}) - state = insert(:stack_state, run: run, plan: "some large plan") - expect(Console.AI.OpenAI, :tool_call, fn _, _, [_], _ -> - {:ok, [%Console.AI.Tool{ - name: "plural_insight", - arguments: %{ - "summary" => "summary", - "root_cause" => "root cause", - "key_evidence" => ["key evidence"], - "contextual_observations" => ["contextual observations"] - } - }]} - end) - expect(Console.AI.OpenAI, :completion, fn _, _, _ -> {:ok, "openai completion"} end) - - event = %PubSub.StackRunUpdated{item: run} - {:ok, res} = Consumer.handle_event(event) - - assert res.id == refetch(state).insight_id - assert is_binary(res.text) - end - - test "it will figure out what a terraform plan does for pr runs too" do - git = insert(:git_repository, url: "https://github.com/pluralsh/console.git") - stack = insert(:stack, repository: git) - run = insert(:stack_run, - status: :successful, - stack: stack, - repository: git, - git: %{ref: "master", folder: "plural/terraform/aws"}, - pull_request: insert(:pull_request) - ) - state = insert(:stack_state, run: run, plan: "some large plan") - expect(Console.AI.OpenAI, :tool_call, fn _, _, [_], _ -> - {:ok, [%Console.AI.Tool{ - name: "plural_insight", - arguments: %{ - "summary" => "summary", - "root_cause" => "root cause", - "key_evidence" => ["key evidence"], - "contextual_observations" => ["contextual observations"] - } - }]} - end) - expect(Console.AI.OpenAI, :completion, fn _, _, _ -> {:ok, "openai completion"} end) - - event = %PubSub.StackRunUpdated{item: run} - {:ok, res} = Consumer.handle_event(event) - - assert res.id == refetch(state).insight_id - assert is_binary(res.text) - - assert_receive {:event, %PubSub.StackStateInsight{item: {_, ^res}}} - end - end -end diff --git a/test/console/ai/tools/plan_summary_test.exs b/test/console/ai/tools/plan_summary_test.exs new file mode 100644 index 0000000000..20276a531e --- /dev/null +++ b/test/console/ai/tools/plan_summary_test.exs @@ -0,0 +1,38 @@ +defmodule Console.AI.Tools.PlanSummaryTest do + use Console.DataCase, async: true + alias Console.AI.Tools.PlanSummary + + describe "implement/1" do + test "it renders a plan summary as markdown" do + {:ok, md} = PlanSummary.implement(%PlanSummary{ + summary: "Adds a new node group", + blast_radius: "Only the new node group is created", + critical_systems: ["kube-system"], + notable_changes: ["create aws_eks_node_group.workers"], + safety: "Safe to apply after reviewing IAM changes" + }) + + assert md =~ "## Summary" + assert md =~ "Adds a new node group" + assert md =~ "## Blast Radius" + assert md =~ "* kube-system" + assert md =~ "* create aws_eks_node_group.workers" + assert md =~ "## Safety Assessment" + assert md =~ "Safe to apply after reviewing IAM changes" + end + + test "it omits empty list sections" do + {:ok, md} = PlanSummary.implement(%PlanSummary{ + summary: "No-op plan", + blast_radius: "None", + critical_systems: [], + notable_changes: [], + safety: "Safe to apply" + }) + + refute md =~ "## Critical Systems" + refute md =~ "## Notable Changes" + assert md =~ "## Safety Assessment" + end + end +end diff --git a/test/console/ai/tools/workbench/infrastructure/api_discovery_test.exs b/test/console/ai/tools/workbench/infrastructure/api_discovery_test.exs new file mode 100644 index 0000000000..d67f043c91 --- /dev/null +++ b/test/console/ai/tools/workbench/infrastructure/api_discovery_test.exs @@ -0,0 +1,116 @@ +defmodule Console.AI.Tools.Workbench.Infrastructure.ApiDiscoveryTest do + use Console.DataCase, async: false + use Mimic + + alias Console.AI.Tool + alias Console.AI.Tools.Workbench.Infrastructure.{ApiDiscovery, ApiSpec} + alias Console.Deployments.Clusters + + setup :set_mimic_global + + describe "ApiDiscovery" do + test "requires a cluster handle" do + assert {:error, changeset} = Tool.validate(%ApiDiscovery{}, %{}) + assert Keyword.has_key?(changeset.errors, :cluster) + end + + test "lists APIs discovered from the requested cluster" do + user = insert(:user) + cluster = insert(:cluster, read_bindings: [%{user_id: user.id}]) + + expect(Clusters, :api_discovery, fn fetched -> + assert fetched.id == cluster.id + %{{"example.com", "v1", "Widget"} => "widgets"} + end) + + assert {:ok, tool} = + Tool.validate(%ApiDiscovery{user: user}, %{"cluster" => cluster.handle}) + + assert {:ok, json} = ApiDiscovery.implement(tool) + assert Jason.decode!(json) == [ + %{ + "group" => "example.com", + "version" => "v1", + "kind" => "Widget", + "plural" => "widgets" + } + ] + end + + test "filters discovered APIs by group, version, and kind" do + user = insert(:user) + cluster = insert(:cluster, read_bindings: [%{user_id: user.id}]) + + expect(Clusters, :api_discovery, fn _ -> + %{ + {"example.com", "v1", "Widget"} => "widgets", + {"example.com", "v1", "Gadget"} => "gadgets", + {"example.com", "v2", "Widget"} => "widgets", + {"unrelated.com", "v1", "Widget"} => "widgets" + } + end) + + assert {:ok, tool} = + Tool.validate(%ApiDiscovery{user: user}, %{ + "cluster" => cluster.handle, + "group" => "EXAMPLE", + "version" => "1", + "kind" => "idg" + }) + + assert {:ok, json} = ApiDiscovery.implement(tool) + + assert Jason.decode!(json) == [ + %{ + "group" => "example.com", + "version" => "v1", + "kind" => "Widget", + "plural" => "widgets" + } + ] + end + end + + describe "ApiSpec" do + test "requires the cluster, group, version, and query" do + assert {:error, changeset} = Tool.validate(%ApiSpec{}, %{}) + + for field <- [:cluster, :group, :version, :query] do + assert Keyword.has_key?(changeset.errors, field) + end + end + + test "searches the requested cluster's OpenAPI schemas" do + user = insert(:user) + cluster = insert(:cluster, read_bindings: [%{user_id: user.id}]) + + expect(Clusters, :api_spec, fn fetched, "example.com", "v1" -> + assert fetched.id == cluster.id + + {:ok, + %{ + "components" => %{ + "schemas" => %{ + "com.example.v1.Widget" => %{"type" => "object"}, + "com.example.v1.Gadget" => %{"type" => "object"} + } + } + }} + end) + + assert {:ok, tool} = + Tool.validate(%ApiSpec{user: user}, %{ + "cluster" => cluster.handle, + "group" => "example.com", + "version" => "v1", + "query" => "widget" + }) + + assert {:ok, json} = ApiSpec.implement(tool) + + assert Jason.decode!(json) == %{ + "com.example.v1.Widget" => %{"type" => "object"} + } + end + end +end diff --git a/test/console/ai/tools/workbench/monitoring_test.exs b/test/console/ai/tools/workbench/monitoring_test.exs index 2ef3ab76b0..c4beecf90c 100644 --- a/test/console/ai/tools/workbench/monitoring_test.exs +++ b/test/console/ai/tools/workbench/monitoring_test.exs @@ -4,6 +4,8 @@ defmodule Console.AI.Tools.Workbench.MonitoringTest do alias Console.AI.Tool alias Console.AI.Tools.Workbench.Monitoring alias Console.AI.Tools.Workbench.Monitoring.{ + DashboardDelete, + DashboardGraphDelete, DashboardList, DashboardUpsert, MonitorList, @@ -68,39 +70,53 @@ defmodule Console.AI.Tools.Workbench.MonitoringTest do |> Enum.map(&Tool.name/1) |> MapSet.new() == MapSet.new( - ~w(workbench_dashboard_upsert workbench_dashboard_delete workbench_monitor_upsert workbench_monitor_delete) + ~w(workbench_dashboard_upsert workbench_dashboard_graph_delete workbench_dashboard_delete workbench_monitor_upsert workbench_monitor_delete) ) end test "creates a dashboard in the current workbench and associates it to the job" do user = insert(:user, roles: %{admin: true}) - job = insert(:workbench_job, user: user) + workbench = insert(:workbench) + job = insert(:workbench_job, workbench: workbench, user: user) + + tool = + insert(:workbench_tool, + name: "prom", + tool: :prometheus, + categories: [:metrics], + configuration: %{ + prometheus: %{url: "https://prom.example.com", token: "token", tenant_id: nil} + } + ) + + insert(:workbench_tool_association, workbench: workbench, tool: tool) assert {:ok, tool} = Tool.validate( %DashboardUpsert{job: job, user: user}, %{ - "attributes" => %{ - "name" => "API health", - "graphs" => [ - %{ - "identifier" => "requests", - "type" => "timeseries", - "layout" => %{"x" => 0, "y" => 0, "w" => 6, "h" => 4}, - "datasource" => %{ - "type" => "metrics", - "tool" => "workbench_observability_metrics_prom", - "input" => %{"query" => "sum(rate(http_requests_total[5m]))"} - } - } - ] + "dashboard_name" => "API health", + "graph" => %{ + "identifier" => "requests", + "type" => "timeseries", + "layout" => %{"x" => 0, "y" => 0, "w" => 6, "h" => 4}, + "datasource" => %{ + "type" => "metrics", + "tool" => "workbench_observability_metrics_prom", + "input" => %{"query" => "sum(rate(http_requests_total[5m]))"} + } } } ) - assert %DashboardUpsert.Attributes{} = tool.attributes + assert %Console.Schema.Dashboard.Graph{} = tool.graph assert {:ok, json} = DashboardUpsert.implement(tool) - assert %{"name" => "API health", "id" => dashboard_id} = Jason.decode!(json) + + assert %{ + "name" => "API health", + "id" => dashboard_id, + "graphs" => [%{"identifier" => "requests"}] + } = Jason.decode!(json) assert Repo.get_by(WorkbenchJobAssociation, workbench_job_id: job.id, @@ -108,6 +124,152 @@ defmodule Console.AI.Tools.Workbench.MonitoringTest do ) end + test "creates a traces dashboard graph wired to a workbench traces tool" do + user = insert(:user, roles: %{admin: true}) + workbench = insert(:workbench) + job = insert(:workbench_job, workbench: workbench, user: user) + + tool = + insert(:workbench_tool, + name: "tempo", + tool: :tempo, + categories: [:traces], + configuration: %{ + tempo: %{url: "https://tempo.example.com", token: "token", tenant_id: nil} + } + ) + + insert(:workbench_tool_association, workbench: workbench, tool: tool) + + assert {:ok, upsert} = + Tool.validate( + %DashboardUpsert{job: job, user: user}, + %{ + "dashboard_name" => "Checkout traces", + "graph" => %{ + "identifier" => "checkout", + "type" => "traces", + "layout" => %{"x" => 0, "y" => 0, "w" => 3, "h" => 4}, + "datasource" => %{ + "type" => "traces", + "tool" => "workbench_observability_traces_tempo", + "input" => %{"query" => "{ service.name = \"checkout\" }", "limit" => 50} + } + } + } + ) + + assert upsert.graph.type == :traces + assert upsert.graph.datasource.type == :traces + assert {:ok, json} = DashboardUpsert.implement(upsert) + + assert %{ + "name" => "Checkout traces", + "graphs" => [ + %{ + "identifier" => "checkout", + "type" => "traces", + "datasource" => %{"type" => "traces"} + } + ] + } = Jason.decode!(json) + end + + test "rejects dashboard graphs whose tool call is invalid" do + user = insert(:user, roles: %{admin: true}) + workbench = insert(:workbench) + job = insert(:workbench_job, workbench: workbench, user: user) + + assert {:ok, upsert} = + Tool.validate( + %DashboardUpsert{job: job, user: user}, + %{ + "dashboard_name" => "API health", + "graph" => %{ + "identifier" => "requests", + "type" => "timeseries", + "layout" => %{"x" => 0, "y" => 0, "w" => 6, "h" => 4}, + "datasource" => %{ + "type" => "metrics", + "tool" => "not_a_real_tool", + "input" => %{"query" => "up"} + } + } + } + ) + + assert {:error, "tool not_a_real_tool not found"} = DashboardUpsert.implement(upsert) + refute Repo.get_by(Console.Schema.Dashboard, workbench_id: workbench.id, name: "API health") + end + + test "upserts dashboard graphs and deletes them by dashboard name" do + user = insert(:user, roles: %{admin: true}) + workbench = insert(:workbench) + job = insert(:workbench_job, workbench: workbench, user: user) + + dashboard = + insert(:dashboard, + workbench: workbench, + name: "API health", + description: "Existing description", + graphs: [ + %{ + identifier: "requests", + type: :timeseries, + layout: %{x: 0, y: 0, w: 6, h: 4} + } + ] + ) + + assert {:ok, upsert} = + Tool.validate( + %DashboardUpsert{job: job, user: user}, + %{ + "dashboard_name" => dashboard.name, + "graph" => %{ + "identifier" => "errors", + "type" => "stat", + "layout" => %{"x" => 6, "y" => 0, "w" => 6, "h" => 4} + } + } + ) + + assert {:ok, json} = DashboardUpsert.implement(upsert) + + assert %{ + "description" => "Existing description", + "graphs" => [%{"identifier" => "requests"}, %{"identifier" => "errors"}] + } = Jason.decode!(json) + + assert {:ok, delete} = + Tool.validate( + %DashboardGraphDelete{job: job, user: user}, + %{ + "dashboard_name" => dashboard.name, + "graph_identifier" => "requests" + } + ) + + assert {:ok, json} = DashboardGraphDelete.implement(delete) + assert %{"graphs" => [%{"identifier" => "errors"}]} = Jason.decode!(json) + end + + test "deletes an entire dashboard by name" do + user = insert(:user, roles: %{admin: true}) + workbench = insert(:workbench) + job = insert(:workbench_job, workbench: workbench, user: user) + dashboard = insert(:dashboard, workbench: workbench, name: "API health") + + assert {:ok, delete} = + Tool.validate( + %DashboardDelete{job: job, user: user}, + %{"dashboard_name" => dashboard.name} + ) + + assert {:ok, "Deleted dashboard API health"} = DashboardDelete.implement(delete) + refute Repo.get(Console.Schema.Dashboard, dashboard.id) + end + test "dashboard and monitor lists support search and offset pagination" do workbench = insert(:workbench) job = insert(:workbench_job, workbench: workbench) diff --git a/test/console/ai/tools/workbench/observability/external_dashboard_providers_test.exs b/test/console/ai/tools/workbench/observability/external_dashboard_providers_test.exs index 455dcbd764..00c59fcce5 100644 --- a/test/console/ai/tools/workbench/observability/external_dashboard_providers_test.exs +++ b/test/console/ai/tools/workbench/observability/external_dashboard_providers_test.exs @@ -1,9 +1,9 @@ -defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardProvidersTest do +defmodule Console.AI.Tools.Workbench.Observability.ExternalProvidersTest do use Console.DataCase, async: true use Mimic - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Client - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.{ + alias Console.AI.Tools.Workbench.Observability.External.Client + alias Console.AI.Tools.Workbench.Observability.External.{ Azure, Dynatrace, Sentry, @@ -34,7 +34,50 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardProvidersTes end) assert {:ok, %{dashboards: [%{id: "doc-1", title: "API"}], next_cursor: "after"}} = - Client.list(tool, nil, 25, nil, "next") + Client.list_dashboards(tool, nil, 25, nil, "next") + end + + test "Dynatrace delegates to the settings objects monitor API" do + tool = + insert(:workbench_tool, + tool: :dynatrace, + name: "dynatrace", + categories: [:metrics], + configuration: %{ + dynatrace: %{url: "https://example.apps.dynatrace.com", platform_token: "token"} + } + ) + + Req.Test.stub(Dynatrace, fn conn -> + assert conn.request_path == "/platform/classic/environment-api/v2/settings/objects" + assert %{ + "fields" => "objectId,schemaId,summary,searchSummary,scope,value", + "filter" => "value.title contains 'cpu' or value.summary contains 'cpu'", + "pageSize" => "25", + "schemaIds" => + "builtin:davis.anomaly-detectors,builtin:anomaly-detection.metric-events" + } = Plug.Conn.fetch_query_params(conn).query_params + + Req.Test.json(conn, %{ + items: [ + %{ + objectId: "obj-1", + summary: "CPU", + value: %{title: "High CPU", description: "CPU saturation"} + } + ], + nextPageKey: "after", + totalCount: 40 + }) + end) + + assert {:ok, + %{ + monitors: [%{id: "obj-1", title: "High CPU"}], + next_cursor: "after", + total: 40 + }} = + Client.list_monitors(tool, "cpu", 25) end test "Splunk delegates to the views API" do @@ -63,7 +106,41 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardProvidersTes end) assert {:ok, %{dashboards: [%{id: "api", title: "API"}], next_cursor: "26"}} = - Client.list(tool, "api", 25, nil, "25") + Client.list_dashboards(tool, "api", 25, nil, "25") + end + + test "Splunk delegates to the saved searches alert API" do + tool = + insert(:workbench_tool, + tool: :splunk, + name: "splunk", + categories: [:logs], + configuration: %{splunk: %{url: "https://splunk.example.com", token: "token", token_type: :splunk}} + ) + + Req.Test.stub(Splunk, fn conn -> + assert conn.request_path == "/servicesNS/-/-/saved/searches" + assert ["Splunk token"] = Plug.Conn.get_req_header(conn, "authorization") + assert %{ + "count" => "25", + "offset" => "0", + "output_mode" => "json", + "search" => "alert.track=1 AND (name=\"*api*\" OR title=\"*api*\")" + } = Plug.Conn.fetch_query_params(conn).query_params + + Req.Test.json(conn, %{ + entry: [%{name: "api_alert", content: %{label: "API", description: "API errors"}}], + paging: %{total: 26} + }) + end) + + assert {:ok, + %{ + monitors: [%{id: "api_alert", title: "API"}], + next_cursor: "1", + total: 26 + }} = + Client.list_monitors(tool, "api", 25) end test "Sentry delegates to the organization dashboards API" do @@ -84,7 +161,27 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardProvidersTes end) assert {:ok, %{dashboards: [%{id: "1", title: "Errors"}]}} = - Sentry.list(tool, scope: "acme", q: "errors", limit: 25, cursor: "next") + Sentry.list_dashboards(tool, scope: "acme", q: "errors", limit: 25, cursor: "next") + end + + test "Sentry delegates to the organization metric alert rules API" do + tool = + insert(:workbench_tool, + tool: :sentry, + name: "sentry", + categories: [:error_tracking], + configuration: %{sentry: %{url: "https://sentry.example.com", access_token: "token"}} + ) + + Req.Test.stub(Sentry, fn conn -> + assert conn.request_path == "/api/0/organizations/acme/alert-rules/" + assert %{"cursor" => "next", "per_page" => "25", "query" => "errors"} = + Plug.Conn.fetch_query_params(conn).query_params + Req.Test.json(conn, [%{id: "7", name: "Errors", query: "is:unresolved", aggregate: "count()"}]) + end) + + assert {:ok, %{monitors: [%{id: "7", title: "Errors"}]}} = + Sentry.list_monitors(tool, scope: "acme", q: "errors", limit: 25, cursor: "next") end test "Azure obtains a token and lists portal dashboards" do @@ -114,7 +211,48 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardProvidersTes end end) - assert {:ok, %{dashboards: [%{title: "API"}]}} = Client.list(tool, nil, 25) + assert {:ok, %{dashboards: [%{title: "API"}]}} = Client.list_dashboards(tool, nil, 25) + end + + test "Azure lists metric alerts then scheduled query rules" do + tool = + insert(:workbench_tool, + tool: :azure, + name: "azure", + categories: [:metrics], + configuration: %{ + azure: %{ + subscription_id: "sub", + tenant_id: "tenant", + client_id: "client", + client_secret: "secret" + } + } + ) + + Req.Test.stub(Azure, fn conn -> + case conn.request_path do + "/tenant/oauth2/v2.0/token" -> + Req.Test.json(conn, %{access_token: "token"}) + + "/subscriptions/sub/providers/Microsoft.Insights/metricAlerts" -> + Req.Test.json(conn, %{ + value: [ + %{ + id: "/subscriptions/sub/providers/microsoft.insights/metricalerts/cpu", + name: "cpu", + properties: %{description: "High CPU"} + } + ] + }) + end + end) + + assert {:ok, + %{ + monitors: [%{title: "cpu"}], + next_cursor: "scheduledQueryRules" + }} = Client.list_monitors(tool, nil, 25) end test "CloudWatch uses ExAws dashboard list requests" do @@ -161,6 +299,46 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardProvidersTes end) assert {:ok, %{dashboards: [%{id: "API", title: "API"}]}} = - Client.list(tool, nil, 25) + Client.list_dashboards(tool, nil, 25) + end + + test "CloudWatch uses ExAws describe alarms for monitors" do + tool = + insert(:workbench_tool, + tool: :cloudwatch, + name: "cloudwatch", + categories: [:metrics], + configuration: %{ + cloudwatch: %{ + region: "us-east-1", + access_key_id: "access", + secret_access_key: "secret" + } + } + ) + + expect(ExAws, :request, fn operation, config -> + assert %ExAws.Operation.Query{action: :describe_alarms} = operation + assert operation.params["MaxRecords"] in [25, "25"] + assert config[:region] == "us-east-1" + + {:ok, + %{ + body: %{ + alarms: [ + %{ + alarm_name: "API", + alarm_description: "API latency", + alarm_arn: "arn:aws:cloudwatch:us-east-1:alarm:API", + threshold: 1.0 + } + ], + next_token: "next" + } + }} + end) + + assert {:ok, %{monitors: [%{id: "API", title: "API"}], next_cursor: "next"}} = + Client.list_monitors(tool, nil, 25) end end diff --git a/test/console/ai/tools/workbench/observability/external_dashboards_test.exs b/test/console/ai/tools/workbench/observability/external_dashboards_test.exs index f932698e8f..5a0a4f999d 100644 --- a/test/console/ai/tools/workbench/observability/external_dashboards_test.exs +++ b/test/console/ai/tools/workbench/observability/external_dashboards_test.exs @@ -1,8 +1,13 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardsTest do use Console.DataCase, async: true - alias Console.AI.Tools.Workbench.Observability.{ExternalDashboard, ExternalDashboards} - alias Console.AI.Tools.Workbench.Observability.ExternalDashboards.Datadog + alias Console.AI.Tools.Workbench.Observability.{ + ExternalDashboard, + ExternalDashboards, + ExternalMonitor, + ExternalMonitors + } + alias Console.AI.Tools.Workbench.Observability.External.Datadog test "paginates Datadog dashboards at the API" do tool = @@ -73,4 +78,76 @@ defmodule Console.AI.Tools.Workbench.Observability.ExternalDashboardsTest do assert %{"id" => "abc", "definition" => %{"widgets" => []}} = Jason.decode!(json) end + + test "paginates Datadog monitors at the API" do + tool = + insert(:workbench_tool, + tool: :datadog, + name: "datadog", + categories: [:metrics], + configuration: %{ + datadog: %{site: "datadoghq.com", api_key: "api", app_key: "app"} + } + ) + + Req.Test.stub(Datadog, fn conn -> + assert conn.request_path == "/api/v1/monitor/search" + assert Plug.Conn.fetch_query_params(conn).query_params == %{ + "page" => "0", + "per_page" => "1", + "query" => "api" + } + + Req.Test.json(conn, %{ + monitors: [ + %{id: 123, name: "API latency", query: "avg:api.latency{*} > 1"} + ], + metadata: %{total_count: 2, page: 0, per_page: 1} + }) + end) + + assert {:ok, json} = + ExternalMonitors.implement(%ExternalMonitors{ + tool: tool, + q: "api", + limit: 1 + }) + + assert %{ + "monitors" => [%{"id" => "123", "title" => "API latency"}], + "next_cursor" => "1" + } = Jason.decode!(json) + end + + test "fetches one provider monitor by id" do + tool = + insert(:workbench_tool, + tool: :datadog, + name: "datadog", + categories: [:metrics], + configuration: %{ + datadog: %{site: "datadoghq.com", api_key: "api", app_key: "app"} + } + ) + + Req.Test.stub(Datadog, fn conn -> + assert conn.request_path == "/api/v1/monitor/123" + + Req.Test.json(conn, %{ + id: 123, + name: "API", + query: "avg:api.latency{*} > 1", + options: %{thresholds: %{critical: 1}} + }) + end) + + assert {:ok, json} = + ExternalMonitor.implement(%ExternalMonitor{ + tool: tool, + monitor_id: "123" + }) + + assert %{"id" => "123", "definition" => %{"query" => "avg:api.latency{*} > 1"}} = + Jason.decode!(json) + end end diff --git a/test/console/ai/tools/workbench/observability/generic_tools_test.exs b/test/console/ai/tools/workbench/observability/generic_tools_test.exs index 35bc773db4..cc48ba1172 100644 --- a/test/console/ai/tools/workbench/observability/generic_tools_test.exs +++ b/test/console/ai/tools/workbench/observability/generic_tools_test.exs @@ -2,7 +2,22 @@ defmodule Console.AI.Tools.Workbench.Observability.GenericToolsTest do use ExUnit.Case, async: true alias Console.AI.Tool - alias Console.AI.Tools.Workbench.Observability.{LogAggregate, Logs, Metrics, MetricsSearch} + alias Console.AI.Tools.Workbench.Observability.{LogAggregate, Logs, Metrics, MetricsSearch, Traces} + alias Console.Schema.WorkbenchTool + + test "query tools default to a one-hour lookback" do + for {tool, attrs} <- [ + {%Metrics{}, %{"query" => "up"}}, + {%Logs{}, %{}}, + {%LogAggregate{}, %{"bucket_size" => "5m"}}, + {%Traces{}, %{"query" => "{}"}} + ] do + assert {:ok, %{time_range: %{start: start_ts, end: end_ts}}} = + Tool.validate(tool, attrs) + + assert DateTime.diff(end_ts, start_ts, :second) == 3600 + end + end describe "MetricsSearch" do test "changeset accepts azure options" do @@ -32,6 +47,29 @@ defmodule Console.AI.Tools.Workbench.Observability.GenericToolsTest do end describe "Logs" do + test "describes Elasticsearch message query semantics" do + description = + Logs.description(%Logs{ + tool: %WorkbenchTool{name: "elastic", tool: :elastic} + }) + + assert description =~ ~s(query against the "message" field only) + assert description =~ "combines its terms with OR" + assert description =~ ~s(empty query or "*" to match all log messages) + assert description =~ "Facet" + assert description =~ "combined with AND" + end + + test "accepts an empty query for every provider" do + elastic = %Logs{tool: %WorkbenchTool{name: "elastic", tool: :elastic}} + loki = %Logs{tool: %WorkbenchTool{name: "loki", tool: :loki}} + + assert {:ok, %Logs{query: nil}} = Tool.validate(elastic, %{"query" => ""}) + assert {:ok, %Logs{query: nil}} = Tool.validate(loki, %{}) + refute "query" in Map.get(Logs.json_schema(%{tool: %{tool: :loki}}), "required", []) + assert Logs.description(loki) =~ ~s(defaults to `{job=~".+"}`) + end + test "changeset accepts azure options" do assert {:ok, %Logs{options: %{azure: %{resource_id: "resource-id"}}}} = Tool.validate(%Logs{}, %{ @@ -44,6 +82,38 @@ defmodule Console.AI.Tools.Workbench.Observability.GenericToolsTest do end describe "LogAggregate" do + test "defaults query terms to OR" do + assert {:ok, %LogAggregate{operator: :or}} = + Tool.validate(%LogAggregate{}, %{ + "query" => "error failure", + "bucket_size" => "5m" + }) + + assert LogAggregate.json_schema(%{tool: %{tool: :elastic}})["properties"]["operator"]["default"] == "or" + end + + test "describes Elasticsearch message query semantics" do + description = + LogAggregate.description(%LogAggregate{ + tool: %WorkbenchTool{name: "elastic", tool: :elastic} + }) + + assert description =~ ~s(query against the "message" field only) + assert description =~ "defaults to OR" + assert description =~ ~s(empty query or "*" to match all log messages) + assert description =~ "combined with AND" + end + + test "accepts an empty query for every provider" do + elastic = %LogAggregate{tool: %WorkbenchTool{name: "elastic", tool: :elastic}} + loki = %LogAggregate{tool: %WorkbenchTool{name: "loki", tool: :loki}} + attrs = %{"query" => "", "bucket_size" => "5m"} + + assert {:ok, %LogAggregate{query: nil}} = Tool.validate(elastic, attrs) + assert {:ok, %LogAggregate{query: nil}} = Tool.validate(loki, Map.delete(attrs, "query")) + refute "query" in LogAggregate.json_schema(%{tool: %{tool: :loki}})["required"] + end + test "changeset accepts aggregation and azure options" do assert {:ok, %LogAggregate{ diff --git a/test/console/ai/tools/workbench/observability/plrl_tools_test.exs b/test/console/ai/tools/workbench/observability/plrl_tools_test.exs index c19cd7466f..11a48fa1b3 100644 --- a/test/console/ai/tools/workbench/observability/plrl_tools_test.exs +++ b/test/console/ai/tools/workbench/observability/plrl_tools_test.exs @@ -10,6 +10,21 @@ defmodule Console.AI.Tools.Workbench.Observability.PlrlToolsTest do MetricsSearch } + test "query tools default to a one-hour lookback" do + for {tool, attrs} <- [ + {%Logs{}, %{"service_id" => "svc-1"}}, + {%LogsAggregate{}, + %{"service_id" => "svc-1", "query" => "error", "bucket_size" => "5m"}}, + {%LogLabels{}, %{"service_id" => "svc-1"}}, + {Metrics, %{"query" => "up"}} + ] do + assert {:ok, %{time_range: %{start: start_ts, end: end_ts}}} = + Tool.validate(tool, attrs) + + assert DateTime.diff(end_ts, start_ts, :second) == 3600 + end + end + describe "Logs (plrl_logs)" do test "changeset accepts service_id" do assert {:ok, %Logs{service_id: "svc-1"}} = diff --git a/test/console/ai/workbench/conversion_test.exs b/test/console/ai/workbench/conversion_test.exs index 526789921c..4c72dca025 100644 --- a/test/console/ai/workbench/conversion_test.exs +++ b/test/console/ai/workbench/conversion_test.exs @@ -97,5 +97,57 @@ defmodule Console.AI.Workbench.ConversionTest do {:ok, _} = Protobuf.JSON.encode(res) assert is_binary(Protobuf.encode(res)) end + + test "converts victoria_logs tool to proto" do + tool = %WorkbenchTool{ + tool: :victoria_logs, + configuration: %{ + victoria_logs: %{ + url: "https://victorialogs.example.com", + token: "vl-token", + username: "user", + password: "pass", + account_id: "12", + project_id: "34" + } + } + } + + {:ok, res} = Conversion.to_proto(tool) + {:victoria_logs, victoria_logs} = res.connection + + assert victoria_logs.url == "https://victorialogs.example.com" + assert victoria_logs.token == "vl-token" + assert victoria_logs.username == "user" + assert victoria_logs.password == "pass" + assert victoria_logs.account_id == "12" + assert victoria_logs.project_id == "34" + {:ok, _} = Protobuf.JSON.encode(res) + assert is_binary(Protobuf.encode(res)) + end + + test "converts splunk token types to proto and defaults to bearer" do + for {token_type, expected} <- [ + {nil, :BEARER}, + {:bearer, :BEARER}, + {:splunk, :SPLUNK} + ] do + tool = %WorkbenchTool{ + tool: :splunk, + configuration: %{ + splunk: %{ + url: "https://splunk.example.com", + token: "token", + token_type: token_type, + username: nil, + password: nil + } + } + } + + assert {:ok, %ToolConnection{connection: {:splunk, splunk}}} = Conversion.to_proto(tool) + assert splunk.token_type == expected + end + end end end diff --git a/test/console/ai/workbench/engine_test.exs b/test/console/ai/workbench/engine_test.exs index f22bdfa64d..f638009a12 100644 --- a/test/console/ai/workbench/engine_test.exs +++ b/test/console/ai/workbench/engine_test.exs @@ -115,6 +115,32 @@ defmodule Console.AI.Workbench.EngineTest do expect(Subagents.Infrastructure, :run, fn _, _, _ -> %{status: :successful, result: %{output: "infrastructure result"}} end) expect(Provider, :completion, fn _, _ -> + {:ok, "complete with invalid metadata", [ + %Tool{ + id: "invalid-complete", + name: "workbench_complete", + arguments: %{ + "conclusion" => "complete", + "todos" => [%{name: "todo 1", description: "todo 1", done: true}], + "metrics_query" => %{ + "tool_name" => "not_a_real_tool", + "tool_args" => %{"query" => "up"} + } + } + } + ]} + end) + + expect(Provider, :completion, fn messages, _ -> + assert Enum.any?(messages, fn + {:tool, content, _} -> + content =~ + "failed to call tool: workbench_complete, result: {:error, \"tool not_a_real_tool not found\"}" + + _ -> + false + end) + {:ok, "complete", [ %Tool{ name: "workbench_complete", diff --git a/test/console/ai/workbench/subagents/infrastructure_test.exs b/test/console/ai/workbench/subagents/infrastructure_test.exs index 826425d4e6..e69a34513e 100644 --- a/test/console/ai/workbench/subagents/infrastructure_test.exs +++ b/test/console/ai/workbench/subagents/infrastructure_test.exs @@ -23,7 +23,14 @@ defmodule Console.AI.Workbench.Subagents.InfrastructureTest do } ) - expect(Provider, :completion, fn _, _ -> + expect(Provider, :completion, fn _, opts -> + %{enabled: %{tool_names: tool_names}} = + Keyword.fetch!(opts, :plural) + |> Enum.find(&match?(%Console.AI.Tools.ToolSearch{}, &1)) + + assert "api_discovery" in tool_names + assert "api_spec" in tool_names + {:ok, "enabling tools", [ %Tool{name: "enable_tools", arguments: %{"tools" => ["__plrl__service_search"]}, id: "0"} ]} diff --git a/test/console/ai/workbench/subagents/monitoring_test.exs b/test/console/ai/workbench/subagents/monitoring_test.exs index f4c84d2f4f..1abe080cb8 100644 --- a/test/console/ai/workbench/subagents/monitoring_test.exs +++ b/test/console/ai/workbench/subagents/monitoring_test.exs @@ -27,6 +27,7 @@ defmodule Console.AI.Workbench.Subagents.MonitoringTest do assert "workbench_dashboards" in names assert "workbench_dashboard" in names assert "workbench_dashboard_upsert" in names + assert "workbench_dashboard_graph_delete" in names assert "workbench_dashboard_delete" in names assert "workbench_monitors" in names assert "workbench_monitor" in names diff --git a/test/console/ai/workbench/subagents/observability_test.exs b/test/console/ai/workbench/subagents/observability_test.exs index 9e287035a9..606815c20b 100644 --- a/test/console/ai/workbench/subagents/observability_test.exs +++ b/test/console/ai/workbench/subagents/observability_test.exs @@ -123,6 +123,57 @@ defmodule Console.AI.Workbench.Subagents.ObservabilityTest do enable_thought = Enum.find(thoughts, & &1.tool_name == "enable_tools") assert enable_thought refute enable_thought.tool_id + + expect(Provider, :completion, fn _, _ -> + {:ok, "summarizing", [ + %Tool{ + name: "observability_result", + arguments: %{ + "output" => "Invalid result", + "metrics_query" => %{ + "tool_name" => "not_a_real_tool", + "tool_args" => %{"query" => "up"} + } + }, + id: "3" + } + ]} + end) + expect(Provider, :completion, fn messages, _ -> + assert Enum.any?(messages, fn + {:tool, content, _} -> + content =~ + "failed to call tool: observability_result, result: {:error, \"tool not_a_real_tool not found\"}" + + _ -> + false + end) + + {:ok, "correcting the result", [ + %Tool{ + name: "observability_result", + arguments: %{ + "output" => "Corrected result", + "metrics_query" => metrics_query + }, + id: "4" + } + ]} + end) + + invalid_activity = + insert(:workbench_job_activity, workbench_job: job, type: :observability) + + corrected = + Subagents.Observability.run( + invalid_activity, + job, + Environment.new(job, [tool], []) + ) + + assert corrected.status == :successful + assert corrected.result.output == "Corrected result" + assert corrected.result.metrics_query.tool_name == metrics_tool_name end end end diff --git a/test/console/ai/workbench/tools_test.exs b/test/console/ai/workbench/tools_test.exs index 4b7044b2e8..a97dbe9976 100644 --- a/test/console/ai/workbench/tools_test.exs +++ b/test/console/ai/workbench/tools_test.exs @@ -9,6 +9,8 @@ defmodule Console.AI.Workbench.ToolsTest do alias Console.AI.Tools.Workbench.Observability.{ ExternalDashboard, ExternalDashboards, + ExternalMonitor, + ExternalMonitors, LogAggregate, Logs, Metrics, @@ -96,6 +98,9 @@ defmodule Console.AI.Workbench.ToolsTest do loki = insert_associated_tool(workbench, :loki, "loki", [:logs], %{ loki: %{url: "https://loki.example.com"} }) + victoria_logs = insert_associated_tool(workbench, :victoria_logs, "vlogs", [:logs], %{ + victoria_logs: %{url: "https://victorialogs.example.com"} + }) tempo = insert_associated_tool(workbench, :tempo, "tempo", [:traces], %{ tempo: %{url: "https://tempo.example.com"} }) @@ -112,6 +117,8 @@ defmodule Console.AI.Workbench.ToolsTest do assert_indexed(index, "github_gh_list_issues", ListIssues, github) assert_indexed(index, "workbench_observability_logs_loki", Logs, loki) assert_indexed(index, "workbench_observability_log_aggregate_loki", LogAggregate, loki) + assert_indexed(index, "workbench_observability_logs_vlogs", Logs, victoria_logs) + assert_indexed(index, "workbench_observability_log_aggregate_vlogs", LogAggregate, victoria_logs) assert_indexed(index, "workbench_observability_traces_tempo", Traces, tempo) assert_indexed( index, @@ -125,6 +132,18 @@ defmodule Console.AI.Workbench.ToolsTest do ExternalDashboard, datadog ) + assert_indexed( + index, + "workbench_observability_monitors_datadog", + ExternalMonitors, + datadog + ) + assert_indexed( + index, + "workbench_observability_monitor_datadog", + ExternalMonitor, + datadog + ) end test "does not treat http function tools as integrations" do diff --git a/test/console/deployments/agents_test.exs b/test/console/deployments/agents_test.exs index 0392acc46c..435caa57d4 100644 --- a/test/console/deployments/agents_test.exs +++ b/test/console/deployments/agents_test.exs @@ -106,6 +106,17 @@ defmodule Console.Deployments.AgentsTest do assert refetch(runtime) end + + test "cannot delete an agent runtime still referenced by a workbench" do + cluster = insert(:cluster) + runtime = insert(:agent_runtime, cluster: cluster) + insert(:workbench, agent_runtime: runtime) + + {:error, %Ecto.Changeset{} = cs} = Agents.delete_agent_runtime(runtime.id, cluster) + + assert elem(cs.errors[:id], 0) =~ "workbenches" + assert refetch(runtime) + end end describe "create_agent_run/3" do diff --git a/test/console/deployments/policy_test.exs b/test/console/deployments/policy_test.exs index 691d501222..0d0146a950 100644 --- a/test/console/deployments/policy_test.exs +++ b/test/console/deployments/policy_test.exs @@ -1,6 +1,7 @@ defmodule Console.Deployments.PolicyTest do use Console.DataCase, async: true alias Console.Deployments.Policy + alias Console.Deployments.Policy.Input alias Console.Schema.{BindingPolicy, PolicyConstraint, VulnerabilityReport} describe "create_policy/2" do @@ -399,20 +400,22 @@ defmodule Console.Deployments.PolicyTest do describe "actor/1" do test "builds a cleaned actor payload from a user" do group = insert(:group, name: "admins") - user = insert(:user, name: "Pat", email: "pat@example.com") + user = insert(:user, name: "Pat", email: "pat@example.com", roles: %{admin: true}) insert(:group_member, group: group, user: user) user = Repo.preload(user, :groups) - assert Policy.actor(user) == %{ + assert Input.actor(user) == %{ "id" => user.id, "name" => "Pat", "email" => "pat@example.com", + "service_account" => false, + "roles" => %{"admin" => true}, "groups" => ["admins"] } end test "returns an empty map when no user is present" do - assert Policy.actor(nil) == %{} + assert Input.actor(nil) == %{} end end @@ -428,7 +431,7 @@ defmodule Console.Deployments.PolicyTest do sha: "abc123" ) - assert Policy.stack(stack) == %{ + assert Input.stack(stack) == %{ "name" => "prod-network", "project" => %{"id" => project.id, "name" => "infra"}, "git" => %{ @@ -441,7 +444,7 @@ defmodule Console.Deployments.PolicyTest do end test "returns an empty map when no stack is present" do - assert Policy.stack(nil) == %{} + assert Input.stack(nil) == %{} end end @@ -453,7 +456,7 @@ defmodule Console.Deployments.PolicyTest do committer: "alice@example.com" ) - assert Policy.commit(run) == %{ + assert Input.commit(run) == %{ "sha" => "abc123", "message" => "add web instance", "committer" => "alice@example.com" @@ -461,7 +464,7 @@ defmodule Console.Deployments.PolicyTest do end test "returns an empty map when no run is present" do - assert Policy.commit(nil) == %{} + assert Input.commit(nil) == %{} end end diff --git a/test/console/deployments/pubsub/recurse_test.exs b/test/console/deployments/pubsub/recurse_test.exs index 5781639953..454d3af926 100644 --- a/test/console/deployments/pubsub/recurse_test.exs +++ b/test/console/deployments/pubsub/recurse_test.exs @@ -477,21 +477,6 @@ defmodule Console.Deployments.PubSub.RecurseTest do end end - describe "StackStateInsight" do - test "it can send a message on a stack plan insight" do - insight = insert(:ai_insight) - stack = insert(:stack, connection: build(:scm_connection)) - pr = insert(:pull_request, url: "https://github.com/pluralsh/console/pull/10") - run = insert(:stack_run, status: :successful, stack: stack, pull_request: pr) - state = insert(:stack_state, insight: insight, run: run) - - expect(Tentacat.Pulls.Reviews, :create, fn _, _, _, _, _ -> {:ok, %{"id" => "id"}, :ok} end) - - event = %PubSub.StackStateInsight{item: {state, insight}} - Recurse.handle_event(event) - end - end - describe "StackRunCompleted" do test "it can dequeue a stack run" do stack = insert(:stack) diff --git a/test/console/deployments/settings_test.exs b/test/console/deployments/settings_test.exs index fd93557297..828dc5e232 100644 --- a/test/console/deployments/settings_test.exs +++ b/test/console/deployments/settings_test.exs @@ -33,11 +33,14 @@ defmodule Console.Deployments.SettingsTest do bedrock: %{ region: "us-east-1", model_id: "anthropic.custom", + endpoint: :mantle, proxy_models: ["anthropic.proxy"] } } ) + assert Settings.fetch_consistent().ai.bedrock.endpoint == :mantle + assert Enum.map(Settings.available_models(), &Map.take(&1, [:provider, :model])) == [ %{provider: :openai, model: "gpt-custom"}, %{provider: :openai, model: "gpt-tool"}, diff --git a/test/console/deployments/stacks_test.exs b/test/console/deployments/stacks_test.exs index 6c5c549610..e600c46115 100644 --- a/test/console/deployments/stacks_test.exs +++ b/test/console/deployments/stacks_test.exs @@ -794,6 +794,24 @@ defmodule Console.Deployments.StacksTest do assert updated.scm_state.comment_id == "id" end + test "it can post an ai plan summary to a pr" do + run = insert(:stack_run, + status: :pending_approval, + pull_request: build(:pull_request, url: "https://github.com/pluralsh/console/pull/10"), + stack: build(:stack, connection: build(:scm_connection)) + ) + + expect(Tentacat.Pulls.Reviews, :create, fn _, _, _, _, %{"body" => body} -> + assert String.contains?(body, "Plan Summary") + assert String.contains?(body, "safe to apply") + {:ok, %{"id" => "id"}, :ok} + end) + + {:ok, updated} = Stacks.post_plan_comment(run, "## Safety Assessment\n\nsafe to apply") + + assert updated.scm_state.ai_comment_id == "id" + end + test "it includes failed step logs in the github pr comment body" do run = insert(:stack_run, status: :failed, @@ -1614,6 +1632,74 @@ defmodule Console.Deployments.StacksSyncTest do end describe "#stack_run_approval/1" do + test "supplies cost and vulnerability information to stack policies" do + user = insert(:user) + policy = insert(:policy, + type: :stack, + policy: stack_rego(""" + deny[{"message": "expensive vulnerable resource"}] if { + some cost in input.costs + cost.name == "aws_instance.web" + cost.monthly_cost > 100 + cost.raw_resource.tags.environment == "production" + + some violation in input.violations + violation.severity == "high" + violation.policy_id == "AVD-AWS-0001" + some cause in violation.causes + cause.filename == "main.tf" + cause.lines[0].content == "resource \\"aws_instance\\" \\"web\\" {" + } + """) + ) + stack = insert(:stack, write_bindings: [%{user_id: user.id}]) + insert(:stack_policy, stack: stack, policy: policy) + run = insert(:stack_run, stack: stack, status: :pending) + + {:ok, run} = Stacks.update_stack_run(%{ + status: :pending_approval, + infracost_resources: [ + %{ + resource_scope: "diff", + project_name: "production", + name: "aws_instance.web", + resource_type: "aws_instance", + monthly_cost: "125.50", + hourly_cost: "0.17", + raw_resource: %{"tags" => %{"environment" => "production"}} + } + ], + violations: [ + %{ + severity: :high, + policy_id: "AVD-AWS-0001", + policy_url: "https://example.com/AVD-AWS-0001", + policy_module: "aws", + title: "Public instance", + description: "The instance is publicly accessible.", + resolution: "Restrict public access.", + causes: [ + %{ + resource: "aws_instance.web", + filename: "main.tf", + start: 1, + end: 3, + lines: [ + %{line: 1, content: "resource \"aws_instance\" \"web\" {", first: true, last: false} + ] + } + ] + } + ] + }, run.id, user) + + {:ok, cancelled} = Stacks.stack_run_approval(run) + + assert cancelled.status == :cancelled + assert cancelled.approval_result.result == :rejected + assert cancelled.approval_result.reason == "expensive vulnerable resource" + end + test "approves a pending run when stack policy approves" do bot = insert(:user, bot_name: "console", roles: %{admin: true}) group = insert(:group, name: "admins") diff --git a/test/console/deployments/workbenches_test.exs b/test/console/deployments/workbenches_test.exs index 1d1eb05589..a3bf965c28 100644 --- a/test/console/deployments/workbenches_test.exs +++ b/test/console/deployments/workbenches_test.exs @@ -318,6 +318,12 @@ defmodule Console.Deployments.WorkbenchesTest do url: "https://loki.example.com", token: "loki-bearer-token" }}], [:logs]}, + {:victoria_logs, [configuration: %{victoria_logs: %{ + url: "https://victorialogs.example.com", + token: "victoria-logs-token", + account_id: "12", + project_id: "34" + }}], [:logs]}, {:tempo, [configuration: %{tempo: %{ url: "https://tempo.example.com", token: "tempo-bearer-token" @@ -2191,6 +2197,43 @@ defmodule Console.Deployments.WorkbenchesTest do assert_receive {:event, %PubSub.WorkbenchJobUpdated{item: %{id: job_id}}} assert job_id == updated_job.id end + + test "rejects canvas blocks with invalid tool calls" do + job = + insert(:workbench_job, + user: admin_user(), + result: build(:workbench_job_result) + ) + + activity = + insert(:workbench_job_activity, + workbench_job: job, + type: :canvas, + status: :running + ) + + blocks = [ + %{ + identifier: "metrics", + type: :metrics, + layout: %{x: 0, y: 0, w: 6, h: 4}, + content: %{ + metrics: %{ + title: "Requests", + query: %{tool_name: "not_a_real_tool", tool_args: %{query: "up"}} + } + } + } + ] + + assert {:error, "tool not_a_real_tool not found"} = + Workbenches.save_canvas(blocks, "invalid canvas", activity) + + assert Repo.get(WorkbenchJobActivity, activity.id).result == nil + + persisted_job = Repo.get(WorkbenchJob, job.id) |> Repo.preload(:result) + assert persisted_job.result.canvas == [] + end end describe "update_job_status/2" do diff --git a/test/console/graphql/middleware/error_handler_test.exs b/test/console/graphql/middleware/error_handler_test.exs new file mode 100644 index 0000000000..9413fc5edc --- /dev/null +++ b/test/console/graphql/middleware/error_handler_test.exs @@ -0,0 +1,15 @@ +defmodule Console.Middleware.ErrorHandlerTest do + use ExUnit.Case, async: true + + alias Absinthe.Resolution + alias Console.Middleware.ErrorHandler + + test "formats gRPC errors without requiring String.Chars" do + resolution = %Resolution{ + errors: [%GRPC.RPCError{status: 3, message: "time range is required"}] + } + + assert %Resolution{errors: ["time range is required"]} = + ErrorHandler.call(resolution, []) + end +end diff --git a/test/console/graphql/mutations/deployments/agent_mutations_test.exs b/test/console/graphql/mutations/deployments/agent_mutations_test.exs index bc408e9a71..16a887ea88 100644 --- a/test/console/graphql/mutations/deployments/agent_mutations_test.exs +++ b/test/console/graphql/mutations/deployments/agent_mutations_test.exs @@ -133,6 +133,23 @@ defmodule Console.GraphQL.Mutations.Deployments.AgentMutationsTest do assert del["id"] == runtime.id refute refetch(runtime) end + + test "cannot delete an agent runtime still referenced by a workbench" do + cluster = insert(:cluster) + runtime = insert(:agent_runtime, cluster: cluster) + insert(:workbench, agent_runtime: runtime) + + {:ok, %{errors: [error | _]}} = run_query(""" + mutation Delete($id: ID!) { + deleteAgentRuntime(id: $id) { + id + } + } + """, %{"id" => runtime.id}, %{cluster: cluster}) + + assert error.message =~ "workbenches" + assert refetch(runtime) + end end describe "createAgentRun" do diff --git a/test/console/graphql/mutations/deployments/observability_mutations_test.exs b/test/console/graphql/mutations/deployments/observability_mutations_test.exs index 392d6b876e..275a41fa2f 100644 --- a/test/console/graphql/mutations/deployments/observability_mutations_test.exs +++ b/test/console/graphql/mutations/deployments/observability_mutations_test.exs @@ -330,6 +330,18 @@ defmodule Console.GraphQl.Deployments.ObservabilityMutationsTest do test "it can create a dashboard with graph and input datasources" do workbench = insert(:workbench) + tool = + insert(:workbench_tool, + name: "prom", + tool: :prometheus, + categories: [:metrics], + configuration: %{ + prometheus: %{url: "https://prom.example.com", token: "token", tenant_id: nil} + } + ) + + insert(:workbench_tool_association, workbench: workbench, tool: tool) + {:ok, %{data: %{"createDashboard" => dashboard}}} = run_query( """ @@ -362,7 +374,7 @@ defmodule Console.GraphQl.Deployments.ObservabilityMutationsTest do "layout" => %{"x" => 0, "y" => 0, "w" => 2, "h" => 2}, "datasource" => %{ "type" => "METRICS", - "tool" => "prometheus_query", + "tool" => "workbench_observability_metrics_prom", "input" => Jason.encode!(%{"query" => "up"}) } } @@ -373,7 +385,7 @@ defmodule Console.GraphQl.Deployments.ObservabilityMutationsTest do "type" => "SELECT", "datasource" => %{ "type" => "LABELS", - "tool" => "workbench_observability_metric_label_search_prometheus", + "tool" => "workbench_observability_metric_label_search_prom", "input" => Jason.encode!(%{"metric" => "kube_pod_info", "label" => "namespace"}) } } @@ -391,10 +403,70 @@ defmodule Console.GraphQl.Deployments.ObservabilityMutationsTest do assert input["datasource"]["type"] == "LABELS" end + test "it can create a dashboard with a traces graph" do + workbench = insert(:workbench) + + tool = + insert(:workbench_tool, + name: "tempo", + tool: :tempo, + categories: [:traces], + configuration: %{ + tempo: %{url: "https://tempo.example.com", token: "token", tenant_id: nil} + } + ) + + insert(:workbench_tool_association, workbench: workbench, tool: tool) + + {:ok, %{data: %{"createDashboard" => dashboard}}} = + run_query( + """ + mutation Create($attrs: DashboardAttributes!) { + createDashboard(attributes: $attrs) { + id + name + graphs { + identifier + type + datasource { type tool input } + } + } + } + """, + %{ + "attrs" => %{ + "workbenchId" => workbench.id, + "name" => "Checkout traces", + "graphs" => [ + %{ + "identifier" => "checkout", + "type" => "TRACES", + "layout" => %{"x" => 0, "y" => 0, "w" => 3, "h" => 4}, + "datasource" => %{ + "type" => "TRACES", + "tool" => "workbench_observability_traces_tempo", + "input" => Jason.encode!(%{"query" => "{ service.name = \"checkout\" }"}) + } + } + ] + } + }, + %{current_user: admin_user()} + ) + + assert dashboard["name"] == "Checkout traces" + assert [graph] = dashboard["graphs"] + assert graph["identifier"] == "checkout" + assert graph["type"] == "TRACES" + assert graph["datasource"]["type"] == "TRACES" + assert graph["datasource"]["tool"] == "workbench_observability_traces_tempo" + assert graph["datasource"]["input"] == %{"query" => "{ service.name = \"checkout\" }"} + end + test "it can update a dashboard" do - dashboard = insert(:dashboard) + dashboard = insert(:dashboard, graphs: []) - {:ok, %{data: %{"updateDashboard" => updated}}} = + {:ok, result} = run_query( """ mutation Update($id: ID!, $attrs: DashboardAttributes!) { @@ -408,6 +480,8 @@ defmodule Console.GraphQl.Deployments.ObservabilityMutationsTest do %{current_user: admin_user()} ) + assert result[:errors] == nil + updated = result.data["updateDashboard"] assert updated == %{"id" => dashboard.id, "name" => "Updated"} end diff --git a/test/console/graphql/queries/deployments/observability_queries_test.exs b/test/console/graphql/queries/deployments/observability_queries_test.exs index 89a37f24f7..504a60c6f2 100644 --- a/test/console/graphql/queries/deployments/observability_queries_test.exs +++ b/test/console/graphql/queries/deployments/observability_queries_test.exs @@ -10,7 +10,9 @@ defmodule Console.GraphQl.Deployments.ObservabilityQueriesTest do MetricPoint, MetricsLabelSearchOutput, MetricsLabelSearchResult, - MetricsQueryOutput + MetricsQueryOutput, + TraceSpan, + TracesQueryOutput } alias Console.Schema.Dashboard @@ -262,6 +264,7 @@ defmodule Console.GraphQl.Deployments.ObservabilityQueriesTest do graphData: graph(identifier: "requests", input: $input, timeRange: $timeRange) { metrics { timestamp name value labels } logs { timestamp message labels } + traces { traceId spanId name } } inputValues: input(identifier: "namespace", input: $input, timeRange: $timeRange) } @@ -283,6 +286,7 @@ defmodule Console.GraphQl.Deployments.ObservabilityQueriesTest do assert metric["value"] == 42.0 assert metric["labels"] == %{"namespace" => "production"} assert found["graphData"]["logs"] == nil + assert found["graphData"]["traces"] == nil assert found["inputValues"] == ["production", "staging"] end @@ -345,6 +349,7 @@ defmodule Console.GraphQl.Deployments.ObservabilityQueriesTest do graph(identifier: "errors", input: $input, timeRange: $timeRange) { metrics { name value } logs { timestamp message labels } + traces { traceId } } } } @@ -361,11 +366,111 @@ defmodule Console.GraphQl.Deployments.ObservabilityQueriesTest do ) assert found["graph"]["metrics"] == nil + assert found["graph"]["traces"] == nil assert [log] = found["graph"]["logs"] assert log["message"] == "request failed" assert log["labels"] == %{"namespace" => "production", "pod" => "api-0"} end + test "fetches typed trace results for trace graphs" do + workbench = insert(:workbench) + + tool = + insert(:workbench_tool, + project: workbench.project, + name: "tempo", + tool: :tempo, + categories: [:traces], + configuration: %{ + tempo: %{url: "https://tempo.example.com", token: "token", tenant_id: nil} + } + ) + + insert(:workbench_tool_association, workbench: workbench, tool: tool) + + dashboard = + insert(:dashboard, + workbench: workbench, + graphs: [ + %Dashboard.Graph{ + identifier: "checkout", + type: :traces, + layout: %Dashboard.Graph.Layout{x: 0, y: 0, w: 3, h: 4}, + datasource: %Dashboard.Datasource{ + type: :traces, + tool: "workbench_observability_traces_tempo", + input: %{"query" => "{ service.name = \"${service}\" }", "limit" => 50} + } + } + ] + ) + + start_at = ~U[2026-09-07 21:00:00Z] + end_at = ~U[2026-09-07 22:00:00Z] + span_end = DateTime.add(start_at, 10, :second) + expect(Client, :connect, fn -> {:ok, :mock_conn} end) + + expect(Stub, :traces, fn :mock_conn, input, opts -> + assert opts[:timeout] == :timer.minutes(5) + assert input.query == "{ service.name = \"checkout\" }" + assert input.limit == 50 + assert DateTime.compare(Google.Protobuf.to_datetime(input.range.start), start_at) == :eq + assert DateTime.compare(Google.Protobuf.to_datetime(input.range.end), end_at) == :eq + + {:ok, + %TracesQueryOutput{ + spans: [ + %TraceSpan{ + trace_id: "trace-1", + span_id: "span-1", + parent_id: "parent-1", + name: "GET /checkout", + service: "checkout", + start: Google.Protobuf.from_datetime(start_at), + end: Google.Protobuf.from_datetime(span_end), + tags: %{"http.method" => "GET"} + } + ] + }} + end) + + {:ok, %{data: %{"workbenchDashboard" => found}}} = + run_query( + """ + query Dashboard($id: ID!, $input: Json!, $timeRange: DashboardTimeRangeAttributes!) { + workbenchDashboard(id: $id) { + graph(identifier: "checkout", input: $input, timeRange: $timeRange) { + metrics { name value } + logs { message } + traces { traceId spanId parentId name service start end tags } + } + } + } + """, + %{ + "id" => dashboard.id, + "input" => Jason.encode!(%{"service" => "checkout"}), + "timeRange" => %{ + "start" => DateTime.to_iso8601(start_at), + "end" => DateTime.to_iso8601(end_at) + } + }, + %{current_user: admin_user()} + ) + + assert found["graph"]["metrics"] == nil + assert found["graph"]["logs"] == nil + assert [trace] = found["graph"]["traces"] + assert trace["traceId"] == "trace-1" + assert trace["spanId"] == "span-1" + assert trace["parentId"] == "parent-1" + assert trace["name"] == "GET /checkout" + assert trace["service"] == "checkout" + assert trace["start"] + assert trace["end"] + assert trace["tags"] == %{"http.method" => "GET"} + end + test "rejects dashboard queries denied by a workbench policy" do workbench = insert(:workbench) diff --git a/test/console/graphql/queries/deployments/workbench_queries_test.exs b/test/console/graphql/queries/deployments/workbench_queries_test.exs index a24186c30d..4193a56387 100644 --- a/test/console/graphql/queries/deployments/workbench_queries_test.exs +++ b/test/console/graphql/queries/deployments/workbench_queries_test.exs @@ -1272,6 +1272,56 @@ defmodule Console.GraphQl.Deployments.WorkbenchQueriesTest do }, %{current_user: admin_user()}) end + test "it returns gRPC metrics errors as GraphQL errors" do + workbench = insert(:workbench) + + tool = + insert(:workbench_tool, + project: workbench.project, + name: "prom", + tool: :prometheus, + categories: [:metrics], + configuration: %{ + prometheus: %{url: "https://prom.example.com", token: "token", tenant_id: nil} + } + ) + + insert(:workbench_tool_association, workbench: workbench, tool: tool) + job = insert(:workbench_job, workbench: workbench) + + expect(Client, :connect, fn -> {:ok, :mock_conn} end) + + expect(Stub, :metrics, fn :mock_conn, input, _opts -> + assert %Toolquery.TimeRange{start: start_ts, end: end_ts} = input.range + + assert DateTime.diff( + Google.Protobuf.to_datetime(end_ts), + Google.Protobuf.to_datetime(start_ts), + :second + ) == 3600 + + {:error, %GRPC.RPCError{status: 3, message: "time range is required"}} + end) + + assert {:ok, %{errors: [%{message: "time range is required"}]}} = + run_query( + """ + query WorkbenchJob($id: ID!, $arguments: Json) { + workbenchJob(id: $id) { + metricsTool( + name: "workbench_observability_metrics_prom", + arguments: $arguments + ) { + name + } + } + } + """, + %{"id" => job.id, "arguments" => Jason.encode!(%{"query" => "up"})}, + %{current_user: admin_user()} + ) + end + test "it resolves tracesTool using the generated observability traces tool name and parses GraphQL output" do workbench = insert(:workbench) tool = insert(:workbench_tool, diff --git a/test/console/grpc/server_test.exs b/test/console/grpc/server_test.exs index fe2737ad91..3f2ab78184 100644 --- a/test/console/grpc/server_test.exs +++ b/test/console/grpc/server_test.exs @@ -53,6 +53,23 @@ defmodule Console.GRPC.ServerTest do assert config.openaiCompatible.apiKey == "configured-token" end + test "forwards configured Bedrock bearer tokens" do + deployment_settings( + ai: %{ + enabled: true, + bedrock: %{ + access_token: "bedrock-token", + endpoint: :mantle + } + } + ) + + config = Server.get_ai_config(%Plrl.AiConfigRequest{}, nil) + + assert config.bedrock.accessToken == "bedrock-token" + assert config.bedrock.endpoint == :MANTLE + end + test "returns xAI configuration" do deployment_settings( ai: %{ diff --git a/test/console/schema/dashboard_test.exs b/test/console/schema/dashboard_test.exs index df9bdbc00a..a5dd82d948 100644 --- a/test/console/schema/dashboard_test.exs +++ b/test/console/schema/dashboard_test.exs @@ -74,6 +74,29 @@ defmodule Console.Schema.DashboardTest do assert changeset.valid? assert [%{datasource: %{type: :labels}}] = Ecto.Changeset.apply_changes(changeset).inputs end + + test "accepts traces graphs" do + changeset = + Dashboard.changeset( + %Dashboard{}, + attrs([ + %{ + identifier: "checkout", + type: :traces, + layout: %{x: 0, y: 0, w: 3, h: 4}, + datasource: %{ + type: :traces, + tool: "workbench_observability_traces_tempo", + input: %{query: "{ service.name = \"checkout\" }"} + } + } + ]) + ) + + assert changeset.valid? + assert [%{type: :traces, datasource: %{type: :traces}}] = + Ecto.Changeset.apply_changes(changeset).graphs + end end defp attrs(graphs) do