-
Notifications
You must be signed in to change notification settings - Fork 481
Issue 32639 ai dotai portlet #33744
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
base: issue-32639-ai-vertex-vendor
Are you sure you want to change the base?
Issue 32639 ai dotai portlet #33744
Conversation
…from Modules to Standalone (#33602) ### Proposed Changes * Mass migration from NgModules to the Angular Standalone Architecture. * Total Progress: 87.9% of the full migration is now complete (160 out of 182 modules). * Apps & Core Features: We have reached 93.5% completion on application modules, successfully modernizing almost all major user-facing features. This PR fixes: #33573 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: erickgonzalez <erick.gonzalez@dotcms.com>
### Proposed Changes This pull request implements a significant refactor of the breadcrumb (crumbtrail) system, centralizing breadcrumb state management into a new `GlobalStore` and updating related components and services to use this unified approach. Additionally, breadcrumbs are now dynamically updated in various route resolvers, and some UI and styling improvements have been made for better integration and display. Key changes include: **Breadcrumb State Management Refactor:** - Replaced the old `DotCrumbtrailService` with a new centralized `GlobalStore` for managing breadcrumbs, removing the service and updating all references in `dot-crumbtrail.component.ts` and its module. Breadcrumbs are now accessed and updated through the `GlobalStore`. [[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L2-R4) [[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17) [[3]](diffhunk://#diff-caf8b78dadac7b1cd37a71efbdfedb5baa667266e91436367ba360ee5d7c84c2L7-R11) [[4]](diffhunk://#diff-d47e844021f103caff73f8be39c8139d22fba892163ecf08831fa654b9d834dcL1-L202) - Updated the `dot-crumbtrail` component to use signals/selectors from `GlobalStore` for both the breadcrumb list and the last breadcrumb label, simplifying the logic and improving performance. [[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17) [[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L36-R36) **Dynamic Breadcrumb Updates in Route Resolvers:** - Enhanced the `DotAppsConfigurationResolver`, `DotContentTypeEditResolver`, and `DotEditPageResolver` to dynamically add or update breadcrumbs in the `GlobalStore` based on the resolved data (e.g., app name, content type, or page title) using the `addNewBreadcrumb` method. [[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dR23-R37) [[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R34-R60) [[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L43-R51) - Added necessary imports and injected the `GlobalStore` into these resolvers to support the new breadcrumb management. [[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9) [[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R18) [[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8R16) [[4]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L30-R31) **Navigation Menu Integration:** - Modified the `DotNavigationService` to update the `GlobalStore` with menu items when the navigation menu is loaded, ensuring breadcrumbs have access to menu context. [[1]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R17) [[2]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R172) [[3]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R185) **UI and Styling Improvements:** - Improved the breadcrumb display by adding a `truncate-text` class to the last breadcrumb label, ensuring long labels are truncated for better UI. - Adjusted the toolbar and crumbtrail component styles and layout for better responsiveness and alignment. [[1]](diffhunk://#diff-007c0789086dcf79d0215837b4f44a84cabec3ab41c790dc040cb829b0cb4b9bL3-R3) [[2]](diffhunk://#diff-49e35a338c5a1694d5ff515e4eb2de19a2d92e1426efbdfbcc3750617a026d2cR24-R27) **Other Technical Updates:** - Updated RxJS and Angular imports to include `tap` where side effects (breadcrumb updates) are now performed in resolvers. [[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9) [[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792L7-R7) [[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L7-R7) - Removed the now-obsolete `DotCrumbtrailService` implementation file. These changes collectively modernize and centralize breadcrumb management, improve maintainability, and enhance the user experience with more accurate and dynamic breadcrumb trails. --- **Breadcrumb State Refactor:** - Replaced `DotCrumbtrailService` with a centralized `GlobalStore` for handling breadcrumbs, updating all component and module references and removing the old service. [[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L2-R4) [[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17) [[3]](diffhunk://#diff-caf8b78dadac7b1cd37a71efbdfedb5baa667266e91436367ba360ee5d7c84c2L7-R11) [[4]](diffhunk://#diff-d47e844021f103caff73f8be39c8139d22fba892163ecf08831fa654b9d834dcL1-L202) - Simplified the `dot-crumbtrail` component to use signals/selectors from `GlobalStore` for breadcrumbs and the last breadcrumb label. [[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17) [[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L36-R36) **Dynamic Breadcrumb Updates:** - Updated route resolvers (`DotAppsConfigurationResolver`, `DotContentTypeEditResolver`, `DotEditPageResolver`) to add breadcrumbs dynamically to the `GlobalStore` based on resolved data. [[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dR23-R37) [[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R34-R60) [[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L43-R51) - Injected `GlobalStore` and added necessary imports in resolvers for breadcrumb management. [[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9) [[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R18) [[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8R16) [[4]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L30-R31) **Navigation Menu Integration:** - Updated `DotNavigationService` to push menu items into the `GlobalStore` for context-aware breadcrumbs. [[1]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R17) [[2]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R172) [[3]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R185) **UI/Styling Improvements:** - Added a `truncate-text` class to the last breadcrumb for better display of long labels. - Improved toolbar and crumbtrail styling for layout and responsiveness. [[1]](diffhunk://#diff-007c0789086dcf79d0215837b4f44a84cabec3ab41c790dc040cb829b0cb4b9bL3-R3) [[2]](diffhunk://#diff-49e35a338c5a1694d5ff515e4eb2de19a2d92e1426efbdfbcc3750617a026d2cR24-R27) **Technical Updates:** - Updated RxJS/Angular imports to support new side effects in resolvers. [[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9) [[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792L7-R7) [[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L7-R7) - Removed the obsolete `DotCrumbtrailService` file. This PR fixes: #33565 --------- Co-authored-by: erickgonzalez <erick.gonzalez@dotcms.com> Co-authored-by: Adrian Molina <adrian.molina@dotcms.com> Co-authored-by: Dario Daza <dario.daza@dotcms.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…#33750) ## Description Comprehensive fix for flaky integration tests caused by timing issues, date precision, and critical background thread request context problems. ## Changes - Fixed background thread request context issues causing NullPointerException in bundle publishing - Improved PublisherQueueJob to use JobExecutionContext.getPreviousFireTime() when available - Enhanced PublishDateUpdater with better edge case handling and parameter validation - Fixed ContentTypeHandler to use bundle owner from PublisherConfig instead of hardcoded system user - Added null checks in FieldAPIImpl for HTTP request access in background threads - Replaced Thread.sleep with Awaitility framework for proper async operation waiting - Improved date extraction and sorting validation in ContentTypeCommandIT tests - Added detailed error messages and better assertion handling - **Fixed AppsResourceTest flaky cache timing issues** (see below) ## Root Cause Analysis ### Primary Issue Code accessing HTTP request context in background threads (bundle publishing runs in Quartz jobs where HTTP request is recycled). This caused cascade failures across multiple tests that appeared unrelated. ### AppsResourceTest Cache Timing Issue The CI run revealed an **existing flaky test** unrelated to our changes: `AppsResourceTest.Test_Pagination_And_Sort_Then_Request_Filter_Expect_Empty_Results` **Symptoms**: - Expected 26 hosts but got 11 (wrong count) - Expected SYSTEM_HOST first but got random host IDs (wrong ordering) **Root Cause**: The test creates hosts rapidly and immediately queries them via `hostAPI.findAllFromCache()`, but the cache hasn't been updated yet with the newly created hosts. Classic race condition. **Solution**: Added explicit cache warming after host creation in three methods: 1. `Test_Pagination_And_Sort_Then_Request_Filter_Expect_Empty_Results` 2. `Test_Create_app_descriptor_Then_Create_App_Integration_Then_Delete_The_Whole_App` 3. `Test_Create_App_descriptor_Then_Create_App_Integration_Then_Delete_One_Single_Secret` ```java // Ensure the host cache is properly warmed with all newly created hosts // This prevents race conditions where the cache might not have all hosts yet CacheLocator.getHostCache().clearCache(); APILocator.getHostAPI().findAllFromDB(APILocator.systemUser(), com.dotmarketing.portlets.contentlet.business.HostAPI.SearchType.INCLUDE_SYSTEM_HOST); ``` ## Testing - All affected integration tests now pass consistently - Verified PublisherTest timing scenarios with proper synchronization - Tested ContentTypeCommandIT modDate sorting with second-level precision - Validated background thread safety and user context propagation - **Verified AppsResourceTest now passes consistently with cache warming fix** Closes #33746
) (#33761) ## Description Refactored cicd-diagnostics skill from bash to Python for improved compatibility, maintainability, and Claude Code skill standards compliance. ## Motivation for Python Migration The original bash implementation had several critical issues that necessitated the migration to Python: ### 1. Non-standard for Claude Code Skills - Python is the **recommended and standard language** for Claude Code skills - Better integration with Claude Code's error handling and output formatting - Structured output and parameter parsing that Claude can reliably interpret ### 2. Shell Compatibility Problems - **Bash-specific features** don't work across all shell environments (bash vs zsh vs sh) - Array handling differs between shells, causing failures on different systems - String manipulation and advanced features have varying support - Portability issues across macOS (zsh default), Linux (bash), and CI environments ### 3. Limited Error Handling - Bash error handling is primitive (set -e, exit codes) - Difficult to provide meaningful error messages to Claude - Hard to implement graceful failure recovery - Debugging bash scripts is significantly more difficult ### 4. Parameter Validation Complexity - Validating complex parameters in bash is verbose and error-prone - Type checking is difficult (everything is a string) - Parsing structured data (JSON, arrays) requires external tools (jq, etc.) ### 5. External Service Detection Requirements - Need robust HTTP libraries for GitHub API status checks - JSON parsing for dependency health checks - Better error handling for network failures ## Benefits of Python Implementation - **Standard library richness**: Built-in JSON, HTTP, regex, data structures - **Superior error handling**: Try/except with meaningful exceptions - **Type hints**: Clear parameter types and validation - **Maintainability**: More readable, easier to extend - **Cross-platform**: Consistent behavior across environments - **Testing**: Better unit testing capabilities ## Changes - Converted all bash diagnostic scripts to Python modules - Added parameter validation with clear error messages - Implemented external issue detection (GitHub API status, dependency checks) - Enhanced investigation workflow with decision-tree approach - Improved documentation with Python examples - Added comprehensive error handling and logging ## Testing - Tested investigation workflows with various failure types - Validated parameter parsing and error handling - Verified external issue detection capabilities - Confirmed compatibility across different environments Closes #33760
This PR introduces minor tweaks to padding and font-weight to improve the overall layout and readability. ### Changes include: * Adjusted padding on `dot-sub-nav.component.scss` to improve spacing. * Updated font-weight for the group header to enhance visual hierarchy and readability. ### Screenshots <img width="643" height="555" alt="image" src="https://github.com/user-attachments/assets/05fba5d3-90f5-46b2-9022-2605417eb089" /> ### Related issue This PR fixes #32296 --------- Co-authored-by: Nicolas Molina Monroy <hi@nicobytes.com>
Closes #33795 Adds CONTRIBUTING.md with guidelines for creating new tools and an example tool template. **Changes:** - Added CONTRIBUTING.md with CONTEXT framework principles - Created example tool template in src/tools/_example-tool/ - Includes best practices for tool development
## Description This PR resolves issue #33802 by migrating from the deprecated `macos-13` runner to the new `macos-15-intel` runner for macOS Intel builds. ## Changes - ✅ Replaced deprecated `macos-13` runner with `macos-15-intel` (available until August 2027) - ✅ Implemented variable-based runner version configuration similar to Ubuntu pattern - ✅ Added support for `MACOS_INTEL_RUNNER_VERSION` and `MACOS_SILICON_RUNNER_VERSION` repository variables - ✅ Set default values: `macos-15-intel` for Intel, `macos-14` for Silicon ## Solution Approach Following the same pattern used for Ubuntu runners (`UBUNTU_RUNNER_VERSION`), this change: - Provides flexibility to configure macOS runner versions via repository variables - Uses safe default values that align with GitHub's recommendations - Maintains consistency with existing workflow patterns ## Testing The workflow should now successfully build native images for macOS Intel using the supported `macos-15-intel` runner. ## Related Issue Resolves #33802
…ail Silently on Main Branch (#33807) ## Fix: DotAlertConfirmService dialogs not displaying After the Angular standalone migration, confirmation dialogs were not showing because `dot-alert-confirm` wasn't available in all component hierarchies. **Solution:** Moved `dot-alert-confirm` to the root `AppComponent` level for global availability. **Changes:** - Removed redundant instances from individual components **Affected:** Content Types and Apps Configuration delete dialogs now work correctly.
…esign (#33824) Remove old palette reference from codebase
### Proposed Changes * This PR introduces the Feature Flag to turn on/off the Style Editor under development. https://github.com/user-attachments/assets/3acd0eb9-b1b5-4833-b1ce-041ed8e18b05 This PR fixes: #33808 Co-authored-by: Kevin <kfariid@gmail.com>
## Summary
This PR adds comprehensive AI-powered semantic search capabilities to
the `@dotcms/client` SDK, enabling developers to perform intelligent
content searches using natural language queries. The implementation
introduces a new `client.ai.search()` API with full TypeScript support,
extensive test coverage, and seamless integration with existing SDK
patterns.
## Key Features
### 🤖 AI Search API
- **Natural Language Queries**: Search content using conversational
prompts like "blogs about machine learning"
- **Configurable Parameters**: Control search behavior with threshold,
model selection, and distance functions
- **Type-Safe Interface**: Full TypeScript support with generic type
parameters
- **Promise-Based API**: Modern async/await and `.then()` patterns
### 🏗️ Architecture Improvements
- **Base API Client**: New abstract `BaseApiClient` class for consistent
API structure
- **Code Reusability**: Refactored existing APIs (Page, Content,
Navigation) to extend base class
- **HTTP Client Enhancement**: Added generic `request<T>()` method for
type-safe requests
## Code Examples
### Basic AI Search
```typescript
const results = await client.ai.search('blogs about machine learning', 'content_index', {
query: {
limit: 20,
contentType: 'BlogPost'
},
config: {
threshold: 0.7
}
});
```
### Advanced Configuration
```typescript
const results = await client.ai.search('technical documentation', 'docs_index', {
query: {
contentType: 'Documentation',
languageId: 1,
limit: 50,
offset: 0
},
config: {
threshold: 0.8,
distanceFunction: DISTANCE_FUNCTIONS.cosine
}
});
```
### Promise Pattern
```typescript
client.ai
.search('product reviews', 'products_index')
.then((results) => {
console.log(`Found ${results.contentlets.length} results`);
})
.catch((error) => {
console.error('Search failed:', error.message);
});
```
## Testing Coverage
- ✅ **734 lines of tests** covering all scenarios
- ✅ Promise API with async/await
- ✅ Promise API with `.then()` callback
- ✅ Error handling and custom error types
- ✅ Parameter mapping (SDK → backend)
- ✅ Default values and configuration merging
- ✅ Type safety with generics
- ✅ Edge cases and validation
## Documentation
- 📚 **469 lines added to README.md** with:
- "How to Use AI-Powered Search" guide
- API reference for `ai.search()` method
- Multiple usage examples
- Configuration options
- Best practices
- 📖 **Base API documentation** explaining architecture pattern
- 📝 **TypeScript types documentation** for all AI interfaces
## Breaking Changes
None. This is a purely additive feature that:
- Maintains backward compatibility with all existing APIs
- Refactors internal structure without changing public interfaces
- Adds new functionality without modifying existing behavior
## Migration Impact
### Existing APIs Refactored
The following APIs now extend `BaseApiClient` (internal change only):
- `PageAPI`
- `ContentAPI`
- `NavigationAPI`
**Public API remains unchanged** - no migration needed for existing
code.
## Performance Considerations
- Efficient parameter building with URLSearchParams
- Type-safe generics eliminate runtime type checks
- Reusable base class reduces code duplication
- Lazy instantiation of AISearch instances
## Changelog Entry
### v1.3.0
- **feat**: Add AI-powered semantic search with `client.ai.search()`
method
- **feat**: New `BaseApiClient` abstract class for API consistency
- **docs**: Comprehensive AI search documentation and examples
- **types**: New TypeScript interfaces for AI search configuration
## Related Issues
Related to dotCMS AI/ML capabilities and content discovery features.
---
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
### Proposed Changes
feat: Add high-performance content-drive search endpoint with hybrid
DB/ES strategy
Summary
Implements a new high-performance search endpoint designed for
content-drive functionality that combines database reliability with
Elasticsearch text search capabilities. The implementation uses a hybrid
approach with two configurable
search strategies and extensive parallel processing optimizations.
Key Features
🔍 Hybrid Search Architecture
- Primary data source: Database as source of truth for content metadata
and structure
- Text search optimization: Elasticsearch integration for advanced text
filtering capabilities
- Configurable strategies: Two distinct heuristic approaches for
different use cases
⚡ Performance Optimizations
- Parallel contentlet hydration: Chunks contentlets for concurrent
processing using CompletableFuture
- Parallel ES processing: Processes search chunks concurrently with
configurable batch sizes
- Dynamic chunk sizing: Calculates optimal chunk sizes based on 30%
heuristic with configurable parameters
- ES clause limit handling: Automatically splits large inode sets to
respect Elasticsearch's 1024 boolean clause limit
🎯 Search Strategies
1. Hybrid Single Chunked Query ES (HYBRID_SINGLE_CHUNKED_QUERY_ES)
- Single DB query to fetch all candidate inodes
- Parallel ES processing in optimized chunks
- Ideal for scenarios with moderate result sets
2. Pure ES (PURE_ES)
- Direct Elasticsearch queries bypassing DB filtering
- Comprehensive ES query building with all filter criteria
- Optimal for text-heavy search scenarios
📊 Performance Monitoring & Debugging
- Detailed timing analytics: High-precision nanosecond timing for each
hydration step
- Performance bottleneck detection: Automatic logging of slow operations
(>100ms)
- Comprehensive logging: Step-by-step performance breakdowns (mapping,
permissions, workflow)
- Heuristic execution tracking: Strategy-specific performance metrics
Configuration Parameters
- BROWSE_API_HEURISTIC_TYPE: Strategy selection
(HYBRID_SINGLE_CHUNKED_QUERY_ES | PURE_ES)
- BROWSE_API_SINGLE_QUERY_ES_CHUNK_PERCENTAGE: Chunk size calculation
percentage (default: 30.0%)
- BROWSE_API_SINGLE_QUERY_ES_CHUNK_MIN_SIZE: Minimum chunk size for ES
processing (default: 100)
Technical Implementation
Enhanced BrowserAPI Methods
- doElasticSearchTextFiltering(): Strategy dispatcher with performance
tracking
- doHybridSingleChunkedQueryES(): Single DB query + parallel ES chunks
- doPureESQuery(): Pure Elasticsearch implementation
- hydrateContentletsInParallel(): Parallel contentlet hydration with
chunking
- findContentletsInParallel(): Optimized parallel contentlet loading
Performance Features
- Safe slicing: Boundary-safe pagination with startRow and maxRows
- Error resilience: Comprehensive exception handling with timeout
management
- Memory optimization: Chunked processing to prevent memory issues with
large datasets
- Concurrent safety: Thread-safe collections and proper future handling
API Enhancements
- Pagination support: Efficient offset/limit handling at both DB and
application levels
- Text filtering flexibility: Support for both filter and fileName
search criteria
- Multi-language support: Language-aware content filtering
- Permission integration: Role-based access control maintained
throughout parallel processing
Testing & Validation
- Postman test collections: Comprehensive test suite covering pagination
and filtering scenarios
- Performance benchmarks: Timing validations for different dataset sizes
- Strategy comparison tests: Validation of both hybrid and pure ES
approaches
Breaking Changes
None - All changes are backward compatible with existing BrowserAPI
implementations.
Configuration Migration
No migration required. New configuration parameters use sensible
defaults:
- Existing systems continue using database-only filtering unless
explicitly configured
- ES text filtering activation requires
browserQuery.useElasticsearchFiltering = true
---
🚀 This implementation provides a scalable foundation for content-drive
functionality with significant performance improvements for text-based
content searches while maintaining full backward compatibility.
This PR fixes: #33416
## Summary This PR fixes issue #33720 by addressing a casing inconsistency in the AI vision tagging system and adding comprehensive integration tests. ## Changes Made ### 🔧 **Bug Fix: Constant Casing Correction** - **File**: `dotCMS/src/main/java/com/dotcms/ai/api/OpenAIVisionAPIImpl.java:43` - **Change**: Fixed the casing of the `TAGGED_BY_DOTAI` constant from `TAGGED_BY_DOT_AI` to `TAGGED_BY_DOTAI` - **Impact**: Ensures consistent tag naming for AI-processed content, preventing potential issues with tag detection and duplicate processing ### ✅ **Test Coverage: Comprehensive Integration Tests** - **File**: `dotcms-integration/src/test/java/com/dotcms/ai/api/OpenAIVisionAPIImplTest.java` (NEW) - **Lines Added**: 502 lines of comprehensive test coverage - **Coverage**: Tests all scenarios for the `shouldProcessTags` method including: - ❌ Content types without TagField - ❌ Already AI-tagged content (prevents reprocessing) - ❌ Missing or invalid files (no file, too small, non-images) - ❌ Missing AI configuration secrets - ✅ Valid scenarios (JPG, PNG images with proper setup) - ✅ Content with manual tags but no AI marker ### 🧪 **Test Suite Integration** - **File**: `dotcms-integration/src/test/java/com/dotcms/MainSuite3a.java:48` - **Change**: Added `OpenAIVisionAPIImplTest.class` to the MainSuite3a test suite - **Purpose**: Ensures the new tests run as part of the integration test suite ## Technical Details The core issue was a casing mismatch in the `TAGGED_BY_DOTAI` constant that could lead to: 1. Inconsistent tag identification 2. Potential reprocessing of already-tagged content 3. Tag detection failures in the AI vision pipeline The comprehensive test suite validates all edge cases and boundary conditions for the AI vision tag processing logic, ensuring robust behavior across different content types, file conditions, and configuration states. ## Test Results The new test class includes 8 comprehensive integration tests: - `test_shouldProcessTags_noTagField_returnsFalse()` - `test_shouldProcessTags_alreadyTagged_returnsFalse()` - `test_shouldProcessTags_noFile_returnsFalse()` - `test_shouldProcessTags_fileTooSmall_returnsFalse()` - `test_shouldProcessTags_notAnImage_returnsFalse()` - `test_shouldProcessTags_noSecrets_returnsFalse()` - `test_shouldProcessTags_allConditionsMet_returnsTrue()` - `test_shouldProcessTags_pngImage_returnsTrue()` - `test_shouldProcessTags_hasOtherTagsButNotAITag_returnsTrue()` All tests validate the business logic for determining when content should be processed by the AI Vision API.
#Closes #30138 ### Proposed Changes * Implemented .dotcliignore file support to exclude files and directories from push operations, similar to how .gitignore works for Git. The `.dotcliignore` file supports the following glob patterns: - `*` - Matches any sequence of characters within a single directory level - `**` - Matches any sequence of characters across multiple directory levels - `?` - Matches any single character - `[]` - Matches a character class (e.g., `[abc]` or `[0-9]`) - `!` - Negates a pattern to re-include files that were previously excluded ### Checklist - [x] Tests
…dings on the dotAI portlet
…ls (#33839) ## Summary This PR refactors form field error handling across the edit-content library to use Angular signals for better reactivity and consistency. Additionally, it adds documentation for the SDK Analytics Installer skill. ## Changes Made https://github.com/user-attachments/assets/6e2070f2-02ce-472b-8bcd-031f7463a08d ### Frontend #### Error Handling Refactor - **Unified error state management** across 20+ form field components ([base-wrapper-field.ts:20-46](core-web/libs/edit-content/src/lib/fields/shared/base-wrapper-field.ts#L20-L46)) - Replaced `hasError` getter with `$hasError` signal for reactive error state tracking - Added automatic error state synchronization via `merge()` of `valueChanges`, `statusChanges`, and `events` streams - Introduced `afterNextRender()` lifecycle hook to ensure control initialization before subscribing - **Template standardization** - Updated all field component templates to use `fieldHasError` local variable: - Binary field, Block editor, Calendar, Category, Checkbox - Custom field, File field, Host/Folder, JSON, Key-Value - Multi-select, Radio, Relationship, Select, Tag - Text area, Text field, WYSIWYG #### Pattern Changes ```typescript // Before: Getter-based approach get hasError(): boolean { return !!(this.formControl?.invalid && this.formControl?.touched); } // After: Signal-based reactive approach $hasError = signal(false); // Auto-updates via merged control streams in constructor ``` #### Breaking Changes None - This is an internal refactor that maintains the same external API and behavior. #### Testing - [ ] Manual testing performed on all affected field components #### Related Issues Closes #33654
## Summary
This PR implements automatic content impression tracking for the dotCMS
Analytics SDK, allowing applications to track when contentlets become
visible in the user's viewport. The feature uses the
IntersectionObserver API for high-performance, battery-efficient
visibility detection with configurable thresholds for visibility
percentage and dwell time.
## Changes Made
### Analytics SDK Core (`core-web/libs/sdk/analytics/`)
#### Impression Tracking System
- **New impression tracker class**
[`dot-content-analytics.impression-tracker.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/dot-content-analytics.impression-tracker.ts)
- Implements IntersectionObserver-based content visibility detection
- Tracks dwell time (minimum time visible before firing event)
- Deduplicates impressions per session
- Respects page visibility (pauses when tab inactive)
- Handles dynamic content with MutationObserver
- Automatically disabled in dotCMS editor mode (UVE)
- Performance-optimized with configurable limits (default: 1000 max
elements)
- **New impression plugin**
[`dot-analytics.impression.plugin.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/impression/dot-analytics.impression.plugin.ts)
- Lifecycle management for impression tracking
- Initializes tracker when enabled via config
- Cleanup handlers for page unload events
- **Impression utility functions**
[`dot-analytics.impression.utils.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/impression/dot-analytics.impression.utils.ts)
- Pure functions for visibility calculations
- Viewport metrics extraction (offset percentage, visibility ratio)
- Contentlet data extraction from DOM attributes
- Debounce and throttle utilities
#### Plugin Architecture Refactoring
- **Main plugin**
[`dot-analytics.plugin.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/dot-analytics.plugin.ts:69-168)
- Refactored to handle both predefined and custom events
- Added type guards to distinguish event types
- Structures events based on type (pageview, content_impression, custom)
- Simplified event sending logic with `sendEvent()` helper
- **Enricher plugin**
[`dot-analytics.enricher.plugin.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/enricher/dot-analytics.enricher.plugin.ts)
- Updated to handle content impression events
- Adds minimal page data (title, url) to impression events
- Simplified event enrichment logic
- Better type safety with discriminated unions
#### Type System Enhancements
- **Data models**
[`data.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/data.model.ts:113-152)
- New `DotCMSContentImpressionPageData` type (minimal page data)
- New `DotCMSImpressionEventData` interface
- Added viewport metrics and timing information structures
- **Event models**
[`event.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/event.model.ts:72-111)
- New `DotCMSContentImpressionPayload` type (producer plugin data)
- New `DotCMSContentImpressionEventData` type (enriched data)
- New `DotCMSContentImpressionEvent` type
- Updated `DotCMSEvent` union to include impression events
- **Library models**
[`library.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/library.model.ts:21-54)
- New `ImpressionConfig` interface with configurable thresholds
- New `ContentletData` interface for contentlet metadata
- New `ViewportMetrics` interface for viewport calculations
- Added `impressions` property to `DotCMSAnalyticsConfig`
- **Request models**
[`request.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/request.model.ts:10-30)
- Simplified request body types
- Better documentation of event structure flexibility
#### Constants and Utilities
- **Constants**
[`dot-content-analytics.constants.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/constants/dot-content-analytics.constants.ts)
- Added `CONTENT_IMPRESSION` predefined event type
- Default configuration values for impression tracking
- DOM class/attribute constants for contentlet identification
- **Utilities**
[`dot-content-analytics.utils.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/dot-content-analytics.utils.ts)
- New `isPredefinedEventType()` type guard function
- Helper functions for event type discrimination
### Documentation
- **README updates**
[`README.md`](core-web/libs/sdk/analytics/README.md:118-227)
- Comprehensive impression tracking configuration guide
- Usage examples with default and custom configurations
- How it works section explaining the feature
- Configuration option reference table
## Technical Details
### Impression Tracking Architecture
The impression tracking system follows a producer-consumer pattern
within the Analytics.js plugin pipeline:
1. **Impression Plugin** (Producer)
- Monitors DOM for contentlets with `dotcms-analytics-contentlet` class
- Fires `instance.track('content-impression', data)` when
visibility/dwell thresholds met
- Runs independently in the Analytics.js lifecycle
2. **Enricher Plugin** (Middleware)
- Intercepts impression events via `track:dot-analytics` hook
- Adds minimal page data (title, url only)
- Passes enriched data to main plugin
3. **Main Plugin** (Consumer)
- Receives enriched impression data
- Structures into proper `DotCMSContentImpressionEvent`
- Sends to queue or server
### Performance Optimizations
- **IntersectionObserver API**: Native browser API for efficient
visibility detection
- **Throttling**: Configurable throttle for intersection callbacks
(default: 100ms)
- **Idle Callback**: Optional `requestIdleCallback()` for low-priority
processing
- **Node Limits**: Configurable maximum elements to track (default:
1000)
- **Session Deduplication**: Each contentlet tracked once per session
- **Visibility-aware**: Pauses tracking when tab is inactive
### Configuration Defaults
```typescript
{
visibilityThreshold: 0.5, // 50% visible
dwellMs: 750, // 750ms dwell time
maxNodes: 1000, // Max 1000 elements
throttleMs: 100, // 100ms throttle
useIdleCallback: false // Direct processing
}
```
### Breaking Changes
None - this is a new feature that is disabled by default.
### Testing
Unit tests added for impression utilities
Manual testing performed with example application
Integration tests for full tracking pipeline (follow-up)
E2E tests in real-world scenarios (follow-up)
### Related Issues
Closes #33613
…abels (#33743) ## Description Updates the MCP server content type creation tool to enforce Title Case formatting for field labels, ensuring human-readable and properly formatted field names. ## What Changed - Added IMPORTANT note in the content type creation description requiring field names to be in Title Case format - Provides clear examples: "Page Title" not "pageTitle", "First Name" not "firstName" ## Why When the MCP server creates content types, field labels should be human-readable and follow consistent formatting conventions. Title Case formatting improves readability and maintains professional standards across content type definitions. ## Related Issue Closes #33742
…locity code rendered (#33849) ### Proposed Changes This feature enhancement adds the ability to render Velocity code in Custom Fields when retrieving Content Types through the REST API. ### Key Changes #### 1. New REST Endpoint (ContentTypeResource.java) - Added /v1/contenttype/render/id/{idOrVar} endpoint that returns Content Types with their Custom Fields' Velocity code parsed and rendered - The original /v1/contenttype/id/{idOrVar} endpoint remains unchanged for backward compatibility - Both endpoints share the same core logic but differ in whether they render Custom Fields #### 2. Enhanced Content Type Transformation (ContentTypeHelper.java) - Modified contentTypeToMap() method to accept a new renderCustomFields parameter (defaults to false) - Added includeRenderedCustomFields() method that: - Inspects all fields in a Content Type - Identifies Custom Fields (those with class ImmutableCustomField) - Parses their Velocity code using VelocityUtil.parseVelocity() - Adds a new rendered attribute containing the generated HTML/JavaScript output - Uses VelocityWebUtil.getVelocityContext() to get the proper Velocity context from the current HTTP request/response - Includes error handling that logs parsing failures without breaking the response #### 3. OpenAPI Specification Update (openapi.yaml) - Added documentation for the new /v1/contenttype/render/id/{idOrVar} endpoint - Updated descriptions to be more precise about Content Type retrieval - Maintained consistency with existing endpoint documentation patterns #### 4. Comprehensive Test Coverage (ContentTypeResourceTests.json) - Significantly expanded Postman test collection (1090 lines, up from previous version) - Added tests for the new rendering endpoint - Includes tests verifying: - Custom Fields have the rendered attribute when using the render endpoint - Original endpoint doesn't include the rendered attribute - Error handling for invalid Velocity code - Pagination and filtering with the new endpoint #### Technical Implementation Details - Backward Compatible: Existing endpoints and functionality remain unchanged - Opt-in Feature: Velocity rendering only occurs when explicitly using the /render/id/{idOrVar} endpoint - Secure: Uses existing Velocity parsing infrastructure with proper context initialization - Error Resilient: Parsing errors are logged but don't break the entire response - RESTful Design: Follows dotCMS REST API conventions with proper HTTP methods and response structures #### Use Case This feature is particularly useful for the Edit Content UI and other frontend applications that need to display Custom Fields with their Velocity code already executed, eliminating the need for client-side rendering or additional API calls. This PR fixes: #33618
…ement (#33851) ## Summary This PR implements the `useAISearch` React hook for managing AI search state in React applications and improves the AI search API response structure for better developer experience. ### Key Changes #### 1. New `useAISearch` React Hook (`libs/sdk/react/src/lib/next/hooks/useAISearch.ts`) - **State Management**: Manages AI search lifecycle with `idle`, `loading`, `success`, and `error` states - **Type-Safe**: Full TypeScript support with generic content type parameter - **API Integration**: Seamlessly integrates with the dotCMS client AI search API - **Exposed Methods**: - `search(prompt: string)` - Executes AI search with the provided prompt - `reset()` - Resets search state to idle - **Return Values**: - `response` - Full AI search response with metadata - `results` - Direct access to content results array - `status` - Current operation status with error details #### 2. API Response Refactoring - **Breaking Change**: Renamed `dotCMSResults` → `results` in `DotCMSAISearchResponse` - **Rationale**: More intuitive naming convention aligned with modern API design - **Internal Transformation**: Client SDK now transforms raw API response to user-facing format - **New Internal Type**: `DotCMSAISearchRawResponse` for backend compatibility - **Updated**: All documentation and examples in README.md #### 3. Content Drive Improvements (Merged from #33764) - **Enhanced Error Handling**: Upload failures now show specific error messages from API response - **UI Fix**: Toolbar grid layout adjusted to properly accommodate search input (2 columns + flexible space) - **Code Cleanup**: Removed unnecessary path state updates and unused test cases in sidebar store #### 4. Type System Enhancements - **New Generic Status Type**: `DotCMSEntityStatus` for consistent state management patterns - **Internal Types Export**: Added `internal.ts` exports for AI types to support SDK implementation - **Enhanced Type Safety**: Better type inference for AI search responses ### Files Changed **Core Implementation:** - `libs/sdk/react/src/lib/next/hooks/useAISearch.ts` - New React hook - `libs/sdk/react/src/lib/next/shared/types.ts` - Type definitions - `libs/sdk/react/src/index.ts` - Public API exports **API Layer:** - `libs/sdk/client/src/lib/client/ai/search/search.ts` - Response transformation - `libs/sdk/types/src/lib/ai/public.ts` - Public API types - `libs/sdk/types/src/lib/ai/internal.ts` - Internal types - `libs/sdk/types/src/lib/components/generic/public.ts` - Shared status type **Documentation:** - `libs/sdk/client/README.md` - Comprehensive examples and usage **Content Drive:** - `libs/portlets/dot-content-drive/portlet/src/lib/dot-content-drive-shell/dot-content-drive-shell.component.ts` - `libs/portlets/dot-content-drive/portlet/src/lib/components/dot-content-drive-toolbar/dot-content-drive-toolbar.component.scss` - `libs/portlets/dot-content-drive/portlet/src/lib/store/features/sidebar/withSidebar.ts` ## Test Plan - [ ] Verify `useAISearch` hook properly manages state transitions (idle → loading → success/error) - [ ] Test AI search with various prompts and configuration options - [ ] Confirm `results` property contains expected content data - [ ] Validate error handling when search fails - [ ] Test `reset()` functionality returns to idle state - [ ] Verify TypeScript types are correctly inferred for custom content types - [ ] Check Content Drive upload error messages display correctly - [ ] Validate toolbar layout renders properly across different screen sizes - [ ] Run existing AI search tests to ensure backward compatibility in SDK client - [ ] Verify documentation examples work as expected ## Breaking Changes⚠️ **API Response Property Renamed**: `DotCMSAISearchResponse.dotCMSResults` → `DotCMSAISearchResponse.results` **Migration Guide:** ```typescript // Before const response = await client.ai.search('query', 'index'); response.dotCMSResults.forEach(item => console.log(item)); // After const response = await client.ai.search('query', 'index'); response.results.forEach(item => console.log(item)); ``` This PR fixes: #33850
core-web/yarn.lock
Outdated
| version "19.2.9" | ||
| resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.9.tgz#0af6a48fc0db9f981e1d662a1c9cf299d3ac92d9" | ||
| integrity sha512-K6wtAsJhQeD2OjoupV03gWHBqnqhEP9llzFzlnQoXAAZzM1eIT/KAtQEdNY75NO+BESKxaXvQBAU16Tg/1I6uw== | ||
| "@angular/compiler@20.3.9": |
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.
High severity vulnerability may affect your project—review required:
Line 557 lists a dependency (@angular/compiler) with a known High severity vulnerability.
ℹ️ Why this matters
Affected versions of @angular/compiler are vulnerable to Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'). A stored XSS vulnerability in the Angular Template Compiler arises because its internal security schema doesn't classify certain URL‐ holding attributes (e.g. xlink:href, math|href, annotation|href) or the attributeName binding on SVG animation elements (<animate>, <set>, etc.) as requiring strict URL sanitization. An attacker who can supply untrusted input to template bindings like [attr.xlink:href] or <animate [attributeName]="'href'" [values]="maliciousURL"> can inject a javascript: URL payload. When the element is activated (e.g. clicked) or the animation runs, the malicious script executes in the application's origin, enabling session hijacking, data exfiltration, or unauthorized actions.
To resolve this comment:
Check if you allow SVG/MathML attributes (e.g., xlink:href, href) or to the attributeName field of SVG animation tags (, , etc.) in HTML templates.
- If you're affected, upgrade this dependency to at least version 20.3.15 at core-web/yarn.lock.
- If you're not affected, comment
/fp we don't use this [condition]
💬 Ignore this finding
To ignore this, reply with:
/fp <comment>for false positive/ar <comment>for acceptable risk/other <comment>for all other reasons
If this is a critical or high severity finding, please also link this issue in the #security channel in Slack.
You can view more details on this finding in the Semgrep AppSec Platform here.
|
Semgrep found 322
Risk: Affected versions of @angular/compiler are vulnerable to Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'). A stored XSS vulnerability in the Angular Template Compiler arises because its internal security schema doesn't classify certain URL‐ holding attributes (e.g. xlink:href, math|href, annotation|href) or the Manual Review Advice: A vulnerability from this advisory is reachable if you allow Fix: Upgrade this library to at least version 20.3.15 at core/core-web/yarn.lock:557. Reference(s): GHSA-v4hv-rgfq-gp49, CVE-2025-66412 If this is a critical or high severity finding, please also link this issue in the #security channel in Slack. Semgrep found 56
Risk: Affected versions of @angular/common are vulnerable to Exposure of Private Personal Information to an Unauthorized Actor / Insertion of Sensitive Information Into Sent Data. HttpClient incorrectly treats protocol-relative URLs as same-origin and attaches the X-XSRF-TOKEN header, allowing an attacker-triggered request to leak the victim’s XSRF token to an attacker-controlled domain. Fix: Upgrade this library to at least version 20.3.14 at core/core-web/yarn.lock:536. Reference(s): GHSA-58c5-g7wp-6w37, CVE-2025-66035 If this is a critical or high severity finding, please also link this issue in the #security channel in Slack. |
We need to support bath in dotCMs to send the event to jitsu, for this we need to use a different key and a different endpoint, the endpoint is going to be set in the App, for now this batch is really simple it just take the batch of events send by the FE and send it as a batch to jitsu. ### Proposed Changes * Use the m2 key instead of the jskey https://github.com/dotCMS/core/pull/34059/files#diff-29cacbde2fe6ea160809f524ffd80ffc8526f8d2f60cff0339996965c0e36b90R90 * Not send a request for each event in the payload, now we are going to send just one Request for all the events https://github.com/dotCMS/core/pull/34059/files#diff-c6b552720dcdd032d58c9b299fd4c5aba7a5f3b233c6ae1d7a1528e94bfe51c7R102-R131
…sions` metric (#34069) ### Proposed Changes * This metric provides a visual representation of the metric exposed here: * #33870 * The CubeJS query that exposes the data for a specified time range is: ```json { "measures": [ "EventSummary.uniqueVisitors", "EventSummary.uniqueConvertingVisitors" ], "timeDimensions": [ { "dimension": "EventSummary.day", "dateRange": [ "2025-12-01", "2025-12-08" ], "granularity": "day" } ] } ```
) ## Summary This PR implements comprehensive folder support in the Content Drive table view, enabling users to browse, navigate, and manage folders alongside content items with full drag-and-drop functionality. ### Key Features - **Folder Display**: Show folders in table view with proper icons, metadata, and visual indicators - **Navigation**: Click folder rows to navigate into them with breadcrumb path tracking - **Drag & Drop**: Move both files and folders between locations using drag-and-drop - **Folder Management**: Create and edit folders with full metadata (title, sort order, show on menu, file masks) - **Context Menus**: Folder-specific workflow actions and operations - **Search Integration**: Text search that intelligently filters folders when searching content - **System Host Protection**: Prevents folder loading on system host ### Technical Implementation **New Services:** - `DotContentDriveService` - Unified search API using `/api/v1/drive/search` endpoint - Enhanced `DotFolderService` with `createFolder()` and `saveFolder()` methods **Type System:** - Extended `DotContentDriveItem` to support both `DotCMSContentlet` and `DotContentDriveFolder` - New `DotContentDriveSearchRequest` interface with comprehensive filtering options - New `DotContentDriveSearchResponse` with folder/content counts **State Management:** - Folder-aware store with navigation state - Enhanced drag-and-drop with folder destination support - Sidebar integration for folder operations **UI Components:** - Updated `dot-contentlet-icon` web component with consistent gray-700 styling - Enhanced folder list view with navigation indicators - Improved dialog for folder creation/editing ### Changes Summary - **43 files changed** with 3,639 additions, 514 deletions - Comprehensive unit test coverage for all new services - Integration tests for drag-and-drop functionality - Component tests using Spectator with modern Angular testing patterns Related to #33991 🤖 Generated with [Claude Code](https://claude.com/claude-code)
#34004) ### Proposed Changes * Exposes a new method in the existing `structures` ViewTool that allow developers to check whether the Content Type that the ViewTool is called in has the new Edit mode enabled or not. * This mechanism is going to be used by the Angular layer to determine how existing Custom Fields are going to be rendered in the new Content Edit Mode. That is, the mode that uses Angular instead of the legacy JSP/Dojo UI. This PR fixes: #33988
### Proposed Changes This pull request introduces improvements to how the default value for the `newRenderMode` field property is determined and managed, making it more dynamic and responsive to feature flag configuration. It also refactors related code for clarity and maintainability, and adds a new feature flag for the default render mode. The main changes are grouped below by theme. **Dynamic Default Value for `newRenderMode`:** * The `FieldPropertyService` now retrieves the default value for `newRenderMode` from a feature flag (`FEATURE_FLAG_CONTENT_EDITOR2_RENDER_MODE_DEFAULT`) using the `DotPropertiesService`, falling back to `DotRenderModes.IFRAME` if the flag is not found. This makes the default configurable without code changes. [[1]](diffhunk://#diff-bde383871412422b64c2a096eeda7acad8858088182afe147943fae6d6113629R30-R39) [[2]](diffhunk://#diff-bde383871412422b64c2a096eeda7acad8858088182afe147943fae6d6113629L86-R106) [[3]](diffhunk://#diff-3f0ed89ee1cbcb925153f86b2a576abd34e5a4e0639c55669b3a1f5d205ac5afR29) * The `DotPropertiesService.getKey()` method is refactored to return `FEATURE_FLAG_NOT_FOUND` when the requested key does not exist, improving error handling and clarity. **Component Lifecycle and Efficiency Improvements:** * The `DynamicFieldPropertyDirective` now implements `OnDestroy` and manages component creation, updating, and destruction more efficiently, only recreating components when necessary and cleaning up properly. It also uses deep equality checks for field changes. **Minor Adjustments and Refactoring:** * The default value for `newRenderMode` in `PROPERTY_INFO` is changed from `'false'` to an empty string, reflecting that the value should be dynamically determined. * Various imports and type usages are updated to support the above changes and improve code clarity. [[1]](diffhunk://#diff-bde383871412422b64c2a096eeda7acad8858088182afe147943fae6d6113629R2-R15) [[2]](diffhunk://#diff-b404d83cba1d88245c1bd41631e510a204262f092431af1339ff90d5f87ffa7cL8-R8) These changes collectively make the handling of the `newRenderMode` property more robust and configurable, and improve the lifecycle management of dynamic field property components. ### Checklist - [ ] Tests - [ ] Translations - [ ] Security Implications Contemplated (add notes if applicable)
…e on dotcms/uve (#34038) https://github.com/user-attachments/assets/67c0f657-49e9-4e5f-9071-2bc830cbea2a ### Usage ``` // First define the form with the API. const blogForm = defineStyleEditorSchema({ contentType: 'Content', sections: [ { title: 'Typography', fields: [ styleEditorField.checkboxGroup({ label: 'New CheckboxGroup', options: [ { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' } ], defaultValue: { option1: false, option2: false }, }), styleEditorField.radio({ label: 'Layout', columns: 2, options: [ { label: 'Option 1', value: 'option1', imageURL: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSphn5CRr3MrQUjWWH7ByHWW-lROnVQl4XxYQ&s', width: 119 }, { label: 'Option 2', value: 'option2', imageURL: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSphn5CRr3MrQUjWWH7ByHWW-lROnVQl4XxYQ&s' }, { label: 'New Option', value: '' }, { label: 'New Option', value: 'new-option' } ], }) ] } ] }) // Then use the helper hook. useStyleEditorSchemas([blogForm]) // This hook internally use a exposed function called registerStyleEditorSchemas() // In Angular, we can use this function directly. We can create a service for this too, but maybe is a lot of code only for that, but we can recheck this later ``` --------- Co-authored-by: Kevin <kfariid@gmail.com>
… the palette (#34073) ### Video https://github.com/user-attachments/assets/eaa94159-eec9-42e7-8918-df4751f51fba This PR fixes: #34065
Before <img width="1712" height="923" alt="Screenshot 2025-12-08 at 3 38 33 PM" src="https://github.com/user-attachments/assets/0338e164-b05d-4a60-abe7-47ad6e43a913" /> After <img width="1706" height="883" alt="Screenshot 2025-12-08 at 3 38 09 PM" src="https://github.com/user-attachments/assets/590faa0a-0f38-4a3e-a7cb-08cbfea9fb51" /> This PR fixes: #33978
Before <img width="1722" height="748" alt="Screenshot 2025-12-08 at 2 53 58 PM" src="https://github.com/user-attachments/assets/ef26b32b-37cb-4f21-9b3c-835d58f3375b" /> After <img width="1422" height="606" alt="Screenshot 2025-12-08 at 2 53 38 PM" src="https://github.com/user-attachments/assets/ed2e03c4-4f49-40d5-8874-9e16a9e7ebd6" /> This PR fixes: #34033
…ments (#34081) ## Summary ### Major Changes - **Field Reorganization**: Reorganized folder dialog to prioritize key fields in the basic tab: - **Name (URL)** - Primary field, URL-friendly slug (first field, autofocused) - **Navigation Title** - Display name for menus (auto-generated from name) - **Path** - Read-only path preview - Advanced fields moved to Advanced tab (sort order, file extensions, default file type) - **Auto-generation Logic Reversal**: Changed from title→name to name→title - Previously: User enters title, name (URL) auto-generated as slug - Now: User enters name (URL), navigation title auto-capitalizes with proper formatting - Navigation title only auto-generates when not manually edited (respects dirty state) - Conversion: `my-folder-name` → `My Folder Name` ### Bug Fixes - **Dialog Context Fix**: Fixed folder dialog not opening in correct folder by adding null safety to slug generation - **Path Preview**: Added null/empty/whitespace handling for path generation, shows hostname when name is empty ### Accessibility - **Context Menu Focus**: Changed from `:focus` to `:focus-visible` for better keyboard navigation - Prevents unwanted focus ring on mouse clicks - Shows focus ring only during keyboard navigation ### Performance & Caching - **Memoization Fix**: Fixed context menu caching to use correct keys - Folders: Use `identifier` as cache key - Contentlets: Use `inode` as cache key - Prevents incorrect menu display when switching between folders and files ### UI/UX Improvements - **Dialog Height**: Reduced max-height from 30rem to 24rem to better fit reorganized content - **Field Labels**: Updated "Title" to "Navigation Title" for better clarity - **Table Header**: Changed column header from "title" to "name" for consistency 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…eb components (#34078) ### Proposed Changes This pull request introduces a new, unified API for interacting with form fields across both Angular and Dojo form bridges, and adds support for a rendered value in content type fields. It also enhances the custom field UI with modal and inline iframe display options, and updates the models and services to support these features. ### Form Bridge API Enhancements * Added the `FormFieldAPI` interface to provide a consistent set of methods (`getValue`, `setValue`, `onChange`, `enable`, `disable`, `show`, `hide`) for interacting with individual form fields. Both `AngularFormBridge` and `DojoFormBridge` now implement the new `getField(fieldId)` method, making field manipulation easier and more standardized. [[1]](diffhunk://#diff-ce753b47e2efc0c67e1d72f1710d3e4bba7014ff5c9f758c3bf588857dc3256bR3-R45) [[2]](diffhunk://#diff-ce753b47e2efc0c67e1d72f1710d3e4bba7014ff5c9f758c3bf588857dc3256bR74-R81) [[3]](diffhunk://#diff-08b7f2dbb6ec1f4033d7a5801c7f63b080a8f9565b11c3f9b7c40ea512578e6fR178-R237) [[4]](diffhunk://#diff-fe3a388c08be205717a8a85cc52f63bf2b3aacac655960871dc86e0276987e09R197-R273) * Updated imports and usage to include the new `FormFieldAPI` type in the bridge implementations. [[1]](diffhunk://#diff-08b7f2dbb6ec1f4033d7a5801c7f63b080a8f9565b11c3f9b7c40ea512578e6fR8) [[2]](diffhunk://#diff-fe3a388c08be205717a8a85cc52f63bf2b3aacac655960871dc86e0276987e09L1-R1) ### Content Type Field Model and Service Updates * Added a new `rendered` property to both `ContentTypeCustomField` and `DotCMSContentTypeField` interfaces to support storing rendered field values. [[1]](diffhunk://#diff-f992fe94678442e33dc4933224e4efd6fcd0dfb04e02a18bc57eebe90da91ff0R318) [[2]](diffhunk://#diff-f992fe94678442e33dc4933224e4efd6fcd0dfb04e02a18bc57eebe90da91ff0R568) * Added a new service method `getContentTypeWithRender(idOrVar)` in `DotContentTypeService` to fetch content types with rendered values via a new API endpoint. ### UI Improvements for Custom Fields * Implemented a new UI for legacy custom fields, supporting both inline iframe and modal dialog display modes based on field configuration. This improves usability for fields requiring external or embedded content. * Added corresponding SCSS styles for the new custom field UI, including modal, fullscreen, and disabled input states. ### Miscellaneous Fixes * Updated field merging logic in the drop zone component to use spread syntax, ensuring a safer and more predictable merge of field properties. * Improved handling of field variables in the properties form component to preserve existing variable data when updating the new render mode. ### Checklist - [x] Tests - [x] Translations - [x] Security Implications Contemplated (add notes if applicable) ### Additional Info ** any additional useful context or info **
### Proposed Changes
Below are the classes modified that allow the PageAPI to **save
Content** with styleProperties within a container in a page.
* `PageContainerForm.java`
- [ ] Added `stylePropertiesMap` field to `ContainerEntry`
- [ ] Updated constructors to support `stylePropertiesMap`
- [ ] Added getter/setter methods
- [ ] Enhanced JSON deserializer to parse `styleProperties` with
multi-type support (string, number, boolean)
* `PageResourceHelper.java`
- [ ] Modified `saveContent()` method to extract `stylePropertiesMap`
from containerEntry.
* `PageResource.java`
- [ ] Fixed `reduce()` method to preserve `stylePropertiesMap` during
container entry consolidation, if the key is repeated the styles are
overwrite with the last entry evaluated.
- [ ] Created `ContainerData` helper class to hold both `contentIds` and
`stylePropertiesMap`.
* `PageResourceTest.java`
- [ ] Added comprehensive integration test
`test_addContent_with_styleProperties()`
- [ ] Added deserialized test when passing a string.
* `PageResourceTest.json`
- [ ] Include test when style properties are send.
* `resources/PageResourceTest.json`
- [ ] Delete repeated postman tests already present in
`PageResourceTest.json`
This PR fixes: #33695
### Proposed Changes
This pull request introduces several improvements and refactors across
multiple Angular applications in the monorepo, focusing on standardizing
configuration, improving error handling patterns, and minor
dependency/configuration cleanups. The most notable changes are grouped
as follows:
**1. Standardization of RxJS Error Handling:**
- Refactored all usages of the `tapResponse` operator to use the
object-based signature (`{ next, error }`) instead of positional
arguments, improving code readability and aligning with best practices.
This was done in files such as `dotcdn.component.store.ts`,
`dot-pages.store.ts`, and `dot-template.store.ts`.
[[1]](diffhunk://#diff-b202dfd3e850f6f8d29a81e0f698f305309a1d524fcb089138c0eed4f0b0e2d0L95-R117)
[[2]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL364-R365)
[[3]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL377-R380)
[[4]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL789-R804)
[[5]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL838-R843)
[[6]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL861-R867)
[[7]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL892-R893)
[[8]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL905-R907)
[[9]](diffhunk://#diff-7cdbc60fb309458c9c97919670ee9f2700e6f97077360d7b2c60be5d8915f1eaL164-R178)
**2. Project Configuration Updates:**
- Added or updated `"tags"` fields (often to empty arrays or with
specific tags like `["skip:test", "skip:lint"]`) in multiple
`project.json` files for better project categorization and tooling
compatibility.
[[1]](diffhunk://#diff-b9f5cc7169c5770b5a2f040c8662568055bb427d78d3de5863f18368983602b3R7)
[[2]](diffhunk://#diff-7bb84e18c1e3ac80aed41afaa0693a7c4224324e222c2ed95f1cec1525903f35R7)
[[3]](diffhunk://#diff-5ee971cb1c993c2ebd054104878f6077f83bdc3191e9297c79086deda2f909e0R7)
[[4]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8R7-R8)
- Added `"continuous": true` to several `serve` targets, likely to
enable continuous build/watch mode for development servers.
[[1]](diffhunk://#diff-b9f5cc7169c5770b5a2f040c8662568055bb427d78d3de5863f18368983602b3L76-R78)
[[2]](diffhunk://#diff-7bb84e18c1e3ac80aed41afaa0693a7c4224324e222c2ed95f1cec1525903f35L87-R89)
[[3]](diffhunk://#diff-5ee971cb1c993c2ebd054104878f6077f83bdc3191e9297c79086deda2f909e0L101-R103)
[[4]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8L129-R132)
- Set `"tsConfig"` options for test targets to explicitly point to the
correct TypeScript configuration files, improving test setup
reliability.
[[1]](diffhunk://#diff-b9f5cc7169c5770b5a2f040c8662568055bb427d78d3de5863f18368983602b3L104-L108)
[[2]](diffhunk://#diff-7bb84e18c1e3ac80aed41afaa0693a7c4224324e222c2ed95f1cec1525903f35L103-L107)
[[3]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8L146-R150)
**3. TypeScript Compiler Configuration Improvements:**
- Added `"moduleResolution": "bundler"` to various `tsconfig.app.json`
and `tsconfig.spec.json` files, aligning module resolution with modern
build tools and improving compatibility.
[[1]](diffhunk://#diff-f471e0ae31ecc282b2a482daebb1c09198820853e891ab8f914631c22d498b71L7-R8)
[[2]](diffhunk://#diff-d90cd0ce74ab8203ec196742db3429152e143bec6bd4db856a092509e2e72d83L5-R6)
[[3]](diffhunk://#diff-28e86d8c2042724ba496375177c06ec7b815d0e70cdebdd469312e2f959d4d3cL7-R8)
[[4]](diffhunk://#diff-92c379b3c88f28b0ae55d4b1ad62ee3936e66e2bd02867ec58d1087989de4410L7-R8)
**4. Dependency and Import Cleanups:**
- Removed unused imports (e.g., `DynamicDialogRef` in
`dot-template-create-edit.component.ts`) and simplified type usage for
dialog references.
[[1]](diffhunk://#diff-65fc5701762b720a1b4fd8afbbf0b8a0ee54827d1b9fe386f5ffc314058ce099L14)
[[2]](diffhunk://#diff-65fc5701762b720a1b4fd8afbbf0b8a0ee54827d1b9fe386f5ffc314058ce099L184-R183)
**5. Minor Project Metadata Adjustments:**
- Updated or added `implicitDependencies` fields and cleaned up
redundant or misplaced `tags` arrays in project configuration files.
[[1]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8R7-R8)
[[2]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8L178-R182)
[[3]](diffhunk://#diff-5ee971cb1c993c2ebd054104878f6077f83bdc3191e9297c79086deda2f909e0L125-R127)
These changes collectively improve code maintainability, developer
experience, and build/test reliability across the workspace.
### Checklist
- [x] Tests
- [x] Translations
- [x] Security Implications Contemplated (add notes if applicable)
This PR fixes: #34087
---------
Co-authored-by: Freddy Montes <751424+fmontes@users.noreply.github.com>
### Proposed Changes * Add `rel="noreferrer noopener"` when we open a blank page via the frontend editor, for now it only affects the **copy URL** functionality of the "Page Edit Mode". This PR fixes: #33898
…rectly (#34086) ### Proposed Changes Update SDK examples (Next.js, Angular, Astro) adding styles and retrieve the contentlet information by using. ```ts props.node.attrs?.data ``` ### Changes made - [ ] Added styles to the custom render Activities, Products. - [ ] Create a custom render for Destinations - [ ] update `props.attrs?.data` data to `props.node.attrs?.data` where need it. This PR fixes: #34061
…es (#34095) ## Summary - Fixed pagination offset synchronization issues when navigating folders and applying filters - Resolved UI layout jumps caused by inconsistent table column widths and loading states - Improved search input state management to properly sync with global filters - Fixed PrimeNG Table pagination state management to prevent offset loss during sorting ## Changes ### Pagination & State Management - **DotContentDriveStore**: Enhanced `setPath()`, `removeFilter()`, and `setGlobalSearch()` methods to properly reset pagination offset to 0 when navigating or filtering - **Shell Component**: Added computed `$offset` signal and improved query params handling with merge strategy to maintain URL state correctly - **Folder List View**: Removed local `currentPageFirstRowIndex` state in favor of store-managed offset for single source of truth ### UI Layout Fixes - **Table Layout**: Applied `table-layout: fixed` to prevent column width recalculation causing UI jumps - **Column Widths**: Adjusted header column widths (32% for title, 18% for modified date) for better layout stability - **Loading Skeletons**: Fixed skeleton placeholder widths to match actual column dimensions and prevent layout shifts during loading states - **Title Column**: Implemented CSS grid layout (4.5rem thumbnail + flexible text + min-content actions) for consistent alignment ### Search & Filter Synchronization - **Search Input Component**: Added `cleanTextEffect` to sync form control value with store filter changes without triggering unnecessary events - **Query Params**: Implemented proper `queryParamsHandling: 'merge'` strategy to preserve URL state during navigation ### PrimeNG Table Workaround - **FirstChange Handler**: Added `onFirstChange()` method to manually sync table's `first` property with offset from store, addressing PrimeNG issue #11898 where table loses pagination reference during sorting operations ## Test Coverage - ✅ Added tests for `setGlobalSearch()` pagination reset behavior - ✅ Added tests for `removeFilter()` pagination reset behavior - ✅ Added tests for `setPath()` pagination reset behavior - ✅ Updated shell component tests for new query params merge strategy - ✅ Added tests for offset input and firstChange synchronization ## Test Plan - [ ] Navigate through multiple folders and verify pagination stays at page 1 - [ ] Apply filters and verify pagination resets to first page - [ ] Use global search and verify pagination and path reset correctly - [ ] Remove filters and verify pagination resets - [ ] Sort columns and verify pagination offset is maintained correctly - [ ] Verify no UI layout jumps during loading states or data updates - [ ] Test with various amounts of content (empty, partial page, multiple pages) 🤖 Generated with [Claude Code](https://claude.com/claude-code) This PR fixes: #33991
…33987) (#34084) ## Description Implements MINIMAL profile system with hybrid approach (@ProfileCapable annotation + configuration selection) and 10-15 core metrics for Usage Dashboard. ## Changes - Created ProfileType enum (MINIMAL, STANDARD, FULL) - Implemented @ProfileCapable annotation for metric filtering - Added ProfileFilter utility for profile-aware metric selection - Created MetricCacheConfig for runtime profile configuration - Annotated 100+ existing metrics with appropriate profiles - Updated MetricStatsCollector with profile filtering logic - Enhanced UsageResource REST API with profile support - Integrated profile system in Angular Usage Dashboard UI - Added telemetry implementation and verification documentation ## Testing - Profile filtering correctly limits MINIMAL to 10-15 core metrics - Configuration-driven profile selection via dotmarketing-config.properties - Backward compatible (unannotated metrics included in all profiles) - Type-safe enum prevents configuration errors - REST API returns profile-filtered metrics - Angular UI displays profile-aware dashboard Closes #33987 ## Changes - [ ] [List the main changes made] ## Testing - [ ] [Describe testing approach] Closes #33987 **Issue:** Implement MINIMAL Profile with Core Metrics for Us
…33980) (#34100) ## Description Implements configuration-driven caching and profile-based metric filtering for the telemetry system. ## Changes ### Caching System - ✅ **MetricCacheManager**: CDI service providing transparent caching with DynamicTTLCache (Caffeine) - ✅ **MetricCacheConfig**: Configuration reader supporting global and per-metric cache settings - ✅ **Configuration-Driven**: All caching controlled via properties (no annotations) - ✅ **Per-Metric TTL**: Different cache durations per metric via properties - ✅ **Future-Proof**: Works by metric name, supports future config-based metrics ### Profile System - ✅ **ProfileType**: MINIMAL/STANDARD/FULL profiles for performance control - ✅ **@MetricsProfile**: Annotation declaring which profiles a metric supports - ✅ **ProfileFilter**: Filters metrics by active profile (handles CDI proxies) - ✅ **Dual Configuration**: Separate profiles for dashboard (MINIMAL) and cron (FULL) - ✅ **Fast Dashboard**: MINIMAL profile targets <5s load time with 10-15 core metrics ### Integration - ✅ **MetricStatsCollector**: Updated to use cache manager and profile filtering - ✅ **UsageResource**: Uses MINIMAL profile for fast dashboard loading - ✅ **Documentation**: Comprehensive guide in `TELEMETRY_IMPLEMENTATION.md` ### Configuration ```properties # Profile selection telemetry.default.profile=MINIMAL # Dashboard/API telemetry.cron.profile=FULL # Background collection # Global cache control telemetry.cache.enabled=true telemetry.cache.default.ttl.seconds=300 telemetry.cache.max.size=1000 # Per-metric overrides telemetry.cache.metric.COUNT_OF_SITES.ttl.seconds=600 telemetry.cache.metric.REAL_TIME_METRIC.enabled=false ``` ## Testing - ✅ **26 tests** for MetricCacheConfig (profile and cache configuration) - ✅ **16 tests** for MetricCacheManager (cache behavior, concurrency, invalidation) - ✅ **8 tests** for ProfileFilter (profile matching, CDI proxy handling) - ✅ **49 total tests** - all passing ### Test Coverage - Cache hit/miss behavior - Per-metric enable/disable - TTL configuration and overrides - Profile filtering (MINIMAL/STANDARD/FULL) - Concurrent access scenarios - Cache invalidation (single + all) - CDI proxy unwrapping ## Performance - **Cache Hits**: < 100ms (vs 500-1500ms for slow queries) - **Dashboard Target**: < 5 seconds with MINIMAL profile - **Configuration-Driven**: Change behavior without code changes - **Environment-Specific**: Different settings per environment ## Design Decisions ### Configuration Over Annotations **Why configuration-driven caching?** - ✅ Works for future config-based metrics (by metric name) - ✅ Runtime-configurable (no code changes needed) - ✅ Environment-specific (dev/staging/prod) - ✅ Separation of concerns (metrics compute, cache manager caches) ### Caffeine Over DotCache **Why DynamicTTLCache?** - ✅ Simpler setup (no enum registration) - ✅ Per-key TTL (different expiration per metric) - ✅ High performance (optimized for in-memory) - ✅ Sufficient (metrics are database-sourced) ### Dual Profile System **Why separate default and cron profiles?** - Dashboard needs speed (MINIMAL): <5s with 10-15 core metrics - Background collection needs completeness (FULL): All 128+ metrics - Different trade-offs: UI responsiveness vs. data completeness ## Extensibility The design supports future requirements: - ✅ **Config-based metrics**: Works by metric name (already supported) - ✅ **Distributed caching**: Easy to swap DynamicTTLCache → Redis - ✅ **User-specific profiles**: Can add profile override methods - ✅ **Custom cache strategies**: Per-metric configuration enables any strategy ## Documentation - **TELEMETRY_IMPLEMENTATION.md**: Comprehensive implementation guide - Architecture overview - Profile system usage - Caching system configuration - Creating new metrics - Best practices - Troubleshooting Closes #33980 ## Changes - [ ] [List the main changes made] ## Testing - [ ] [Describe testing approach] Closes #33980 **Issue:** Design and implement flexible caching and metric s
…pplication builder (#34099) ### Proposed Changes This pull request updates the build configuration and proxy setup for the `dotcms-ui` Angular application, improving compatibility with the Angular CLI, enhancing development server behavior, and refining TypeScript settings. The most significant changes are grouped below. **Build and Angular CLI migration:** * Switched the build executor in `project.json` from `@nx/angular:browser-esbuild` to `@angular-devkit/build-angular:application` for better Angular CLI compatibility and future-proofing. Updated related build options, including the use of `browser` and `polyfills` arrays, and added `inlineStyleLanguage: "scss"`. * Adjusted build and development configurations: set `baseHref` to `/dotAdmin/` for development, added `externalDependencies`, and refined output and optimization options. * Moved `tags` and `implicitDependencies` to the end of `project.json` to align with Nx conventions. **Development server and proxy improvements:** * Enhanced the proxy configuration in `proxy-dev.conf.mjs` by adding a dedicated WebSocket proxy for `/api/ws` requests, explicitly disabling WebSocket proxying for the main API proxy to avoid EPIPE errors, and adding `/image` to the proxied contexts. [[1]](diffhunk://#diff-f162544d3441baeebb73cbea3b36673232b11068a7307feb36347b6f2c7ad842R4-R16) [[2]](diffhunk://#diff-f162544d3441baeebb73cbea3b36673232b11068a7307feb36347b6f2c7ad842L23-R42) * Enabled Hot Module Replacement (`hmr`), continuous watch, and disabled live reload in the `serve` target for a better development experience. **TypeScript and Nx configuration:** * Updated TypeScript config (`tsconfig.app.json` and `tsconfig.json`) to explicitly set `module` to `es2022`, enable `esModuleInterop`, use `incremental` builds, and resolve package exports for improved build performance and compatibility. [[1]](diffhunk://#diff-10e2a4ce011f740d1d211c3845ecc65a428036585d46ae744ea8fec2edd3e6e1L8-R12) [[2]](diffhunk://#diff-129f6f7bf741121f3d4f4b9e5ccb290ad5966d456816b9f651b6016d86ee3647L21-R22) * Increased Nx task runner parallelism from 1 to 3 for faster builds, and added a `serve` section in `nx.json` with an empty `dependsOn` array. [[1]](diffhunk://#diff-2ea855fcca3f4e2b7f59d5be97e226f9c2b47cbe08579e5e7ccf2320a4ebc807L7-R7) [[2]](diffhunk://#diff-2ea855fcca3f4e2b7f59d5be97e226f9c2b47cbe08579e5e7ccf2320a4ebc807R237-R239) ## 📊 Performance Comparison | Metric | 🐢 Before (Webpack) | ⚡️ After (Esbuild) | Improvement | | :--- | :--- | :--- | :--- | | **Initial Bundle** | 16.37 MB | 2.14 MB | **⬇ 87% Smaller** | | **Dead Code** | 13.73 MB (Vendor.js) | 0 MB | **Eliminated** | | **Cold Start** | ~25s | ~15s | **40% Faster** | | **Rebuild (HMR)** | ~5.6s | < 1s | **Instant** | | **Console Logs** | Thousands of warnings | Clean | **Fixed** | ### Screenshots Original | Updated :-------------------------:|:-------------------------: ** original screenshot ** | ** updated screenshot ** This PR fixes: #34098
### Proposed Changes * Avoid that the payload get change after called the tranforms method This PR fixes: #34104
Adding the rag embedding implementation
This PR fixes: #32639