Skip to content

Commit

Permalink
Address review feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
planger committed Feb 17, 2025
1 parent aea0e4d commit a8c2966
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ export class ChatViewLanguageContribution implements FrontendApplicationContribu
suggestions.push(...items.map(item => ({
...item,
// adjust insert text to include the variable name
insertText: `${variable.name}${PromptText.VARIABLE_ARG_SEPARATOR}${item.insertText}`,
insertText: `${variable.name}${PromptText.VARIABLE_SEPARATOR_CHAR}${item.insertText}`,
// trigger command to check if we should add a context variable
command: {
title: 'Add context variable',
Expand Down Expand Up @@ -208,7 +208,7 @@ export class ChatViewLanguageContribution implements FrontendApplicationContribu
}
inputEditor.executeEdits('variable-argument-picker', [{
range: new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column),
text: PromptText.VARIABLE_ARG_SEPARATOR + arg
text: PromptText.VARIABLE_SEPARATOR_CHAR + arg
}]);
await this.addContextVariable(variableName, arg);
}
Expand Down
3 changes: 2 additions & 1 deletion packages/ai-chat-ui/src/browser/chat-view-widget.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,11 @@ export class ChatViewWidget extends BaseWidget implements ExtractableWidget, Sta
return this.onStateChangedEmitter.event;
}

protected async onQuery(query: string, context?: AIVariableResolutionRequest[]): Promise<void> {
protected async onQuery(query: string, contextVariableRequests?: AIVariableResolutionRequest[]): Promise<void> {
if (query.length === 0) { return; }

const chatRequest: ChatRequest = { text: query };
const context = { variableRequests: contextVariableRequests ?? [] };
const requestProgress = await this.chatService.sendRequest(this.chatSession.id, chatRequest, context);
requestProgress?.responseCompleted.then(responseModel => {
if (responseModel.isError) {
Expand Down
2 changes: 1 addition & 1 deletion packages/ai-chat-ui/src/browser/context-variable-picker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,6 @@ export class ContextVariablePicker {
}
args.push(input ?? '');
}
return { variable, arg: args.join(PromptText.VARIABLE_ARG_SEPARATOR) };
return { variable, arg: args.join(PromptText.VARIABLE_SEPARATOR_CHAR) };
}
}
34 changes: 26 additions & 8 deletions packages/ai-chat-ui/src/browser/style/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
flex: 1;
}

.chat-input-widget>.ps__rail-x,
.chat-input-widget>.ps__rail-y {
.chat-input-widget > .ps__rail-x,
.chat-input-widget > .ps__rail-y {
display: none !important;
}

Expand All @@ -23,7 +23,7 @@
overflow-wrap: break-word;
}

div:last-child>.theia-ChatNode {
div:last-child > .theia-ChatNode {
border: none;
}

Expand Down Expand Up @@ -59,7 +59,6 @@ div:last-child>.theia-ChatNode {
}

@keyframes dots {

0%,
20% {
content: "";
Expand Down Expand Up @@ -122,7 +121,7 @@ div:last-child>.theia-ChatNode {
padding-inline-start: 1rem;
}

.theia-ChatNode li>p {
.theia-ChatNode li > p {
margin-top: 0;
margin-bottom: 0;
}
Expand All @@ -136,7 +135,7 @@ div:last-child>.theia-ChatNode {
font-size: var(--theia-code-font-size);
}

.theia-RequestNode>p div {
.theia-RequestNode > p div {
display: inline;
}

Expand Down Expand Up @@ -181,27 +180,44 @@ div:last-child>.theia-ChatNode {
padding: 2px 4px 2px 6px;
height: 18px;
line-height: 16px;
min-width: 0;
}

.theia-ChatInput-ChatContext-title {
flex: 10 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.theia-ChatInput-ChatContext-additionalInfo {
color: var(--theia-disabledForeground);
font-size: calc(var(--theia-content-font-size) * 0.8);
margin-left: 4px;
line-height: 18px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1 10 auto;
min-width: 0;
}

.theia-ChatInput-ChatContext-Element .action {
cursor: pointer;
margin-left: 4px;
border-radius: 4px;
flex-shrink: 0;
}

.theia-ChatInput-ChatContext-Element .action:hover {
background-color: var(--theia-toolbar-hoverBackground);
}

.theia-ChatInput-ChatContext-Icon {
display: inline;
line-height: 18px;
flex-shrink: 0;
}

.theia-ChatInput-ChatContext-Icon.codicon {
Expand Down Expand Up @@ -296,7 +312,8 @@ div:last-child>.theia-ChatNode {
text-align: center;
}

.theia-ChatInput-ChangeSet-List .theia-ChatInput-ChangeSet-Icon.codicon::before {
.theia-ChatInput-ChangeSet-List
.theia-ChatInput-ChangeSet-Icon.codicon::before {
font-size: var(--theia-ui-font-size1);
}

Expand Down Expand Up @@ -503,7 +520,8 @@ div:last-child>.theia-ChatNode {
display: flex;
flex-direction: column;
gap: 8px;
border: var(--theia-border-width) solid var(--theia-sideBarSectionHeader-border);
border: var(--theia-border-width) solid
var(--theia-sideBarSectionHeader-border);
padding: 8px 12px 12px;
border-radius: 5px;
margin: 0 0 8px 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ export class FileChatVariableContribution implements AIVariableContribution {
variable: FILE_VARIABLE,
arg: wsRelativePath
});
texts.push(`${PromptText.VARIABLE_CHAR}${FILE_VARIABLE.id}${PromptText.VARIABLE_ARG_SEPARATOR}${wsRelativePath}`);
texts.push(`${PromptText.VARIABLE_CHAR}${FILE_VARIABLE.name}${PromptText.VARIABLE_SEPARATOR_CHAR}${wsRelativePath}`);
}
}

Expand Down
14 changes: 9 additions & 5 deletions packages/ai-chat/src/common/chat-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,13 +119,17 @@ export interface ChatRequest {
readonly displayText?: string;
}

export interface ChatContext {
variables: ResolvedAIContextVariable[];
}

export interface ChatRequestModel {
readonly id: string;
readonly session: ChatModel;
readonly request: ChatRequest;
readonly response: ChatResponseModel;
readonly message: ParsedChatRequest;
readonly context: ResolvedAIContextVariable[];
readonly context: ChatContext;
readonly agentId?: string;
readonly data?: { [key: string]: unknown };
}
Expand Down Expand Up @@ -530,7 +534,7 @@ export class MutableChatModel implements ChatModel {
}
}

addRequest(parsedChatRequest: ParsedChatRequest, agentId?: string, context: ResolvedAIContextVariable[] = []): MutableChatRequestModel {
addRequest(parsedChatRequest: ParsedChatRequest, agentId?: string, context: ChatContext = { variables: [] }): MutableChatRequestModel {
const requestModel = new MutableChatRequestModel(this, parsedChatRequest, agentId, context);
this._requests.push(requestModel);
this._onDidChangeEmitter.fire({
Expand Down Expand Up @@ -599,12 +603,12 @@ export class MutableChatRequestModel implements ChatRequestModel {
protected _session: MutableChatModel;
protected _request: ChatRequest;
protected _response: MutableChatResponseModel;
protected _context: ResolvedAIContextVariable[];
protected _context: ChatContext;
protected _agentId?: string;
protected _data: { [key: string]: unknown };

constructor(session: MutableChatModel, public readonly message: ParsedChatRequest, agentId?: string,
context: ResolvedAIContextVariable[] = [], data: { [key: string]: unknown } = {}) {
context: ChatContext = { variables: [] }, data: { [key: string]: unknown } = {}) {
// TODO accept serialized data as a parameter to restore a previously saved ChatRequestModel
this._request = message.request;
this._id = generateUuid();
Expand Down Expand Up @@ -643,7 +647,7 @@ export class MutableChatRequestModel implements ChatRequestModel {
return this._response;
}

get context(): ResolvedAIContextVariable[] {
get context(): ChatContext {
return this._context;
}

Expand Down
23 changes: 15 additions & 8 deletions packages/ai-chat/src/common/chat-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import {
ChatRequestModel,
ChatResponseModel,
ErrorChatResponseModel,
ChatContext,
} from './chat-model';
import { ChatRequestParser } from './chat-request-parser';
import { ParsedChatRequest, ParsedChatRequestAgentPart, ParsedChatRequestVariablePart } from './parsed-chat-request';
Expand All @@ -58,6 +59,10 @@ export interface ChatSession {
isActive: boolean;
}

export interface ChatContextRequest {
variableRequests: AIVariableResolutionRequest[]
}

export interface ActiveSessionChangedEvent {
sessionId: string | undefined;
focus?: boolean;
Expand Down Expand Up @@ -96,7 +101,7 @@ export interface ChatService {
sendRequest(
sessionId: string,
request: ChatRequest,
context?: AIVariableResolutionRequest[]
requestedContext?: ChatContextRequest
): Promise<ChatRequestInvocation | undefined>;

deleteChangeSet(sessionId: string): void;
Expand Down Expand Up @@ -172,7 +177,7 @@ export class ChatServiceImpl implements ChatService {
async sendRequest(
sessionId: string,
request: ChatRequest,
context: AIVariableResolutionRequest[] = []
requestedContext: ChatContextRequest = { variableRequests: [] }
): Promise<ChatRequestInvocation | undefined> {
const session = this.getSession(sessionId);
if (!session) {
Expand All @@ -194,7 +199,7 @@ export class ChatServiceImpl implements ChatService {
};
}

const resolvedContext = await this.resolveContext(context, request, session);
const resolvedContext = await this.resolveChatContext(requestedContext, request, session);
const requestModel = session.model.addRequest(parsedRequest, agent?.id, resolvedContext);

for (const part of parsedRequest.parts) {
Expand Down Expand Up @@ -242,19 +247,21 @@ export class ChatServiceImpl implements ChatService {
return invocation;
}

protected async resolveContext(
context: AIVariableResolutionRequest[],
protected async resolveChatContext(
requestedContext: ChatContextRequest,
request: ChatRequest,
session: ChatSessionInternal
): Promise<ResolvedAIContextVariable[]> {
return await Promise.all(
context.map(async contextVariable => {
): Promise<ChatContext> {
const resolvedVariables = await Promise.all(
requestedContext.variableRequests.map(async contextVariable => {
const resolvedVariable = await this.variableService.resolveVariable(contextVariable, { request, model: session });
if (ResolvedAIContextVariable.is(resolvedVariable)) {
return resolvedVariable;
}
return undefined;
})
).then(results => results.filter((result): result is ResolvedAIContextVariable => result !== undefined));
return { variables: resolvedVariables };
}

async cancelRequest(sessionId: string, requestId: string): Promise<void> {
Expand Down
2 changes: 1 addition & 1 deletion packages/ai-core/src/common/prompt-text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@ export namespace PromptText {
export const AGENT_CHAR = '@';
export const VARIABLE_CHAR = '#';
export const FUNCTION_CHAR = '~';
export const VARIABLE_ARG_SEPARATOR = ':';
export const VARIABLE_SEPARATOR_CHAR = ':';
}
4 changes: 2 additions & 2 deletions packages/ai-ide-agents/src/browser/context-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class ListChatContext implements ToolProvider {
name: ListChatContext.ID,
description: 'Returns the list of context elements (such as files) specified by the user manually as part of the chat request.',
handler: async (_: string, ctx: MutableChatRequestModel): Promise<string> => {
const result = ctx.context.map(contextElement => ({
const result = ctx.context.variables.map(contextElement => ({
id: contextElement.variable.id + contextElement.arg,
type: contextElement.variable.name
}));
Expand Down Expand Up @@ -59,7 +59,7 @@ export class ResolveChatContext implements ToolProvider {
},
handler: async (args: string, ctx: MutableChatRequestModel): Promise<string> => {
const { contextElementId } = JSON.parse(args) as { contextElementId: string };
const variable = ctx.context.find(contextElement => contextElement.variable.id + contextElement.arg === contextElementId);
const variable = ctx.context.variables.find(contextElement => contextElement.variable.id + contextElement.arg === contextElementId);
if (variable) {
const result = {
id: variable.variable.id + variable.arg,
Expand Down

0 comments on commit a8c2966

Please sign in to comment.