@loopstack/loopstack-studio 0.21.3 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/api/auth.js +10 -0
  2. package/dist/api/client.js +13 -0
  3. package/dist/api/config.js +10 -0
  4. package/dist/api/dashboard.js +4 -0
  5. package/dist/api/documents.js +7 -0
  6. package/dist/api/index.js +24 -0
  7. package/dist/api/namespaces.js +7 -0
  8. package/dist/api/pipelines.js +13 -0
  9. package/dist/api/processor.js +4 -0
  10. package/dist/api/workflows.js +8 -0
  11. package/dist/api/workspaces.js +12 -0
  12. package/dist/app/EnvironmentEmbedRoot.js +35 -0
  13. package/dist/components/data-table/DataTableFilters.js +74 -63
  14. package/dist/components/feedback/ErrorBoundary.js +43 -0
  15. package/dist/components/{LoadingCentered.js → feedback/LoadingCentered.js} +1 -1
  16. package/dist/components/feedback/index.js +5 -0
  17. package/dist/components/index.js +6 -3
  18. package/dist/components/layout/MainLayout.js +36 -17
  19. package/dist/components/layout/StudioSidebar.js +165 -0
  20. package/dist/components/page/PageBreadcrumbs.js +1 -1
  21. package/dist/components/ui/sidebar.js +359 -359
  22. package/dist/components/ui-widgets/UiActions.js +22 -15
  23. package/dist/components/ui-widgets/UiWidget.js +31 -26
  24. package/dist/components/ui-widgets/widgets/AiPromptInput.js +27 -27
  25. package/dist/components/ui-widgets/widgets/ButtonFullWidth.js +12 -12
  26. package/dist/components/ui-widgets/widgets/SandboxRun.js +33 -0
  27. package/dist/components/ui-widgets/widgets/SubmitButton.js +11 -11
  28. package/dist/features/code-explorer/CodeExplorer.js +4 -67
  29. package/dist/features/code-explorer/components/CodeExplorerTree.js +3 -41
  30. package/dist/features/code-explorer/components/CodeExplorerTreeNode.js +4 -80
  31. package/dist/features/code-explorer/components/FileContentViewer.js +1 -0
  32. package/dist/features/code-explorer/components/FileTabsBar.js +1 -1
  33. package/dist/features/code-explorer/index.js +4 -0
  34. package/dist/features/code-explorer/utils/fileIcons.js +4 -7
  35. package/dist/features/debug/components/ConfigFlowViewer.js +1 -1
  36. package/dist/features/debug/components/PipelineFlowViewer.js +1 -1
  37. package/dist/features/debug/index.js +3 -0
  38. package/dist/features/documents/DocumentRenderer.js +53 -0
  39. package/dist/features/{workbench → documents}/components/DocumentItem.js +1 -1
  40. package/dist/features/documents/components/DocumentList.js +40 -0
  41. package/dist/features/{workbench → documents}/components/DocumentMetadataPills.js +2 -2
  42. package/dist/features/{workbench/components → documents}/document-details/DocumentDetails.js +3 -3
  43. package/dist/features/{workbench/components → documents}/document-details/PromptDetails.js +3 -3
  44. package/dist/features/documents/index.js +4 -0
  45. package/dist/features/{workbench/components/document-renderer → documents/renderers}/AiMessage.js +5 -5
  46. package/dist/features/{workbench/components/document-renderer → documents/renderers}/DocumentDebugRenderer.js +1 -1
  47. package/dist/features/{workbench/components/document-renderer → documents/renderers}/DocumentFormRenderer.js +9 -8
  48. package/dist/features/{workbench/components/document-renderer → documents/renderers}/DocumentMessageRenderer.js +1 -1
  49. package/dist/features/{workbench/components/document-renderer → documents/renderers}/ErrorMessageRenderer.js +1 -1
  50. package/dist/features/{workbench/components/document-renderer → documents/renderers}/LinkMessageRenderer.js +1 -1
  51. package/dist/features/{workbench/components/document-renderer → documents/renderers}/MarkdownMessageRenderer.js +2 -2
  52. package/dist/features/{workbench/components/document-renderer → documents/renderers}/PlainMessageRenderer.js +1 -1
  53. package/dist/features/health/index.js +1 -0
  54. package/dist/features/oauth/OAuthPromptRenderer.js +1 -1
  55. package/dist/features/runs/Runs.js +197 -0
  56. package/dist/features/workbench/NavigationItems.js +29 -29
  57. package/dist/features/workbench/Workbench.js +100 -78
  58. package/dist/features/workbench/WorkflowItem.js +63 -58
  59. package/dist/features/workbench/WorkflowList.js +62 -82
  60. package/dist/features/workbench/components/NewRunDialog.js +329 -0
  61. package/dist/features/workbench/components/WorkbenchFloatingPanel.js +88 -0
  62. package/dist/features/workbench/components/WorkbenchFlowPanel.js +49 -0
  63. package/dist/features/workbench/components/WorkbenchIconSidebar.js +68 -0
  64. package/dist/features/workbench/components/WorkbenchPreviewPanel.js +128 -0
  65. package/dist/features/workbench/components/WorkflowForms.js +7 -6
  66. package/dist/features/workbench/components/WorkflowHistoryItem.js +74 -69
  67. package/dist/features/workbench/components/buttons/WorkflowButtons.js +78 -61
  68. package/dist/features/workbench/hooks/useWorkflowData.js +49 -0
  69. package/dist/features/workbench/hooks/useWorkflowListState.js +50 -0
  70. package/dist/features/workbench/index.js +8 -0
  71. package/dist/features/workbench/providers/WorkbenchLayoutProvider.js +76 -0
  72. package/dist/features/workspaces/Workspaces.js +2 -2
  73. package/dist/features/workspaces/components/CreateWorkspace.js +165 -82
  74. package/dist/features/workspaces/components/EnvironmentSlotSelector.js +63 -0
  75. package/dist/features/workspaces/components/ExecutionTimeline.js +70 -69
  76. package/dist/features/workspaces/components/PipelineForm.js +4 -4
  77. package/dist/features/workspaces/index.js +3 -0
  78. package/dist/hooks/index.js +3 -0
  79. package/dist/hooks/query-keys.js +138 -0
  80. package/dist/hooks/useApi.js +9 -33
  81. package/dist/hooks/useAuth.js +37 -56
  82. package/dist/hooks/useConfig.js +27 -33
  83. package/dist/hooks/useDashboard.js +9 -16
  84. package/dist/hooks/useDebounce.js +8 -17
  85. package/dist/hooks/useDocuments.js +7 -16
  86. package/dist/hooks/useFiles.js +24 -42
  87. package/dist/hooks/useNamespaces.js +7 -16
  88. package/dist/hooks/usePipelines.js +141 -174
  89. package/dist/hooks/useProcessor.js +11 -17
  90. package/dist/hooks/useWorkflows.js +51 -89
  91. package/dist/hooks/useWorkspaces.js +97 -129
  92. package/dist/index.d.ts +364 -50
  93. package/dist/index.js +21 -6
  94. package/dist/packages/contracts/dist/enums/index.js +25 -0
  95. package/dist/packages/contracts/dist/enums/pipeline-state.js +10 -0
  96. package/dist/packages/contracts/dist/enums/registry.enum.js +20 -0
  97. package/dist/packages/contracts/dist/enums/sort-order.enum.js +10 -0
  98. package/dist/packages/contracts/dist/enums/user-type.enum.js +10 -0
  99. package/dist/packages/contracts/dist/enums/workflow-state.enum.js +10 -0
  100. package/dist/pages/DashboardPage.js +1 -1
  101. package/dist/pages/DebugPage.js +12 -14
  102. package/dist/pages/DebugWorkflowDetailsPage.js +2 -2
  103. package/dist/pages/DebugWorkflowsPage.js +3 -4
  104. package/dist/pages/EmbedWorkbenchPage.js +7 -5
  105. package/dist/pages/PipelineDebugPage.js +7 -6
  106. package/dist/pages/PreviewWorkbenchPage.js +419 -0
  107. package/dist/pages/RunsListPage.js +64 -0
  108. package/dist/pages/RunsPage.js +49 -0
  109. package/dist/pages/StudioLandingPage.js +146 -0
  110. package/dist/pages/WorkbenchPage.js +78 -53
  111. package/dist/pages/WorkspacePage.js +1 -1
  112. package/dist/providers/InvalidationEventsProvider.js +15 -17
  113. package/dist/providers/QueryProvider.js +21 -0
  114. package/dist/providers/StudioProvider.js +2 -2
  115. package/dist/routing/LocalRouter.js +20 -7
  116. package/dist/services/createApiClient.js +4 -10
  117. package/dist/services/index.js +1 -1
  118. package/package.json +2 -3
  119. package/dist/features/workbench/components/DocumentList.js +0 -40
  120. package/dist/features/workbench/components/DocumentRenderer.js +0 -54
  121. package/dist/features/workbench/components/WorkbenchSidebar.js +0 -109
  122. package/dist/features/workbench/providers/WorkbenchContextProvider.js +0 -3
  123. /package/dist/components/{content → feedback}/ErrorAlert.js +0 -0
  124. /package/dist/components/{snackbars → feedback}/ErrorSnackbar.js +0 -0
  125. /package/dist/components/{snackbars → feedback}/Snackbar.js +0 -0
  126. /package/dist/features/{workbench/components/document-renderer → documents/renderers}/AiMessageContent.js +0 -0
@@ -1,162 +1,130 @@
1
+ import { getWorkspaceCacheKey, getWorkspacesCacheKey } from "./query-keys.js";
1
2
  import { useApiClient } from "./useApi.js";
2
3
  import { c } from "react/compiler-runtime";
3
4
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
- function useWorkspace(n) {
5
- let i = c(10), { envKey: a, api: s } = useApiClient(), l;
6
- i[0] !== a || i[1] !== n ? (l = [
7
- "workspace",
8
- n,
9
- a
10
- ], i[0] = a, i[1] = n, i[2] = l) : l = i[2];
5
+ function useWorkspace(t) {
6
+ let i = c(10), { envKey: o, api: s } = useApiClient(), l;
7
+ i[0] !== o || i[1] !== t ? (l = getWorkspaceCacheKey(o, t), i[0] = o, i[1] = t, i[2] = l) : l = i[2];
11
8
  let u;
12
- i[3] !== s || i[4] !== n ? (u = () => {
13
- if (!s) throw Error("API not available");
14
- return s.ApiV1WorkspacesApi.workspaceControllerGetWorkspaceById({ id: n });
15
- }, i[3] = s, i[4] = n, i[5] = u) : u = i[5];
16
- let d = !!n, f;
9
+ i[3] !== s || i[4] !== t ? (u = () => s.workspaces.getById({ id: t }), i[3] = s, i[4] = t, i[5] = u) : u = i[5];
10
+ let d = !!t, f;
17
11
  return i[6] !== l || i[7] !== u || i[8] !== d ? (f = {
18
12
  queryKey: l,
19
13
  queryFn: u,
20
- enabled: d,
21
- select: _temp
14
+ enabled: d
22
15
  }, i[6] = l, i[7] = u, i[8] = d, i[9] = f) : f = i[9], useQuery(f);
23
16
  }
24
- function _temp(e) {
25
- return e.data;
26
- }
27
- function useFilterWorkspaces(n, i, a, o, s, u) {
28
- let d = c(23), f = a === void 0 ? "id" : a, p = o === void 0 ? "DESC" : o, m = s === void 0 ? 0 : s, h = u === void 0 ? 10 : u, { envKey: g, api: _ } = useApiClient(), v = Object.keys(i).length > 0, y;
29
- d[0] !== i || d[1] !== v ? (y = v && { filter: JSON.stringify(i) }, d[0] = i, d[1] = v, d[2] = y) : y = d[2];
30
- let b;
31
- d[3] !== p || d[4] !== f ? (b = JSON.stringify([{
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([{
32
24
  field: f,
33
25
  order: p
34
- }]), d[3] = p, d[4] = f, d[5] = b) : b = d[5];
35
- let x;
36
- d[6] === n ? x = d[7] : (x = n && {
37
- search: n,
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 && {
29
+ search: e,
38
30
  searchColumns: JSON.stringify(["title"])
39
- }, d[6] = n, d[7] = x);
40
- let S;
41
- d[8] !== h || d[9] !== m || d[10] !== y || d[11] !== b || d[12] !== x ? (S = {
42
- ...y,
43
- sortBy: b,
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,
44
36
  page: m,
45
37
  limit: h,
46
- ...x
47
- }, d[8] = h, d[9] = m, d[10] = y, d[11] = b, d[12] = x, d[13] = S) : S = d[13];
48
- let C = S, w;
49
- d[14] !== g || d[15] !== C ? (w = [
50
- "workspaces",
51
- g,
52
- C
53
- ], d[14] = g, d[15] = C, d[16] = w) : w = d[16];
54
- let T;
55
- d[17] !== _ || d[18] !== C ? (T = () => {
56
- if (!_) throw Error("API not available");
57
- return _.ApiV1WorkspacesApi.workspaceControllerGetWorkspaces(C);
58
- }, d[17] = _, d[18] = C, d[19] = T) : T = d[19];
59
- let E;
60
- return d[20] !== w || d[21] !== T ? (E = {
61
- queryKey: w,
62
- queryFn: T,
63
- select: _temp2,
64
- enabled: !0
65
- }, d[20] = w, d[21] = T, d[22] = E) : E = d[22], useQuery(E);
66
- }
67
- function _temp2(e) {
68
- return e.data;
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 = [
42
+ ...getWorkspacesCacheKey(g),
43
+ "list",
44
+ e ?? "",
45
+ b ?? "",
46
+ f,
47
+ p,
48
+ m,
49
+ 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];
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);
69
58
  }
70
59
  function useCreateWorkspace() {
71
- let r = c(8), { envKey: a, api: o } = useApiClient(), s = useQueryClient(), l;
72
- r[0] === o ? l = r[1] : (l = (e) => {
73
- if (!o) throw Error("API not available");
74
- return o.ApiV1WorkspacesApi.workspaceControllerCreateWorkspace(e);
75
- }, r[0] = o, r[1] = l);
76
- let u;
77
- r[2] !== a || r[3] !== s ? (u = () => {
78
- s.invalidateQueries({ queryKey: ["workspaces", a] });
79
- }, r[2] = a, r[3] = s, r[4] = u) : u = r[4];
60
+ let e = c(8), { envKey: a, api: s } = useApiClient(), l = useQueryClient(), u;
61
+ e[0] === s ? u = e[1] : (u = (e) => s.workspaces.create(e), e[0] = s, e[1] = u);
80
62
  let d;
81
- return r[5] !== l || r[6] !== u ? (d = {
82
- mutationFn: l,
83
- onSuccess: u
84
- }, r[5] = l, r[6] = u, r[7] = d) : d = r[7], useMutation(d);
63
+ e[2] !== a || e[3] !== l ? (d = () => {
64
+ l.invalidateQueries({ queryKey: getWorkspacesCacheKey(a) });
65
+ }, e[2] = a, e[3] = l, e[4] = d) : d = e[4];
66
+ let f;
67
+ return e[5] !== u || e[6] !== d ? (f = {
68
+ mutationFn: u,
69
+ onSuccess: d
70
+ }, e[5] = u, e[6] = d, e[7] = f) : f = e[7], useMutation(f);
85
71
  }
86
72
  function useUpdateWorkspace() {
87
- let r = c(8), { envKey: a, api: o } = useApiClient(), s = useQueryClient(), l;
88
- r[0] === o ? l = r[1] : (l = (e) => {
89
- if (!o) throw Error("API not available");
90
- return o.ApiV1WorkspacesApi.workspaceControllerUpdateWorkspace(e);
91
- }, r[0] = o, r[1] = l);
92
- let u;
93
- r[2] !== a || r[3] !== s ? (u = (e, t) => {
94
- s.invalidateQueries({ queryKey: [
95
- "workspace",
96
- t.id,
97
- a
98
- ] }), s.invalidateQueries({ queryKey: ["workspaces", a] });
99
- }, r[2] = a, r[3] = s, r[4] = u) : u = r[4];
100
- let d;
101
- return r[5] !== l || r[6] !== u ? (d = {
102
- mutationFn: l,
103
- onSuccess: u
104
- }, r[5] = l, r[6] = u, r[7] = d) : d = r[7], useMutation(d);
73
+ let a = c(8), { envKey: s, api: l } = useApiClient(), u = useQueryClient(), d;
74
+ a[0] === l ? d = a[1] : (d = (e) => l.workspaces.update(e), a[0] = l, a[1] = d);
75
+ let f;
76
+ a[2] !== s || a[3] !== u ? (f = (n, r) => {
77
+ u.invalidateQueries({ queryKey: getWorkspaceCacheKey(s, r.id) }), u.invalidateQueries({ queryKey: getWorkspacesCacheKey(s) });
78
+ }, a[2] = s, a[3] = u, a[4] = f) : f = a[4];
79
+ let p;
80
+ return a[5] !== d || a[6] !== f ? (p = {
81
+ mutationFn: d,
82
+ onSuccess: f
83
+ }, a[5] = d, a[6] = f, a[7] = p) : p = a[7], useMutation(p);
105
84
  }
106
85
  function useDeleteWorkspace() {
107
- let r = c(8), { envKey: a, api: o } = useApiClient(), s = useQueryClient(), l;
108
- r[0] === o ? l = r[1] : (l = (e) => {
109
- if (!o) throw Error("API not available");
110
- return o.ApiV1WorkspacesApi.workspaceControllerDeleteWorkspace({ id: e });
111
- }, r[0] = o, r[1] = l);
112
- let u;
113
- r[2] !== a || r[3] !== s ? (u = (e, t) => {
114
- s.removeQueries({ queryKey: [
115
- "workspace",
116
- t,
117
- a
118
- ] }), s.invalidateQueries({ queryKey: ["workspaces", a] });
119
- }, r[2] = a, r[3] = s, r[4] = u) : u = r[4];
120
- let d;
121
- return r[5] !== l || r[6] !== u ? (d = {
122
- mutationFn: l,
123
- onSuccess: u
124
- }, r[5] = l, r[6] = u, r[7] = d) : d = r[7], useMutation(d);
86
+ let a = c(8), { envKey: s, api: l } = useApiClient(), u = useQueryClient(), d;
87
+ a[0] === l ? d = a[1] : (d = (e) => l.workspaces.delete({ id: e }), a[0] = l, a[1] = d);
88
+ let f;
89
+ a[2] !== s || a[3] !== u ? (f = (n, r) => {
90
+ u.removeQueries({ queryKey: getWorkspaceCacheKey(s, r) }), u.invalidateQueries({ queryKey: getWorkspacesCacheKey(s) });
91
+ }, a[2] = s, a[3] = u, a[4] = f) : f = a[4];
92
+ let p;
93
+ return a[5] !== d || a[6] !== f ? (p = {
94
+ mutationFn: d,
95
+ onSuccess: f
96
+ }, a[5] = d, a[6] = f, a[7] = p) : p = a[7], useMutation(p);
125
97
  }
126
98
  function useSetFavouriteWorkspace() {
127
- let r = c(8), { envKey: a, api: o } = useApiClient(), s = useQueryClient(), l;
128
- r[0] === o ? l = r[1] : (l = (e) => {
99
+ let e = c(8), { envKey: a, api: s } = useApiClient(), l = useQueryClient(), u;
100
+ e[0] === s ? u = e[1] : (u = (e) => {
129
101
  let { id: t, isFavourite: n } = e;
130
- if (!o) throw Error("API not available");
131
- return o.ApiV1WorkspacesApi.workspaceControllerSetFavourite({
102
+ return s.workspaces.setFavourite({
132
103
  id: t,
133
104
  workspaceFavouriteDto: { isFavourite: n }
134
105
  });
135
- }, r[0] = o, r[1] = l);
136
- let u;
137
- r[2] !== a || r[3] !== s ? (u = () => {
138
- s.invalidateQueries({ queryKey: ["workspaces", a] });
139
- }, r[2] = a, r[3] = s, r[4] = u) : u = r[4];
106
+ }, e[0] = s, e[1] = u);
140
107
  let d;
141
- return r[5] !== l || r[6] !== u ? (d = {
142
- mutationFn: l,
143
- onSuccess: u
144
- }, r[5] = l, r[6] = u, r[7] = d) : d = r[7], useMutation(d);
108
+ e[2] !== a || e[3] !== l ? (d = () => {
109
+ l.invalidateQueries({ queryKey: getWorkspacesCacheKey(a) });
110
+ }, e[2] = a, e[3] = l, e[4] = d) : d = e[4];
111
+ let f;
112
+ return e[5] !== u || e[6] !== d ? (f = {
113
+ mutationFn: u,
114
+ onSuccess: d
115
+ }, e[5] = u, e[6] = d, e[7] = f) : f = e[7], useMutation(f);
145
116
  }
146
117
  function useBatchDeleteWorkspaces() {
147
- let r = c(8), { envKey: a, api: o } = useApiClient(), s = useQueryClient(), l;
148
- r[0] === o ? l = r[1] : (l = (e) => {
149
- if (!o) throw Error("API not available");
150
- return o.ApiV1WorkspacesApi.workspaceControllerBatchDeleteWorkspaces({ workspaceControllerBatchDeleteWorkspacesRequest: { ids: e } });
151
- }, r[0] = o, r[1] = l);
152
- let u;
153
- r[2] !== a || r[3] !== s ? (u = () => {
154
- s.invalidateQueries({ queryKey: ["workspaces", a] });
155
- }, r[2] = a, r[3] = s, r[4] = u) : u = r[4];
118
+ let e = c(8), { envKey: a, api: s } = useApiClient(), l = useQueryClient(), u;
119
+ e[0] === s ? u = e[1] : (u = (e) => s.workspaces.batchDelete({ ids: e }), e[0] = s, e[1] = u);
156
120
  let d;
157
- return r[5] !== l || r[6] !== u ? (d = {
158
- mutationFn: l,
159
- onSuccess: u
160
- }, r[5] = l, r[6] = u, r[7] = d) : d = r[7], useMutation(d);
121
+ e[2] !== a || e[3] !== l ? (d = () => {
122
+ l.invalidateQueries({ queryKey: getWorkspacesCacheKey(a) });
123
+ }, e[2] = a, e[3] = l, e[4] = d) : d = e[4];
124
+ let f;
125
+ return e[5] !== u || e[6] !== d ? (f = {
126
+ mutationFn: u,
127
+ onSuccess: d
128
+ }, e[5] = u, e[6] = d, e[7] = f) : f = e[7], useMutation(f);
161
129
  }
162
130
  export { useBatchDeleteWorkspaces, useCreateWorkspace, useDeleteWorkspace, useFilterWorkspaces, useSetFavouriteWorkspace, useUpdateWorkspace, useWorkspace };