-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
feat: Add AI agent for natural language interaction with Parse Server #2954
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This reverts commit 7b99cb4.
🚀 Thanks for opening this pull request! |
Caution Review failedThe pull request is closed. 📝 WalkthroughWalkthroughThis update introduces an AI agent integration into the Parse Dashboard, enabling natural language interaction with Parse Server data through a chat interface. The backend adds a new API endpoint, conversation management, and OpenAI integration. The frontend implements the Agent chat UI, model selection, state persistence, error handling, and documentation updates. Several UI components are refactored or extended to support the new feature. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant AgentUI as Agent React UI
participant AgentService
participant DashboardAPI as /apps/:appId/agent (Express)
participant OpenAI
participant ParseDB as Parse Server DB
User->>AgentUI: Enter message & submit
AgentUI->>AgentService: sendMessage(message, modelConfig, appSlug, conversationId)
AgentService->>DashboardAPI: POST /apps/:appId/agent {message, model, conversationId, permissions}
DashboardAPI->>OpenAI: POST chat completion (with system prompt, tools, context)
OpenAI-->>DashboardAPI: AI response (may include tool call requests)
alt AI requests DB tool call(s)
DashboardAPI->>ParseDB: Execute requested database function(s)
ParseDB-->>DashboardAPI: Return function results
DashboardAPI->>OpenAI: POST follow-up with tool results
OpenAI-->>DashboardAPI: Final AI response
end
DashboardAPI-->>AgentService: {response, conversationId}
AgentService-->>AgentUI: {response, conversationId}
AgentUI-->>User: Display AI response in chat
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (3)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
🎉 Snyk checks have passed. No issues have been found so far.✅ security/snyk check is complete. No issues have been found. (View Details) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (11)
src/dashboard/Data/Agent/Agent.react.js (5)
45-48
: Validate stored model selection against available modelsThe stored model selection should be validated to ensure it still exists in the available models configuration. Consider validating this when the component mounts or when models become available.
95-98
: Document the route setting workaroundThis appears to be a workaround for a routing issue. Consider adding a comment explaining why this is necessary or investigate if there's a more appropriate solution within the routing system.
142-146
: Simplify scroll timing implementationThe combination of
requestAnimationFrame
andsetTimeout
might be excessive. Consider using just one approach for DOM update timing.- // Use requestAnimationFrame and setTimeout to ensure DOM has updated - requestAnimationFrame(() => { - setTimeout(() => this.scrollToBottom(), 50); - }); + // Ensure DOM has updated before scrolling + requestAnimationFrame(() => this.scrollToBottom());
165-175
: Remove redundant scroll operationThe method sets
scrollTop
directly and then callsscrollTo
. The second call is sufficient.scrollToBottom() { if (this.chatWindowRef.current) { const element = this.chatWindowRef.current; - element.scrollTop = element.scrollHeight; - - // Force smooth scrolling behavior element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' }); } }
204-210
: Simplify example submission without fake eventInstead of creating a fake event object, consider extracting the submission logic to a separate method.
+submitMessage = async (message) => { + this.setState({ inputValue: message }); + const { selectedModel, messages } = this.state; + const { agentConfig } = this.props; + + if (message.trim() === '') { + return; + } + // ... rest of the submission logic from handleSubmit +} + handleExampleClick = (exampleText) => { - this.setState({ inputValue: exampleText }, () => { - // Auto-submit the example query - const event = { preventDefault: () => {} }; - this.handleSubmit(event); - }); + this.submitMessage(exampleText); } handleSubmit = async (event) => { event.preventDefault(); - const { inputValue, selectedModel, messages } = this.state; - // ... rest of the logic + await this.submitMessage(this.state.inputValue); }src/lib/AgentService.js (2)
68-71
: Improve network error detectionDetecting network errors by checking for 'fetch' in the error message is fragile and may not work consistently across different environments or error types.
- // Handle network errors and other fetch-related errors - if (error.message && error.message.includes('fetch')) { - throw new Error('Network error: Unable to connect to agent service. Please check your internet connection.'); - } + // Handle network errors more reliably + if (error.name === 'NetworkError' || error.name === 'TypeError' || !navigator.onLine) { + throw new Error('Network error: Unable to connect to agent service. Please check your internet connection.'); + }
48-57
: Add response structure validationThe method assumes the response has specific properties without validation. Consider adding checks to ensure the response structure is valid.
const response = await post(`/apps/${appSlug}/agent`, requestBody); if (response.error) { throw new Error(response.error); } + // Validate response structure + if (!response.response || typeof response.conversationId !== 'string') { + throw new Error('Invalid response format from agent service'); + } + return { response: response.response, conversationId: response.conversationId };src/dashboard/Data/Agent/Agent.scss (1)
29-35
: Consider using CSS variables for layout constantsThe hard-coded padding values (116px for top, 80px for bottom) and height calculations should be defined as CSS variables for easier maintenance.
+:root { + --agent-toolbar-height: 96px; + --agent-toolbar-spacing: 20px; + --agent-input-height: 80px; + --agent-chat-top-padding: calc(var(--agent-toolbar-height) + var(--agent-toolbar-spacing)); +} + .chatWindow { flex: 1; overflow-y: auto; padding: 20px; - padding-top: 116px; /* Add top padding to account for the 96px fixed toolbar + some extra spacing */ - padding-bottom: 80px; /* Add bottom padding to account for the fixed chat form */ + padding-top: var(--agent-chat-top-padding); + padding-bottom: var(--agent-input-height); background-color: #f8f9fa; scroll-behavior: smooth; - height: calc(100vh - 60px); /* Explicit height constraint */ - max-height: calc(100vh - 60px); /* Prevent expansion beyond viewport */ + height: calc(100vh - 60px); min-height: 0; /* Allow flex item to shrink below content size */ }Parse-Dashboard/app.js (3)
194-195
: Consider persistent storage for conversationsThe in-memory conversation storage will lose all chat history on server restart. Consider using Redis or another persistent storage solution for production use.
506-529
: Extract query constraint logic to reduce duplicationThe query constraint handling logic is duplicated between
queryClass
andcountObjects
. Consider extracting this into a shared helper function.+ // Helper function to apply query constraints + function applyQueryConstraints(query, where) { + Object.keys(where).forEach(key => { + const value = where[key]; + if (typeof value === 'object' && value !== null) { + Object.keys(value).forEach(op => { + switch (op) { + case '$gt': query.greaterThan(key, value[op]); break; + case '$gte': query.greaterThanOrEqualTo(key, value[op]); break; + case '$lt': query.lessThan(key, value[op]); break; + case '$lte': query.lessThanOrEqualTo(key, value[op]); break; + case '$ne': query.notEqualTo(key, value[op]); break; + case '$in': query.containedIn(key, value[op]); break; + case '$nin': query.notContainedIn(key, value[op]); break; + case '$exists': + if (value[op]) {query.exists(key);} + else {query.doesNotExist(key);} + break; + case '$regex': query.matches(key, new RegExp(value[op], value.$options || '')); break; + } + }); + } else { + query.equalTo(key, value); + } + }); + } switch (functionName) { case 'queryClass': { const { className, where = {}, limit = 100, skip = 0, order, include = [], select = [] } = args; const query = new Parse.Query(className); - // Apply constraints - Object.keys(where).forEach(key => { - // ... existing constraint logic - }); + applyQueryConstraints(query, where);Also applies to: 635-656
735-735
: Consider caching the dynamic importThe
node-fetch
module is dynamically imported on every request. Consider importing it once at module level or caching the import.+ // At module level or cached + let fetch; + const getFetch = async () => { + if (!fetch) { + fetch = (await import('node-fetch')).default; + } + return fetch; + }; + async function makeOpenAIRequest(userMessage, model, apiKey, appContext = null, conversationHistory = [], operationLog = []) { - const fetch = (await import('node-fetch')).default; + const fetch = await getFetch();
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
package-lock.json
is excluded by!**/package-lock.json
src/icons/sparkle-solid.svg
is excluded by!**/*.svg
📒 Files selected for processing (14)
Parse-Dashboard/app.js
(4 hunks)README.md
(2 hunks)package.json
(1 hunks)src/components/EmptyState/EmptyState.react.js
(2 hunks)src/components/EmptyState/EmptyState.scss
(1 hunks)src/components/Sidebar/Sidebar.react.js
(2 hunks)src/components/Sidebar/Sidebar.scss
(1 hunks)src/components/Sidebar/SidebarSubItem.react.js
(2 hunks)src/dashboard/Dashboard.js
(4 hunks)src/dashboard/DashboardView.react.js
(2 hunks)src/dashboard/Data/Agent/Agent.react.js
(1 hunks)src/dashboard/Data/Agent/Agent.scss
(1 hunks)src/lib/AJAX.js
(1 hunks)src/lib/AgentService.js
(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
Parse-Dashboard/app.js (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#0
File: :0-0
Timestamp: 2025-05-11T16:43:27.354Z
Learning: The bcryptjs library is used in Parse Dashboard for password encryption and validation in three files: Parse-Dashboard/Authentication.js (compareSync), Parse-Dashboard/CLI/mfa.js (genSaltSync, hashSync), and src/dashboard/Settings/DashboardSettings/DashboardSettings.react.js (genSaltSync, hashSync).
🧬 Code Graph Analysis (3)
src/components/EmptyState/EmptyState.react.js (4)
src/dashboard/Push/PushIndex.react.js (2)
title
(132-132)renderEmpty
(417-428)src/dashboard/Data/Config/Config.react.js (1)
renderEmpty
(332-342)src/dashboard/Data/Webhooks/Webhooks.react.js (1)
renderEmpty
(387-408)src/dashboard/Analytics/SlowQueries/SlowQueries.react.js (1)
renderEmpty
(233-243)
src/lib/AgentService.js (2)
src/lib/AJAX.js (3)
message
(92-92)message
(114-114)post
(165-167)Parse-Dashboard/app.js (6)
modelConfig
(227-227)modelConfig
(233-233)requestBody
(838-846)response
(103-107)response
(259-259)response
(848-855)
README.md (1)
src/lib/ParseApp.js (1)
ParseApp
(25-867)
🔇 Additional comments (24)
package.json (1)
56-56
: node-fetch v3.3.2 is up-to-date, no vulnerabilities, and not imported anywhere—no immediate action needed
- npm audit shows no reported vulnerabilities for v3.3.2, and it is the latest published version.
- Ripgrep across all
.js
files found norequire('node-fetch')
orimport fetch from 'node-fetch')
statements.- Your codebase bundles ESM via Webpack, so there’s no CommonJS‐to‐ESM conflict today.
If you later add server-side fetch calls, ensure those files are treated as ESM (e.g. rename to
.mjs
or set"type": "module"
), or stick with a CommonJS‐compatible fetch polyfill.src/lib/AJAX.js (1)
101-121
: Enhanced error handling for server errors - LGTM!The improved error handling for HTTP 500+ responses now attempts to parse JSON and extract meaningful error messages, falling back gracefully to generic "Server Error" if parsing fails. This consistency with 400-level error handling will improve user experience by providing more detailed error information when available.
src/dashboard/DashboardView.react.js (2)
37-37
: Minor formatting improvement.Adding a blank line after route extraction improves code readability.
85-89
: New Agent section integration looks good.The Agent section is properly configured with the appropriate icon (
sparkle-solid
) and link (/agent
). The placement between Views and Webhooks is logical for the navigation flow.src/components/Sidebar/Sidebar.scss (2)
274-275
: Flexbox layout improvement for sidebar subitems.Converting to flexbox with center alignment enables proper vertical alignment of icons alongside text content.
281-294
: Enhanced anchor styling with icon hover effects.The flexbox layout for anchor subitems and the SVG hover styling provide consistent visual feedback and proper alignment for the new icon functionality.
src/components/EmptyState/EmptyState.scss (1)
10-29
: Well-structured flexbox utility classes for EmptyState component.The new CSS classes provide flexible layout options:
.flexContainer
: Centered column layout with consistent 32px spacing.content
: Constrained max-width (600px) for optimal readability.customContent
: Full width with max-width constraint for responsive designThe implementation supports the enhanced EmptyState component functionality while maintaining clean, reusable styles.
src/components/Sidebar/Sidebar.react.js (1)
85-85
: LGTM! Clean implementation of icon support in submenu items.The destructuring of the
icon
property from subsections and passing it as a prop toSidebarSubItem
follows the existing code patterns and integrates well with the component structure.Also applies to: 95-95
src/components/Sidebar/SidebarSubItem.react.js (3)
11-11
: LGTM! Proper import added for Icon component.
13-13
: LGTM! Icon prop correctly added to function parameters.
19-19
: LGTM! Consistent icon rendering with appropriate state-based styling.The conditional rendering of icons with different fill colors based on active state (white for active, #8fb9cf for inactive) provides good visual feedback. The consistent sizing (16x16) and positioning ensures uniform appearance across submenu items.
Also applies to: 31-31
src/dashboard/Dashboard.js (4)
10-10
: LGTM! Proper import for the new Agent component.
116-116
: LGTM! Agent config state properly initialized.The
agentConfig
state is correctly initialized tonull
following the existing state management patterns.
125-126
: LGTM! Clean extraction of agent configuration.The destructuring of the
agent
configuration from the dashboard config JSON and storing it in state follows the established pattern used for other configuration properties.
278-278
: LGTM! Agent route properly integrated.The new "agent" route is correctly placed within the app-specific routes and properly passes the
agentConfig
state as a prop to the Agent component, maintaining consistency with the existing routing structure.src/components/EmptyState/EmptyState.react.js (4)
44-46
: LGTM! New props enhance component flexibility.The addition of
customContent
anduseFlexLayout
props provides useful flexibility for different layout needs while maintaining backward compatibility through proper default values.
47-47
: LGTM! Clean conditional layout implementation.The conditional CSS class selection based on
useFlexLayout
provides a clean way to switch between different layout approaches.
49-64
: LGTM! Well-structured component refactoring.The refactoring from implicit return to explicit function body is clean and maintains all existing functionality. The wrapping of main content in
styles.content
and conditional rendering ofcustomContent
provides the intended flexibility while keeping the code readable.
84-86
: LGTM! Comprehensive PropTypes documentation.The new PropTypes entries are properly typed and include descriptive comments that clearly explain their purpose and usage.
README.md (4)
77-84
: LGTM! Clean formatting improvements for existing sections.The formatting adjustments to the "Browse as User", "Change Pointer Key", and "CSV Export" sections improve consistency and readability.
1268-1274
: LGTM! Excellent introduction with appropriate security warnings.The AI Agent section introduction clearly explains the feature's capabilities while prominently highlighting the security implications. The caution block appropriately emphasizes that this feature has full database access and should only be used in development environments.
1275-1306
: LGTM! Clear and comprehensive configuration documentation.The configuration section provides:
- A clear JSON example showing the expected structure
- A well-organized parameter table with all required fields
- Proper explanation of how the agent integrates with app configuration
The documentation makes it easy for users to understand and implement the AI agent feature.
1307-1344
: LGTM! Detailed and practical OpenAI setup guide.The OpenAI provider section offers:
- Clear step-by-step instructions for obtaining API keys
- Practical guidance on project setup and model access configuration
- Important security reminders about API key management
- Helpful context about billing requirements
This level of detail will help users successfully configure the AI agent feature.
Parse-Dashboard/app.js (1)
275-284
: Review debug information exposureThe debug object includes the appId and operation details. Ensure this doesn't expose sensitive information in production environments.
Consider making debug information conditional based on environment or configuration:
res.json({ response, conversationId: finalConversationId, - debug: { + ...(config.debug && { debug: { timestamp: new Date().toISOString(), appId: app.appId, modelUsed: model, operations: operationLog - } + }}) });
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
Parse-Dashboard/app.js (1)
756-756
: Fix trailing whitespace.Static analysis detected trailing spaces that should be removed for code quality.
- const schema = new Parse.Schema(className); + const schema = new Parse.Schema(className);- // First purge all objects from the class + // First purge all objects from the class- // Then delete the class schema itself + // Then delete the class schema itselfAlso applies to: 760-760, 763-763
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
Parse-Dashboard/app.js
(5 hunks)
🧰 Additional context used
🧠 Learnings (1)
Parse-Dashboard/app.js (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#0
File: :0-0
Timestamp: 2025-05-11T16:43:27.354Z
Learning: The bcryptjs library is used in Parse Dashboard for password encryption and validation in three files: Parse-Dashboard/Authentication.js (compareSync), Parse-Dashboard/CLI/mfa.js (genSaltSync, hashSync), and src/dashboard/Settings/DashboardSettings/DashboardSettings.react.js (genSaltSync, hashSync).
🪛 GitHub Check: Lint
Parse-Dashboard/app.js
[failure] 763-763:
Trailing spaces not allowed
[failure] 760-760:
Trailing spaces not allowed
[failure] 756-756:
Trailing spaces not allowed
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Node 18
- GitHub Check: Docker linux/amd64
🔇 Additional comments (14)
Parse-Dashboard/app.js (14)
53-53
: LGTM: Improved logging consistency.Changed
console.log
toconsole.warn
for error scenarios, which is more appropriate for permission-related issues.
65-68
: LGTM: Essential middleware for AI agent functionality.Adding JSON and URL-encoded body parsing middleware is necessary for the new agent endpoint that accepts POST requests with message data.
91-96
: Enhanced CSRF error handling with proper content negotiation.The improvement correctly detects AJAX/JSON requests and returns appropriate response formats. This ensures better user experience for both traditional form submissions and API calls.
193-290
: Well-structured agent endpoint with comprehensive validation.The implementation includes proper:
- Input validation for required fields
- App and model configuration verification
- API key validation with placeholder detection
- Provider support checking (OpenAI only)
- Conversation management with size limits
- Error handling and debug information
The conversation trimming to 20 messages prevents memory issues in production.
237-239
: Good security practice: API key validation.Checking for placeholder values like 'xxxxx' prevents common configuration errors and provides clear error messages to users.
295-507
: Comprehensive database tools with proper security controls.The tool definitions include:
- Clear descriptions and parameter schemas
- Proper confirmation requirements for write operations
- Distinction between object deletion vs class deletion
- Input validation requirements (especially for createObject's objectData)
The confirmation mechanism is critical for preventing accidental data modifications.
512-785
: Robust database function implementation with security safeguards.Key strengths:
- Proper Parse SDK initialization with master key
- Comprehensive query operator support
- Explicit confirmation checks for all write operations
- Detailed error logging with context
- Input validation (especially objectData requirement)
- Proper error handling and user-friendly messages
The implementation correctly enforces the security model where all write operations require explicit user confirmation.
580-583
: Excellent validation for createObject objectData parameter.The validation ensures that users cannot call createObject without providing actual data, preventing common usage errors. The detailed error message guides users on proper usage.
790-1031
: Comprehensive OpenAI integration with robust error handling.The implementation excels in:
- Detailed system prompt with clear AI assistant guidelines
- Proper conversation history management
- Tool call handling with database function integration
- Comprehensive HTTP error code handling
- Fallback content handling for null responses
- Security rules enforcement in the system prompt
The system prompt clearly defines the AI's role, security requirements, and response formatting guidelines.
826-832
: Critical security enforcement in system prompt.The explicit confirmation requirements and security rules in the system prompt are essential for preventing unauthorized database modifications. The pattern of explain→ask→confirm→execute is well-defined.
854-859
: Important usage guidance for createObject function.The detailed instructions in the system prompt prevent the AI from making incomplete function calls, particularly emphasizing the mandatory objectData parameter with examples.
919-935
: Comprehensive HTTP error handling.The error handling covers common API error scenarios with user-friendly messages:
- 401: Invalid API key
- 429: Rate limiting
- 403: Permission issues
- 5xx: Service unavailability
This provides better debugging experience for users.
1020-1023
: Good fallback handling for null content.The implementation handles edge cases where OpenAI returns null content by providing fallback messages and logging warnings. This prevents application crashes from API response variations.
Also applies to: 1027-1030
105-105
: Please verifyconfig.agent
contents before exposing to the clientI wasn’t able to locate where
config.agent
is defined in the repo, so it’s unclear whether it contains any sensitive values (e.g. API keys). Before shipping this change, manually confirm that:
- The source of
config.agent
(likely your application’s config module or a JSON file underconfig/
) does not include secrets.- Only non-sensitive model settings (e.g. model names, endpoints, timeouts) are exposed to the front end.
- Any credentials remain server-only and are not part of the object returned by
/parse-dashboard-config.json
.
# [7.3.0-alpha.42](7.3.0-alpha.41...7.3.0-alpha.42) (2025-07-29) ### Features * Add AI agent for natural language interaction with Parse Server ([#2954](#2954)) ([32bd6e8](32bd6e8))
🎉 This change has been released in version 7.3.0-alpha.42 |
# [7.3.0](7.2.1...7.3.0) (2025-08-01) ### Bug Fixes * Changing "Relative dates" option of saved filter does not enable save button ([#2947](#2947)) ([4f4977d](4f4977d)) * Class object counters in sidebar not updating ([#2950](#2950)) ([0f1920b](0f1920b)) * Clicking linked pointer with Cmd key in view table doesn't open page in new browser tab ([#2902](#2902)) ([101b194](101b194)) * Fails to generate MFA code with CLI command `parse-dashboard --createMFA` ([#2883](#2883)) ([544df1f](544df1f)) * Gracefully fail when trying to get new features in latest version of dashboard ([#2880](#2880)) ([1969a0e](1969a0e)) * Header checkbox in data browser does not indicate when a few rows are selected ([#2957](#2957)) ([e4ab666](e4ab666)) * Hyperlink in Views table ignores `urlQuery` key ([#2926](#2926)) ([c5eedf4](c5eedf4)) * Incorrect table cell width in App Settings table ([#2933](#2933)) ([d46765b](d46765b)) * Info panel scroll-to-top setting not persistent across dashboard sessions ([#2938](#2938)) ([2b78087](2b78087)) * Invalid clipboard content for multi-cell copy in data browser ([#2882](#2882)) ([22a2065](22a2065)) * Legacy filters without `filterId` cannot be deleted in data browser ([#2946](#2946)) ([65df9d6](65df9d6)) * Legacy filters without `filterId` do not appear in sidebar ([#2945](#2945)) ([fde3769](fde3769)) * Modal text input can be resized smaller than its cell in Safari browser ([#2930](#2930)) ([82a0cdc](82a0cdc)) * Move settings button on data browser toolbar for better UI ([#2940](#2940)) ([c473ce6](c473ce6)) * Pagination footer bar hides rows in data browser ([#2879](#2879)) ([6bc2da8](6bc2da8)) * Race condition on info panel request shows info panel data not corresponding to selected cell ([#2909](#2909)) ([6f45bb3](6f45bb3)) * Saved legacy filter in data browser cannot be deleted or cloned ([#2944](#2944)) ([15da90d](15da90d)) * Saved legacy filter with classname in query cannot be deleted ([#2948](#2948)) ([05ee5b3](05ee5b3)) * Selected text in info panel cannot be copied using Ctrl+C ([#2951](#2951)) ([0164c19](0164c19)) * Views not sorted alphabetically in sidebar ([#2943](#2943)) ([4c81fe4](4c81fe4)) * Warning dialog is shown after executing script on selected rows ([#2899](#2899)) ([027f1ed](027f1ed)) ### Features * Add additional values in info panel key-value element ([#2904](#2904)) ([a8f110e](a8f110e)) * Add AI agent for natural language interaction with Parse Server ([#2954](#2954)) ([32bd6e8](32bd6e8)) * Add clipboard icon to copy value of key-value element in info panel ([#2871](#2871)) ([7862c42](7862c42)) * Add Cloud Function as data source for views with optional text or file upload ([#2939](#2939)) ([f5831c7](f5831c7)) * Add column freezing in data browser ([#2877](#2877)) ([29f4a88](29f4a88)) * Add custom data views with aggregation query ([#2888](#2888)) ([b1679db](b1679db)) * Add environment variable support for AI agent configuration ([#2956](#2956)) ([2ac9e7e](2ac9e7e)) * Add hyperlink support in Views table ([#2925](#2925)) ([06cfc11](06cfc11)) * Add inclusive date filters "is on or after", "is on or before" in data browser ([#2929](#2929)) ([c8d621b](c8d621b)) * Add quick-add button to array parameter in Cloud Config ([#2866](#2866)) ([e98ccb2](e98ccb2)) * Add row number column to data browser ([#2878](#2878)) ([c0aa407](c0aa407)) * Add Settings menu to scroll info panel to top when browsing through rows ([#2937](#2937)) ([f339cb8](f339cb8)) * Add support for "not equal to" filter for Boolean values in data browser and analytics explorer ([#2914](#2914)) ([d55b89c](d55b89c)) * Add support for `Image` type in View table to display images ([#2952](#2952)) ([6a6b1f0](6a6b1f0)) * Add type mismatch warning when quick-adding entry to Cloud Config array parameter ([#2875](#2875)) ([bb1837f](bb1837f)) * Add view edit icon to views list in sidebar ([#2901](#2901)) ([96e33b9](96e33b9)) * Allow editing filter without loading data in data browser ([#2949](#2949)) ([9623580](9623580)) * Allow editing saved filters in data browser ([#2942](#2942)) ([daaccaa](daaccaa)) * Allow freeform text view resizing in modal dialogs ([#2910](#2910)) ([1399162](1399162)) * Persist info panel visibility when navigating across classes in data browser ([#2908](#2908)) ([1a3610a](1a3610a)) * Prefetch info panel data with config options `prefetchObjects` and `prefetchStale` ([#2915](#2915)) ([54a8156](54a8156)) * Warn when leaving data browser page with selected rows ([#2887](#2887)) ([206ead1](206ead1)) ### Performance Improvements * Add config option `enableResourceCache` to cache dashboard resources locally for faster loading in additional browser tabs ([#2920](#2920)) ([41a4963](41a4963))
* release: (124 commits) chore(release): 7.3.0 [skip ci] empty commit to trigger CI refactor: Bump prettier from 3.5.3 to 3.6.2 (parse-community#2955) chore(release): 7.3.0-alpha.44 [skip ci] feat: Add environment variable support for AI agent configuration (parse-community#2956) chore(release): 7.3.0-alpha.43 [skip ci] fix: Header checkbox in data browser does not indicate when a few rows are selected (parse-community#2957) refactor: Bump jest-environment-jsdom from 30.0.4 to 30.0.5 (parse-community#2941) chore(release): 7.3.0-alpha.42 [skip ci] feat: Add AI agent for natural language interaction with Parse Server (parse-community#2954) chore(release): 7.3.0-alpha.41 [skip ci] feat: Add support for `Image` type in View table to display images (parse-community#2952) chore(release): 7.3.0-alpha.40 [skip ci] fix: Selected text in info panel cannot be copied using Ctrl+C (parse-community#2951) chore(release): 7.3.0-alpha.39 [skip ci] fix: Class object counters in sidebar not updating (parse-community#2950) chore(release): 7.3.0-alpha.38 [skip ci] feat: Allow editing filter without loading data in data browser (parse-community#2949) chore(release): 7.3.0-alpha.37 [skip ci] fix: Saved legacy filter with classname in query cannot be deleted (parse-community#2948) ...
This feature adds an AI agent to interact with Parse Server in natural language.
Summary by CodeRabbit
New Features
Enhancements
Documentation
Style
Chores
node-fetch
as a new dependency to support API requests.