@burdenoff/fluidgrids-fe-sdk 2026.1109.6 → 2026.1109.8

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 (38) hide show
  1. package/dist/{ExecutionDetailPage-E3TMETIQ.js → ExecutionDetailPage-2ORSV3YN.js} +6 -6
  2. package/dist/{ExecutionsListPage-BZWJ7KSM.js → ExecutionsListPage-MY45NECW.js} +5 -5
  3. package/dist/{WorkflowBuilder-VUBKMFSF.js → WorkflowBuilder-MWC2BCTQ.js} +7 -6
  4. package/dist/{WorkflowsList-DWQU55I5.js → WorkflowsList-6AG7CFZM.js} +6 -6
  5. package/dist/{agentTools-ORZSDXL5.js → agentTools-5O2KPQYJ.js} +2 -2
  6. package/dist/{chunk-L3UC5E4J.js → chunk-2LERIIZM.js} +35 -35
  7. package/dist/{chunk-NQ7JQNQ7.js → chunk-3T3C3475.js} +1 -1
  8. package/dist/{chunk-RXSZSHXK.js → chunk-4EZFAL24.js} +4 -4
  9. package/dist/{chunk-EPEMX2L2.js → chunk-7ADEPA4W.js} +5 -5
  10. package/dist/{chunk-IVAV4Y57.js → chunk-ACME5GOU.js} +1 -1
  11. package/dist/{chunk-2SUZKBHB.js → chunk-CX3LABFK.js} +1 -1
  12. package/dist/{chunk-XTNHYVGH.js → chunk-G4NAU6FF.js} +273 -9
  13. package/dist/{chunk-7VT6V5PG.js → chunk-GR3QNLFS.js} +2 -2
  14. package/dist/{chunk-4I6BXKKC.js → chunk-MSNCU6US.js} +4 -4
  15. package/dist/{chunk-S3ADBQTT.js → chunk-NCXK2AO6.js} +1 -1
  16. package/dist/{chunk-7XQI4U5C.js → chunk-NEB4Y7AX.js} +1 -1
  17. package/dist/{chunk-QPNZV7OD.js → chunk-NRI7AUBH.js} +1 -41
  18. package/dist/{chunk-XGQLFKRC.js → chunk-QTOPG7SR.js} +1 -1
  19. package/dist/{chunk-5WUX3DET.js → chunk-QWDF72GZ.js} +92 -56
  20. package/dist/{chunk-GG357Z3E.js → chunk-THIMC2ZD.js} +5 -5
  21. package/dist/{chunk-GABLFLEM.js → chunk-TKSVFP36.js} +3 -3
  22. package/dist/{chunk-X4HWBDMZ.js → chunk-TNMXKPJX.js} +2 -2
  23. package/dist/{chunk-LI7RF5GC.js → chunk-U52PO4QQ.js} +3 -3
  24. package/dist/{chunk-I6FW4C3B.js → chunk-VYXTP6YF.js} +57 -40
  25. package/dist/{chunk-GLF5IVZH.js → chunk-WKF72AS2.js} +3 -3
  26. package/dist/{chunk-K7YFK5K2.js → chunk-ZXLXZFWO.js} +1 -1
  27. package/dist/executions.js +7 -7
  28. package/dist/history.js +3 -3
  29. package/dist/index.d.ts +24 -1
  30. package/dist/index.js +31 -30
  31. package/dist/{node-detail-view-5GXLTSQY.js → node-detail-view-ZFGS3FWU.js} +5 -5
  32. package/dist/observability.js +3 -3
  33. package/dist/{quick-config-panel-EX3WVWXH.js → quick-config-panel-ZDGYZR7Y.js} +4 -4
  34. package/dist/settings.js +4 -4
  35. package/dist/templates.js +5 -5
  36. package/dist/workflow-builder.js +8 -7
  37. package/dist/workflows-list.js +6 -6
  38. package/package.json +1 -1
@@ -1,9 +1,11 @@
1
- import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-QPNZV7OD.js';
1
+ import { paramsFromOperation } from './chunk-NEB4Y7AX.js';
2
+ import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, decideMissingWorkflow } from './chunk-NRI7AUBH.js';
2
3
  import { registerLiveCanvasHandler } from './chunk-PIKYQE7P.js';
