@burdenoff/microfe-workflows 2026.510.108

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.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # @burdenoff/micro-fe
2
+
3
+ Microfrontend packages for Burdenoff products.
4
+
5
+ ## Architecture
6
+
7
+ This is a **Layer 2 package** - a monolithic package with subpath exports for all microfrontends.
8
+
9
+ ## Package Structure
10
+
11
+ ```
12
+ @burdenoff/micro-fe/
13
+ ├── /workflows - Complete workflow builder and management microfrontend
14
+ ├── /tags - Tag management system (to be implemented)
15
+ └── /auth - Authentication flows (to be implemented)
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```typescript
21
+ import { WorkflowsRoot } from '@burdenoff/micro-fe/workflows';
22
+
23
+ // In your host shell
24
+ <WorkflowsRoot
25
+ basePath="/workflows"
26
+ navigate={(path) => navigate(path)}
27
+ currentUser={user}
28
+ workspaceId={workspaceId}
29
+ apiGatewayUrl={apiGatewayUrl}
30
+ authToken={authToken}
31
+ />
32
+ ```
33
+
34
+ ## Development
35
+
36
+ ```bash
37
+ # Install dependencies
38
+ bun install
39
+
40
+ # Generate GraphQL types
41
+ bun run codegen
42
+
43
+ # Build library
44
+ bun run build
45
+
46
+ # Type check
47
+ bun run type:check
48
+
49
+ # Run all checks
50
+ bun run sanity
51
+ ```
52
+
53
+ ## Workflows Microfrontend
54
+
55
+ Complete workflow automation microfrontend with:
56
+
57
+ - **WorkflowsList** - List all workflows
58
+ - **WorkflowBuilder** - Visual workflow builder with node palette
59
+ - **WorkflowRuns** - Execution history
60
+ - **WorkflowRunDetails** - Detailed run monitoring
61
+
62
+ ### Routes
63
+
64
+ - `/` - Workflows list
65
+ - `/builder/:workflowKey?` - Workflow builder (create/edit)
66
+ - `/runs` - Workflow runs history
67
+ - `/runs/:runId` - Run details
68
+
69
+ ## GraphQL Integration
70
+
71
+ Uses GraphQL Codegen to generate typed hooks from operations:
72
+
73
+ ```typescript
74
+ import { useGetWorkflowDefinitionsQuery } from './graphql/generated/operations';
75
+
76
+ const { data, loading } = useGetWorkflowDefinitionsQuery({
77
+ variables: { input: { limit: 10 } }
78
+ });
79
+ ```
80
+
81
+ ## Tech Stack
82
+
83
+ - React 19 with TypeScript
84
+ - React Router v7
85
+ - Apollo Client for GraphQL
86
+ - Zustand for state management
87
+ - @burdenoff/fe-libs for UI primitives
88
+ - TailwindCSS v4 for styling
@@ -0,0 +1,29 @@
1
+ import { NavItem, FooterItem } from '@burdenoff/fe-libs/shared/hooks/shell';
2
+ import { MicrofrontendRootProps } from '@burdenoff/fe-libs/shared/types';
3
+
4
+ export type { NavItem, FooterItem };
5
+ /**
6
+ * Props for the WorkflowsRoot component
7
+ */
8
+ export interface WorkflowsRootProps extends MicrofrontendRootProps {
9
+ /**
10
+ * Optional capabilities flags
11
+ */
12
+ capabilities?: Record<string, boolean>;
13
+ /**
14
+ * Optional callback functions
15
+ */
16
+ callbacks?: Record<string, (...args: unknown[]) => unknown>;
17
+ /**
18
+ * Optional function to register navigation items with the shell
19
+ * Injected by the shell app
20
+ */
21
+ registerNavItems?: (items: NavItem | NavItem[]) => () => void;
22
+ /**
23
+ * Optional function to register footer items with the shell
24
+ * Injected by the shell app
25
+ */
26
+ registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;
27
+ }
28
+ export declare function WorkflowsRoot(props: WorkflowsRootProps): import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=WorkflowsRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsRoot.d.ts","sourceRoot":"","sources":["../src/WorkflowsRoot.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC;IAE5D;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,MAAM,IAAI,CAAC;IAE9D;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,KAAK,MAAM,IAAI,CAAC;CACxE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAiKtD"}
@@ -0,0 +1,104 @@
1
+ import { useWorkflowsTranslation as e } from "./i18n.js";
2
+ import { WorkflowsProvider as t } from "./providers/WorkflowsProvider.js";
3
+ import { WorkflowsRoutes as n } from "./WorkflowsRoutes.js";
4
+ import { useEffect as r, useMemo as i } from "react";
5
+ import { ErrorBoundary as a } from "@burdenoff/fe-libs/shared/components";
6
+ import { FeatureFlagProvider as o, useFeatureFlags as s } from "@burdenoff/fe-libs/shared/feature-flags";
7
+ import { jsx as c } from "react/jsx-runtime";
8
+ import { Boxes as l, FileCode2 as u, History as d, LayoutDashboard as f, Network as p, PlayCircle as m, Settings as h, Workflow as g } from "lucide-react";
9
+ //#region src/WorkflowsRoot.tsx
10
+ function _(_) {
11
+ let { basePath: v = "/", registerNavItems: y, registerFooterItems: b } = _, { isEnabled: x, evaluations: S } = s(), C = i(() => ({ isEnabled: x }), [S, x]), w = e();
12
+ return r(() => {
13
+ if (!y) return;
14
+ let e = (e, t) => `${e.endsWith("/") ? e.slice(0, -1) : e}/${t}`, t = [
15
+ ...C.isEnabled("workflows.list") ? [{
16
+ id: "workflows-list",
17
+ label: w("workflows.nav.myWorkflows", "My Workflows"),
18
+ path: e(v, "list"),
19
+ icon: /* @__PURE__ */ c(g, { size: 18 }),
20
+ order: 2
21
+ }] : [],
22
+ ...C.isEnabled("workflows.builder") ? [{
23
+ id: "workflows-builder",
24
+ label: w("workflows.nav.builder", "Builder"),
25
+ path: e(v, "new"),
26
+ icon: /* @__PURE__ */ c(l, { size: 18 }),
27
+ order: 3
28
+ }] : [],
29
+ ...C.isEnabled("workflows.runs") ? [{
30
+ id: "workflows-runs",
31
+ label: w("workflows.nav.runs", "Runs"),
32
+ path: e(v, "runs"),
33
+ icon: /* @__PURE__ */ c(m, { size: 18 }),
34
+ order: 4
35
+ }] : [],
36
+ ...C.isEnabled("workflows.history") ? [{
37
+ id: "workflows-history",
38
+ label: w("workflows.nav.history", "History"),
39
+ path: e(v, "history"),
40
+ icon: /* @__PURE__ */ c(d, { size: 18 }),
41
+ order: 5
42
+ }] : [],
43
+ ...C.isEnabled("workflows.templates") ? [{
44
+ id: "workflows-templates",
45
+ label: w("workflows.nav.templates", "Templates"),
46
+ path: e(v, "templates"),
47
+ icon: /* @__PURE__ */ c(f, { size: 18 }),
48
+ order: 6
49
+ }] : [],
50
+ ...C.isEnabled("workflows.nodes") ? [{
51
+ id: "workflows-nodes",
52
+ label: w("workflows.nav.nodes", "Nodes"),
53
+ path: e(v, "nodes"),
54
+ icon: /* @__PURE__ */ c(p, { size: 18 }),
55
+ order: 7
56
+ }] : [],
57
+ ...C.isEnabled("workflows.settings") ? [{
58
+ id: "workflows-settings",
59
+ label: w("workflows.nav.settings", "Settings"),
60
+ path: e(v, "settings"),
61
+ icon: /* @__PURE__ */ c(h, { size: 18 }),
62
+ order: 8
63
+ }] : []
64
+ ];
65
+ return y([{
66
+ id: "workflows",
67
+ label: w("workflows.nav.title", "Workflows"),
68
+ path: v,
69
+ icon: /* @__PURE__ */ c(u, { size: 20 }),
70
+ order: 200,
71
+ group: "workflows",
72
+ children: t
73
+ }]);
74
+ }, [
75
+ y,
76
+ v,
77
+ C,
78
+ w
79
+ ]), r(() => {
80
+ if (b) return b([{
81
+ id: "workflows-status",
82
+ label: w("workflows.footer.status", "Workflows Ready"),
83
+ type: "status",
84
+ order: 10,
85
+ section: "left"
86
+ }]);
87
+ }, [b, w]), /* @__PURE__ */ c(o, {
88
+ workspaceId: null,
89
+ gateway: "global",
90
+ defaultEnabled: !0,
91
+ children: /* @__PURE__ */ c(a, {
92
+ fallback: /* @__PURE__ */ c("div", {
93
+ className: "p-6 text-center text-text-secondary",
94
+ children: w("workflows.error.loadFailed", "Something went wrong loading this module. Please refresh the page.")
95
+ }),
96
+ children: /* @__PURE__ */ c(t, {
97
+ ..._,
98
+ children: /* @__PURE__ */ c(n, {})
99
+ })
100
+ })
101
+ });
102
+ }
103
+ //#endregion
104
+ export { _ as WorkflowsRoot };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Internal router for the Workflows microfrontend.
3
+ * Uses relative paths - parent route handles base path (/workflows/*).
4
+ *
5
+ * All workflow pages are gated behind feature flags as the module is in preview.
6
+ *
7
+ * NOTE: /credentials and /oauth/callback routes have been removed.
8
+ * Connection management is now handled by microfe-integrations at /integrations/connections.
9
+ * OAuth callbacks are handled by the integrations service REST endpoint.
10
+ */
11
+ export declare function WorkflowsRoutes(): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=WorkflowsRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsRoutes.d.ts","sourceRoot":"","sources":["../src/WorkflowsRoutes.tsx"],"names":[],"mappings":"AA0GA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,4CAuE9B"}
@@ -0,0 +1,190 @@
1
+ import { useWorkflowsTranslation as e } from "./i18n.js";
2
+ import { Suspense as t } from "react";
3
+ import { FeatureGate as n, useFeatureFlags as r } from "@burdenoff/fe-libs/shared/feature-flags";
4
+ import { ExecutionDetailPage as i, ExecutionsListPage as a, HistoryPage as o, NodesPage as s, SettingsPage as c, TemplatesPage as l, WorkflowBuilderPage as u, WorkflowsList as d } from "@burdenoff/fluidgrids-fe-sdk";
5
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
6
+ import { Navigate as m, Route as h, Routes as g, useParams as _ } from "react-router-dom";
7
+ //#region src/WorkflowsRoutes.tsx
8
+ function v() {
9
+ let t = e();
10
+ return /* @__PURE__ */ p("div", {
11
+ className: "flex h-full min-h-[200px] w-full flex-col items-center justify-center gap-3 px-6 text-center",
12
+ role: "status",
13
+ "aria-live": "polite",
14
+ "aria-label": t("workflows.routes.loading.ariaLabel", "Loading workflow page"),
15
+ children: [/* @__PURE__ */ f("div", { className: "h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" }), /* @__PURE__ */ f("p", {
16
+ className: "text-sm text-text-secondary",
17
+ children: t("workflows.routes.loading.message", "Loading workflow page...")
18
+ })]
19
+ });
20
+ }
21
+ function y() {
22
+ let t = e();
23
+ return /* @__PURE__ */ f("div", {
24
+ className: "flex h-full items-center justify-center p-8 text-center",
25
+ children: /* @__PURE__ */ p("div", {
26
+ className: "max-w-md",
27
+ children: [/* @__PURE__ */ f("h2", {
28
+ className: "mb-2 text-lg font-semibold text-text-primary",
29
+ children: t("workflows.routes.featureDisabled.title", "Feature not available")
30
+ }), /* @__PURE__ */ f("p", {
31
+ className: "text-sm text-text-secondary",
32
+ children: t("workflows.routes.featureDisabled.description", "This workflow feature is still in preview. Enable it under Feature Previews to access it.")
33
+ })]
34
+ })
35
+ });
36
+ }
37
+ function b() {
38
+ let t = e();
39
+ return /* @__PURE__ */ f("div", {
40
+ className: "flex h-full items-center justify-center p-8 text-center",
41
+ children: /* @__PURE__ */ p("div", {
42
+ className: "max-w-md",
43
+ children: [/* @__PURE__ */ f("h2", {
44
+ className: "mb-2 text-lg font-semibold text-text-primary",
45
+ children: t("workflows.routes.empty.title", "Workflows preview is unavailable")
46
+ }), /* @__PURE__ */ f("p", {
47
+ className: "text-sm text-text-secondary",
48
+ children: t("workflows.routes.empty.description", "No workflow preview pages are enabled for this workspace yet. Turn on a workflow preview feature to continue.")
49
+ })]
50
+ })
51
+ });
52
+ }
53
+ function x(e, t, r = !1) {
54
+ return /* @__PURE__ */ f(n, {
55
+ flag: e,
56
+ defaultValue: r,
57
+ loading: /* @__PURE__ */ f(v, {}),
58
+ fallback: /* @__PURE__ */ f(y, {}),
59
+ children: t
60
+ });
61
+ }
62
+ function S() {
63
+ let { runId: e } = _();
64
+ return /* @__PURE__ */ f(m, {
65
+ to: `../runs/${e}`,
66
+ replace: !0
67
+ });
68
+ }
69
+ function C() {
70
+ let { isEnabled: e, isLoading: n } = r(), _ = [
71
+ {
72
+ flag: "workflows.list",
73
+ path: "list"
74
+ },
75
+ {
76
+ flag: "workflows.builder",
77
+ path: "new"
78
+ },
79
+ {
80
+ flag: "workflows.runs",
81
+ path: "runs"
82
+ },
83
+ {
84
+ flag: "workflows.history",
85
+ path: "history"
86
+ },
87
+ {
88
+ flag: "workflows.templates",
89
+ path: "templates"
90
+ },
91
+ {
92
+ flag: "workflows.nodes",
93
+ path: "nodes"
94
+ },
95
+ {
96
+ flag: "workflows.settings",
97
+ path: "settings"
98
+ }
99
+ ].find(({ flag: t }) => e(t))?.path ?? null, y = n ? /* @__PURE__ */ f(v, {}) : _ ? /* @__PURE__ */ f(m, {
100
+ to: _,
101
+ replace: !0
102
+ }) : /* @__PURE__ */ f(b, {});
103
+ return /* @__PURE__ */ f(t, {
104
+ fallback: /* @__PURE__ */ f(v, {}),
105
+ children: /* @__PURE__ */ p(g, { children: [
106
+ /* @__PURE__ */ f(h, {
107
+ index: !0,
108
+ element: y
109
+ }),
110
+ /* @__PURE__ */ f(h, {
111
+ path: "list",
112
+ element: x("workflows.list", /* @__PURE__ */ f(d, {}))
113
+ }),
114
+ /* @__PURE__ */ f(h, {
115
+ path: "new",
116
+ element: x("workflows.builder", /* @__PURE__ */ f(u, {}))
117
+ }),
118
+ /* @__PURE__ */ f(h, {
119
+ path: "workflow/:id/:version",
120
+ element: x("workflows.builder", /* @__PURE__ */ f(u, {}))
121
+ }),
122
+ /* @__PURE__ */ f(h, {
123
+ path: "builder",
124
+ element: /* @__PURE__ */ f(m, {
125
+ to: "../new",
126
+ replace: !0
127
+ })
128
+ }),
129
+ /* @__PURE__ */ f(h, {
130
+ path: "builder/:id/:version",
131
+ element: x("workflows.builder", /* @__PURE__ */ f(u, {}))
132
+ }),
133
+ /* @__PURE__ */ f(h, {
134
+ path: "runs",
135
+ element: x("workflows.runs", /* @__PURE__ */ f(a, {}))
136
+ }),
137
+ /* @__PURE__ */ f(h, {
138
+ path: "runs/:runId",
139
+ element: x("workflows.runs", /* @__PURE__ */ f(i, {}))
140
+ }),
141
+ /* @__PURE__ */ f(h, {
142
+ path: "history",
143
+ element: x("workflows.history", /* @__PURE__ */ f(o, {}))
144
+ }),
145
+ /* @__PURE__ */ f(h, {
146
+ path: "templates",
147
+ element: x("workflows.templates", /* @__PURE__ */ f(l, {}))
148
+ }),
149
+ /* @__PURE__ */ f(h, {
150
+ path: "nodes",
151
+ element: x("workflows.nodes", /* @__PURE__ */ f(s, {}))
152
+ }),
153
+ /* @__PURE__ */ f(h, {
154
+ path: "settings",
155
+ element: x("workflows.settings", /* @__PURE__ */ f(c, {}))
156
+ }),
157
+ /* @__PURE__ */ f(h, {
158
+ path: "executions",
159
+ element: /* @__PURE__ */ f(m, {
160
+ to: "../runs",
161
+ replace: !0
162
+ })
163
+ }),
164
+ /* @__PURE__ */ f(h, {
165
+ path: "executions/:runId",
166
+ element: /* @__PURE__ */ f(S, {})
167
+ }),
168
+ /* @__PURE__ */ f(h, {
169
+ path: "credentials",
170
+ element: /* @__PURE__ */ f(m, {
171
+ to: "/integrations/connections",
172
+ replace: !0
173
+ })
174
+ }),
175
+ /* @__PURE__ */ f(h, {
176
+ path: "oauth/callback",
177
+ element: /* @__PURE__ */ f(m, {
178
+ to: "/integrations/connections",
179
+ replace: !0
180
+ })
181
+ }),
182
+ /* @__PURE__ */ f(h, {
183
+ path: "*",
184
+ element: y
185
+ })
186
+ ] })
187
+ });
188
+ }
189
+ //#endregion
190
+ export { C as WorkflowsRoutes };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Configuration module for workflows microfrontend
3
+ * This config is typically injected by the shell application at runtime
4
+ */
5
+ export interface WorkflowsConfig {
6
+ workflowSvcUrl: string;
7
+ fluidgridBackendUrlToken?: string;
8
+ fluidgridBackendUrl?: string;
9
+ apiGatewayUrl?: string;
10
+ }
11
+ /**
12
+ * Get current configuration
13
+ */
14
+ export declare const config: WorkflowsConfig;
15
+ /**
16
+ * Set runtime configuration (called by shell app)
17
+ * @param newConfig - Configuration object
18
+ */
19
+ export declare function setWorkflowsConfig(newConfig: Partial<WorkflowsConfig>): void;
20
+ /**
21
+ * Reset configuration to defaults
22
+ */
23
+ export declare function resetWorkflowsConfig(): void;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD;;GAEG;AACH,eAAO,MAAM,MAAM,iBAIjB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAE5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C"}
@@ -0,0 +1,25 @@
1
+ //#region src/config/index.ts
2
+ var e = {
3
+ workflowSvcUrl: "http://localhost:3726/graphql",
4
+ fluidgridBackendUrlToken: void 0,
5
+ fluidgridBackendUrl: "https://gw-global.local.burdenoff.com",
6
+ apiGatewayUrl: "https://gw-global.local.burdenoff.com/graphql"
7
+ }, t = new Proxy({}, { get(t, n) {
8
+ return e[n];
9
+ } });
10
+ function n(t) {
11
+ e = {
12
+ ...e,
13
+ ...t
14
+ };
15
+ }
16
+ function r() {
17
+ e = {
18
+ workflowSvcUrl: "http://localhost:3726/graphql",
19
+ fluidgridBackendUrlToken: void 0,
20
+ fluidgridBackendUrl: "https://gw-global.local.burdenoff.com",
21
+ apiGatewayUrl: "https://gw-global.local.burdenoff.com/graphql"
22
+ };
23
+ }
24
+ //#endregion
25
+ export { t as config, r as resetWorkflowsConfig, n as setWorkflowsConfig };
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Workflows Permission Constants
3
+ *
4
+ * All permission strings for Workflows resources.
5
+ * Use with fe-libs usePermissions hook: hasPermission(WORKFLOW_PERMISSIONS.WORKFLOW_CREATE)
6
+ *
7
+ * Resource types:
8
+ * - workflow: list, read, create, update, delete, execute
9
+ * - workflow-run: list, read, execute
10
+ * - node: list, read, create, delete
11
+ * - node-installation: list, read, create, delete, update
12
+ * - node-endpoint-config: list, read, update, delete
13
+ * - scheduled-job: list, read, create, update, delete
14
+ * - ai-workflow: execute
15
+ * - artifact: list, read, delete
16
+ * - chat-session: list, read, create, delete
17
+ * - submission: list, read, delete, execute
18
+ * - event-registration: list, read, create, update, delete
19
+ * - usage: list, read
20
+ * - dashboard: read
21
+ * - system-config: read, update
22
+ */
23
+ export declare const WORKFLOW_PERMISSIONS: {
24
+ readonly WORKFLOW_LIST: "workflow:list";
25
+ readonly WORKFLOW_READ: "workflow:read";
26
+ readonly WORKFLOW_CREATE: "workflow:create";
27
+ readonly WORKFLOW_UPDATE: "workflow:update";
28
+ readonly WORKFLOW_DELETE: "workflow:delete";
29
+ readonly WORKFLOW_EXECUTE: "workflow:execute";
30
+ readonly WORKFLOW_RUN_LIST: "workflow-run:list";
31
+ readonly WORKFLOW_RUN_READ: "workflow-run:read";
32
+ readonly WORKFLOW_RUN_EXECUTE: "workflow-run:execute";
33
+ readonly NODE_LIST: "node:list";
34
+ readonly NODE_READ: "node:read";
35
+ readonly NODE_CREATE: "node:create";
36
+ readonly NODE_DELETE: "node:delete";
37
+ readonly NODE_INSTALLATION_LIST: "node-installation:list";
38
+ readonly NODE_INSTALLATION_READ: "node-installation:read";
39
+ readonly NODE_INSTALLATION_CREATE: "node-installation:create";
40
+ readonly NODE_INSTALLATION_UPDATE: "node-installation:update";
41
+ readonly NODE_INSTALLATION_DELETE: "node-installation:delete";
42
+ readonly NODE_ENDPOINT_CONFIG_LIST: "node-endpoint-config:list";
43
+ readonly NODE_ENDPOINT_CONFIG_READ: "node-endpoint-config:read";
44
+ readonly NODE_ENDPOINT_CONFIG_UPDATE: "node-endpoint-config:update";
45
+ readonly NODE_ENDPOINT_CONFIG_DELETE: "node-endpoint-config:delete";
46
+ readonly SCHEDULED_JOB_LIST: "scheduled-job:list";
47
+ readonly SCHEDULED_JOB_READ: "scheduled-job:read";
48
+ readonly SCHEDULED_JOB_CREATE: "scheduled-job:create";
49
+ readonly SCHEDULED_JOB_UPDATE: "scheduled-job:update";
50
+ readonly SCHEDULED_JOB_DELETE: "scheduled-job:delete";
51
+ readonly AI_WORKFLOW_EXECUTE: "ai-workflow:execute";
52
+ readonly AI_WORKFLOW_CREATE: "ai-workflow:create";
53
+ readonly ARTIFACT_LIST: "artifact:list";
54
+ readonly ARTIFACT_READ: "artifact:read";
55
+ readonly ARTIFACT_DELETE: "artifact:delete";
56
+ readonly CHAT_SESSION_LIST: "chat-session:list";
57
+ readonly CHAT_SESSION_READ: "chat-session:read";
58
+ readonly CHAT_SESSION_CREATE: "chat-session:create";
59
+ readonly CHAT_SESSION_DELETE: "chat-session:delete";
60
+ readonly SUBMISSION_LIST: "submission:list";
61
+ readonly SUBMISSION_READ: "submission:read";
62
+ readonly SUBMISSION_DELETE: "submission:delete";
63
+ readonly SUBMISSION_EXECUTE: "submission:execute";
64
+ readonly EVENT_REGISTRATION_LIST: "event-registration:list";
65
+ readonly EVENT_REGISTRATION_READ: "event-registration:read";
66
+ readonly EVENT_REGISTRATION_CREATE: "event-registration:create";
67
+ readonly EVENT_REGISTRATION_UPDATE: "event-registration:update";
68
+ readonly EVENT_REGISTRATION_DELETE: "event-registration:delete";
69
+ readonly USAGE_LIST: "usage:list";
70
+ readonly USAGE_READ: "usage:read";
71
+ readonly DASHBOARD_READ: "dashboard:read";
72
+ readonly SYSTEM_CONFIG_READ: "system-config:read";
73
+ readonly SYSTEM_CONFIG_UPDATE: "system-config:update";
74
+ };
75
+ export type WorkflowPermission = (typeof WORKFLOW_PERMISSIONS)[keyof typeof WORKFLOW_PERMISSIONS];
76
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/constants/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EvB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC"}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function useWorkflowsTranslation(): (key: string, fallback: string) => string;
2
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,UAI7B,MAAM,YAAY,MAAM,KAAG,MAAM,CAM1C"}
package/dist/i18n.js ADDED
@@ -0,0 +1,12 @@
1
+ import { useCallback as e } from "react";
2
+ import { useI18n as t } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
+ //#region src/i18n.ts
4
+ function n() {
5
+ let { t: n } = t();
6
+ return e((e, t) => {
7
+ let r = n(e);
8
+ return r === e ? t : r;
9
+ }, [n]);
10
+ }
11
+ //#endregion
12
+ export { n as useWorkflowsTranslation };
@@ -0,0 +1,8 @@
1
+ export { WorkflowsRoot } from './WorkflowsRoot';
2
+ export type { WorkflowsRootProps } from './WorkflowsRoot';
3
+ export { config, setWorkflowsConfig, resetWorkflowsConfig } from './config';
4
+ export type { WorkflowsConfig } from './config';
5
+ export { WorkflowBuilder as EmbeddableWorkflowBuilder, WorkflowBuilderCore as EmbeddableWorkflowBuilderCore, FluidGridsProvider as EmbeddableWorkflowProvider, FluidGridsRoot as EmbeddableWorkflowRoot, useFluidGridsContext as useEmbeddableContext, useFlowStore as useEmbeddableFlowStore, createFluidGridsClient as createEmbeddableClient, setFluidGridsClient as setEmbeddableClient, getFluidGridsClient as getEmbeddableClient, setFluidGridsConfig as setEmbeddableConfig, cn, } from '@burdenoff/fluidgrids-fe-sdk';
6
+ export type { WorkflowBuilderProps as EmbeddableWorkflowBuilderProps, WorkflowBuilderCoreProps as EmbeddableWorkflowBuilderCoreProps, FluidGridsProviderProps as EmbeddableWorkflowProviderProps, FluidGridsRootProps as EmbeddableWorkflowRootProps, FluidGridsClientConfig as EmbeddableClientConfig, FluidGridsConfig as EmbeddableConfig, WorkflowDefinition, WorkflowData, FlowNode, FlowEdge, NodeManifest, } from '@burdenoff/fluidgrids-fe-sdk';
7
+ export { useNodeEndpoints, useNodeEndpoint, useNodeManifest, useLazyNodeManifest, fetchAllNodesWithManifests, useWorkflowDefinitions, useWorkflowDefinition, useLazyWorkflowDefinition, useWorkflowVersions, useCreateWorkflow, useUpdateWorkflow, useCreateWorkflowVersion, useDeleteWorkflow, useDuplicateWorkflow, useTriggerWorkflow, useWorkflowRuns, useWorkflowRun, useDashboardSummary, WorkflowsList, WorkflowBuilderPage, ExecutionsListPage, ExecutionDetailPage, HistoryPage, TemplatesPage, NodesPage, SettingsPage, setFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, isFluidGridsClientReady, waitForFluidGridsClient, resetFluidGridsClient, } from '@burdenoff/fluidgrids-fe-sdk';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAQhD,OAAO,EACL,eAAe,IAAI,yBAAyB,EAC5C,mBAAmB,IAAI,6BAA6B,EACpD,kBAAkB,IAAI,0BAA0B,EAChD,cAAc,IAAI,sBAAsB,EACxC,oBAAoB,IAAI,oBAAoB,EAC5C,YAAY,IAAI,sBAAsB,EACtC,sBAAsB,IAAI,sBAAsB,EAChD,mBAAmB,IAAI,mBAAmB,EAC1C,mBAAmB,IAAI,mBAAmB,EAC1C,mBAAmB,IAAI,mBAAmB,EAC1C,EAAE,GACH,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,oBAAoB,IAAI,8BAA8B,EACtD,wBAAwB,IAAI,kCAAkC,EAC9D,uBAAuB,IAAI,+BAA+B,EAC1D,mBAAmB,IAAI,2BAA2B,EAClD,sBAAsB,IAAI,sBAAsB,EAChD,gBAAgB,IAAI,gBAAgB,EACpC,kBAAkB,EAClB,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,YAAY,GACb,MAAM,8BAA8B,CAAC;AAStC,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+ import { WorkflowsRootProps } from '../WorkflowsRoot';
3
+
4
+ export declare function WorkflowsProvider({ children, ...props }: WorkflowsRootProps & {
5
+ children: ReactNode;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ export declare function useWorkflowsContext(): WorkflowsRootProps;
8
+ //# sourceMappingURL=WorkflowsProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsProvider.d.ts","sourceRoot":"","sources":["../../src/providers/WorkflowsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkD,SAAS,EAAE,MAAM,OAAO,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AA6B3D,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,kBAAkB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CA0G9C;AAED,wBAAgB,mBAAmB,uBAMlC"}
@@ -0,0 +1,71 @@
1
+ import { setWorkflowsConfig as e } from "../config/index.js";
2
+ import { useWorkflowsTranslation as t } from "../i18n.js";
3
+ import { createContext as n, useEffect as r, useState as i } from "react";
4
+ import { resetFluidGridsClient as a, resetGlobalStoreClient as o, setFluidGridsClient as s, setFluidGridsConfig as c, setGlobalStoreClient as l } from "@burdenoff/fluidgrids-fe-sdk";
5
+ import { useGatewayClient as u } from "@burdenoff/fe-libs/shared/graphql";
6
+ import { PermissionProvider as d } from "@burdenoff/fe-libs/shared/providers/shell";
7
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
8
+ //#region src/providers/WorkflowsProvider.tsx
9
+ var m = n(null);
10
+ function h(e) {
11
+ let t = e.endsWith("/") ? e.slice(0, -1) : e;
12
+ return t.endsWith("/graphql") ? t : `${t}/workspaces/graphql`;
13
+ }
14
+ function g({ children: n, ...g }) {
15
+ let _ = t(), v = u("workspace"), y = u("global"), [b, x] = i(!1);
16
+ return r(() => (v && y && (s(v), l(y), x(!0)), () => {
17
+ a(), o(), x(!1);
18
+ }), [v, y]), r(() => {
19
+ if (g.apiGatewayUrl) {
20
+ let t = h(g.apiGatewayUrl), n = g.apiGatewayUrl.endsWith("/") ? g.apiGatewayUrl.slice(0, -1) : g.apiGatewayUrl;
21
+ e({
22
+ workflowSvcUrl: t,
23
+ apiGatewayUrl: n
24
+ }), c({
25
+ apiGatewayUrl: n,
26
+ authToken: g.authToken,
27
+ workspaceId: g.workspaceId ?? "",
28
+ tenantId: g.tenantId,
29
+ productId: g.productId,
30
+ productName: g.productName
31
+ });
32
+ }
33
+ }, [
34
+ g.apiGatewayUrl,
35
+ g.authToken,
36
+ g.workspaceId,
37
+ g.tenantId,
38
+ g.productId,
39
+ g.productName
40
+ ]), g.workspaceId ? b ? /* @__PURE__ */ f(m.Provider, {
41
+ value: g,
42
+ children: /* @__PURE__ */ f(d, {
43
+ scopeId: g.workspaceId ?? null,
44
+ gateway: "workspace",
45
+ children: n
46
+ })
47
+ }) : /* @__PURE__ */ p("div", {
48
+ className: "flex h-full min-h-[200px] w-full flex-col items-center justify-center gap-3 px-6 text-center",
49
+ role: "status",
50
+ "aria-live": "polite",
51
+ "aria-label": _("workflows.provider.loading.ariaLabel", "Loading workflows"),
52
+ children: [/* @__PURE__ */ f("div", { className: "h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" }), /* @__PURE__ */ f("p", {
53
+ className: "text-sm text-text-secondary",
54
+ children: _("workflows.provider.loading.message", "Connecting workflows...")
55
+ })]
56
+ }) : /* @__PURE__ */ f("div", {
57
+ className: "flex h-full min-h-[200px] w-full items-center justify-center px-6 text-center",
58
+ children: /* @__PURE__ */ p("div", {
59
+ className: "max-w-md",
60
+ children: [/* @__PURE__ */ f("h2", {
61
+ className: "mb-2 text-lg font-semibold text-text-primary",
62
+ children: _("workflows.provider.workspaceRequired.title", "Workspace context required")
63
+ }), /* @__PURE__ */ f("p", {
64
+ className: "text-sm text-text-secondary",
65
+ children: _("workflows.provider.workspaceRequired.description", "This workflows module needs an active workspace before it can load workflow data.")
66
+ })]
67
+ })
68
+ });
69
+ }
70
+ //#endregion
71
+ export { g as WorkflowsProvider };
@@ -0,0 +1,3 @@
1
+ export { getPlatform, isNative, isIOS, isAndroid, isWeb, nativeImpact, nativeNotify, nativeToast, nativeConfirm, nativeCopyText, nativeShare, nativeOpenUrl, useNativePlatform, useSafeArea, useNativeKeyboard, useAppState, useDeviceInfo, useHaptics, useStatusBar, } from '@burdenoff/fe-libs/shared/native';
2
+ export type { BurdenoffNativePlatform, BurdenoffNativeBridge, SafeAreaInsets, DeviceInfo, HapticImpactStyle, HapticNotificationType, ToastDuration, ConfirmOptions, ShareOptions, AppState, StatusBarTheme, } from '@burdenoff/fe-libs/shared/native';
3
+ //# sourceMappingURL=nativeBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeBridge.d.ts","sourceRoot":"","sources":["../../src/utils/nativeBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,QAAQ,EACR,KAAK,EACL,SAAS,EACT,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,cAAc,GACf,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { config as e, resetWorkflowsConfig as t, setWorkflowsConfig as n } from "./config/index.js";
2
+ import { WorkflowsRoot as r } from "./WorkflowsRoot.js";
3
+ import { ExecutionDetailPage as i, ExecutionsListPage as a, FluidGridsProvider as o, FluidGridsRoot as s, HistoryPage as c, NodesPage as l, SettingsPage as u, TemplatesPage as d, WorkflowBuilder as f, WorkflowBuilderCore as p, WorkflowBuilderPage as m, WorkflowsList as h, cn as g, createFluidGridsClient as _, fetchAllNodesWithManifests as v, getFluidGridsClient as y, getFluidGridsClient as b, getFluidGridsClientSafe as x, isFluidGridsClientReady as S, resetFluidGridsClient as C, setFluidGridsClient as w, setFluidGridsClient as T, setFluidGridsConfig as E, useCreateWorkflow as D, useCreateWorkflowVersion as O, useDashboardSummary as k, useDeleteWorkflow as A, useDuplicateWorkflow as j, useFlowStore as M, useFluidGridsContext as N, useLazyNodeManifest as P, useLazyWorkflowDefinition as F, useNodeEndpoint as I, useNodeEndpoints as L, useNodeManifest as R, useTriggerWorkflow as z, useUpdateWorkflow as B, useWorkflowDefinition as V, useWorkflowDefinitions as H, useWorkflowRun as U, useWorkflowRuns as W, useWorkflowVersions as G, waitForFluidGridsClient as K } from "@burdenoff/fluidgrids-fe-sdk";
4
+ export { f as EmbeddableWorkflowBuilder, p as EmbeddableWorkflowBuilderCore, o as EmbeddableWorkflowProvider, s as EmbeddableWorkflowRoot, i as ExecutionDetailPage, a as ExecutionsListPage, c as HistoryPage, l as NodesPage, u as SettingsPage, d as TemplatesPage, m as WorkflowBuilderPage, h as WorkflowsList, r as WorkflowsRoot, g as cn, e as config, _ as createEmbeddableClient, v as fetchAllNodesWithManifests, b as getEmbeddableClient, y as getFluidGridsClient, x as getFluidGridsClientSafe, S as isFluidGridsClientReady, C as resetFluidGridsClient, t as resetWorkflowsConfig, T as setEmbeddableClient, E as setEmbeddableConfig, w as setFluidGridsClient, n as setWorkflowsConfig, D as useCreateWorkflow, O as useCreateWorkflowVersion, k as useDashboardSummary, A as useDeleteWorkflow, j as useDuplicateWorkflow, N as useEmbeddableContext, M as useEmbeddableFlowStore, P as useLazyNodeManifest, F as useLazyWorkflowDefinition, I as useNodeEndpoint, L as useNodeEndpoints, R as useNodeManifest, z as useTriggerWorkflow, B as useUpdateWorkflow, V as useWorkflowDefinition, H as useWorkflowDefinitions, U as useWorkflowRun, W as useWorkflowRuns, G as useWorkflowVersions, K as waitForFluidGridsClient };
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@burdenoff/microfe-workflows",
3
+ "version": "2026.510.108",
4
+ "description": "Workflows microfrontend for Burdenoff products - thin shell over @burdenoff/fluidgrids-fe-sdk",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/workflows.js"
10
+ }
11
+ },
12
+ "scripts": {
13
+ "dev": "vite",
14
+ "build": "tsc && vite build",
15
+ "lint": "eslint .",
16
+ "lint:sanity": "if [ \"${CI:-}\" = \"true\" ]; then bun run lint; else bun run lint -- --cache --cache-location .eslintcache; fi",
17
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
18
+ "type:check": "tsc --noEmit",
19
+ "sanity": "bun run codegen && bun run lint:sanity && bun run format && bun run build",
20
+ "schema:pull": "echo \"No GraphQL operations — skipping schema:pull\"",
21
+ "codegen": "echo \"No GraphQL operations — skipping codegen\"",
22
+ "codegen:all": "echo \"No GraphQL operations — skipping codegen:all\"",
23
+ "switch:status": "bun scripts/deps-mode.ts status",
24
+ "switch:remote": "bun scripts/deps-mode.ts remote",
25
+ "switch:local": "bun scripts/deps-mode.ts local",
26
+ "switch:check": "bun scripts/deps-mode.ts check",
27
+ "prepare": "lefthook install || true",
28
+ "format:check": "prettier --check \"src/**/*.{ts,tsx}\""
29
+ },
30
+ "dependencies": {
31
+ "@burdenoff/fe-libs": "2026.507.125",
32
+ "lucide-react": "^0.468.0",
33
+ "react": "^19.0.0",
34
+ "react-dom": "^19.0.0",
35
+ "react-router-dom": "^7.1.3"
36
+ },
37
+ "devDependencies": {
38
+ "@burdenoff/fluidgrids-fe-sdk": "2026.509.104",
39
+ "@eslint/js": "^9.39.2",
40
+ "@types/react": "^19.0.2",
41
+ "@types/react-dom": "^19.0.2",
42
+ "@vitejs/plugin-react": "^4.3.4",
43
+ "autoprefixer": "^10.4.20",
44
+ "eslint": "^9.18.0",
45
+ "eslint-plugin-react": "^7.37.5",
46
+ "eslint-plugin-react-hooks": "^7.0.1",
47
+ "globals": "^17.3.0",
48
+ "lefthook": "^2.1.1",
49
+ "postcss": "^8.4.49",
50
+ "prettier": "^3.4.2",
51
+ "tailwindcss": "^4.0.0",
52
+ "typescript": "^5.9.0",
53
+ "typescript-eslint": "^8.54.0",
54
+ "vite": "8.0.8",
55
+ "vite-plugin-dts": "3.9.1"
56
+ },
57
+ "peerDependencies": {
58
+ "@burdenoff/fluidgrids-fe-sdk": "2026.509.104",
59
+ "react": "^19.0.0",
60
+ "react-dom": "^19.0.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "@burdenoff/fluidgrids-fe-sdk": {
64
+ "optional": true
65
+ }
66
+ },
67
+ "main": "./dist/workflows.js",
68
+ "types": "./dist/index.d.ts",
69
+ "files": [
70
+ "dist",
71
+ "package.json",
72
+ "README.md"
73
+ ],
74
+ "publishConfig": {
75
+ "access": "restricted"
76
+ },
77
+ "overrides": {
78
+ "lodash": ">=4.17.21",
79
+ "lodash-es": ">=4.17.21",
80
+ "dompurify": ">=3.3.4",
81
+ "fast-xml-parser": ">=4.5.5",
82
+ "@xmldom/xmldom": ">=0.8.12",
83
+ "swiper": ">=12.1.2",
84
+ "brace-expansion": ">=1.1.13",
85
+ "follow-redirects": ">=1.15.12",
86
+ "smol-toml": ">=1.6.1",
87
+ "axios": ">=1.15.0",
88
+ "flatted": ">=3.4.1",
89
+ "yaml": ">=2.8.3",
90
+ "picomatch": ">=2.3.2",
91
+ "immutable": ">=3.8.3",
92
+ "minimatch": ">=3.1.3"
93
+ }
94
+ }