import { useMemo } from "react"; import { WorkspaceUserProjectSelect, type WorkspaceUserProjectSelectChangeAction, type WorkspaceUserProjectSelectLabelOverrides, type WorkspaceUserProjectSelectProps } from "@tutti-os/workspace-user-project/ui"; import type { WorkspaceUserProject, WorkspaceUserProjectApi } from "@tutti-os/workspace-user-project/contracts"; import type { WorkspaceUserProjectI18nRuntime } from "@tutti-os/workspace-user-project/i18n"; import { useOptionalAgentHostApi } from "../../agentActivityHost"; import { NewWorkspaceLinedIcon, cn } from "@tutti-os/ui-system"; import type { AgentGUIComposerSettingsVM } from "./model/agentGuiNodeTypes"; import styles from "./AgentGUINode.styles"; import { createAgentGUIUserProjectSelectionApi } from "./agentGuiUserProjectSelectionApi"; export type AgentProjectDropdownLabels = Pick< WorkspaceUserProjectSelectLabelOverrides, "projectLocked" > & { projectMissingDescription: string; }; export interface AgentProjectPathChangeMetadata { action: WorkspaceUserProjectSelectChangeAction; project?: WorkspaceUserProject; } export type AgentProjectDropdownOptions = Pick< WorkspaceUserProjectSelectProps, "labels" | "menuActions" | "showKnownProjectOptions" > & { /** Optional Host-owned import flow. Absent by default, so existing Hosts are unchanged. */ importDirectory?: WorkspaceUserProjectApi["importDirectory"]; }; export function AgentProjectDropdown({ composerSettings, labels, options, i18n, selectProjectDirectory, userProjectApi, onDismissAutoFocus, onProjectMissingChange, onProjectPathChange }: { composerSettings: Pick< AgentGUIComposerSettingsVM, | "selectedProjectPath" | "projectLocked" | "shouldApplyPreparedProjectSelection" >; i18n: WorkspaceUserProjectI18nRuntime; labels: AgentProjectDropdownLabels; options?: AgentProjectDropdownOptions; selectProjectDirectory?: () => Promise<{ path: string } | null>; userProjectApi?: WorkspaceUserProjectApi | null; onDismissAutoFocus?: (event: Event) => void; onProjectMissingChange?: (isMissing: boolean) => void; onProjectPathChange: ( path: string | null, metadata?: AgentProjectPathChangeMetadata ) => void; }): React.JSX.Element { "use memo"; const agentHostApi = useOptionalAgentHostApi(); const projectSource = userProjectApi === undefined ? agentHostApi?.userProjects : userProjectApi; const resolvedUserProjectApi = useMemo( () => createAgentGUIUserProjectSelectionApi({ importDirectory: options?.importDirectory, selectProjectDirectory, userProjects: projectSource }), [options?.importDirectory, projectSource, selectProjectDirectory] ); return ( ( )} selectedProjectPath={composerSettings.selectedProjectPath} service={ userProjectApi === undefined ? (agentHostApi?.userProjects?.service ?? null) : null } shouldApplyPreparedSelection={ composerSettings.shouldApplyPreparedProjectSelection === true } showKnownProjectOptions={options?.showKnownProjectOptions} onDismissAutoFocus={onDismissAutoFocus} onProjectMissingChange={onProjectMissingChange} onProjectPathChange={onProjectPathChange} /> ); }