3
- import { useWorkflowReloadStore, releaseLeaseKeptForReload, useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-L3UC5E4J.js';
4
+ import { useWorkflowReloadStore, releaseLeaseKeptForReload, useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-2LERIIZM.js';
5
+ import { CreateWorkflowRefusalDialog } from './chunk-QWDF72GZ.js';
4
6
  import { canvasFromDefinition } from './chunk-5UA262ZO.js';
5
- import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-K7YFK5K2.js';
6
- import { refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, rememberRevision, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes } from './chunk-I6FW4C3B.js';
7
+ import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-ZXLXZFWO.js';
8
+ import { refetchStoreNodes, BILLING_PLANS_PATH, ensureNodeConfigsLoaded, codeBuildIdOf, rememberRevision, blankWorkflowCreateInput, classifyCreateRefusal, NODE_CONFIGS, resolveNodeOperation, createConfiguredNode, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes } from './chunk-VYXTP6YF.js';
7
9
  import { useFlowStore, mergeStickyNotes } from './chunk-JXCJRBWD.js';
8
10
  import { WorkflowDefinitionDocument } from './chunk-VAWYR6P4.js';
9
11
  import { useTr } from './chunk-UULVIT25.js';
@@ -684,6 +686,211 @@ function LoadProblem({
684
686
  }
685
687
  );
686
688
  }
689
+
690
+ // src/builder/lib/start-node-link.ts
691
+ var START_NODE_PARAM = "startNode";
692
+ var START_OPERATION_PARAM = "startOperation";
693
+ var START_NAME_PARAM = "name";
694
+ var START_FIELD_PREFIX = "set.";
695
+ var MAX_START_NAME_LENGTH = 120;
696
+ var MAX_START_VALUE_LENGTH = 1e3;
697
+ var MAX_START_FIELDS = 20;
698
+ var NODE_TYPE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9:._/@-]{0,159}$/;
699
+ var FIELD_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
700
+ var OPERATION_PATTERN = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
701
+ var EXPRESSION_MARKERS = /\$\{|\{\{|^=/;
702
+ var TEXT_FIELD_TYPES = /* @__PURE__ */ new Set([
703
+ "string",
704
+ "text",
705
+ "timezone",
706
+ // TimeCampus Event node: comma-separated time trigger ids (BOFF-10910).
707
+ "timecampus-time-trigger"
708
+ ]);
709
+ var NUMBER_FIELD_TYPES = /* @__PURE__ */ new Set(["number", "integer"]);
710
+ var CHOICE_FIELD_TYPES = /* @__PURE__ */ new Set([
711
+ "string",
712
+ "enum",
713
+ "options",
714
+ "select",
715
+ "multiOptions"
716
+ ]);
717
+ function hasControlCharacter(value) {
718
+ for (let index = 0; index < value.length; index += 1) {
719
+ const code = value.charCodeAt(index);
720
+ if (code < 32 || code === 127) return true;
721
+ }
722
+ return false;
723
+ }
724
+ function isPlainText(value, maxLength) {
725
+ return value.length > 0 && value.length <= maxLength && !hasControlCharacter(value) && !EXPRESSION_MARKERS.test(value);
726
+ }
727
+ function readStartNodeRequest(search) {
728
+ const params = new URLSearchParams(search);
729
+ const nodeType = params.get(START_NODE_PARAM)?.trim() ?? "";
730
+ if (!NODE_TYPE_PATTERN.test(nodeType)) return null;
731
+ const rejected = [];
732
+ const fields = /* @__PURE__ */ Object.create(null);
733
+ let count = 0;
734
+ for (const [key, raw] of params) {
735
+ if (!key.startsWith(START_FIELD_PREFIX)) continue;
736
+ const field = key.slice(START_FIELD_PREFIX.length);
737
+ if (!FIELD_NAME_PATTERN.test(field) || Object.hasOwn(fields, field)) {
738
+ rejected.push({ field: field.slice(0, 64), reason: "unknown-field" });
739
+ continue;
740
+ }
741
+ if (count >= MAX_START_FIELDS) {
742
+ rejected.push({ field, reason: "too-many" });
743
+ continue;
744
+ }
745
+ fields[field] = raw.trim();
746
+ count += 1;
747
+ }
748
+ const operationRaw = params.get(START_OPERATION_PARAM)?.trim();
749
+ const operation = operationRaw && OPERATION_PATTERN.test(operationRaw) ? operationRaw : void 0;
750
+ const nameRaw = params.get(START_NAME_PARAM)?.trim();
751
+ let name;
752
+ if (nameRaw) {
753
+ if (isPlainText(nameRaw, MAX_START_NAME_LENGTH)) name = nameRaw;
754
+ else rejected.push({ field: START_NAME_PARAM, reason: "invalid-name" });
755
+ }
756
+ return {
757
+ nodeType,
758
+ ...operation ? { operation } : {},
759
+ ...name ? { name } : {},
760
+ fields,
761
+ rejected
762
+ };
763
+ }
764
+ function validateStartField(param, raw) {
765
+ if (!param) return { ok: false, reason: "unknown-field" };
766
+ if (param.secret) return { ok: false, reason: "secret" };
767
+ const options = param.options ?? [];
768
+ if (param.type === "multiOptions") {
769
+ if (options.length === 0) return { ok: false, reason: "unsupported-type" };
770
+ const picked = raw.split(",").map((part) => part.trim()).filter((part) => part.length > 0);
771
+ if (picked.length === 0) return { ok: false, reason: "invalid-value" };
772
+ const allowed = new Set(options);
773
+ if (picked.some((part) => !allowed.has(part)))
774
+ return { ok: false, reason: "not-an-option" };
775
+ const chosen = new Set(picked);
776
+ return {
777
+ ok: true,
778
+ value: options.filter((option) => chosen.has(option))
779
+ };
780
+ }
781
+ if (options.length > 0 && CHOICE_FIELD_TYPES.has(param.type)) {
782
+ return options.includes(raw) ? { ok: true, value: raw } : { ok: false, reason: "not-an-option" };
783
+ }
784
+ if (NUMBER_FIELD_TYPES.has(param.type)) {
785
+ if (!/^-?\d+(\.\d+)?$/.test(raw))
786
+ return { ok: false, reason: "invalid-value" };
787
+ const value = Number(raw);
788
+ if (!Number.isFinite(value) || param.type === "integer" && !Number.isInteger(value))
789
+ return { ok: false, reason: "invalid-value" };
790
+ return { ok: true, value };
791
+ }
792
+ if (param.type === "boolean") {
793
+ if (raw === "true") return { ok: true, value: true };
794
+ if (raw === "false") return { ok: true, value: false };
795
+ return { ok: false, reason: "invalid-value" };
796
+ }
797
+ if (TEXT_FIELD_TYPES.has(param.type)) {
798
+ return isPlainText(raw, MAX_START_VALUE_LENGTH) ? { ok: true, value: raw } : { ok: false, reason: "invalid-value" };
799
+ }
800
+ return { ok: false, reason: "unsupported-type" };
801
+ }
802
+ function validateStartFields(params, fields) {
803
+ const byName = new Map(params.map((param) => [param.name, param]));
804
+ const state = {};
805
+ const rejected = [];
806
+ for (const [field, raw] of Object.entries(fields)) {
807
+ const result = validateStartField(byName.get(field), raw);
808
+ if (result.ok) state[field] = result.value;
809
+ else rejected.push({ field, reason: result.reason });
810
+ }
811
+ return { state, rejected };
812
+ }
813
+ function isStartNodeParam(key) {
814
+ return key === START_NODE_PARAM || key === START_OPERATION_PARAM || key === START_NAME_PARAM || key.startsWith(START_FIELD_PREFIX);
815
+ }
816
+ function startNodeKey(search) {
817
+ const params = new URLSearchParams(search);
818
+ const kept = new URLSearchParams();
819
+ for (const [key, value] of params) {
820
+ if (isStartNodeParam(key)) kept.append(key, value);
821
+ }
822
+ return kept.toString();
823
+ }
824
+ function withoutStartNodeParams(search) {
825
+ const params = new URLSearchParams(search);
826
+ for (const key of [...params.keys()]) {
827
+ if (isStartNodeParam(key)) params.delete(key);
828
+ }
829
+ const rest = params.toString();
830
+ return rest ? `?${rest}` : "";
831
+ }
832
+ function startNodeLink(basePath, request) {
833
+ const params = new URLSearchParams();
834
+ params.set(START_NODE_PARAM, request.nodeType);
835
+ if (request.operation) params.set(START_OPERATION_PARAM, request.operation);
836
+ if (request.name) params.set(START_NAME_PARAM, request.name);
837
+ for (const [field, value] of Object.entries(request.fields ?? {})) {
838
+ params.set(`${START_FIELD_PREFIX}${field}`, value);
839
+ }
840
+ const base2 = basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
841
+ return `${base2}/new?${params.toString()}`;
842
+ }
843
+
844
+ // src/builder/app/workflow/work/start-node.ts
845
+ var START_POSITION = { x: 0, y: 0 };
846
+ function recordOf(value) {
847
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? { ...value } : {};
848
+ }
849
+ function buildStartNode(request) {
850
+ const config = NODE_CONFIGS.find((entry) => entry.type === request.nodeType);
851
+ if (!config) return { ok: false, reason: "unknown-node" };
852
+ if (request.operation) {
853
+ const operations = resolveNodeOperation(
854
+ void 0,
855
+ config.operations
856
+ ).operations;
857
+ if (!operations.some((op) => op.name === request.operation)) {
858
+ return { ok: false, reason: "unknown-operation" };
859
+ }
860
+ }
861
+ const node = createConfiguredNode(
862
+ request.nodeType,
863
+ START_POSITION,
864
+ request.operation
865
+ );
866
+ const data = recordOf(node.data);
867
+ const pinned = typeof data.operation_name === "string" && data.operation_name;
868
+ const rejected = [...request.rejected];
869
+ if (!pinned) {
870
+ for (const field of Object.keys(request.fields)) {
871
+ rejected.push({ field, reason: "unknown-field" });
872
+ }
873
+ } else {
874
+ const { selected } = resolveNodeOperation(data, config.operations);
875
+ const { state, rejected: refused } = validateStartFields(
876
+ paramsFromOperation(selected),
877
+ request.fields
878
+ );
879
+ rejected.push(...refused);
880
+ const args = recordOf(data.args);
881
+ const current = recordOf(args.state);
882
+ node.data = {
883
+ ...data,
884
+ args: { ...args, state: { ...current, ...state } }
885
+ };
886
+ }
887
+ return {
888
+ ok: true,
889
+ node,
890
+ ...request.name ? { name: request.name } : {},
891
+ rejected
892
+ };
893
+ }
687
894
  var START_DELAY_MS = 800;
688
895
  function StartGuidedTour() {
689
896
  const location = useLocation();
@@ -743,6 +950,15 @@ function WorkflowItem({
743
950
  const navigate = useNavigate();
744
951
  const tr = useTr();
745
952
  const location = useLocation();
953
+ const requestedStartLink = startNodeKey(location.search);
954
+ const [startLink, setStartLink] = useState({
955
+ navigation: location.key,
956
+ link: requestedStartLink
957
+ });
958
+ if (requestedStartLink && (requestedStartLink !== startLink.link || location.key !== startLink.navigation)) {
959
+ setStartLink({ navigation: location.key, link: requestedStartLink });
960
+ }
961
+ const consumedStartLinkRef = useRef(null);
746
962
  const createIntentRef = useRef(isCreateIntent(location.state));
747
963
  useEffect(() => {
748
964
  createIntentRef.current = isCreateIntent(location.state);
@@ -784,6 +1000,10 @@ function WorkflowItem({
784
1000
  useEffect(() => {
785
1001
  doNodeCheckRef.current = doNodeCheck;
786
1002
  });
1003
+ const trRef = useRef(tr);
1004
+ useEffect(() => {
1005
+ trRef.current = tr;
1006
+ });
787
1007
  const handleInstallConfirm = useCallback(async () => {
788
1008
  if (!pendingWorkflow) return;
789
1009
  const nodesToInstall = (nodeCheck?.missing ?? []).filter(
@@ -940,10 +1160,53 @@ function WorkflowItem({
940
1160
  if (mounted) setIsLoading(false);
941
1161
  return;
942
1162
  }
943
- if (mounted) {
944
- setWorkflow(newWorkflow);
945
- setIsLoading(false);
1163
+ const startRequest = startLink.link && startLink !== consumedStartLinkRef.current ? readStartNodeRequest(startLink.link) : null;
1164
+ if (startRequest) {
1165
+ await ensureNodeConfigsLoaded();
1166
+ if (!mounted) return;
1167
+ consumedStartLinkRef.current = startLink;
1168
+ const started = buildStartNode(startRequest);
1169
+ window.history.replaceState(
1170
+ window.history.state,
1171
+ "",
1172
+ `${window.location.pathname}${withoutStartNodeParams(window.location.search)}${window.location.hash}`
1173
+ );
1174
+ if (started.ok) {
1175
+ const nodeType = started.node.type ?? startRequest.nodeType;
1176
+ setWorkflow({
1177
+ ...newWorkflow,
1178
+ name: started.name ?? newWorkflow.name,
1179
+ nodes: [started.node],
1180
+ sidebar: {
1181
+ active: "node-properties",
1182
+ panels: {
1183
+ nodeProperties: {
1184
+ selectedNode: { id: started.node.id, type: nodeType }
1185
+ }
1186
+ }
1187
+ }
1188
+ });
1189
+ if (started.rejected.length > 0) {
1190
+ toast.warning(
1191
+ trRef.current(
1192
+ "fluidgrids.builder.startNode.partial",
1193
+ "Some settings from the link were not applied"
1194
+ ),
1195
+ {
1196
+ description: started.rejected.map((entry) => entry.field).join(", ")
1197
+ }
1198
+ );
1199
+ }
1200
+ return;
1201
+ }
1202
+ toast.error(
1203
+ trRef.current(
1204
+ "fluidgrids.builder.startNode.unavailable",
1205
+ "The node this link starts with is not available in this workspace"
1206
+ )
1207
+ );
946
1208
  }
1209
+ if (mounted) setWorkflow(newWorkflow);
947
1210
  return;
948
1211
  }
949
1212
  const freshCreate = createIntentRef.current && !creatingRef.current && !fetchedCopy() && !loadRunId;
@@ -1098,7 +1361,8 @@ function WorkflowItem({
1098
1361
  navigate,
1099
1362
  loadRunId,
1100
1363
  retryNonce,
1101
- reloadNonce
1364
+ reloadNonce,
1365
+ startLink
1102
1366
  // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)
1103
1367
  // and including doNodeCheck here caused infinite re-runs because installedAppIds
1104
1368
  // produces a new Set reference on every render.
@@ -1283,4 +1547,4 @@ function WorkflowBuilder() {
1283
1547
  );
1284
1548
  }
1285
1549
 
1286
- export { GuidedTourStarter, WorkflowBuilder };
1550
+ export { GuidedTourStarter, START_FIELD_PREFIX, START_NAME_PARAM, START_NODE_PARAM, START_OPERATION_PARAM, WorkflowBuilder, readStartNodeRequest, startNodeLink };
@@ -1,9 +1,9 @@
1
- import { validateDateRange, statusCountFilter, STATUS_COUNT_GROUP_BY, statusCountsOf } from './chunk-IVAV4Y57.js';
1
+ import { validateDateRange, statusCountFilter, STATUS_COUNT_GROUP_BY, statusCountsOf } from './chunk-ACME5GOU.js';
2
2
  import { isAgentNodeType } from './chunk-WZ3EJVS6.js';
3
3
  import { useAvailableTags, formatRunVersion, nodeDisplayTitle } from './chunk-DFFQYK2X.js';
4
4
  import { executionsControls } from './chunk-FNZZ5JJL.js';
5
5
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
6
- import { useDurableParityEnabled, formatElapsedMs, runDurationMs, nodeStateDurationMs } from './chunk-I6FW4C3B.js';
6
+ import { useDurableParityEnabled, formatElapsedMs, runDurationMs, nodeStateDurationMs } from './chunk-VYXTP6YF.js';
7
7
  import { SetWorkflowRunVersioningOverrideDocument, WorkflowRunsCountDocument, DurableParityRunFieldsDocument, WorkflowRunPendingDocument, WorkflowRunMetadataDocument } from './chunk-VAWYR6P4.js';
8
8
  import { useTr } from './chunk-UULVIT25.js';
9
9
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
@@ -1,10 +1,10 @@
1
- import { TEMPLATE_STORE_CATEGORIES, useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TemplateCard, useTemplateSubmissions, usePublishToStore } from './chunk-L3UC5E4J.js';
2
- import { QuotaExhaustedDialog } from './chunk-5WUX3DET.js';
1
+ import { TEMPLATE_STORE_CATEGORIES, useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TemplateCard, useTemplateSubmissions, usePublishToStore } from './chunk-2LERIIZM.js';
2
+ import { QuotaExhaustedDialog } from './chunk-QWDF72GZ.js';
3
3
  import { templatesControls } from './chunk-FNZZ5JJL.js';
4
- import { useWorkflowDefinitions, useDuplicateWorkflow, useLazyWorkflowDefinition } from './chunk-K7YFK5K2.js';
4
+ import { useWorkflowDefinitions, useDuplicateWorkflow, useLazyWorkflowDefinition } from './chunk-ZXLXZFWO.js';
5
5
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
6
6
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
7
- import { BILLING_PLANS_PATH, useFluidGridsAnalytics, emitTemplateUsed, isQuotaExhaustedFailure } from './chunk-I6FW4C3B.js';
7
+ import { BILLING_PLANS_PATH, useFluidGridsAnalytics, emitTemplateUsed, isQuotaExhaustedFailure } from './chunk-VYXTP6YF.js';
8
8
  import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS } from './chunk-ERT444RG.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
10
  import { useState, useEffect, useCallback, useMemo } from 'react';
@@ -1,6 +1,6 @@
1
1
  import { versionsOfWorkflow, VersionDiffDialog } from './chunk-B3USL2JQ.js';
2
2
  import { historyControls } from './chunk-FNZZ5JJL.js';
3
- import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-K7YFK5K2.js';
3
+ import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-ZXLXZFWO.js';
4
4
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,4 +1,4 @@
1
- import { structuredParameterType, parseParameterValue, liveInternalOperations, resolveNodeOperation, readDisplayOptions, getNodeDetail, useNodeRegistryRevision, fieldsFromIO, pathToExpression, NODE_CONFIGS, resolveUiSpec, fieldsFromValue, declaredOutputFields, subscribeWorkflowSaved } from './chunk-I6FW4C3B.js';
1
+ import { structuredParameterType, parseParameterValue, liveInternalOperations, resolveNodeOperation, readDisplayOptions, getNodeDetail, useNodeRegistryRevision, fieldsFromIO, pathToExpression, NODE_CONFIGS, resolveUiSpec, fieldsFromValue, declaredOutputFields, subscribeWorkflowSaved } from './chunk-VYXTP6YF.js';
2
2
  import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
3
3
  import { useFlowStore } from './chunk-JXCJRBWD.js';
4
4
  import { EventRegistrationsDocument } from './chunk-VAWYR6P4.js';
@@ -1,43 +1,3 @@
1
- import { QuotaExhaustedDialog } from './chunk-5WUX3DET.js';
2
- import { useTr } from './chunk-UULVIT25.js';
3
- import { jsx } from 'react/jsx-runtime';
4
-
5
- function CreateWorkflowRefusalDialog({
6
- refusal,
7
- onClose,
8
- onUpgrade,
9
- surface
10
- }) {
11
- const tr = useTr();
12
- const notProvisioned = refusal?.kind === "quota-not-provisioned";
13
- const open = refusal?.kind === "quota-exhausted" || refusal?.kind === "quota-not-provisioned";
14
- return /* @__PURE__ */ jsx(
15
- QuotaExhaustedDialog,
16
- {
17
- surface,
18
- open,
19
- limitHit: !notProvisioned,
20
- onOpenChange: (next) => {
21
- if (!next) onClose();
22
- },
23
- onUpgrade: () => {
24
- onUpgrade();
25
- onClose();
26
- },
27
- ...notProvisioned ? {
28
- title: tr(
29
- "fluidgrids.components.createRefusal.notProvisionedTitle",
30
- "Workflows aren't in this workspace's plan"
31
- ),
32
- description: tr(
33
- "fluidgrids.components.createRefusal.notProvisionedDescription",
34
- "This workspace has no plan that includes FluidGrids workflows, so no workflow was created. Choose a plan for this workspace, or ask a workspace admin to add one."
35
- )
36
- } : {}
37
- }
38
- );
39
- }
40
-
41
1
  // src/utils/workflow-open.ts
42
2
  var NEW_WORKFLOW_STATE = { createWorkflow: true };
43
3
  function isCreateIntent(state) {
@@ -101,4 +61,4 @@ function pickGuidedTour(pageTours, pageId) {
101
61
  return playable.find((tour) => tour.pageId === pageId) ?? null;
102
62
  }
103
63
 
104
- export { CreateWorkflowRefusalDialog, GUIDED_FIRST_WORKFLOW_NAV, GUIDED_FIRST_WORKFLOW_STATE, GUIDED_TOUR_STATE, builderPathFor, decideMissingWorkflow, firstWorkflowProgress, isCreateIntent, isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent };
64
+ export { GUIDED_FIRST_WORKFLOW_NAV, GUIDED_FIRST_WORKFLOW_STATE, GUIDED_TOUR_STATE, builderPathFor, decideMissingWorkflow, firstWorkflowProgress, isCreateIntent, isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent };
@@ -1,5 +1,5 @@
1
1
  import { emptyAgentForm, agentToForm, describeRule, formToInput, AgentFormError, DEFAULT_GRANT_DAYS, MAX_GRANT_DAYS, grantDays } from './chunk-WZ3EJVS6.js';
2
- import { useAgentDefinitions, useAgentDefinitionList, useConnections } from './chunk-I6FW4C3B.js';
2
+ import { useAgentDefinitions, useAgentDefinitionList, useConnections } from './chunk-VYXTP6YF.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { describeOperationError } from './chunk-JKLZ6YZ3.js';
5
5
  import { useState, useCallback, useEffect } from 'react';
@@ -1,12 +1,99 @@
1
- import { useFluidGridsAnalytics, emitWorkflowLimitHit, emitUpgradeClicked, WORKFLOWS_QUOTA_NAME } from './chunk-I6FW4C3B.js';
1
+ import { useFluidGridsAnalytics, emitWorkflowLimitHit, emitUpgradeClicked, WORKFLOWS_QUOTA_NAME } from './chunk-VYXTP6YF.js';
2
2
  import { ExportWorkflowCodeDocument, ShareWorkflowDocument, WorkflowSharingDocument } from './chunk-VAWYR6P4.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
5
5
  import { describeOperationError, throwIfResultError } from './chunk-JKLZ6YZ3.js';
6
- import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
7
- import { createSharePrincipalLister, ResourceShareDialog } from '@burdenoff/fe-libs/connections';
8
- import { jsx, jsxs } from 'react/jsx-runtime';
9
6
  import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@burdenoff/fe-libs/ui';
7
+ import { useRef, useEffect, useState, useCallback, useMemo } from 'react';
8
+ import { jsx, jsxs } from 'react/jsx-runtime';
9
+ import { createSharePrincipalLister, ResourceShareDialog } from '@burdenoff/fe-libs/connections';
10
+
11
+ function QuotaExhaustedDialog({
12
+ open,
13
+ onOpenChange,
14
+ onUpgrade,
15
+ title,
16
+ description,
17
+ surface,
18
+ limitHit = true
19
+ }) {
20
+ const tr = useTr();
21
+ const { bus, workspaceId } = useFluidGridsAnalytics();
22
+ const wasOpen = useRef(false);
23
+ useEffect(() => {
24
+ if (open && !wasOpen.current && limitHit) {
25
+ emitWorkflowLimitHit(bus, { workspaceId, surface });
26
+ }
27
+ wasOpen.current = open;
28
+ }, [open, bus, workspaceId, surface, limitHit]);
29
+ const handleUpgrade = () => {
30
+ emitUpgradeClicked(bus, {
31
+ workspaceId,
32
+ surface: "quota-dialog",
33
+ quotaKey: WORKFLOWS_QUOTA_NAME
34
+ });
35
+ onUpgrade();
36
+ };
37
+ const resolvedTitle = title ?? tr(
38
+ "fluidgrids.components.quotaExhaustedDialog.title",
39
+ "Workflow Limit Reached"
40
+ );
41
+ const resolvedDescription = description ?? tr(
42
+ "fluidgrids.components.quotaExhaustedDialog.description",
43
+ "You've reached the workflow limit for your plan. Upgrade your plan to create more workflows."
44
+ );
45
+ return /* @__PURE__ */ jsx(AlertDialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
46
+ /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
47
+ /* @__PURE__ */ jsx(AlertDialogTitle, { children: resolvedTitle }),
48
+ /* @__PURE__ */ jsx(AlertDialogDescription, { children: resolvedDescription })
49
+ ] }),
50
+ /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
51
+ /* @__PURE__ */ jsx(AlertDialogCancel, { children: tr(
52
+ "fluidgrids.components.quotaExhaustedDialog.dismiss",
53
+ "Dismiss"
54
+ ) }),
55
+ /* @__PURE__ */ jsx(AlertDialogAction, { onClick: handleUpgrade, children: tr(
56
+ "fluidgrids.components.quotaExhaustedDialog.viewPlans",
57
+ "View plans"
58
+ ) })
59
+ ] })
60
+ ] }) });
61
+ }
62
+ function CreateWorkflowRefusalDialog({
63
+ refusal,
64
+ onClose,
65
+ onUpgrade,
66
+ surface
67
+ }) {
68
+ const tr = useTr();
69
+ const notProvisioned = refusal?.kind === "quota-not-provisioned";
70
+ const open = refusal?.kind === "quota-exhausted" || refusal?.kind === "quota-not-provisioned";
71
+ return /* @__PURE__ */ jsx(
72
+ QuotaExhaustedDialog,
73
+ {
74
+ surface,
75
+ open,
76
+ limitHit: !notProvisioned,
77
+ onOpenChange: (next) => {
78
+ if (!next) onClose();
79
+ },
80
+ onUpgrade: () => {
81
+ onUpgrade();
82
+ onClose();
83
+ },
84
+ ...notProvisioned ? {
85
+ title: tr(
86
+ "fluidgrids.components.createRefusal.notProvisionedTitle",
87
+ "Workflows aren't in this workspace's plan"
88
+ ),
89
+ description: tr(
90
+ "fluidgrids.components.createRefusal.notProvisionedDescription",
91
+ "This workspace has no plan that includes FluidGrids workflows, so no workflow was created. Choose a plan for this workspace, or ask a workspace admin to add one."
92
+ )
93
+ } : {}
94
+ }
95
+ );
96
+ }
10
97
 
11
98
  // src/utils/workflow-transfer.ts
12
99
  function asRecord(value) {
@@ -626,56 +713,5 @@ function WorkflowShareDialog({
626
713
  }
627
714
  );
628
715
  }
629
- function QuotaExhaustedDialog({
630
- open,
631
- onOpenChange,
632
- onUpgrade,
633
- title,
634
- description,
635
- surface,
636
- limitHit = true
637
- }) {
638
- const tr = useTr();
639
- const { bus, workspaceId } = useFluidGridsAnalytics();
640
- const wasOpen = useRef(false);
641
- useEffect(() => {
642
- if (open && !wasOpen.current && limitHit) {
643
- emitWorkflowLimitHit(bus, { workspaceId, surface });
644
- }
645
- wasOpen.current = open;
646
- }, [open, bus, workspaceId, surface, limitHit]);
647
- const handleUpgrade = () => {
648
- emitUpgradeClicked(bus, {
649
- workspaceId,
650
- surface: "quota-dialog",
651
- quotaKey: WORKFLOWS_QUOTA_NAME
652
- });
653
- onUpgrade();
654
- };
655
- const resolvedTitle = title ?? tr(
656
- "fluidgrids.components.quotaExhaustedDialog.title",
657
- "Workflow Limit Reached"
658
- );
659
- const resolvedDescription = description ?? tr(
660
- "fluidgrids.components.quotaExhaustedDialog.description",
661
- "You've reached the workflow limit for your plan. Upgrade your plan to create more workflows."
662
- );
663
- return /* @__PURE__ */ jsx(AlertDialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
664
- /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
665
- /* @__PURE__ */ jsx(AlertDialogTitle, { children: resolvedTitle }),
666
- /* @__PURE__ */ jsx(AlertDialogDescription, { children: resolvedDescription })
667
- ] }),
668
- /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
669
- /* @__PURE__ */ jsx(AlertDialogCancel, { children: tr(
670
- "fluidgrids.components.quotaExhaustedDialog.dismiss",
671
- "Dismiss"
672
- ) }),
673
- /* @__PURE__ */ jsx(AlertDialogAction, { onClick: handleUpgrade, children: tr(
674
- "fluidgrids.components.quotaExhaustedDialog.viewPlans",
675
- "View plans"
676
- ) })
677
- ] })
678
- ] }) });
679
- }
680
716
 
