Repository navigation
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
Shell Deploy Scripts
12s
Matrix: cli-test
Matrix: Impact-selected Linux / Relay Contract / build
Matrix: rust-build-check
DSH Profile Packaging (windows-latest)
49s
Frontend Build
6m 14s
Rust / CLI Validation
8s
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.
|