@burdenoff/fluidgrids-fe-sdk 2026.1031.1 → 2026.1031.3

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 (37) hide show
  1. package/dist/{ExecutionDetailPage-3OBQI7US.js → ExecutionDetailPage-WOOORXXU.js} +8 -8
  2. package/dist/{ExecutionsListPage-IWCFZN3M.js → ExecutionsListPage-AYDGFU6W.js} +5 -5
  3. package/dist/{TemplateDetailPanel-F5SL7LZ5.js → TemplateDetailPanel-MTKW3SPM.js} +15 -4
  4. package/dist/{WorkflowBuilder-QUFOAGGI.js → WorkflowBuilder-N3ZUYFRK.js} +9 -8
  5. package/dist/{WorkflowsList-FUPJBOZF.js → WorkflowsList-BZXBTGNL.js} +6 -6
  6. package/dist/{chunk-DNXI4MRX.js → chunk-44KAAKFK.js} +4 -4
  7. package/dist/{chunk-WYRMFOAE.js → chunk-475XP5J7.js} +5 -5
  8. package/dist/{chunk-G5UND5NE.js → chunk-6PGLJWIC.js} +118 -9
  9. package/dist/{chunk-KWI3VUDC.js → chunk-ADTEMSJI.js} +1 -1
  10. package/dist/chunk-B6CCE2RW.js +16 -0
  11. package/dist/{chunk-MKHVPALQ.js → chunk-BHD4CDLL.js} +1 -1
  12. package/dist/{chunk-WXZYFZAQ.js → chunk-CIR7WF4W.js} +1 -1
  13. package/dist/{chunk-GORW52XL.js → chunk-DHR2YURL.js} +7 -7
  14. package/dist/{chunk-V5YQDSOR.js → chunk-DJAGZUHW.js} +41 -34
  15. package/dist/{chunk-35XBZMUY.js → chunk-GV5RJ6BU.js} +4 -4
  16. package/dist/{chunk-EPPDUVRT.js → chunk-IGROOI7E.js} +1 -1
  17. package/dist/{chunk-HQZR7PRN.js → chunk-JFQGODKK.js} +1 -1
  18. package/dist/{chunk-RCC6MWJ7.js → chunk-P2VAHDGO.js} +1 -1
  19. package/dist/{chunk-ASNNQIBJ.js → chunk-P3TGCUXP.js} +2 -2
  20. package/dist/{chunk-37GZQV4P.js → chunk-PKG6BCHB.js} +1 -1
  21. package/dist/{chunk-6PLOOE6D.js → chunk-PTROESUB.js} +4 -4
  22. package/dist/{chunk-YHYBZCC5.js → chunk-Q3HKE627.js} +3 -3
  23. package/dist/{chunk-56VJFVOR.js → chunk-QKQOTEAB.js} +1 -1
  24. package/dist/{chunk-BYTREFEU.js → chunk-R4Q37Q4X.js} +3 -3
  25. package/dist/{chunk-XZPZE4S7.js → chunk-VJWJGSRS.js} +1 -1
  26. package/dist/{chunk-TKMGUAQZ.js → chunk-WHPQRYZD.js} +4 -4
  27. package/dist/{chunk-ZWXX6NA3.js → chunk-XX6D7IND.js} +1 -1
  28. package/dist/executions.js +9 -9
  29. package/dist/history.js +3 -3
  30. package/dist/index.d.ts +96 -4
  31. package/dist/index.js +33 -32
  32. package/dist/observability.js +4 -4
  33. package/dist/settings.js +5 -5
  34. package/dist/templates.js +8 -7
  35. package/dist/workflow-builder.js +10 -9
  36. package/dist/workflows-list.js +6 -6
  37. package/package.json +1 -1
@@ -1,17 +1,17 @@
1
- export { ExecutionDetailPage } from './chunk-GORW52XL.js';
2
- import './chunk-ASNNQIBJ.js';
3
- import './chunk-ZWXX6NA3.js';
4
- import './chunk-RCC6MWJ7.js';
5
- import './chunk-XZPZE4S7.js';
1
+ export { ExecutionDetailPage } from './chunk-DHR2YURL.js';
2
+ import './chunk-P3TGCUXP.js';
3
+ import './chunk-XX6D7IND.js';
4
+ import './chunk-P2VAHDGO.js';
5
+ import './chunk-VJWJGSRS.js';
6
6
  import './chunk-5ERAJC2I.js';
7
- import './chunk-KWI3VUDC.js';
7
+ import './chunk-ADTEMSJI.js';
8
8
  import './chunk-INMYNHJL.js';
9
9
  import './chunk-Y53CVZVV.js';
10
10
  import './chunk-FNZZ5JJL.js';
11
- import './chunk-37GZQV4P.js';
11
+ import './chunk-PKG6BCHB.js';
12
12
  import './chunk-PJAWNFJV.js';
13
13
  import './chunk-Z3FYBDE3.js';
14
- import './chunk-G5UND5NE.js';
14
+ import './chunk-6PGLJWIC.js';
15
15
  import './chunk-JL7CASN5.js';
16
16
  import './chunk-PXIFUMLA.js';
17
17
  import './chunk-6AMNEX2Y.js';
@@ -1,14 +1,14 @@
1
- export { ExecutionsListPage } from './chunk-6PLOOE6D.js';
2
- import './chunk-ASNNQIBJ.js';
3
- import './chunk-ZWXX6NA3.js';
1
+ export { ExecutionsListPage } from './chunk-PTROESUB.js';
2
+ import './chunk-P3TGCUXP.js';
3
+ import './chunk-XX6D7IND.js';
4
4
  import './chunk-5ERAJC2I.js';
5
5
  import './chunk-INMYNHJL.js';
6
6
  import './chunk-FNZZ5JJL.js';
7
- import './chunk-37GZQV4P.js';
7
+ import './chunk-PKG6BCHB.js';
8
8
  import './chunk-PJAWNFJV.js';
9
9
  import './chunk-Z3FYBDE3.js';
10
10
  import './chunk-4VJ3MDOV.js';
11
- import './chunk-G5UND5NE.js';
11
+ import './chunk-6PGLJWIC.js';
12
12
  import './chunk-JL7CASN5.js';
13
13
  import './chunk-PXIFUMLA.js';
14
14
  import './chunk-6AMNEX2Y.js';
@@ -1,8 +1,10 @@
1
+ import { templatePreview } from './chunk-B6CCE2RW.js';
1
2
  import { Button, Badge } from './chunk-BQXVT32O.js';
2
3
  import './chunk-JL7CASN5.js';
3
4
  import { useTr } from './chunk-UULVIT25.js';
4
5
  import './chunk-62GWEYJ5.js';
5
6
  import { X, Sparkles, Star, Download, Eye, User, Calendar, Tag, ExternalLink } from 'lucide-react';
7
+ import { Icon } from '@iconify/react';
6
8
  import { jsxs, jsx } from 'react/jsx-runtime';
7
9
 
8
10
  function formatNumber(count) {
@@ -32,7 +34,7 @@ function TemplateDetailPanel({
32
34
  onUseTemplate
33
35
  }) {
34
36
  const tr = useTr();
35
- const previewImage = template.screenshots?.[0] || template.icon;
37
+ const preview = templatePreview(template);
36
38
  return /* @__PURE__ */ jsxs("div", { className: "w-full md:w-1/2 lg:w-2/5 border-l bg-background overflow-y-auto", children: [
37
39
  /* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-background border-b", children: [
38
40
  /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold truncate pr-4", children: tr(
@@ -52,14 +54,23 @@ function TemplateDetailPanel({
52
54
  ] }),
53
55
  /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-5", children: [
54
56
  /* @__PURE__ */ jsxs("div", { className: "relative aspect-video w-full rounded-lg overflow-hidden bg-gradient-to-br from-primary/5 to-primary/10", children: [
55
- previewImage ? /* @__PURE__ */ jsx(
57
+ preview.kind === "image" ? /* @__PURE__ */ jsx(
56
58
  "img",
57
59
  {
58
- src: previewImage,
60
+ src: preview.src,
59
61
  alt: template.name,
60
62
  className: "w-full h-full object-cover"
61
63
  }
62
- ) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" }) }),
64
+ ) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center", children: preview.kind === "icon" ? /* @__PURE__ */ jsx(
65
+ Icon,
66
+ {
67
+ icon: preview.name,
68
+ width: 64,
69
+ height: 64,
70
+ className: "text-primary/60",
71
+ "aria-hidden": "true"
72
+ }
73
+ ) : /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" }) }),
63
74
  /* @__PURE__ */ jsx("div", { className: "absolute top-2 left-2", children: template.pricingModel === "FREE" ? /* @__PURE__ */ jsx(
64
75
  Badge,
65
76
  {
@@ -1,20 +1,21 @@
1
- export { WorkflowBuilder } from './chunk-DNXI4MRX.js';
2
- import './chunk-MKHVPALQ.js';
1
+ export { WorkflowBuilder } from './chunk-44KAAKFK.js';
2
+ import './chunk-BHD4CDLL.js';
3
3
  import './chunk-PIKYQE7P.js';
4
- import './chunk-V5YQDSOR.js';
4
+ import './chunk-DJAGZUHW.js';
5
5
  import './chunk-GEMNVFPK.js';
6
+ import './chunk-B6CCE2RW.js';
6
7
  import './chunk-IEVSFCFS.js';
7
8
  import './chunk-YXMFRQYV.js';
8
9
  import './chunk-BQXVT32O.js';
9
- import './chunk-EPPDUVRT.js';
10
- import './chunk-KWI3VUDC.js';
10
+ import './chunk-IGROOI7E.js';
11
+ import './chunk-ADTEMSJI.js';
11
12
  import './chunk-INMYNHJL.js';
12
13
  import './chunk-Y53CVZVV.js';
13
- import './chunk-37GZQV4P.js';
14
+ import './chunk-PKG6BCHB.js';
14
15
  import './chunk-Z3FYBDE3.js';
15
- import './chunk-HQZR7PRN.js';
16
+ import './chunk-JFQGODKK.js';
16
17
  import './chunk-4VJ3MDOV.js';
17
- import './chunk-G5UND5NE.js';
18
+ import './chunk-6PGLJWIC.js';
18
19
  import './chunk-JL7CASN5.js';
19
20
  import './chunk-PXIFUMLA.js';
20
21
  import './chunk-6AMNEX2Y.js';
@@ -1,14 +1,14 @@
1
- export { WorkflowsList } from './chunk-WYRMFOAE.js';
2
- import './chunk-MKHVPALQ.js';
3
- import './chunk-ZWXX6NA3.js';
1
+ export { WorkflowsList } from './chunk-475XP5J7.js';
2
+ import './chunk-BHD4CDLL.js';
3
+ import './chunk-XX6D7IND.js';
4
4
  import './chunk-5ERAJC2I.js';
5
- import './chunk-EPPDUVRT.js';
5
+ import './chunk-IGROOI7E.js';
6
6
  import './chunk-FNZZ5JJL.js';
7
- import './chunk-37GZQV4P.js';
7
+ import './chunk-PKG6BCHB.js';
8
8
  import './chunk-PJAWNFJV.js';
9
9
  import './chunk-Z3FYBDE3.js';
10
10
  import './chunk-4VJ3MDOV.js';
11
- import './chunk-G5UND5NE.js';
11
+ import './chunk-6PGLJWIC.js';
12
12
  import './chunk-JL7CASN5.js';
13
13
  import './chunk-PXIFUMLA.js';
14
14
  import './chunk-6AMNEX2Y.js';
@@ -1,8 +1,8 @@
1
- import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-MKHVPALQ.js';
1
+ import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-BHD4CDLL.js';
2
2
  import { registerLiveCanvasHandler } from './chunk-PIKYQE7P.js';
3
- import { useWorkflowReloadStore, releaseLeaseKeptForReload, useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-V5YQDSOR.js';
4
- import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-37GZQV4P.js';
5
- import { useFlowStore, refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, mergeStickyNotes, rememberRevision, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes, throwIfResultError } from './chunk-G5UND5NE.js';
3
+ import { useWorkflowReloadStore, releaseLeaseKeptForReload, useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-DJAGZUHW.js';
4
+ import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-PKG6BCHB.js';
5
+ import { useFlowStore, refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, mergeStickyNotes, rememberRevision, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes, throwIfResultError } from './chunk-6PGLJWIC.js';
6
6
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
7
7
  import { WorkflowDefinitionDocument } from './chunk-AW3UXMNI.js';
8
8
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,11 +1,11 @@
1
- import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-MKHVPALQ.js';
2
- import { useExecutions } from './chunk-ZWXX6NA3.js';
3
- import { useExportWorkflowAs, downloadWorkflowExport, importAcceptAttribute, QuotaExhaustedDialog, importFileKind, parseWorkflowImport, CODE_EXPORT_FORMATS, ImportSourceError, assertImportByteSize, MAX_IMPORT_ARCHIVE_BYTES, readProjectArchive, checkTypeScriptImport, MAX_IMPORT_SOURCE_BYTES, typeScriptModuleFile, typeScriptImportSource, workflowNameFromFile, primaryImportModule } from './chunk-EPPDUVRT.js';
1
+ import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-BHD4CDLL.js';
2
+ import { useExecutions } from './chunk-XX6D7IND.js';
3
+ import { useExportWorkflowAs, downloadWorkflowExport, importAcceptAttribute, QuotaExhaustedDialog, importFileKind, parseWorkflowImport, CODE_EXPORT_FORMATS, ImportSourceError, assertImportByteSize, MAX_IMPORT_ARCHIVE_BYTES, readProjectArchive, checkTypeScriptImport, MAX_IMPORT_SOURCE_BYTES, typeScriptModuleFile, typeScriptImportSource, workflowNameFromFile, primaryImportModule } from './chunk-IGROOI7E.js';
4
4
  import { workflowsListControls } from './chunk-FNZZ5JJL.js';
5
- import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-37GZQV4P.js';
5
+ import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-PKG6BCHB.js';
6
6
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
7
7
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
8
- import { createThenOpen, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useFluidGridsFlag, FLUIDGRIDS_FLAGS, SdkPermissionButton, BILLING_PLANS_PATH, describeOperationError, useFlowStore, SdkPermissionGate, isQuotaExhaustedFailure } from './chunk-G5UND5NE.js';
8
+ import { createThenOpen, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useFluidGridsFlag, FLUIDGRIDS_FLAGS, SdkPermissionButton, BILLING_PLANS_PATH, describeOperationError, useFlowStore, SdkPermissionGate, isQuotaExhaustedFailure } from './chunk-6PGLJWIC.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
10
  import { useState, useRef, useCallback, useMemo } from 'react';
11
11
  import { useNavigate } from 'react-router';
@@ -39,16 +39,43 @@ var DURABLE_FUNCTION_NODE_TYPES = /* @__PURE__ */ new Set([
39
39
  "internal:code-workflow",
40
40
  "internal:wait-for-signal"
41
41
  ]);
42
+ var RUN_CONTROL_NODE_TYPES = /* @__PURE__ */ new Set([
43
+ "internal:signal-run",
44
+ "internal:set-search-attributes"
45
+ ]);
46
+ function isRunControlNodeType(nodeType) {
47
+ return !!nodeType && RUN_CONTROL_NODE_TYPES.has(nodeType);
48
+ }
49
+ function paletteGatesOf(gates) {
50
+ if (typeof gates === "boolean")
51
+ return {
52
+ durableFunctions: gates,
53
+ runControl: false,
54
+ searchAttributes: false
55
+ };
56
+ return {
57
+ durableFunctions: gates?.durableFunctions === true,
58
+ runControl: gates?.runControl === true,
59
+ searchAttributes: gates?.searchAttributes === true
60
+ };
61
+ }
62
+ function hiddenBy(nodeType, gates) {
63
+ if (DURABLE_FUNCTION_NODE_TYPES.has(nodeType)) return !gates.durableFunctions;
64
+ if (nodeType === "internal:signal-run") return !gates.runControl;
65
+ if (nodeType === "internal:set-search-attributes")
66
+ return !gates.searchAttributes;
67
+ return false;
68
+ }
42
69
  function isDurableFunctionNodeType(nodeType) {
43
70
  return !!nodeType && DURABLE_FUNCTION_NODE_TYPES.has(nodeType);
44
71
  }
45
- function isNodeTypeHiddenFromPalette(nodeType, durableFunctionsEnabled = false) {
46
- return !durableFunctionsEnabled && isDurableFunctionNodeType(nodeType);
72
+ function isNodeTypeHiddenFromPalette(nodeType, gates = false) {
73
+ return !!nodeType && hiddenBy(nodeType, paletteGatesOf(gates));
47
74
  }
48
- function filterPaletteNodes(nodes, durableFunctionsEnabled = false) {
49
- if (durableFunctionsEnabled) return nodes;
50
- if (!nodes.some((node) => isDurableFunctionNodeType(node.type))) return nodes;
51
- return nodes.filter((node) => !isDurableFunctionNodeType(node.type));
75
+ function filterPaletteNodes(nodes, gates = false) {
76
+ const resolved = paletteGatesOf(gates);
77
+ if (!nodes.some((node) => hiddenBy(node.type, resolved))) return nodes;
78
+ return nodes.filter((node) => !hiddenBy(node.type, resolved));
52
79
  }
53
80
  var FLUIDGRIDS_FLAGS = {
54
81
  /**
@@ -80,13 +107,51 @@ var FLUIDGRIDS_FLAGS = {
80
107
  * defaults OFF and fails closed; the parity surfaces show only while this
81
108
  * flag, `durableFunctions` and `codeFirst` are all on.
82
109
  */
83
- durableParity: "fluidgrids.durable-parity"
110
+ durableParity: "fluidgrids.durable-parity",
111
+ /**
112
+ * Phase C (BOFF-9906, PLAN-C §2.1): self-hosted task queues, worker tokens,
113
+ * the task-queue pages and the codec settings. A rollout gate that also
114
+ * needs `codeFirst` and `durableFunctions`, so it defaults OFF and fails
115
+ * closed (see {@link resolvePhaseCFlags}).
116
+ */
117
+ selfHostedWorkers: "fluidgrids.self-hosted-workers",
118
+ /**
119
+ * Phase C run control: updates and queries, reset, activity pause and
120
+ * options, pause rules, signal tokens, batch operations and the Signal Run
121
+ * node. Needs `codeFirst`, plus `durableFunctions` for anything acting on a
122
+ * durable-function run. Defaults OFF, fails closed.
123
+ */
124
+ runControl: "fluidgrids.run-control",
125
+ /**
126
+ * Phase C search attributes: definitions, the runs-list filter, the Set
127
+ * Search Attributes node. Needs `codeFirst`. Defaults OFF, fails closed.
128
+ */
129
+ searchAttributes: "fluidgrids.search-attributes",
130
+ /** Phase C run archival: the archive destination settings. Needs `codeFirst`. */
131
+ runArchival: "fluidgrids.run-archival",
132
+ /**
133
+ * Phase C schedule policies: the schedule panel of a Schedule Trigger
134
+ * (overlap policy, trigger now, backfill, pause with a note). Needs
135
+ * `codeFirst`. Defaults OFF, fails closed.
136
+ */
137
+ schedulePolicies: "fluidgrids.schedule-policies",
138
+ /**
139
+ * Phase C Python durable functions: editing Python sources in the browser
140
+ * editor. Needs `codeFirst` and `durableFunctions`. Defaults OFF.
141
+ */
142
+ pythonDurableFunctions: "fluidgrids.python-durable-functions"
84
143
  };
85
144
  var FLUIDGRIDS_FLAG_DEFAULTS = {
86
145
  [FLUIDGRIDS_FLAGS.logStreams]: true,
87
146
  [FLUIDGRIDS_FLAGS.codeFirst]: false,
88
147
  [FLUIDGRIDS_FLAGS.durableFunctions]: false,
89
- [FLUIDGRIDS_FLAGS.durableParity]: false
148
+ [FLUIDGRIDS_FLAGS.durableParity]: false,
149
+ [FLUIDGRIDS_FLAGS.selfHostedWorkers]: false,
150
+ [FLUIDGRIDS_FLAGS.runControl]: false,
151
+ [FLUIDGRIDS_FLAGS.searchAttributes]: false,
152
+ [FLUIDGRIDS_FLAGS.runArchival]: false,
153
+ [FLUIDGRIDS_FLAGS.schedulePolicies]: false,
154
+ [FLUIDGRIDS_FLAGS.pythonDurableFunctions]: false
90
155
  };
91
156
  var settledEvaluations = /* @__PURE__ */ new WeakMap();
92
157
  function evaluationsUsable(context) {
@@ -132,6 +197,50 @@ function useDurableParityEnabled() {
132
197
  const context = useOptionalFeatureFlags();
133
198
  return useMemo(() => resolveDurableParity(context), [context]);
134
199
  }
200
+ var PHASE_C_FLAGS_OFF = Object.freeze({
201
+ runControl: false,
202
+ runControlDurable: false,
203
+ selfHostedWorkers: false,
204
+ searchAttributes: false,
205
+ runArchival: false,
206
+ schedulePolicies: false,
207
+ pythonDurableFunctions: false
208
+ });
209
+ function resolvePhaseCFlags(context) {
210
+ const flag = (key) => resolveFluidGridsFlag(context, key);
211
+ const codeFirst = flag(FLUIDGRIDS_FLAGS.codeFirst);
212
+ if (!codeFirst) return { ...PHASE_C_FLAGS_OFF };
213
+ const durable = flag(FLUIDGRIDS_FLAGS.durableFunctions);
214
+ const runControl = flag(FLUIDGRIDS_FLAGS.runControl);
215
+ return {
216
+ runControl,
217
+ runControlDurable: runControl && durable,
218
+ selfHostedWorkers: durable && flag(FLUIDGRIDS_FLAGS.selfHostedWorkers),
219
+ searchAttributes: flag(FLUIDGRIDS_FLAGS.searchAttributes),
220
+ runArchival: flag(FLUIDGRIDS_FLAGS.runArchival),
221
+ schedulePolicies: flag(FLUIDGRIDS_FLAGS.schedulePolicies),
222
+ pythonDurableFunctions: durable && flag(FLUIDGRIDS_FLAGS.pythonDurableFunctions)
223
+ };
224
+ }
225
+ function usePhaseCFlags() {
226
+ const context = useOptionalFeatureFlags();
227
+ return useMemo(() => resolvePhaseCFlags(context), [context]);
228
+ }
229
+ function useSelfHostedWorkersEnabled() {
230
+ return usePhaseCFlags().selfHostedWorkers;
231
+ }
232
+ function resolvePaletteGates(context) {
233
+ const phaseC = resolvePhaseCFlags(context);
234
+ return {
235
+ durableFunctions: resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.codeFirst) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableFunctions),
236
+ runControl: phaseC.runControl,
237
+ searchAttributes: phaseC.searchAttributes
238
+ };
239
+ }
240
+ function usePaletteGates() {
241
+ const context = useOptionalFeatureFlags();
242
+ return useMemo(() => resolvePaletteGates(context), [context]);
243
+ }
135
244
  function describeGraphQLError(error) {
136
245
  const code = typeof error.extensions?.code === "string" ? error.extensions.code : void 0;
137
246
  switch (code) {
@@ -9867,4 +9976,4 @@ function useNodeExecution() {
9867
9976
  };
9868
9977
  }
9869
9978
 
9870
- export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, BuilderReadOnlyProvider, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FLUIDGRIDS_PERMISSIONS, FluidGridsContext, FluidGridsPermissionsProvider, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, RUNS_QUOTA_NAME, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath, editStateOf, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, evaluatePermissionCheck, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isTriggerOperation, leaseCallQueue, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useBuilderReadOnly, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, useProviders, useSaveStatusStore, useSaveWorkflow, workflowFingerprint };
9979
+ export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, BuilderReadOnlyProvider, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FLUIDGRIDS_PERMISSIONS, FluidGridsContext, FluidGridsPermissionsProvider, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath, editStateOf, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, evaluatePermissionCheck, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, isTriggerOperation, leaseCallQueue, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolvePhaseCFlags, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useBuilderReadOnly, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, workflowFingerprint };
@@ -1,6 +1,6 @@
1
1
  import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-INMYNHJL.js';
2
2
  import { notifyFluidGridsAiCreditsUpdated } from './chunk-Y53CVZVV.js';
3
- import { throwIfResultError, describeOperationError, signalPayloadCard, components_default, payloadFromCardValues, parseRawSignalPayload } from './chunk-G5UND5NE.js';
3
+ import { throwIfResultError, describeOperationError, signalPayloadCard, components_default, payloadFromCardValues, parseRawSignalPayload } from './chunk-6PGLJWIC.js';
4
4
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
5
5
  import { TerminateWorkflowRunDocument, WorkflowRunHistoryDocument, RunEventAppendedDocument, WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument, DurableRunFieldsDocument, WorkflowRunDeterminismStatusDocument, WorkflowRunStackTraceDocument, SignalWorkflowRunDocument } from './chunk-AW3UXMNI.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';
@@ -0,0 +1,16 @@
1
+ // src/utils/template-preview.ts
2
+ var ICONIFY_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:[-_][a-z0-9]+)*$/i;
3
+ function isIconifyName(value) {
4
+ return ICONIFY_NAME.test(value) && !/^(https?|data|blob):/i.test(value);
5
+ }
6
+ function templatePreview(template) {
7
+ const screenshot = template.screenshots?.find(
8
+ (shot) => typeof shot === "string" && shot.trim() !== ""
9
+ );
10
+ if (screenshot) return { kind: "image", src: screenshot };
11
+ const icon = template.icon?.trim();
12
+ if (!icon) return { kind: "none" };
13
+ return isIconifyName(icon) ? { kind: "icon", name: icon } : { kind: "image", src: icon };
14
+ }
15
+
16
+ export { templatePreview };
@@ -1,4 +1,4 @@
1
- import { QuotaExhaustedDialog } from './chunk-EPPDUVRT.js';
1
+ import { QuotaExhaustedDialog } from './chunk-IGROOI7E.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
@@ -1,5 +1,5 @@
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
- import { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-G5UND5NE.js';
2
+ import { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-6PGLJWIC.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
5
5
  import { useCallback, useState, useMemo, useEffect } from 'react';
@@ -1,11 +1,11 @@
1
- import { useDurableParityRunFields, buildNodeDisplayMap, useRunMetadata, useRunPending, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-ASNNQIBJ.js';
2
- import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-ZWXX6NA3.js';
3
- import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-RCC6MWJ7.js';
4
- import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-XZPZE4S7.js';
5
- import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, EntityTagPicker, RunHistoryView, SignalRunDialog, terminateDurableRun, useWorkflowProposal, WorkflowProposalCard } from './chunk-KWI3VUDC.js';
1
+ import { useDurableParityRunFields, buildNodeDisplayMap, useRunMetadata, useRunPending, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-P3TGCUXP.js';
2
+ import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-XX6D7IND.js';
3
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-P2VAHDGO.js';
4
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-VJWJGSRS.js';
5
+ import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, EntityTagPicker, RunHistoryView, SignalRunDialog, terminateDurableRun, useWorkflowProposal, WorkflowProposalCard } from './chunk-ADTEMSJI.js';
6
6
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
7
- import { useWorkflowVersions } from './chunk-37GZQV4P.js';
8
- import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, describeOperationError } from './chunk-G5UND5NE.js';
7
+ import { useWorkflowVersions } from './chunk-PKG6BCHB.js';
8
+ import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, describeOperationError } from './chunk-6PGLJWIC.js';
9
9
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
10
10
  import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-AW3UXMNI.js';
11
11
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,14 +1,15 @@
1
1
  import { deepClone, applyTemplateInputs } from './chunk-GEMNVFPK.js';
2
+ import { templatePreview } from './chunk-B6CCE2RW.js';
2
3
  import { Input } from './chunk-IEVSFCFS.js';
3
4
  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
5
  import { Badge as Badge$1, Button } from './chunk-BQXVT32O.js';
5
- import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-EPPDUVRT.js';
6
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard, useRunHistory, RunHistoryView, SignalRunDialog } from './chunk-KWI3VUDC.js';
6
+ import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-IGROOI7E.js';
7
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard, useRunHistory, RunHistoryView, SignalRunDialog } from './chunk-ADTEMSJI.js';
7
8
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
8
- import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-37GZQV4P.js';
9
- import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-HQZR7PRN.js';
9
+ import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-PKG6BCHB.js';
10
+ import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-JFQGODKK.js';
10
11
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
11
- import { leaseCallQueue, NODE_CONFIGS, createConfiguredNode, resolveOutputHandles, resolveInputHandles, isNodeConfigsInitialized, useFlowStore, getNodeDetail, useSaveStatusStore, isNodeTypeHiddenFromPalette, liveInternalOperations, resolveNodeOperation, readDisplayOptions, parseParameterValue, canAutosave, STICKY_NOTE_TYPE, isNodeTrigger, resolveUiSpec, RUNS_QUOTA_NAME, throwIfResultError, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, describeOperationError, ensureNodeConfigsLoaded, useEditLeaseStore, useEditLeaseLocked, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, useDurableFunctionNodesEnabled, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, BuilderReadOnlyProvider, refetchStoreNodes, AVAILABLE_NODES, EDIT_SESSION_ID, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, CODE_WORKFLOW_NODE_TYPE, SdkPermissionButton, bannerOf, useSaveWorkflow, useBuilderReadOnly, fieldsFromValue, filterPaletteNodes, useFluidGridsAnalytics, sessionBeforeReload, forgetSessionForReload, releasesOnClose, editStateOf, workflowFingerprint, isLocked, buildStickyNode, useNodeRegistryRevision, fieldsFromIO, readCodeWorkflowState, useCodeWorkflowInterface, clearCodeWorkflowDefinitionCache, isParamVisible, ConnectionSelector, structuredParameterType, nodeAccent, NodeTypeIcon, NODES_METADATA, shouldReleaseForIdle, tickAction, rememberSessionForReload, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useFluidGridsFlag, FLUIDGRIDS_FLAGS, saveIndicatorOf, inAppLeaveTarget, declaredOutputFields, subscribeWorkflowSaved, pathToExpression, diagnosticsByPath, interfaceHandlers, declaredSignals, ExpressionEditor, toCodeMirrorDiagnostics, formatParameterValue, leaveNeedsConfirmation, phaseAfterAcquire, rememberOwnStatusChange, snapshotForSave, childRunIdOf, defaultSourcePath, projectLanguage, changedSourceFiles, isEditableSourcePath, sourceLanguageOf, interfaceFields, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, loadDefinitionJson, openRunQuotaUpgradePrompt, isTriggerOperation, canRenderOperationPanel, runPreparationOf, resolveOperationName, savesInPlace, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, rememberRevision, phaseAfterTakeOver } from './chunk-G5UND5NE.js';
12
+ import { leaseCallQueue, NODE_CONFIGS, createConfiguredNode, resolveOutputHandles, resolveInputHandles, isNodeConfigsInitialized, useFlowStore, getNodeDetail, useSaveStatusStore, isNodeTypeHiddenFromPalette, liveInternalOperations, resolveNodeOperation, readDisplayOptions, parseParameterValue, canAutosave, STICKY_NOTE_TYPE, isNodeTrigger, resolveUiSpec, RUNS_QUOTA_NAME, throwIfResultError, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, describeOperationError, ensureNodeConfigsLoaded, useEditLeaseStore, useEditLeaseLocked, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, usePaletteGates, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, BuilderReadOnlyProvider, refetchStoreNodes, AVAILABLE_NODES, EDIT_SESSION_ID, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, useDurableFunctionNodesEnabled, CODE_WORKFLOW_NODE_TYPE, SdkPermissionButton, bannerOf, useSaveWorkflow, useBuilderReadOnly, fieldsFromValue, filterPaletteNodes, useFluidGridsAnalytics, sessionBeforeReload, forgetSessionForReload, releasesOnClose, editStateOf, workflowFingerprint, isLocked, buildStickyNode, useNodeRegistryRevision, fieldsFromIO, readCodeWorkflowState, useCodeWorkflowInterface, clearCodeWorkflowDefinitionCache, isParamVisible, ConnectionSelector, structuredParameterType, nodeAccent, NodeTypeIcon, NODES_METADATA, shouldReleaseForIdle, tickAction, rememberSessionForReload, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useFluidGridsFlag, FLUIDGRIDS_FLAGS, saveIndicatorOf, inAppLeaveTarget, declaredOutputFields, subscribeWorkflowSaved, pathToExpression, diagnosticsByPath, interfaceHandlers, declaredSignals, ExpressionEditor, toCodeMirrorDiagnostics, formatParameterValue, leaveNeedsConfirmation, phaseAfterAcquire, rememberOwnStatusChange, snapshotForSave, childRunIdOf, defaultSourcePath, projectLanguage, changedSourceFiles, isEditableSourcePath, sourceLanguageOf, interfaceFields, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, loadDefinitionJson, openRunQuotaUpgradePrompt, isTriggerOperation, canRenderOperationPanel, runPreparationOf, resolveOperationName, savesInPlace, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, rememberRevision, phaseAfterTakeOver } from './chunk-6PGLJWIC.js';
12
13
  import { cn } from './chunk-JL7CASN5.js';
13
14
  import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
14
15
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
@@ -30,8 +31,8 @@ import { useQuery, useMutation } from '@apollo/client/react';
30
31
  import { gql as gql$1 } from '@apollo/client/core';
31
32
  import 'jszip';
32
33
  import { Sparkles, Star, Download, Eye, Maximize2, Undo2, Redo2, LayoutGrid, Keyboard, Plus, Trash2, GitBranch, Loader2, AlertCircle, Search, RefreshCw, History, GitCompareArrows, Play, RotateCcw, Layers, Upload, Rocket, ArrowRight, Check, X, Link2, Unlink, GitCompare, ExternalLink, GitCommitHorizontal, CircleHelp, CheckCircle2, Package, SlidersHorizontal, Info, Copy, BadgeCheck, DollarSign, Type, Code, Hash, List, Braces, Workflow, PlusCircle, ChevronDown, ChevronRight, AlertTriangle } from 'lucide-react';
33
- import { create } from 'zustand';
34
34
  import { Icon } from '@iconify/react';
35
+ import { create } from 'zustand';
35
36
  import { toast } from 'sonner';
36
37
  import { useShallow, shallow } from 'zustand/shallow';
37
38
  import { Handle, Position, getBezierPath, MarkerType, getConnectedEdges, ReactFlowProvider, useReactFlow, ReactFlow, Background, useOnSelectionChange, useStore, MiniMap, EdgeLabelRenderer, useNodes, useNodesState, useEdgesState, addEdge, Controls, Panel } from '@xyflow/react';
@@ -1813,7 +1814,8 @@ function TemplateCard({
1813
1814
  }) {
1814
1815
  const tr = useTr();
1815
1816
  const [imageError, setImageError] = React4__default.useState(false);
1816
- const previewImage = template.screenshots?.[0] || template.icon || void 0;
1817
+ const preview = templatePreview(template);
1818
+ const previewImage = preview.kind === "image" ? preview.src : void 0;
1817
1819
  const hasPreview = Boolean(previewImage) && !imageError;
1818
1820
  const handleUseTemplate = (e) => {
1819
1821
  e.stopPropagation();
@@ -1840,7 +1842,16 @@ function TemplateCard({
1840
1842
  onError: handleImageError,
1841
1843
  className: "w-full h-full object-cover group-hover:scale-110 transition-transform duration-300"
1842
1844
  }
1843
- ) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" }) }),
1845
+ ) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center", children: preview.kind === "icon" ? /* @__PURE__ */ jsx(
1846
+ Icon,
1847
+ {
1848
+ icon: preview.name,
1849
+ width: 64,
1850
+ height: 64,
1851
+ className: "text-primary/60",
1852
+ "aria-hidden": "true"
1853
+ }
1854
+ ) : /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" }) }),
1844
1855
  template.featured && /* @__PURE__ */ jsx("div", { className: "absolute top-2 right-2", children: /* @__PURE__ */ jsxs(
1845
1856
  Badge$1,
1846
1857
  {
@@ -23577,9 +23588,9 @@ function isStoreNodeHiddenFromPalette(node2, durableFunctionsEnabled = false) {
23577
23588
  );
23578
23589
  }
23579
23590
  function filterStoreNodesForPalette(nodes, durableFunctionsEnabled = false) {
23580
- if (durableFunctionsEnabled) return nodes;
23581
- if (!nodes.some((node2) => isStoreNodeHiddenFromPalette(node2))) return nodes;
23582
- return nodes.filter((node2) => !isStoreNodeHiddenFromPalette(node2));
23591
+ const hidden = (node2) => isStoreNodeHiddenFromPalette(node2, durableFunctionsEnabled);
23592
+ if (!nodes.some(hidden)) return nodes;
23593
+ return nodes.filter((node2) => !hidden(node2));
23583
23594
  }
23584
23595
  function StoreNodeListItem({
23585
23596
  name,
@@ -23961,7 +23972,7 @@ function StoreCategoryList({
23961
23972
  useEffect(() => {
23962
23973
  if (autoFocusSearch) searchRef.current?.focus();
23963
23974
  }, [autoFocusSearch]);
23964
- const durableFunctionsEnabled = useDurableFunctionNodesEnabled();
23975
+ const paletteGates = usePaletteGates();
23965
23976
  const {
23966
23977
  products: storeProducts,
23967
23978
  loading,
@@ -23975,8 +23986,8 @@ function StoreCategoryList({
23975
23986
  }
23976
23987
  });
23977
23988
  const products = useMemo(
23978
- () => filterStoreNodesForPalette(storeProducts, durableFunctionsEnabled),
23979
- [storeProducts, durableFunctionsEnabled]
23989
+ () => filterStoreNodesForPalette(storeProducts, paletteGates),
23990
+ [storeProducts, paletteGates]
23980
23991
  );
23981
23992
  const { installedAppIds, installationsMap, deprecatedInstallations } = useInstalledNodes();
23982
23993
  const filteredDeprecated = isSearching ? deprecatedInstallations.filter(
@@ -24040,7 +24051,7 @@ function StoreCategoryList({
24040
24051
  const isInstalled = installedAppIds.has(node2.id);
24041
24052
  const hasUpdate = isInstalled && !!installation?.installedVersion && !!node2.manifestVersion && installation.installedVersion !== node2.manifestVersion;
24042
24053
  const { nodeType, isPrebuilt, isDraggable } = getStoreNodeAvailability(node2, isInstalled, {
24043
- durableFunctionsEnabled
24054
+ durableFunctionsEnabled: paletteGates
24044
24055
  });
24045
24056
  return /* @__PURE__ */ jsx(
24046
24057
  StoreNodeListItem,
@@ -24233,7 +24244,7 @@ function StoreCategoryNodes({
24233
24244
  onSelectNode
24234
24245
  }) {
24235
24246
  const [searchTerm, setSearchTerm] = useState("");
24236
- const durableFunctionsEnabled = useDurableFunctionNodesEnabled();
24247
+ const paletteGates = usePaletteGates();
24237
24248
  const {
24238
24249
  products: storeProducts,
24239
24250
  loading,
@@ -24248,8 +24259,8 @@ function StoreCategoryNodes({
24248
24259
  }
24249
24260
  });
24250
24261
  const products = useMemo(
24251
- () => filterStoreNodesForPalette(storeProducts, durableFunctionsEnabled),
24252
- [storeProducts, durableFunctionsEnabled]
24262
+ () => filterStoreNodesForPalette(storeProducts, paletteGates),
24263
+ [storeProducts, paletteGates]
24253
24264
  );
24254
24265
  const { installedAppIds, installationsMap } = useInstalledNodes();
24255
24266
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full overflow-hidden", children: [
@@ -24317,7 +24328,7 @@ function StoreCategoryNodes({
24317
24328
  const isInstalled = installedAppIds.has(node2.id);
24318
24329
  const hasUpdate = isInstalled && !!installation?.installedVersion && !!node2.manifestVersion && installation.installedVersion !== node2.manifestVersion;
24319
24330
  const { nodeType, isPrebuilt, isDraggable } = getStoreNodeAvailability(node2, isInstalled, {
24320
- durableFunctionsEnabled
24331
+ durableFunctionsEnabled: paletteGates
24321
24332
  });
24322
24333
  return /* @__PURE__ */ jsx(
24323
24334
  StoreNodeListItem,
@@ -24732,9 +24743,9 @@ function StoreNodeDetail({ node: node2, onBack }) {
24732
24743
  const context = useContext(FluidGridsContext);
24733
24744
  const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;
24734
24745
  const isInstalled = installedAppIds.has(node2.id);
24735
- const durableFunctionsEnabled = useDurableFunctionNodesEnabled();
24746
+ const paletteGates = usePaletteGates();
24736
24747
  const { nodeType, isPrebuilt } = getStoreNodeAvailability(node2, isInstalled, {
24737
- durableFunctionsEnabled
24748
+ durableFunctionsEnabled: paletteGates
24738
24749
  });
24739
24750
  const installation = installationsMap.get(node2.id);
24740
24751
  const installedVersion = installation?.installedVersion;
@@ -25492,7 +25503,7 @@ function TemplatesGrid({
25492
25503
  ] });
25493
25504
  }
25494
25505
  var LazyTemplateDetailPanel = lazy$1(
25495
- () => import('./TemplateDetailPanel-F5SL7LZ5.js').then((m) => ({
25506
+ () => import('./TemplateDetailPanel-MTKW3SPM.js').then((m) => ({
25496
25507
  default: m.TemplateDetailPanel
25497
25508
  }))
25498
25509
  );
@@ -33992,7 +34003,7 @@ function AddNodeFloatingMenu({
33992
34003
  },
33993
34004
  [onNodeAdd, setShowMenu]
33994
34005
  );
33995
- const durableFunctionsEnabled = useDurableFunctionNodesEnabled();
34006
+ const paletteGates = usePaletteGates();
33996
34007
  const incomingNodeMetadetails = useMemo(
33997
34008
  () => _incomingNodeMetadetails,
33998
34009
  [_incomingNodeMetadetails]
@@ -34017,7 +34028,7 @@ function AddNodeFloatingMenu({
34017
34028
  const fromHandleId = _incomingNodeMetadetails?.fromHandle?.id;
34018
34029
  const connectableNodes = filterPaletteNodes(
34019
34030
  AVAILABLE_NODES,
34020
- durableFunctionsEnabled
34031
+ paletteGates
34021
34032
  ).filter((node2) => node2.publishType !== "STORE");
34022
34033
  return {
34023
34034
  availableNodes: mapNodesWithMetadata(
@@ -34027,11 +34038,7 @@ function AddNodeFloatingMenu({
34027
34038
  ),
34028
34039
  additionalNodes: mapNodesWithMetadata(["end" /* END */])
34029
34040
  };
34030
- }, [
34031
- _incomingNodeMetadetails,
34032
- incomingNodeMetadetails,
34033
- durableFunctionsEnabled
34034
- ]);
34041
+ }, [_incomingNodeMetadetails, incomingNodeMetadetails, paletteGates]);
34035
34042
  return /* @__PURE__ */ jsxs(Popover$1, { open: showMenu, children: [
34036
34043
  /* @__PURE__ */ jsx(PopoverTrigger$1, { asChild: true, children: /* @__PURE__ */ jsx(
34037
34044
  "div",
@@ -48775,14 +48782,14 @@ var FlowBuilder = ({ readOnly = false }) => {
48775
48782
  const searchParams = new URLSearchParams(window.location.search);
48776
48783
  const isReadOnly = readOnly || searchParams.get("readonly") === "true";
48777
48784
  const { leaseLocked, editingBlocked } = useEditingBlocked(isReadOnly);
48778
- const durableFunctionsEnabled = useDurableFunctionNodesEnabled();
48779
- const durableFunctionsEnabledRef = useRef(durableFunctionsEnabled);
48785
+ const paletteGates = usePaletteGates();
48786
+ const paletteGatesRef = useRef(paletteGates);
48780
48787
  useEffect(() => {
48781
- durableFunctionsEnabledRef.current = durableFunctionsEnabled;
48782
- }, [durableFunctionsEnabled]);
48788
+ paletteGatesRef.current = paletteGates;
48789
+ }, [paletteGates]);
48783
48790
  const agentTools = useMemo(
48784
48791
  () => createBuilderAgentTools({
48785
- durableFunctionsEnabled: () => durableFunctionsEnabledRef.current
48792
+ durableFunctionsEnabled: () => paletteGatesRef.current
48786
48793
  }),
48787
48794
  []
48788
48795
  );