@voyantjs/workflows-react 0.106.0 → 0.107.0

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 (63) hide show
  1. package/README.md +43 -0
  2. package/dist/client.d.ts +2 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +1 -0
  5. package/dist/components/common.d.ts +30 -0
  6. package/dist/components/common.d.ts.map +1 -0
  7. package/dist/components/common.js +108 -0
  8. package/dist/components/workflow-run-actions.d.ts +7 -0
  9. package/dist/components/workflow-run-actions.d.ts.map +1 -0
  10. package/dist/components/workflow-run-actions.js +72 -0
  11. package/dist/components/workflow-run-detail-page.d.ts +10 -0
  12. package/dist/components/workflow-run-detail-page.d.ts.map +1 -0
  13. package/dist/components/workflow-run-detail-page.js +96 -0
  14. package/dist/components/workflow-runs-filters.d.ts +32 -0
  15. package/dist/components/workflow-runs-filters.d.ts.map +1 -0
  16. package/dist/components/workflow-runs-filters.js +97 -0
  17. package/dist/components/workflow-runs-page.d.ts +12 -0
  18. package/dist/components/workflow-runs-page.d.ts.map +1 -0
  19. package/dist/components/workflow-runs-page.js +132 -0
  20. package/dist/components/workflow-schedules-page.d.ts +21 -0
  21. package/dist/components/workflow-schedules-page.d.ts.map +1 -0
  22. package/dist/components/workflow-schedules-page.js +144 -0
  23. package/dist/i18n/en.d.ts +4 -0
  24. package/dist/i18n/en.d.ts.map +1 -0
  25. package/dist/i18n/en.js +135 -0
  26. package/dist/i18n/index.d.ts +5 -0
  27. package/dist/i18n/index.d.ts.map +1 -0
  28. package/dist/i18n/index.js +3 -0
  29. package/dist/i18n/messages.d.ts +125 -0
  30. package/dist/i18n/messages.d.ts.map +1 -0
  31. package/dist/i18n/messages.js +1 -0
  32. package/dist/i18n/provider.d.ts +26 -0
  33. package/dist/i18n/provider.d.ts.map +1 -0
  34. package/dist/i18n/provider.js +44 -0
  35. package/dist/i18n/ro.d.ts +4 -0
  36. package/dist/i18n/ro.d.ts.map +1 -0
  37. package/dist/i18n/ro.js +137 -0
  38. package/dist/schedules-client.d.ts +2 -0
  39. package/dist/schedules-client.d.ts.map +1 -0
  40. package/dist/schedules-client.js +1 -0
  41. package/dist/types.d.ts +2 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +1 -0
  44. package/dist/ui.d.ts +9 -0
  45. package/dist/ui.d.ts.map +1 -0
  46. package/dist/ui.js +6 -0
  47. package/package.json +69 -21
  48. package/src/client.ts +4 -0
  49. package/src/components/common.tsx +182 -0
  50. package/src/components/workflow-run-actions.tsx +160 -0
  51. package/src/components/workflow-run-detail-page.tsx +393 -0
  52. package/src/components/workflow-runs-filters.tsx +349 -0
  53. package/src/components/workflow-runs-page.tsx +357 -0
  54. package/src/components/workflow-schedules-page.tsx +398 -0
  55. package/src/i18n/en.ts +142 -0
  56. package/src/i18n/index.ts +26 -0
  57. package/src/i18n/messages.ts +125 -0
  58. package/src/i18n/provider.tsx +96 -0
  59. package/src/i18n/ro.ts +144 -0
  60. package/src/schedules-client.ts +8 -0
  61. package/src/styles.css +11 -0
  62. package/src/types.ts +14 -0
  63. package/src/ui.ts +63 -0
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createLocaleFormatters, createPackageMessagesContext, resolvePackageMessages, } from "@voyantjs/i18n";
4
+ import { workflowRunsUiEn } from "./en.js";
5
+ import { workflowRunsUiRo } from "./ro.js";
6
+ const fallbackLocale = "en";
7
+ export const workflowRunsUiMessageDefinitions = {
8
+ en: workflowRunsUiEn,
9
+ ro: workflowRunsUiRo,
10
+ };
11
+ const workflowRunsUiContext = createPackageMessagesContext("WorkflowRunsUiMessages");
12
+ const defaultWorkflowRunsUiI18n = {
13
+ messages: workflowRunsUiEn,
14
+ ...createLocaleFormatters(fallbackLocale),
15
+ };
16
+ export function resolveWorkflowRunsUiMessages({ locale, overrides, }) {
17
+ return resolvePackageMessages({
18
+ definitions: workflowRunsUiMessageDefinitions,
19
+ fallbackLocale,
20
+ locale,
21
+ overrides,
22
+ });
23
+ }
24
+ export function getWorkflowRunsUiI18n({ locale, overrides, }) {
25
+ const resolvedLocale = locale ?? fallbackLocale;
26
+ return {
27
+ messages: resolveWorkflowRunsUiMessages({
28
+ locale: resolvedLocale,
29
+ overrides,
30
+ }),
31
+ ...createLocaleFormatters(resolvedLocale),
32
+ };
33
+ }
34
+ export function WorkflowRunsUiMessagesProvider({ children, locale, overrides, }) {
35
+ return (_jsx(workflowRunsUiContext.ResolvedMessagesProvider, { definitions: workflowRunsUiMessageDefinitions, fallbackLocale: fallbackLocale, locale: locale, overrides: overrides, children: children }));
36
+ }
37
+ export const useWorkflowRunsUiI18n = workflowRunsUiContext.useI18n;
38
+ export const useWorkflowRunsUiMessages = workflowRunsUiContext.useMessages;
39
+ export function useWorkflowRunsUiI18nOrDefault() {
40
+ return workflowRunsUiContext.useOptionalI18n() ?? defaultWorkflowRunsUiI18n;
41
+ }
42
+ export function useWorkflowRunsUiMessagesOrDefault() {
43
+ return useWorkflowRunsUiI18nOrDefault().messages;
44
+ }
@@ -0,0 +1,4 @@
1
+ import type { WorkflowRunsUiMessages } from "./messages.js";
2
+ export declare const workflowRunsUiRo: WorkflowRunsUiMessages;
3
+ export declare const workflowsUiRo: WorkflowRunsUiMessages;
4
+ //# sourceMappingURL=ro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,eAAO,MAAM,gBAAgB,EAAE,sBA2I9B,CAAA;AAED,eAAO,MAAM,aAAa,wBAAmB,CAAA"}
@@ -0,0 +1,137 @@
1
+ export const workflowRunsUiRo = {
2
+ page: {
3
+ title: "Rulari workflow",
4
+ subtitle: "Executii recente si pasi inregistrati.",
5
+ filterTitle: "Filtru",
6
+ workflowLabel: "Workflow",
7
+ workflowPlaceholder: "checkout-finalize",
8
+ workflowEmpty: "Nu exista workflow-uri in rularile vizibile.",
9
+ searchLabel: "Cautare",
10
+ searchPlaceholder: "Corelatie, eticheta, eroare, input...",
11
+ statusLabel: "Status",
12
+ tagLabel: "Eticheta",
13
+ tagPlaceholder: "bookingId:bk_...",
14
+ tagEmpty: "Nu exista etichete in rularile vizibile.",
15
+ addTag: "Adauga",
16
+ removeTag: "Sterge eticheta",
17
+ timeRangeLabel: "Pornit",
18
+ live: "Live",
19
+ clearFilters: "Curata",
20
+ anyStatus: "Oricare",
21
+ empty: "Nu exista rulari.",
22
+ selectPrompt: "Alege o rulare din lista pentru a vedea pasii si payload-urile.",
23
+ loading: "Se incarca...",
24
+ loadError: "Rularile workflow nu au putut fi incarcate.",
25
+ runCount: (count) => `${count} ${count === 1 ? "rulare" : "rulari"}`,
26
+ filteredRunCount: (filtered, total) => filtered === total
27
+ ? `${total} ${total === 1 ? "rulare" : "rulari"}`
28
+ : `${filtered}/${total} rulari`,
29
+ timeRanges: {
30
+ "15m": "15m",
31
+ "1h": "1h",
32
+ "24h": "24h",
33
+ "7d": "7z",
34
+ all: "Toate",
35
+ },
36
+ },
37
+ status: {
38
+ running: "In rulare",
39
+ succeeded: "Reusita",
40
+ failed: "Esuata",
41
+ cancelled: "Anulata",
42
+ },
43
+ stepStatus: {
44
+ running: "In rulare",
45
+ succeeded: "Reusit",
46
+ failed: "Esuat",
47
+ skipped: "Sarit",
48
+ compensated: "Compensat",
49
+ },
50
+ detail: {
51
+ trigger: "Declansator",
52
+ correlation: "Corelatie",
53
+ parent: "Parinte",
54
+ triggeredBy: "Declansat de",
55
+ tags: "Etichete",
56
+ started: "Pornit",
57
+ finished: "Finalizat",
58
+ steps: "Pasi",
59
+ noSteps: "Nu exista pasi inregistrati.",
60
+ input: "Input",
61
+ output: "Output",
62
+ result: "Rezultat",
63
+ runError: "Eroare rulare",
64
+ stackTrace: "Stack trace",
65
+ copy: "Copiaza",
66
+ copied: "Copiat",
67
+ code: "cod",
68
+ step: "pas",
69
+ reruns: "Reluari ale acestei rulari",
70
+ resumedAt: (step) => `reluat @ ${step}`,
71
+ durationUnavailable: "-",
72
+ },
73
+ actions: {
74
+ rerun: "Ruleaza din nou",
75
+ rerunBusy: "Se reia",
76
+ resume: "Reia de la pasul esuat",
77
+ resumeBusy: "Se reia",
78
+ waitForCompletion: "Asteapta finalizarea acestei rulari inainte de reluare.",
79
+ rerunDescription: "Porneste o rulare noua cu acelasi input inregistrat.",
80
+ resumeDescription: "Sare pasii deja finalizati si reincearca de la pasul esuat.",
81
+ resumeUnavailable: "Reluarea este disponibila doar pentru rulari esuate.",
82
+ actionFailed: "Actiunea a esuat.",
83
+ rerunStarted: "Reluarea a pornit; se deschide rularea noua.",
84
+ resumeStarted: (step) => `Reluat de la pasul "${step}"; se deschide rularea noua.`,
85
+ runnerMissing: "Nu exista runner inregistrat pentru acest workflow. Inregistreaza un WorkflowRunner pentru reluare.",
86
+ rerunBlocked: "Reluarea a fost blocata de regula de siguranta a runnerului.",
87
+ incompletePriorStep: "Nu se poate relua deoarece un pas anterior este incomplet.",
88
+ confirmTitle: "Confirma reluarea",
89
+ confirmBody: "Acest workflow are efecte secundare care se executa din nou la reluare. Rularea noua porneste de la primul pas cu acelasi input.",
90
+ confirmTip: "Daca rularea initiala a esuat la mijloc, foloseste reluarea de la pasul esuat pentru a sari lucrul finalizat.",
91
+ cancel: "Anuleaza",
92
+ rerunAnyway: "Ruleaza oricum",
93
+ },
94
+ format: {
95
+ relativeNow: "acum",
96
+ },
97
+ schedules: {
98
+ title: "Programari workflow",
99
+ subtitle: "Programari cron, interval si one-shot inregistrate.",
100
+ environmentLabel: "Mediu",
101
+ versionLabel: "Manifest",
102
+ workflowColumn: "Workflow",
103
+ scheduleColumn: "Programare",
104
+ nextRunColumn: "Urmatoarea rulare",
105
+ lastRunColumn: "Ultima rulare",
106
+ statusColumn: "Status",
107
+ actionsColumn: "Actiuni",
108
+ enabled: "Activ",
109
+ disabledByRegistration: "Dezactivat",
110
+ disabledByEnvironment: "Dezactivat (filtrat dupa mediu)",
111
+ disabledByEnvFlag: "Dezactivat (flag de mediu)",
112
+ envFlagOff: "Programarile sunt dezactivate de flag-ul de mediu — nimic nu va rula.",
113
+ envFlagOn: "Programarile sunt active.",
114
+ eventDriven: "declansat de eveniment",
115
+ cron: (expr, timezone) => `${expr} (${timezone})`,
116
+ every: (interval) => `la fiecare ${interval}`,
117
+ at: (timestamp) => `la ${timestamp}`,
118
+ triggerNow: "Declanseaza acum",
119
+ triggering: "Se declanseaza...",
120
+ triggerSuccess: "Rulare pornita.",
121
+ triggerFailed: "Declansarea a esuat.",
122
+ refresh: "Reincarca",
123
+ loading: "Se incarca programarile...",
124
+ loadError: "Programarile nu au putut fi incarcate.",
125
+ empty: "Nu exista programari inregistrate pentru acest mediu.",
126
+ inFuture: (relative) => `in ${relative}`,
127
+ inPast: (relative) => `acum ${relative}`,
128
+ notScheduled: "—",
129
+ lastRunSucceeded: (relative) => `reusita acum ${relative}`,
130
+ lastRunFailed: (relative) => `esuata acum ${relative}`,
131
+ lastRunRunning: "in rulare",
132
+ lastRunCancelled: (relative) => `anulata acum ${relative}`,
133
+ lastFireRecorded: (relative) => `declansata acum ${relative}`,
134
+ lastRunNone: "nu a rulat niciodata",
135
+ },
136
+ };
137
+ export const workflowsUiRo = workflowRunsUiRo;
@@ -0,0 +1,2 @@
1
+ export { createWorkflowSchedulesApiClient, type ListWorkflowSchedulesResponse, type WorkflowScheduleDecl, type WorkflowScheduleSummary, type WorkflowSchedulesApi, type WorkflowSchedulesApiClientOptions, } from "./workflow-schedules-client.js";
2
+ //# sourceMappingURL=schedules-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedules-client.d.ts","sourceRoot":"","sources":["../src/schedules-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iCAAiC,GACvC,MAAM,gCAAgC,CAAA"}
@@ -0,0 +1 @@
1
+ export { createWorkflowSchedulesApiClient, } from "./workflow-schedules-client.js";
@@ -0,0 +1,2 @@
1
+ export type { ListWorkflowRunsQuery, ListWorkflowRunsResponse, WorkflowRun, WorkflowRunActionError, WorkflowRunActionResponse, WorkflowRunActionResult, WorkflowRunDetailResponse, WorkflowRunErrorPayload, WorkflowRunStatus, WorkflowRunStep, WorkflowRunStepStatus, WorkflowRunsApi, } from "./workflow-runs-client.js";
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,GAChB,MAAM,2BAA2B,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/ui.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export type { WorkflowRunsApiClientOptions } from "./client.js";
2
+ export { createWorkflowRunsApiClient } from "./client.js";
3
+ export { WorkflowRunDetailPage, type WorkflowRunDetailPageProps, } from "./components/workflow-run-detail-page.js";
4
+ export { WorkflowRunsPage, type WorkflowRunsPageProps, WorkflowRunsPageSkeleton, } from "./components/workflow-runs-page.js";
5
+ export { WorkflowSchedulesPage, type WorkflowSchedulesPageProps, } from "./components/workflow-schedules-page.js";
6
+ export { getWorkflowRunsUiI18n, getWorkflowRunsUiI18n as getWorkflowsUiI18n, resolveWorkflowRunsUiMessages, resolveWorkflowRunsUiMessages as resolveWorkflowsUiMessages, useWorkflowRunsUiI18n, useWorkflowRunsUiI18n as useWorkflowsUiI18n, useWorkflowRunsUiI18nOrDefault, useWorkflowRunsUiI18nOrDefault as useWorkflowsUiI18nOrDefault, useWorkflowRunsUiMessages, useWorkflowRunsUiMessages as useWorkflowsUiMessages, useWorkflowRunsUiMessagesOrDefault, useWorkflowRunsUiMessagesOrDefault as useWorkflowsUiMessagesOrDefault, type WorkflowRunsUiMessageOverrides, type WorkflowRunsUiMessageOverrides as WorkflowsUiMessageOverrides, type WorkflowRunsUiMessages, type WorkflowRunsUiMessages as WorkflowsUiMessages, WorkflowRunsUiMessagesProvider, WorkflowRunsUiMessagesProvider as WorkflowsUiMessagesProvider, workflowRunsUiEn, workflowRunsUiEn as workflowsUiEn, workflowRunsUiMessageDefinitions, workflowRunsUiMessageDefinitions as workflowsUiMessageDefinitions, workflowRunsUiRo, workflowRunsUiRo as workflowsUiRo, } from "./i18n/index.js";
7
+ export { createWorkflowSchedulesApiClient, type ListWorkflowSchedulesResponse, type WorkflowScheduleDecl, type WorkflowScheduleSummary, type WorkflowSchedulesApi, type WorkflowSchedulesApiClientOptions, } from "./schedules-client.js";
8
+ export type { ListWorkflowRunsQuery, ListWorkflowRunsResponse, WorkflowRun, WorkflowRunActionError, WorkflowRunActionResponse, WorkflowRunActionResult, WorkflowRunDetailResponse, WorkflowRunErrorPayload, WorkflowRunStatus, WorkflowRunStep, WorkflowRunStepStatus, WorkflowRunsApi, } from "./types.js";
9
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,wBAAwB,GACzB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,IAAI,kBAAkB,EAC3C,6BAA6B,EAC7B,6BAA6B,IAAI,0BAA0B,EAC3D,qBAAqB,EACrB,qBAAqB,IAAI,kBAAkB,EAC3C,8BAA8B,EAC9B,8BAA8B,IAAI,2BAA2B,EAC7D,yBAAyB,EACzB,yBAAyB,IAAI,sBAAsB,EACnD,kCAAkC,EAClC,kCAAkC,IAAI,+BAA+B,EACrE,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,IAAI,2BAA2B,EAClE,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,IAAI,mBAAmB,EAClD,8BAA8B,EAC9B,8BAA8B,IAAI,2BAA2B,EAC7D,gBAAgB,EAChB,gBAAgB,IAAI,aAAa,EACjC,gCAAgC,EAChC,gCAAgC,IAAI,6BAA6B,EACjE,gBAAgB,EAChB,gBAAgB,IAAI,aAAa,GAClC,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,gCAAgC,EAChC,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iCAAiC,GACvC,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAA"}
package/dist/ui.js ADDED
@@ -0,0 +1,6 @@
1
+ export { createWorkflowRunsApiClient } from "./client.js";
2
+ export { WorkflowRunDetailPage, } from "./components/workflow-run-detail-page.js";
3
+ export { WorkflowRunsPage, WorkflowRunsPageSkeleton, } from "./components/workflow-runs-page.js";
4
+ export { WorkflowSchedulesPage, } from "./components/workflow-schedules-page.js";
5
+ export { getWorkflowRunsUiI18n, getWorkflowRunsUiI18n as getWorkflowsUiI18n, resolveWorkflowRunsUiMessages, resolveWorkflowRunsUiMessages as resolveWorkflowsUiMessages, useWorkflowRunsUiI18n, useWorkflowRunsUiI18n as useWorkflowsUiI18n, useWorkflowRunsUiI18nOrDefault, useWorkflowRunsUiI18nOrDefault as useWorkflowsUiI18nOrDefault, useWorkflowRunsUiMessages, useWorkflowRunsUiMessages as useWorkflowsUiMessages, useWorkflowRunsUiMessagesOrDefault, useWorkflowRunsUiMessagesOrDefault as useWorkflowsUiMessagesOrDefault, WorkflowRunsUiMessagesProvider, WorkflowRunsUiMessagesProvider as WorkflowsUiMessagesProvider, workflowRunsUiEn, workflowRunsUiEn as workflowsUiEn, workflowRunsUiMessageDefinitions, workflowRunsUiMessageDefinitions as workflowsUiMessageDefinitions, workflowRunsUiRo, workflowRunsUiRo as workflowsUiRo, } from "./i18n/index.js";
6
+ export { createWorkflowSchedulesApiClient, } from "./schedules-client.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@voyantjs/workflows-react",
3
- "version": "0.106.0",
4
- "description": "React hooks for Voyant Workflows — trigger, subscribe, and stream runs.",
3
+ "version": "0.107.0",
4
+ "description": "React hooks for Voyant Workflows — trigger, subscribe, and stream runs — plus the styled workflow-run admin UI (formerly @voyantjs/workflows-ui).",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -30,46 +30,94 @@
30
30
  "types": "./dist/workflow-schedules-client.d.ts",
31
31
  "import": "./dist/workflow-schedules-client.js",
32
32
  "default": "./dist/workflow-schedules-client.js"
33
+ },
34
+ "./ui": {
35
+ "types": "./dist/ui.d.ts",
36
+ "import": "./dist/ui.js",
37
+ "default": "./dist/ui.js"
38
+ },
39
+ "./client": {
40
+ "types": "./dist/client.d.ts",
41
+ "import": "./dist/client.js",
42
+ "default": "./dist/client.js"
43
+ },
44
+ "./styles.css": {
45
+ "default": "./src/styles.css"
46
+ },
47
+ "./i18n": {
48
+ "types": "./dist/i18n/index.d.ts",
49
+ "import": "./dist/i18n/index.js",
50
+ "default": "./dist/i18n/index.js"
51
+ },
52
+ "./i18n/en": {
53
+ "types": "./dist/i18n/en.d.ts",
54
+ "import": "./dist/i18n/en.js",
55
+ "default": "./dist/i18n/en.js"
56
+ },
57
+ "./i18n/ro": {
58
+ "types": "./dist/i18n/ro.d.ts",
59
+ "import": "./dist/i18n/ro.js",
60
+ "default": "./dist/i18n/ro.js"
61
+ },
62
+ "./components/*": {
63
+ "types": "./dist/components/*.d.ts",
64
+ "import": "./dist/components/*.js",
65
+ "default": "./dist/components/*.js"
33
66
  }
