fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(ask): Properly handle regex filters that include parenthesis - #786

Closed
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245
Closed

fix(ask): Properly handle regex filters that include parenthesis#786
msukkari wants to merge 2 commits into
mainfrom
michael/SOU-245

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Weird edge case where if a regex filter like filename/reponame contained a parenthesis the parser would fail. This is because the query language forbids parenthesis in the value since they're used to match against the ParenExpr symbol.

The ideal case is that the agent would be smart enough to wrap the regexp in quotes, which would solve this problem. I've added instructions in the tool call to tell it to do this, but it rarely does. As a result, I've added basic logic to process the regexp before adding it in the query string to wrap it in quotes if a parenthesis is included.

Fixes#771

Summary by CodeRabbit

  • Bug Fixes

    • Properly handle regex filters that include parentheses.
  • New Features

    • Added file path filtering capability to code search functionality.
  • Documentation

    • Updated guidance on using file filters with parentheses in regex expressions.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

PR addresses issue #771 by implementing proper handling of regex filters containing parentheses. Introduces new preprocessRegexp utility function that wraps values with parentheses in quotes, adds filterByFile parameter to the search_code tool, and applies consistent preprocessing across MCP and web client implementations to prevent query parsing failures.

Changes

Cohort / File(s)Summary
Regex preprocessing utility
packages/shared/src/query.ts
New exported function preprocessRegexp(value: string) that detects parentheses in unquoted values and wraps them in double quotes to safely handle special characters in regex patterns.
Shared package exports
packages/shared/src/index.client.ts, packages/shared/src/index.server.ts
Added re-exports of preprocessRegexp from ./query.js to make the utility available across package boundaries.
MCP search_code tool enhancement
packages/mcp/src/index.ts
Extended search_code tool with new filterByFile parameter (array of strings). Imported preprocessRegexp and implemented filtering logic to transform file paths with preprocessing before appending to query as ( file:… ) clauses. Updated descriptions to document new functionality.
Web client tool documentation & preprocessing
packages/web/src/features/chat/tools.ts, packages/web/src/features/chat/utils.ts
Updated tool descriptions to document parenthesis handling requirements. Added preprocessing step in buildSearchQuery to transform file and repo filter regexes using preprocessRegexp before query composition.
Changelog
CHANGELOG.md
Added entry under Unreleased/Fixed: "Properly handle regex filters that include parenthesis." Appended reference tag to existing hotkey mapping item.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main change: adding proper handling of regex filters containing parentheses, which directly addresses the fix for issue #771.
Linked Issues check✅ PassedThe PR implements the required fix for issue #771 by adding preprocessRegexp logic to wrap regex filter values containing parentheses in quotes, preventing parser failures.
Out of Scope Changes check✅ PassedAll changes are directly related to fixing regex filter handling with parentheses. No out-of-scope modifications detected; changes focus on the preprocessRegexp function, its exports, and its integration into search query building.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/web/src/features/chat/tools.ts (1)

142-173: Fix minor typos in the tool description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.`)+ .describe(`Filter results from filepaths that match the regex. When this option is not specified, all files are searched. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.`)
packages/mcp/src/index.ts (1)

24-49: Fix minor typos in schema/description text.

“expresion” → “expression”, “paranthesis” → “parenthesis”.

✏️ Proposed fix
- .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expresion includes a paranthesis **YOU MUST** wrap this value in quotes when passing it in.")+ .describe("Scope the search to results inside filepaths that match the provided regex expression. By default all files are searched, so **only use this filter if you need to filter on specific files**. **YOU MUST** ensure that this is a valid regex expression and any special characters are properly escaped. If the regex expression includes a parenthesis **YOU MUST** wrap this value in quotes when passing it in.")
🤖 Fix all issues with AI agents
In `@CHANGELOG.md`:
- Line 12: Update the changelog entry text to use the plural form "parentheses"
instead of "parenthesis" for clarity; locate the line containing "Properly
handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

Comment threadCHANGELOG.md
### Fixed
- Properly map all hotkeys in UI based on the platform [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly map all hotkeys in UI based on the platform. [#784](https://github.com/sourcebot-dev/sourcebot/pull/784)
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “parentheses” (plural) for clarity.

Minor wording nit in the changelog entry.

✏️ Suggested tweak
-- Properly handle regex filters that include parenthesis. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)+- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Properly handle regex filters that include parenthesis. [#786](https://github.com/sourcebot-dev/sourcebot/pull/786)
- Properly handle regex filters that include parentheses. [`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)
🤖 Prompt for AI Agents
In `@CHANGELOG.md` at line 12, Update the changelog entry text to use the plural
form "parentheses" instead of "parenthesis" for clarity; locate the line
containing "Properly handle regex filters that include parenthesis.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)" and change it to
"Properly handle regex filters that include parentheses.
[`#786`](https://github.com/sourcebot-dev/sourcebot/pull/786)".

// Entry point for the MCP server
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { preprocessRegexp } from '@sourcebot/shared';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: mcp cannot take a dependency on @sourcebot/shared since we do not publish it to npm

@brendan-kellam

Copy link
Copy Markdown
Contributor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

@msukkari

msukkari commented Jan 23, 2026

Copy link
Copy Markdown
ContributorAuthor

I wonder if we could improve our parsing to not throw a exception in the case of a unmatched paren?

Closing in favor of #788

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam