Skip to content

Instantly share code, notes, and snippets.

@genecyber
Created October 14, 2024 16:13
Show Gist options
  • Save genecyber/1a26ecea82625929da63806232245c4c to your computer and use it in GitHub Desktop.
Save genecyber/1a26ecea82625929da63806232245c4c to your computer and use it in GitHub Desktop.

Current Status

Iteration 1: Project Setup

  • Initialized project structure
  • Created initial Dockerfile and docker-compose.yml
  • Set up package.json files for root, browser-plugin, and plugin-service
  • Created initial manifest.json for the browser plugin
  • Set up webpack configuration for browser plugin
  • Implemented minimal background and content scripts
  • Created root-level npm scripts for managing both plugin and service tasks
  • Adjusted build process and file structure to resolve loading issues
  • Successfully installed the plugin in Chrome

Iteration 2: Manifest Update and Error Resolution

  • Updated manifest.json to use Manifest Version 3
  • Resolved deprecation warning for Manifest Version 2
  • Adjusted permissions and background script configuration for MV3 compatibility

Iteration 3: Popup Creation and Error Resolution

  • Created basic popup.html and popup.js files
  • Updated manifest.json to include Content Security Policy
  • Ensured background.js has basic functionality
  • Updated webpack.config.js to include new files
  • Resolved issues with missing popup file and Content Security Policy

Iteration 4: Core Functionality Implementation

  • Created WebSocket library in lib/websocket.js
  • Set up background script with basic functionality
  • Updated manifest.json to include necessary permissions for background script
  • Updated webpack.config.js to include new background script
  • Implemented initial console monitoring in content script (hooks.js)

Iteration 5: Plugin Service Setup

  • Created plugin-service directory
  • Implemented basic server.js with WebSocket capabilities in plugin-service/src
  • Set up Winston logger for server-side logging
  • Updated package.json scripts to include plugin service

Iteration 6: WebSocket Connection and Error Resolution

  • Updated WebSocket library in the plugin to work in the background script context
  • Modified background script to handle potential WebSocket connection errors
  • Resolved ReferenceError related to 'window is not defined' in the background script
  • Implemented error handling and reconnection logic for WebSocket connection

Iteration 7: Successful End-to-End Communication

  • Successfully established WebSocket connection between plugin and server
  • Implemented and tested message passing from injected script to content script
  • Verified message forwarding from content script to background script
  • Confirmed successful transmission of messages from background script to server
  • Tested and verified console interception and forwarding to server
  • Implemented and tested sendToServer function in injected script

Iteration 8: WebSocket Stability and Error Handling

  • Implemented WebSocket reconnection mechanism in the background script.
  • Enhanced error handling and message serialization in inject.js.
  • Added ping-pong mechanism to the WebSocket server for better connection management.
  • Fixed ReferenceError in background.js by correctly naming and calling the WebSocket connection function.
  • Improved background script structure with separate functions for settings initialization and WebSocket connection.
  • Added automatic reconnection attempt when trying to send a message over a disconnected WebSocket.

Iteration 9: Session Management and Authentication UI

  • Implemented basic session management functionality in the browser plugin.
  • Updated popup.html and popup.js to include user authentication UI and session management controls.
  • Added mock authentication logic in the popup (username: admin, password: password).
  • Implemented session creation, deletion, and display in the popup UI.
  • Successfully sending session-related messages from the popup to the background script.

Iteration 10: Server-Side Session Handling and Message Processing

  • Implemented server-side session handling in sessionHandler.js.
  • Updated server.js to process and respond to session-related messages.
  • Modified background script to relay server responses to the popup.
  • Enhanced popup UI to display current session information based on server responses.
  • Implemented proper error handling for session-related operations.

Iteration 11: Per-Tab Session Management

  • Implemented per-tab session management in the browser plugin.
  • Updated SessionManager class to support tab-specific sessions.
  • Modified popup.js to correctly display and manage sessions for each tab individually.
  • Updated background.js to handle per-tab sessions, including creation, deletion, and retrieval.
  • Enhanced message passing between popup, background script, and server to include tab IDs.

Iteration 12: Database Integration and Enhanced Authentication

  • Implemented DatabaseManager class using Supabase for database operations.
  • Created AuthHandler class for user authentication and token management.
  • Updated server.js to use DatabaseManager and AuthHandler for user operations.
  • Implemented user registration functionality.
  • Enhanced login process to use database authentication instead of mock authentication.
  • Added JWT token generation and verification for secure authentication.
  • Updated popup.js to handle registration and improved login/logout flow.

Iteration 13: Enhanced Session Management and UI Updates

  • Implemented editable select for session names in the popup UI.
  • Updated server to provide a list of all sessions for the user.
  • Modified popup.js to handle the 'ALL_SESSIONS' message type.
  • Enhanced loadSessions function to populate the select box with received sessions.
  • Improved error handling and logging for session-related operations.

Iteration 14: React Integration and UI Enhancement

  • Converted the popup to a React application using Material-UI (MUI) components.
  • Updated webpack configuration to handle React and JSX files.
  • Implemented a more modern and responsive design for the popup UI.
  • Enhanced state management in the popup using React hooks.
  • Updated the build process to bundle React components and MUI dependencies.

Iteration 15: Database Schema Implementation

  • Created a comprehensive database schema in plugin-service/schema/database.sql.
  • Implemented tables for sessions, navigation history, session logs, and session tabs.
  • Added appropriate constraints and indexes for improved query performance.
  • Updated the schema to include the existing sessions table along with new tables.

Iteration 18: WebSocket Stability and Session Management Improvements

  • Resolved WebSocket connection stability issues in the background script.
  • Fixed message parsing issues on both client and server sides.
  • Improved error handling and logging for WebSocket communications.
  • Enhanced the popup UI to correctly display and update the list of available sessions.
  • Implemented proper handling of the 'ALL_SESSIONS' message type in popup.js.
  • Added more detailed logging for session-related operations.

Iteration 19: Tab Management and Session Handling

  • Implemented tab-specific session management in the SessionManager class.
  • Updated the background script to handle tab creation, updates, and removal events.
  • Modified the server to process tab-related messages and update sessions accordingly.
  • Enhanced the popup UI to display and manage sessions on a per-tab basis.
  • Improved error handling and logging for tab-related operations.

Iteration 21: Enhanced Error Handling and Logging

  • Improved error handling in the server's WebSocket message processing.
  • Enhanced logging for database operations and errors using Winston logger.
  • Updated the DatabaseManager class to include more robust error handling for database operations.
  • Implemented more detailed error messages for debugging and user feedback.

Iteration 22: Tab Management and Navigation Tracking

  • Implemented createSessionTab function in DatabaseManager to handle tab creation and retrieval.
  • Added addNavigationHistory and getLastNavigation functions to track user navigation within sessions.
  • Updated server.js to handle CREATE_TAB messages and record navigation events.
  • Implemented checkAndRecordNavigation function to manage navigation history for each tab.

Iteration 23: Enhanced Tab Management and Navigation Tracking

  • Implemented improved tab management in the background script.
  • Added functionality to create tabs within the current session.
  • Enhanced navigation tracking with a limit on stored navigation history.
  • Updated the popup UI to display more detailed session and tab information.
  • Improved error handling and logging throughout the system.

Iteration 24: React Hooks Integration and Code Cleanup

  • Integrated React hooks monitoring functionality directly into inject.js.
  • Removed reactHooks.js file as its functionality is now part of inject.js.
  • Cleaned up unnecessary messaging in content.js.
  • Updated webpack.config.js to remove references to deleted files.
  • Updated manifest.json to reflect changes in web accessible resources.

Iteration 25: Console Emulator Implementation

  • Implemented a console emulator in the popup/side panel UI.
  • Added real-time display of captured console messages.
  • Implemented message categorization by type (log, warn, error, info).
  • Included timestamps and source URLs for each console message.
  • Created a scrollable interface for viewing message history.
  • Updated the popup UI to include the new console emulator component.
  • Enhanced the background script to forward console messages to the popup/side panel.
  • Implemented efficient message storage and display mechanisms.

Iteration 26: Dark Mode Implementation

  • Implemented a dark mode toggle feature in the popup UI.
  • Added a state variable to track the dark mode preference.
  • Created a theme using Material-UI's createTheme function that responds to the dark mode state.
  • Implemented a useEffect hook to load the saved dark mode preference from storage.
  • Added a function to toggle dark mode and save the preference to storage.
  • Moved the dark mode toggle to the hamburger menu for better UI organization.
  • Updated the ThemeProvider to use the dynamic theme based on dark mode preference.

Iteration 27: Custom Element Selector Implementation

  • Implemented a custom element selector feature in the popup UI.
  • Added a new option in the element type dropdown for "Custom Selector".
  • Created a modal dialog for entering custom Sizzle selectors.
  • Updated the content script to handle custom selector execution.
  • Implemented a secure method to execute custom selectors without violating Content Security Policy.
  • Successfully tested the execution of custom Sizzle selectors on web pages.
  • Enhanced error handling for custom selector execution.

Iteration 28: Full Page Screenshot Implementation

  • Implemented full page screenshot functionality using html2canvas library.
  • Added a camera icon button in the popup UI for capturing screenshots.
  • Updated the content script to handle screenshot capture requests.
  • Implemented screenshot saving functionality in the background script.
  • Enhanced error handling for screenshot capture process.
  • Updated the popup UI to provide feedback on successful screenshot capture.

Iteration 29: Dynamic Session Switching

  • Implemented dynamic session switching functionality based on URL patterns.
  • Created URLSessionManager class to handle URL-based session management.
  • Updated background script to check for matching URL sessions when tabs are updated.
  • Added UI controls in the popup for managing dynamic switching.
  • Implemented storage and retrieval of URL session mappings.

Iteration 30: Collapsible Console Implementation

  • Implemented a collapsible console feature in the popup/side panel UI for better space management.
  • Added a dedicated button in the UI to toggle the console visibility.
  • Implemented the ability to stop or resume the console to manage memory usage and improve performance.
  • Added a limit on the number of stored console messages to prevent memory issues.
  • Displayed console messages in a scrollable box with a maximum height for better usability.

