@loopstack/loopstack-studio 0.25.2 → 0.26.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 (100) hide show
  1. package/dist/api/environments.js +4 -0
  2. package/dist/api/index.js +15 -9
  3. package/dist/app/EnvironmentEmbedRoot.js +29 -19
  4. package/dist/components/data-table/DataList.js +93 -91
  5. package/dist/components/data-table/DataTable.js +128 -126
  6. package/dist/components/feedback/Snackbar.js +1 -1
  7. package/dist/components/layout/StudioSidebar.js +124 -131
  8. package/dist/components/ui/sidebar.js +2 -2
  9. package/dist/components/ui/slider.js +37 -26
  10. package/dist/components/ui-widgets/widgets/SandboxRun.js +16 -14
  11. package/dist/features/code-explorer/components/CodeExplorerTree.js +1 -0
  12. package/dist/features/code-explorer/components/FileContentViewer.js +1 -1
  13. package/dist/features/dashboard/RunItem.js +39 -37
  14. package/dist/features/debug/lib/flow-utils.js +1 -1
  15. package/dist/features/documents/DocumentRenderer.js +59 -58
  16. package/dist/features/documents/renderers/useDocumentTransition.js +29 -24
  17. package/dist/features/feature-registry/FeatureRegistryProvider.js +17 -0
  18. package/dist/features/feature-registry/index.js +1 -0
  19. package/dist/features/file-explorer/api/files.js +7 -0
  20. package/dist/features/file-explorer/components/FileExplorerPanel.js +95 -0
  21. package/dist/features/{workbench/components/RemoteFileTabsBar.js → file-explorer/components/FileTabsBar.js} +4 -4
  22. package/dist/features/{workbench/components/RemoteFileTree.js → file-explorer/components/FileTree.js} +6 -6
  23. package/dist/features/file-explorer/file-explorer-feature.js +12 -0
  24. package/dist/features/file-explorer/hooks/useFileExplorer.js +44 -0
  25. package/dist/features/file-explorer/index.js +2 -0
  26. package/dist/features/file-explorer/providers/FileExplorerProvider.js +112 -0
  27. package/dist/features/git/api/git.js +9 -0
  28. package/dist/features/oauth/OAuthPromptRenderer.js +162 -132
  29. package/dist/features/runs/Runs.js +1 -1
  30. package/dist/features/secrets/components/WorkbenchSecretsPanel.js +178 -0
  31. package/dist/features/secrets/index.js +1 -0
  32. package/dist/features/{documents → secrets}/renderers/SecretInputRenderer.js +17 -17
  33. package/dist/features/secrets/secrets-feature.js +14 -0
  34. package/dist/features/workbench/Workbench.js +32 -82
  35. package/dist/features/workbench/WorkflowList.js +109 -46
  36. package/dist/features/workbench/components/SidebarPanel.js +155 -0
  37. package/dist/features/workbench/components/WorkbenchEnvironmentPanel.js +82 -0
  38. package/dist/features/workbench/components/WorkbenchIconSidebar.js +128 -60
  39. package/dist/features/workbench/components/WorkbenchPreviewPanel.js +127 -114
  40. package/dist/features/workbench/components/WorkbenchRunsPanel.js +32 -0
  41. package/dist/features/workbench/components/WorkbenchSidebarShell.js +80 -0
  42. package/dist/features/workbench/hooks/useWorkflowData.js +3 -3
  43. package/dist/features/workbench/index.js +3 -2
  44. package/dist/features/workbench/providers/WorkbenchLayoutProvider.js +60 -62
  45. package/dist/features/workspaces/Workspaces.js +1 -1
  46. package/dist/features/workspaces/components/EnvironmentSlotSelector.js +68 -51
  47. package/dist/features/workspaces/components/WorkflowRunForm.js +1 -1
  48. package/dist/features/workspaces/components/WorkspaceHomePage.js +1 -1
  49. package/dist/hooks/index.js +1 -1
  50. package/dist/hooks/query-keys.js +45 -24
  51. package/dist/hooks/useEnvironmentPreviewUrl.js +13 -0
  52. package/dist/hooks/useEnvironments.js +8 -0
  53. package/dist/hooks/useWorkflows.js +28 -26
  54. package/dist/hooks/useWorkspaces.js +28 -26
  55. package/dist/index.d.ts +146 -7
  56. package/dist/index.js +9 -2
  57. package/dist/loopstack-studio.css +1 -1
  58. package/dist/node_modules/@shikijs/core/dist/index.js +105 -643
  59. package/dist/node_modules/@shikijs/engine-oniguruma/dist/index.js +135 -122
  60. package/dist/node_modules/@shikijs/langs/dist/bird2.js +1 -1
  61. package/dist/node_modules/@shikijs/langs/dist/cobol.js +1 -1
  62. package/dist/node_modules/@shikijs/langs/dist/css.js +1 -1
  63. package/dist/node_modules/@shikijs/langs/dist/dart.js +1 -1
  64. package/dist/node_modules/@shikijs/langs/dist/emacs-lisp.js +1 -1
  65. package/dist/node_modules/@shikijs/langs/dist/es-tag-sql.js +1 -1
  66. package/dist/node_modules/@shikijs/langs/dist/go.js +1 -1
  67. package/dist/node_modules/@shikijs/langs/dist/kusto.js +1 -1
  68. package/dist/node_modules/@shikijs/langs/dist/nextflow-groovy.js +1 -1
  69. package/dist/node_modules/@shikijs/langs/dist/php.js +1 -1
  70. package/dist/node_modules/@shikijs/langs/dist/ruby.js +1 -1
  71. package/dist/node_modules/@shikijs/langs/dist/typespec.js +1 -1
  72. package/dist/node_modules/@shikijs/primitive/dist/index.js +538 -0
  73. package/dist/node_modules/@shikijs/themes/dist/horizon-bright.js +1 -1
  74. package/dist/node_modules/@xyflow/react/dist/esm/index.js +1 -1
  75. package/dist/node_modules/shiki/dist/bundle-full.js +6 -5
  76. package/dist/node_modules/shiki/dist/chunk-CtajNgzt.js +15 -0
  77. package/dist/node_modules/shiki/dist/engine-oniguruma.js +5 -0
  78. package/dist/node_modules/shiki/dist/{langs.js → langs-bundle-full-DfKZStlK.js} +1 -1
  79. package/dist/node_modules/shiki/dist/themes.js +1 -1
  80. package/dist/pages/DashboardPage.js +54 -79
  81. package/dist/pages/DebugWorkflowDetailsPage.js +41 -55
  82. package/dist/pages/DebugWorkflowsPage.js +151 -112
  83. package/dist/pages/EmbedWorkbenchPage.js +2 -1
  84. package/dist/pages/PreviewWorkbenchPage.js +77 -59
  85. package/dist/pages/RunsListPage.js +27 -41
  86. package/dist/pages/RunsPage.js +21 -36
  87. package/dist/pages/WorkbenchPage.js +48 -70
  88. package/dist/pages/WorkflowDebugPage.js +65 -79
  89. package/dist/pages/WorkspacePage.js +56 -85
  90. package/dist/pages/WorkspaceRunsPage.js +59 -54
  91. package/dist/pages/WorkspacesPage.js +11 -27
  92. package/dist/providers/SseProvider.js +14 -20
  93. package/dist/providers/StudioPreferencesProvider.js +54 -0
  94. package/package.json +30 -30
  95. package/dist/features/workbench/components/WorkbenchFilesPanel.js +0 -67
  96. package/dist/features/workbench/components/WorkbenchFloatingPanel.js +0 -57
  97. package/dist/features/workbench/components/WorkbenchFlowPanel.js +0 -47
  98. package/dist/features/workbench/components/WorkbenchSecretsPanel.js +0 -182
  99. package/dist/features/workbench/providers/RemoteFileExplorerProvider.js +0 -160
  100. /package/dist/{node_modules → frontend/studio/node_modules}/@dagrejs/dagre/dist/dagre.esm.js +0 -0
