@burdenoff/fluidgrids-fe-sdk 2026.804.1 → 2026.804.2

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 (47) hide show
  1. package/dist/ExecutionDetailPage-FF2DYKAZ.js +10 -0
  2. package/dist/{ExecutionDetailPage-FCY3S336.js.map → ExecutionDetailPage-FF2DYKAZ.js.map} +1 -1
  3. package/dist/ExecutionsListPage-NKISRFMA.js +9 -0
  4. package/dist/{ExecutionsListPage-IZJPACQV.js.map → ExecutionsListPage-NKISRFMA.js.map} +1 -1
  5. package/dist/{MissingNodesInstallModal-OT3LJZ4M.js → MissingNodesInstallModal-HA5L3FK2.js} +4 -3
  6. package/dist/MissingNodesInstallModal-HA5L3FK2.js.map +1 -0
  7. package/dist/{TemplateConfigurationModal-7OT6QBEA.js → TemplateConfigurationModal-MXNGZQIC.js} +90 -21
  8. package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +1 -0
  9. package/dist/{TemplateDetailPanel-T3ZHXOHX.js → TemplateDetailPanel-CJ3NPVTP.js} +50 -14
  10. package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +1 -0
  11. package/dist/{WorkflowBuilder-42S2S3PO.js → WorkflowBuilder-ETVB66U6.js} +6 -5
  12. package/dist/{WorkflowBuilder-42S2S3PO.js.map → WorkflowBuilder-ETVB66U6.js.map} +1 -1
  13. package/dist/WorkflowsList-TZAN3YBA.js +11 -0
  14. package/dist/{WorkflowsList-L7EJW54K.js.map → WorkflowsList-TZAN3YBA.js.map} +1 -1
  15. package/dist/{chunk-WAVGHDYH.js → chunk-6PNRM3KQ.js} +469 -114
  16. package/dist/chunk-6PNRM3KQ.js.map +1 -0
  17. package/dist/chunk-7VNIEIR6.js +21 -0
  18. package/dist/chunk-7VNIEIR6.js.map +1 -0
  19. package/dist/{chunk-F5ACDIYR.js → chunk-IWKLEFC7.js} +205 -51
  20. package/dist/chunk-IWKLEFC7.js.map +1 -0
  21. package/dist/{chunk-BRMURCHH.js → chunk-OHGXRM6Z.js} +5 -3
  22. package/dist/chunk-OHGXRM6Z.js.map +1 -0
  23. package/dist/{chunk-CQAHXNT2.js → chunk-SG7Z2IRQ.js} +55 -18
  24. package/dist/chunk-SG7Z2IRQ.js.map +1 -0
  25. package/dist/{chunk-CN3VSAYR.js → chunk-WQ4QNHDN.js} +4600 -1229
  26. package/dist/chunk-WQ4QNHDN.js.map +1 -0
  27. package/dist/{chunk-JPHK5LAL.js → chunk-Y36DJHU3.js} +24 -8
  28. package/dist/chunk-Y36DJHU3.js.map +1 -0
  29. package/dist/{chunk-S7FNNFPU.js → chunk-YJKZSUNC.js} +140 -46
  30. package/dist/chunk-YJKZSUNC.js.map +1 -0
  31. package/dist/index.d.ts +33 -2
  32. package/dist/index.js +637 -174
  33. package/dist/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/ExecutionDetailPage-FCY3S336.js +0 -9
  36. package/dist/ExecutionsListPage-IZJPACQV.js +0 -8
  37. package/dist/MissingNodesInstallModal-OT3LJZ4M.js.map +0 -1
  38. package/dist/TemplateConfigurationModal-7OT6QBEA.js.map +0 -1
  39. package/dist/TemplateDetailPanel-T3ZHXOHX.js.map +0 -1
  40. package/dist/WorkflowsList-L7EJW54K.js +0 -10
  41. package/dist/chunk-BRMURCHH.js.map +0 -1
  42. package/dist/chunk-CN3VSAYR.js.map +0 -1
  43. package/dist/chunk-CQAHXNT2.js.map +0 -1
  44. package/dist/chunk-F5ACDIYR.js.map +0 -1
  45. package/dist/chunk-JPHK5LAL.js.map +0 -1
  46. package/dist/chunk-S7FNNFPU.js.map +0 -1
  47. package/dist/chunk-WAVGHDYH.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/TranslationBridge.tsx"],"names":[],"mappings":";;;AAwCO,IAAM,2BAAA,GAA0C,CAAC,IAAA,EAAM,QAAA,KAC5D;AAEF,IAAM,4BAAA,GAA+B,aAAA;AAAA,EACnC;AACF,CAAA;AAYO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,CAAA;AAAA,EACA;AACF,CAAA,EAAuC;AAGrC,EAAA,MAAM,QAAQ,OAAA,CAAoB,MAAM,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAC9C,EAAA,uBACE,GAAA,CAAC,4BAAA,CAA6B,QAAA,EAA7B,EAAsC,OACpC,QAAA,EACH,CAAA;AAEJ;AAQO,SAAS,KAAA,GAAoB;AAClC,EAAA,OAAO,WAAW,4BAA4B,CAAA;AAChD","file":"chunk-7VNIEIR6.js","sourcesContent":["/**\n * FluidGrids Translation Bridge\n *\n * Same shape as the permissions bridge next door, and for the same reason: the\n * SDK never resolves translations itself and never imports `@burdenoff/fe-libs`.\n * `@burdenoff/fe-libs` is an OPTIONAL peer dependency here, and its `useI18n()`\n * THROWS when no `I18nProvider` is mounted — so importing it would turn \"this\n * host has no i18n\" into \"the builder crashes\" for every standalone embedder\n * (/embed/workflow, /shared/:id, BigConsole, fluidgrids-embed-test).\n *\n * Instead, hosts that DO have a translator bridge it in:\n *\n * // microfe-workflows, inside the Burdenoff shell:\n * <FluidGridsTranslationProvider t={tr}>…</FluidGridsTranslationProvider>\n *\n * Without a provider the context defaults to the identity translator, which\n * returns each call's English fallback. So the SDK renders correct English with\n * no provider, and the host's language with one. Translation is never the reason\n * a component fails to render.\n *\n * ── On the English argument ──────────────────────────────────────────────────\n * `tr(key, english)` is not \"hardcoded English with extra steps\". The English is\n * the SOURCE STRING: `fluidgrids-app/scripts/extract-i18n-keys.ts` reads it as\n * the value for `key`, which is what gets seeded into `global-i18n-svc` and\n * translated into every other locale. It is also the last-resort render, which\n * is what stops a raw dot-path like `fluidgrids.builder.save` reaching a user\n * when the i18n service is unreachable.\n *\n * Two rules follow, and the extractor enforces neither — you must:\n * 1. the key must be a STRING LITERAL (a template literal or variable is\n * invisible to the extractor, so that key would never reach the bundle);\n * 2. the English must be the real, final copy, never a placeholder.\n * ────────────────────────────────────────────────────────────────────────────\n */\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\n/** A host-supplied translator: `(key, englishFallback) => string`. */\nexport type Translator = (key: string, fallback: string) => string;\n\n/** No-provider default: render the English fallback the call site supplied. */\nexport const ENGLISH_FALLBACK_TRANSLATOR: Translator = (_key, fallback) =>\n fallback;\n\nconst FluidGridsTranslationContext = createContext<Translator>(\n ENGLISH_FALLBACK_TRANSLATOR,\n);\n\nexport interface FluidGridsTranslationProviderProps {\n /**\n * The host's translator. Must be referentially stable per locale (wrap it in\n * `useCallback` keyed on the locale) — it is a context value, so a new\n * function identity on every render re-renders every consumer.\n */\n t: Translator;\n children: ReactNode;\n}\n\nexport function FluidGridsTranslationProvider({\n t,\n children,\n}: FluidGridsTranslationProviderProps) {\n // Depending on `t` is what makes a locale switch propagate: the host rebuilds\n // `t` when the locale changes, which re-renders every consumer in the SDK.\n const value = useMemo<Translator>(() => t, [t]);\n return (\n <FluidGridsTranslationContext.Provider value={value}>\n {children}\n </FluidGridsTranslationContext.Provider>\n );\n}\n\n/**\n * Translate a UI string, falling back to English.\n *\n * const tr = useTr();\n * <Button>{tr(\"fluidgrids.builder.save\", \"Save\")}</Button>\n */\nexport function useTr(): Translator {\n return useContext(FluidGridsTranslationContext);\n}\n"]}
@@ -1,8 +1,9 @@
1
- import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-WAVGHDYH.js';
1
+ import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-6PNRM3KQ.js';
2
2
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-UIY2HBWA.js';
3
3
  import { RunLogsDocument, throwIfResultError, RunLogAppendedDocument } from './chunk-V5UEEB74.js';
4
4
  import { getFluidGridsClientSafe } from './chunk-5BDQNSP3.js';
5
5
  import { getFluidGridsConfig } from './chunk-WWU2O2SR.js';
6
+ import { useTr } from './chunk-7VNIEIR6.js';
6
7
  import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
7
8
  import { useParams, useNavigate, Link } from 'react-router';
8
9
  import { Icon } from '@iconify/react';
@@ -162,6 +163,7 @@ function useRunLogs(runId, options = {}) {
162
163
  };
163
164
  }
164
165
  function ExecutionDetailPage() {
166
+ const tr = useTr();
165
167
  const { runId } = useParams();
166
168
  const navigate = useNavigate();
167
169
  const [activeTab, setActiveTab] = useState("timeline");
@@ -274,12 +276,19 @@ function ExecutionDetailPage() {
274
276
  }
275
277
  if (error) {
276
278
  return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
277
- /* @__PURE__ */ jsx(
279
+ /* @__PURE__ */ jsxs(
278
280
  Link,
279
281
  {
280
282
  to: "../runs",
281
283
  className: "text-action-primary-text hover:underline text-sm mb-4 inline-block",
282
- children: "\u2190 Back to Executions"
284
+ children: [
285
+ "\u2190",
286
+ " ",
287
+ tr(
288
+ "fluidgrids.executions.executionDetail.backToExecutions",
289
+ "Back to Executions"
290
+ )
291
+ ]
283
292
  }
284
293
  ),
285
294
  /* @__PURE__ */ jsxs("div", { className: "bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg p-6 text-center", children: [
@@ -291,20 +300,30 @@ function ExecutionDetailPage() {
291
300
  width: 48
292
301
  }
293
302
  ),
294
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium text-[var(--color-status-error-text)] mb-2", children: "Failed to load execution" }),
303
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium text-[var(--color-status-error-text)] mb-2", children: tr(
304
+ "fluidgrids.executions.executionDetail.loadErrorTitle",
305
+ "Failed to load execution"
306
+ ) }),
295
307
  /* @__PURE__ */ jsx("p", { className: "text-[var(--color-status-error-text)] mb-4", children: error.message }),
296
- /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: refetch, children: "Try Again" })
308
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: refetch, children: tr("fluidgrids.executions.executionDetail.tryAgain", "Try Again") })
297
309
  ] })
