* feat: Add safeWriteJson utility for atomic file operations
Implements a robust JSON file writing utility that:
- Prevents concurrent writes to the same file using in-memory locks
- Ensures atomic operations with temporary file and backup strategies
- Handles error cases with proper rollback mechanisms
- Cleans up temporary files even when operations fail
- Provides comprehensive test coverage for success and failure scenarios
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* fix: use safeWriteJson for all JSON file writes
This change refactors all direct JSON file writes to use the safeWriteJson
utility, which implements atomic file writes to prevent data corruption
during write operations.
- Modified safeWriteJson to accept optional replacer and space arguments
- Updated tests to verify correct behavior with the new implementation
Fixes: #722
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* feat: Implement inter-process file locking for safeWriteJson
Replaces the previous in-memory lock in `safeWriteJson` with
`proper-lockfile` to provide robust, cross-process advisory file
locking. This enhances safety when multiple processes might attempt
concurrent writes to the same JSON file.
Key changes:
- Added `proper-lockfile` and `@types/proper-lockfile` dependencies.
- `safeWriteJson` now uses `proper-lockfile.lock()` with configured
retries, staleness checks (31s), and lock update intervals (10s).
- An `onCompromised` handler is included to manage scenarios where
the lock state is unexpectedly altered.
- Logging and comments within `safeWriteJson` have been refined for
clarity, ensuring error logs include backtraces.
- The test suite `safeWriteJson.test.ts` has been significantly
updated to:
- Use real timers (`jest.useRealTimers()`).
- Employ a more comprehensive mock for `fs/promises`.
- Correctly manage file pre-existence for various scenarios.
- Simulate lock contention by mocking `proper-lockfile.lock()`
using `jest.doMock` and a dynamic require for the SUT.
- Verify lock release by checking for the absence of the `.lock`
file.
All tests are passing with these changes.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* feat: implement streaming JSON write in safeWriteJson
Refactor safeWriteJson to use stream-json for memory-efficient JSON serialization:
- Replace in-memory string creation with streaming pipeline
- Add Disassembler and Stringer from stream-json library
- Extract streaming logic to a dedicated helper function
- Add proper-lockfile and stream-json dependencies
This implementation reduces memory usage when writing large JSON objects.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* fix: improve safeWriteJson locking mechanism
- Use file path itself for locking instead of separate lock file
- Improve error handling and clarity of code
- Enhance cleanup of temporary files
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* test: fix safeWriteJson test failures
- Ensure test file exists before locking
- Add proper mocking for fs.createWriteStream
- Fix test assertions to match expected behavior
- Improve test comments to follow project guidelines
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* test: update tests to work with safeWriteJson
Updated tests to work with safeWriteJson instead of direct fs.writeFile calls:
- Updated importExport.test.ts to expect safeWriteJson calls instead of fs.writeFile
- Fixed McpHub.test.ts by properly mocking fs/promises module:
- Moved jest.mock() to the top of the file before any imports
- Added mock implementations for all fs functions used by safeWriteJson
- Updated the test setup to work with the mocked fs module
All tests now pass successfully.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* refactor: replace JSON.stringify with safeWriteJson for file operations
Replace all non-test instances of JSON.stringify used for writing to JSON files with safeWriteJson to ensure safer file operations with proper locking, error handling, and atomic writes.
- Updated src/services/mcp/McpHub.ts
- Updated src/services/code-index/cache-manager.ts
- Updated src/api/providers/fetchers/modelEndpointCache.ts
- Updated src/api/providers/fetchers/modelCache.ts
- Updated tests to match the new implementation
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* docs: add rules for using safeWriteJson
Add concise rules for using safeWriteJson instead of JSON.stringify with file operations to ensure atomic writes and prevent data corruption.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
---------
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* feat(prompts): enforce codebase_search as primary code understanding tool
- Add conditional codebase_search enforcement in tool use guidelines
- Modify objective section to prioritize codebase_search when available
- Update rules section with critical codebase_search-first rule
- Pass CodeIndexManager to prompt sections for availability checks
- Ensure graceful degradation when codebase_search is unavailable
* chore(docs): remove codebase search enforcement documentation
* fix: update snapshot and reorder capabilities section
- Update system.test.ts snapshot to reflect architect mode without codebase_search enforcement
- Reorder capabilities section to place search_files description after codebase_search
- Ensures logical flow: codebase_search (semantic) → search_files (regex) → other tools
* refactor: improve tool-use-guidelines numbering logic
- Replace subsequentNumbers object with array-based approach
- Use automatic incrementing with itemNumber++ for sequential numbering
- Build guidelines as an array and join at the end
- Fix potential numbering issues with conditional logic
- Update tests and snapshots to match new format
As suggested by daniel-lxs in PR #4340
- Allow specific binary formats (.pdf, .docx, .ipynb) to be processed by extractTextFromFile
- Block unsupported binary files with existing "Binary file" notice
- Update tests to cover both supported and unsupported binary file scenarios
- Refactor test mocks for better maintainability and coverage
* add support for mcp server instructions
* Update McpView.tsx
* feat(mcp): add instructions field to MCP localization files and update UI to display instructions
---------
Co-authored-by: huixin <yuanhx@cffex.com.cn>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
Adds a new test case that allows testing the multi-search-replace diff strategy directly from the command line by passing source and diff files as arguments.
This enables easier debugging and manual testing of the diff application functionality without needing to modify test code for each test case.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Eric Wheeler <roo-code@z.ewheeler.org>
* Implement support for streamable-http transport type mcp servers
* add streamable-http mock in same fashion as sse - which does not seem to currently be actually leveraged
* rename mock to resolve kebabcase vs camelCase
* fix (seemingly unrelatd) test failure in writeToFileTool.test.ts
* fix tests
* refactor: Add pushToolWriteResult method to DiffViewProvider
Previously, each tool file contained duplicate code for formatting file write
responses and conditionally sending user_feedback_diff messages. This led to
inconsistent implementations and made changes difficult to maintain.
This refactoring centralizes the response formatting and messaging logic in the
DiffViewProvider class, which now:
- Stores results from saveChanges() in class properties
- Only sends user_feedback_diff when user edits exist
- Configures XMLBuilder with no indentation for cleaner output
Tool files now make a single method call instead of duplicating logic.
Fixes: #3647
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
* fix: conditionally show user edits message in file write response
Make the 'If the user's edits have addressed part of the task...' message
conditional based on whether there are actual user edits. This prevents
showing irrelevant guidance when no user edits were made to the file.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
---------
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Eric Wheeler <roo-code@z.ewheeler.org>
Adds validation to ensure that `:start_line:` and `:end_line:`
markers do not appear in the REPLACE section of an apply_diff
operation. These markers are only valid within the SEARCH section.
This change prevents potential errors and confusion when users
might inadvertently include these markers in the replacement content.
New tests have been added to verify this validation.
Fixes: #4013
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Eric Wheeler <roo-code@z.ewheeler.org>
* feat: Add custom VPC endpoint support for AWS Bedrock
* fix: Fix TypeScript error in Bedrock.tsx
* fix: Update VPC endpoint UI to match Cline's implementation
* Fix AWS Bedrock VPC endpoint UI implementation
- Changed checkbox label to 'Use custom VPC endpoint' to match Cline
- Fixed conditional rendering to show text field when checkbox is checked
- Ensured placeholder text appears correctly
- Maintained proper styling for consistency
* Fix AWS Bedrock VPC endpoint UI implementation to match Cline exactly
- Added state variable to track checkbox selection
- Fixed conditional rendering to show/hide text field based on checkbox state
- Maintained proper styling and placeholder text
* Fix AWS Bedrock VPC endpoint UI implementation with proper event handling
- Fixed checkbox onChange handler to accept boolean directly instead of event object
- Added unit tests to verify the behavior
- Maintained proper styling and placeholder text
* Update Bedrock VPC endpoint tests with proper test IDs
* Improve AWS Bedrock VPC endpoint text field alignment
- Removed left margin from text field to align with checkbox
- Maintained proper styling and placeholder text
* Preserve AWS Bedrock VPC endpoint URL when toggling checkbox
- Added awsBedrockEndpointEnabled field to schema
- Modified Bedrock provider to check both endpoint URL and enabled flag
- Updated UI to preserve endpoint URL when checkbox is toggled
- Maintained proper alignment with checkbox
* Implement AWS Bedrock Custom VPC Endpoint functionality
* fix: update ApiConfiguration to ProviderSettings in Bedrock tests and regenerate types
* fix: update all instances of ApiConfiguration to ProviderSettings in Bedrock tests
* Fixed broken unit test
* Add changeset for Bedrock VPC endpoint support
* informative placeholder
* Bug fixes
* Fixed failing tests
* Add example URLs to Bedrock VPC endpoint section and update tests
* Fix truncated test assertion in Bedrock.test.tsx that was breaking the UI
* Refactor mock components in Bedrock.test.tsx for improved data-testid handling
* feat(i18n): add VPC endpoint translations for AWS Bedrock settings
* test: update Bedrock component tests for internationalized strings
---------
Co-authored-by: Kevin White <kcwhite@ancestry.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat(read_file): enhance file reading capabilities with multi-file support and improved parameter handling
fix(read_file): change return to continue on approval rejection in readFileTool
Enhance readFileTool with improved error handling and validation
- Introduced a FileEntry interface for better type management.
- Added validation for start_line and end_line to ensure proper ranges.
- Implemented RooIgnore validation before processing files.
- Enhanced error handling with dedicated functions for file and global errors.
- Streamlined file reading logic to handle binary files, definitions-only mode, and line thresholds more effectively.
- Improved user feedback for empty files and read limits.
chore: update Jest snapshot for system prompt tool usage
Refactor read-file tool to support XML input format and multiple line ranges
- Updated the `getReadFileDescription` function to reflect new XML structure for file reading requests.
- Modified `readFileTool` to parse XML input, allowing multiple line ranges for each file.
- Removed old parsing logic that handled line ranges as separate parameters.
- Implemented validation for line ranges and ensured proper error handling for file access.
- Adjusted approval messaging to accommodate new line range format.
- Enhanced error handling to provide consistent feedback for file read errors.
update from KJ7LNW comment
feat: add maxConcurrentFileReads setting to enhance read_file tool performance
feat: enhance readFileTool with XML parsing and file processing state tracking
feat: enhance readFileTool to include user feedback handling and processing state tracking
chore: clean up read_file tool documentation by removing extra newlines
feat: update read_file tool tests to handle user feedback and approval states
feat: add tests for feedback message formatting and XML special character handling in read_file tool
Implement code changes to enhance functionality and improve performance
feat: increase max concurrent file reads and adjust slider range in settings
feat: increase default max concurrent file reads from 5 to 15 across settings and context management
fix(read_file): enhance legacy path handling and remove duplicate parameters
feat(read_file): enhance file description handling and add support for multiple files in messages
done poc for new ux
idea 1
* fix the test
* fix: normalize locale file formatting to use tabs
- Applied prettier formatting to all locale JSON files
- Fixed mixed indentation (spaces/tabs) to use consistent tabs
- Aligns with project's prettier configuration
* fix(settings): improve checkbox handling and slider configuration in ConcurrentFileReadsExperiment
* fix(read_file): enhance description to include partial reads support
* fix(read_file): update description for partial reads and improve example clarity
* fix: suggestions
* fix: translations
* test: update system prompt snapshots for multi-file read tool
* fix: remove batch permission question from readFile tool translations
---------
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* Update codebase search description to emphasize English query requirement
* refactor: improve the wording
---------
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* Fix#3650: Allow empty content in write_to_file tool
Change validation from !newContent to newContent === undefined
to allow empty strings while still rejecting undefined values.
* Add unit tests for writeToFileTool
- Remove AuthService callbacks, add user-info event
- Store userInfo on AuthService and fetch it when sessions go active
- Simplify CloudService callbacks to just stateChanged
- Add cloudUserInfo to state and remove authenticatedUser message
* Fix menu breaking when Roo is moved between primary and secondary sidebars
Hello Roo Team! We changed this on the Kilo side and thought it might be useful to you!
The menu buttons (Settings etc.) stop working when Roo is moved between the primary and secondary sidebars.
This is because ClineProvider is prematurely disposed in that case
This change prevents the ClineProvider from being disposed when hosted in a sidebar.
It should still be disposed when hosted in a tab, because they have their own ClineProvider instance.
Found while investigating https://github.com/Kilo-Org/kilocode/issues/502.
* refactor: improve logging
* fix: extra bracket
---------
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* [Condense] Skip condense and show error if the context grows
* update tests
* changeset
* nit: error should be nonempty
* update translations
* add more errors
* add more test cases
* update translations
* pipe error back from truncate code
* add condense_context_error ClineMessage
* fixes
* translations
* Refactor weather server example implementation inside of prompt to use new MCP SDK features
* update NPM install instructions as well
* docs: minor improvements
* refactor: improve readability on mcpHub check
* fix: add missing bracket
* refactor: add interfaces
---------
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* feat: Make checkpoint on new task
Ensures that invoking the `newTaskTool` always creates a checkpoint, even if no files have changed. This provides a consistent state snapshot before a sub-task is initiated.
* refactor: remove delay
---------
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
The ClineProvider was looking for the .vite-port file in the wrong location.
Updated the path resolution to correctly point to the project root where
the Vite development server creates the file.
Fixes: #4006
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Eric Wheeler <roo-code@z.ewheeler.org>
* feat: Enhance configuration change handling and model dimension checks
* fix: Update embedder creation to use modelId from config
* test: Add unit tests for ServiceFactory embedder and vector store creation
* test: Add comprehensive restart detection tests for configuration changes
* feat: Implement model ID selection logic for provider changes in CodeIndexSettings
* fix: Initialize configuration on constructor to prevent false restart triggers
* fix: Enhance API key handling and restart logic in CodeIndexConfigManager
* fix: Improve handling of external settings changes and automatic indexing in webviewMessageHandler
* fix: Ensure handleExternalSettingsChange only restarts service when manager is initialized
* refactor: remove console logs
* fix: Load configuration during initialization to ensure correct state and restart requirements
* Improve tool descriptions to guide proper file editing tool selection
### Problem
LLMs were frequently choosing `write_to_file` for file edits instead of more appropriate tools like `apply_diff`, `insert_content`, or `search_and_replace`. This was likely because the tool descriptions made it seem like files needed to be reconstructed rather than edited.
### Changes Made
**write_to_file tool description:**
- Clarified primary use cases: **creating new files** or **complete rewrites when intentionally required**
- Changed opening from "write full content" to "write content" to reduce emphasis on full reconstruction
- Updated parameter description to be more specific about when complete content is needed
**apply_diff tool description:**
- Enhanced description to emphasize "targeted modifications" and "precise, surgical edits"
- Clarified that multiple search/replace operations can be performed in a single call
- Removed misleading "only a single operation allowed" restriction
- Better positioned as the preferred tool for making several targeted changes efficiently
### Impact
These changes should guide LLMs toward:
- Using `write_to_file` primarily for new files or intentional complete rewrites
- Using `apply_diff` for targeted edits and modifications to existing files
- Better understanding of when each tool is most appropriate
The updated descriptions maintain necessary technical details while providing clearer guidance on tool selection without being overly prescriptive.
* Update src/core/prompts/tools/write-to-file.ts
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Update src/core/prompts/tools/write-to-file.ts
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* Update src/core/prompts/tools/write-to-file.ts
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
---------
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>