@@ -15,46 +15,48 @@ function useWorkflow(e) {
15
15
  }, i[6] = s, i[7] = u, i[8] = d, i[9] = f) : f = i[9], useQuery(f);
16
16
  }
17
17
  function useFilterWorkflows(e, r, i, a, s, u) {
18
- let d = c(30), f = i === void 0 ? "id" : i, p = a === void 0 ? "DESC" : a, m = s === void 0 ? 0 : s, h = u === void 0 ? 10 : u, { envKey: g, api: _ } = useApiClient(), v = Object.keys(r).length > 0, y;
19
- d[0] !== r || d[1] !== v ? (y = v ? JSON.stringify(r) : void 0, d[0] = r, d[1] = v, d[2] = y) : y = d[2];
20
- let b = y, x;
21
- d[3] === b ? x = d[4] : (x = b && { filter: b }, d[3] = b, d[4] = x);
22
- let S;
23
- d[5] !== p || d[6] !== f ? (S = JSON.stringify([{
18
+ let d = c(32), f = i === void 0 ? "id" : i, p = a === void 0 ? "DESC" : a, m = s === void 0 ? 0 : s, h = u === void 0 ? 10 : u, { envKey: g, api: _ } = useApiClient(), v;
19
+ d[0] === r ? v = d[1] : (v = Object.keys(r), d[0] = r, d[1] = v);
20
+ let y = v.length > 0, b;
21
+ d[2] !== r || d[3] !== y ? (b = y ? JSON.stringify(r) : void 0, d[2] = r, d[3] = y, d[4] = b) : b = d[4];
22
+ let x = b, S;
23
+ d[5] === x ? S = d[6] : (S = x && { filter: x }, d[5] = x, d[6] = S);
24
+ let C;
25
+ d[7] !== p || d[8] !== f ? (C = JSON.stringify([{
24
26
  field: f,
25
27
  order: p
26
- }]), d[5] = p, d[6] = f, d[7] = S) : S = d[7];
27
- let C;
28
- d[8] === e ? C = d[9] : (C = e && {
28
+ }]), d[7] = p, d[8] = f, d[9] = C) : C = d[9];
29
+ let w;
30
+ d[10] === e ? w = d[11] : (w = e && {
29
31
  search: e,
30
32
  searchColumns: JSON.stringify(["title", "model"])
31
- }, d[8] = e, d[9] = C);
32
- let w;
33
- d[10] !== h || d[11] !== m || d[12] !== x || d[13] !== S || d[14] !== C ? (w = {
34
- ...x,
35
- sortBy: S,
33
+ }, d[10] = e, d[11] = w);
34
+ let T;
35
+ d[12] !== h || d[13] !== m || d[14] !== S || d[15] !== C || d[16] !== w ? (T = {
36
+ ...S,
37
+ sortBy: C,
36
38
  page: m,
37
39
  limit: h,
38
- ...C
39
- }, d[10] = h, d[11] = m, d[12] = x, d[13] = S, d[14] = C, d[15] = w) : w = d[15];
40
- let T = w, E;
41
- d[16] !== g || d[17] !== b || d[18] !== h || d[19] !== p || d[20] !== m || d[21] !== e || d[22] !== f ? (E = [
40
+ ...w
41
+ }, d[12] = h, d[13] = m, d[14] = S, d[15] = C, d[16] = w, d[17] = T) : T = d[17];
42
+ let E = T, D;
43
+ d[18] !== g || d[19] !== x || d[20] !== h || d[21] !== p || d[22] !== m || d[23] !== e || d[24] !== f ? (D = [
42
44
  ...getWorkflowsCacheKey(g),
43
45
  "list",
44
46
  e ?? "",
45
- b ?? "",
47
+ x ?? "",
46
48
  f,
47
49
  p,
48
50
  m,
49
51
  h
50
- ], d[16] = g, d[17] = b, d[18] = h, d[19] = p, d[20] = m, d[21] = e, d[22] = f, d[23] = E) : E = d[23];
51
- let D;
52
- d[24] !== _ || d[25] !== T ? (D = () => _.workflows.getAll(T), d[24] = _, d[25] = T, d[26] = D) : D = d[26];
52
+ ], d[18] = g, d[19] = x, d[20] = h, d[21] = p, d[22] = m, d[23] = e, d[24] = f, d[25] = D) : D = d[25];
53
53
  let O;
54
- return d[27] !== D || d[28] !== E ? (O = {
55
- queryKey: E,
56
- queryFn: D
57
- }, d[27] = D, d[28] = E, d[29] = O) : O = d[29], useQuery(O);
54
+ d[26] !== _ || d[27] !== E ? (O = () => _.workflows.getAll(E), d[26] = _, d[27] = E, d[28] = O) : O = d[28];
55
+ let k;
56
+ return d[29] !== D || d[30] !== O ? (k = {
57
+ queryKey: D,
58
+ queryFn: O
59
+ }, d[29] = D, d[30] = O, d[31] = k) : k = d[31], useQuery(k);
58
60
  }
59
61
  function useCreateWorkflow() {
60
62
  let e = c(8), { envKey: r, api: i } = useApiClient(), a = useQueryClient(), l;
@@ -15,46 +15,48 @@ function useWorkspace(t) {
15
15
  }, i[6] = l, i[7] = u, i[8] = d, i[9] = f) : f = i[9], useQuery(f);
16
16
  }
17
17
  function useFilterWorkspaces(e, i, o, s, l, u) {
18
- let d = c(30), f = o === void 0 ? "id" : o, p = s === void 0 ? "DESC" : s, m = l === void 0 ? 0 : l, h = u === void 0 ? 10 : u, { envKey: g, api: _ } = useApiClient(), v = Object.keys(i).length > 0, y;
19
- d[0] !== i || d[1] !== v ? (y = v ? JSON.stringify(i) : void 0, d[0] = i, d[1] = v, d[2] = y) : y = d[2];
20
- let b = y, x;
21
- d[3] === b ? x = d[4] : (x = b && { filter: b }, d[3] = b, d[4] = x);
22
- let S;
23
- d[5] !== p || d[6] !== f ? (S = JSON.stringify([{
18
+ let d = c(32), f = o === void 0 ? "id" : o, p = s === void 0 ? "DESC" : s, m = l === void 0 ? 0 : l, h = u === void 0 ? 10 : u, { envKey: g, api: _ } = useApiClient(), v;
19
+ d[0] === i ? v = d[1] : (v = Object.keys(i), d[0] = i, d[1] = v);
20
+ let y = v.length > 0, b;
21
+ d[2] !== i || d[3] !== y ? (b = y ? JSON.stringify(i) : void 0, d[2] = i, d[3] = y, d[4] = b) : b = d[4];
22
+ let x = b, S;
23
+ d[5] === x ? S = d[6] : (S = x && { filter: x }, d[5] = x, d[6] = S);
24
+ let C;
25
+ d[7] !== p || d[8] !== f ? (C = JSON.stringify([{
24
26
  field: f,
25
27
  order: p
26
- }]), d[5] = p, d[6] = f, d[7] = S) : S = d[7];
27
- let C;
28
- d[8] === e ? C = d[9] : (C = e && {
28
+ }]), d[7] = p, d[8] = f, d[9] = C) : C = d[9];
29
+ let w;
30
+ d[10] === e ? w = d[11] : (w = e && {
29
31
  search: e,
30
32
  searchColumns: JSON.stringify(["title"])
31
- }, d[8] = e, d[9] = C);
32
- let w;
33
- d[10] !== h || d[11] !== m || d[12] !== x || d[13] !== S || d[14] !== C ? (w = {
34
- ...x,
35
- sortBy: S,
33
+ }, d[10] = e, d[11] = w);
34
+ let T;
35
+ d[12] !== h || d[13] !== m || d[14] !== S || d[15] !== C || d[16] !== w ? (T = {
36
+ ...S,
37
+ sortBy: C,
36
38
  page: m,
37
39
  limit: h,
38
- ...C
39
- }, d[10] = h, d[11] = m, d[12] = x, d[13] = S, d[14] = C, d[15] = w) : w = d[15];
40
- let T = w, E;
41
- d[16] !== g || d[17] !== b || d[18] !== h || d[19] !== p || d[20] !== m || d[21] !== e || d[22] !== f ? (E = [
40
+ ...w
41
+ }, d[12] = h, d[13] = m, d[14] = S, d[15] = C, d[16] = w, d[17] = T) : T = d[17];
42
+ let E = T, D;
43
+ d[18] !== g || d[19] !== x || d[20] !== h || d[21] !== p || d[22] !== m || d[23] !== e || d[24] !== f ? (D = [
42
44
  ...getWorkspacesCacheKey(g),
43
45
  "list",
44
46
  e ?? "",
45
- b ?? "",
47
+ x ?? "",
46
48
  f,
47
49
  p,
48
50
  m,
49
51
  h
50
- ], d[16] = g, d[17] = b, d[18] = h, d[19] = p, d[20] = m, d[21] = e, d[22] = f, d[23] = E) : E = d[23];
51
- let D;
52
- d[24] !== _ || d[25] !== T ? (D = () => _.workspaces.getAll(T), d[24] = _, d[25] = T, d[26] = D) : D = d[26];
52
+ ], d[18] = g, d[19] = x, d[20] = h, d[21] = p, d[22] = m, d[23] = e, d[24] = f, d[25] = D) : D = d[25];
53
53
  let O;
54
- return d[27] !== D || d[28] !== E ? (O = {
55
- queryKey: E,
56
- queryFn: D
57
- }, d[27] = D, d[28] = E, d[29] = O) : O = d[29], useQuery(O);
54
+ d[26] !== _ || d[27] !== E ? (O = () => _.workspaces.getAll(E), d[26] = _, d[27] = E, d[28] = O) : O = d[28];
55
+ let k;
56
+ return d[29] !== D || d[30] !== O ? (k = {
57
+ queryKey: D,
58
+ queryFn: O
59
+ }, d[29] = D, d[30] = O, d[31] = k) : k = d[31], useQuery(k);
58
60
  }