298
310
  ] });
299
311
  }
300
312
  if (!execution) {
301
313
  return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
302
- /* @__PURE__ */ jsx(
314
+ /* @__PURE__ */ jsxs(
303
315
  Link,
304
316
  {
305
317
  to: "../runs",
306
318
  className: "text-action-primary-text hover:underline text-sm mb-4 inline-block",
307
- children: "\u2190 Back to Executions"
319
+ children: [
320
+ "\u2190",
321
+ " ",
322
+ tr(
323
+ "fluidgrids.executions.executionDetail.backToExecutions",
324
+ "Back to Executions"
325
+ )
326
+ ]
308
327
  }
309
328
  ),
310
329
  /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary border border-border-secondary rounded-lg p-6 text-center", children: [
@@ -316,40 +335,86 @@ function ExecutionDetailPage() {
316
335
  width: 48
317
336
  }
318
337
  ),
319
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium text-text-primary mb-2", children: "Execution not found" }),
338
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium text-text-primary mb-2", children: tr(
339
+ "fluidgrids.executions.executionDetail.notFoundTitle",
340
+ "Execution not found"
341
+ ) }),
320
342
  /* @__PURE__ */ jsxs("p", { className: "text-text-secondary", children: [
321
- 'The execution with ID "',
343
+ tr(
344
+ "fluidgrids.executions.executionDetail.notFoundDescriptionPrefix",
345
+ "The execution with ID"
346
+ ),
347
+ " ",
348
+ '"',
322
349
  runId,
323
- '" could not be found.'
350
+ '"',
351
+ " ",
352
+ tr(
353
+ "fluidgrids.executions.executionDetail.notFoundDescriptionSuffix",
354
+ "could not be found."
355
+ )
324
356
  ] })
