Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
f85249f
feat: add UI support to display agent transfer events
boyangsvl Apr 28, 2026
c489e97
feat: add ability to send custom function responses via edit dialog a…
boyangsvl Apr 30, 2026
56a2e8d
refactor: replace custom hover component with static chip and directi…
boyangsvl Apr 30, 2026
2c18d1a
style: remove unused function response chip container and adjust cust…
boyangsvl Apr 30, 2026
7f5e0c8
refactor: replace custom chip styling with reusable app-hover-info-bu…
boyangsvl Apr 30, 2026
de4da8d
feat: force bubble display for text content and add styling for inlin…
boyangsvl Apr 30, 2026
022adf7
feat: upgrade image viewer to a full-screen lightbox with pan and zoo…
boyangsvl Apr 30, 2026
2e197ca
style: enable pre-wrap for segment values within string segments
boyangsvl May 7, 2026
5512b1b
feat: add custom JSON viewer component with markdown rendering capabi…
boyangsvl May 8, 2026
764dc94
style: update json string color to use css variable with fallback
boyangsvl May 8, 2026
018c38d
refactor: replace ngx-json-viewer with CustomJsonViewerComponent thro…
boyangsvl May 8, 2026
cc5c80a
feat: add copy-to-clipboard functionality to markdown code blocks
boyangsvl May 8, 2026
385aba5
feat: add copy-to-clipboard functionality to inline code elements
boyangsvl May 8, 2026
1087d37
refactor: remove CSS transitions from copy button component for immed…
boyangsvl May 8, 2026
ecc5d66
feat: add run button for inline code blocks under Sample Inputs in re…
boyangsvl May 8, 2026
5e8ff1f
feat(ui): format single-parameter function call info buttons in Pytho…
boyangsvl May 8, 2026
334d3f6
style: hide copy button on hover-out and improve inline code styling …
boyangsvl May 8, 2026
9a49b63
refactor: restrict copy button visibility and styling to runnable sam…
boyangsvl May 8, 2026
8d2fdc0
feat: improve function call display by prioritizing path arguments an…
boyangsvl May 8, 2026
7403732
Fix eval tab not loading at inital load
wyf7107 May 11, 2026
6dba64b
Merge branch 'main' into workflow
wyf7107 May 13, 2026
c7a7442
fix: resolve failing unit tests for state-tab, side-panel, and trace-…
wyf7107 May 13, 2026
bc3d652
Updaet v2 endpoints
wyf7107 May 20, 2026
9684e6e
feat(otel): remove call_llm spans and add stricter type validation fo…
RKest May 11, 2026
9f1eede
Merge pull request #134 from RKest/push-vtlkkkusnzno
wyf7107 May 22, 2026
2892b68
feat: implement SSE request cancellation and UI stop functionality fo…
boyangsvl May 22, 2026
8262791
refactor: migrate chat input controls into integrated menu and suffix…
boyangsvl May 22, 2026
3f5af77
feat: format usage metadata tokens with decimal pipe and improve layo…
boyangsvl May 26, 2026
389602f
feat: add button to refresh and load the latest session and move tool…
boyangsvl May 26, 2026
a68a2f9
style: adjust padding and margin for chat action buttons and header c…
boyangsvl May 26, 2026
060b328
feat: implement manual scroll detection to disable automatic event se…
boyangsvl May 26, 2026
afbf6b7
feat(chat): Make developer UI fully responsive and mobile friendly
boyangsvl May 27, 2026
3195d61
Merge branch 'main' into workflow
wyf7107 May 28, 2026
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
Binary file added .DS_Store
Binary file not shown.
26 changes: 13 additions & 13 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
"@viz-js/viz": "^3.12.0",
"codemirror": "^6.0.2",
"mermaid": "^11.14.0",
"ngx-json-viewer": "^3.2.1",
"ngx-markdown": "^21.0.1",
"ngx-vflow": "^1.16.4",
"rxjs": "~7.8.0",
Expand All @@ -39,6 +38,7 @@
"uuidv7": "^1.0.2",
"vanilla-jsoneditor": "^3.6.0",
"yaml": "^2.8.0",
"zod": "^4.4.3",
"zone.js": "~0.15.0"
},
"devDependencies": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ export class AddItemDialogComponent {
const allTabAgents = new Map<string, AgentNode>();
YamlUtils.generateYamlFile(rootAgent, formData, trimmedName, allTabAgents);

this.agentService.agentBuildTmp(formData).subscribe((success) => {
this.agentService.agentBuildTmp(trimmedName, formData).subscribe((success) => {
if (success) {
this.router.navigate(['/'], {
queryParams: { app: trimmedName, mode: 'builder' }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ export class BuilderAssistantComponent implements OnInit, AfterViewChecked {

YamlUtils.generateYamlFile(rootAgent, formData, appName, tabAgents);

this.agentService.agentBuildTmp(formData).subscribe((success) => {
this.agentService.agentBuildTmp(appName, formData).subscribe((success) => {
if (success) {
console.log("save to tmp")
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/app/components/builder-tabs/builder-tabs.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -774,9 +774,9 @@ export class BuilderTabsComponent {

YamlUtils.generateYamlFile(rootAgent, formData, appName, tabAgents);

this.agentService.agentBuildTmp(formData).subscribe((success) => {
this.agentService.agentBuildTmp(appName, formData).subscribe((success) => {
if (success) {
this.agentService.agentBuild(formData).subscribe((success) => {
this.agentService.agentBuild(appName, formData).subscribe((success) => {
if (success) {
this.router.navigate(['/'], {
queryParams: { app: appName }
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/canvas/canvas.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1229,7 +1229,7 @@ export class CanvasComponent implements AfterViewInit, OnInit, OnChanges {
const agentToolBoards = this.agentToolBoards();
YamlUtils.generateYamlFile(rootAgent, formData, appName, agentToolBoards);

this.agentService.agentBuild(formData).subscribe((success) => {
this.agentService.agentBuild(appName, formData).subscribe((success) => {
if (success) {
this.router
.navigate(["/"], {
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/chat-panel/chat-panel.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ <h3 style="margin: 0; color: var(--mat-sys-primary);">Evaluation Result</h3>
@if (uiEvents.length === 0 && agentReadme) {
<div class="readme-content">
<ng-container [ngComponentOutlet]="markdownComponent"
[ngComponentOutletInputs]="{text: agentReadme, thought: false}"></ng-container>
[ngComponentOutletInputs]="{text: agentReadme, thought: false, isReadme: true}"></ng-container>
</div>
}
@for (item of displayItems; track item; let i = $index) {
Expand Down
39 changes: 14 additions & 25 deletions src/app/components/chat-panel/chat-panel.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import { MatTooltipModule } from '@angular/material/tooltip';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { MatTabsModule } from '@angular/material/tabs';
import { MatSelectModule } from '@angular/material/select';
import { NgxJsonViewerModule } from 'ngx-json-viewer';
import { CustomJsonViewerComponent } from '../custom-json-viewer/custom-json-viewer.component';
import { EMPTY, merge, NEVER, of, Subject } from 'rxjs';
import { catchError, filter, first, switchMap, tap } from 'rxjs/operators';

Expand All @@ -42,6 +42,7 @@ import { isComputerUseResponse, isVisibleComputerUseClick } from '../../core/mod
import type { EvalCase } from '../../core/models/Eval';
import { FunctionCall, FunctionResponse } from '../../core/models/types';
import { UiEvent } from '../../core/models/UiEvent';
import { Span } from '../../core/models/Trace';
import { AGENT_SERVICE } from '../../core/services/interfaces/agent';
import { FEATURE_FLAG_SERVICE } from '../../core/services/interfaces/feature-flag';
import { SAFE_VALUES_SERVICE } from '../../core/services/interfaces/safevalues';
Expand Down Expand Up @@ -110,7 +111,6 @@ export type DisplayItem = {
MatMenuModule,
MatProgressSpinnerModule,
MatSlideToggleModule,
NgxJsonViewerModule,
MatTooltipModule,
MatButtonToggleModule,
MatTabsModule,
Expand All @@ -126,7 +126,7 @@ export class ChatPanelComponent implements OnChanges, AfterViewInit {
sessionName = input<string>('');
@Input() uiEvents: UiEvent[] = [];
@Input() showBranches: boolean = false;
@Input() traceData: any[] = [];
@Input() traceData: Span[] = [];
@Input() isChatMode: boolean = true;
@Input() evalCase: EvalCase | null = null;
@Input() isEvalEditMode: boolean = false;
Expand All @@ -147,7 +147,7 @@ export class ChatPanelComponent implements OnChanges, AfterViewInit {
@Input() sessionId: string = '';
@Input() viewMode: 'events' | 'traces' = 'events';
@Input() shouldShowEvent?: (uiEvent: UiEvent) => boolean;
spansByInvocationId = new Map<string, any[]>();
spansByInvocationId = new Map<string, Span[]>();
displayItems: DisplayItem[] = [];
eventsScrollTop = -1;
tracesScrollTop = -1;
Expand Down Expand Up @@ -234,13 +234,6 @@ export class ChatPanelComponent implements OnChanges, AfterViewInit {
evalCaseResult = input<any | null>(null);
showEvalSummary = input<boolean>(false);








constructor() {
effect(() => {
const sessionName = this.sessionName();
Expand Down Expand Up @@ -346,15 +339,15 @@ export class ChatPanelComponent implements OnChanges, AfterViewInit {
if (changes['viewMode']) {
const prevMode = changes['viewMode'].previousValue;
const currentMode = changes['viewMode'].currentValue;

if (this.scrollContainer?.nativeElement) {
if (prevMode === 'events') {
this.eventsScrollTop = this.scrollContainer.nativeElement.scrollTop;
} else if (prevMode === 'traces') {
this.tracesScrollTop = this.scrollContainer.nativeElement.scrollTop;
}
}

setTimeout(() => {
if (this.scrollContainer?.nativeElement) {
if (currentMode === 'events' && this.eventsScrollTop !== -1) {
Expand Down Expand Up @@ -465,29 +458,25 @@ export class ChatPanelComponent implements OnChanges, AfterViewInit {
}

rebuildTrace() {
const invocTraces = this.traceData.reduce((map: any, item: any) => {
const key = item.trace_id;
const invocTraces = this.traceData.reduce((map: Map<string, Span[]>, item: Span) => {
const key = String(item.trace_id);
const group = map.get(key);
if (group) {
group.push(item);
group.sort((a: any, b: any) => a.start_time - b.start_time);
group.sort((a: Span, b: Span) => a.start_time - b.start_time);
} else {
map.set(key, [item]);
}
return map;
}, new Map<string, any[]>());
}, new Map<string, Span[]>());

this.spansByInvocationId = new Map<string, any[]>();
this.spansByInvocationId = new Map<string, Span[]>();
for (const [key, group] of invocTraces) {
let invocId = group.find(
(item: any) => item.attributes !== undefined && 'gcp.vertex.agent.invocation_id' in item.attributes
)?.attributes['gcp.vertex.agent.invocation_id'];
let invocId = group.find(s => s.attrInvocationId !== undefined)?.attrInvocationId;

// Fallback 1: Use associated_event_ids
if (!invocId) {
const associatedEventIds = group.find(
(item: any) => item.attributes !== undefined && 'gcp.vertex.agent.associated_event_ids' in item.attributes
)?.attributes['gcp.vertex.agent.associated_event_ids'];
const associatedEventIds = group.find(s => s.attrAssociatedEventIds !== undefined)?.attrAssociatedEventIds;
if (associatedEventIds && associatedEventIds.length > 0) {
invocId = associatedEventIds[0];
}
Expand All @@ -499,7 +488,7 @@ export class ChatPanelComponent implements OnChanges, AfterViewInit {
}

if (invocId) {
this.spansByInvocationId.set(invocId, group);
this.spansByInvocationId.set(String(invocId), group);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/chat/chat.component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,7 @@ describe('ChatComponent', () => {

it('should call getTrace', () => {
expect(mockEventService.getTrace)
.toHaveBeenCalledWith(SESSION_1_ID);
.toHaveBeenCalledWith(component.appName, SESSION_1_ID);
});

describe('canEdit', () => {
Expand Down
Loading
Loading