From ec3adab891eda5351c0851b3143fd21b820639ef Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:41:18 +0530 Subject: [PATCH 1/7] chore: update flo-ai version in floware --- .../server/modules/agents_module/pyproject.toml | 2 +- .../modules/knowledge_base_module/pyproject.toml | 2 +- wavefront/server/modules/tools_module/pyproject.toml | 2 +- wavefront/server/uv.lock | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/wavefront/server/modules/agents_module/pyproject.toml b/wavefront/server/modules/agents_module/pyproject.toml index 10f1f321..63019d89 100644 --- a/wavefront/server/modules/agents_module/pyproject.toml +++ b/wavefront/server/modules/agents_module/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "flo-utils", "tools-module", "api-services-module", - "flo-ai==1.1.0-rc5", + "flo-ai==1.1.0-rc6", ] [tool.uv.sources] diff --git a/wavefront/server/modules/knowledge_base_module/pyproject.toml b/wavefront/server/modules/knowledge_base_module/pyproject.toml index 49b47823..1368c711 100644 --- a/wavefront/server/modules/knowledge_base_module/pyproject.toml +++ b/wavefront/server/modules/knowledge_base_module/pyproject.toml @@ -17,7 +17,7 @@ dependencies = [ "pandas~=2.2.3", "ollama~=0.4.8", "textract~=1.6.5", - "flo-ai==1.1.0-rc5", + "flo-ai==1.1.0-rc6", "google-cloud-pubsub~=2.30.0", "boto3<=1.38.40", "pyyaml>=6.0.3,<7", diff --git a/wavefront/server/modules/tools_module/pyproject.toml b/wavefront/server/modules/tools_module/pyproject.toml index 9478878b..179ff579 100644 --- a/wavefront/server/modules/tools_module/pyproject.toml +++ b/wavefront/server/modules/tools_module/pyproject.toml @@ -3,7 +3,7 @@ name = "tools_module" version = "0.1.0" description = "Tools module for Flo AI agent system" dependencies = [ - "flo-ai==1.1.0-rc5", + "flo-ai==1.1.0-rc6", "flo_cloud", "datasource", diff --git a/wavefront/server/uv.lock b/wavefront/server/uv.lock index 258a3d7e..eb2a04d7 100644 --- a/wavefront/server/uv.lock +++ b/wavefront/server/uv.lock @@ -90,7 +90,7 @@ dependencies = [ requires-dist = [ { name = "api-services-module", editable = "modules/api_services_module" }, { name = "common-module", editable = "modules/common_module" }, - { name = "flo-ai", specifier = "==1.1.0rc5" }, + { name = "flo-ai", specifier = "==1.1.0rc6" }, { name = "flo-cloud", editable = "packages/flo_cloud" }, { name = "flo-utils", editable = "packages/flo_utils" }, { name = "tools-module", editable = "modules/tools_module" }, @@ -1356,7 +1356,7 @@ wheels = [ [[package]] name = "flo-ai" -version = "1.1.0rc5" +version = "1.1.0rc6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1377,9 +1377,9 @@ dependencies = [ { name = "pypdf" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/1d/3ed8c9e8f140ccf37c3e8b4a2676ffe3da74e2a43ab46c5f501765fd7f4f/flo_ai-1.1.0rc5.tar.gz", hash = "sha256:418d73a1ef7d1a41fa8c039037628985fb3b9cdc3918acb4e84587e8b70c519c", size = 83464, upload-time = "2025-12-02T14:19:35.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/43/16a20cacc46837d0a754df706d4e7ad91c07414617f35a947a143924538a/flo_ai-1.1.0rc6.tar.gz", hash = "sha256:07eeed7b7ed5ce283c72164df311480f529cdb28f304b16e63dd054d6ee9177b", size = 89942, upload-time = "2025-12-13T12:52:58.197Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/d8/07806187b0a3ff8debe08d06881222c39bd5087fd868c151ac2ab8f54099/flo_ai-1.1.0rc5-py3-none-any.whl", hash = "sha256:e7e1929a45333c8c3584bbe6252e138dcd9d3c12036762d1b875f9414852209c", size = 106332, upload-time = "2025-12-02T14:19:33.686Z" }, + { url = "https://files.pythonhosted.org/packages/f5/1e/3ef796ef1cf45235e68792731b832eb89f58b10e134597296f84001b1a7d/flo_ai-1.1.0rc6-py3-none-any.whl", hash = "sha256:2c47dc341930ea93a0a7a61d7d59a6e30068063742ff4b8052805dc4fb062bb1", size = 114499, upload-time = "2025-12-13T12:52:56.293Z" }, ] [[package]] @@ -2576,7 +2576,7 @@ dev = [ requires-dist = [ { name = "boto3", specifier = "<=1.38.40" }, { name = "datasource", editable = "plugins/datasource" }, - { name = "flo-ai", specifier = "==1.1.0rc5" }, + { name = "flo-ai", specifier = "==1.1.0rc6" }, { name = "flo-cloud", editable = "packages/flo_cloud" }, { name = "google-cloud-pubsub", specifier = "~=2.30.0" }, { name = "numpy", specifier = ">=1.24,<2.0" }, @@ -5482,7 +5482,7 @@ dev = [ requires-dist = [ { name = "common-module", editable = "modules/common_module" }, { name = "datasource", editable = "plugins/datasource" }, - { name = "flo-ai", specifier = "==1.1.0rc5" }, + { name = "flo-ai", specifier = "==1.1.0rc6" }, { name = "flo-cloud", editable = "packages/flo_cloud" }, { name = "knowledge-base-module", editable = "modules/knowledge_base_module" }, { name = "plugins-module", editable = "modules/plugins_module" }, From 54c3c0e2662cdfddd181119cedace50172b251b5 Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:41:53 +0530 Subject: [PATCH 2/7] fix: app delete bug --- wavefront/client/src/api/app-service.ts | 8 ++++++-- wavefront/client/src/components/AppCard.tsx | 4 +++- wavefront/client/src/pages/apps/index.tsx | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/wavefront/client/src/api/app-service.ts b/wavefront/client/src/api/app-service.ts index ce617c01..108faa85 100644 --- a/wavefront/client/src/api/app-service.ts +++ b/wavefront/client/src/api/app-service.ts @@ -34,8 +34,12 @@ export class AppService { return response; } - async deleteApp(appId: string): Promise { - const response: IApiResponse = await this.http.delete(`/v1/apps/${appId}`); + async deleteApp(appId: string, deleteDeployment: boolean): Promise { + const response: IApiResponse = await this.http.delete(`/v1/apps/${appId}`, { + params: { + delete_deployment: deleteDeployment, + }, + }); return response; } diff --git a/wavefront/client/src/components/AppCard.tsx b/wavefront/client/src/components/AppCard.tsx index f4476080..0ca9d15b 100644 --- a/wavefront/client/src/components/AppCard.tsx +++ b/wavefront/client/src/components/AppCard.tsx @@ -51,7 +51,9 @@ const AppCard: React.FC = ({ app, onClick, onDeleteClick }) => {

{app.app_name}

{app.public_url}

-
{dayjs(app.updated_at).format('DD MMM YYYY')}
+
+ Updated on {dayjs(app.updated_at || app.created_at).format('DD/MM/YYYY')} +
); }; diff --git a/wavefront/client/src/pages/apps/index.tsx b/wavefront/client/src/pages/apps/index.tsx index f0251755..f0efa15b 100644 --- a/wavefront/client/src/pages/apps/index.tsx +++ b/wavefront/client/src/pages/apps/index.tsx @@ -35,7 +35,8 @@ const Dashboard: React.FC = () => { setDeleting(true); try { - await floConsoleService.appService.deleteApp(deleteItem.id); + const deleteDeployment = deleteItem.deployment_type === 'auto'; + await floConsoleService.appService.deleteApp(deleteItem.id, deleteDeployment); notifySuccess(`App "${deleteItem.app_name}" deleted successfully`); // Refresh the apps list From 7b3dbc320a2dcb59d994b84a5b22ce9faa9bb68d Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:49:16 +0530 Subject: [PATCH 3/7] chore: add sample env file for client --- wavefront/client/{.env => .env.sample} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename wavefront/client/{.env => .env.sample} (100%) diff --git a/wavefront/client/.env b/wavefront/client/.env.sample similarity index 100% rename from wavefront/client/.env rename to wavefront/client/.env.sample From 1fd713c5bfc926f537e1da9c0330b48dd5717041 Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:50:11 +0530 Subject: [PATCH 4/7] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 27a02c09..409fc83d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ examples/local/* node_modules/ .vite flo_ai/usecases +.env \ No newline at end of file From afc551fc9549de531616ce2a95a2e4639f9e8ef7 Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:50:59 +0530 Subject: [PATCH 5/7] add docker compose for dev --- wavefront/DOCKER_SETUP.md => DOCKER_SETUP.md | 0 docker-compose.dev.yml | 34 ++++++++++++++++++++ 2 files changed, 34 insertions(+) rename wavefront/DOCKER_SETUP.md => DOCKER_SETUP.md (100%) create mode 100644 docker-compose.dev.yml diff --git a/wavefront/DOCKER_SETUP.md b/DOCKER_SETUP.md similarity index 100% rename from wavefront/DOCKER_SETUP.md rename to DOCKER_SETUP.md diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 00000000..a0b78199 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,34 @@ +version: '3.8' + +services: + postgres: + image: ankane/pgvector + container_name: postgres + restart: always + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=floware + ports: + - '5432:5432' + volumes: + - /var/lib/postgres-data:/var/lib/postgresql/data + - /var/lib/init.sql:/docker-entrypoint-initdb.d/init.sql + networks: + - floware-network + + redis: + image: redis:7.4 + container_name: redis + ports: + - "6379:6379" + networks: + - floware-network + +volumes: + db: + driver: local + +networks: + floware-network: + driver: bridge From aad58a15a0e6db89368454b6ae1a4001ab6c1a65 Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:53:02 +0530 Subject: [PATCH 6/7] fix error messages and minor ui fixes --- .../src/pages/apps/[appId]/agents/[id].tsx | 129 +++++++++--------- .../apps/[appId]/model-inference/index.tsx | 7 + .../src/pages/apps/[appId]/workflows/[id].tsx | 1 - wavefront/client/src/pages/apps/create.tsx | 6 +- wavefront/client/src/pages/apps/layout.tsx | 9 +- wavefront/client/src/types/app.ts | 1 + .../message_processor_controller.py | 4 +- .../services/message_processor_service.py | 6 +- 8 files changed, 87 insertions(+), 76 deletions(-) diff --git a/wavefront/client/src/pages/apps/[appId]/agents/[id].tsx b/wavefront/client/src/pages/apps/[appId]/agents/[id].tsx index 9c99a7af..7fc00061 100644 --- a/wavefront/client/src/pages/apps/[appId]/agents/[id].tsx +++ b/wavefront/client/src/pages/apps/[appId]/agents/[id].tsx @@ -485,7 +485,6 @@ const AgentDetail: React.FC = () => { setUploadedImages([]); } catch (error) { console.error('Error running inference:', error); - notifyError('Failed to run inference. Please try again.'); } finally { setRunningInference(false); } @@ -516,7 +515,7 @@ const AgentDetail: React.FC = () => { - {agent?.name || id} + {agent?.name} @@ -526,71 +525,73 @@ const AgentDetail: React.FC = () => { ) : !agent ? (
Agent not found
) : ( -
-
-

{agent.name}

-
- - + <> +
+
+

{agent.name}

+
+ + +
-
- )} - - - {/* Edit Agent Dialog */} - { - setYamlContent(updatedYamlContent); - setSelectedTools(updatedSelectedTools); - handleSave(updatedYamlContent); - }} - saving={saving} - /> - - {/* Delete Confirmation Dialog */} - setDeleteItem(null)} - loading={deleteAgentMutation.isPending} - /> + + + {/* Edit Agent Dialog */} + { + setYamlContent(updatedYamlContent); + setSelectedTools(updatedSelectedTools); + handleSave(updatedYamlContent); + }} + saving={saving} + /> + + {/* Delete Confirmation Dialog */} + setDeleteItem(null)} + loading={deleteAgentMutation.isPending} + /> + + )}
); }; diff --git a/wavefront/client/src/pages/apps/[appId]/model-inference/index.tsx b/wavefront/client/src/pages/apps/[appId]/model-inference/index.tsx index bce2c267..061da0b7 100644 --- a/wavefront/client/src/pages/apps/[appId]/model-inference/index.tsx +++ b/wavefront/client/src/pages/apps/[appId]/model-inference/index.tsx @@ -20,6 +20,7 @@ import { useQueryClient } from '@tanstack/react-query'; import React, { useState } from 'react'; import { useNavigate, useParams } from 'react-router'; import CreateModelInferenceDialog from './CreateModelInferenceDialog'; +import { Alert, AlertDescription, AlertTitle } from '@app/components/ui/alert'; const ModelManagement: React.FC = () => { const { app: appId } = useParams<{ app: string }>(); @@ -140,6 +141,12 @@ const ModelManagement: React.FC = () => {
+
+ + Coming soon + This feature is currently in alpha and is not ready for production. + +
{loading ? ( <> diff --git a/wavefront/client/src/pages/apps/[appId]/workflows/[id].tsx b/wavefront/client/src/pages/apps/[appId]/workflows/[id].tsx index 919765d3..41d2506d 100644 --- a/wavefront/client/src/pages/apps/[appId]/workflows/[id].tsx +++ b/wavefront/client/src/pages/apps/[appId]/workflows/[id].tsx @@ -428,7 +428,6 @@ const WorkflowDetail: React.FC = () => { } } catch (error) { console.error('Error running inference:', error); - notifyError('Failed to run inference. Please try again.'); } finally { if (!listenEventsEnabled) { setRunningInference(false); diff --git a/wavefront/client/src/pages/apps/create.tsx b/wavefront/client/src/pages/apps/create.tsx index b3108533..684265f8 100644 --- a/wavefront/client/src/pages/apps/create.tsx +++ b/wavefront/client/src/pages/apps/create.tsx @@ -18,7 +18,7 @@ type TCreateAppInputSchema = z.infer; const CreateApp: React.FC = () => { const navigate = useNavigate(); - const { notifySuccess, notifyError } = useNotifyStore(); + const { notifySuccess } = useNotifyStore(); const [creating, setCreating] = useState(false); const [pollingAppId, setPollingAppId] = useState(null); @@ -58,10 +58,9 @@ const CreateApp: React.FC = () => { } setPollingAppId(null); setCreating(false); - notifyError('Failed to check app status'); } }, - [notifySuccess, notifyError, navigate] + [navigate] ); // Effect to handle polling @@ -116,7 +115,6 @@ const CreateApp: React.FC = () => { } } catch (error) { console.error('Error creating app:', error); - notifyError('Failed to create app'); setCreating(false); } }; diff --git a/wavefront/client/src/pages/apps/layout.tsx b/wavefront/client/src/pages/apps/layout.tsx index 0ef4afdd..c398a85c 100644 --- a/wavefront/client/src/pages/apps/layout.tsx +++ b/wavefront/client/src/pages/apps/layout.tsx @@ -55,6 +55,7 @@ const navItems = [ icon: ModelInferenceIcon, link: `/apps/:appId/model-inference`, description: 'Manage and configure model inference for this application', + alpha: true, }, { id: 'knowledge-bases', @@ -120,9 +121,13 @@ const AppLayout: React.FC = () => {

- {item.name} + {item.name} + {item.alpha && alpha}

; public_url: string; diff --git a/wavefront/server/modules/plugins_module/plugins_module/controllers/message_processor_controller.py b/wavefront/server/modules/plugins_module/plugins_module/controllers/message_processor_controller.py index ba8a3a44..17038a4f 100644 --- a/wavefront/server/modules/plugins_module/plugins_module/controllers/message_processor_controller.py +++ b/wavefront/server/modules/plugins_module/plugins_module/controllers/message_processor_controller.py @@ -320,7 +320,5 @@ async def execute_message_processor( except Exception as e: return JSONResponse( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - content=response_formatter.buildErrorResponse( - f'Error executing message processor: {str(e)}' - ), + content=response_formatter.buildErrorResponse(str(e)), ) diff --git a/wavefront/server/modules/plugins_module/plugins_module/services/message_processor_service.py b/wavefront/server/modules/plugins_module/plugins_module/services/message_processor_service.py index ab1bb6b2..3c119e2f 100644 --- a/wavefront/server/modules/plugins_module/plugins_module/services/message_processor_service.py +++ b/wavefront/server/modules/plugins_module/plugins_module/services/message_processor_service.py @@ -66,8 +66,10 @@ def _do_request(): }, timeout=10, ) - resp.raise_for_status() - return resp.json() + resp_json = resp.json() + if resp.status_code != 200: + raise Exception(resp_json['details']) + return resp_json loop = asyncio.get_running_loop() return await loop.run_in_executor(None, _do_request) From a353103b2fa32b9ec5d25cfa2ce336c8a828ead1 Mon Sep 17 00:00:00 2001 From: vishnu r kumar Date: Mon, 15 Dec 2025 11:53:35 +0530 Subject: [PATCH 7/7] update server.js with connect-src --- wavefront/client/server.cjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wavefront/client/server.cjs b/wavefront/client/server.cjs index a296ad6f..877c06ce 100644 --- a/wavefront/client/server.cjs +++ b/wavefront/client/server.cjs @@ -5,7 +5,7 @@ const path = require('path'); const PORT = process.env.PORT || 3000; const NAMESPACE = process.env.NAMESPACE || 'staging-aws'; -const BASE_URL = process.env.BASE_URL || `https://${NAMESPACE}.rootflo.ai/wavefront`; +const BASE_URL = process.env.BASE_URL || `https://${NAMESPACE}.rootflo.ai/floconsole`; const APP_ENV = process.env.APP_ENV || 'production'; const FEATURE_API_SERVICES = process.env.FEATURE_API_SERVICES || 'false'; @@ -51,6 +51,7 @@ app.get('*', (req, res) => { // Generate nonce for CSP const nonce = crypto.randomBytes(16).toString('base64'); const defaultSrc = `'self'`; + const connectSrc = `'self' ${new URL(BASE_URL).origin}`; const scriptSrc = `'self' 'nonce-${nonce}'`; const styleSrc = `'self' 'unsafe-inline'`; const mediaSrc = `'self' https://storage.googleapis.com https://*.s3.amazonaws.com`; @@ -61,7 +62,7 @@ app.get('*', (req, res) => { 'Cache-Control': 'no-store, no-cache, must-revalidate, private', Pragma: 'no-cache', Expires: '0', - 'Content-Security-Policy': `default-src ${defaultSrc}; script-src ${scriptSrc}; style-src ${styleSrc}; frame-ancestors ${frameAncestors}; img-src ${imgSrc}; media-src ${mediaSrc}`, + 'Content-Security-Policy': `default-src ${defaultSrc}; connect-src ${connectSrc} script-src ${scriptSrc}; style-src ${styleSrc}; frame-ancestors ${frameAncestors}; img-src ${imgSrc}; media-src ${mediaSrc}`, 'X-Content-Type-Options': 'nosniff', 'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload', });