325
357
  ] })
326
358
  ] });
327
359
  }
328
360
  const tabs = [
329
- { id: "timeline", label: "Timeline", icon: "mdi:timeline" },
330
- { id: "logs", label: "Logs", icon: "mdi:text-box-outline" },
331
- { id: "input", label: "Input Data", icon: "mdi:code-json" },
332
- { id: "context", label: "Context", icon: "mdi:information-outline" }
361
+ {
362
+ id: "timeline",
363
+ label: tr(
364
+ "fluidgrids.executions.executionDetail.timelineTab",
365
+ "Timeline"
366
+ ),
367
+ icon: "mdi:timeline"
368
+ },
369
+ {
370
+ id: "logs",
371
+ label: tr("fluidgrids.executions.executionDetail.logsTab", "Logs"),
372
+ icon: "mdi:text-box-outline"
373
+ },
374
+ {
375
+ id: "input",
376
+ label: tr("fluidgrids.executions.executionDetail.inputTab", "Input Data"),
377
+ icon: "mdi:code-json"
378
+ },
379
+ {
380
+ id: "context",
381
+ label: tr("fluidgrids.executions.executionDetail.contextTab", "Context"),
382
+ icon: "mdi:information-outline"
383
+ }
333
384
  ];
334
385
  return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
335
- /* @__PURE__ */ jsx(
386
+ /* @__PURE__ */ jsxs(
336
387
  Link,
337
388
  {
338
389
  to: "../runs",
339
390
  className: "text-action-primary-text hover:underline text-sm mb-4 inline-block",
340
- children: "\u2190 Back to Executions"
391
+ children: [
392
+ "\u2190",
393
+ " ",
394
+ tr(
395
+ "fluidgrids.executions.executionDetail.backToExecutions",
396
+ "Back to Executions"
397
+ )
398
+ ]
341
399
  }
342
400
  ),
343
401
  execution.parentRunId && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 text-sm", children: [
344
402
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:sitemap", className: "text-indigo-500", width: 16 }),
345
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Sub-workflow of" }),
403
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
404
+ "fluidgrids.executions.executionDetail.subWorkflowOf",
405
+ "Sub-workflow of"
406
+ ) }),
346
407
  /* @__PURE__ */ jsxs(
347
408
  Link,
348
409
  {
349
410
  to: `../runs/${execution.parentRunId}`,
350
411
  className: "text-indigo-600 hover:underline font-medium",
351
412
  children: [
352
- "Parent Run ",
413
+ tr(
414
+ "fluidgrids.executions.executionDetail.parentRunLinkPrefix",
415
+ "Parent Run"
416
+ ),
417
+ " ",
353
418
  execution.parentRunId.slice(0, 12),
354
419
  "..."
355
420
  ]
@@ -361,7 +426,10 @@ function ExecutionDetailPage() {
361
426
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-2", children: [
362
427
  /* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: execution.workflow?.name || execution.workflowKey }),
363
428
  /* @__PURE__ */ jsx(ExecutionStatusBadge, { status: execution.status, size: "lg" }),
364
- execution.parentRunId && /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded", children: "Sub-Workflow" })
429
+ execution.parentRunId && /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded", children: tr(
430
+ "fluidgrids.executions.executionDetail.subWorkflowBadge",
431
+ "Sub-Workflow"
432
+ ) })
365
433
  ] }),
366
434
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-4 text-sm text-text-secondary", children: [
367
435
  /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