Current Functionality

  1. The extension uses Manifest V3, ensuring compatibility with future Chrome versions and other browsers that support MV3.
  2. WebSocket connection between the plugin and server is stable, with reconnection logic in place.
  3. Console monitoring is implemented, with logs being captured and forwarded to the central service.
  4. The extension can be toggled on/off using the popup UI.
  5. Script injection is cautious, reducing conflicts with React-based websites.
  6. The background script handles plugin installation, startup, and manages WebSocket connections reliably.
  7. The popup UI includes login/logout functionality and session management controls.
  8. Session creation, deletion, and retrieval messages are sent from the popup to the background script and then to the server.
  9. The server processes session-related messages and sends appropriate responses.
  10. The popup UI updates to display the current session information based on server responses.
  11. Sessions are now managed on a per-tab basis, allowing different tabs to have different active sessions.
  12. User registration is now supported, allowing new users to create accounts.
  13. Login process now authenticates against the database using Supabase.
  14. JWT tokens are used for maintaining user sessions securely.
  15. Sessions are now stored in the database, allowing for persistence across browser restarts.
  16. The server now uses Winston for improved logging capabilities.
  17. The popup UI now features an editable select for session names, allowing users to choose from existing sessions or create new ones.
  18. The server now provides a list of all sessions for the user, which is used to populate the session select in the popup.
  19. The popup UI is now a React application with Material-UI components, providing a more modern and responsive user interface.
  20. State management in the popup is now handled using React hooks, improving code organization and maintainability.
  21. Sessions are now managed on a per-tab basis, allowing different tabs to have different active sessions.
  22. The background script now handles tab creation, updates, and removal events, updating sessions accordingly.
  23. The server processes tab-related messages and updates sessions in the database.
  24. The popup UI now displays and manages sessions specific to the current tab.
  25. The server can now create and manage session tabs, associating them with specific sessions.
  26. Navigation history is now tracked and stored for each session tab.
  27. The server can retrieve the last navigation event for a given session and tab.
  28. Error handling has been significantly improved, with more detailed error messages and logging.
  29. The background script now manages tabs more effectively, including creating tabs within the current session and tracking tab removal.
  30. Navigation history is now limited to a maximum number of entries per session to prevent excessive database growth.
  31. The popup UI now displays more detailed session information, including the number of tabs and their URLs.
  32. Error handling and logging have been improved throughout the system for better debugging and user feedback.
  33. React hooks monitoring is now integrated directly into the main inject script, improving efficiency and reducing the number of injected scripts.
  34. The extension now has a more streamlined codebase with the removal of the separate reactHooks.js file.
  35. React hooks monitoring is now integrated directly into the main inject script, improving efficiency and reducing the number of injected scripts.
  36. The extension now has a more streamlined codebase with the removal of the separate reactHooks.js file.
  37. The popup UI now uses React and Material-UI components, providing a more modern and responsive interface.
  38. The extension now includes a console emulator in the popup/side panel UI, displaying captured console messages in real-time.
  39. Console messages are categorized by type and include metadata such as timestamps and source URLs.
  40. The console emulator provides a scrollable interface for viewing message history.
  41. The popup/side panel UI has been updated to incorporate the new console emulator component.
  42. The extension now supports a dark mode toggle, allowing users to switch between light and dark themes.
  43. The dark mode preference is saved and persists between sessions.
  44. The dark mode toggle is accessible from the hamburger menu in the popup UI.
  45. The UI theme dynamically updates when the dark mode is toggled, providing immediate visual feedback.
  46. The extension now supports custom element selection using Sizzle selectors.
  47. Users can enter custom selectors in a modal dialog accessed from the popup UI.
  48. Custom selectors are executed securely on the target web page without violating CSP.
  49. The results of custom selector execution are displayed in the popup UI.
  50. The extension now supports capturing full page screenshots, including content not visible in the viewport.
  51. Users can initiate a screenshot capture using a camera icon in the popup UI.
  52. Captured screenshots are saved as PNG files, with users prompted to choose the save location.
  53. The UI provides feedback on successful screenshot captures using a snackbar notification.
  54. The extension now supports executing custom JavaScript on the target web page.
  55. Users can enter custom JavaScript code in a modal dialog accessed from the popup UI.
  56. Custom JavaScript is executed securely on the target web page without violating CSP.
  57. The results of custom JavaScript execution are displayed in the popup UI.
  58. The extension now uses tab groups to visually organize and manage sessions.
  59. Each session is associated with a unique tab group, with a distinct color and name.
  60. New tabs created within a session are automatically added to the corresponding tab group.
  61. The tab group color and name are updated when the session is modified.
  62. When a session is deleted, the corresponding tab group is removed if it's empty.
  63. The extension now supports dynamic session switching based on URL patterns.
  64. Users can define URL patterns that automatically switch to specific sessions when matched.
  65. The URLSessionManager class handles the mapping between URL patterns and session names.
  66. The background script checks for matching URL sessions whenever a tab is updated.
  67. The popup UI now includes controls for enabling/disabling dynamic switching and managing URL-session mappings.
  68. URL-session mappings are stored persistently and loaded on extension startup.
  69. The extension now features a collapsible console in the popup/side panel UI for better space management.
  70. Users can toggle the console visibility using a dedicated button in the UI.
  71. The console can be stopped or resumed to manage memory usage and improve performance.
  72. A limit on the number of stored console messages has been implemented to prevent memory issues.
  73. Console messages are displayed in a scrollable box with a maximum height for better usability.

Known Limitations

  • The extension may still encounter conflicts with some complex web applications.
  • Full cross-browser compatibility has not yet been tested or implemented.
  • LLM integration is not yet implemented on the server side.
  • Authentication is currently mocked and not integrated with the server.
  • The current implementation doesn't handle token expiration or refresh.
  • Error messages from the server are not always descriptive or user-friendly.
  • The select box for sessions may not always update immediately after receiving the sessions list.
  • The React-based popup may have slightly longer load times due to increased bundle size.
  • The current implementation may not handle all edge cases related to tab management (e.g., tab duplication, window management).
  • There might be a slight delay in updating the session information when switching between tabs rapidly.
  • The current implementation may not efficiently handle concurrent tab creations or rapid navigation events.
  • There's no mechanism yet for limiting the amount of navigation history stored per session or tab.
  • The current implementation may not handle all edge cases related to tab creation and removal.
  • There might be a slight delay in updating the session information in the popup when tabs are created or removed.
  • The console emulator may experience performance issues with extremely high volumes of console messages.
  • There is currently no way to filter or search console messages in the emulator.
  • The dark mode toggle might not affect injected content on web pages, as it's currently limited to the popup UI.
  • The custom selector feature may not work on pages with strict Content Security Policies.
  • Complex selectors or those targeting dynamically loaded content may not always yield expected results.
  • The current screenshot implementation may not accurately capture some complex page layouts or dynamically loaded content.
  • Large pages may require significant memory and processing time for screenshot capture.
  • The screenshot feature may not work correctly on pages with strict Content Security Policies that block inline scripts.
  • The custom JavaScript execution feature may not work on pages with strict Content Security Policies.
  • Complex JavaScript code or code targeting dynamically loaded content may not always yield expected results.
  • The tab grouping feature is currently only supported in Chromium-based browsers.
  • There might be a slight delay in updating the tab group when the session is modified.
  • The current implementation may not handle all edge cases related to tab group management (e.g., moving tabs between windows).
  • The current implementation of dynamic switching may not handle all edge cases, such as rapid tab switching or navigation.
  • URL pattern matching is currently based on simple regular expressions, which may not cover all desired use cases.
  • There's no UI for editing existing URL-session mappings, only adding new ones or removing them.
  • The collapsible console may not retain its state (expanded/collapsed) between popup/side panel reopens.
  • There's currently no way to clear the console messages without stopping and resuming.
  • The console message limit may cause loss of older messages in long debugging sessions.

