Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
chore: custom list collections view
  • Loading branch information
gagik committed Nov 5, 2025
commit f5e02aea2b3d590268ef3e87f0fe2c222012e27e
97 changes: 85 additions & 12 deletions packages/compass-assistant/src/components/tool-call-message.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,29 @@ const statusTextStyles = css({
fontSize: '12px',
});

const collectionListStyles = css({
marginTop: spacing[200],
marginBottom: spacing[200],
paddingLeft: spacing[300],
});

const collectionItemStyles = css({
fontSize: '13px',
lineHeight: '20px',
fontFamily: 'Source Code Pro, monospace',
color: palette.gray.dark2,
});

const collectionItemDarkModeStyles = css({
color: palette.gray.light2,
});

const collectionHeaderStyles = css({
fontWeight: 600,
fontSize: '13px',
marginBottom: spacing[100],
});

export interface ToolCallPart {
type: string;
toolCallId?: string;
Expand Down Expand Up @@ -170,6 +193,23 @@ function getToolDisplayName(type: string): string {
return type.replace(/^tool-/, '');
}

// Parse collection names from the list-collections output
function parseCollectionNames(outputText: string): string[] {
const collections: string[] = [];
const lines = outputText.split('\n');

for (const line of lines) {
const trimmedLine = line.trim();
// Match lines that are just quoted strings
const match = trimmedLine.match(/^"(.+)"$/);
if (match) {
collections.push(match[1]);
}
}

return collections;
}

export const ToolCallMessage: React.FunctionComponent<ToolCallMessageProps> = ({
toolCall,
onApprove,
Expand Down Expand Up @@ -198,23 +238,56 @@ export const ToolCallMessage: React.FunctionComponent<ToolCallMessageProps> = ({
const isDenied = toolCall.state === 'output-denied';
const wasApproved = toolCall.approval?.approved === true;

// Special handling for list-collections
const isListCollections = toolName === 'list-collections';
const collections =
isListCollections && hasOutput ? parseCollectionNames(outputText) : [];
const databaseName = isListCollections
? (toolCall.input as { database?: string })?.database
: undefined;

return (
<div
className={cx(toolCallCardStyles, darkMode && toolCallCardDarkModeStyles)}
>
<div className={toolHeaderStyles}>
<div
className={cx(
toolIconContainerStyles,
darkMode && toolIconContainerDarkModeStyles
)}
>
<Icon glyph="Wrench" size="xsmall" />
</div>
<div className={toolNameStyles}>
<b>{toolName}</b>: {description}
{isListCollections && collections.length > 0 ? (
// Special rendering for list-collections
<>
<div className={toolHeaderStyles}>
<div className={collectionHeaderStyles}>
Collections in database &quot;{databaseName}&quot;
</div>
</div>
<ul className={collectionListStyles}>
{collections.map((collection, index) => (
<li
key={index}
className={cx(
collectionItemStyles,
darkMode && collectionItemDarkModeStyles
)}
>
{collection}
</li>
))}
</ul>
</>
) : (
// Default rendering for all other tools
<div className={toolHeaderStyles}>
<div
className={cx(
toolIconContainerStyles,
darkMode && toolIconContainerDarkModeStyles
)}
>
<Icon glyph="Wrench" size="xsmall" />
</div>
<div className={toolNameStyles}>
<b>{toolName}</b>: {description}
</div>
</div>
</div>
)}

{/* Input Section */}
<div>
Expand Down
19 changes: 13 additions & 6 deletions packages/compass-assistant/src/docs-provider-transport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,6 @@ export class DocsProviderTransport implements ChatTransport<AssistantMessage> {

const lastMessage = filteredMessages[filteredMessages.length - 1];

console.log(
'lastMessage.metadata?.availableTools',
lastMessage,
this.getTools()
);
const result = streamText({
model: this.model,
messages: lastMessage.metadata?.sendWithoutHistory
Expand All @@ -83,7 +78,19 @@ export class DocsProviderTransport implements ChatTransport<AssistantMessage> {
'X-Request-Origin': this.origin,
},
tools: this.getTools(),
stopWhen: stepCountIs(5),
stopWhen: (options) => {
const { steps } = options;
if (
steps.some((step) =>
step.toolCalls?.some(
(toolCall) => toolCall.toolName === 'list-collections'
)
)
) {
return stepCountIs(1)(options);
}
return stepCountIs(5)(options);
},
providerOptions: {
openai: {
store: false,
Expand Down