Conversation
…and improvement, ai extraction for tables
feat: enhance BitFromStringNode to handle "hub:id" format for bit_id fix: harmonize value types in SelectNode for better type consistency refactor: consolidate tool results into a single User message in A2UICopilot fix: improve CopyPasteCommand to handle variable references correctly fix: update MoveNodeCommand to retain original coordinates for input/return nodes refactor: streamline tool results handling in FlowCopilot feat: add variable handling in CopyPasteCommand for better variable management fix: ensure FlowNode updates coordinates correctly during move operations feat: enhance FlowPreview to accept comments and layers for better rendering refactor: optimize FlowTemplateSelector to prioritize diverse templates fix: update DeviceFlowDialog to use merged scopes for OAuth fix: improve TemplatePreview to render comments and layers correctly feat: extend ICopyPaste interface to include original_variables for copy-paste operations feat: add getProfileBits method to IBitState for better bit management feat: implement getProfileBits in EmptyBitState for consistency
…steps and display upcoming steps
…webhook support - Added remote webhook setup for Discord, including public key input and instructions. - Updated HTTP configuration to support local and remote endpoint URLs with tabs. - Implemented webhook management for Telegram, including status checks and setup instructions. - Introduced dynamic sink availability checks based on hub configuration for translation events. - Enhanced interfaces to include hub and eventId for better context in configurations.
- Implemented `useMediaUpload` hook for handling media uploads (images and videos) with progress tracking and placeholder nodes. - Updated flow board parsing to differentiate between media and text comments. - Added new API key state management for handling technical users and API keys. - Introduced sales state management for app sales, discounts, and analytics. - Created a tool for generating scoped sink trigger JWTs for various services. - Updated package dependencies and added new libraries for enhanced functionality.
…nhance ProgressToast styling
- Created a new section for AI Models & Setup, detailing supported providers and configuration steps. - Added an overview of GenAI capabilities, including application types and core concepts. - Introduced a comprehensive guide on Retrieval-Augmented Generation (RAG) for document-based AI responses. - Developed a detailed overview of building internal tools using the A2UI system, covering components, data binding, and best practices.
…onent - Added pricing pages for Korean, Dutch, Portuguese, Swedish, and Chinese. - Updated the main pricing page to include English version. - Replaced BlogHeader component with Header component in multiple index pages. - Adjusted hero section styling for better layout. - Enhanced AWS and GCP credentials handling by renaming log prefix to runs prefix. - Updated API routes to support new execution backend configurations. - Introduced SSE streaming support for Lambda SDK in invoke_board. - Added ONNX Runtime initialization functionality in catalog. - Updated MinIO setup script to reflect changes in log paths.
…d OCR types - Implement tests for audio data creation, mono/stereo conversion, and resampling. - Add serialization tests for speech segments, transcription segments, and VAD results. - Create tests for depth map functionality and depth provider serialization. - Include tests for face embedding cosine similarity and Euclidean distance calculations. - Add serialization tests for detected faces and landmark types. - Implement OCR region and recognized text serialization tests. - Verify node metadata for various ONNX nodes ensuring execution pins and descriptions are present.
- Simplified conditional checks using `&&` in multiple locations to reduce nesting and improve clarity. - Updated various functions across the codebase to enhance performance and maintainability. - Removed unnecessary variable assignments and streamlined logic in several areas. - Cleaned up imports and unused code to adhere to best practices.
- Removed unused imports and organized existing ones in `technical-user-management.tsx`, `shortcuts.tsx`, and `share-button.tsx`. - Improved code readability by formatting and restructuring JSX elements in `technical-user-management.tsx`, `spotlight-dialog.tsx`, `empty-state.tsx`, `flow-background.tsx`, `loading-screen.tsx`, `not-found-page.tsx`, and `sheet.tsx`. - Enhanced consistency in function definitions and hooks in `use-copilot-sdk.tsx`, `use-media-upload.ts`, and `flowpilot-db.ts`. - Updated CSS animations and styles for better performance and clarity in `global.css`. - Added type annotations and improved type safety in various files, including `download-manager.ts` and `gen-sink-jwt.ts`. - Ensured consistent formatting and spacing throughout the codebase for improved maintainability.
…ages - Implemented a new script `generate-licenses.ts` to collect and generate licenses for Rust and npm packages. - The script scans specified package.json files and the Cargo registry for license information. - Outputs individual license files for Rust and npm, as well as a combined license file. - Includes functionality to read license texts from files and deduplicate entries. - Provides summary statistics on the collected licenses.
- Introduced `use-peer-users` hook for managing peer user information with caching and color assignment based on user `sub`. - Updated `FlowLayerIndicators` to utilize peer user info for displaying names, colors, and avatars. - Modified `FlowNode` and `FlowWrapper` components to support user `sub` for real-time collaboration. - Refactored `useRealtimeCollaboration` to streamline user state management and awareness updates. - Added schema versioning to nodes for migration purposes across various commands and interfaces. - Improved UI components for better user experience and responsiveness.
…nd models - Added `ToSchema` derive macro to various structs in user-related routes (create_pat, delete_pat, get_pats, pricing, subscribe, templates, upsert_info, widgets) for OpenAPI schema generation. - Defined OpenAPI paths for user routes including request bodies and responses. - Updated Cargo.toml to include `utoipa` as an optional dependency and added relevant features for OpenAPI support. - Refactored user shortcuts component to support drag-and-drop reordering with DnD Kit. - Updated data lake and ONNX packages to improve functionality and compatibility with new features. - Adjusted various structs in core and wasm packages to include OpenAPI schema generation.
- Added OpenAPI path annotations for `GET /apps/{app_id}/widgets` to list widgets with localization support.
- Added OpenAPI path annotations for `PUT /apps/{app_id}/widgets/{widget_id}` to create or update widgets.
feat(profile): enhance profile image handling and upload URL generation
- Implemented `generate_upload_url` and `delete_old_image` functions for managing profile images.
- Updated profile routes to utilize new image handling functions.
- Improved error handling and logging for profile image operations.
fix(profile): correct profile ID usage in profile routes
- Fixed incorrect usage of profile ID in `get_profiles`, `sync_profiles`, and `upsert_profile` routes.
feat(sink): add profile JSON to sink configuration
- Added `profile_json` field to `SinkConfig` to store the last updater's profile for trigger execution.
- Updated sync logic to handle the new profile JSON field.
feat(executor): support user profiles in execution requests
- Added `profile` field to `ExecutionRequest` to allow passing user profiles during execution.
fix(ui): improve model catalog filtering based on hosting capabilities
- Updated model filtering logic in `FlowPilot` and `AIModelPage` to exclude local models when hosting is not supported.
refactor(ui): enhance model catalog page layout
- Refactored layout of the model catalog page to improve mobile responsiveness and usability.
- Introduced a new mobile filter sheet for better accessibility on smaller screens.
fix(board): refine pin matching logic for generic value types
- Improved logic in `findMatchingPin` and `connectLayerToDroppedPin` to handle generic value type enforcement correctly.
…ty with OAuth metadata sync
…w TokenizerSizer struct
…d enhance TypeScript configuration - Added custom styles for maplibre popups to improve UI consistency. - Upgraded `lucide-react` to version 0.563.0 and added `maplibre-gl` dependency at version 5.17.0. - Enhanced `ExecutionServiceProvider` to fetch board state when not remote, falling back to prerun variables on failure. - Introduced a new Tailwind CSS configuration file for better styling management. - Updated TypeScript configuration to include base URL and path mappings for cleaner imports.
- Updated category strings in various A2UI elements to use "UI" instead of "A2UI" for better clarity and uniformity across the codebase. - Adjusted the WriteCsvToTable node to support both CSV text and Table data, enhancing its functionality. - Improved the GeoMap component by refining the viewport handling and updating styles for better visual presentation. - Added support for setting the viewport in GeoMap components across various parts of the application.
- Implemented `update_schemas.rs` to define input schemas for various A2UI elements including GeoMap, Model3D, Scene3D, Sprite, Chart styles, Labeler Box, Hotspot, Table, and Media Sources. - Created `update_sprite.rs` to manage sprite properties such as source, position, and transform. - Developed `update_table.rs` to handle table operations including setting data, columns, adding/removing rows, and updating cells. - Removed the deprecated `update_table_cell.rs` in favor of the unified table update node. - Introduced `update_toggle.rs` to manage checkbox and switch states with operations to set, toggle, and get the checked state.
- Introduced `EmbeddingUsageTracking` entity for tracking embedding usage statistics. - Updated `User` model to include `total_embedding_price` and related relations. - Implemented new routes for embedding operations, including `/embeddings/embed`. - Added support for remote embedding execution via API proxy in the embedding factory. - Enhanced existing embedding models to support remote execution configurations. - Updated API calls to handle embedding requests and responses, including error handling. - Improved caching mechanisms for embedding models and secrets.
- Updated entity documentation to indicate generation by sea-orm-codegen. - Changed `PartialEq` to `Eq` in entity model derives for stricter equality checks. - Removed unnecessary comments and improved code readability across multiple entities. - Adjusted field types and attributes for better alignment with database schema. - Added new enums for `DiscountType`, `NotificationType`, and `PurchaseStatus`. - Enhanced relationships in the `user` entity to include new associations. - Refined JSON handling in entities to use `JsonBinary` where applicable. - Ensured all entities have consistent field naming conventions and types.
…lity directly into RolesPage - Deleted RoleFilters component to simplify role management UI. - Integrated search input directly into RolesPage for better user experience. - Updated filtering logic to handle roles based on search term. - Removed unused sorting and tagging functionalities for clarity. - Adjusted layout and styling for improved visual consistency. fix: update RolePermissions to include new permissions and deprecate old ones - Added new permissions for events and courses. - Deprecated old permissions related to releases. - Ensured RolePermissions class remains in sync with backend definitions. feat: enhance event execution handling with alwaysRemote flag - Introduced alwaysRemote flag in IEventState to manage remote execution of events. - Updated ExecutionServiceProvider to utilize alwaysRemote for determining execution context. - Improved handling of secrets based on execution context. style: improve text editor overflow handling - Added overflow handling styles to TextEditorStatic for better content display.
- Introduced OnlineProfile type and conversion function toLocalProfile for managing user profiles. - Implemented getDefaultApiBase function to retrieve API base URL. - Refactored AWS, Azure, GCP, and R2 credentials to use new HTTPClient initialization method without refetch. - Enhanced bit and board routes to utilize the new HTTPClient method. - Added TDMS data handling capabilities, including BatchInsertTdmsLocalDatabaseNode for inserting TDMS data into a vector database. - Created TdmsMetadataNode for extracting metadata from TDMS files. - Updated execution service context to improve handling of remote execution scenarios. - Improved error handling and logging for TDMS processing. - Added optional dependencies for TDMS and tempfile in Cargo.toml.
…mespace feat: add optional _force parameter to getEvents method in EmptyEventState refactor: update IEventState interface to include optional force parameter in getEvents method
- Implemented new usage tracking routes for LLM, embedding, and execution usage history. - Added pagination support for usage history retrieval. - Created a summary endpoint for aggregated usage data. - Introduced new data models and interfaces for usage records. - Updated frontend components to handle usage tracking data. - Refactored global styles and layout for improved responsiveness. - Enhanced error handling in storage operations. - Cleaned up redundant code in storage component.
|
@gemini-code-assist review |
Summary of ChangesHello @felix-schultz, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly expands the platform's event-driven capabilities by introducing new AWS Lambda and Docker Compose services for event bridging and sink management. It also enhances the robustness and observability of existing backend services through improved logging and error monitoring. Concurrently, the desktop application receives major updates, including new administrative features, detailed board statistics, and a more resilient profile synchronization mechanism. These changes collectively lay a stronger foundation for modular, observable, and maintainable event-driven workflows across both cloud and desktop environments. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This is a huge and impressive pull request that introduces a web application, a suite of backend services for event sinks, and major improvements to logging, configuration, and developer experience. The new features like the aws-event-bridge lambda, the sink-services for Docker Compose, and the Kubernetes sink triggers are well-architected. The consistent logging improvements across all services are a great step towards better observability. The addition of profile syncing and a purchase flow for the desktop app are also significant enhancements. My review focuses on some opportunities for performance optimization in the new event-bridge service and a potential performance regression in route handling. I've also included some minor suggestions for consistency and code clarity. Overall, this is a fantastic contribution.
| for event_id in &app.events { | ||
| if let Ok(event) = app.get_event(event_id, None).await | ||
| && event.route.as_deref() == Some(&path) | ||
| { | ||
| return Ok(Some(RouteMapping { | ||
| path, | ||
| event_id: event.id, | ||
| })); | ||
| } | ||
| } | ||
|
|
||
| Ok(None) | ||
| } |
There was a problem hiding this comment.
This implementation now iterates through all events in an app to find a matching route. For apps with a large number of events, this O(n) lookup on every request could become a performance bottleneck. Consider re-introducing a cached HashMap<String, String> on the App struct that maps routes to event IDs. This map could be populated once when the app is loaded, ensuring O(1) lookups for routes.
There was a problem hiding this comment.
This is only for local file reads (small config files for events). Maximum 30 events / use case. Should be fine.
| fn get_sink_jwt() -> Result<&'static str, Error> { | ||
| if let Some(value) = SINK_JWT.get() { | ||
| return Ok(value.as_str()); | ||
| } | ||
|
|
||
| let value = env::var("SINK_JWT").map_err(|_| Error::from("SINK_JWT not set"))?; | ||
| let _ = SINK_JWT.set(value); | ||
| Ok(SINK_JWT | ||
| .get() | ||
| .expect("SINK_JWT value must be initialized") | ||
| .as_str()) | ||
| } |
There was a problem hiding this comment.
This function can be simplified. You can use a single match on the env::var result and then rely on OnceLock::set's behavior (it's fine if it fails because another thread set the value). The expect is safe, but this approach is slightly cleaner and avoids the unwrap.
| fn get_sink_jwt() -> Result<&'static str, Error> { | |
| if let Some(value) = SINK_JWT.get() { | |
| return Ok(value.as_str()); | |
| } | |
| let value = env::var("SINK_JWT").map_err(|_| Error::from("SINK_JWT not set"))?; | |
| let _ = SINK_JWT.set(value); | |
| Ok(SINK_JWT | |
| .get() | |
| .expect("SINK_JWT value must be initialized") | |
| .as_str()) | |
| } | |
| fn get_sink_jwt() -> Result<&'static str, Error> { | |
| if let Some(value) = SINK_JWT.get() { | |
| return Ok(value.as_str()); | |
| } | |
| let value = env::var("SINK_JWT").map_err(|_| Error::from("SINK_JWT not set"))?; | |
| // The `set` method returns an error if the value is already set, which is fine. | |
| // We can ignore the result, as `get` will return the value in either case. | |
| let _ = SINK_JWT.set(value); | |
| // `get` is guaranteed to return `Some` here. | |
| Ok(SINK_JWT.get().unwrap().as_str()) | |
| } |
| } | ||
|
|
||
| tracing::info!("🚀 Starting {} sink", sink_type); | ||
| println!("🚀 [SINK_MANAGER] Starting {} sink", sink_type); |
There was a problem hiding this comment.
It seems tracing has been replaced with println!. While this works for debugging, using the tracing crate is more idiomatic and flexible for logging in Rust applications. It allows for structured logging, different log levels, and configurable output sinks. I'd recommend sticking with tracing::info! and configuring a subscriber that prints to stdout for debugging purposes if needed.
| println!("🚀 [SINK_MANAGER] Starting {} sink", sink_type); | |
| tracing::info!("🚀 [SINK_MANAGER] Starting {} sink", sink_type); |
There was a problem hiding this comment.
Code Review
This is a massive pull request introducing a web app, a new aws-event-bridge lambda, and services for handling event sinks like cron, Discord, and Telegram. It also significantly improves logging and error monitoring across backend services. A major new feature is the integration of the GitHub Copilot SDK for AI-assisted development. Profile syncing between devices has been implemented. There are also many dependency updates and configuration changes to support these new features. My review focuses on performance, maintainability, and correctness. I've identified a performance issue in the new event-bridge lambda and some maintainability concerns regarding duplicated files and fragile build steps. Overall, this is a substantial and well-executed feature addition.
There was a problem hiding this comment.
Code Review
This is a substantial pull request that introduces a wide range of new features and improvements, including a new web application, event sink services for cron, Discord, and Telegram, and significant enhancements to logging, profile syncing, and AI capabilities with GitHub Copilot integration. The overall code quality is high, and the new features are well-structured. I've identified a few areas for improvement, primarily focusing on performance and observability in the new aws-event-bridge Lambda. Specifically, I've suggested reusing the reqwest::Client and caching environment variables to improve performance, and enhancing error logging for better debuggability. I've also made minor suggestions for file formatting consistency. The parallelization of event handling in the Tauri backend is a noteworthy improvement that will enhance responsiveness.
| let client = get_http_client(); | ||
| let trigger_url = format!("{}/api/v1/sink/trigger/async", api_base_url); | ||
|
|
||
| let request_body = TriggerRequest { |
There was a problem hiding this comment.
Using unwrap_or_default() when reading the response body can hide potential errors during body deserialization. If reading the body fails, the log will show an empty body, which can be misleading when debugging API errors. It's better to handle the Result from response.text().await and log the error if it occurs.
| let request_body = TriggerRequest { | |
| let body = response.text().await.unwrap_or_else(|e| format!("<failed to read response body: {}>", e)); |
There was a problem hiding this comment.
Pull request overview
This PR expands the web/desktop app and self-hosting stack with new sink capabilities, improved observability, and additional infrastructure components (Kubernetes + Docker Compose), while also adding FlowPilot and several desktop app enhancements (profiles sync, purchases, notifications, deeplinks).
Changes:
- Added new sink infrastructure (Kubernetes sink-trigger + Docker Compose sink-services) and a static web container for self-hosting.
- Improved desktop app capabilities (Telegram sink config, profile sync helpers, purchase flow, notifications, deeplink navigation) and adjusted Tauri capabilities/windows.
- Standardized logging/tracing initialization across multiple Rust services and introduced new docs for FlowPilot + sinks.
Reviewed changes
Copilot reviewed 145 out of 1345 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/docs/src/content/docs/studio/overview.md | Adds FlowPilot to Studio overview navigation list |
| apps/docs/src/content/docs/studio/flowpilot.md | New FlowPilot documentation page and provider setup instructions |
| apps/docs/src/content/docs/self-hosting/kubernetes/storage.mdx | Updates documented log path prefix to runs/... |
| apps/docs/src/content/docs/self-hosting/docker-compose/storage.mdx | Updates documented log path prefix to runs/... |
| apps/docs/src/content/docs/dev/storage-providers.md | Updates documented log path prefix to runs/... |
| apps/docs/src/content/docs/dev/sinks/telegram.mdx | New Telegram sink documentation |
| apps/docs/src/content/docs/dev/sinks/index.mdx | New sinks overview documentation |
| apps/docs/src/content/docs/dev/sinks/http.mdx | New HTTP sink documentation |
| apps/docs/src/content/docs/dev/sinks/discord.mdx | New Discord sink documentation |
| apps/docs/src/content/docs/dev/sinks/cron.mdx | New Cron sink documentation |
| apps/desktop/src-tauri/src/state.rs | Makes tray runtime state desktop-only via cfg gating |
| apps/desktop/src-tauri/src/lib.rs | Initializes catalog runtime, adds notification plugin, spawns event executions, expands Tauri commands |
| apps/desktop/src-tauri/src/functions/settings/profiles.rs | Adds profile sync commands + profile icon access helpers |
| apps/desktop/src-tauri/src/functions/flow/run.rs | Disables secret filtering for desktop runs; sets offline user context |
| apps/desktop/src-tauri/src/functions/ai.rs | Adds Copilot SDK tools module |
| apps/desktop/src-tauri/src/functions.rs | Adds statistics module export |
| apps/desktop/src-tauri/src/event_sink/stubs.rs | Removes Telegram sink stub implementation |
| apps/desktop/src-tauri/src/event_sink.rs | Switches EventConfig serde format to tagged sink_type |
| apps/desktop/src-tauri/src/event_bus.rs | Marks event bus triggers as trusted (no secret filtering) |
| apps/desktop/src-tauri/src/deeplink.rs | Adds store and join deep link handlers emitting UI events |
| apps/desktop/src-tauri/gen/schemas/mobile-schema.json | Updates generated Tauri schema docs (fs/http permissions) |
| apps/desktop/src-tauri/gen/schemas/iOS-schema.json | Updates generated Tauri schema docs (fs/http permissions) |
| apps/desktop/src-tauri/gen/schemas/capabilities.json | Updates generated capabilities (more windows, additional localhost origins) |
| apps/desktop/src-tauri/gen/apple/flow-like-desktop_iOS/Info.plist | Bumps app version; adds encryption + photo library usage keys; removes URL scheme block |
| apps/desktop/src-tauri/gen/apple/flow-like-desktop.xcodeproj/project.pbxproj | Adds -lz linker flag for iOS targets |
| apps/desktop/src-tauri/capabilities/mobile.json | Allows https localhost origins for mobile capability |
| apps/desktop/src-tauri/capabilities/desktop.json | Expands allowed window labels and localhost origins |
| apps/desktop/src-tauri/build.rs | Links zlib on iOS in build script |
| apps/desktop/src-tauri/Info.plist | Adds ITSAppUsesNonExemptEncryption key |
| apps/desktop/src-tauri/Cargo.toml | Updates Tauri deps and adds Telegram/Copilot SDK related deps |
| apps/desktop/public/swimlanes/swimlanes.json | Updates desktop “swimlanes” content (docs/blog links, IDs) |
| apps/desktop/package.json | Updates Tauri + Next.js dependency versions |
| apps/desktop/lib/profile-sync.ts | Adds OnlineProfile mapping and default API base helper |
| apps/desktop/lib/event-config.ts | Adds telegram sink config defaults + sink availability metadata |
| apps/desktop/lib/api.ts | Adds extra API debug logging on fetches |
| apps/desktop/index.html | Adjusts viewport settings; adds data-desktop-app attribute |
| apps/desktop/components/useInvoke.tsx | Adds query invalidation helper for Tauri invokes |
| apps/desktop/components/toast-provider.tsx | Adds progress/completed/error listeners for toast/progress UX |
| apps/desktop/components/tauri-provider/user-state.ts | Adds methods to fetch profiles and all settings profiles |
| apps/desktop/components/tauri-provider/usage-state.ts | Adds usage history/summary state implementation |
| apps/desktop/components/tauri-provider/template-state.ts | Fixes template metadata merge keying by (appId, templateId) |
| apps/desktop/components/tauri-provider/sales-state.ts | Adds sales state implementation for UI |
| apps/desktop/components/tauri-provider/helper-state.ts | Includes filename in tmp asset flow and asset URL |
| apps/desktop/components/tauri-provider/event-state.ts | Adds remote streaming execution + progress/toast handling; adds force sync option |
| apps/desktop/components/tauri-provider/bit-state.ts | Adds getProfileBits method |
| apps/desktop/components/tauri-provider/app-state.ts | Adds purchaseApp method |
| apps/desktop/components/tauri-provider/api-key-state.ts | Adds API key management state |
| apps/desktop/components/spotlight-wrapper.tsx | Adjusts profiles invoke shape to Record and iterates values |
| apps/desktop/components/global-anchor-component.tsx | Adds WebviewWindow error listener |
| apps/desktop/components/download-notification-provider.tsx | Adds desktop notification fallback for completed downloads |
| apps/desktop/components/deeplink-navigation-handler.tsx | Routes UI based on deeplink events from Tauri |
| apps/desktop/components/auth-provider.tsx | Adds profile syncer, more robust OpenID config fetch, and additional logging |
| apps/desktop/components/app-sidebar.tsx | Adds FlowBackground wrapper, sinks/admin navigation, and auth-aware queries |
| apps/desktop/app/use/page.tsx | Forces remote event refresh via memoized getEvents wrapper |
| apps/desktop/app/store/page.tsx | Handles Stripe redirect status; wires purchasing state to UI |
| apps/desktop/app/store/components/useStoreData.ts | Implements purchase flow opening browser checkout and adds purchasing guard |
| apps/desktop/app/store/components/StoreInfo.tsx | Disables Buy button and shows “Processing…” while purchasing |
| apps/desktop/app/store/components/StoreHero.tsx | Adds ShareButton and requires appId prop |
| apps/desktop/app/settings/sinks/page.tsx | Expands sink summary formatting and improves empty state layout |
| apps/desktop/app/settings/profiles/page.tsx | Adjusts profiles invoke shape to Record |
| apps/desktop/app/page.tsx | Refines onboarding redirect logic with refetch and replace |
| apps/desktop/app/onboarding/page.tsx | Adds sign-in banner and profile restore from server after auth |
| apps/desktop/app/onboarding/done/page.tsx | Adjusts profiles invoke shape to Record |
| apps/desktop/app/not-found.tsx | Uses shared NotFoundPage component |
| apps/desktop/app/library/config/sales/page.tsx | Adds Sales dashboard route |
| apps/desktop/app/library/config/layout.tsx | Adds Sales nav item and paid-gating condition |
| apps/desktop/app/layout.tsx | Adds download notifications + deeplink navigation handler wrappers |
| apps/desktop/app/join/page.tsx | Adds app to local profile after joining via invite link |
| apps/desktop/app/flow/page.tsx | Passes authenticated user sub into FlowWrapper |
| apps/desktop/app/admin/sinks/page.tsx | Adds admin sink token management page |
| apps/desktop/.env.example | Adds desktop env example including API + redirect URLs |
| apps/backend/local/runtime/src/main.rs | Initializes catalog at startup and forwards user_context/profile in queued jobs |
| apps/backend/local/runtime/Cargo.toml | Adds flow-like-catalog dependency to local runtime |
| apps/backend/local/api/package.json | Fixes docker compose start script path |
| apps/backend/kubernetes/web/nginx.conf | Adds nginx config for static web export with /health |
| apps/backend/kubernetes/web/Dockerfile | Adds multi-stage build for Next.js static export served by nginx |
| apps/backend/kubernetes/sink-trigger/src/main.rs | Adds ultra-lean k8s sink trigger binary |
| apps/backend/kubernetes/sink-trigger/Dockerfile | Adds distroless build for sink-trigger |
| apps/backend/kubernetes/sink-trigger/Cargo.toml | Adds sink-trigger crate manifest |
| apps/backend/kubernetes/scripts/k3d-setup.sh | Builds and pushes web image; adds helm web values |
| apps/backend/kubernetes/helm/values.yaml | Adds configurable web deployment and sinkServices config |
| apps/backend/kubernetes/helm/templates/web-service.yaml | Adds web service template |
| apps/backend/kubernetes/helm/templates/web-hpa.yaml | Adds web HPA template |
| apps/backend/kubernetes/helm/templates/web-deployment.yaml | Adds web deployment template |
| apps/backend/kubernetes/helm/templates/sink-trigger-image.yaml | Adds sink-trigger image build documentation configmap |
| apps/backend/kubernetes/helm/templates/sink-secrets.yaml | Adds sink services secret/configmap templates |
| apps/backend/kubernetes/helm/templates/sink-cronjob.yaml | Adds RBAC + CronJob structure documentation template |
| apps/backend/kubernetes/helm/templates/ingress.yaml | Adds option to route ingress paths to web service |
| apps/backend/kubernetes/helm/templates/_helpers.tpl | Adds web selector/labels helpers |
| apps/backend/kubernetes/executor/src/main.rs | Initializes catalog runtime and telemetry in k8s executor |
| apps/backend/kubernetes/executor/Cargo.toml | Adds local-ml feature to flow-like-catalog dependency |
| apps/backend/kubernetes/README.md | Documents web deployment and local port-forwarding |
| apps/backend/docker-compose/web/nginx.conf | Adds nginx config for static web export with /health |
| apps/backend/docker-compose/web/Dockerfile | Adds multi-stage build for web static export in Compose |
| apps/backend/docker-compose/sink-services/src/main.rs | Adds sink services runner with cron/discord/telegram tasks |
| apps/backend/docker-compose/sink-services/src/cron.rs | Adds cron scheduler that syncs schedules from API |
| apps/backend/docker-compose/sink-services/src/api_client.rs | Adds API client for triggering sinks and fetching schedules/bots |
| apps/backend/docker-compose/sink-services/Dockerfile | Adds container build for sink services |
| apps/backend/docker-compose/sink-services/Cargo.toml | Adds sink services crate dependencies and feature flags |
| apps/backend/docker-compose/runtime/src/main.rs | Initializes catalog runtime and forwards user_context/profile in queued jobs |
| apps/backend/docker-compose/runtime/Cargo.toml | Adds flow-like-catalog dependency to compose runtime |
| apps/backend/docker-compose/flow-like.config.example.json | Adds example config including supported sinks list |
| apps/backend/docker-compose/docker-compose.yml | Adds sink-services + web services to compose stack |
| apps/backend/docker-compose/README.md | Documents web service and supported sinks in Compose |
| apps/backend/docker-compose/.env.example | Adds web app env variables for compose stack |
| apps/backend/aws/runtime-async/src/execution.rs | Removes old SQS execution handler file |
| apps/backend/aws/runtime-async/README.md | Removes old runtime-async README |
| apps/backend/aws/media-transformer/src/main.rs | Switches to tracing_subscriber with env-controlled log levels |
| apps/backend/aws/file-tracker/src/main.rs | Switches to tracing_subscriber with env-controlled log levels |
| apps/backend/aws/executor/src/main.rs | Adds env log filtering, Sentry integration, and catalog initialization |
| apps/backend/aws/executor/Cargo.toml | Adds flow-like-catalog dependency for executor lambda |
| apps/backend/aws/executor-async/src/main.rs | Adds env log filtering, Sentry integration, and catalog initialization |
| apps/backend/aws/executor-async/src/execution.rs | Extends SQS payload to include user_context/profile |
| apps/backend/aws/executor-async/Cargo.toml | Adds catalog + tracing/sentry deps |
| apps/backend/aws/event-bridge/src/main.rs | Adds EventBridge handler that triggers sink endpoint |
| apps/backend/aws/event-bridge/Dockerfile | Adds Lambda container build for event-bridge |
| apps/backend/aws/event-bridge/Cargo.toml | Renames crate and adds reqwest + cloudwatch_events dep |
| apps/backend/aws/api/src/main.rs | Uses warn env filter helper and Sentry-aware tracing initialization |
| apps/backend/aws/api/Cargo.toml | Enables lambda feature for flow-like-api |
| about.toml | Adds cargo-about license configuration |
| Cargo.toml | Adds new workspace members and dependencies (sinks, event-bridge, flate2 rust backend, copilot sdk) |
| .github/instructions/general-coding.instructions.md | Adds guidance about using subagents |
| .github/instructions/api.instructions.md | Adds API security/OpenAPI/performance instructions |
Comments suppressed due to low confidence (1)
apps/desktop/lib/api.ts:1
- These logs will run on every request and can leak sensitive info (URLs with identifiers, response objects/headers) and add noise/perf overhead. Please gate behind an explicit debug flag (e.g.
process.env.NEXT_PUBLIC_API_DEBUG === '1') or remove before production builds.
import { fetch as tauriFetch } from "@tauri-apps/plugin-http";
| // Spawn each event execution as a separate task for parallel processing | ||
| let handle_clone = handle.clone(); | ||
| let flow_like_state_clone = flow_like_state.clone(); | ||
| let hub_clone = hub.clone(); | ||
|
|
||
| tokio::spawn(async move { | ||
| match event | ||
| .execute(&handle_clone, flow_like_state_clone, &hub_clone) | ||
| .await | ||
| { | ||
| Ok(meta) => _ = meta, | ||
| Err(e) => { | ||
| eprintln!("Error executing event: {:?}", e); | ||
| } | ||
| } | ||
| } | ||
| }); |
There was a problem hiding this comment.
This introduces unbounded parallelism: a burst of events can spawn unlimited tasks and overwhelm CPU/memory (and any shared resources the sinks touch). Consider adding a concurrency limit (e.g., a tokio::sync::Semaphore with acquire_owned() inside the loop, or a bounded worker pool/JoinSet) so event executions are processed in parallel but within a safe cap.
| pub async fn read_profile_icon(icon_path: String) -> Result<Vec<u8>, TauriFunctionError> { | ||
| let decoded_path = urlencoding::decode(&icon_path) | ||
| .map_err(|e| TauriFunctionError::new(&format!("Failed to decode path: {}", e)))?; | ||
|
|
||
| let path = PathBuf::from(decoded_path.as_ref()); | ||
|
|
||
| if !path.exists() { | ||
| return Err(TauriFunctionError::new(&format!( | ||
| "Icon file not found: {}", | ||
| path.display() | ||
| ))); | ||
| } | ||
|
|
||
| let bytes = std::fs::read(&path) | ||
| .map_err(|e| TauriFunctionError::new(&format!("Failed to read icon file: {}", e)))?; | ||
|
|
||
| Ok(bytes) | ||
| } |
There was a problem hiding this comment.
This Tauri command allows the renderer to read arbitrary files from the filesystem by passing a path (after URL-decoding). That’s a high-risk local file disclosure primitive. Prefer taking (profile_id, field) and resolving to a validated/owned path server-side, or strictly validate that path is within an allowlisted directory (e.g., app data/profile icon dir) before reading.
| println!("Join deep link: app_id={:?}, token={:?}", app_id, token); | ||
|
|
There was a problem hiding this comment.
This logs the invite token in plaintext. Tokens are credentials and can end up in persistent logs/crash reports. Please remove the token from logs (or mask it, e.g. show only a short prefix) before shipping.
| println!("Join deep link: app_id={:?}, token={:?}", app_id, token); | |
| let masked_token = token.as_ref().map(|t| { | |
| let prefix: String = t.chars().take(4).collect(); | |
| format!("{}***", prefix) | |
| }); | |
| println!("Join deep link: app_id={:?}, token={:?}", app_id, masked_token); |
| const joinUnlisten = listen<DeeplinkJoinPayload>( | ||
| "deeplink/join", | ||
| (event) => { | ||
| const { appId, token } = event.payload; | ||
| if (appId && token) { | ||
| console.log("Navigating to join page:", appId, token); | ||
| router.push(`/join?appId=${appId}&token=${token}`); | ||
| } | ||
| }, | ||
| ); |
There was a problem hiding this comment.
This logs the invite token in the browser console. That can leak via screenshots, debugging tools, or shared logs. Please remove the token from the log line (or avoid logging entirely here).
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||
| #[serde(untagged)] | ||
| #[serde(tag = "sink_type")] | ||
| pub enum EventConfig { | ||
| #[serde(rename = "discord")] | ||
| Discord(DiscordSink), | ||
| #[serde(rename = "email")] | ||
| Email(EmailSink), | ||
|
|
||
| #[serde(rename = "slack")] | ||
| Slack(SlackSink), | ||
| #[serde(rename = "telegram")] | ||
| Telegram(TelegramSink), | ||
|
|
||
| // Check for the state of a website and trigger the event when it changes | ||
| #[serde(rename = "web_watcher")] | ||
| WebWatcher(WebWatcherSink), |
There was a problem hiding this comment.
Switching from #[serde(untagged)] to #[serde(tag = \"sink_type\")] is a breaking serialization change: any persisted configs that don’t include sink_type will fail to deserialize. To avoid breaking existing users/data, consider a backward-compatible deserialization strategy (e.g., an #[serde(untagged)] wrapper that accepts both the new tagged format and the legacy untagged format, or a custom Deserialize that infers the variant when sink_type is missing).
| let client = get_http_client(); | ||
| let trigger_url = format!("{}/api/v1/sink/trigger/async", api_base_url); |
There was a problem hiding this comment.
If API_BASE_URL is configured with a trailing slash (common in envs), this will produce a double-slash URL like https://host//api/v1/.... Please trim trailing slashes (e.g., api_base_url.trim_end_matches('/')) when building trigger_url (similar to how the k8s sink-trigger does it).
| dirs-next = "2.0.0" | ||
| regex = "1.11.3" | ||
| rig-core = {version="0.29.0", features = ["rmcp"]} | ||
| copilot-sdk = { git = "https://github.com/copilot-community-sdk/copilot-sdk-rust.git" } |
There was a problem hiding this comment.
The git dependency is not pinned to a specific rev/tag, which makes builds non-reproducible and can unexpectedly break when the upstream repo changes. Please pin copilot-sdk to a specific commit SHA (or a semver tag if available) for deterministic builds.
| copilot-sdk = { git = "https://github.com/copilot-community-sdk/copilot-sdk-rust.git" } | |
| copilot-sdk = { git = "https://github.com/copilot-community-sdk/copilot-sdk-rust.git", rev = "73fe271" } |
| ## Setting Up GitHub Copilot | ||
|
|
||
| To use FlowPilot with GitHub Copilot, you need to install and configure the GitHub Copilot CLI. |
There was a problem hiding this comment.
The Copilot CLI installation commands and the hardcoded model list are likely to become inaccurate quickly (and may already differ by platform/provider). Consider linking to the official Copilot CLI install docs and describing model selection as 'choose from the models available in the UI' rather than enumerating specific model names.
| Choose your preferred installation method: | ||
|
|
||
| #### macOS and Linux (Homebrew) | ||
| ```bash | ||
| brew install copilot-cli | ||
| ``` | ||
|
|
||
| For the prerelease version: | ||
| ```bash | ||
| brew install copilot-cli@prerelease | ||
| ``` | ||
|
|
||
| #### Windows (WinGet) | ||
| ```powershell | ||
| winget install GitHub.Copilot | ||
| ``` | ||
|
|
There was a problem hiding this comment.
The Copilot CLI installation commands and the hardcoded model list are likely to become inaccurate quickly (and may already differ by platform/provider). Consider linking to the official Copilot CLI install docs and describing model selection as 'choose from the models available in the UI' rather than enumerating specific model names.
| Choose your preferred installation method: | |
| #### macOS and Linux (Homebrew) | |
| ```bash | |
| brew install copilot-cli | |
| ``` | |
| For the prerelease version: | |
| ```bash | |
| brew install copilot-cli@prerelease | |
| ``` | |
| #### Windows (WinGet) | |
| ```powershell | |
| winget install GitHub.Copilot | |
| ``` | |
| To install the GitHub Copilot CLI, follow the official installation guide for your operating system: | |
| - [GitHub Copilot in the CLI installation guide](https://docs.github.com/copilot/github-copilot-in-the-cli/github-copilot-in-the-cli) | |
| The guide provides the most up-to-date installation commands and options for macOS, Linux, and Windows. |
This pull request introduces several new AWS backend components, improves logging and error monitoring across backend services, and adds new dependencies and configuration files to support these changes. The most significant updates are the addition of the
aws-event-bridgeLambda function, improved initialization and error tracking for Lambda-based services, and the inclusion of new workspace members and dependencies.New AWS Backend Components:
apps/backend/aws/event-bridgeLambda function, which listens for CloudWatch Events, extracts event details, and triggers an API endpoint to initiate sink operations. Includes a Dockerfile and full implementation of the handler (apps/backend/aws/event-bridge,apps/backend/aws/event-bridge/Dockerfile,apps/backend/aws/event-bridge/src/main.rs). [1] [2] [3] [4]Cargo.toml. [1] [2]Logging, Tracing, and Error Monitoring Improvements:
aws/api,aws/executor,aws/executor-async,aws/file-tracker,aws/media-transformer) to usetracing_subscriberwith configurable log levels via environment variables, and integrated Sentry error monitoring where applicable. This reduces log noise and improves observability. [1] [2] [3] [4] [5] [6] [7] [8] [9]Dependency and Configuration Updates:
flate2). [1] [2] [3]flow-like-apiandflow-like-catalogfeatures to enable Lambda and remote ML execution support in relevant services. [1] [2] [3]about.tomlconfiguration file for cargo-about license management.API and Coding Standards Documentation:
.github/instructions/api.instructions.mdto document API security, OpenAPI specification requirements, and performance guidelines for Rust API endpoints.AWS Executor Enhancements:
user_contextandprofilefields, and ensured the catalog runtime is properly initialized for ONNX and remote ML execution. [1] [2] [3] [4] [5]These changes collectively enhance the backend's modularity, observability, and maintainability, while laying groundwork for new event-driven workflows and improved operational practices.