@@ -392,7 +460,10 @@ function ExecutionDetailPage() {
392
460
  className: "w-4 h-4 rounded"
393
461
  }
394
462
  ),
395
- "Auto-refresh"
463
+ tr(
464
+ "fluidgrids.executions.executionDetail.autoRefreshToggle",
465
+ "Auto-refresh"
466
+ )
396
467
  ] }),
397
468
  canControlRuns && execution.status === "RUNNING" && /* @__PURE__ */ jsxs(Fragment, { children: [
398
469
  /* @__PURE__ */ jsxs(
@@ -404,7 +475,10 @@ function ExecutionDetailPage() {
404
475
  disabled: actionLoading,
405
476
  children: [
406
477
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:pause", className: "mr-1", width: 16 }),
407
- "Pause"
478
+ tr(
479
+ "fluidgrids.executions.executionDetail.pauseButton",
480
+ "Pause"
481
+ )
408
482
  ]
409
483
  }
410
484
  ),
@@ -418,7 +492,10 @@ function ExecutionDetailPage() {
418
492
  className: "border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]",
419
493
  children: [
420
494
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
421
- "Cancel"
495
+ tr(
496
+ "fluidgrids.executions.executionDetail.cancelButton",
497
+ "Cancel"
498
+ )
422
499
  ]
423
500
  }
424
501
  )
@@ -433,7 +510,10 @@ function ExecutionDetailPage() {
433
510
  disabled: actionLoading,
434
511
  children: [
435
512
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:play", className: "mr-1", width: 16 }),
436
- "Resume"
513
+ tr(
514
+ "fluidgrids.executions.executionDetail.resumeButton",
515
+ "Resume"
516
+ )
437
517
  ]
438
518
  }
439
519
  ),
@@ -447,7 +527,10 @@ function ExecutionDetailPage() {
447
527
  className: "border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]",
448
528
  children: [
449
529
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
450
- "Cancel"
530
+ tr(
531
+ "fluidgrids.executions.executionDetail.cancelButton",
532
+ "Cancel"
533
+ )
451
534
  ]
452
535
  }
453
536
  )
@@ -461,7 +544,10 @@ function ExecutionDetailPage() {
461
544
  disabled: actionLoading,
462
545
  children: [
463
546
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
464
- "Cancel"
547
+ tr(
548
+ "fluidgrids.executions.executionDetail.cancelButton",
549
+ "Cancel"
550
+ )
465
551
  ]
466
552
  }
467
553
  ),
@@ -475,23 +561,35 @@ function ExecutionDetailPage() {
475
561
  className: "border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]",
476
562
  children: [
477
563
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:close-octagon", className: "mr-1", width: 16 }),
478
- "Terminate"
564
+ tr(
565
+ "fluidgrids.executions.executionDetail.terminateButton",
566
+ "Terminate"
567
+ )
479
568
  ]
480
569
  }
481
570
  ),
482
571
  /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: refetch, children: [
483
572
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
484
- "Refresh"
573
+ tr(
574
+ "fluidgrids.executions.executionDetail.refreshButton",
575
+ "Refresh"
576
+ )
485
577
  ] })
486
578
  ] })
487
579
  ] }),
488
580
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 mb-6", children: [
489
581
  /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
490
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: "Duration" }),
582
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr(
583
+ "fluidgrids.executions.executionDetail.durationStat",
584
+ "Duration"
585
+ ) }),
491
586
  /* @__PURE__ */ jsx("div", { className: "text-xl font-bold text-text-primary mt-1", children: formatDuration(execution.duration) })
492
587
  ] }),
493
588
  /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
494
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: "Progress" }),
589
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr(
590
+ "fluidgrids.executions.executionDetail.progressStat",
591
+ "Progress"
592
+ ) }),
495
593
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
496
594
  /* @__PURE__ */ jsx("div", { className: "flex-1 h-2 bg-background-tertiary rounded-full overflow-hidden", children: /* @__PURE__ */ jsx(
497
595
  "div",
@@ -507,7 +605,7 @@ function ExecutionDetailPage() {
507
605
  ] })
508
606
  ] }),
509
607
  /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
510
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: "Nodes" }),
608
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionDetail.nodesStat", "Nodes") }),
511
609
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
512
610
  /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-[var(--color-status-success-text)]", children: execution.completedNodes ?? 0 }),
513
611
  /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "/" }),
@@ -515,12 +613,17 @@ function ExecutionDetailPage() {
515
613
  (execution.failedNodes ?? 0) > 0 && /* @__PURE__ */ jsxs("span", { className: "text-sm text-[var(--color-status-error-text)] ml-2", children: [
516
614
  "(",
517
615
  execution.failedNodes,
518
- " failed)"
616
+ " ",
617
+ tr(
618
+ "fluidgrids.executions.executionDetail.failedNodesSuffix",
619
+ "failed"
620
+ ),
621
+ ")"
519
622
  ] })
520
623
  ] })
521
624
  ] }),
522
625
  /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
523
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: "Trigger" }),
626
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionDetail.triggerStat", "Trigger") }),
524
627
  /* @__PURE__ */ jsx("div", { className: "text-lg font-medium text-text-primary mt-1 truncate", children: execution.triggerNodeId ? nodeDisplay[execution.triggerNodeId]?.label ?? execution.triggerNodeId : "\u2014" })
525
628
  ] })
526
629
  ] }),
@@ -528,7 +631,7 @@ function ExecutionDetailPage() {
528
631
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[var(--color-status-error-text)] mb-2", children: [
529
632
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:alert-circle", width: 20 }),
530
633
  /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
531
- "Error",
634
+ tr("fluidgrids.executions.executionDetail.errorLabel", "Error"),
532
635
  execution.errorType ? ` (${execution.errorType})` : ""
533
636
  ] })
534
637
  ] }),
@@ -579,35 +682,59 @@ function ExecutionDetailPage() {
579
682
  }
580
683
  ) }),
581
684
  activeTab === "input" && /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6", children: [
582
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: "Trigger Data" }),
685
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
686
+ "fluidgrids.executions.executionDetail.triggerDataHeading",
687
+ "Trigger Data"
688
+ ) }),
583
689
  /* @__PURE__ */ jsx("div", { className: "bg-background-primary rounded p-4 max-h-[400px] overflow-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-sm text-text-primary font-mono whitespace-pre-wrap break-words", children: JSON.stringify(execution.triggerData ?? null, null, 2) }) })
584
690
  ] }),
585
691
  activeTab === "context" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6", children: [
586
692
  /* @__PURE__ */ jsxs("div", { children: [
587
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: "Execution Context" }),
693
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
694
+ "fluidgrids.executions.executionDetail.executionContextHeading",
695
+ "Execution Context"
696
+ ) }),
588
697
  /* @__PURE__ */ jsx("div", { className: "bg-background-primary rounded p-4 max-h-[300px] overflow-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-sm text-text-primary font-mono whitespace-pre-wrap break-words", children: JSON.stringify(execution.context ?? null, null, 2) }) })
589
698
  ] }),
590
699
  /* @__PURE__ */ jsxs("div", { children: [
591
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: "Execution Details" }),
700
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
701
+ "fluidgrids.executions.executionDetail.executionDetailsHeading",
702
+ "Execution Details"
703
+ ) }),
592
704
  /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
593
705
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
594
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Run ID" }),
706
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
707
+ "fluidgrids.executions.executionDetail.runIdRow",
708
+ "Run ID"
709
+ ) }),
595
710
  /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.id })
596
711
  ] }),
597
712
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
598
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Workflow" }),
713
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
714
+ "fluidgrids.executions.executionDetail.workflowRow",
715
+ "Workflow"
716
+ ) }),
599
717
  /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.workflow?.name || execution.workflowKey })
600
718
  ] }),
601
719
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
602
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Workflow Key" }),
720
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
721
+ "fluidgrids.executions.executionDetail.workflowKeyRow",
722
+ "Workflow Key"
723
+ ) }),
603
724
  /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.workflowKey })
604
725
  ] }),
605
726
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
606
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Version" }),
727
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
728
+ "fluidgrids.executions.executionDetail.versionRow",
729
+ "Version"
730
+ ) }),
607
731
  /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatRunVersion(execution.version) })
608
732
  ] }),
609
733
  execution.triggeredById && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
610
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Triggered By" }),
734
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
735
+ "fluidgrids.executions.executionDetail.triggeredByRow",
736
+ "Triggered By"
737
+ ) }),
611
738
  /* @__PURE__ */ jsx(
612
739
  "span",
613
740
  {
@@ -618,7 +745,10 @@ function ExecutionDetailPage() {
618
745
  )
619
746
  ] }),
620
747
  execution.parentRunId && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
621
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Parent Run" }),
748
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
749
+ "fluidgrids.executions.executionDetail.parentRunRow",
750
+ "Parent Run"
751
+ ) }),
622
752
  /* @__PURE__ */ jsxs(
623
753
  Link,
624
754
  {
@@ -632,15 +762,24 @@ function ExecutionDetailPage() {
632
762
  )
633
763
  ] }),
634
764
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
635
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Created" }),
765
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
766
+ "fluidgrids.executions.executionDetail.createdRow",
767
+ "Created"
768
+ ) }),
636
769
  /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime(execution.createdAt) })
637
770
  ] }),
638
771
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
639
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Started" }),
772
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
773
+ "fluidgrids.executions.executionDetail.startedRow",
774
+ "Started"
775
+ ) }),
640
776
  /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime(execution.startedAt) })
641
777
  ] }),
642
778
  execution.completedAt && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
643
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Completed" }),
779
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
780
+ "fluidgrids.executions.executionDetail.completedRow",
781
+ "Completed"
782
+ ) }),
644
783
  /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime(execution.completedAt) })
645
784
  ] })
646
785
  ] })
@@ -654,18 +793,33 @@ function ExecutionDetailPage() {
654
793
  onOpenChange: setShowTerminateDialog,
655
794
  children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
656
795
  /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
657
- /* @__PURE__ */ jsx(AlertDialogTitle, { children: "Terminate Execution" }),
658
- /* @__PURE__ */ jsx(AlertDialogDescription, { children: "Are you sure you want to force terminate this execution? This will immediately stop the running workflow and cannot be resumed." })
796
+ /* @__PURE__ */ jsx(AlertDialogTitle, { children: tr(
797
+ "fluidgrids.executions.executionDetail.terminateDialogTitle",
798
+ "Terminate Execution"
799
+ ) }),
800
+ /* @__PURE__ */ jsx(AlertDialogDescription, { children: tr(
801
+ "fluidgrids.executions.executionDetail.terminateDialogDescription",
802
+ "Are you sure you want to force terminate this execution? This will immediately stop the running workflow and cannot be resumed."
803
+ ) })
659
804
  ] }),
660
805
  /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
661
- /* @__PURE__ */ jsx(AlertDialogCancel, { disabled: actionLoading, children: "Cancel" }),
806
+ /* @__PURE__ */ jsx(AlertDialogCancel, { disabled: actionLoading, children: tr(
807
+ "fluidgrids.executions.executionDetail.cancelButton",
808
+ "Cancel"
809
+ ) }),
662
810
  /* @__PURE__ */ jsx(
663
811
  AlertDialogAction,
664
812
  {
665
813
  onClick: handleTerminate,
666
814
  disabled: actionLoading,
667
815
  className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
668
- children: actionLoading ? "Terminating..." : "Terminate"
816
+ children: actionLoading ? tr(
817
+ "fluidgrids.executions.executionDetail.terminatingButton",
818
+ "Terminating..."
819
+ ) : tr(
820
+ "fluidgrids.executions.executionDetail.terminateButton",
821
+ "Terminate"
822
+ )
669
823
  }
670
824
  )
671
825
  ] })
@@ -676,5 +830,5 @@ function ExecutionDetailPage() {
676
830
  }
677
831
 
678
832
  export { ExecutionDetailPage };
679
- //# sourceMappingURL=chunk-F5ACDIYR.js.map
680
- //# sourceMappingURL=chunk-F5ACDIYR.js.map
833
+ //# sourceMappingURL=chunk-IWKLEFC7.js.map
834
+ //# sourceMappingURL=chunk-IWKLEFC7.js.map