681
- export { CODE_EXPORT_FORMATS, ImportSourceError, MAX_IMPORT_ARCHIVE_BYTES, MAX_IMPORT_SOURCE_BYTES, QuotaExhaustedDialog, WorkflowShareDialog, assertImportByteSize, canEditWorkflow, canShareWorkflow, checkTypeScriptImport, downloadWorkflowCodeExport, downloadWorkflowExport, fileBaseName, importAcceptAttribute, importFileKind, isLosslessReport, isLossyFidelityItem, lineOfNode, orderedExportFiles, parseWorkflowImport, primaryImportModule, readProjectArchive, sortFidelityItems, typeScriptImportSource, typeScriptModuleFile, useExportWorkflowAs, useWorkflowCodeExport, workflowNameFromFile };
717
+ export { CODE_EXPORT_FORMATS, CreateWorkflowRefusalDialog, ImportSourceError, MAX_IMPORT_ARCHIVE_BYTES, MAX_IMPORT_SOURCE_BYTES, QuotaExhaustedDialog, WorkflowShareDialog, assertImportByteSize, canEditWorkflow, canShareWorkflow, checkTypeScriptImport, downloadWorkflowCodeExport, downloadWorkflowExport, fileBaseName, importAcceptAttribute, importFileKind, isLosslessReport, isLossyFidelityItem, lineOfNode, orderedExportFiles, parseWorkflowImport, primaryImportModule, readProjectArchive, sortFidelityItems, typeScriptImportSource, typeScriptModuleFile, useExportWorkflowAs, useWorkflowCodeExport, workflowNameFromFile };
@@ -1,6 +1,6 @@
1
- import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, RunHistoryView, SignalRunDialog, terminateDurableRun } from './chunk-NQ7JQNQ7.js';
2
- import { useDurableParityRunFields, hasAgentNodeState, agentNodeTraces, orderNodesByExecution, useRunPending, useRunMetadata, ExecutionStatusBadge, NodeTimeline, RunLogViewer, NodeStatusBadge, setRunVersioningOverride } from './chunk-7VT6V5PG.js';
3
- import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-IVAV4Y57.js';
1
+ import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, RunHistoryView, SignalRunDialog, terminateDurableRun } from './chunk-3T3C3475.js';
2
+ import { useDurableParityRunFields, hasAgentNodeState, agentNodeTraces, orderNodesByExecution, useRunPending, useRunMetadata, ExecutionStatusBadge, NodeTimeline, RunLogViewer, NodeStatusBadge, setRunVersioningOverride } from './chunk-GR3QNLFS.js';
3
+ import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-ACME5GOU.js';
4
4
  import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-Q526TUOC.js';