Next Steps

  1. Implement real authentication system, replacing the current mock authentication.
  2. Implement React hook monitoring (reactHooks.js).
  3. Develop AST generation functionality (astGenerator.js).
  4. Create DOM traversal and serialization module (domTraverser.js).
  5. Design and implement the prompt UI for user input (promptUI.js).
  6. Enhance the central service to process received data and integrate with an LLM.
  7. Implement response injection mechanism for LLM-generated content.
  8. Develop cross-browser compatibility testing suite.
  9. Implement additional user settings and configuration options.
  10. Begin work on performance optimization, especially for high-frequency operations.
  11. Implement secure protocols for WebSocket communication, including data encryption.
  12. Implement token refresh mechanism to handle token expiration.
  13. Enhance error handling and provide more user-friendly error messages.
  14. Implement email verification for new user registrations.
  15. Add password reset functionality.
  16. Implement user profile management features.
  17. Investigate and resolve any issues with the immediate updating of the session select box in the popup UI.
  18. Implement session switching functionality to allow users to easily switch between existing sessions.
  19. Optimize the React bundle size for faster popup loading.
  20. Implement lazy loading for React components to improve initial load time.
  21. Enhance the React components with additional features and interactivity.
  22. Implement comprehensive tab management, including handling of tab duplication and window management.
  23. Optimize session switching when rapidly changing between tabs.
  24. Implement session persistence across browser restarts for improved user experience.
  25. Enhance error handling for tab-related operations to cover all potential edge cases.
  26. Implement a mechanism to limit and prune navigation history to prevent excessive database growth.
  27. Develop a user interface to display navigation history for debugging and user information purposes.
  28. Implement more advanced tab management features, such as tab grouping or tab-specific settings.
  29. Enhance the createSessionTab function to handle edge cases like duplicate tab names more gracefully.
  30. Implement more advanced tab grouping features.
  31. Enhance the navigation history display in the popup UI.
  32. Implement a mechanism to export session data for backup or analysis purposes.
  33. Develop a more robust error reporting system that provides detailed feedback to users.
  34. Optimize React hooks monitoring to minimize performance impact on monitored pages.
  35. Implement more advanced React hooks analysis, such as tracking hook dependencies and update frequencies.
  36. Optimize the React bundle size for faster popup loading.
  37. Implement lazy loading for React components to improve initial load time.
  38. Enhance the React components with additional features and interactivity.
  39. Implement filtering and search functionality for the console emulator.
  40. Optimize the console emulator for handling high volumes of messages, possibly using virtual scrolling.
  41. Enhance the console emulator with additional features such as message expansion for viewing full details.
  42. Implement user preferences for console message display (e.g., message types to show/hide, display limit).
  43. Extend the dark mode functionality to affect injected content on web pages.
  44. Implement an automatic dark mode detection based on system preferences.
  45. Add more granular theme customization options for users.
  46. Enhance the custom selector feature with syntax highlighting and autocompletion.
  47. Implement a history of recently used custom selectors for quick access.
  48. Add more robust error handling and user feedback for custom selector execution.
  49. Investigate alternative methods for capturing full page screenshots, such as using the Chrome DevTools Protocol.
  50. Implement progress indicators for large page captures to provide better user feedback.
  51. Optimize the screenshot capture process to minimize memory usage and improve performance.
  52. Implement error handling for cases where screenshot capture fails due to page structure or browser limitations.
  53. Enhance the custom JavaScript execution feature with syntax highlighting and autocompletion.
  54. Implement a history of recently used custom JavaScript snippets for quick access.
  55. Add more robust error handling and user feedback for custom JavaScript execution.
  56. Implement a mechanism to limit the execution time of custom JavaScript to prevent potential issues.
  57. Extend tab grouping functionality to support non-Chromium browsers where possible.
  58. Implement more advanced tab group management features, such as nested groups or group-specific settings.
  59. Optimize tab group updates to minimize delay when modifying sessions.
  60. Implement a mechanism to handle tab group conflicts when importing sessions from different browsers.
  61. Implement console message filtering and search functionality.
  62. Add the ability to clear console messages without stopping/resuming.
  63. Persist console state (expanded/collapsed) between popup/side panel reopens.
  64. Implement more advanced console features like grouping and formatting of complex objects.
  65. Optimize console performance for handling large volumes of messages.
  66. Implement a more robust URL matching system, possibly using a library like url-pattern.
  67. Create a UI for editing existing URL-session mappings.
  68. Implement conflict resolution for overlapping URL patterns.
  69. Add support for more complex URL matching rules, such as query parameters or hash fragments.
  70. Optimize the performance of URL matching for a large number of patterns.

Security Considerations

  1. Implement strict content security policies in the manifest.
  2. Use secure WebSocket connections (WSS).
  3. Implement user consent mechanisms for data collection and page manipulation.
  4. Sanitize all data before execution or injection to prevent XSS attacks.
  5. Implement rate limiting and data volume restrictions to prevent abuse.
  6. Ensure proper isolation of user data in multi-tenant environments.
  7. Use secure token-based authentication for all API calls.
  8. Implement HTTPS for all server communications.
  9. Add rate limiting for authentication attempts to prevent brute force attacks.
  10. Implement proper password hashing and salting (if not already handled by Supabase).
  11. Add two-factor authentication option for enhanced security.
  12. Implement Content Security Policy headers for the React-based popup to prevent XSS attacks.
  13. Implement proper access controls and data validation for the new navigation_history and session_tabs tables.
  14. Consider implementing a mechanism to anonymize or encrypt sensitive URLs in the navigation history.
  15. Develop a data retention policy for navigation history, ensuring that old or sensitive data is properly removed.
  16. Implement proper data retention and deletion policies for the new tables, especially for navigation history and session logs.
  17. Implement proper access controls for the new tab management features.
  18. Ensure that navigation history trimming is performed securely and doesn't leave any sensitive data behind.
  19. Ensure that sensitive information is not inadvertently displayed in the console emulator.
  20. Implement proper sanitization of console messages to prevent XSS attacks in the emulator display.
  21. Ensure that the dark mode preference is stored securely and cannot be manipulated by malicious scripts.
  22. Ensure that the execution of custom selectors is properly sandboxed to prevent potential security risks.
  23. Implement input validation and sanitization for custom selectors to prevent injection attacks.
  24. Consider adding a user warning about the potential risks of executing custom selectors on sensitive pages.
  25. Ensure that screenshot data is handled securely and not stored or transmitted without user consent.
  26. Implement proper error handling to prevent information leakage in case of screenshot capture failures.
  27. Consider adding user warnings or consent prompts before capturing screenshots of sensitive pages.
  28. Implement strict sandboxing for custom JavaScript execution to prevent access to sensitive page data.
  29. Add user warnings about the potential risks of executing custom JavaScript on sensitive pages.
  30. Implement proper error handling to prevent information leakage in case of custom JavaScript execution failures.
  31. Ensure that tab group information is stored securely and cannot be manipulated by malicious scripts.
  32. Implement proper access controls for tab group management to prevent unauthorized modifications.
  33. Ensure that URL patterns and session names are properly sanitized before storage to prevent XSS attacks.
  34. Implement proper access controls for the URL-session mappings to prevent unauthorized modifications.
  35. Consider the privacy implications of storing URL patterns and ensure users are aware of what data is being saved.
  36. Ensure that console messages are properly sanitized to prevent XSS attacks in the console display.
  37. Implement proper access controls for the console feature to prevent unauthorized access to sensitive log data.
  38. Consider adding an option to obfuscate or mask sensitive data in console messages.

