@loopstack/loopstack-studio 0.23.0 → 0.23.1

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 (35) hide show
  1. package/dist/components/dynamic-form/Form.js +50 -27
  2. package/dist/components/dynamic-form/InputController.js +3 -1
  3. package/dist/components/dynamic-form/fields/MarkdownViewField.js +20 -0
  4. package/dist/features/code-explorer/components/CodeExplorerTreeNode.js +80 -4
  5. package/dist/features/code-explorer/components/FileTabsBar.js +3 -190
  6. package/dist/features/code-explorer/components/FileTabsBarBase.js +190 -0
  7. package/dist/features/code-explorer/index.js +2 -2
  8. package/dist/features/code-explorer/providers/CodeExplorerProvider.js +2 -162
  9. package/dist/features/code-explorer/utils/fileIcons.js +7 -4
  10. package/dist/features/debug/components/PipelineFlowViewer.js +46 -45
  11. package/dist/features/debug/components/pipeline-flow/WorkflowGraph.js +19 -19
  12. package/dist/features/documents/DocumentRenderer.js +20 -15
  13. package/dist/features/documents/renderers/ClaudeMessage.js +96 -0
  14. package/dist/features/workbench/Workbench.js +64 -80
  15. package/dist/features/workbench/WorkflowItem.js +5 -5
  16. package/dist/features/workbench/components/RemoteFileTabsBar.js +18 -0
  17. package/dist/features/workbench/components/RemoteFileTree.js +90 -0
  18. package/dist/features/workbench/components/WorkbenchFilesPanel.js +60 -0
  19. package/dist/features/workbench/components/WorkbenchFlowPanel.js +2 -2
  20. package/dist/features/workbench/components/WorkbenchIconSidebar.js +37 -29
  21. package/dist/features/workbench/hooks/useWorkflowData.js +4 -4
  22. package/dist/features/workbench/providers/RemoteFileExplorerProvider.js +145 -0
  23. package/dist/features/workbench/providers/WorkbenchLayoutProvider.js +46 -43
  24. package/dist/features/workspaces/components/PipelineForm.js +1 -1
  25. package/dist/features/workspaces/components/WorkspaceHomePage.js +93 -0
  26. package/dist/hooks/useFiles.js +1 -43
  27. package/dist/index.d.ts +6 -0
  28. package/dist/index.js +2 -1
  29. package/dist/node_modules/@xyflow/react/dist/esm/index.js +1 -1
  30. package/dist/pages/PipelineDebugPage.js +1 -1
  31. package/dist/pages/PreviewWorkbenchPage.js +167 -70
  32. package/dist/pages/WorkspacePage.js +102 -50
  33. package/dist/pages/WorkspaceRunsPage.js +71 -0
  34. package/dist/routing/LocalRouter.js +6 -0
  35. package/package.json +2 -2
@@ -0,0 +1,145 @@
1
+ import { c } from "react/compiler-runtime";
2
+ import { createContext, useCallback, useContext, useMemo, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
5
+ var RemoteFileExplorerContext = createContext(null);
6
+ function RemoteFileExplorerProvider(s) {
7
+ let l = c(45), { children: u } = s, d = useQueryClient(), f;
8
+ l[0] === Symbol.for("react.memo_cache_sentinel") ? (f = /* @__PURE__ */ new Set(), l[0] = f) : f = l[0];
9
+ let [p, m] = useState(f), h;
10
+ l[1] === Symbol.for("react.memo_cache_sentinel") ? (h = [], l[1] = h) : h = l[1];
11
+ let [g, _] = useState(h), [v, y] = useState(null), b;
12
+ l[2] === Symbol.for("react.memo_cache_sentinel") ? (b = {
13
+ queryKey: ["remote-agent-file-tree"],
14
+ queryFn: _temp,
15
+ staleTime: 3e4
16
+ }, l[2] = b) : b = l[2];
17
+ let x = useQuery(b), S = v?.path, C;
18
+ l[3] === S ? C = l[4] : (C = ["remote-agent-file-content", S], l[3] = S, l[4] = C);
19
+ let w;
20
+ l[5] === v ? w = l[6] : (w = async () => {
21
+ let e = new URL("http://localhost:8000/api/v1/files/read");
22
+ e.searchParams.set("path", v.path);
23
+ let s = await fetch(e.toString(), { credentials: "include" });
24
+ if (!s.ok) {
25
+ let e = await s.text();
26
+ throw Error(`Failed to read file (${s.status}): ${e}`);
27
+ }
28
+ return (await s.json()).content;
29
+ }, l[5] = v, l[6] = w);
30
+ let T = !!v && v.type === "file", E;
31
+ l[7] !== C || l[8] !== w || l[9] !== T ? (E = {
32
+ queryKey: C,
33
+ queryFn: w,
34
+ enabled: T,
35
+ staleTime: 15e3
36
+ }, l[7] = C, l[8] = w, l[9] = T, l[10] = E) : E = l[10];
37
+ let D = useQuery(E), O;
38
+ l[11] === Symbol.for("react.memo_cache_sentinel") ? (O = (e) => {
39
+ m((s) => {
40
+ let l = new Set(s);
41
+ return l.has(e) ? l.delete(e) : l.add(e), l;
42
+ });
43
+ }, l[11] = O) : O = l[11];
44
+ let k = O, A;
45
+ l[12] === Symbol.for("react.memo_cache_sentinel") ? (A = (e) => {
46
+ e.type === "file" && (y(e), _((s) => s.some((s) => s.path === e.path) ? s : [...s, e]));
47
+ }, l[12] = A) : A = l[12];
48
+ let j = A, M;
49
+ l[13] === v?.path ? M = l[14] : (M = (e) => {
50
+ _((s) => {
51
+ let l = s.filter((s) => s.path !== e.path);
52
+ if (v?.path === e.path) if (l.length > 0) {
53
+ let u = s.findIndex((s) => s.path === e.path);
54
+ y(l[Math.max(0, u - 1)]);
55
+ } else y(null);
56
+ return l;
57
+ });
58
+ }, l[13] = v?.path, l[14] = M);
59
+ let N = M, P;
60
+ l[15] === v ? P = l[16] : (P = () => {
61
+ v && _((e) => {
62
+ let s = e.filter((e) => e.path !== v.path);
63
+ if (s.length > 0) {
64
+ let l = e.findIndex((e) => e.path === v.path);
65
+ y(s[Math.max(0, l - 1)]);
66
+ } else y(null);
67
+ return s;
68
+ });
69
+ }, l[15] = v, l[16] = P);
70
+ let F = P, I;
71
+ l[17] === Symbol.for("react.memo_cache_sentinel") ? (I = () => {
72
+ _([]), y(null);
73
+ }, l[17] = I) : I = l[17];
74
+ let L = I, R;
75
+ l[18] === Symbol.for("react.memo_cache_sentinel") ? (R = (e) => {
76
+ _([e]), y(e);
77
+ }, l[18] = R) : R = l[18];
78
+ let z = R, B;
79
+ l[19] === v ? B = l[20] : (B = (e) => {
80
+ _((s) => {
81
+ let l = s.findIndex((s) => s.path === e.path);
82
+ if (l <= 0) return s;
83
+ let u = s.slice(l);
84
+ return v && s.findIndex((e) => e.path === v.path) < l && y(e), u;
85
+ });
86
+ }, l[19] = v, l[20] = B);
87
+ let V = B, H;
88
+ l[21] === v ? H = l[22] : (H = (e) => {
89
+ _((s) => {
90
+ let l = s.findIndex((s) => s.path === e.path);
91
+ if (l < 0 || l >= s.length - 1) return s;
92
+ let u = s.slice(0, l + 1);
93
+ return v && s.findIndex((e) => e.path === v.path) > l && y(e), u;
94
+ });
95
+ }, l[21] = v, l[22] = H);
96
+ let U = H, W;
97
+ l[23] === d ? W = l[24] : (W = () => {
98
+ d.invalidateQueries({ queryKey: ["remote-agent-file-tree"] });
99
+ }, l[23] = d, l[24] = W);
100
+ let G = W, K;
101
+ l[25] === x.data ? K = l[26] : (K = x.data ?? [], l[25] = x.data, l[26] = K);
102
+ let q = x.isLoading && !x.data, J = D.data ?? null, Y = D.isLoading && !!v, X;
103
+ l[27] !== F || l[28] !== N || l[29] !== V || l[30] !== U || l[31] !== p || l[32] !== g || l[33] !== G || l[34] !== v || l[35] !== K || l[36] !== q || l[37] !== J || l[38] !== Y || l[39] !== x.error || l[40] !== x.isFetching ? (X = {
104
+ nodes: K,
105
+ isTreeLoading: q,
106
+ treeError: x.error,
107
+ openFiles: g,
108
+ selectedFile: v,
109
+ fileContent: J,
110
+ isContentLoading: Y,
111
+ expandedFolders: p,
112
+ toggleFolder: k,
113
+ selectFile: j,
114
+ closeFile: N,
115
+ closeAll: L,
116
+ closeOthers: z,
117
+ closeToLeft: V,
118
+ closeToRight: U,
119
+ clearSelection: F,
120
+ refreshTree: G,
121
+ isFetchingTree: x.isFetching
122
+ }, l[27] = F, l[28] = N, l[29] = V, l[30] = U, l[31] = p, l[32] = g, l[33] = G, l[34] = v, l[35] = K, l[36] = q, l[37] = J, l[38] = Y, l[39] = x.error, l[40] = x.isFetching, l[41] = X) : X = l[41];
123
+ let Z = X, Q;
124
+ return l[42] !== u || l[43] !== Z ? (Q = /* @__PURE__ */ jsx(RemoteFileExplorerContext.Provider, {
125
+ value: Z,
126
+ children: u
127
+ }), l[42] = u, l[43] = Z, l[44] = Q) : Q = l[44], Q;
128
+ }
129
+ async function _temp() {
130
+ let e = await fetch("http://localhost:8000/api/v1/files/tree?path=./src", { credentials: "include" });
131
+ if (!e.ok) {
132
+ let s = await e.text();
133
+ throw Error(`Failed to load file tree (${e.status}): ${s}`);
134
+ }
135
+ return await e.json();
136
+ }
137
+ function useRemoteFileExplorer() {
138
+ let e = useContext(RemoteFileExplorerContext);
139
+ if (!e) throw Error("useRemoteFileExplorer must be used within RemoteFileExplorerProvider");
140
+ return e;
141
+ }
142
+ function useOptionalRemoteFileExplorer() {
143
+ return useContext(RemoteFileExplorerContext);
144
+ }
145
+ export { RemoteFileExplorerProvider, useOptionalRemoteFileExplorer, useRemoteFileExplorer };
@@ -3,74 +3,77 @@ import { createContext, useCallback, useContext, useMemo, useState } from "react
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  var WorkbenchLayoutContext = createContext(null);
5
5
  function WorkbenchLayoutProvider(a) {
6
- let o = c(39), { children: s, pipeline: l, isDeveloperMode: u, workspaceConfig: d, getPreviewUrl: f, getEnvironmentPreviewUrl: p, environments: m, previewPanelOpen: h, onPreviewPanelOpenChange: g } = a, _ = u === void 0 ? !1 : u, [v, y] = useState(null), [b, x] = useState(null), [S, C] = useState("preview"), [w, T] = useState(null), [E, D] = useState(""), O = h !== void 0, k = O ? h ? b ?? "preview" : null : b, A = d?.features?.previewPanel?.enabled ?? !1, j;
6
+ let o = c(44), { children: s, pipeline: l, isDeveloperMode: u, workspaceConfig: d, getPreviewUrl: f, getEnvironmentPreviewUrl: p, environments: m, previewPanelOpen: h, onPreviewPanelOpenChange: g } = a, _ = u === void 0 ? !1 : u, [v, y] = useState(null), [b, x] = useState(null), [S, C] = useState("preview"), [w, T] = useState(null), [E, D] = useState(""), O = h !== void 0, k = O ? h ? b ?? "preview" : null : b, A = d?.features?.previewPanel?.enabled ?? !1, j;
7
7
  o[0] === m ? j = o[1] : (j = m === void 0 || m.some(_temp), o[0] = m, o[1] = j);
8
- let M = A && j, N = k !== null, P;
9
- o[2] !== O || o[3] !== g ? (P = (t) => {
10
- O && g?.(t !== null), x(t);
11
- }, o[2] = O, o[3] = g, o[4] = P) : P = o[4];
12
- let F = P, I;
13
- o[5] === F ? I = o[6] : (I = (t) => {
14
- y((a) => a === t ? null : t), F(null);
15
- }, o[5] = F, o[6] = I);
8
+ let M = A && j, N;
9
+ o[2] !== m?.[0]?.slotId || o[3] !== d?.features?.fileExplorer?.enabled || o[4] !== d?.features?.fileExplorer?.environments ? (N = d?.features?.fileExplorer?.enabled && d?.features?.fileExplorer?.environments?.includes(m?.[0]?.slotId ?? ""), o[2] = m?.[0]?.slotId, o[3] = d?.features?.fileExplorer?.enabled, o[4] = d?.features?.fileExplorer?.environments, o[5] = N) : N = o[5];
10
+ let P = N, F = k !== null, I;
11
+ o[6] !== O || o[7] !== g ? (I = (e) => {
12
+ O && g?.(e !== null), x(e);
13
+ }, o[6] = O, o[7] = g, o[8] = I) : I = o[8];
16
14
  let L = I, R;
17
- o[7] === Symbol.for("react.memo_cache_sentinel") ? (R = () => {
18
- y(null);
19
- }, o[7] = R) : R = o[7];
15
+ o[9] === L ? R = o[10] : (R = (e) => {
16
+ y((a) => a === e ? null : e), L(null);
17
+ }, o[9] = L, o[10] = R);
20
18
  let z = R, B;
21
- o[8] !== k || o[9] !== F ? (B = (t) => {
22
- let a = k === t ? null : t;
23
- F(a), a && y(null);
24
- }, o[8] = k, o[9] = F, o[10] = B) : B = o[10];
19
+ o[11] === Symbol.for("react.memo_cache_sentinel") ? (B = () => {
20
+ y(null);
21
+ }, o[11] = B) : B = o[11];
25
22
  let V = B, H;
26
- o[11] === F ? H = o[12] : (H = () => {
27
- F(null);
28
- }, o[11] = F, o[12] = H);
23
+ o[12] !== k || o[13] !== L ? (H = (e) => {
24
+ let a = k === e ? null : e;
25
+ L(a), a && y(null);
26
+ }, o[12] = k, o[13] = L, o[14] = H) : H = o[14];
29
27
  let U = H, W;
30
- o[13] === F ? W = o[14] : (W = (t) => {
31
- D(t), F("preview"), y(null);
32
- }, o[13] = F, o[14] = W);
28
+ o[15] === L ? W = o[16] : (W = () => {
29
+ L(null);
30
+ }, o[15] = L, o[16] = W);
33
31
  let G = W, K;
34
- o[15] === V ? K = o[16] : (K = () => {
35
- V("preview");
36
- }, o[15] = V, o[16] = K);
32
+ o[17] === L ? K = o[18] : (K = (e) => {
33
+ D(e), L("preview"), y(null);
34
+ }, o[17] = L, o[18] = K);
37
35
  let q = K, J;
38
- o[17] !== v || o[18] !== S || o[19] !== w || o[20] !== k || o[21] !== U || o[22] !== m || o[23] !== p || o[24] !== f || o[25] !== _ || o[26] !== G || o[27] !== l || o[28] !== M || o[29] !== N || o[30] !== E || o[31] !== L || o[32] !== q || o[33] !== V || o[34] !== d ? (J = {
36
+ o[19] === U ? J = o[20] : (J = () => {
37
+ U("preview");
38
+ }, o[19] = U, o[20] = J);
39
+ let Y = J, X = P ?? !1, Z;
40
+ o[21] !== v || o[22] !== S || o[23] !== w || o[24] !== k || o[25] !== G || o[26] !== m || o[27] !== p || o[28] !== f || o[29] !== _ || o[30] !== q || o[31] !== l || o[32] !== M || o[33] !== F || o[34] !== E || o[35] !== X || o[36] !== z || o[37] !== Y || o[38] !== U || o[39] !== d ? (Z = {
39
41
  pipeline: l,
40
42
  previewPanelEnabled: M,
43
+ fileExplorerEnabled: X,
41
44
  isDeveloperMode: _,
42
45
  workspaceConfig: d,
43
46
  getPreviewUrl: f,
44
47
  getEnvironmentPreviewUrl: p,
45
48
  environments: m,
46
49
  activeFloatingPanel: v,
47
- toggleFloatingPanel: L,
48
- closeFloatingPanel: z,
50
+ toggleFloatingPanel: z,
51
+ closeFloatingPanel: V,
49
52
  activeSidePanel: k,
50
- toggleSidePanel: V,
51
- closeSidePanel: U,
53
+ toggleSidePanel: U,
54
+ closeSidePanel: G,
52
55
  selectedSlotId: E,
53
56
  setSelectedSlotId: D,
54
- openPreviewWithEnvironment: G,
55
- previewPanelOpen: N,
56
- togglePreviewPanel: q,
57
+ openPreviewWithEnvironment: q,
58
+ previewPanelOpen: F,
59
+ togglePreviewPanel: Y,
57
60
  activePreviewTab: S,
58
61
  setActivePreviewTab: C,
59
62
  activeSectionId: w,
60
63
  setActiveSectionId: T
61
- }, o[17] = v, o[18] = S, o[19] = w, o[20] = k, o[21] = U, o[22] = m, o[23] = p, o[24] = f, o[25] = _, o[26] = G, o[27] = l, o[28] = M, o[29] = N, o[30] = E, o[31] = L, o[32] = q, o[33] = V, o[34] = d, o[35] = J) : J = o[35];
62
- let Y = J, X;
63
- return o[36] !== s || o[37] !== Y ? (X = /* @__PURE__ */ jsx(WorkbenchLayoutContext.Provider, {
64
- value: Y,
64
+ }, o[21] = v, o[22] = S, o[23] = w, o[24] = k, o[25] = G, o[26] = m, o[27] = p, o[28] = f, o[29] = _, o[30] = q, o[31] = l, o[32] = M, o[33] = F, o[34] = E, o[35] = X, o[36] = z, o[37] = Y, o[38] = U, o[39] = d, o[40] = Z) : Z = o[40];
65
+ let Q = Z, $;
66
+ return o[41] !== s || o[42] !== Q ? ($ = /* @__PURE__ */ jsx(WorkbenchLayoutContext.Provider, {
67
+ value: Q,
65
68
  children: s
66
- }), o[36] = s, o[37] = Y, o[38] = X) : X = o[38], X;
69
+ }), o[41] = s, o[42] = Q, o[43] = $) : $ = o[43], $;
67
70
  }
68
- function _temp(t) {
69
- return !!t.connectionUrl && (!!t.workerId || t.local);
71
+ function _temp(e) {
72
+ return !!e.connectionUrl && (!!e.workerId || e.local);
70
73
  }
71
74
  function useWorkbenchLayout() {
72
- let t = useContext(WorkbenchLayoutContext);
73
- if (!t) throw Error("useWorkbenchLayout must be used within a WorkbenchLayoutProvider");
74
- return t;
75
+ let e = useContext(WorkbenchLayoutContext);
76
+ if (!e) throw Error("useWorkbenchLayout must be used within a WorkbenchLayoutProvider");
77
+ return e;
75
78
  }
76
79
  export { WorkbenchLayoutProvider, useWorkbenchLayout };
@@ -2,9 +2,9 @@ import { useStudio } from "../../../providers/StudioProvider.js";
2
2
  import { usePipelineConfig } from "../../../hooks/useConfig.js";
3
3
  import { useCreatePipeline } from "../../../hooks/usePipelines.js";
4
4
  import ErrorSnackbar_default from "../../../components/feedback/ErrorSnackbar.js";
5
+ import { useRunPipeline } from "../../../hooks/useProcessor.js";
5
6
  import ArgumentsView_default from "./pipeline-form/ArgumentsView.js";
6
7
  import SelectionView_default from "./pipeline-form/SelectionView.js";
7
- import { useRunPipeline } from "../../../hooks/useProcessor.js";
8
8
  import { c } from "react/compiler-runtime";
9
9
  import { useEffect, useMemo, useState } from "react";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -0,0 +1,93 @@
1
+ import { useStudio } from "../../../providers/StudioProvider.js";
2
+ import { useCreatePipeline } from "../../../hooks/usePipelines.js";
3
+ import { Button } from "../../../components/ui/button.js";
4
+ import ErrorSnackbar_default from "../../../components/feedback/ErrorSnackbar.js";
5
+ import Form_default from "../../../components/dynamic-form/Form.js";
6
+ import { useRunPipeline } from "../../../hooks/useProcessor.js";
7
+ import { c } from "react/compiler-runtime";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Loader2, Play } from "lucide-react";
10
+ import { useForm } from "react-hook-form";
11
+ var WorkspaceHomePage_default = (p) => {
12
+ let m = c(39), { workspace: h, action: g } = p, { router: _ } = useStudio(), v = useCreatePipeline(), y = useRunPipeline(), b;
13
+ m[0] === g.options ? b = m[1] : (b = g.options ?? {}, m[0] = g.options, m[1] = b);
14
+ let x = b, S = x.workflow, C = x.title, w = x.subtitle, T = x.schema, E = x.pipelineUi, D;
15
+ m[2] === Symbol.for("react.memo_cache_sentinel") ? (D = {
16
+ defaultValues: {},
17
+ mode: "onChange"
18
+ }, m[2] = D) : D = m[2];
19
+ let O = useForm(D), k = v.isPending || y.isPending, A = !!T, j;
20
+ m[3] !== v || m[4] !== A || m[5] !== _ || m[6] !== y || m[7] !== S || m[8] !== h ? (j = (t) => {
21
+ v.mutate({ pipelineCreateDto: {
22
+ blockName: S,
23
+ title: null,
24
+ workspaceId: h.id,
25
+ transition: null,
26
+ args: A ? t : void 0
27
+ } }, { onSuccess: (t) => {
28
+ y.mutate({
29
+ pipelineId: t.id,
30
+ runPipelinePayloadDto: {},
31
+ force: !0
32
+ }, { onSuccess: () => {
33
+ _.navigateToPipeline(t.id);
34
+ } });
35
+ } });
36
+ }, m[3] = v, m[4] = A, m[5] = _, m[6] = y, m[7] = S, m[8] = h, m[9] = j) : j = m[9];
37
+ let M = j, N;
38
+ m[10] !== O || m[11] !== M ? (N = () => {
39
+ O.handleSubmit(M)();
40
+ }, m[10] = O, m[11] = M, m[12] = N) : N = m[12];
41
+ let P = N, F;
42
+ m[13] === v.error ? F = m[14] : (F = /* @__PURE__ */ jsx(ErrorSnackbar_default, { error: v.error }), m[13] = v.error, m[14] = F);
43
+ let I;
44
+ m[15] === y.error ? I = m[16] : (I = /* @__PURE__ */ jsx(ErrorSnackbar_default, { error: y.error }), m[15] = y.error, m[16] = I);
45
+ let L;
46
+ m[17] === C ? L = m[18] : (L = C && /* @__PURE__ */ jsx("h2", {
47
+ className: "mb-2 text-center text-3xl font-bold tracking-tight",
48
+ children: C
49
+ }), m[17] = C, m[18] = L);
50
+ let R;
51
+ m[19] === w ? R = m[20] : (R = w && /* @__PURE__ */ jsx("p", {
52
+ className: "text-muted-foreground mb-8 text-center text-sm",
53
+ children: w
54
+ }), m[19] = w, m[20] = R);
55
+ let z;
56
+ m[21] !== O || m[22] !== A || m[23] !== E || m[24] !== T ? (z = A ? /* @__PURE__ */ jsx("div", {
57
+ className: "mb-6 w-full",
58
+ children: /* @__PURE__ */ jsx(Form_default, {
59
+ form: O,
60
+ schema: T,
61
+ ui: E,
62
+ disabled: !1,
63
+ viewOnly: !1
64
+ })
65
+ }) : null, m[21] = O, m[22] = A, m[23] = E, m[24] = T, m[25] = z) : z = m[25];
66
+ let B;
67
+ m[26] === k ? B = m[27] : (B = k ? /* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Play, { className: "mr-2 h-4 w-4" }), m[26] = k, m[27] = B);
68
+ let V;
69
+ m[28] !== k || m[29] !== P || m[30] !== B ? (V = /* @__PURE__ */ jsx("div", {
70
+ className: "flex w-full justify-end",
71
+ children: /* @__PURE__ */ jsxs(Button, {
72
+ variant: "default",
73
+ disabled: k,
74
+ onClick: P,
75
+ size: "lg",
76
+ className: "font-medium",
77
+ children: [B, "Run"]
78
+ })
79
+ }), m[28] = k, m[29] = P, m[30] = B, m[31] = V) : V = m[31];
80
+ let H;
81
+ return m[32] !== V || m[33] !== F || m[34] !== I || m[35] !== L || m[36] !== R || m[37] !== z ? (H = /* @__PURE__ */ jsxs("div", {
82
+ className: "mx-auto flex min-h-[60vh] max-w-2xl flex-col items-center justify-center",
83
+ children: [
84
+ F,
85
+ I,
86
+ L,
87
+ R,
88
+ z,
89
+ V
90
+ ]
91
+ }), m[32] = V, m[33] = F, m[34] = I, m[35] = L, m[36] = R, m[37] = z, m[38] = H) : H = m[38], H;
92
+ };
93
+ export { WorkspaceHomePage_default as default };
@@ -1,45 +1,3 @@
1
- import { getFileContentCacheKey, getFileTreeCacheKey } from "./query-keys.js";
2
- import { useApiClient } from "./useApi.js";
1
+ import "./useApi.js";
3
2
  import { c } from "react/compiler-runtime";
4
3
  import { useQuery } from "@tanstack/react-query";
5
- function useFileTree(e, a) {
6
- let s = c(10), l = a === void 0 ? !0 : a, { envKey: u, api: d } = useApiClient(), f;
7
- s[0] !== u || s[1] !== e ? (f = getFileTreeCacheKey(u, e), s[0] = u, s[1] = e, s[2] = f) : f = s[2];
8
- let p;
9
- s[3] !== d || s[4] !== e ? (p = () => {
10
- if (!e) throw Error("Pipeline ID is required");
11
- return d.pipelines.getFileTree({ pipelineId: e });
12
- }, s[3] = d, s[4] = e, s[5] = p) : p = s[5];
13
- let m = !!e && l, h;
14
- return s[6] !== f || s[7] !== p || s[8] !== m ? (h = {
15
- queryKey: f,
16
- queryFn: p,
17
- enabled: m,
18
- staleTime: 3e5,
19
- refetchOnMount: !1,
20
- refetchOnWindowFocus: !1,
21
- placeholderData: _temp
22
- }, s[6] = f, s[7] = p, s[8] = m, s[9] = h) : h = s[9], useQuery(h);
23
- }
24
- function _temp(e) {
25
- return e;
26
- }
27
- function useFileContent(i, a, o) {
28
- let s = c(12), l = o === void 0 ? !0 : o, { envKey: u, api: d } = useApiClient(), f;
29
- s[0] !== u || s[1] !== a || s[2] !== i ? (f = getFileContentCacheKey(u, i, a), s[0] = u, s[1] = a, s[2] = i, s[3] = f) : f = s[3];
30
- let p;
31
- s[4] !== d || s[5] !== a || s[6] !== i ? (p = () => {
32
- if (!i || !a) throw Error("Pipeline ID and file path are required");
33
- return d.pipelines.getFileContent({
34
- pipelineId: i,
35
- filePath: a
36
- });
37
- }, s[4] = d, s[5] = a, s[6] = i, s[7] = p) : p = s[7];
38
- let m = !!i && !!a && l, h;
39
- return s[8] !== f || s[9] !== p || s[10] !== m ? (h = {
40
- queryKey: f,
41
- queryFn: p,
42
- enabled: m
43
- }, s[8] = f, s[9] = p, s[10] = m, s[11] = h) : h = s[11], useQuery(h);
44
- }
45
- export { useFileContent, useFileTree };
package/dist/index.d.ts CHANGED
@@ -850,6 +850,8 @@ export declare class LocalRouter implements StudioRouter {
850
850
  navigateToPipelineDebug(pipelineId: string): Promise<void>;
851
851
  navigateToWorkflow(pipelineId: string, workflowId: string, clickId: string | undefined): Promise<void>;
852
852
  navigateToPipelineNamespace(workspaceId: string, pipelineId: string, namespaceId: string): Promise<void>;
853
+ getWorkspaceRuns(workspaceId: string): string;
854
+ navigateToWorkspaceRuns(workspaceId: string): Promise<void>;
853
855
  getEmbedPipeline(pipelineId: string): string;
854
856
  getPreviewPipeline(pipelineId: string): string;
855
857
  getCurrentEnvironmentId(): string;
@@ -1133,6 +1135,8 @@ export declare interface StudioRouter {
1133
1135
  navigateToPipelineDebug(pipelineId: string): Promise<void>;
1134
1136
  navigateToWorkflow(pipelineId: string, workflowId: string, clickId: string | undefined): Promise<void>;
1135
1137
  navigateToPipelineNamespace(workspaceId: string, pipelineId: string, namespaceId: string): Promise<void>;
1138
+ getWorkspaceRuns(workspaceId: string): string;
1139
+ navigateToWorkspaceRuns(workspaceId: string): Promise<void>;
1136
1140
  getEmbedPipeline(pipelineId: string): string;
1137
1141
  getPreviewPipeline(pipelineId: string): string;
1138
1142
  getCurrentEnvironmentId(): string;
@@ -1252,6 +1256,8 @@ export declare function WorkbenchPage({ previewPanelOpen, onPreviewPanelOpenChan
1252
1256
 
1253
1257
  export declare const WorkspacePage: () => JSX.Element;
1254
1258
 
1259
+ export declare const WorkspaceRunsPage: () => JSX.Element;
1260
+
1255
1261
  export declare function WorkspacesPage(): JSX.Element;
1256
1262
 
1257
1263
  export { }
package/dist/index.js CHANGED
@@ -67,6 +67,7 @@ import { EnvironmentSlotSelector } from "./features/workspaces/components/Enviro
67
67
  import CreateWorkspace_default from "./features/workspaces/components/CreateWorkspace.js";
68
68
  import WorkspacesPage from "./pages/WorkspacesPage.js";
69
69
  import WorkspacePage_default from "./pages/WorkspacePage.js";
70
+ import WorkspaceRunsPage_default from "./pages/WorkspaceRunsPage.js";
70
71
  import "./features/workspaces/index.js";
71
72
  import WorkbenchPage from "./pages/WorkbenchPage.js";
72
73
  import PipelineDebugPage_default from "./pages/PipelineDebugPage.js";
@@ -81,4 +82,4 @@ import LocalHealthCheck_default from "./features/health/LocalHealthCheck.js";
81
82
  import EnvironmentEmbedRoot from "./app/EnvironmentEmbedRoot.js";
82
83
  import { StudioSidebar } from "./components/layout/StudioSidebar.js";
83
84
  import "./features/health/index.js";
84
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, CompletionMessagePaper_default as CompletionMessagePaper, ComponentOverridesProvider, ConfirmDialog_default as ConfirmDialog, CreateWorkspace_default as CreateWorkspace, CustomListView_default as CustomItemListView, DashboardPage, DataList, DataTable, DataTableBatchAction_default as DataTableBatchActions, DataTableFilters_default as DataTableFilters, DataTablePagination_default as DataTablePagination, DataTableToolbar_default as DataTableToolbar, DebugPage_default as DebugPage, DebugWorkflowDetailsPage, DebugWorkflowsPage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DiscordLogo, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmbedWorkbenchPage, EnvironmentEmbedRoot, EnvironmentSlotSelector, ErrorAlert_default as ErrorAlert, ErrorBoundary, ErrorSnackbar_default as ErrorSnackbar, GoogleLogo, Input, InvalidationEventsProvider, ListView_default as ItemListView, Label, LoadingCentered_default as LoadingCentered, LocalHealthCheck_default as LocalHealthCheck, LocalRouter, MainLayout_default as MainLayout, PageBreadcrumbs_default as PageBreadcrumbs, PipelineDebugPage_default as PipelineDebugPage, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PreviewWorkbenchPage, RadioGroup, RadioGroupItem, RunsListPage, RunsPage, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarInsetDiv, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuDiv, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Snackbar_default as Snackbar, SseProvider, StudioLandingPage, StudioProvider, StudioSidebar, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WorkbenchPage, WorkspacePage_default as WorkspacePage, WorkspacesPage, badgeVariants, buttonVariants, createApiClient, eventBus, getAllWorkflowsCacheKey, getAvailableEnvironmentsCacheKey, getDashboardStatsCacheKey, getDocumentCacheKey, getDocumentsCacheKey, getFileContentCacheKey, getFileTreeCacheKey, getHealthCacheKey, getMeCacheKey, getNamespaceCacheKey, getNamespacesByPipelineCacheKey, getPipelineCacheKey, getPipelineConfigCacheKey, getPipelineSourceCacheKey, getPipelineTypesCacheKey, getPipelinesCacheKey, getPipelinesChildrenCacheKey, getWorkflowCacheKey, getWorkflowsByPipelineCacheKey, getWorkflowsCacheKey, getWorkspaceCacheKey, getWorkspaceTypesCacheKey, getWorkspacesCacheKey, useApiClient, useAvailableEnvironments, useBatchDeletePipeline, useBatchDeleteWorkspaces, useChildPipelines, useComponentOverrides, useCreatePipeline, useCreateWorkspace, useDeletePipeline, useDeleteWorkspace, useFilterPipelines, useFilterWorkspaces, useIsMobile, usePipeline, usePipelineConfig, usePipelineConfigByName, usePipelineSource, useRouter, useSetFavouriteWorkspace, useSidebar, useStudio, useStudioOptional, useUpdatePipeline, useUpdateWorkspace, useWorkspace, useWorkspaceConfig };
85
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, CompletionMessagePaper_default as CompletionMessagePaper, ComponentOverridesProvider, ConfirmDialog_default as ConfirmDialog, CreateWorkspace_default as CreateWorkspace, CustomListView_default as CustomItemListView, DashboardPage, DataList, DataTable, DataTableBatchAction_default as DataTableBatchActions, DataTableFilters_default as DataTableFilters, DataTablePagination_default as DataTablePagination, DataTableToolbar_default as DataTableToolbar, DebugPage_default as DebugPage, DebugWorkflowDetailsPage, DebugWorkflowsPage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DiscordLogo, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmbedWorkbenchPage, EnvironmentEmbedRoot, EnvironmentSlotSelector, ErrorAlert_default as ErrorAlert, ErrorBoundary, ErrorSnackbar_default as ErrorSnackbar, GoogleLogo, Input, InvalidationEventsProvider, ListView_default as ItemListView, Label, LoadingCentered_default as LoadingCentered, LocalHealthCheck_default as LocalHealthCheck, LocalRouter, MainLayout_default as MainLayout, PageBreadcrumbs_default as PageBreadcrumbs, PipelineDebugPage_default as PipelineDebugPage, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PreviewWorkbenchPage, RadioGroup, RadioGroupItem, RunsListPage, RunsPage, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarInsetDiv, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuDiv, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Snackbar_default as Snackbar, SseProvider, StudioLandingPage, StudioProvider, StudioSidebar, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WorkbenchPage, WorkspacePage_default as WorkspacePage, WorkspaceRunsPage_default as WorkspaceRunsPage, WorkspacesPage, badgeVariants, buttonVariants, createApiClient, eventBus, getAllWorkflowsCacheKey, getAvailableEnvironmentsCacheKey, getDashboardStatsCacheKey, getDocumentCacheKey, getDocumentsCacheKey, getFileContentCacheKey, getFileTreeCacheKey, getHealthCacheKey, getMeCacheKey, getNamespaceCacheKey, getNamespacesByPipelineCacheKey, getPipelineCacheKey, getPipelineConfigCacheKey, getPipelineSourceCacheKey, getPipelineTypesCacheKey, getPipelinesCacheKey, getPipelinesChildrenCacheKey, getWorkflowCacheKey, getWorkflowsByPipelineCacheKey, getWorkflowsCacheKey, getWorkspaceCacheKey, getWorkspaceTypesCacheKey, getWorkspacesCacheKey, useApiClient, useAvailableEnvironments, useBatchDeletePipeline, useBatchDeleteWorkspaces, useChildPipelines, useComponentOverrides, useCreatePipeline, useCreateWorkspace, useDeletePipeline, useDeleteWorkspace, useFilterPipelines, useFilterWorkspaces, useIsMobile, usePipeline, usePipelineConfig, usePipelineConfigByName, usePipelineSource, useRouter, useSetFavouriteWorkspace, useSidebar, useStudio, useStudioOptional, useUpdatePipeline, useUpdateWorkspace, useWorkspace, useWorkspaceConfig };
@@ -3,9 +3,9 @@ import cc from "../../../../classcat/index.js";
3
3
  import { ConnectionLineType, ConnectionMode, MarkerType, PanOnScrollMode, Position, ResizeControlVariant, SelectionMode, XYDrag, XYHandle, XYMinimap, XYPanZoom, XYResizer, addEdge, adoptUserNodes, areSetsEqual, calculateNodePosition, createMarkerIds, defaultAriaLabelConfig, devWarn, elementSelectionKeys, errorMessages, evaluateAbsolutePosition, fitViewport, getBezierEdgeCenter, getBezierPath, getBoundsOfRects, getConnectedEdges, getConnectionStatus, getDimensions, getEdgeCenter, getEdgePosition, getElementsToRemove, getElevatedEdgeZIndex, getEventPosition, getHandlePosition, getHostForElement, getInternalNodesBounds, getMarkerId, getNodeDimensions, getNodesBounds, getNodesInside, getOverlappingArea, getSmoothStepPath, getStraightPath, getViewportForBounds, handleExpandParent, infiniteExtent, initialConnection, isEdgeBase, isEdgeVisible, isInputDOMNode, isMacOs, isMouseEvent, isNodeBase, isNumeric, isRectObject, mergeAriaLabelConfig, nodeHasDimensions, nodeToRect, panBy, pointToRendererPoint, rendererPointToPoint, snapPosition, updateAbsolutePositions, updateConnectionLookup, updateNodeInternals, withResolvers } from "../../../system/dist/esm/index.js";
4
4
  import { createContext, forwardRef, memo, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ import { createPortal } from "react-dom";
6
7
  import { createWithEqualityFn, useStoreWithEqualityFn } from "zustand/traditional";
7
8
  import { shallow } from "zustand/shallow";
8
- import { createPortal } from "react-dom";
9
9
  var StoreContext = createContext(null), Provider$1 = StoreContext.Provider, zustandErrorMessage = errorMessages.error001();
10
10
  function useStore(e, t) {
11
11
  let n = useContext(StoreContext);
@@ -3,8 +3,8 @@ import { usePipeline, usePipelineConfigByName } from "../hooks/usePipelines.js";
3
3
  import { useWorkspace } from "../hooks/useWorkspaces.js";
4
4
  import MainLayout_default from "../components/layout/MainLayout.js";
5
5
  import ErrorSnackbar_default from "../components/feedback/ErrorSnackbar.js";
6
- import { ReactFlowProvider } from "../node_modules/@xyflow/react/dist/esm/index.js";
7
6
  import { useFetchWorkflowsByPipeline } from "../hooks/useWorkflows.js";
7
+ import { ReactFlowProvider } from "../node_modules/@xyflow/react/dist/esm/index.js";
8
8
  import PipelineFlowViewer_default from "../features/debug/components/PipelineFlowViewer.js";
9
9
  import PipelineDebugHeader_default from "../features/debug/components/PipelineDebugHeader.js";
10
10
  import "../features/debug/index.js";