5
5
  import { aiCost, formatTokens, modelLabel } from './chunk-NZAYYUQ4.js';
6
6
  import { useRunPolicyDecisions, RunPolicyDecisions, checkCodecServerUrl, containsEncodedPayload, isEncodedPayload, encodedPayloadBytes, decodePayloads, CodecServerError } from './chunk-OJHBCOBA.js';
@@ -8,8 +8,8 @@ import { readTyped, writeTyped, useResource, fetchCodecServerSettings, fetchRunC
8
8
  import { EntityTagPicker, canSaveRunAsTestCase, useWorkflowProposal, WorkflowProposalCard, MAX_CASE_NAME, saveRunAsTestCase } from './chunk-MYE6CMGK.js';
9
9
  import { buildNodeDisplayMap, formatRunVersion, nodeDisplayTitle } from './chunk-DFFQYK2X.js';
10
10
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
11
- import { useWorkflowVersions } from './chunk-K7YFK5K2.js';
12
- import { useDurableFunctionNodesEnabled, useDurableParityEnabled, usePhaseCFlags, runSignalTargets, canSignalRun, formatElapsedMs, runDurationMs, useWorkflowTestsEnabled, durableInterfaceOf } from './chunk-I6FW4C3B.js';
11
+ import { useWorkflowVersions } from './chunk-ZXLXZFWO.js';
12
+ import { useDurableFunctionNodesEnabled, useDurableParityEnabled, usePhaseCFlags, runSignalTargets, canSignalRun, formatElapsedMs, runDurationMs, useWorkflowTestsEnabled, durableInterfaceOf } from './chunk-VYXTP6YF.js';
13
13
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton } from './chunk-ERT444RG.js';
14
14
  import { TaskQueuesDocument, TaskQueueStatsDocument, CreateTaskQueueDocument, UpdateTaskQueueDocument, DeleteTaskQueueDocument, RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument, RunAiUsageDocument } from './chunk-VAWYR6P4.js';