This status update reflects the recent additions of the collapsible console feature. The focus now includes optimizing this new feature and addressing potential limitations and security considerations related to console message handling and display.

Project Structure

The project structure remains the same as previously described:

project-root/
├── browser-plugin/
│   └── ...
├── plugin-service/
│   ├── schema/
│   │   └── database.sql
│   ├── src/
│   │   └── ...
│   └── ...
└── ...

This update reflects the addition of the database schema file and its location in the project structure.

Security Considerations

  • The new database schema includes foreign key constraints and indexes to maintain data integrity and improve query performance.
  • Ensure that proper access controls are implemented for the new tables (navigation_history, session_logs, session_tabs) to prevent unauthorized access to sensitive user data.
  • Consider implementing data encryption for sensitive fields in the new tables, especially for log messages that might contain personal or confidential information.
  • Implement proper input validation and sanitization for all data being inserted into the new tables to prevent SQL injection attacks.
  • Implement Content Security Policy headers for the React-based popup to prevent XSS attacks.
  • Implement proper access controls and data validation for the new navigation_history and session_tabs tables.
  • Consider implementing a mechanism to anonymize or encrypt sensitive URLs in the navigation history.
  • Develop a data retention policy for navigation history, ensuring that old or sensitive data is properly removed.
  • Implement proper data retention and deletion policies for the new tables, especially for navigation history and session logs.
  • Implement proper access controls for the new tab management features.
  • Ensure that navigation history trimming is performed securely and doesn't leave any sensitive data behind.
  • Ensure that sensitive information is not inadvertently displayed in the console emulator.
  • Implement proper sanitization of console messages to prevent XSS attacks in the emulator display.
  • Ensure that the dark mode preference is stored securely and cannot be manipulated by malicious scripts.
  • Ensure that the execution of custom selectors is properly sandboxed to prevent potential security risks.
  • Implement input validation and sanitization for custom selectors to prevent injection attacks.
  • Consider adding a user warning about the potential risks of executing custom selectors on sensitive pages.
  • Ensure that screenshot data is handled securely and not stored or transmitted without user consent.
  • Implement proper error handling to prevent information leakage in case of screenshot capture failures.
  • Consider adding user warnings or consent prompts before capturing screenshots of sensitive pages.
  • Implement strict sandboxing for custom JavaScript execution to prevent access to sensitive page data.
  • Add user warnings about the potential risks of executing custom JavaScript on sensitive pages.
  • Implement proper error handling to prevent information leakage in case of custom JavaScript execution failures.
  • Ensure that tab group information is stored securely and cannot be manipulated by malicious scripts.
  • Implement proper access controls for tab group management to prevent unauthorized modifications.
  • Ensure that URL patterns and session names are properly sanitized before storage to prevent XSS attacks.
  • Implement proper access controls for the URL-session mappings to prevent unauthorized modifications.
  • Consider the privacy implications of storing URL patterns and ensure users are aware of what data is being saved.
  • Ensure that console messages are properly sanitized to prevent XSS attacks in the console display.
  • Implement proper access controls for the console feature to prevent unauthorized access to sensitive log data.
  • Consider adding an option to obfuscate or mask sensitive data in console messages.

Current Issues

Session Management UI Not Updating

Issue: The popup UI is not showing the current session, even though the server is receiving the session-related messages.

Possible Causes:

  1. The server is not sending a response to the session creation/retrieval messages.
  2. The background script is not properly relaying the server's response to the popup.
  3. The popup is not correctly handling the response from the background script.

Next Steps for Resolution:

  1. Implement server-side logic to handle session-related messages and send appropriate responses.
  2. Update the background script to properly handle and relay server responses to the popup.
  3. Ensure the popup correctly processes and displays the session information received from the background script.

Authentication Integration

Issue: The current authentication system is mocked and not integrated with the server.

Next Steps for Resolution:

  1. Implement authHandler.js on the server side as outlined in the plan.
  2. Update the popup UI to communicate with the server for authentication.
  3. Implement secure token-based authentication for all API calls.
  4. Ensure proper user data isolation in the multi-tenant environment.

React and Material-UI Integration

Issue: Initial integration of React and Material-UI components resulted in module resolution errors.

Resolution:

  • Corrected import statements for Material-UI components, changing from @mui.material/Component to @mui/material/Component.
  • Ensured all necessary dependencies (@mui/material, @emotion/react, @emotion/styled) were installed.
  • Updated webpack configuration to properly handle React and JSX files.

Next Steps:

  1. Optimize the React bundle size to improve popup load times.
  2. Implement code splitting and lazy loading for React components if necessary.
  3. Ensure proper error boundaries are in place for the React application.

Popup Performance

Issue: The React-based popup may have slightly longer load times due to increased bundle size.

Next Steps for Resolution:

  1. Analyze the bundle size and identify large dependencies.
  2. Implement code splitting to load only necessary components.
  3. Consider using a lighter-weight UI library if Material-UI proves too heavy.
  4. Optimize React component rendering and minimize unnecessary re-renders.

React Hooks Integration and Code Cleanup

Issue: The React hooks monitoring functionality was separated in a different file, leading to potential timing issues and unnecessary complexity in script injection.

Resolution:

  1. Integrated React hooks monitoring functionality directly into inject.js.
  2. Removed reactHooks.js file.
  3. Updated content.js to inject only inject.js.
  4. Cleaned up unnecessary messaging related to React hooks initialization.
  5. Updated webpack.config.js and manifest.json to reflect these changes.

These changes simplify the codebase, reduce the number of injected scripts, and potentially improve performance by eliminating race conditions between script loads. The React hooks monitoring now initializes immediately when inject.js is loaded, ensuring consistent behavior across different page load scenarios.

Next Steps:

  1. Thoroughly test React hooks monitoring on various React-based websites to ensure reliability.
  2. Profile the performance impact of the integrated React hooks monitoring.
  3. Consider implementing a toggle mechanism to enable/disable React hooks monitoring for performance-sensitive scenarios.

Dynamic Session Switching Implementation Attempt

Attempted Changes:

  1. Modified SessionManager class to support tab-specific sessions.
  2. Updated background script to handle tab events for session management.
  3. Implemented UI changes in popup to support switching between sessions.
  4. Attempted to integrate WebSocket communication for real-time session updates.

