- Changed import paths for app card and chart types to use the new app-chart-types module.
- Refactored state initialization in ChartView for improved readability.
- Added unit tests for CardView, ChartView, and LongTimeRangePicker components to ensure functionality and reliability.
- Introduced new test cases for time range picker and tracing components to enhance test coverage.
- Added component for displaying detailed log information.
- Introduced hook to manage conversation state and interactions.
- Created unit tests for the new components and hooks to ensure functionality and reliability.
- Updated utility functions for better handling of conversation logs and chat items.
- refactor config-modal, create-from-dsl-modal, and sub-graph for lower complexity
- add missing tests for config-modal-body, sandbox-provider-page, and install-bundle flows
- raise targeted worktree source coverage to 90%+ for lines and statements
The previous nested folder upload flow bypassed the backend batch-upload
contract when parentId was set. Instead of creating the whole metadata
tree in one backend operation, the frontend recursively called
createFolder/getFileUploadUrl for each node.
That introduced two regressions for uploads into subfolders:
- consistency regression: mid-sequence failures could leave partially
created folder trees under the destination folder
- performance regression: metadata creation degraded from a single
batch request to O(files + folders) round-trips before file bytes
were uploaded
This change moves nested uploads back to the original batch semantics:
- add optional parent_id support to app asset batch-upload payload
- create the whole nested tree under the target parent in
AppAssetService.batch_create_from_tree
- pass parentId through useBatchUpload instead of using per-node
createFolder/getFileUploadUrl calls
- remove the now-unnecessary useBatchUploadOperation wrapper
- add a backend unit test covering batch tree creation under an
existing parent folder
After this change, both root uploads and subfolder uploads use the same
single-request metadata creation path, preserving atomic tree creation
semantics and avoiding avoidable metadata round-trips.