15
15
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,9 +1,9 @@
1
- import { AgentsTab } from './chunk-XGQLFKRC.js';
1
+ import { AgentsTab } from './chunk-QTOPG7SR.js';
2
2
  import { ActionPoliciesTab, checkCodecServerUrl } from './chunk-OJHBCOBA.js';
3
3
  import { useResource, fetchPauseRules, FieldError, fetchSearchAttributes, StatusPill, NativeSelect, fetchArchiveSettings, fetchCodecServerSettings, deletePauseRule, createPauseRule, deleteSearchAttribute, createSearchAttribute, saveArchiveSettings, clearArchiveSettings, saveCodecServerSettings } from './chunk-5YLS3WH5.js';
4
- import { LogStreamingTab } from './chunk-2SUZKBHB.js';
4
+ import { LogStreamingTab } from './chunk-CX3LABFK.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
- import { useFluidGridsFlag, FLUIDGRIDS_FLAGS, usePhaseCFlags, useSaveStatusStore, findSaveConflict, useDurableParityEnabled, useConnections } from './chunk-I6FW4C3B.js';
6
+ import { useFluidGridsFlag, FLUIDGRIDS_FLAGS, usePhaseCFlags, useSaveStatusStore, findSaveConflict, useDurableParityEnabled, useConnections } from './chunk-VYXTP6YF.js';
7
7
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ERT444RG.js';
8
8
  import { useFlowStore } from './chunk-JXCJRBWD.js';