Cascading Issues:

  1. Session Persistence: Sessions were not consistently persisting across browser restarts.
  2. UI Synchronization: The popup UI often failed to reflect the current session state accurately.
  3. WebSocket Overload: Frequent session changes led to an excessive number of WebSocket messages.
  4. Performance Degradation: The background script became overwhelmed with managing multiple sessions.
  5. Race Conditions: Asynchronous operations related to session switching sometimes led to inconsistent states.
  6. Cross-Tab Communication: Difficulties in maintaining session consistency across multiple tabs.
  7. Error Handling: Inadequate error handling led to silent failures in session management.

Decision to Revert: Due to the complexity introduced and the cascading issues affecting core functionality, the decision was made to revert the dynamic session switching changes. The reversion aimed to restore the plugin to a stable state while we reassess the approach to session management.

Lessons Learned:

  1. Incremental Changes: Future attempts should focus on smaller, incremental changes that can be easily tested and reverted if necessary.
  2. Improved Testing: More comprehensive testing, including edge cases and stress testing, is needed before implementing major changes.
  3. State Management: A more robust state management solution may be necessary to handle complex session scenarios.
  4. Performance Considerations: Any new features must be carefully evaluated for their performance impact, especially in the background script.

Next Steps:

  1. Re-evaluate the necessity and scope of dynamic session switching.
  2. If deemed necessary, design a simplified approach that minimizes changes to the core architecture.
  3. Implement stronger error handling and logging to catch issues earlier in development.
  4. Consider alternative architectures that might better support dynamic session management without compromising stability.

This experience highlights the importance of careful planning and incremental development when dealing with complex browser extension architectures. Future attempts at implementing dynamic session switching will need to address these challenges systematically.


Resolved Issues

Manifest Version 2 Deprecation Warning

Resolution: Updated the manifest.json file to use Manifest Version 3 (MV3).

Missing Popup File and Content Security Policy Issues

Resolution: Created necessary popup files and updated the manifest to include a Content Security Policy.

ReferenceError in Background Script

Resolution: Corrected function naming and improved the overall structure of the background script.

React Errors and Console Flooding

Resolution: Updated the inject.js script to be more selective about which errors are captured and forwarded.

WebSocket Connection Stability

Resolution: Implemented improved connection handling in the background script:

  • Added an isWebSocketConnected() function to accurately check connection status.
  • Updated connectWebSocket() to prevent unnecessary reconnection attempts.
  • Improved error handling and logging in sendMessageToServer().
  • Modified tab update and creation listeners to attempt connection only when necessary.
  • Added more detailed logging for better diagnostics.

These changes have resolved issues with inaccurate connection status reporting and improved overall WebSocket connection stability.

WebSocket Message Parsing Issues

Issue: Messages sent from the client were being double-stringified, causing parsing errors on the server side. The server was also receiving messages as Buffer objects, leading to further parsing issues.

Resolution:

  1. Client-side (background.js and websocket.js):
    • Ensured that messages are stringified only once before sending.
    • Updated the send method in websocket.js to handle both string and object inputs.
// In background.js
function sendMessageToServer(message) {
  // ...
  if (isWebSocketConnected()) {
    console.log('Sending message to server:', messageWithSession);
    socket.send(JSON.stringify(messageWithSession));  // Stringify here
  }
  // ...
}

// In websocket.js
send(data) {
  if (this.socket && this.socket.readyState === globalThis.WebSocket.OPEN) {
    const message = typeof data === 'string' ? data : JSON.stringify(data);
    this.socket.send(message);
  } else {
    console.error('WebSocket is not open. Unable to send message.');
  }
}
  1. Server-side (server.js):
    • Added logic to handle messages received as Buffer objects.
    • Implemented proper parsing of the received messages.
ws.on('message', (message) => {
  try {
    const messageString = message instanceof Buffer ? message.toString('utf8') : message;
    const parsedMessage = JSON.parse(messageString);
    
    // Process the parsed message
    // ...
  } catch (error) {
    logger.error(`Error processing message: ${error.message}`);
  }
});

These changes ensure that messages are correctly stringified on the client side and properly parsed on the server side, resolving the parsing issues and allowing for correct message handling.

Session Management UI Not Updating

Resolution: Implemented changes in the popup.js file to handle the 'ALL_SESSIONS' message type and update the select box accordingly. The loadSessions function was modified to correctly populate the select box with received sessions. Additional logging was added to help diagnose any remaining issues.

function loadSessions() {
  chrome.runtime.sendMessage({ type: 'GET_ALL_SESSIONS' }, (response) => {
    if (chrome.runtime.lastError) {
      console.error('Error fetching sessions:', chrome.runtime.lastError);
      return;
    }

    console.log('Received sessions:', response);

    if (response && response.sessions && Array.isArray(response.sessions)) {
      sessionSelect.innerHTML = '<option value="">Select or create a session</option>';
      response.sessions.forEach(session => {
        const option = document.createElement('option');
        option.value = session.name;
        option.textContent = session.name;
        sessionSelect.appendChild(option);
      });
      console.log('Sessions loaded into select:', sessionSelect.innerHTML);
    } else {
      console.error('Invalid sessions data received:', response);
    }
  });
}

This change allows the popup UI to display the list of available sessions and provides the option to create new sessions. The issue of the UI not showing the current session has been resolved, although there may still be some intermittent issues with immediate updates that are being investigated.

Tab-Specific Session Management Implementation

Resolution: Implemented tab-specific session management to allow different tabs to have different active sessions.

  1. Updated the SessionManager class to store sessions with tab IDs as keys:
class SessionManager {
  constructor() {
    this.sessions = {};
  }

  createSession(sessionName, tabId) {
    this.sessions[tabId] = { name: sessionName };
    this.saveSessionsToStorage();
  }

  deleteSession(tabId) {
    delete this.sessions[tabId];
    this.saveSessionsToStorage();
  }

  getSession(tabId) {
    return this.sessions[tabId];
  }

  // ... (other methods remain unchanged)
}
  1. Modified the background script to handle tab events:
chrome.tabs.onCreated.addListener((tab) => {
  // Handle new tab creation
});

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  // Handle tab updates
});

chrome.tabs.onRemoved.addListener((tabId) => {
  sessionManager.deleteSession(tabId);
});
  1. Updated the server to process tab-related messages and update sessions in the database accordingly.

  2. Enhanced the popup UI to display and manage sessions specific to the current tab:

chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  if (tabs[0]) {
    const currentTabId = tabs[0].id;
    loadSessionForTab(currentTabId);
  }
});

function loadSessionForTab(tabId) {
  // Load and display session for the specific tab
}

These changes allow for more granular session management, with each tab potentially having its own active session. The implementation includes proper handling of tab creation, updates, and removal, ensuring that sessions are correctly managed throughout the tab lifecycle.


Newest Issues

Full Page Screenshot Functionality

Issue: The current implementation of the full page screenshot functionality using html2canvas may not capture the entire webpage accurately, especially for pages with dynamic content or complex layouts.

Next Steps for Resolution:

  1. Investigate alternative methods for capturing full page screenshots, such as using the Chrome DevTools Protocol.
  2. Implement a more robust solution that can handle various page layouts and dynamic content.
  3. Add error handling and progress indicators for large page captures.
  4. Optimize the screenshot capture process to minimize memory usage and improve performance.

React Component Optimization

Issue: Some React components in the popup may be re-rendering unnecessarily, potentially impacting performance.

Next Steps for Resolution:

  1. Implement React.memo for functional components that don't need frequent updates.
  2. Use the useCallback hook for functions passed as props to child components.
  3. Optimize the use of useEffect to prevent unnecessary re-renders.
  4. Consider implementing a state management solution like Redux for more efficient state updates.

WebSocket Connection Error Handling

Issue: The current WebSocket error handling may not be comprehensive enough to cover all potential connection issues.

Next Steps for Resolution:

  1. Implement more granular error types for different WebSocket connection issues.
  2. Add a reconnection strategy with exponential backoff for failed connections.
  3. Provide clear user feedback in the UI when WebSocket connection issues occur.
  4. Implement a fallback mechanism for critical functionality when WebSocket is unavailable.

Cross-Browser Compatibility

Issue: Some features may not work consistently across different browsers due to varying support for browser APIs.

Next Steps for Resolution:

  1. Conduct thorough testing on major browsers (Chrome, Firefox, Safari, Edge).
  2. Implement polyfills or fallbacks for browser-specific APIs.
  3. Use feature detection instead of browser detection for compatibility checks.
  4. Document any known browser-specific limitations or workarounds.

Performance Monitoring and Optimization

Issue: Lack of comprehensive performance monitoring makes it difficult to identify and address performance bottlenecks.

Next Steps for Resolution:

  1. Implement performance monitoring tools to track key metrics (e.g., load time, memory usage).
  2. Set up automated performance testing as part of the CI/CD pipeline.
  3. Optimize asset loading and minimize bundle sizes.
  4. Implement lazy loading for non-critical components and features.

These new issues focus on improving the robustness, performance, and cross-browser compatibility of the plugin. Addressing these will help enhance the overall user experience and reliability of the application.

Begin building out the project defined in @plan.md Every iteration, be sure to update the @current_status.md document to capture our place in the development cycle When errors are encountered, document them and their resolution in @errors_resolutions.md if multiple attempts to fix take place, be sure to collect all attempts, the new reasoning, and ultimately the final resolution.

NOTE: pay close attention to directory structure, @plan.md is located in the project root. Any bootstrapping that takes place should understand where root is, and where any client / serverside applications are. Keep Dockerfile up to date. NOTE: this project should be usable within Docker throughout the process, so always keep a Dockerfile and a compose file up to date

IMPORTANT: record achievements in @current_status.md IMPORTANT: @current_status.md is append only IMPORTANT: @errors_resolutions.md is append only IMPORTANT: @plan.md is read only IMPORTANT: @instructions.md is read only

IMPORTANT: every iteration we should be able to run our docker and have it work based on the stage of the project. Deliver Value every iteration.

IMPORTANT: Any Docker configurations should ignore local package-lock.json files and node_modules directories. This ensures consistency across different development environments and the Docker container. Update .dockerignore and Dockerfile accordingly.

Here's a new software plan for a cross-browser plugin that injects hooks into web pages and communicates with a central service via WebSockets. This plugin will provide extensive monitoring and manipulation capabilities for web pages.

Cross-Browser LLM-Powered Web Page Analyzer and Manipulator

Directory Structure

/
├── browser-plugin/
│   ├── src/
│   │   ├── background/
│   │   │   └── @background.js       // Handles background tasks and communication with the server
│   │   ├── content/
│   │   │   ├── @content.js          // Manages content script injection and communication
│   │   │   ├── @hooks.js            // Implements hooks for various browser APIs
│   │   │   ├── @inject.js           // Injects scripts into the web page and monitors React hooks
│   │   │   ├── @astGenerator.js     // Generates Abstract Syntax Trees for JavaScript code
│   │   │   ├── @domTraverser.js     // Traverses and analyzes the DOM structure
│   │   │   └── @promptUI.js         // Manages the UI for user prompts and interactions
│   │   ├── lib/
│   │   │   ├── @websocket.js        // Handles WebSocket communication with the server
│   │   │   └── @sessionManager.js   // Manages user sessions and related data
│   │   ├── popup/
│   │   │   ├── @popup.html          // HTML structure for the extension popup
│   │   │   └── @popup.js            // JavaScript for popup functionality
│   │   └── @manifest.json           // Extension manifest file defining permissions and settings
│   ├── @package.json                // Defines project dependencies and scripts
│   └── @webpack.config.js           // Configures webpack for building the extension
├── plugin-service/
│   ├── src/
│   │   ├── @server.js               // Main server file that handles WebSocket connections and message routing
│   │   ├── @sessionHandler.js       // Manages user sessions and their associated data
│   │   ├── @authHandler.js          // Handles user authentication and token generation
│   │   ├── @databaseManager.js      // Manages database operations using Supabase
│   │   └── @llmProcessor.js         // Processes LLM requests and responses
│   ├── schema/
│   │   └── @database.sql            // SQL schema for creating and updating database tables
│   ├── @package.json                // Defines project dependencies and scripts
│   ├── @.env                        // Stores environment variables for configuration
│   └── @server.log                  // Log file containing server activity and error messages
├── @.dockerignore                   // Specifies files to be ignored by Docker
├── @docker-compose.yml              // Defines and runs multi-container Docker applications
├── @Dockerfile                      // Contains instructions for building a Docker image
├── @package.json                    // Root package.json for managing the entire project
└── @README.md                       // Project documentation and setup instructions