59
61
  function useCreateWorkspace() {
60
62
  let e = c(8), { envKey: a, api: s } = useApiClient(), l = useQueryClient(), u;
package/dist/index.d.ts CHANGED
@@ -12,7 +12,8 @@ import { Context } from 'react';
12
12
  import { DashboardStatsInterface } from '@loopstack/contracts/api';
13
13
  import { default as default_2 } from 'react';
14
14
  import * as DialogPrimitive from '@radix-ui/react-dialog';
15
- import { DocumentItemInterface } from '@loopstack/contracts/api';
15
+ import { DocumentItemInterface } from '@loopstack/contracts/types';
16
+ import { DocumentItemInterface as DocumentItemInterface_2 } from '@loopstack/contracts/api';
16
17
  import { Drawer as Drawer_2 } from 'vaul';
17
18
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
18
19
  import { EnvironmentConfigInterface } from '@loopstack/contracts/api';
@@ -269,13 +270,49 @@ declare function createApi(http: AxiosInstance): {
269
270
  documents: {
270
271
  getById: (params: {
271
272
  id: string;
272
- }) => Promise<DocumentItemInterface>;
273
+ }) => Promise<DocumentItemInterface_2>;
273
274
  getAll: (params?: {
274
275
  filter?: string;
275
276
  sortBy?: string;
276
277
  page?: number;
277
278
  limit?: number;
278
- }) => Promise<PaginatedInterface<DocumentItemInterface>>;
279
+ }) => Promise<PaginatedInterface<DocumentItemInterface_2>>;
280
+ };
281
+ environments: {
282
+ resetEnvironment: (params: {
283
+ workspaceId: string;
284
+ slotId: string;
285
+ }) => Promise<{
286
+ success: boolean;
287
+ message: string;
288
+ }>;
289
+ };
290
+ files: {
291
+ getTree: (params: {
292
+ workspaceId: string;
293
+ path?: string;
294
+ }) => Promise<FileExplorerNode[]>;
295
+ readFile: (params: {
296
+ workspaceId: string;
297
+ path: string;
298
+ }) => Promise<FileContent>;
299
+ };
300
+ git: {
301
+ getStatus: (params: {
302
+ workspaceId: string;
303
+ }) => Promise<GitStatusResponse>;
304
+ getLog: (params: {
305
+ workspaceId: string;
306
+ limit?: number;
307
+ }) => Promise<GitLogResponse>;
308
+ getRemote: (params: {
309
+ workspaceId: string;
310
+ }) => Promise<GitRemoteResponse | null>;
311
+ removeRemote: (params: {
312
+ workspaceId: string;
313
+ }) => Promise<{
314
+ success: boolean;
315
+ }>;
279
316
  };
280
317
  processor: {
281
318
  runWorkflow: (params: {
@@ -555,6 +592,14 @@ declare interface DiscordLogoProps {
555
592
  className?: string;
556
593
  }
557
594
 
595
+ declare interface DocumentRendererProps {
596
+ parentWorkflow: WorkflowFullInterface;
597
+ workflow: WorkflowFullInterface;
598
+ document: DocumentItemInterface;
599
+ isActive: boolean;
600
+ isLastItem: boolean;
601
+ }
602
+
558
603
  export declare function Drawer({ ...props }: React_2.ComponentProps<typeof Drawer_2.Root>): JSX.Element;
559
604
 
560
605
  export declare function DrawerClose({ ...props }: React_2.ComponentProps<typeof Drawer_2.Close>): JSX.Element;
@@ -683,6 +728,30 @@ declare class EventEmitter {
683
728
  emit(event: string, ...args: unknown[]): void;
684
729
  }
685
730
 
731
+ export declare function FeatureRegistryProvider({ features, children }: FeatureRegistryProviderProps): JSX.Element;
732
+
733
+ export declare interface FeatureRegistryProviderProps {
734
+ features?: StudioFeature[];
735
+ children: ReactNode;
736
+ }
737
+
738
+ declare interface FileContent {
739
+ path: string;
740
+ content: string;
741
+ }
742
+
743
+ export declare const fileExplorerFeature: StudioFeature;
744
+
745
+ declare interface FileExplorerNode {
746
+ id: string;
747
+ name: string;
748
+ path: string;
749
+ type: FileNodeType;
750
+ children?: FileExplorerNode[];
751
+ }
752
+
753
+ declare type FileNodeType = 'file' | 'folder';
754
+
686
755
  export declare type FilterOption = string | {
687
756
  label: string;
688
757
  value: string;
@@ -702,6 +771,12 @@ export declare function getFileContentCacheKey(envKey: string, workflowId: strin
702
771
 
703
772
  export declare function getFileTreeCacheKey(envKey: string, workflowId: string): string[];
704
773
 
774
+ export declare function getGitLogCacheKey(envKey: string, workspaceId: string): string[];
775
+
776
+ export declare function getGitRemoteCacheKey(envKey: string, workspaceId: string): string[];
777
+
778
+ export declare function getGitStatusCacheKey(envKey: string, workspaceId: string): string[];
779
+
705
780
  export declare function getHealthCacheKey(envKey: string): string[];
706
781
 
707
782
  /**
@@ -734,6 +809,31 @@ export declare function getWorkspacesCacheKey(envKey: string): string[];
734
809
 
735
810
  export declare function getWorkspaceTypesCacheKey(envKey: string): string[];
736
811
 
812
+ declare interface GitCommit {
813
+ hash: string;
814
+ shortHash: string;
815
+ message: string;
816
+ author: string;
817
+ date: string;
818
+ }
819
+
820
+ declare interface GitLogResponse {
821
+ commits: GitCommit[];
822
+ }
823
+
824
+ declare interface GitRemoteResponse {
825
+ name: string;
826
+ url: string;
827
+ }
828
+
829
+ declare interface GitStatusResponse {
830
+ branch: string;
831
+ staged: string[];
832
+ modified: string[];
833
+ untracked: string[];
834
+ deleted: string[];
835
+ }
836
+
737
837
  export declare const GoogleLogo: default_2.FC<GoogleLogoProps>;
738
838
 
739
839
  declare interface GoogleLogoProps {
@@ -905,6 +1005,10 @@ declare interface PageBreadcrumbsProps {
905
1005
  breadcrumbData: BreadCrumbsData[];
906
1006
  }
907
1007
 
1008
+ declare type PanelId = 'runs' | 'preview' | 'files' | 'environment' | (string & {});
1009
+
1010
+ declare type PanelSize = 'small' | 'medium' | 'large';
1011
+
908
1012
  export declare function Popover({ ...props }: React_2.ComponentProps<typeof PopoverPrimitive.Root>): JSX.Element;
909
1013
 
910
1014
  export declare function PopoverAnchor({ ...props }: React_2.ComponentProps<typeof PopoverPrimitive.Anchor>): JSX.Element;
@@ -955,6 +1059,8 @@ declare interface SecretItem {
955
1059
  hasValue: boolean;
956
1060
  }
957
1061
 
1062
+ export declare const secretsFeature: StudioFeature;
1063
+
958
1064
  export declare function Select({ ...props }: React_2.ComponentProps<typeof SelectPrimitive.Root>): JSX.Element;
959
1065
 
960
1066
  export declare function SelectContent({ className, children, position, align, ...props }: React_2.ComponentProps<typeof SelectPrimitive.Content>): JSX.Element;
@@ -1106,8 +1212,40 @@ declare interface StudioContext {
1106
1212
 
1107
1213
  declare const StudioContext: Context<StudioContext | null>;
1108
1214
 
1215
+ export declare interface StudioFeature {
1216
+ id: string;
1217
+ documentRenderers?: Record<string, ComponentType<DocumentRendererProps>>;
1218
+ sidebarPanel?: StudioFeatureSidebarPanel;
1219
+ }
1220
+
1221
+ export declare interface StudioFeatureSidebarPanel {
1222
+ id: string;
1223
+ label: string;
1224
+ icon: ComponentType<{
1225
+ className?: string;
1226
+ }>;
1227
+ component: ComponentType<{
1228
+ workspaceId?: string;
1229
+ }>;
1230
+ }
1231
+
1109
1232
  export declare function StudioLandingPage(): JSX.Element;
1110
1233
 
1234
+ declare interface StudioPreferences {
1235
+ leftSidebarOpen: boolean;
1236
+ activePanel: PanelId | null;
1237
+ panelSizes: Partial<Record<PanelId, PanelSize>>;
1238
+ }
1239
+
1240
+ declare interface StudioPreferencesContextType {
1241
+ preferences: StudioPreferences;
1242
+ setPreference: <K extends keyof StudioPreferences>(key: K, value: StudioPreferences[K]) => void;
1243
+ }
1244
+
1245
+ export declare function StudioPreferencesProvider({ children }: {
1246
+ children: ReactNode;
1247
+ }): JSX.Element;
1248
+
1111
1249
  export declare const StudioProvider: ({ children, router, environment, }: {
1112
1250
  children: ReactNode;
1113
1251
  router: StudioRouter;
@@ -1224,6 +1362,8 @@ export declare function useFilterWorkspaces(searchTerm: string | undefined, filt
1224
1362
 
1225
1363
  export declare function useIsMobile(): boolean;
1226
1364
 
1365
+ export declare function useOptionalStudioPreferences(): StudioPreferencesContextType | null;
1366
+
1227
1367
  export declare const useRouter: (envId: string, embedPrefix?: string) => StudioRouter;
1228
1368
 
1229
1369
  export declare function useSetFavouriteWorkspace(): UseMutationResult<void, Error, {
@@ -1237,6 +1377,8 @@ export declare const useStudio: () => StudioContext;
1237
1377
 
1238
1378
  export declare const useStudioOptional: () => StudioContext | null;
1239
1379
 
1380
+ export declare function useStudioPreferences(): StudioPreferencesContextType;
1381
+
1240
1382
  /**
1241
1383
  * Update an existing workflow.
1242
1384
  */
@@ -1276,10 +1418,7 @@ export declare function useWorkspace(id: string | undefined): UseQueryResult<Wor
1276
1418
 
1277
1419
  export declare function useWorkspaceConfig(): UseQueryResult<WorkspaceConfigInterface[], Error>;
1278
1420
 
1279
- export declare function WorkbenchPage({ previewPanelOpen, onPreviewPanelOpenChange, isDeveloperMode, getPreviewUrl, getEnvironmentPreviewUrl, environments, }?: {
1280
- previewPanelOpen?: boolean;
1281
- onPreviewPanelOpenChange?: (open: boolean) => void;
1282
- isDeveloperMode?: boolean;
1421
+ export declare function WorkbenchPage({ getPreviewUrl, getEnvironmentPreviewUrl, environments, }?: {
1283
1422
  getPreviewUrl?: (workflowId: string) => string;
1284
1423
  getEnvironmentPreviewUrl?: (env: WorkspaceEnvironmentInterface, workflowId?: string) => string;
1285
1424
  environments?: WorkspaceEnvironmentInterface[];
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { getAvailableEnvironmentsCacheKey, getChildWorkflowsCacheKey, getDashboardStatsCacheKey, getDocumentCacheKey, getDocumentsCacheKey, getFileContentCacheKey, getFileTreeCacheKey, getHealthCacheKey, getMeCacheKey, getSecretsCacheKey, getWorkflowCacheKey, getWorkflowConfigCacheKey, getWorkflowSourceCacheKey, getWorkflowTypesCacheKey, getWorkflowsCacheKey, getWorkspaceCacheKey, getWorkspaceTypesCacheKey, getWorkspacesCacheKey } from "./hooks/query-keys.js";
1
+ import { getAvailableEnvironmentsCacheKey, getChildWorkflowsCacheKey, getDashboardStatsCacheKey, getDocumentCacheKey, getDocumentsCacheKey, getFileContentCacheKey, getFileTreeCacheKey, getGitLogCacheKey, getGitRemoteCacheKey, getGitStatusCacheKey, getHealthCacheKey, getMeCacheKey, getSecretsCacheKey, getWorkflowCacheKey, getWorkflowConfigCacheKey, getWorkflowSourceCacheKey, getWorkflowTypesCacheKey, getWorkflowsCacheKey, getWorkspaceCacheKey, getWorkspaceTypesCacheKey, getWorkspacesCacheKey } from "./hooks/query-keys.js";
2
2
  import { createApiClient } from "./services/createApiClient.js";
3
3
  import { eventBus } from "./services/eventEmitter.js";
4
4
  import "./services/index.js";
@@ -9,6 +9,7 @@ import { useAvailableEnvironments, useWorkflowConfig, useWorkspaceConfig } from
9
9
  import { useBatchDeleteWorkflows, useChildWorkflows, useCreateWorkflow, useDeleteWorkflow, useFilterWorkflows, useUpdateWorkflow, useWorkflow, useWorkflowCheckpoints, useWorkflowConfigByName, useWorkflowSource } from "./hooks/useWorkflows.js";
10
10
  import { useBatchDeleteWorkspaces, useCreateWorkspace, useDeleteWorkspace, useFilterWorkspaces, useSetFavouriteWorkspace, useUpdateWorkspace, useWorkspace } from "./hooks/useWorkspaces.js";
11
11
  import "./hooks/index.js";
12
+ import { StudioPreferencesProvider, useOptionalStudioPreferences, useStudioPreferences } from "./providers/StudioPreferencesProvider.js";
12
13
  import { ComponentOverridesProvider, useComponentOverrides } from "./providers/ComponentOverridesProvider.js";
13
14
  import { SseProvider } from "./providers/SseProvider.js";
14
15
  import { InvalidationEventsProvider } from "./providers/InvalidationEventsProvider.js";
@@ -66,6 +67,8 @@ import DashboardPage from "./pages/DashboardPage.js";
66
67
  import { EnvironmentSlotSelector } from "./features/workspaces/components/EnvironmentSlotSelector.js";
67
68
  import CreateWorkspace_default from "./features/workspaces/components/CreateWorkspace.js";
68
69
  import WorkspacesPage from "./pages/WorkspacesPage.js";
70
+ import { FeatureRegistryProvider } from "./features/feature-registry/FeatureRegistryProvider.js";
71
+ import "./features/feature-registry/index.js";
69
72
  import WorkspacePage_default from "./pages/WorkspacePage.js";
70
73
  import WorkspaceRunsPage_default from "./pages/WorkspaceRunsPage.js";
71
74
  import "./features/workspaces/index.js";
@@ -78,8 +81,12 @@ import PreviewWorkbenchPage from "./pages/PreviewWorkbenchPage.js";
78
81
  import RunsPage from "./pages/RunsPage.js";
79
82
  import RunsListPage from "./pages/RunsListPage.js";
80
83
  import StudioLandingPage from "./pages/StudioLandingPage.js";
84
+ import { fileExplorerFeature } from "./features/file-explorer/file-explorer-feature.js";
85
+ import "./features/file-explorer/index.js";
81
86
  import LocalHealthCheck_default from "./features/health/LocalHealthCheck.js";
87
+ import { secretsFeature } from "./features/secrets/secrets-feature.js";
88
+ import "./features/secrets/index.js";
82
89
  import EnvironmentEmbedRoot from "./app/EnvironmentEmbedRoot.js";
83
90
  import { StudioSidebar } from "./components/layout/StudioSidebar.js";
84
91
  import "./features/health/index.js";
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, 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, WorkflowDebugPage_default as WorkflowDebugPage, WorkspacePage_default as WorkspacePage, WorkspaceRunsPage_default as WorkspaceRunsPage, WorkspacesPage, badgeVariants, buttonVariants, createApiClient, eventBus, getAvailableEnvironmentsCacheKey, getChildWorkflowsCacheKey, getDashboardStatsCacheKey, getDocumentCacheKey, getDocumentsCacheKey, getFileContentCacheKey, getFileTreeCacheKey, getHealthCacheKey, getMeCacheKey, getSecretsCacheKey, getWorkflowCacheKey, getWorkflowConfigCacheKey, getWorkflowSourceCacheKey, getWorkflowTypesCacheKey, getWorkflowsCacheKey, getWorkspaceCacheKey, getWorkspaceTypesCacheKey, getWorkspacesCacheKey, useApiClient, useAvailableEnvironments, useBatchDeleteWorkflows, useBatchDeleteWorkspaces, useChildWorkflows, useComponentOverrides, useCreateWorkflow, useCreateWorkspace, useDeleteWorkflow, useDeleteWorkspace, useFilterWorkflows, useFilterWorkspaces, useIsMobile, useRouter, useSetFavouriteWorkspace, useSidebar, useStudio, useStudioOptional, useUpdateWorkflow, useUpdateWorkspace, useWorkflow, useWorkflowCheckpoints, useWorkflowConfig, useWorkflowConfigByName, useWorkflowSource, useWorkspace, useWorkspaceConfig };
92
+ 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, FeatureRegistryProvider, 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, 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, StudioPreferencesProvider, StudioProvider, StudioSidebar, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WorkbenchPage, WorkflowDebugPage_default as WorkflowDebugPage, WorkspacePage_default as WorkspacePage, WorkspaceRunsPage_default as WorkspaceRunsPage, WorkspacesPage, badgeVariants, buttonVariants, createApiClient, eventBus, fileExplorerFeature, getAvailableEnvironmentsCacheKey, getChildWorkflowsCacheKey, getDashboardStatsCacheKey, getDocumentCacheKey, getDocumentsCacheKey, getFileContentCacheKey, getFileTreeCacheKey, getGitLogCacheKey, getGitRemoteCacheKey, getGitStatusCacheKey, getHealthCacheKey, getMeCacheKey, getSecretsCacheKey, getWorkflowCacheKey, getWorkflowConfigCacheKey, getWorkflowSourceCacheKey, getWorkflowTypesCacheKey, getWorkflowsCacheKey, getWorkspaceCacheKey, getWorkspaceTypesCacheKey, getWorkspacesCacheKey, secretsFeature, useApiClient, useAvailableEnvironments, useBatchDeleteWorkflows, useBatchDeleteWorkspaces, useChildWorkflows, useComponentOverrides, useCreateWorkflow, useCreateWorkspace, useDeleteWorkflow, useDeleteWorkspace, useFilterWorkflows, useFilterWorkspaces, useIsMobile, useOptionalStudioPreferences, useRouter, useSetFavouriteWorkspace, useSidebar, useStudio, useStudioOptional, useStudioPreferences, useUpdateWorkflow, useUpdateWorkspace, useWorkflow, useWorkflowCheckpoints, useWorkflowConfig, useWorkflowConfigByName, useWorkflowSource, useWorkspace, useWorkspaceConfig };