@burdenoff/fluidgrids-fe-sdk 2026.1028.13 → 2026.1028.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/ExecutionDetailPage-AU3C3HFF.js +21 -0
  2. package/dist/{ExecutionsListPage-LMDCPI3D.js → ExecutionsListPage-XY6WE2W7.js} +7 -7
  3. package/dist/{WorkflowBuilder-TZ2Y3SYJ.js → WorkflowBuilder-CTCIARRY.js} +12 -11
  4. package/dist/{WorkflowsList-GJF2HTSA.js → WorkflowsList-WCCIBAE6.js} +8 -8
  5. package/dist/assistant.d.ts +37 -74
  6. package/dist/assistant.js +1 -0
  7. package/dist/{chunk-DV7N3UXU.js → chunk-2K72FID2.js} +1 -1
  8. package/dist/{chunk-QLBQDRQZ.js → chunk-3KVYLY7P.js} +2 -2
  9. package/dist/{chunk-5BY2LZH3.js → chunk-3QXHI7OQ.js} +1 -1
  10. package/dist/{chunk-7SZLEQ5G.js → chunk-6CQL7YS7.js} +3 -3
  11. package/dist/{chunk-2PC6JUR6.js → chunk-6SCOOQQ2.js} +1 -1
  12. package/dist/{chunk-7SPZBRP2.js → chunk-BFCWCHVL.js} +6 -3
  13. package/dist/{chunk-TWRWHIMY.js → chunk-C6L5G4VK.js} +1 -1
  14. package/dist/{chunk-KWWVBB43.js → chunk-CB3425Z3.js} +5 -5
  15. package/dist/{chunk-7UTDL7HD.js → chunk-CFMLFFDD.js} +5 -5
  16. package/dist/{chunk-7PBOU7JC.js → chunk-DGZ23FYC.js} +2 -2
  17. package/dist/{chunk-U5BSQBUC.js → chunk-EMFSEOZE.js} +2 -2
  18. package/dist/{chunk-6T5EBO7G.js → chunk-FGCH4JGY.js} +1 -1
  19. package/dist/{chunk-HKNZ7MVM.js → chunk-FNGRH6NO.js} +1 -1
  20. package/dist/{chunk-TEMQVTTJ.js → chunk-ININ5HZP.js} +1 -1
  21. package/dist/{chunk-EA4EIU6Y.js → chunk-MXUPQUOH.js} +204 -33
  22. package/dist/{chunk-5PSRTFKK.js → chunk-OFLYZJPU.js} +2 -2
  23. package/dist/{chunk-BMX4T263.js → chunk-P3PDEXRY.js} +2 -2
  24. package/dist/{chunk-7OJDILWM.js → chunk-QAK257FU.js} +1 -1
  25. package/dist/{chunk-37HLOFQ3.js → chunk-QJROMXLC.js} +2 -2
  26. package/dist/{chunk-REDNZ462.js → chunk-U3FUZOAE.js} +11 -7
  27. package/dist/{chunk-DOPSPCO3.js → chunk-U6KI4AKI.js} +102 -1
  28. package/dist/{chunk-H2YOX3DI.js → chunk-V5XV5ZAC.js} +3 -3
  29. package/dist/{chunk-KLAS43OH.js → chunk-X2Z63TCG.js} +4 -4
  30. package/dist/chunk-Y53CVZVV.js +20 -0
  31. package/dist/{chunk-CCMDFFBC.js → chunk-Y6JNYFZG.js} +4 -4
  32. package/dist/{chunk-IAOLBKO3.js → chunk-Z3NB4IQ5.js} +3 -3
  33. package/dist/executions.js +13 -12
  34. package/dist/history.js +4 -4
  35. package/dist/index.d.ts +875 -12
  36. package/dist/index.js +36 -35
  37. package/dist/nodes.js +2 -2
  38. package/dist/observability.js +6 -6
  39. package/dist/pageControlsBridge-D6y36qi5.d.ts +87 -0
  40. package/dist/settings.js +6 -6
  41. package/dist/templates.js +11 -10
  42. package/dist/workflow-builder.js +13 -12
  43. package/dist/workflows-list.js +8 -8
  44. package/package.json +1 -1
  45. package/dist/ExecutionDetailPage-7MGOMYP6.js +0 -20
