feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git
, '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

feat(ask): start chat from selected code range - #1553

Open
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code
Open

feat(ask): start chat from selected code range#1553
nikhil008-git wants to merge 4 commits into
sourcebot-dev:mainfrom
nikhil008-git:feat/ask-selected-code

Conversation

@nikhil008-git

@nikhil008-gitnikhil008-git commented Aug 7, 2026

Copy link
Copy Markdown

Summary

Adds an “Ask Sourcebot” action to the existing code-selection popover in Browse and search previews.

When code is selected, Ask Sourcebot:

  • Creates a new chat.
  • Seeds the prompt with Explain this selected code.
  • Attaches the repository, revision, file path, and selected line range.
  • Resolves the file server-side at the selected revision.
  • Sends only the selected lines to the model with original line numbers.
  • Keeps Share selection behavior unchanged.

This implements issue #1534 Option A only. Side panels and inline conversations are out of scope.

Screenshots

Screenshot 2026-08-07 at 2 19 34 PM

Testing

  • Focused web tests pass: 11 files, 251 tests.
  • Web lint passes.
  • Manual Ask testing is blocked locally because this deployment has no Ask Sourcebot entitlement; the button correctly
    reports that limitation.

Use the first screenshot for Screenshots. Put the entitlement-error screenshot under Testing or omit it if you want
the PR to look cleaner.


Note

Medium Risk
Changes the Ask agent prompt pipeline and new-chat bootstrap path; behavior is covered by unit tests but incorrect range handling could omit or mislabel code context for the model.

Overview
Adds Ask SourceBot to the code-selection popover in Browse (alongside Share selection). A selection starts a new chat seeded with Explain this selected code. and a file source carrying repo, revision, path, and line range.

Chat creation:useCreateNewChatThread exposes createChatFromSource, merges explicit sources into the initial UI message via createUIMessage, and uses an in-flight guard so double-clicks don’t create duplicate chats. Disabled MCP server IDs from local storage are preserved for this path.

Model context:FileSource optionally includes a validated range. The agent resolves the file at the chosen revision, slices content with sliceFileSourceForPrompt (invalid ranges are dropped), and injects only those lines into the dynamic prompt with original line numbers (selected_lines metadata + addLineNumbers offset).

Reviewed by Cursor Bugbot for commit 2b7bc80. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added an “Ask SourceBot” option to the file editor context menu.
    • Start chats from a selected file or specific line range for focused code explanations.
    • Preserve selected ranges and original line numbering in chat prompts.
    • Retain selected source attachments when creating chat messages.
  • Bug Fixes

    • Safely handle invalid or reversed line ranges.
    • Prevent duplicate chat creation while a new chat is being opened.
  • Tests

    • Added coverage for ranged sources, offsets, full-file prompts, invalid selections, and source-based chat creation.

@coderabbitai

coderabbitaiBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The editor context menu now sends selected file ranges to a new SourceBot chat. File-source validation, prompt slicing, line offsets, range metadata, explicit source propagation, and chat creation support the flow.

Changes

Selected SourceBot Chat

Layer / File(s)Summary
Source range contract and prompt handling
packages/web/src/features/tools/types.ts, packages/web/src/ee/features/chat/agent.ts, packages/web/src/ee/features/chat/agent.test.ts
FileSource supports validated line ranges. Prompt generation slices selected lines, preserves offsets, includes range metadata, and excludes invalid ranges.
Explicit source chat creation
packages/web/src/features/chat/utils.ts, packages/web/src/features/chat/utils.test.ts, packages/web/src/features/chat/useCreateNewChatThread.ts, packages/web/src/features/chat/useCreateNewChatThread.test.tsx
createUIMessage accepts explicit sources. The chat thread hook creates and persists a chat containing the selected source while preventing concurrent creation.
Editor SourceBot action
packages/web/src/app/(app)/components/editorContextMenu.tsx
The context menu converts the editor selection into file and range metadata and adds an “Ask SourceBot” action.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
participant EditorContextMenu
participant useCreateNewChatThread
participant createUIMessage
participant setChatState
EditorContextMenu->>useCreateNewChatThread: createChatFromSource(selected file range)
useCreateNewChatThread->>createUIMessage: build message with explicit source
createUIMessage-->>useCreateNewChatThread: data-source message part
useCreateNewChatThread->>setChatState: persist chat state
Loading