9
9
  import { getGlobalStoreClient } from './chunk-TYI2XOSI.js';
@@ -1,8 +1,8 @@
1
1
  import { FailureTriagePanel } from './chunk-Q526TUOC.js';
2
2
  import { aiSpendPeriod, AI_SPEND_RANGE_DAYS, evidenceFacts, monthlySavingLabel, evidenceWindowDays, shortRunId, DISMISS_REASONS, MAX_DISMISS_NOTE_LENGTH, aiCost, formatTokens, runsOfWorkflowPath } from './chunk-NZAYYUQ4.js';
3
- import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-2SUZKBHB.js';
3
+ import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-CX3LABFK.js';
4
4
  import { proposalCanvasPath } from './chunk-GLYINMOR.js';
5
- import { useContinuousOptimisationEnabled } from './chunk-I6FW4C3B.js';
5
+ import { useContinuousOptimisationEnabled } from './chunk-VYXTP6YF.js';
6
6
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton } from './chunk-ERT444RG.js';
7
7
  import { SetContinuousOptimisationEnabledDocument, FgRunOptimisationScanDocument, ProposeOptimisationDocument, WorkflowProposalDocument, DismissOptimisationSuggestionDocument, SnoozeOptimisationSuggestionDocument, WorkspaceAiUsageDocument, OptimisationSuggestionsDocument, ContinuousOptimisationSettingsDocument } from './chunk-VAWYR6P4.js';
8
8
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,10 +1,10 @@
1
- import { asRecord, ConditionTreeBuilder, SwitchRulesEditor, casesFromRules, isStringOptionList, optionText, coerceNumber, paramsFromOperation, resolveLoadOptionsSpec, optionListValues, parseMappingValue, optionListText } from './chunk-7XQI4U5C.js';
2
1
  import { CodeEditorField, normalizeCodeLanguage } from './chunk-KZCNJAMK.js';
3
2
  import { Popover, PopoverTrigger, PopoverContent } from './chunk-GTEBQQ7J.js';
4
- import { AgentDefinitionSelectField } from './chunk-XGQLFKRC.js';
3
+ import { asRecord, ConditionTreeBuilder, SwitchRulesEditor, casesFromRules, isStringOptionList, optionText, coerceNumber, paramsFromOperation, resolveLoadOptionsSpec, optionListValues, parseMappingValue, optionListText } from './chunk-NEB4Y7AX.js';
4
+ import { AgentDefinitionSelectField } from './chunk-QTOPG7SR.js';
5
5
  import { isAgentNodeType } from './chunk-WZ3EJVS6.js';
6
6
  import { readAssertRulesSetting, rowsFromRules, normaliseAssertRules, ruleFromRow, describeAssertRuleProblem, operatorSpec, ASSERT_OPERATORS, emptyAssertRuleRow } from './chunk-JDLQ6QIB.js';
7
- import { isParamVisible, ConnectionSelector, structuredParameterType, useRunGuard, FluidGridsContext, ExpressionEditor, formatParameterValue, parseParameterValue, useFluidGridsAnalytics, openRunQuotaUpgradePrompt } from './chunk-I6FW4C3B.js';
7
+ import { isParamVisible, ConnectionSelector, structuredParameterType, useRunGuard, FluidGridsContext, ExpressionEditor, formatParameterValue, parseParameterValue, useFluidGridsAnalytics, openRunQuotaUpgradePrompt } from './chunk-VYXTP6YF.js';
8
8
  import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
9
9
  import { useFlowStore } from './chunk-JXCJRBWD.js';
10
10
  import { useRunFromNodeEligibilityQuery, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument } from './chunk-VAWYR6P4.js';