feat(server): add hints for context files (#13444)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Attachments (files) are now included in the conversation context,
allowing users to reference files during chat sessions.
* Added a new "blobRead" tool enabling secure, permission-checked
reading of attachment content in chat sessions.

* **Improvements**
* Enhanced chat session preparation to always include relevant context
files.
* System messages now clearly display attached files and selected
content only when available, improving context clarity for users.
* Updated tool-calling guidelines to ensure user workspace is searched
even when attachment content suffices.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2025-08-08 17:32:52 +08:00
committed by GitHub
parent 4005f40b16
commit 3cfb0a43af
9 changed files with 172 additions and 14 deletions

View File

@@ -16,10 +16,12 @@ import { IndexerService } from '../../indexer';
import { CopilotContextService } from '../context';
import { PromptService } from '../prompt';
import {
buildBlobContentGetter,
buildContentGetter,
buildDocContentGetter,
buildDocKeywordSearchGetter,
buildDocSearchGetter,
createBlobReadTool,
createCodeArtifactTool,
createConversationSummaryTool,
createDocComposeTool,
@@ -156,6 +158,9 @@ export abstract class CopilotProvider<C = any> {
if (options?.tools?.length) {
this.logger.debug(`getTools: ${JSON.stringify(options.tools)}`);
const ac = this.moduleRef.get(AccessController, { strict: false });
const context = this.moduleRef.get(CopilotContextService, {
strict: false,
});
const docReader = this.moduleRef.get(DocReader, { strict: false });
const models = this.moduleRef.get(Models, { strict: false });
const prompt = this.moduleRef.get(PromptService, {
@@ -172,6 +177,16 @@ export abstract class CopilotProvider<C = any> {
continue;
}
switch (tool) {
case 'blobRead': {
const docContext = options.session
? await context.getBySessionId(options.session)
: null;
const getBlobContent = buildBlobContentGetter(ac, docContext);
tools.blob_read = createBlobReadTool(
getBlobContent.bind(null, options)
);
break;
}
case 'codeArtifact': {
tools.code_artifact = createCodeArtifactTool(prompt, this.factory);
break;
@@ -194,9 +209,6 @@ export abstract class CopilotProvider<C = any> {
break;
}
case 'docSemanticSearch': {
const context = this.moduleRef.get(CopilotContextService, {
strict: false,
});
const docContext = options.session
? await context.getBySessionId(options.session)
: null;