34
67
  },
35
- "main": "./dist/index.js",
36
- "types": "./dist/index.d.ts",
37
- "files": [
38
- "dist",
39
- "src",
40
- "!**/*.test.*",
41
- "!**/*.spec.*",
42
- "NOTICE"
43
- ],
44
68
  "dependencies": {
69
+ "@voyantjs/i18n": "^0.106.0",
45
70
  "@voyantjs/react": "^0.104.1",
46
- "@voyantjs/workflows": "^0.106.0"
71
+ "@voyantjs/workflows": "^0.107.0"
47
72
  },
48
73
  "peerDependencies": {
49
74
  "@tanstack/react-query": "^5.0.0",
75
+ "lucide-react": "^0.475.0 || ^1.0.0",
50
76
  "react": "^19.0.0",
51
- "react-dom": "^19.0.0"
77
+ "react-dom": "^19.0.0",
78
+ "@voyantjs/ui": "^0.106.0"
79
+ },
80
+ "peerDependenciesMeta": {
81
+ "@voyantjs/ui": {
82
+ "optional": true
83
+ },
84
+ "lucide-react": {
85
+ "optional": true
86
+ }
52
87
  },
53
88
  "devDependencies": {
54
89
  "@tanstack/react-query": "^5.100.11",
55
- "@types/react": "^19.1.0",
90
+ "@types/react": "^19.2.14",
56
91
  "@types/react-dom": "^19.2.3",
57
- "react": "^19.1.0",
92
+ "lucide-react": "^1.7.0",
93
+ "react": "^19.2.4",
58
94
  "react-dom": "^19.2.4",
59
- "typescript": "^5.9.2",
95
+ "typescript": "^6.0.2",
60
96
  "vitest": "^4.1.2",
97
+ "@voyantjs/i18n": "^0.106.0",
61
98
  "@voyantjs/react": "^0.104.1",
99
+ "@voyantjs/ui": "^0.106.0",
62
100
  "@voyantjs/voyant-typescript-config": "^0.1.0"
63
101
  },
102
+ "files": [
103
+ "dist",
104
+ "src",
105
+ "!**/*.test.*",
106
+ "!**/*.spec.*",
107
+ "NOTICE",
108
+ "src/components",
109
+ "src/styles.css"
110
+ ],
64
111
  "publishConfig": {
65
112
  "access": "public"
66
113
  },
67
114
  "scripts": {
68
- "build": "tsc -p tsconfig.json",
69
- "check-types": "tsc --noEmit",
115
+ "build": "tsc -p tsconfig.build.json",
116
+ "clean": "rm -rf dist tsconfig.tsbuildinfo tsconfig.build.tsbuildinfo",
70
117
  "typecheck": "tsc --noEmit",
71
118
  "lint": "biome check src/",
72
- "test": "vitest run --passWithNoTests",
73
- "dev": "tsc -w -p tsconfig.json"
74
- }
119
+ "test": "vitest run --passWithNoTests"
120
+ },
121
+ "main": "./dist/index.js",
122
+ "types": "./dist/index.d.ts"
75
123
  }
package/src/client.ts ADDED
@@ -0,0 +1,4 @@
1
+ export {
2
+ createWorkflowRunsApiClient,
3
+ type WorkflowRunsApiClientOptions,
4
+ } from "./workflow-runs-client.js"
@@ -0,0 +1,182 @@
1
+ "use client"
2
+
3
+ import { Badge } from "@voyantjs/ui/components/badge"
4
+ import { AlertCircle, CheckCircle2, Clock, Copy, RefreshCw, XCircle } from "lucide-react"
5
+ import { useMemo, useState } from "react"
6
+
7
+ import { useWorkflowRunsUiMessagesOrDefault, type WorkflowRunsUiMessages } from "../i18n/index.js"
8
+ import type { WorkflowRun, WorkflowRunStep, WorkflowRunStepStatus } from "../types.js"
9
+
10
+ export function StatusIcon({ status }: { status: WorkflowRun["status"] }) {
11
+ switch (status) {
12
+ case "succeeded":
13
+ return <CheckCircle2 className="h-4 w-4 text-emerald-500" />
14
+ case "failed":
15
+ return <XCircle className="h-4 w-4 text-destructive" />
16
+ case "cancelled":
17
+ return <AlertCircle className="h-4 w-4 text-amber-500" />
18
+ case "running":
19
+ return <Clock className="h-4 w-4 animate-pulse text-blue-500" />
20
+ }
21
+ }
22
+
23
+ export function StepStatusIcon({ status }: { status: WorkflowRunStepStatus }) {
24
+ switch (status) {
25
+ case "succeeded":
26
+ return <CheckCircle2 className="h-4 w-4 text-emerald-500" />
27
+ case "failed":
28
+ return <XCircle className="h-4 w-4 text-destructive" />
29
+ case "running":
30
+ return <Clock className="h-4 w-4 animate-pulse text-blue-500" />
31
+ case "skipped":
32
+ return <AlertCircle className="h-4 w-4 text-muted-foreground" />
33
+ case "compensated":
34
+ return <RefreshCw className="h-4 w-4 text-amber-500" />
35
+ }
36
+ }
37
+
38
+ export function StatusBadge({
39
+ status,
40
+ messages,
41
+ }: {
42
+ status: WorkflowRun["status"]
43
+ messages: WorkflowRunsUiMessages
44
+ }) {
45
+ useWorkflowRunsUiMessagesOrDefault()
46
+ const className = {
47
+ succeeded: "border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-300", // i18n-literal-ok: CSS classes
48
+ failed: "border-destructive/40 bg-destructive/10 text-destructive", // i18n-literal-ok: CSS classes
49
+ cancelled: "border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-300", // i18n-literal-ok: CSS classes
50
+ running: "border-blue-500/40 bg-blue-500/10 text-blue-600 dark:text-blue-300", // i18n-literal-ok: CSS classes
51
+ }[status]
52
+ return (
53
+ <Badge variant="outline" className={`text-[11px] ${className}`}>
54
+ {messages.status[status]}
55
+ </Badge>
56
+ )
57
+ }
58
+
59
+ export function TagChip({ tag }: { tag: string }) {
60
+ const colonIdx = tag.indexOf(":")
61
+ if (colonIdx < 0) {
62
+ return (
63
+ <Badge variant="outline" className="font-mono text-[10px]">
64
+ {tag}
65
+ </Badge>
66
+ )
67
+ }
68
+ const key = tag.slice(0, colonIdx)
69
+ const value = tag.slice(colonIdx + 1)
70
+ return (
71
+ <Badge variant="outline" className="gap-1 font-mono text-[10px]" title={tag}>
72
+ <span className="text-muted-foreground">{key}</span>
73
+ <span className="max-w-[18ch] truncate">{value}</span>
74
+ </Badge>
75
+ )
76
+ }
77
+
78
+ export function CopyableId({
79
+ id,
80
+ copiedLabel,
81
+ className,
82
+ }: {
83
+ id: string
84
+ copiedLabel: string
85
+ className?: string
86
+ }) {
87
+ const [copied, setCopied] = useState(false)
88
+ const onCopy = async () => {
89
+ try {
90
+ await navigator.clipboard.writeText(id)
91
+ setCopied(true)
92
+ setTimeout(() => setCopied(false), 1500)
93
+ } catch {
94
+ /* clipboard blocked */
95
+ }
96
+ }
97
+ return (
98
+ <button
99
+ type="button"
100
+ onClick={onCopy}
101
+ className={`group inline-flex items-center gap-1.5 rounded border bg-muted/40 px-2 py-1 font-mono text-[11px] hover:bg-muted ${
102
+ className ?? ""
103
+ }`}
104
+ title={id}
105
+ >
106
+ <span className="max-w-[16ch] truncate">{id}</span>
107
+ <Copy className="h-3 w-3 opacity-60 group-hover:opacity-100" />
108
+ {copied ? <span className="text-emerald-500 text-[10px]">{copiedLabel}</span> : null}
109
+ </button>
110
+ )
111
+ }
112
+
113
+ export function PayloadBlock({
114
+ title,
115
+ value,
116
+ messages,
117
+ hideTitle = false,
118
+ }: {
119
+ title: string
120
+ value: Record<string, unknown>
121
+ messages: WorkflowRunsUiMessages
122
+ hideTitle?: boolean
123
+ }) {
124
+ const [copied, setCopied] = useState(false)
125
+ const json = useMemo(() => JSON.stringify(value, null, 2), [value])
126
+
127
+ const onCopy = async () => {
128
+ try {
129
+ await navigator.clipboard.writeText(json)
130
+ setCopied(true)
131
+ setTimeout(() => setCopied(false), 1500)
132
+ } catch {
133
+ /* clipboard blocked */
134
+ }
135
+ }
136
+
137
+ return (
138
+ <div className="space-y-1">
139
+ {hideTitle ? null : (
140
+ <div className="flex items-center justify-between gap-2">
141
+ <span className="text-muted-foreground text-xs">{title}</span>
142
+ <button
143
+ type="button"
144
+ onClick={onCopy}
145
+ className="flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground"
146
+ >
147
+ <Copy className="h-3 w-3" />
148
+ {copied ? messages.detail.copied : messages.detail.copy}
149
+ </button>
150
+ </div>
151
+ )}
152
+ <pre className="max-h-[24rem] overflow-auto rounded bg-muted/40 p-3 font-mono text-[11px] leading-relaxed">
153
+ {json}
154
+ </pre>
155
+ </div>
156
+ )
157
+ }
158
+
159
+ export function formatRelative(iso: string, messages: WorkflowRunsUiMessages): string {
160
+ const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000)
161
+ if (Math.abs(seconds) < 5) return messages.format.relativeNow
162
+ const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: "auto" })
163
+ if (Math.abs(seconds) < 60) return formatter.format(-seconds, "second")
164
+ const minutes = Math.round(seconds / 60)
165
+ if (Math.abs(minutes) < 60) return formatter.format(-minutes, "minute")
166
+ const hours = Math.round(minutes / 60)
167
+ if (Math.abs(hours) < 24) return formatter.format(-hours, "hour")
168
+ const days = Math.round(hours / 24)
169
+ return formatter.format(-days, "day")
170
+ }
171
+
172
+ export function formatDuration(ms: number): string {
173
+ if (ms < 1000) return `${ms}ms`
174
+ if (ms < 60_000) return `${(ms / 1000).toFixed(2)}s`
175
+ const minutes = Math.floor(ms / 60_000)
176
+ const seconds = Math.round((ms % 60_000) / 1000)
177
+ return `${minutes}m ${seconds}s`
178
+ }
179
+
180
+ export function runHasLiveStatus(run: WorkflowRun | WorkflowRunStep): boolean {
181
+ return run.status === "running"
182
+ }