Skip to content

feat: unify agent identities and refine agent and skill management #6325

feat: unify agent identities and refine agent and skill management

feat: unify agent identities and refine agent and skill management #6325

Triggered via pull request September 9, 2026 14:58
Status Cancelled
Total duration 25m 54s
Artifacts –

ci.yml

on: pull_request
Build Impact
14s
Build Impact
Shell Deploy Scripts
12s
Shell Deploy Scripts
Matrix: cli-test
Matrix: Impact-selected Linux / Relay Contract / build
Matrix: rust-build-check
DSH Profile Packaging (windows-latest)
49s
DSH Profile Packaging (windows-latest)
Frontend Build
6m 14s
Frontend Build
Rust / CLI Validation
8s
Rust / CLI Validation
Fit to window
Zoom out
Zoom in

Annotations

15 errors and 11 warnings
Frontend Build
Process completed with exit code 1.
src/flow_chat/components/ChatInputWorkspaceStripLayout.test.ts > composer context track layout > shows the current mode icon in the compact add menu while keeping profile icons in the list: src/web-ui/src/flow_chat/components/ChatInputWorkspaceStripLayout.test.ts#L505
AssertionError: expected 'import { HARNESS_IDS, canonicalAgentI…' to match /minimal: 'minimal',[\s\S]*?balanced: …/ - Expected: /minimal: 'minimal',[\s\S]*?balanced: 'standard',[\s\S]*?ultimate: 'ultimate',[\s\S]*?creative: 'creative',/ + Received: "import { HARNESS_IDS, canonicalAgentId, type HarnessId } from '@/shared/agents/identity'; import { HARNESS_PRESENTATION } from '@/shared/agents/harnessPresentation'; import React, { useCallback, useEffect, useId, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; import { OverflowText, Icon, Menu, MenuItem, MenuSection, MenuSeparator, Tooltip } from '@openbitfun/ui'; import { getAppearanceOverlayHost } from '@/infrastructure/appearance/runtime/AppearanceOverlayHost'; import { confirmDialog } from '@/infrastructure/confirm-dialog'; import { notificationService } from '@/shared/notification-system'; import { useAnchoredPopoverPosition } from '@/shared/utils/useAnchoredPopoverPosition'; import { useSideAnchoredPopoverPosition } from '@/shared/utils/useSideAnchoredPopoverPosition'; import './HarnessProfileSelector.scss'; export type HarnessProfileId = KnownHarnessProfileId | (string & {}); /** Includes the existing Agent submenu, which is navigation rather than an identity. */ export type KnownHarnessProfileId = HarnessId | 'other'; export type SelectableHarnessProfileId = HarnessId; export interface HarnessAgentOption { id: string; name: string; available?: boolean; } export type HarnessNewSessionSelection = | { kind: 'profile'; id: SelectableHarnessProfileId } | { kind: 'agent'; id: string }; export type HarnessProfileSelectorPresentation = 'standalone' | 'menu-item'; interface HarnessProfileSelectorProps { /** Session still runs a legacy fixed mode and cannot switch. */ legacySession?: boolean; /** The Session has accepted its first runtime Turn, so Harness and main Agent are fixed. */ sessionStarted?: boolean; selectedProfile: HarnessProfileId; selectedAgentId?: string; otherAgents?: HarnessAgentOption[]; disabled?: boolean; /** * `standalone` anchors the picker to its own floating trigger. `menu-item` * turns that trigger into a row inside a parent action menu and opens the * secondary picker beside it in the shared overlay layer. */ presentation?: HarnessProfileSelectorPresentation; /** A parent menu can coordinate this flyout with its sibling submenus. */ open?: boolean; onOpenChange?: (open: boolean) => void; onSelectProfile: (profileId: SelectableHarnessProfileId) => void | Promise<void>; onSelectAgent?: (agentId: string) => void | Promise<void>; onStartNewSession?: ( selection: HarnessNewSessionSelection, ) => void | Promise<void>; /** Lets a parent action menu close after a terminal selection. */ onSelectionComplete?: () => void; } const PROFILE_IDS: KnownHarnessProfileId[] = [...HARNESS_IDS, 'other']; type DensityHarnessProfileId = 'Minimal' | 'Standard' | 'Ultimate'; function isDensityProfile(profile: KnownHarnessProfileId): profile is DensityHarnessProfileId { return profile === 'Minimal' || profile === 'Standard' || profile === 'Ultimate'; } function isSelectableProfile( profile: KnownHarnessProfileId, ): profile is SelectableHarnessProfileId { return isDensityProfile(profile) || profile === 'Creative'; } function sameAgent(left: string | null | undefined, right: string | null | undefined): boolean { return canonicalAgentId(left?.trim() ?? '').toLowerCase() === canonicalAgentId(right?.trim() ?? '').toLowerCase(); } /** Menu rows and the compact add-menu trigger share one mode mark. */ function HarnessProfileMark({ profile, }: { profile: KnownHarnessProfileId; }): React.ReactElement { const densityProfile = isDensityProfile(profile) ? profile : undefined; return ( <span className=\"openbitfun-harness-selector__density-mark\" data-harness-profile={profile} data-harness-density={densityProfile ? HARNESS_PRESENTATION[densityProfile].gear : 0} aria-hidden > {profile
src/app/styles/textClipping.test.ts > Truncated product text line boxes > scenes/skills/SkillsScene.scss gives .skills-card__desc a font-relative, descender-safe line height: src/web-ui/src/app/styles/textClipping.test.ts#L106
AssertionError: expected 'var(--openbitfun-type-meta-line-heigh…' to be 'var(--openbitfun-type-body-sm-line-he…' // Object.is equality Expected: "var(--openbitfun-type-body-sm-line-height)" Received: "var(--openbitfun-type-meta-line-height)" ❯ src/app/styles/textClipping.test.ts:106:62
src/app/styles/textClipping.test.ts > Truncated product text line boxes > scenes/skills/SkillsScene.scss gives .skills-card__name a font-relative, descender-safe line height: src/web-ui/src/app/styles/textClipping.test.ts#L106
AssertionError: expected 'var(--openbitfun-type-label-sm-line-h…' to be 'var(--openbitfun-type-label-md-line-h…' // Object.is equality Expected: "var(--openbitfun-type-label-md-line-height)" Received: "var(--openbitfun-type-label-sm-line-height)" ❯ src/app/styles/textClipping.test.ts:106:62
src/app/global-search/globalSearchArchitecture.test.ts > global search ownership > keeps the shared search presentation outside the session right-panel empty state: src/web-ui/src/app/global-search/globalSearchArchitecture.test.ts#L27
AssertionError: expected '/**\n * ContentCanvas main container …' to contain '<EmptyState onClose={disablePopOut ? …' - Expected + Received - <EmptyState onClose={disablePopOut ? undefined : collapsePanel}> + /** + * ContentCanvas main container component. + * Shared content surface. The containing scene or panel owns its layout. + */ + + import React, { useCallback, useEffect, useMemo, useRef } from 'react'; + import { EditorArea } from './editor-area'; + import { AnchorZone } from './anchor-zone'; + import { MissionControl } from './mission-control'; + import { EmptyState } from './empty-state'; + import { useCanvasStore } from './stores'; + import { useTabLifecycle, useKeyboardShortcuts } from './hooks'; + import type { AnchorPosition } from './types'; + import type { CanvasStoreMode } from './stores/canvasStore'; + import { selectActiveBtwSessionTab } from '@/flow_chat/services/btwSessionPane'; + import { openMainSession } from '@/flow_chat/services/sessionActivation'; + import { isSamePath } from '@/shared/utils/pathUtils'; + import './ContentCanvas.scss'; + export interface ContentCanvasProps { + /** Workspace path */ + workspacePath?: string; + /** App mode */ + mode?: CanvasStoreMode; + /** Whether the containing scene is currently visible */ + isSceneActive?: boolean; + /** Interaction callback */ + onInteraction?: (itemId: string, userInput: string) => Promise<void>; + /** Before-close callback */ + onBeforeClose?: (content: any) => Promise<boolean>; + /** Disable pop-out and panel-close controls (used in panel-view scene) */ + disablePopOut?: boolean; + /** Override the event this canvas listens to for creating tabs. */ + createTabEventName?: string; + /** Reveal this host after an explicit content-open request. */ + onReveal?: () => void; + /** Close the containing panel, when this host is collapsible. */ + onCollapsePanel?: () => void; + /** Suspend terminal fit/PTY resize while the hosting panel is animating. */ + terminalResizeSuspended?: boolean; + /** Whether this host exposes Mission Control. */ + missionControlEnabled?: boolean; + /** Host-provided content for the no-tabs state. */ + emptyState?: React.ReactNode; + } + + export const ContentCanvas: React.FC<ContentCanvasProps> = ({ + workspacePath, + mode = 'agent', + isSceneActive = true, + onInteraction, + disablePopOut = false, + createTabEventName, + onReveal, + onCollapsePanel, + terminalResizeSuspended = false, + missionControlEnabled = true, + emptyState, + }) => { + // Store state — fine-grained selectors so unrelated store changes + // (drag state, closed-tab history, ...) do not re-render the whole canvas. + const primaryGroup = useCanvasStore(state => state.primaryGroup); + const secondaryGroup = useCanvasStore(state => state.secondaryGroup); + const tertiaryGroup = useCanvasStore(state => state.tertiaryGroup); + const layout = useCanvasStore(state => state.layout); + const isMissionControlOpen = useCanvasStore(state => state.isMissionControlOpen); + const setAnchorPosition = useCanvasStore(state => state.setAnchorPosition); + const setAnchorSize = useCanvasStore(state => state.setAnchorSize); + const closeMissionControl = useCanvasStore(state => state.closeMissionControl); + const openMissionControl = useCanvasStore(state => state.openMissionControl); + const activeBtwSessionTab = useCanvasStore(state => selectActiveBtwSessionTab(state as any)); + const activeBtwSessionData = activeBtwSessionTab?.content.data as + | { childSessionId: string; parentSessionId: string; workspacePath?: string } + | undefined; + const lastSyncedBtwTabIdRef = useRef<string | null>(null); + // Initialize hooks + const { handleCloseWithDirtyCheck, handleCloseAllWithDirtyCheck } = useTabLifecycle({ + mode, + createTabEventName, + onReveal, + }); + useKeyboardShortcuts({ + enabled: true, + missionControlEnabled, + handleCloseWithDirtyCheck, + onReveal, + }); + + useEffect(() => { + if (mode !== 'agent' || !ac
Rust Build Check (ubuntu-latest)
Process completed with exit code 101.
Rust Build Check (macos-15)
Process completed with exit code 101.
Rust Build Check (windows-latest)
Process completed with exit code 101.
Impact-selected Linux / Relay Contract / Linux Binaries (linux-x64)
Canceling since a higher priority waiting request for ci-refs/pull/2932/merge exists
Impact-selected Linux / Relay Contract / Linux Binaries (linux-x64)
The operation was canceled.
Impact-selected Linux / Relay Contract / Linux Binaries (linux-arm64)
Canceling since a higher priority waiting request for ci-refs/pull/2932/merge exists
Impact-selected Linux / Relay Contract / Linux Binaries (linux-arm64)
The operation was canceled.
Rust / CLI Validation
Process completed with exit code 1.
CI
Canceling since a higher priority waiting request for ci-refs/pull/2932/merge exists
CI
Canceling since a higher priority waiting request for ci-refs/pull/2932/merge exists
Frontend Build: src/web-ui/src/shared/announcement-system/components/ReleaseLetterModal.tsx#L22
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/tool-cards/AgentWaitToolCard.tsx#L17
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/voice/RealtimeVoiceCallContext.tsx#L32
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/voice/RealtimeVoiceCallContext.tsx#L23
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/modern/MessageReferenceCapsule.tsx#L29
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/modern/MessageReferenceCapsule.tsx#L7
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/ReasoningPresetSelector.tsx#L112
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/ReasoningPresetSelector.tsx#L36
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/app/components/SceneTopBar/SceneChrome.tsx#L121
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/app/components/NavPanel/components/DeviceArtwork.tsx#L6
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Tauri Windows test-loader limitation
The desktop test harness hit upstream Tauri issue #13419 before any Rust test ran. Compilation and the cross-platform product-control contracts remain blocking.