@@ -1,6 +1,6 @@
1
1
  import { LOG_STREAM_DESTINATIONS, CREATE_LOG_STREAM_DESTINATION, UPDATE_LOG_STREAM_DESTINATION, DELETE_LOG_STREAM_DESTINATION, TEST_LOG_STREAM_DESTINATION, REPLAY_WORKFLOW_RUN, RETRY_WORKFLOW_RUNS, OBSERVABILITY_DASHBOARD_SUMMARY, OBSERVABILITY_FAILED_RUNS, OBSERVABILITY_DATA_SINKS, OBSERVABILITY_DATA_SINK_DATA } from './chunk-5ERAJC2I.js';
2
2
  import { useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-77NA7TPJ.js';
3
- import { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-DV7N3UXU.js';
3
+ import { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-2K72FID2.js';
4
4
  import { useTr } from './chunk-UULVIT25.js';
5
5
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
6
6
  import { useCallback, useState, useMemo, useEffect } from 'react';
@@ -2,18 +2,19 @@ import { deepClone, applyTemplateInputs } from './chunk-GEMNVFPK.js';
2
2
  import { Input } from './chunk-IEVSFCFS.js';
3
3
  import { Dialog as Dialog$1, DialogContent as DialogContent$1, DialogHeader as DialogHeader$1, DialogTitle as DialogTitle$1, DialogDescription as DialogDescription$1, DialogFooter } from './chunk-YXMFRQYV.js';
4
4
  import { Badge as Badge$1, Button } from './chunk-BQXVT32O.js';
5
- import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-QLBQDRQZ.js';
6
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-7SPZBRP2.js';
7
- import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-U5BSQBUC.js';
8
- import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-HKNZ7MVM.js';
5
+ import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-3KVYLY7P.js';
6
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-BFCWCHVL.js';
7
+ import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
8
+ import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-EMFSEOZE.js';
9
+ import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-FNGRH6NO.js';
9
10
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
10
11
  import { useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-77NA7TPJ.js';
11
- import { NODE_CONFIGS, createConfiguredNode, resolveOutputHandles, resolveInputHandles, isNodeConfigsInitialized, useFlowStore, getNodeDetail, useSaveStatusStore, liveInternalOperations, resolveNodeOperation, readDisplayOptions, parseParameterValue, canAutosave, STICKY_NOTE_TYPE, isNodeTrigger, resolveUiSpec, RUNS_QUOTA_NAME, throwIfResultError, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, ensureNodeConfigsLoaded, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, refetchStoreNodes, AVAILABLE_NODES, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, fieldsFromValue, useFluidGridsAnalytics, useSaveWorkflow, workflowFingerprint, buildStickyNode, useNodeRegistryRevision, fieldsFromIO, isParamVisible, ConnectionSelector, structuredParameterType, nodeAccent, NodeTypeIcon, NODES_METADATA, useConnections, ConnectionFormDialog, SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, saveIndicatorOf, inAppLeaveTarget, declaredOutputFields, subscribeWorkflowSaved, pathToExpression, ExpressionEditor, formatParameterValue, leaveNeedsConfirmation, buildOperationSeed, snapshotForSave, editStateOf, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, describeOperationError, openRunQuotaUpgradePrompt, isTriggerOperation, canRenderOperationPanel, resolveOperationName, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS } from './chunk-DV7N3UXU.js';
12
+ import { NODE_CONFIGS, createConfiguredNode, resolveOutputHandles, resolveInputHandles, isNodeConfigsInitialized, useFlowStore, getNodeDetail, useSaveStatusStore, liveInternalOperations, resolveNodeOperation, readDisplayOptions, parseParameterValue, canAutosave, STICKY_NOTE_TYPE, isNodeTrigger, resolveUiSpec, RUNS_QUOTA_NAME, throwIfResultError, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, ensureNodeConfigsLoaded, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, refetchStoreNodes, AVAILABLE_NODES, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, fieldsFromValue, useFluidGridsAnalytics, useSaveWorkflow, workflowFingerprint, buildStickyNode, useNodeRegistryRevision, fieldsFromIO, isParamVisible, ConnectionSelector, structuredParameterType, nodeAccent, NodeTypeIcon, NODES_METADATA, useConnections, ConnectionFormDialog, SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, saveIndicatorOf, inAppLeaveTarget, declaredOutputFields, subscribeWorkflowSaved, pathToExpression, ExpressionEditor, formatParameterValue, leaveNeedsConfirmation, buildOperationSeed, snapshotForSave, editStateOf, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, describeOperationError, openRunQuotaUpgradePrompt, isTriggerOperation, canRenderOperationPanel, resolveOperationName, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS } from './chunk-2K72FID2.js';
12
13
  import { cn } from './chunk-JL7CASN5.js';
13
14
  import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
14
15
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
15
16
  import { GetMyNodeInstallationsDocument, BrowseWorkflowTemplatesDocument, InstallWorkflowNodeDocument, InstallPurchasedNodeDocument, BrowseWorkflowNodesDocument, UninstallWorkflowNodeDocument, CreateStoreOrderDocument, GetNodeInstallableVersionsDocument, OrganizationPrivateNodesDocument, InstallOrganizationPrivateNodeDocument, UninstallOrganizationPrivateNodeDocument } from './chunk-JUUYPCFY.js';
16
- import { WorkspaceRunsQuotaDocument, NodeSchemaIntrospectionDocument, useWorkflowPinnedDataQuery, usePinNodeDataMutation, useUnpinNodeDataMutation, useRunFromNodeEligibilityQuery, EventRegistrationsDocument, WorkflowGenerationTemplatesDocument, WorkflowEnvironmentsDocument, WorkflowPromotionRequestsDocument, DeployWorkflowVersionToDevDocument, RequestWorkflowPromotionDocument, ApproveWorkflowPromotionDocument, RejectWorkflowPromotionDocument, CancelWorkflowPromotionDocument, UpdateWorkflowEnvironmentPolicyDocument, WorkflowGitRepositoryDocument, WorkflowGitPushesDocument, WorkflowGitCommitsDocument, LinkWorkflowGitRepositoryDocument, UnlinkWorkflowGitRepositoryDocument, PushWorkflowToGitDocument, WorkflowGitDiffDocument, RestoreWorkflowFromGitDocument, WorkflowAuthoringDocument, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument } from './chunk-7PBOU7JC.js';
17
+ import { WorkspaceRunsQuotaDocument, NodeSchemaIntrospectionDocument, useWorkflowPinnedDataQuery, usePinNodeDataMutation, useUnpinNodeDataMutation, useRunFromNodeEligibilityQuery, EventRegistrationsDocument, WorkflowGenerationTemplatesDocument, WorkflowEnvironmentsDocument, WorkflowPromotionRequestsDocument, DeployWorkflowVersionToDevDocument, RequestWorkflowPromotionDocument, ApproveWorkflowPromotionDocument, RejectWorkflowPromotionDocument, CancelWorkflowPromotionDocument, UpdateWorkflowEnvironmentPolicyDocument, WorkflowGitRepositoryDocument, WorkflowGitPushesDocument, WorkflowGitCommitsDocument, LinkWorkflowGitRepositoryDocument, UnlinkWorkflowGitRepositoryDocument, PushWorkflowToGitDocument, WorkflowGitDiffDocument, RestoreWorkflowFromGitDocument, WorkflowAuthoringDocument, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument } from './chunk-DGZ23FYC.js';
17
18
  import { useTr } from './chunk-UULVIT25.js';
18
19
  import { getFluidGridsClient, waitForFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
19
20
  import { __export } from './chunk-62GWEYJ5.js';
@@ -43768,7 +43769,10 @@ function useWorkflowGitSync(workflowKey) {
43768
43769
  mutation: LinkWorkflowGitRepositoryDocument,
43769
43770
  variables: {
43770
43771
  input: {
43771
- provider: "GITHUB",
43772
+ // GitProviderId lists exactly the WorkflowGitProvider enum values;
43773
+ // the generated enum type only accepts its own members.
43774
+ provider: values.provider,
43775
+ baseUrl: values.baseUrl.trim() || null,
43772
43776
  connectionId: values.connectionId,
43773
43777
  repository: values.repository.trim(),
43774
43778
  branch: values.branch.trim(),
@@ -43846,30 +43850,117 @@ function useWorkflowGitSync(workflowKey) {
43846
43850
  }
43847
43851
 
43848
43852
  // src/builder/lib/workflow-git-sync.ts
43849
- var GITHUB_PROVIDER_KEY = "github";
43853
+ var GITHUB_OPTION = {
43854
+ id: "GITHUB",
43855
+ providerKey: "github",
43856
+ label: "GitHub",
43857
+ repositoryPlaceholder: "owner/name",
43858
+ selfManaged: false
43859
+ };
43860
+ var GIT_PROVIDER_OPTIONS = [
43861
+ GITHUB_OPTION,
43862
+ {
43863
+ id: "GITLAB",
43864
+ providerKey: "gitlab",
43865
+ label: "GitLab",
43866
+ repositoryPlaceholder: "group/project",
43867
+ selfManaged: true
43868
+ },
43869
+ {
43870
+ id: "AZURE_DEVOPS",
43871
+ providerKey: "azure-devops",
43872
+ label: "Azure DevOps",
43873
+ repositoryPlaceholder: "organization/project/repository",
43874
+ selfManaged: false
43875
+ }
43876
+ ];
43877
+ var DEFAULT_GIT_PROVIDER = "GITHUB";
43850
43878
  var DEFAULT_GIT_BRANCH = "main";
43851
43879
  var DEFAULT_GIT_FOLDER = "fluidgrids/workflows";
43852
- function githubConnections(connections) {
43853
- return connections.filter(
43854
- (connection) => connection.provider?.key?.toLowerCase() === GITHUB_PROVIDER_KEY
43855
- ).sort((a, b) => {
43880
+ function gitProviderOption(provider) {
43881
+ return GIT_PROVIDER_OPTIONS.find((option) => option.id === provider) ?? GITHUB_OPTION;
43882
+ }
43883
+ function isGitProviderId(value) {
43884
+ return GIT_PROVIDER_OPTIONS.some((option) => option.id === value);
43885
+ }
43886
+ function providerConnections(connections, providerKey) {
43887
+ const key = providerKey.toLowerCase();
43888
+ return connections.filter((connection) => connection.provider?.key?.toLowerCase() === key).sort((a, b) => {
43856
43889
  const activeA = a.status === "ACTIVE" ? 0 : 1;
43857
43890
  const activeB = b.status === "ACTIVE" ? 0 : 1;
43858
43891
  return activeA - activeB || a.name.localeCompare(b.name);
43859
43892
  });
43860
43893
  }
43861
- function normalizeRepositoryInput(value) {
43862
- return value.trim().replace(/^https?:\/\/github\.com\//i, "").replace(/\.git$/i, "").replace(/\/+$/, "");
43894
+ function stripSlashes(value) {
43895
+ return value.replace(/^\/+|\/+$/g, "");
43896
+ }
43897
+ function normalizeRepositoryInput(value, provider = "GITHUB", baseUrl = "") {
43898
+ const trimmed = value.trim();
43899
+ if (provider === "GITLAB") {
43900
+ const instances = [baseUrl.trim(), "https://gitlab.com"].filter(Boolean).map((url2) => stripSlashes(url2).toLowerCase());
43901
+ let path = trimmed;
43902
+ for (const instance of instances) {
43903
+ if (path.toLowerCase().startsWith(`${instance}/`)) {
43904
+ path = path.slice(instance.length + 1);
43905
+ break;
43906
+ }
43907
+ }
43908
+ const web = path.indexOf("/-/");
43909
+ if (web >= 0) path = path.slice(0, web);
43910
+ return stripSlashes(stripSlashes(path).replace(/\.git$/i, ""));
43911
+ }
43912
+ if (provider === "AZURE_DEVOPS") {
43913
+ const match = /^https:\/\/(?:[^@/]+@)?dev\.azure\.com\/([^/]+)\/(?:([^/]+)\/)?_git\/([^/?#]+)/i.exec(
43914
+ trimmed
43915
+ ) ?? /^https:\/\/([^./]+)\.visualstudio\.com\/(?:DefaultCollection\/)?(?:([^/]+)\/)?_git\/([^/?#]+)/i.exec(
43916
+ trimmed
43917
+ );
43918
+ if (match) {
43919
+ const [, organization = "", project, repository = ""] = match;
43920
+ const decode3 = (part) => {
43921
+ try {
43922
+ return decodeURIComponent(part);
43923
+ } catch {
43924
+ return part;
43925
+ }
43926
+ };
43927
+ return [organization, project ?? repository, repository].map(decode3).join("/").replace(/\.git$/i, "");
43928
+ }
43929
+ return stripSlashes(trimmed).replace(/\.git$/i, "");
43930
+ }
43931
+ return stripSlashes(
43932
+ trimmed.replace(/^https?:\/\/github\.com\//i, "").replace(/\.git$/i, "")
43933
+ );
43934
+ }
43935
+ function repositoryLooksValid(provider, value) {
43936
+ if (provider === "GITLAB") {
43937
+ const segments = value.split("/");
43938
+ return segments.length >= 2 && segments.every((segment) => /^[A-Za-z0-9_][A-Za-z0-9._-]*$/.test(segment));
43939
+ }
43940
+ if (provider === "AZURE_DEVOPS") {
43941
+ const segments = value.split("/");
43942
+ return segments.length === 3 && segments.every(
43943
+ (segment) => /^[A-Za-z0-9][A-Za-z0-9 ._-]*$/.test(segment.trim())
43944
+ );
43945
+ }
43946
+ return /^[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9._-]+$/.test(value);
43863
43947
  }
43864
43948
  function gitLinkFormProblem(form) {
43949
+ const provider = form.provider ?? DEFAULT_GIT_PROVIDER;
43950
+ const baseUrl = (form.baseUrl ?? "").trim();
43865
43951
  if (!form.connectionId.trim()) return "connection";
43866
- if (!/^[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9._-]+$/.test(
43867
- normalizeRepositoryInput(form.repository)
43952
+ if (baseUrl) {
43953
+ if (!gitProviderOption(provider).selfManaged || !/^https:\/\/[^\s/?#@]+(\/[^\s?#]*)?$/i.test(baseUrl))
43954
+ return "baseUrl";
43955
+ }
43956
+ if (!repositoryLooksValid(
43957
+ provider,
43958
+ normalizeRepositoryInput(form.repository, provider, baseUrl)
43868
43959
  ))
43869
43960
  return "repository";
43870
43961
  const branch = form.branch.trim();
43871
43962
  if (!branch || /\s|\.\.|^\/|\/$/.test(branch)) return "branch";
43872
- const folder = form.pathPrefix.trim().replace(/^\/+|\/+$/g, "");
43963
+ const folder = stripSlashes(form.pathPrefix.trim());
43873
43964
  if (folder.split("/").some((segment) => segment === ".." || segment === "."))
43874
43965
  return "pathPrefix";
43875
43966
  return null;
@@ -43885,6 +43976,8 @@ function commitTitle(message) {
43885
43976
  return first.trim() || "(no message)";
43886
43977
  }
43887
43978
  var EMPTY_FORM = {
43979
+ provider: DEFAULT_GIT_PROVIDER,
43980
+ baseUrl: "",
43888
43981
  connectionId: "",
43889
43982
  repository: "",
43890
43983
  branch: DEFAULT_GIT_BRANCH,
@@ -43928,13 +44021,15 @@ function GitSyncPanel({
43928
44021
  loading: connectionsLoading,
43929
44022
  refetch: refetchConnections
43930
44023
  } = useConnections();
43931
- const gitConnections = useMemo(
43932
- () => githubConnections(connections),
43933
- [connections]
43934
- );
43935
44024
  const [busy, setBusy] = useState(null);
43936
44025
  const [editing, setEditing] = useState(false);
43937
44026
  const [form, setForm] = useState(EMPTY_FORM);
44027
+ const providerOption = gitProviderOption(form.provider);
44028
+ const gitConnections = useMemo(
44029
+ () => providerConnections(connections, providerOption.providerKey),
44030
+ [connections, providerOption.providerKey]
44031
+ );
44032
+ const linkedOption = repository ? gitProviderOption(repository.provider) : null;
43938
44033
  const [showProblem, setShowProblem] = useState(false);
43939
44034
  const [newConnectionOpen, setNewConnectionOpen] = useState(false);
43940
44035
  const [comparison, setComparison] = useState(
@@ -43962,13 +44057,20 @@ function GitSyncPanel({
43962
44057
  switch (value) {
43963
44058
  case "connection":
43964
44059
  return tr(
43965
- "fluidgrids.builder.git.problemConnection",
43966
- "Choose a GitHub connection"
44060
+ "fluidgrids.builder.git.problemConnectionFor",
44061
+ "Choose a {{provider}} connection",
44062
+ { provider: providerOption.label }
43967
44063
  );
43968
44064
  case "repository":
43969
44065
  return tr(
43970
- "fluidgrids.builder.git.problemRepository",
43971
- "Enter the repository as owner/name"
44066
+ "fluidgrids.builder.git.problemRepositoryAs",
44067
+ "Enter the repository as {{format}}",
44068
+ { format: providerOption.repositoryPlaceholder }
44069
+ );
44070
+ case "baseUrl":
44071
+ return tr(
44072
+ "fluidgrids.builder.git.problemBaseUrl",
44073
+ "Enter the instance URL as https://host, or leave it empty for gitlab.com"
43972
44074
  );
43973
44075
  case "branch":
43974
44076
  return tr(
@@ -43997,6 +44099,8 @@ function GitSyncPanel({
43997
44099
  const startEditing = () => {
43998
44100
  setForm(
43999
44101
  repository ? {
44102
+ provider: isGitProviderId(repository.provider) ? repository.provider : DEFAULT_GIT_PROVIDER,
44103
+ baseUrl: repository.baseUrl ?? "",
44000
44104
  connectionId: repository.connectionId,
44001
44105
  repository: repository.repository,
44002
44106
  branch: repository.branch,
@@ -44005,12 +44109,26 @@ function GitSyncPanel({
44005
44109
  pushOnPromotion: repository.pushOnPromotion
44006
44110
  } : {
44007
44111
  ...EMPTY_FORM,
44008
- connectionId: gitConnections[0]?.id ?? ""
44112
+ connectionId: providerConnections(
44113
+ connections,
44114
+ gitProviderOption(DEFAULT_GIT_PROVIDER).providerKey
44115
+ )[0]?.id ?? ""
44009
44116
  }
44010
44117
  );
44011
44118
  setShowProblem(false);
44012
44119
  setEditing(true);
44013
44120
  };
44121
+ const changeProvider = (value) => {
44122
+ if (!isGitProviderId(value)) return;
44123
+ const option = gitProviderOption(value);
44124
+ setForm((prev) => ({
44125
+ ...prev,
44126
+ provider: value,
44127
+ baseUrl: option.selfManaged ? prev.baseUrl : "",
44128
+ connectionId: providerConnections(connections, option.providerKey)[0]?.id ?? ""
44129
+ }));
44130
+ setShowProblem(false);
44131
+ };
44014
44132
  const handleLink = () => {
44015
44133
  if (problem) {
44016
44134
  setShowProblem(true);
@@ -44122,7 +44240,45 @@ function GitSyncPanel({
44122
44240
  "data-testid": "fluidgrids-git-link-form",
44123
44241
  children: [
44124
44242
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
44125
- /* @__PURE__ */ jsx(Label, { htmlFor: "fg-git-connection", className: "text-xs", children: tr("fluidgrids.builder.git.connection", "GitHub connection") }),
44243
+ /* @__PURE__ */ jsx(Label, { htmlFor: "fg-git-provider", className: "text-xs", children: tr("fluidgrids.builder.git.provider", "Provider") }),
44244
+ /* @__PURE__ */ jsxs(Select, { value: form.provider, onValueChange: changeProvider, children: [
44245
+ /* @__PURE__ */ jsx(
44246
+ SelectTrigger,
44247
+ {
44248
+ id: "fg-git-provider",
44249
+ className: "h-8",
44250
+ "data-testid": "fluidgrids-git-provider",
44251
+ children: /* @__PURE__ */ jsx(SelectValue, {})
44252
+ }
44253
+ ),
44254
+ /* @__PURE__ */ jsx(SelectContent, { className: "z-[120]", children: GIT_PROVIDER_OPTIONS.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.id, children: option.label }, option.id)) })
44255
+ ] })
44256
+ ] }),
44257
+ providerOption.selfManaged && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
44258
+ /* @__PURE__ */ jsx(Label, { htmlFor: "fg-git-base-url", className: "text-xs", children: tr("fluidgrids.builder.git.baseUrl", "Instance URL (optional)") }),
44259
+ /* @__PURE__ */ jsx(
44260
+ Input$1,
44261
+ {
44262
+ id: "fg-git-base-url",
44263
+ className: "h-8 font-mono text-xs",
44264
+ placeholder: "https://gitlab.com",
44265
+ value: form.baseUrl,
44266
+ onChange: (event) => setForm((prev) => ({ ...prev, baseUrl: event.target.value }))
44267
+ }
44268
+ ),
44269
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] text-muted-foreground", children: tr(
44270
+ "fluidgrids.builder.git.baseUrlHint",
44271
+ "Leave empty for gitlab.com. A self-managed instance must be on the allowed list your administrator keeps."
44272
+ ) })
44273
+ ] }),
44274
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
44275
+ /* @__PURE__ */ jsx(Label, { htmlFor: "fg-git-connection", className: "text-xs", children: tr(
44276
+ "fluidgrids.builder.git.connectionFor",
44277
+ "{{provider}} connection",
44278
+ {
44279
+ provider: providerOption.label
44280
+ }
44281
+ ) }),
44126
44282
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
44127
44283
  /* @__PURE__ */ jsxs(
44128
44284
  Select,
@@ -44160,7 +44316,13 @@ function GitSyncPanel({
44160
44316
  }
44161
44317
  )
44162
44318
  ] }),
44163
- !connectionsLoading && gitConnections.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-[11px] text-muted-foreground", children: tr(
44319
+ !connectionsLoading && gitConnections.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-[11px] text-muted-foreground", children: form.provider === "GITLAB" ? tr(
44320
+ "fluidgrids.builder.git.noConnectionsGitlab",
44321
+ "No GitLab connection yet. Create one with a token that has the api scope on the project."
44322
+ ) : form.provider === "AZURE_DEVOPS" ? tr(
44323
+ "fluidgrids.builder.git.noConnectionsAzureDevops",
44324
+ "No Azure DevOps connection yet. Create one with a personal access token that has the Code (Read & write) scope."
44325
+ ) : tr(
44164
44326
  "fluidgrids.builder.git.noConnections",
44165
44327
  "No GitHub connection yet. Create one; it needs access to the repository's contents (the repo scope)."
44166
44328
  ) })
@@ -44172,7 +44334,7 @@ function GitSyncPanel({
44172
44334
  {
44173
44335
  id: "fg-git-repository",
44174
44336
  className: "h-8 font-mono text-xs",
44175
- placeholder: "owner/name",
44337
+ placeholder: providerOption.repositoryPlaceholder,
44176
44338
  value: form.repository,
44177
44339
  onChange: (event) => setForm((prev) => ({ ...prev, repository: event.target.value }))
44178
44340
  }
@@ -44304,8 +44466,8 @@ function GitSyncPanel({
44304
44466
  tr("fluidgrids.builder.git.title", "Git sync")
44305
44467
  ] }),
44306
44468
  /* @__PURE__ */ jsx(SheetDescription, { children: tr(
44307
- "fluidgrids.builder.git.description",
44308
- "Keep this workflow in a GitHub repository: commit versions, read the file's history, compare a commit with this version or restore it as a new draft."
44469
+ "fluidgrids.builder.git.descriptionProviders",
44470
+ "Keep this workflow in a GitHub, GitLab or Azure DevOps repository: commit versions, read the file's history, compare a commit with this version or restore it as a new draft."
44309
44471
  ) })
44310
44472
  ] }),
44311
44473
  loading && !repository && pushes.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center py-8 text-sm text-muted-foreground", children: [
@@ -44357,6 +44519,14 @@ function GitSyncPanel({
44357
44519
  "data-testid": "fluidgrids-git-linked",
44358
44520
  children: [
44359
44521
  /* @__PURE__ */ jsx("p", { className: "font-mono text-sm text-foreground", children: repository.repository }),
44522
+ /* @__PURE__ */ jsx(
44523
+ "p",
44524
+ {
44525
+ className: "mt-0.5 text-xs text-muted-foreground",
44526
+ "data-testid": "fluidgrids-git-linked-provider",
44527
+ children: [linkedOption?.label, repository.baseUrl].filter(Boolean).join(" \xB7 ")
44528
+ }
44529
+ ),
44360
44530
  /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: [
44361
44531
  `${tr("fluidgrids.builder.git.branch", "Branch")} ${repository.branch}`,
44362
44532
  gitFilePath(repository.pathPrefix, workflowKey)
@@ -44635,8 +44805,8 @@ function GitSyncPanel({
44635
44805
  {
44636
44806
  open: newConnectionOpen,
44637
44807
  onClose: () => setNewConnectionOpen(false),
44638
- providerKey: GITHUB_PROVIDER_KEY,
44639
- defaultName: "GitHub",
44808
+ providerKey: providerOption.providerKey,
44809
+ defaultName: providerOption.label,
44640
44810
  onConnectionCreated: (created) => {
44641
44811
  setNewConnectionOpen(false);
44642
44812
  setForm((prev) => ({ ...prev, connectionId: created.id }));
@@ -45021,6 +45191,7 @@ function AiDraftPanel({
45021
45191
  )
45022
45192
  }
45023
45193
  ),
45194
+ /* @__PURE__ */ jsx(AiCreditBalanceSlot, { testId: "ai-draft-credit-balance" }),
45024
45195
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
45025
45196
  /* @__PURE__ */ jsxs(
45026
45197
  Button$1,
@@ -1,7 +1,7 @@
1
1
  import { REPLAY_WORKFLOW_RUN, RETRY_WORKFLOW_RUNS } from './chunk-5ERAJC2I.js';
2
- import { useFluidGridsAnalytics, throwIfResultError, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-DV7N3UXU.js';
2
+ import { useFluidGridsAnalytics, throwIfResultError, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-2K72FID2.js';
3
3
  import { useExecutionsStore } from './chunk-CY6KX4RG.js';
4
- import { ExecutionsListDocument, ExecutionDetailDocument, ExecutionStatsDocument, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TriggerWorkflowDocument, TerminateExecutionDocument } from './chunk-7PBOU7JC.js';
4
+ import { ExecutionsListDocument, ExecutionDetailDocument, ExecutionStatsDocument, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TriggerWorkflowDocument, TerminateExecutionDocument } from './chunk-DGZ23FYC.js';
5
5
  import { useTr } from './chunk-UULVIT25.js';
6
6
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
7
7
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
@@ -1,5 +1,5 @@
1
- import { validateDateRange } from './chunk-5PSRTFKK.js';
2
- import { useAvailableTags } from './chunk-6T5EBO7G.js';
1
+ import { validateDateRange } from './chunk-OFLYZJPU.js';
2
+ import { useAvailableTags } from './chunk-FGCH4JGY.js';
3
3
  import { executionsControls } from './chunk-D3UWK7GY.js';
4
4
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
5
5
  import { useExecutionsStore } from './chunk-CY6KX4RG.js';
@@ -1,4 +1,4 @@
1
- import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument, fetchAllNodeEndpointConfigs } from './chunk-7PBOU7JC.js';
1
+ import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument, fetchAllNodeEndpointConfigs } from './chunk-DGZ23FYC.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
4
4
  import { useMemo, useState, useCallback, useEffect } from 'react';
@@ -1,5 +1,5 @@
1
- import { throwIfResultError } from './chunk-DV7N3UXU.js';
2
- import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-7PBOU7JC.js';
1
+ import { throwIfResultError } from './chunk-2K72FID2.js';
2
+ import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-DGZ23FYC.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
5
5
  import { useState, useCallback, useEffect } from 'react';
@@ -1,11 +1,12 @@
1
- import { buildNodeDisplayMap, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-BMX4T263.js';
2
- import { useExecution, useExecutionActions, useAutoRefresh } from './chunk-5PSRTFKK.js';
3
- import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-37HLOFQ3.js';
4
- import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-2PC6JUR6.js';
5
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-7SPZBRP2.js';
6
- import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-DV7N3UXU.js';
1
+ import { buildNodeDisplayMap, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-P3PDEXRY.js';
2
+ import { useExecution, useExecutionActions, useAutoRefresh } from './chunk-OFLYZJPU.js';
3
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-QJROMXLC.js';
4
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-6SCOOQQ2.js';
5
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-BFCWCHVL.js';
6
+ import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
7
+ import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-2K72FID2.js';
7
8
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
8
- import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-7PBOU7JC.js';
9
+ import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-DGZ23FYC.js';
9
10
  import { useTr } from './chunk-UULVIT25.js';
10
11
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
11
12
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
@@ -898,6 +899,9 @@ function RunAiAssistPanel({
898
899
  )
899
900
  ] })
900
901
  ] }),
902
+ canPropose && // BOFF-3732: the AI-credit balance before "Propose a fix" (the
903
+ // explanation is a read with no model call, so it spends nothing).
904
+ /* @__PURE__ */ jsx(AiCreditBalanceSlot, { className: "mt-2", testId: "run-ai-credit-balance" }),
901
905
  explainError && /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm text-[var(--color-status-error-text)]", children: explainError }),
902
906
  explanation && /* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-2", "data-testid": "run-ai-explanation", children: [
903
907
  /* @__PURE__ */ jsx("p", { className: "text-sm text-text-primary", children: explanation.cause }),