Possibly related issues

  • sourcebot-dev/sourcebot#1534: The PR adds the requested Ask SourceBot action for selected code ranges and attaches the selection to a new chat.

Possibly related PRs

Suggested reviewers:brendan-kellam

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes starting a chat from a selected code range, which is the main change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@nikhil008-git

Copy link
Copy Markdown
Author

closes #1534

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/ee/features/chat/agent.ts`:
- Around line 1033-1034: Update the files parameter type in createPrompt to
include the range and lineOffset properties accessed by the prompt template,
using types consistent with their existing usage in the files.map rendering and
addLineNumbers call.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ed24b0e1-853e-4d18-ac94-7a2ce45a6963

📥 Commits

Reviewing files that changed from the base of the PR and between 472692a and 865aac8.

📒 Files selected for processing (7)
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/ee/features/chat/agent.test.ts
  • packages/web/src/ee/features/chat/agent.ts
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.test.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/tools/types.ts

Comment threadpackages/web/src/ee/features/chat/agent.ts
Comment threadpackages/web/src/features/chat/useCreateNewChatThread.ts
Comment threadpackages/web/src/app/(app)/components/editorContextMenu.tsx

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/features/chat/useCreateNewChatThread.ts`:
- Around line 34-39: Update createNewChatThread and its createChat handling so
every terminal path clears createInFlightRef.current and isLoading, including
unexpected rejections, service-error returns, and successful navigation after
router.push. Ensure later calls are not blocked when createChat fails or the
hook remains mounted after success, and add regression tests covering failure
and post-success cleanup.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d3cc5ee-0c6b-4479-9aa6-fca2f42048d5

📥 Commits

Reviewing files that changed from the base of the PR and between 35956de and 2b7bc80.

📒 Files selected for processing (2)
  • packages/web/src/features/chat/useCreateNewChatThread.test.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts

Comment on lines 34 to +39
const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => {
if (createInFlightRef.current) {
return;
}
createInFlightRef.current = true;

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bashset -euo pipefail
# Verify the createChat rejection contract.
rg -n -C 8 '\bcreateChat\b' packages/web/src
# Verify whether the hook remains mounted after navigation.
rg -n -C 8 '\buseCreateNewChatThread\s*\(' packages/web/src

Repository: sourcebot-dev/sourcebot

Length of output: 24052


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'--- useCreateNewChatThread outline ---\n'
ast-grep outline packages/web/src/features/chat/useCreateNewChatThread.ts --view expanded ||trueprintf'\n--- useCreateNewChatThread full file ---\n'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'\n--- createChat implementation ---\n'
cat -n packages/web/src/features/chat/actions.ts
printf'\n--- imports/usages with context ---\n'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 252


🏁 Script executed:

#!/bin/bashset -euo pipefail
printf'%s\n''--- useCreateNewChatThread implementation ---'
cat -n packages/web/src/features/chat/useCreateNewChatThread.ts
printf'%s\n''--- createChat implementation ---'
cat -n packages/web/src/features/chat/actions.ts
printf'%s\n''--- hook callers with context ---'
rg -n -C 15 'useCreateNewChatThread|createNewChatThread|createChatFromSource|isLoading' packages/web/src/app packages/web/src/features/chat

Repository: sourcebot-dev/sourcebot

Length of output: 50380


Clear the in-flight state on every terminal path.

If createChat rejects outside the isServiceError return path, both callbacks leave createInFlightRef.current === true and isLoading === true. Later calls then return immediately. Successful calls also may leave these values set after router.push.

Handle rejected calls and reset both values before returning. Reset them after successful navigation if the hook may remain mounted. Add failure and post-success regression tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/web/src/features/chat/useCreateNewChatThread.ts` around lines 34 -
39, Update createNewChatThread and its createChat handling so every terminal
path clears createInFlightRef.current and isLoading, including unexpected
rejections, service-error returns, and successful navigation after router.push.
Ensure later calls are not blocked when createChat fails or the hook remains
mounted after success, and add regression tests covering failure and
post-success cleanup.

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

});

router.push(`/chat/${response.id}`);
}, [router, setChatState, toast]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

In-flight lock never released

Medium Severity

createInFlightRef is set to true at the start of createNewChatThread and createChatFromSource, but it is only cleared on a ServiceError. Any thrown error before that check, or a success path that does not unmount the hook instance, leaves the guard stuck so later Ask or new-chat attempts no-op with no recovery.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 2b7bc80. Configure here.

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.

1 participant

@nikhil008-git