Skip to content

Commit 2955cf3

Browse files
author
Roman Snapko
committed
Merge branch 'main' into fix/chat-name-generation
# Conflicts: # packages/server/api/src/app/ai/chat/ai-mcp-chat.controller.ts
2 parents c85698c + e8da859 commit 2955cf3

64 files changed

Lines changed: 670 additions & 351 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.template

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ OPS_LOGZIO_TOKEN=
6666
OPS_LOGZIO_METRICS_TOKEN=
6767
OPS_LOG_LEVEL=debug
6868
OPS_LOG_PRETTY=true
69+
OPS_LOG_REDACTION=false
6970
OPS_TELEMETRY_MODE=COLLECTOR
7071
OPS_TELEMETRY_COLLECTOR_URL=https://telemetry.openops.com/save
7172

packages/engine/src/lib/services/progress.service.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,15 @@ const sendUpdateRunRequest = async (flowRunId: FlowRunId): Promise<void> => {
107107
} as BodyAccessKeyRequest,
108108
{
109109
retries: MAX_RETRIES,
110-
retryCondition: (error: AxiosError) => {
110+
retryCondition: async (error: AxiosError) => {
111111
throwIfExecutionTimeExceeded();
112-
return isRetryableError(error);
112+
113+
if (!isRetryableError(error)) {
114+
return false;
115+
}
116+
117+
await updateRequestBody(request, error);
118+
return true;
113119
},
114120
retryDelay: (retryCount: number) => (retryCount + 1) * 200, // 200ms, 400ms, 600ms
115121
},
@@ -129,6 +135,22 @@ const sendUpdateRunRequest = async (flowRunId: FlowRunId): Promise<void> => {
129135
logger.debug(`Progress update request for ${flowRunId} took ${duration}ms`);
130136
};
131137

138+
async function updateRequestBody(
139+
request: UpdateRunProgressRequest,
140+
error: AxiosError,
141+
): Promise<void> {
142+
try {
143+
if (error.config) {
144+
const newBodyAccessKey = await saveRequestBody(request);
145+
error.config.data = JSON.stringify({
146+
bodyAccessKey: newBodyAccessKey,
147+
});
148+
}
149+
} catch (e) {
150+
logger.info('Failed to update progress request body.', e);
151+
}
152+
}
153+
132154
type UpdateStepProgressParams = {
133155
engineConstants: EngineConstants;
134156
flowExecutorContext: FlowExecutorContext;

packages/openops/src/lib/openops-tables/types/table-workspace.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
type User = {
1+
export type WorkspaceUser = {
22
id: number;
33
name: string;
44
email: string;
@@ -12,7 +12,7 @@ type User = {
1212
export type TableWorkspace = {
1313
id: number;
1414
name: string;
15-
users: User[];
15+
users: WorkspaceUser[];
1616
order: number;
1717
permissions: string;
1818
unread_notifications_count: number;

packages/react-ui/src/app/app-bootstrap.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { LoadingSpinner } from '@openops/components/ui';
21
import { useEffect, useState } from 'react';
2+
3+
import { FullPageSpinner } from './common/components/full-page-spinner';
34
import { QueryKeys } from './constants/query-keys';
45
import { flagsApi, FlagsMap } from './lib/flags-api';
56
import { initializeInternal } from './lib/initialize-internal';
@@ -51,11 +52,7 @@ export function AppBootstrap({ children }: Readonly<AppBootstrapProps>) {
5152
}, []);
5253

5354
if (state.status === 'loading') {
54-
return (
55-
<div className="flex h-screen w-screen items-center justify-center">
56-
<LoadingSpinner size={50} />
57-
</div>
58-
);
55+
return <FullPageSpinner />;
5956
}
6057

6158
if (state.status === 'error') {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { LoadingSpinner } from '@openops/components/ui';
2+
3+
type FullPageSpinnerProps = {
4+
size?: number;
5+
};
6+
7+
export const FullPageSpinner = ({ size = 50 }: FullPageSpinnerProps) => (
8+
<div className="bg-background flex h-screen w-screen items-center justify-center">
9+
<LoadingSpinner size={size} />
10+
</div>
11+
);

packages/react-ui/src/app/common/guards/allow-logged-in-user-only-guard.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { LoadingSpinner } from '@openops/components/ui';
21
import dayjs from 'dayjs';
32
import { jwtDecode } from 'jwt-decode';
43
import { Suspense, useEffect } from 'react';
54
import { Navigate, useLocation, useNavigate } from 'react-router-dom';
65

76
import { getFederatedUrlBasedOnFlags } from '@/app/common/auth/lib/utils';
7+
import { FullPageSpinner } from '@/app/common/components/full-page-spinner';
88
import { flagsHooks } from '@/app/common/hooks/flags-hooks';
99
import { platformHooks } from '@/app/common/hooks/platform-hooks';
1010
import { projectHooks } from '@/app/common/hooks/project-hooks';
@@ -46,13 +46,7 @@ const LoggedIn = ({ children }: { children: React.ReactNode }) => {
4646
appConnectionsHooks.useConnectionsMetadata();
4747

4848
return (
49-
<Suspense
50-
fallback={
51-
<div className=" flex h-screen w-screen items-center justify-center ">
52-
<LoadingSpinner size={50}></LoadingSpinner>
53-
</div>
54-
}
55-
>
49+
<Suspense fallback={<FullPageSpinner />}>
5650
<SocketProvider>{children}</SocketProvider>
5751
</Suspense>
5852
);
Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
import { LoadingSpinner } from '@openops/components/ui';
2-
import { Suspense, useEffect } from 'react';
1+
import { Suspense, useEffect, useState } from 'react';
32

3+
import { FullPageSpinner } from '@/app/common/components/full-page-spinner';
44
import { flagsHooks } from '@/app/common/hooks/flags-hooks';
5-
import { setupResponseInterceptor } from '@/app/interceptors';
5+
import {
6+
setupRequestInterceptor,
7+
setupResponseInterceptor,
8+
} from '@/app/interceptors';
69

710
type InitialDataGuardProps = {
811
children: React.ReactNode;
@@ -11,25 +14,26 @@ export const InitialDataGuard = ({
1114
children,
1215
}: Readonly<InitialDataGuardProps>) => {
1316
const { data: flags } = flagsHooks.useFlags();
17+
const [interceptorsReady, setInterceptorsReady] = useState(false);
1418

1519
useEffect(() => {
1620
if (!flags) {
1721
console.error('Missing flags for response interceptor configuration');
22+
return;
1823
}
24+
const isFederatedAuth = Boolean(flags?.FEDERATED_LOGIN_ENABLED);
25+
setupRequestInterceptor({
26+
isFederatedAuth,
27+
});
1928
setupResponseInterceptor({
20-
isFederatedAuth: Boolean(flags?.FEDERATED_LOGIN_ENABLED),
29+
isFederatedAuth,
2130
});
31+
setInterceptorsReady(true);
2232
}, [flags]);
2333

24-
return (
25-
<Suspense
26-
fallback={
27-
<div className="bg-background flex h-screen w-screen items-center justify-center ">
28-
<LoadingSpinner size={50}></LoadingSpinner>
29-
</div>
30-
}
31-
>
32-
{children}
33-
</Suspense>
34-
);
34+
if (!interceptorsReady) {
35+
return <FullPageSpinner />;
36+
}
37+
38+
return <Suspense fallback={<FullPageSpinner />}>{children}</Suspense>;
3539
};

packages/react-ui/src/app/features/templates/components/public-flow-template-filter-sidebar-wrapper.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type FlowTemplateFilterSidebarProps = {
2020
setSelectedServices: (services: string[]) => void;
2121
selectedCategories: string[];
2222
setSelectedCategories: (categories: string[]) => void;
23+
newDomains?: string[];
2324
};
2425

2526
export const FlowTemplateFilterSidebarSkeletonLoader: React.FC<{
@@ -53,6 +54,7 @@ const PublicFlowTemplateFilterSidebarWrapper = ({
5354
setSelectedCategories,
5455
setSelectedBlocks,
5556
showDomains = true,
57+
newDomains = [],
5658
}: FlowTemplateFilterSidebarProps & { showDomains?: boolean }) => {
5759
const useCloudTemplates = flagsHooks.useShouldFetchCloudTemplates();
5860

@@ -175,6 +177,7 @@ const PublicFlowTemplateFilterSidebarWrapper = ({
175177
selectedCategories={selectedCategories}
176178
categoryLogos={categoryLogos}
177179
showDomains={showDomains}
180+
newDomains={newDomains}
178181
/>
179182
);
180183
};

packages/react-ui/src/app/features/templates/components/select-flow-template-dialog-content.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ const SelectFlowTemplateDialogContent = ({
150150
selectedCategories={selectedCategories}
151151
setSelectedCategories={setSelectedCategories}
152152
showDomains={isFullCatalog}
153+
newDomains={['Policy & Governance']}
153154
/>
154155
) : (
155156
<PrivateFlowTemplateFilterSidebarWrapper />

packages/react-ui/src/app/interceptors/index.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,22 @@ import {
99
let requestInterceptorId: number | null = null;
1010
let responseInterceptorId: number | null = null;
1111

12-
function setupRequestInterceptor(): void {
12+
type InterceptorOptions = {
13+
isFederatedAuth: boolean;
14+
};
15+
16+
export function setupRequestInterceptor({
17+
isFederatedAuth,
18+
}: InterceptorOptions): void {
1319
if (requestInterceptorId === null) {
1420
const requestInterceptor = createRequestInterceptor();
1521
requestInterceptorId = axios.interceptors.request.use(requestInterceptor);
1622
}
1723
}
1824

19-
setupRequestInterceptor();
20-
21-
type ResponseInterceptorOptions = {
22-
isFederatedAuth: boolean;
23-
};
24-
2525
export function setupResponseInterceptor({
2626
isFederatedAuth,
27-
}: ResponseInterceptorOptions): void {
27+
}: InterceptorOptions): void {
2828
if (responseInterceptorId === null) {
2929
const responseInterceptor = isFederatedAuth
3030
? createFederatedResponseInterceptor()

0 commit comments

Comments
 (0)