Detailed Component Descriptions

Browser Plugin

1. manifest.json

  • Define the plugin's permissions, background scripts, content scripts, and other metadata.
  • Ensure cross-browser compatibility (Chrome, Firefox, Safari).

2. background/background.js

  • Manage WebSocket connection to the central service.
  • Handle communication between content scripts and the central service.
  • Manage plugin lifecycle and browser events.

3. content/content.js

  • Main content script injected into web pages.
  • Coordinate all monitoring and manipulation activities.
  • Inject and manage the prompt UI button.

4. content/hooks.js

  • Implement console monitoring:
    • Hook into console methods.
    • Capture and forward console logs to the central service.

5. content/reactHooks.js

  • Detect and monitor React hooks:
    • Traverse the React fiber tree to find hook usage.
    • Monitor state and prop changes in React components.

6. content/astGenerator.js

  • Generate Abstract Syntax Tree (AST) of the page's JavaScript:
    • Use a library like acorn or esprima to parse JavaScript.
    • Serialize the AST for transmission to the central service.

7. content/domTraverser.js

  • Implement DOM traversal and serialization:
    • Recursively traverse the DOM tree.
    • Serialize DOM elements and their properties.
  • Capture the entire rendered HTML of the page.

8. content/promptUI.js

  • Implement the prompt input UI:
    • Create a button in the page corner.
    • Implement a pop-out prompt input with text and voice-to-text capabilities.
  • Handle prompt submission and response display.

9. lib/websocket.js

  • Manage WebSocket connection to the central service.
  • Implement message serialization and deserialization.

10. lib/sessionManager.js

  • Manage session creation, storage, and retrieval.
  • Handle tab-based session partitioning.
  • Maintain session continuity across page navigations within a tab.

11. popup/popup.js (Updated)

  • Add user authentication UI and functionality.
  • Implement session creation and management interface.

Central Service

1. server.js

  • Set up WebSocket server to handle connections from browser plugins.
  • Manage incoming data from plugins and outgoing responses.
  • Coordinate with LLM processor for handling prompts and generating responses.

2. llmProcessor.js

  • Interface with the chosen LLM (e.g., OpenAI's GPT-4).
  • Process incoming prompts and context data.
  • Generate responses for the browser plugin to inject into the page.

3. sessionHandler.js

  • Manage server-side session storage and retrieval.
  • Handle multi-tenant session management.

4. authHandler.js

  • Implement user authentication and authorization.
  • Manage user sessions and tokens.

Key Features and Implementation Details

  1. Console Monitoring

    • Hook into window.console methods in hooks.js.
    • Forward captured logs to the central service via WebSocket.
  2. HTML Capture

    • Use document.documentElement.outerHTML to capture the entire rendered HTML.
  3. React Hook Monitoring

    • Inject code to access React's internal fiber tree.
    • Traverse the fiber tree to find and monitor hook usage.
    • Implement custom logic to track state and prop changes.
  4. AST Generation

    • Use a JavaScript parser library to generate AST.
    • Implement AST traversal and serialization for transmission.
  5. JavaScript Execution

    • Use eval() or Function constructor to execute JavaScript in the page context.
    • Implement a secure mechanism to receive and execute code from the central service.
  6. DOM Traversal and Serialization

    • Implement a recursive function to traverse the DOM tree.
    • Serialize DOM elements, including attributes and text content.
  7. External JavaScript Injection

    • Create a <script> element and append it to the document head.
    • Implement a method to receive URLs or code from the central service for injection.
  8. Prompt UI

    • Create a fixed-position button using CSS.
    • Implement a pop-out UI for text input and voice-to-text functionality.
    • Use the Web Speech API for voice input.
  9. WebSocket Communication

    • Implement a WebSocket client in the plugin and a server in the central service.
    • Define a protocol for message types (e.g., console logs, DOM updates, prompts).
  10. LLM Integration

    • Set up an API client for the chosen LLM service in llmProcessor.js.
    • Implement prompt construction using captured page context.
    • Process LLM responses for injection back into the page.
  11. Response Injection

    • Implement methods to inject LLM responses as HTML, JavaScript, or DOM modifications.
    • Use a flexible approach allowing for different types of page transformations.
  12. User Authentication

    • Implement a login system in the popup UI.
    • Use secure token-based authentication for API calls.
    • Ensure all extension communications are authenticated and user-specific.
  13. Session Management

    • Create tab-based sessions that persist across page navigations.
    • Allow multiple tabs to contribute to the same named session, partitioned by tab.
    • Implement server-side session storage and retrieval.
  14. Multi-tenancy

    • Ensure all WebSocket communications are marshalled to the correct authenticated user.
    • Implement user-specific data isolation in the central service.
  15. Delayed Injection

    • Allow users to log in before injecting any scripts into web pages.
    • Implement a mechanism to inject scripts only after user authentication.

Security and Privacy Considerations

  1. Implement strict content security policies in the manifest.
  2. Use secure WebSocket connections (WSS).
  3. Implement user consent mechanisms for data collection and page manipulation.
  4. Sanitize all data before execution or injection to prevent XSS attacks.
  5. Implement rate limiting and data volume restrictions to prevent abuse.
  6. Implement secure user authentication and authorization mechanisms.
  7. Ensure proper isolation of user data in multi-tenant environments.
  8. Use secure token-based authentication for all API calls.

Cross-Browser Compatibility

  1. Use WebExtensions API for maximum compatibility.
  2. Implement browser-specific code where necessary (e.g., Chrome vs Firefox differences).
  3. Test thoroughly on all target browsers (Chrome, Firefox, Safari, Edge).

Performance Optimization

  1. Use efficient DOM traversal and manipulation techniques.
  2. Implement debouncing and throttling for frequent operations (e.g., console logging, DOM updates).
  3. Use worker threads for heavy computations where possible.

Deployment and Distribution

  1. Set up build processes for each target browser using webpack.
  2. Implement automated testing using Jest and Puppeteer.
  3. Prepare submission packages for each browser's extension store.
  4. Implement a secure user management system for the central service.
  5. Set up database for storing user accounts and sessions.

This plan outlines a powerful browser plugin capable of deep integration with web pages, allowing for extensive monitoring, analysis, and LLM-powered manipulation. The modular structure allows for easy expansion and maintenance of features.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment