@inf-monkeys-tech/monkeys-design 1.0.37 → 1.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/agent-workbench/index.js.map +1 -1
- package/dist/components/agent-workbench/index.mjs.map +1 -1
- package/dist/components/layout/index.d.mts +4 -1
- package/dist/components/layout/index.d.ts +4 -1
- package/dist/components/layout/index.js +144 -98
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/layout/index.mjs +144 -98
- package/dist/components/layout/index.mjs.map +1 -1
- package/dist/index.js +144 -98
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +144 -98
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/locale/en-US.ts","../../../src/locale/resolve-locale.ts","../../../src/provider/context.ts","../../../src/components/base/utils.ts","../../../src/components/layout/index.tsx","../../../src/components/primitives/InteractiveControls.tsx","../../../src/components/primitives/Menus.tsx","../../../src/components/agent-workbench/AgentWorkbenchComposer.tsx","../../../src/components/agent-workbench/AgentWorkbenchQuickStart.tsx","../../../src/components/agent-workbench/AgentWorkbenchSidebar.tsx","../../../src/components/agent-workbench/activity-model.ts","../../../src/components/agent-workbench/AgentWorkbenchTool.tsx","../../../src/components/agent-workbench/AgentWorkbenchActivity.tsx","../../../src/components/agent-workbench/details-model.ts","../../../src/components/agent-workbench/AgentWorkbenchTaskDetails.tsx","../../../src/components/agent-workbench/AgentWorkbenchThread.tsx","../../../src/components/agent-workbench/AgentWorkbenchProcess.tsx","../../../src/components/agent-workbench/AgentWorkbenchArtifactSummary.tsx","../../../src/components/agent-workbench/AgentWorkbenchArtifactWorkspace.tsx"],"names":["createContext","useContext","twMerge","cn","React","jsx","AccordionPrimitive","jsxs","ChevronDown","CheckboxPrimitive","Check","cva","Slot","PopoverPrimitive","ScrollAreaPrimitive","SwitchPrimitive","TabsPrimitive","TooltipPrimitive","DropdownMenu","DropdownMenuPrimitive","React2","ChevronRight","Circle","SelectPrimitive","ChevronUp","Fragment","useRef","useState","useMemo","useEffect","ArrowUp","ArrowDown","Pencil","Trash2","ImageIcon","File","X","Paperclip","Mic","Send","Square","Sparkles","Palette","Search","FileText","Code2","ShoppingBag","Icon","ArrowLeft","Upload","ArrowUpRight","Bot","RefreshCw","Loader2","CheckCircle2","AlertCircle","Ellipsis","Pin","Plus","SquarePen","Blocks","MessageSquare","Settings","Clock3","XCircle","event","TerminalSquare","JsonValue","CircleStop","FileOutput","Download","latestBy","formatDuration","StatusIcon","GitFork","PencilLine","Copy","RotateCcw","FileCode2","Files","TestTube2","CollapsiblePrimitive","CircleAlert","BookOpen","Wrench","Music2","FileImage","Presentation","Film","Globe2","PopoverPrimitive2","ListFilter","Link2","ARTIFACT_ICONS","useSortable","TabsPrimitive2","CSS","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","ExternalLink","PanelRightClose"],"mappings":"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","file":"index.js","sourcesContent":["import type { MonkeysLocale } from './types';\n\nexport const enUS = {\n locale: 'en-US',\n messages: {\n pagination: {\n navigation: 'Pagination',\n first: 'First',\n previous: 'Previous',\n next: 'Next',\n last: 'Last',\n page: ({ page, pageCount }) => `Page ${page} of ${pageCount}`,\n currentPage: ({ page, pageCount }) =>\n `Page ${page} of ${pageCount}, current page`,\n emptyResults: '0 results',\n range: ({ start, end, total }) => `${start}-${end} of ${total}`,\n },\n dialog: {\n close: 'Close dialog',\n },\n dropdownMenu: {\n actions: 'Actions',\n },\n loading: {\n spinner: 'Loading',\n },\n layout: {\n resizePanels: 'Resize panels',\n },\n steps: {\n label: 'Progress',\n current: 'Current',\n completed: 'Completed',\n error: 'Error',\n disabled: 'Disabled',\n },\n numberInput: {\n increment: 'Increase value',\n decrement: 'Decrease value',\n },\n passwordInput: {\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n },\n multiSelect: {\n placeholder: 'Select options',\n empty: 'No options',\n removeOption: ({ value }) => `Remove ${value}`,\n },\n table: {\n dragColumn: ({ columnId }) => `Drag column ${columnId}`,\n resizeColumn: ({ columnId }) => `Resize column ${columnId}`,\n sortColumn: ({ columnId }) =>\n columnId ? `Sort column ${columnId}` : 'Sort column',\n loadingRow: 'Loading table row',\n },\n toolbar: {\n theme: {\n label: 'Appearance',\n toggle: 'Toggle theme',\n auto: 'Auto',\n light: 'Light',\n dark: 'Dark',\n },\n language: {\n label: 'Language',\n switch: 'Switch language',\n },\n },\n toast: {\n errorTitle: 'Error',\n warningTitle: 'Warning',\n defaultErrorDescription: 'Something went wrong.',\n defaultWarningDescription: 'Please check and try again.',\n },\n dataExplorer: {\n viewTree: {\n actions: 'More actions',\n expand: 'Expand',\n collapse: 'Collapse',\n loading: 'Loading...',\n empty: 'No views',\n error: 'Unable to load views',\n },\n },\n workbench: {\n interactiveTable: {\n columnActions: 'Column actions',\n freezeColumn: 'Freeze to left',\n freezeEndColumn: 'Freeze to right',\n unfreezeColumn: 'Unfreeze from left',\n unfreezeEndColumn: 'Unfreeze from right',\n unfreezeAllColumns: 'Unfreeze all columns',\n resetColumnWidth: 'Reset column width',\n frozenColumnTitle: 'Frozen column',\n },\n },\n agentWorkbench: {\n label: 'Session activity',\n reasoning: 'Reasoning',\n plan: 'Plan',\n taskNoDetail: 'No additional details',\n modes: { chat: 'Chat', work: 'Work' },\n composer: {\n send: 'Send message',\n stop: 'Stop generating',\n queue: 'Queue message',\n attach: 'Add photos or files',\n voice: 'Start voice input',\n webSearch: 'Web search',\n chatMode: 'Chat mode',\n model: 'Model',\n reasoning: 'Reasoning effort',\n permissions: 'Permissions',\n removeAttachment: 'Remove attachment',\n editQueued: 'Edit queued message',\n deleteQueued: 'Delete queued message',\n moveUp: 'Move message up',\n moveDown: 'Move message down',\n queued: 'Queued messages',\n uploading: 'Uploading',\n noModels: 'No models available',\n message: 'Message',\n attachmentOnly: 'Attachment',\n reasoningOptions: { low: 'Low', medium: 'Medium', high: 'High', xhigh: 'Extra high' },\n permissionOptions: { 'approval-required': 'Approval required', 'auto-approve': 'Auto approve', 'full-access': 'Full access' },\n },\n quickStart: {\n label: 'Quick start',\n back: 'Back',\n addFile: 'Add file',\n },\n tool: {\n input: 'Input',\n output: 'Output',\n status: {\n pending: 'Pending',\n running: 'Running',\n completed: 'Completed',\n failed: 'Error',\n denied: 'Denied',\n },\n },\n approval: {\n approve: 'Approve',\n reject: 'Reject',\n approved: 'Approved',\n rejected: 'Rejected',\n },\n artifact: {\n pending: 'Preparing',\n ready: 'Ready',\n failed: 'Failed',\n open: ({ name }) => `Open ${name}`,\n },\n run: {\n stopping: 'Stopping...',\n stoppedAfter: ({ duration }) => `You stopped after ${duration}`,\n },\n process: {\n running: 'Working',\n processed: 'Processed',\n processedFor: ({ duration }) => `Worked for ${duration}`,\n completedCount: ({ completed, total }) => `${completed}/${total} completed`,\n },\n artifactWorkspace: {\n outputs: 'Outputs',\n sources: 'Sources',\n viewAll: 'View all',\n toggleSummary: 'Toggle files',\n tabs: 'Open files',\n closeTab: ({ name }) => `Close ${name}`,\n closeWorkspace: 'Close workspace',\n download: ({ name }) => `Download ${name}`,\n openExternal: ({ name }) => `Open ${name} in a new window`,\n },\n usage: {\n label: 'Context usage',\n context: ({ used, total }) => `${used} / ${total} tokens`,\n },\n navigation: {\n search: 'Search agents and sessions',\n searchSessions: 'Search sessions',\n searchShortcut: 'Focus search',\n clearSearch: 'Clear search',\n tabsLabel: 'Agent workbench navigation',\n agents: 'Agents',\n sessions: 'Sessions',\n newAgent: 'New Agent',\n newSession: 'New Session',\n capabilities: 'Capabilities & Extensions',\n settings: 'Agent Settings',\n allAgents: 'All Agents',\n recentSessions: 'Recent Sessions',\n chat: 'Chat',\n work: 'Work',\n chats: 'Chats',\n builtIn: 'Built-in',\n noDescription: 'No description',\n loading: 'Loading...',\n emptyAgents: 'No agents yet',\n emptySessions: 'No sessions yet',\n noResults: 'No matching results',\n retry: 'Retry',\n pin: 'Pin',\n unpin: 'Unpin',\n rename: 'Rename',\n delete: 'Delete',\n actions: 'Actions',\n save: 'Save',\n cancel: 'Cancel',\n running: 'Running',\n completed: 'Completed',\n failed: 'Failed',\n contextUsage: ({ percent }) => `${percent}% context used`,\n },\n details: {\n title: 'Task details',\n description: 'Summary and workspace activity',\n duration: 'Duration',\n updated: 'Updated',\n model: 'Model',\n mode: 'Mode',\n permissions: 'Permissions',\n tokenUsage: 'Token usage',\n summary: 'Summary',\n summaryEmpty: 'No summary is available yet.',\n summaryFailed: 'The summary could not be generated.',\n highlights: 'Highlights',\n pendingItems: 'Pending items',\n tabs: {\n label: 'Task detail views',\n summary: 'Summary',\n workspace: 'Workspace',\n },\n status: {\n queued: 'Queued',\n running: 'Running',\n waiting_approval: 'Waiting for approval',\n stopping: 'Stopping',\n stopped: 'Stopped',\n completed: 'Completed',\n failed: 'Failed',\n },\n state: {\n loading: { title: 'Loading task details', description: 'Restoring the latest session activity.' },\n empty: { title: 'No task selected', description: 'Select a task to inspect its details.' },\n error: { title: 'Unable to load task details', description: 'Try again after the session is available.' },\n },\n actions: {\n close: 'Close task details',\n copySummary: 'Copy summary',\n retry: 'Retry',\n retrySummary: 'Retry summary',\n resume: 'Resume',\n continueInNewTask: 'Continue in new task',\n editAndRerun: 'Edit and rerun',\n export: 'Export',\n },\n workspace: {\n diffs: 'Code changes',\n files: 'Files',\n terminals: 'Terminals',\n tests: 'Tests',\n artifacts: 'Artifacts',\n exitCode: ({ code }) => `Exit code ${code}`,\n diffStatus: { added: 'Added', modified: 'Modified', deleted: 'Deleted', renamed: 'Renamed' },\n fileOperation: { upsert: 'Updated', delete: 'Deleted' },\n },\n },\n },\n },\n} satisfies MonkeysLocale;\n","import { enUS } from './en-US';\nimport type {\n MonkeysBuiltInLocaleId,\n MonkeysLocale,\n MonkeysLocaleInput,\n MonkeysLocaleMessages,\n MonkeysLocaleMessagesOverride,\n MonkeysResolvedLocale,\n} from './types';\nimport { zhCN } from './zh-CN';\n\nconst BUILT_IN_LOCALES: Record<MonkeysBuiltInLocaleId, MonkeysLocale> = {\n 'en-US': enUS,\n 'zh-CN': zhCN,\n};\n\nfunction normalizeLocaleId(locale: unknown): string {\n if (typeof locale !== 'string' || !locale.trim()) {\n throw new TypeError('Monkeys locale must be a non-empty BCP 47 string.');\n }\n\n try {\n return Intl.getCanonicalLocales(locale)[0];\n } catch {\n throw new RangeError(\n `Monkeys locale \"${locale}\" is not a valid BCP 47 identifier.`,\n );\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction validateMessageOverride(\n value: unknown,\n schema: unknown,\n path: string,\n) {\n if (!isRecord(value) || !isRecord(schema)) {\n throw new TypeError(`${path} must be an object.`);\n }\n\n for (const [key, candidate] of Object.entries(value)) {\n if (candidate === undefined) continue;\n if (!(key in schema)) {\n throw new TypeError(`${path}.${key} is not a supported Monkeys message.`);\n }\n\n const expected = schema[key];\n const candidatePath = `${path}.${key}`;\n if (typeof expected === 'function') {\n if (typeof candidate !== 'function') {\n throw new TypeError(`${candidatePath} must be a function.`);\n }\n } else if (typeof expected === 'string') {\n if (typeof candidate !== 'string') {\n throw new TypeError(`${candidatePath} must be a string.`);\n }\n } else {\n validateMessageOverride(candidate, expected, candidatePath);\n }\n }\n}\n\nfunction assertMessagesOverride(\n value: unknown,\n path: string,\n): asserts value is MonkeysLocaleMessagesOverride {\n validateMessageOverride(value, enUS.messages, path);\n}\n\nfunction isBuiltInLocale(locale: string): locale is MonkeysBuiltInLocaleId {\n return locale === 'en-US' || locale === 'zh-CN';\n}\n\nfunction normalizeLocaleInput(input: MonkeysLocaleInput | undefined): {\n locale: string | undefined;\n messages: MonkeysLocaleMessagesOverride | undefined;\n hasExplicitLocale: boolean;\n} {\n if (input === undefined) {\n return {\n locale: undefined,\n messages: undefined,\n hasExplicitLocale: false,\n };\n }\n\n if (typeof input === 'string') {\n const locale = normalizeLocaleId(input);\n if (!isBuiltInLocale(locale)) {\n throw new RangeError(\n `Unsupported built-in Monkeys locale \"${locale}\". Provide a locale pack object for custom locales.`,\n );\n }\n return { locale, messages: undefined, hasExplicitLocale: true };\n }\n\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('Monkeys locale must be a locale id or locale pack object.');\n }\n\n const locale = normalizeLocaleId(input.locale);\n assertMessagesOverride(input.messages, 'Monkeys locale messages');\n\n return {\n locale,\n messages: input.messages,\n hasExplicitLocale: true,\n };\n}\n\nexport function mergeMonkeysLocaleMessages(\n base: MonkeysLocaleMessages,\n override?: MonkeysLocaleMessagesOverride,\n): MonkeysLocaleMessages {\n if (!override) return base;\n\n return {\n pagination: { ...base.pagination, ...override.pagination },\n dialog: { ...base.dialog, ...override.dialog },\n dropdownMenu: { ...base.dropdownMenu, ...override.dropdownMenu },\n loading: { ...base.loading, ...override.loading },\n layout: { ...base.layout, ...override.layout },\n steps: { ...base.steps, ...override.steps },\n numberInput: { ...base.numberInput, ...override.numberInput },\n passwordInput: { ...base.passwordInput, ...override.passwordInput },\n multiSelect: { ...base.multiSelect, ...override.multiSelect },\n table: { ...base.table, ...override.table },\n toolbar: {\n theme: { ...base.toolbar.theme, ...override.toolbar?.theme },\n language: { ...base.toolbar.language, ...override.toolbar?.language },\n },\n toast: { ...base.toast, ...override.toast },\n dataExplorer: {\n viewTree: {\n ...base.dataExplorer.viewTree,\n ...override.dataExplorer?.viewTree,\n },\n },\n workbench: {\n interactiveTable: {\n ...base.workbench.interactiveTable,\n ...override.workbench?.interactiveTable,\n },\n },\n agentWorkbench: {\n ...base.agentWorkbench,\n ...override.agentWorkbench,\n modes: {\n ...base.agentWorkbench.modes,\n ...override.agentWorkbench?.modes,\n },\n composer: {\n ...base.agentWorkbench.composer,\n ...override.agentWorkbench?.composer,\n },\n quickStart: {\n ...base.agentWorkbench.quickStart,\n ...override.agentWorkbench?.quickStart,\n },\n tool: {\n ...base.agentWorkbench.tool,\n ...override.agentWorkbench?.tool,\n status: {\n ...base.agentWorkbench.tool.status,\n ...override.agentWorkbench?.tool?.status,\n },\n },\n approval: {\n ...base.agentWorkbench.approval,\n ...override.agentWorkbench?.approval,\n },\n artifact: {\n ...base.agentWorkbench.artifact,\n ...override.agentWorkbench?.artifact,\n },\n run: {\n ...base.agentWorkbench.run,\n ...override.agentWorkbench?.run,\n },\n process: {\n ...base.agentWorkbench.process,\n ...override.agentWorkbench?.process,\n },\n artifactWorkspace: {\n ...base.agentWorkbench.artifactWorkspace,\n ...override.agentWorkbench?.artifactWorkspace,\n },\n usage: {\n ...base.agentWorkbench.usage,\n ...override.agentWorkbench?.usage,\n },\n navigation: {\n ...base.agentWorkbench.navigation,\n ...override.agentWorkbench?.navigation,\n },\n details: {\n ...base.agentWorkbench.details,\n ...override.agentWorkbench?.details,\n tabs: {\n ...base.agentWorkbench.details.tabs,\n ...override.agentWorkbench?.details?.tabs,\n },\n status: {\n ...base.agentWorkbench.details.status,\n ...override.agentWorkbench?.details?.status,\n },\n state: {\n loading: {\n ...base.agentWorkbench.details.state.loading,\n ...override.agentWorkbench?.details?.state?.loading,\n },\n empty: {\n ...base.agentWorkbench.details.state.empty,\n ...override.agentWorkbench?.details?.state?.empty,\n },\n error: {\n ...base.agentWorkbench.details.state.error,\n ...override.agentWorkbench?.details?.state?.error,\n },\n },\n actions: {\n ...base.agentWorkbench.details.actions,\n ...override.agentWorkbench?.details?.actions,\n },\n workspace: {\n ...base.agentWorkbench.details.workspace,\n ...override.agentWorkbench?.details?.workspace,\n diffStatus: {\n ...base.agentWorkbench.details.workspace.diffStatus,\n ...override.agentWorkbench?.details?.workspace?.diffStatus,\n },\n fileOperation: {\n ...base.agentWorkbench.details.workspace.fileOperation,\n ...override.agentWorkbench?.details?.workspace?.fileOperation,\n },\n },\n },\n },\n };\n}\n\nexport const defaultMonkeysLocale: MonkeysResolvedLocale = {\n locale: enUS.locale,\n messages: mergeMonkeysLocaleMessages(\n enUS.messages as MonkeysLocaleMessages,\n ),\n};\n\nexport function resolveMonkeysLocale(\n input?: MonkeysLocaleInput,\n override?: MonkeysLocaleMessagesOverride,\n parent?: MonkeysResolvedLocale,\n): MonkeysResolvedLocale {\n if (override !== undefined) {\n assertMessagesOverride(override, 'MonkeysProvider messages');\n }\n const normalized = normalizeLocaleInput(input);\n const locale = normalized.locale ?? parent?.locale ?? enUS.locale;\n const builtInMessages = isBuiltInLocale(locale)\n ? BUILT_IN_LOCALES[locale].messages\n : undefined;\n let messages = mergeMonkeysLocaleMessages(\n enUS.messages as MonkeysLocaleMessages,\n builtInMessages,\n );\n\n if (parent && (!normalized.hasExplicitLocale || parent.locale === locale)) {\n messages = mergeMonkeysLocaleMessages(messages, parent.messages);\n }\n\n messages = mergeMonkeysLocaleMessages(messages, normalized.messages);\n messages = mergeMonkeysLocaleMessages(messages, override);\n\n return { locale, messages };\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type Context,\n} from 'react';\n\nimport type { BaseAppearance } from '../components/base/types';\nimport type { DataExplorerAppearance } from '../components/data-explorer/types';\nimport {\n defaultMonkeysLocale,\n type MonkeysLocaleMessages,\n type MonkeysResolvedLocale,\n} from '../locale';\nimport type { CompiledThemeTokens } from '../theme-system';\n\nexport type MonkeysDirection = 'ltr' | 'rtl';\n\nexport interface MonkeysEnvironment {\n getDocument?: () => Document | null;\n getWindow?: () => Window | null;\n}\n\nexport type MonkeysPortalContainer =\n | Element\n | null\n | (() => Element | null);\n\nexport interface MonkeysPortalOptions {\n container?: MonkeysPortalContainer;\n disabled?: boolean;\n}\n\nexport interface MonkeysComponentAttributes {\n dir?: MonkeysDirection;\n 'data-monkeys-direction'?: MonkeysDirection;\n 'data-monkeys-locale'?: string;\n 'data-monkeys-theme'?: string;\n 'data-monkeys-theme-mode'?: string;\n}\n\ninterface MonkeysLocaleContextValue extends MonkeysResolvedLocale {\n provided: boolean;\n}\n\ninterface MonkeysThemeContextValue {\n provided: boolean;\n resolvedTheme?: CompiledThemeTokens;\n themeId?: string;\n baseAppearance?: BaseAppearance;\n dataExplorerAppearance?: DataExplorerAppearance;\n}\n\ninterface MonkeysDirectionContextValue {\n provided: boolean;\n direction?: MonkeysDirection;\n}\n\ninterface MonkeysEnvironmentContextValue {\n provided: boolean;\n environment: MonkeysEnvironment;\n portal: MonkeysPortalOptions;\n}\n\nconst EMPTY_ENVIRONMENT = Object.freeze({}) satisfies MonkeysEnvironment;\nconst EMPTY_PORTAL = Object.freeze({}) satisfies MonkeysPortalOptions;\n\ninterface MonkeysProviderContexts {\n locale: Context<MonkeysLocaleContextValue>;\n theme: Context<MonkeysThemeContextValue>;\n direction: Context<MonkeysDirectionContextValue>;\n environment: Context<MonkeysEnvironmentContextValue>;\n}\n\n// Every bundled public entry contains this module. Keep only the Context\n// identities in a realm-wide registry so root, provider, and component\n// subpaths interoperate in both CJS and ESM builds. Provider values remain in\n// React trees, so SSR requests are isolated. Bump the contract key only when\n// these Context value shapes become intentionally incompatible.\nconst MONKEYS_PROVIDER_CONTEXTS_KEY = Symbol.for(\n '@inf-monkeys-tech/monkeys-design/provider-context@1',\n);\n\ntype MonkeysProviderContextHost = typeof globalThis & {\n [MONKEYS_PROVIDER_CONTEXTS_KEY]?: MonkeysProviderContexts;\n};\n\nfunction createMonkeysProviderContexts(): MonkeysProviderContexts {\n return Object.freeze({\n locale: createContext<MonkeysLocaleContextValue>({\n ...defaultMonkeysLocale,\n provided: false,\n }),\n theme: createContext<MonkeysThemeContextValue>({\n provided: false,\n }),\n direction: createContext<MonkeysDirectionContextValue>({\n provided: false,\n }),\n environment: createContext<MonkeysEnvironmentContextValue>({\n provided: false,\n environment: EMPTY_ENVIRONMENT,\n portal: EMPTY_PORTAL,\n }),\n });\n}\n\nfunction getMonkeysProviderContexts(): MonkeysProviderContexts {\n const host = globalThis as MonkeysProviderContextHost;\n const existing = host[MONKEYS_PROVIDER_CONTEXTS_KEY];\n if (existing) return existing;\n\n const contexts = createMonkeysProviderContexts();\n Object.defineProperty(host, MONKEYS_PROVIDER_CONTEXTS_KEY, {\n value: contexts,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return contexts;\n}\n\nconst providerContexts = getMonkeysProviderContexts();\n\nexport const MonkeysLocaleContext = providerContexts.locale;\n\nexport const MonkeysThemeContext = providerContexts.theme;\n\nexport const MonkeysDirectionContext = providerContexts.direction;\n\nexport const MonkeysEnvironmentContext = providerContexts.environment;\n\nfunction mergeAppearance<T extends { slots?: object; styles?: object }>(\n inherited: T | undefined,\n explicit: T | undefined,\n): T | undefined {\n if (explicit === undefined) return inherited;\n if (inherited === undefined) return explicit;\n\n return {\n ...inherited,\n ...explicit,\n slots:\n inherited.slots || explicit.slots\n ? { ...inherited.slots, ...explicit.slots }\n : undefined,\n styles:\n inherited.styles || explicit.styles\n ? { ...inherited.styles, ...explicit.styles }\n : undefined,\n };\n}\n\nexport function useMonkeysLocale() {\n return useContext(MonkeysLocaleContext);\n}\n\nexport function useMonkeysLocaleMessages(): MonkeysLocaleMessages {\n return useContext(MonkeysLocaleContext).messages;\n}\n\nexport function useMonkeysResolvedTheme() {\n return useContext(MonkeysThemeContext).resolvedTheme;\n}\n\nexport function useMonkeysBaseAppearance(\n explicit?: BaseAppearance,\n): BaseAppearance | undefined {\n const inherited = useContext(MonkeysThemeContext).baseAppearance;\n return useMemo(\n () => mergeAppearance(inherited, explicit),\n [explicit, inherited],\n );\n}\n\nexport function useMonkeysDataExplorerAppearance(\n explicit?: DataExplorerAppearance,\n): DataExplorerAppearance | undefined {\n const inherited = useContext(MonkeysThemeContext).dataExplorerAppearance;\n return useMemo(\n () => mergeAppearance(inherited, explicit),\n [explicit, inherited],\n );\n}\n\nexport function useMonkeysDirection() {\n return useContext(MonkeysDirectionContext).direction;\n}\n\nexport function useMonkeysEnvironment() {\n return useContext(MonkeysEnvironmentContext).environment;\n}\n\nexport function useMonkeysPortalOptions() {\n return useContext(MonkeysEnvironmentContext).portal;\n}\n\nexport function useMonkeysComponentAttributes(): MonkeysComponentAttributes {\n const locale = useContext(MonkeysLocaleContext);\n const theme = useContext(MonkeysThemeContext);\n const direction = useContext(MonkeysDirectionContext);\n const providerActive = locale.provided || theme.provided || direction.provided;\n\n return useMemo(\n () =>\n providerActive\n ? {\n dir: direction.direction,\n 'data-monkeys-direction': direction.direction,\n 'data-monkeys-locale': locale.locale,\n 'data-monkeys-theme': theme.themeId,\n 'data-monkeys-theme-mode': theme.resolvedTheme?.colorMode,\n }\n : {},\n [\n direction.direction,\n locale.locale,\n providerActive,\n theme.resolvedTheme?.colorMode,\n theme.themeId,\n ],\n );\n}\n","import type { ReactNode } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...parts: Array<string | false | null | undefined>) {\n return twMerge(parts.filter(Boolean).join(' '));\n}\n\nexport function hasRenderableNode(node: ReactNode) {\n return node !== undefined && node !== null && typeof node !== 'boolean';\n}\n\nexport function hasNonEmptyRenderableNode(node: ReactNode) {\n if (typeof node === 'string') return node.trim().length > 0;\n return hasRenderableNode(node);\n}\n","import {\n Fragment,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { BaseButton, BaseTooltip, type BaseAppearance } from \"../base\";\nexport { AppShellSidebar } from \"./AppShellSidebar\";\nexport type {\n AppShellSidebarClassNames,\n AppShellSidebarProps,\n} from \"./AppShellSidebar\";\nexport { UserAccountMenu } from \"./UserAccountMenu\";\nexport type {\n UserAccountMenuClassNames,\n UserAccountMenuItem,\n UserAccountMenuProps,\n UserAccountMenuRadius,\n UserAccountMenuSelectorConfig,\n UserAccountMenuSelectorOption,\n UserAccountMenuSide,\n UserAccountMenuTriggerVariant,\n UserAccountMenuUser,\n} from \"./UserAccountMenu\";\n\n// ============================================================\n// cn utility (inline clsx + tailwind-merge–lite for zero deps)\n// ============================================================\nexport function cn(...inputs: (string | undefined | null | false)[]): string {\n return inputs.filter(Boolean).join(\" \");\n}\n\n// ============================================================\n// NavButton\n// ============================================================\nexport interface NavButtonProps {\n /** 是否处于激活状态 */\n active?: boolean;\n /** 左侧图标 */\n icon?: ReactNode;\n /** 右侧附加内容(如 chevron) */\n postfix?: ReactNode;\n /** 点击回调 */\n onClick?: () => void;\n className?: string;\n children: ReactNode;\n}\n\nexport function NavButton({\n active,\n icon,\n postfix,\n onClick,\n className,\n children,\n}: NavButtonProps) {\n return (\n <div\n className={cn(\n \"flex w-full cursor-pointer select-none items-center gap-2 rounded-xl border p-2 text-xs text-[hsl(var(--foreground))] transition-colors\",\n active\n ? \"border-[hsl(var(--input))] bg-[hsl(var(--muted))] font-bold\"\n : \"border-transparent hover:border-[hsl(var(--input))]/60 hover:bg-[hsl(var(--muted))]/60\",\n className,\n )}\n onClick={onClick}\n >\n <div className=\"w-[20px] [&_svg]:h-[16px] [&_svg]:w-[16px]\">{icon}</div>\n <span className=\"text-sm\">{children}</span>\n {postfix}\n </div>\n );\n}\n\n// ============================================================\n// AppHeader\n// ============================================================\nexport interface HeaderTab {\n id: string;\n label: string;\n}\n\nexport interface AppHeaderLogo {\n /** Logo 图片 URL,若为空则显示 fallback */\n url?: string;\n /** 品牌名称 */\n title: string;\n /** 点击 Logo 回调 */\n onClick?: () => void;\n}\n\nexport interface AppHeaderUser {\n name?: string;\n email?: string;\n photo?: string;\n}\n\nexport interface AppHeaderProps {\n /** 品牌 Logo */\n logo: AppHeaderLogo;\n /** 导航 tabs */\n tabs?: HeaderTab[];\n /** 当前激活的 tab id */\n activeTab?: string;\n /** tab 切换回调 */\n onTabChange?: (tabId: string) => void;\n /** 用户信息 */\n user?: AppHeaderUser;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 用户菜单中的额外菜单项(在退出登录按钮之前渲染) */\n userMenuItems?: ReactNode;\n /** header 右侧额外内容 */\n extra?: ReactNode;\n className?: string;\n}\n\nexport function AppHeader({\n logo,\n tabs,\n activeTab,\n onTabChange,\n user,\n onLogout,\n logoutLabel = \"退出登录\",\n userMenuItems,\n extra,\n className,\n}: AppHeaderProps) {\n const getUserInitials = (name: string) =>\n name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n\n return (\n <header\n className={cn(\n \"flex h-[72px] w-full shrink-0 items-center justify-between gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]\",\n className,\n )}\n >\n {/* Logo */}\n <div\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\n onClick={logo.onClick}\n >\n <div\n className={cn(\n \"flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden\",\n logo.url\n ? \"bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"h-full w-full object-contain\"\n />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">\n {logo.title}\n </span>\n </div>\n\n {/* Separator + Tabs */}\n {tabs && tabs.length > 0 && (\n <>\n <div className=\"h-1/2 w-px bg-[hsl(var(--border))]\" />\n <div className=\"flex flex-1 items-center\">\n <div className=\"inline-flex h-9 items-center gap-1 rounded-md bg-transparent p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all\",\n tab.id === activeTab\n ? \"bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm\"\n : \"text-[hsl(var(--muted-foreground))] hover:bg-[hsl(var(--muted))]/50\",\n )}\n onClick={() => onTabChange?.(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n {(!tabs || tabs.length === 0) && <div className=\"flex-1\" />}\n\n {/* Right side */}\n <div className=\"flex shrink-0 items-center gap-4\">\n {extra}\n {user && (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button className=\"flex h-8 w-8 items-center justify-center rounded-full hover:ring-2 hover:ring-[hsl(var(--ring))]/20 transition-all overflow-hidden focus-visible:outline-none\">\n {user.photo ? (\n <img\n src={user.photo}\n alt={user.name}\n className=\"h-8 w-8 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : \"U\"}\n </div>\n )}\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 w-52 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95\"\n sideOffset={5}\n align=\"end\"\n >\n {/* User info label */}\n <DropdownMenu.Label className=\"flex items-center gap-2 px-2 py-1.5 font-normal\">\n {user.photo ? (\n <img\n src={user.photo}\n alt={user.name}\n className=\"h-8 w-8 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : \"U\"}\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium leading-none\">\n {user.name}\n </span>\n {user.email && (\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] leading-none mt-1\">\n {user.email}\n </span>\n )}\n </div>\n </DropdownMenu.Label>\n\n <DropdownMenu.Separator className=\"h-px bg-[hsl(var(--border))] my-1\" />\n\n <DropdownMenu.Group>\n {userMenuItems}\n\n {/* Logout */}\n <DropdownMenu.Item\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-[hsl(var(--destructive))] outline-none transition-colors hover:bg-[hsl(var(--accent))]\"\n onSelect={() => onLogout?.()}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n {logoutLabel}\n </DropdownMenu.Item>\n </DropdownMenu.Group>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )}\n </div>\n </header>\n );\n}\n\n// ============================================================\n// AppSidebar\n// ============================================================\nexport interface SidebarNavItem {\n id: string;\n label: string;\n icon?: ReactNode;\n /** 如果有 children 则为分组,点击展开/折叠 */\n children?: SidebarNavItem[];\n}\n\nexport interface SidebarAccount {\n name?: string;\n photo?: string;\n}\n\nexport interface AppSidebarProps {\n /** Logo */\n logo?: AppHeaderLogo;\n /** 导航菜单 */\n navItems: SidebarNavItem[];\n /** 当前路径/激活的 item id */\n activeItemId?: string;\n /** 点击导航项回调 */\n onNavigate?: (itemId: string) => void;\n /** 账户信息 */\n account?: SidebarAccount;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 底部额外内容(如版本号) */\n footer?: ReactNode;\n /** 默认展开的分组 id 列表 */\n defaultExpandedGroups?: string[];\n className?: string;\n}\n\nexport function AppSidebar({\n logo,\n navItems,\n activeItemId,\n onNavigate,\n account,\n onLogout,\n logoutLabel = \"退出登录\",\n footer,\n defaultExpandedGroups,\n className,\n}: AppSidebarProps) {\n return (\n <div\n className={cn(\n \"flex w-[13.7rem] shrink-0 flex-col justify-between gap-[var(--global-spacing,0.75rem)] overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-5\",\n className,\n )}\n >\n {/* Logo */}\n {logo && (\n <div\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\n onClick={logo.onClick}\n >\n <div\n className={cn(\n \"flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden\",\n logo.url\n ? \"bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"h-full w-full object-contain\"\n />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">\n {logo.title}\n </span>\n </div>\n )}\n\n {/* Navigation */}\n <SidebarNavList\n items={navItems}\n activeItemId={activeItemId}\n onNavigate={onNavigate}\n defaultExpandedGroups={defaultExpandedGroups}\n />\n\n {/* Account Section */}\n {(account || footer) && (\n <div className=\"flex flex-col gap-2\">\n {account && (\n <div className=\"flex w-full flex-col gap-2 rounded-lg bg-[hsl(var(--muted))] p-2 shadow-sm\">\n <div className=\"flex w-full items-center justify-between px-3 py-1\">\n <div className=\"flex items-center gap-2\">\n {account.photo ? (\n <img\n src={account.photo}\n alt={account.name}\n className=\"h-5 w-5 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-[10px] font-medium\">\n {account.name\n ? account.name.charAt(0).toUpperCase()\n : \"U\"}\n </div>\n )}\n <span className=\"text-xs font-medium truncate max-w-[100px]\">\n {account.name}\n </span>\n </div>\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"flex items-center justify-center text-[hsl(var(--destructive))] hover:opacity-80 transition-opacity\"\n title={logoutLabel}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )}\n {footer}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================\n// SidebarNavList (internal accordion-style nav)\n// ============================================================\ninterface SidebarNavListProps {\n items: SidebarNavItem[];\n activeItemId?: string;\n onNavigate?: (itemId: string) => void;\n defaultExpandedGroups?: string[];\n}\n\nfunction SidebarNavList({\n items,\n activeItemId,\n onNavigate,\n defaultExpandedGroups,\n}: SidebarNavListProps) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\n const map: Record<string, boolean> = {};\n (defaultExpandedGroups ?? items.map((i) => i.id)).forEach((id) => {\n map[id] = true;\n });\n return map;\n });\n const [localActiveItemId, setLocalActiveItemId] = useState<\n string | undefined\n >(activeItemId);\n\n useEffect(() => {\n if (activeItemId !== undefined) {\n setLocalActiveItemId(activeItemId);\n }\n }, [activeItemId]);\n\n const toggle = (id: string) => {\n setExpanded((prev: Record<string, boolean>) => ({\n ...prev,\n [id]: !prev[id],\n }));\n };\n const resolvedActiveItemId = activeItemId ?? localActiveItemId;\n\n return (\n <div\n className=\"h-full flex-1 overflow-y-auto\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n <style>{`.monkeys-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\n <div className=\"monkeys-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\">\n {items.map((item) => {\n if (item.children && item.children.length > 0) {\n const isExpanded = expanded[item.id] ?? true;\n return (\n <div key={item.id}>\n <NavButton\n icon={item.icon}\n onClick={() => toggle(item.id)}\n postfix={\n <div className=\"flex flex-1 justify-end\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\n style={{\n transform: isExpanded\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n }}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </div>\n }\n >\n {item.label}\n </NavButton>\n {isExpanded && (\n <div className=\"flex flex-col gap-1 mt-1\">\n {item.children.map((child) => (\n <NavButton\n key={child.id}\n active={child.id === resolvedActiveItemId}\n onClick={() => {\n setLocalActiveItemId(child.id);\n onNavigate?.(child.id);\n }}\n >\n {child.label}\n </NavButton>\n ))}\n </div>\n )}\n </div>\n );\n }\n return (\n <NavButton\n key={item.id}\n icon={item.icon}\n active={item.id === resolvedActiveItemId}\n onClick={() => {\n setLocalActiveItemId(item.id);\n onNavigate?.(item.id);\n }}\n >\n {item.label}\n </NavButton>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ============================================================\n// AppLayout\n// ============================================================\nexport interface AppLayoutProps {\n /** header 组件 */\n header?: ReactNode;\n /** sidebar 组件 */\n sidebar?: ReactNode;\n /** 主内容 */\n children: ReactNode;\n /** 是否 flush 布局(无内边距) */\n flush?: boolean;\n className?: string;\n}\n\nexport function AppLayout({\n header,\n sidebar,\n children,\n flush = false,\n className,\n}: AppLayoutProps) {\n return (\n <div\n className={cn(\n \"flex h-screen flex-col gap-[var(--global-spacing,0.75rem)] overflow-hidden p-[var(--global-spacing,0.75rem)]\",\n className,\n )}\n style={{ backgroundColor: \"hsl(var(--muted))\" }}\n >\n {header ? header : null}\n <div className=\"flex flex-1 gap-[var(--global-spacing,0.75rem)] overflow-hidden min-h-0\">\n {sidebar ? sidebar : null}\n <main\n className={cn(\n \"flex-1 min-h-0 overflow-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))]\",\n !flush && \"overflow-y-auto\",\n )}\n >\n {flush ? (\n children\n ) : (\n <div className=\"h-full overflow-y-auto\">{children}</div>\n )}\n </main>\n </div>\n </div>\n );\n}\n\n// ============================================================\n// NavigationLayout\n// ============================================================\nexport type NavigationMode = \"sidebar\" | \"headbar\";\nexport type HeadbarLayoutMode = \"boxed\" | \"full-bleed\";\nexport type HeadbarMenuRadius =\n \"default\" | \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\nexport type HeadbarNavPosition = \"left\" | \"center\" | \"right\";\nexport type HeadbarSurface = \"card\" | \"glassy\" | \"ghost\";\n\nexport interface LayoutNavItem {\n id: string;\n label: ReactNode;\n headbarLabel?: ReactNode;\n icon?: ReactNode;\n children?: LayoutNavItem[];\n disabled?: boolean;\n trailing?: ReactNode;\n headbarSecondaryAction?: ReactNode;\n}\n\ninterface NavigationLayoutAction {\n id: string;\n label: ReactNode;\n title?: string;\n icon?: ReactNode;\n onClick?: () => void;\n}\n\nexport interface HeadbarLayout {\n brandTitle?: ReactNode;\n heightPx?: number;\n layoutMode?: HeadbarLayoutMode;\n menuRadius?: HeadbarMenuRadius;\n navPosition?: HeadbarNavPosition;\n surface?: HeadbarSurface;\n}\n\nexport interface NavigationLayoutProps {\n activeItemId?: string;\n activeRootId?: string;\n allowModeSwitch?: boolean;\n accountMenu?: ReactNode;\n children: ReactNode;\n className?: string;\n collapsedSidebarAccountMenu?: ReactNode;\n collapsedSidebarWidth?: string;\n defaultMode?: NavigationMode;\n defaultSidebarCollapsed?: boolean;\n expandedSidebarWidth?: string;\n expandSidebarLabel?: string;\n flush?: boolean;\n headbarActions?: ReactNode;\n headbarLayout?: HeadbarLayout;\n logo?: AppHeaderLogo;\n mode?: NavigationMode;\n navItems: LayoutNavItem[];\n onModeChange?: (mode: NavigationMode) => void;\n onNavigate?: (itemId: string) => void;\n onSidebarCollapsedChange?: (collapsed: boolean) => void;\n renderHeadbarExtra?: ReactNode;\n collapseSidebarLabel?: string;\n sidebarCollapsed?: boolean;\n sidebarAccountMenu?: ReactNode;\n sidebarFooter?: ReactNode;\n sidebarHeader?: ReactNode;\n switchToHeadbarLabel?: string;\n switchToSidebarLabel?: string;\n}\n\nconst NAVIGATION_LAYOUT_SIDEBAR_EXPANDED_WIDTH = \"13.7rem\";\nconst NAVIGATION_LAYOUT_SIDEBAR_COLLAPSED_WIDTH = \"4.25rem\";\nconst NAVIGATION_LAYOUT_TRANSITION_TIMING = \"cubic-bezier(0.22, 1, 0.36, 1)\";\nconst NAVIGATION_LAYOUT_HEADBAR_DEFAULT_HEIGHT_PX = 72;\nconst NAVIGATION_LAYOUT_HEADBAR_MIN_HEIGHT_PX = 56;\nconst NAVIGATION_LAYOUT_HEADBAR_MAX_HEIGHT_PX = 120;\nconst NAVIGATION_LAYOUT_HEADBAR_COMPACT_HEIGHT_THRESHOLD_PX = 64;\nconst NAVIGATION_LAYOUT_HEADBAR_BOXED_VERTICAL_PADDING_PX = 12;\nconst NAVIGATION_LAYOUT_HEADBAR_COMPACT_VERTICAL_PADDING_PX = 8;\nconst NAVIGATION_LAYOUT_HEADBAR_LOGO_DEFAULT_SIZE_PX = 44;\nconst NAVIGATION_LAYOUT_HEADBAR_LOGO_COMPACT_SIZE_PX = 36;\nconst NAVIGATION_LAYOUT_DEFAULT_APPEARANCE: BaseAppearance = {\n preset: \"soft\",\n density: \"compact\",\n radius: \"lg\",\n border: \"subtle\",\n background: \"soft\",\n};\n\nconst NAVIGATION_LAYOUT_MENU_RADIUS_CLASS_MAP: Record<\n Exclude<HeadbarMenuRadius, \"default\">,\n { all: string; left: string; right: string }\n> = {\n none: { all: \"rounded-none\", left: \"!rounded-none\", right: \"!rounded-none\" },\n sm: {\n all: \"rounded-sm\",\n left: \"!rounded-l-sm !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-sm\",\n },\n md: {\n all: \"rounded-md\",\n left: \"!rounded-l-md !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-md\",\n },\n lg: {\n all: \"rounded-lg\",\n left: \"!rounded-l-lg !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-lg\",\n },\n xl: {\n all: \"rounded-xl\",\n left: \"!rounded-l-xl !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-xl\",\n },\n full: {\n all: \"rounded-full\",\n left: \"!rounded-l-full !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-full\",\n },\n};\n\nfunction clampHeadbarHeight(value?: number) {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n return NAVIGATION_LAYOUT_HEADBAR_DEFAULT_HEIGHT_PX;\n return Math.min(\n NAVIGATION_LAYOUT_HEADBAR_MAX_HEIGHT_PX,\n Math.max(NAVIGATION_LAYOUT_HEADBAR_MIN_HEIGHT_PX, Math.round(value)),\n );\n}\n\nfunction getHeadbarVerticalPaddingPx(heightPx: number) {\n return heightPx <= NAVIGATION_LAYOUT_HEADBAR_COMPACT_HEIGHT_THRESHOLD_PX\n ? NAVIGATION_LAYOUT_HEADBAR_COMPACT_VERTICAL_PADDING_PX\n : NAVIGATION_LAYOUT_HEADBAR_BOXED_VERTICAL_PADDING_PX;\n}\n\nfunction getHeadbarLogoSizePx(heightPx: number) {\n return heightPx <= NAVIGATION_LAYOUT_HEADBAR_COMPACT_HEIGHT_THRESHOLD_PX\n ? NAVIGATION_LAYOUT_HEADBAR_LOGO_COMPACT_SIZE_PX\n : NAVIGATION_LAYOUT_HEADBAR_LOGO_DEFAULT_SIZE_PX;\n}\n\nfunction getHeadbarMenuRadiusClass(\n menuRadius: HeadbarMenuRadius = \"default\",\n part: \"all\" | \"left\" | \"right\" = \"all\",\n) {\n if (menuRadius === \"default\") {\n if (part === \"left\") return \"rounded-l-lg rounded-r-none\";\n if (part === \"right\") return \"rounded-l-none rounded-r-lg\";\n return \"rounded-lg\";\n }\n return NAVIGATION_LAYOUT_MENU_RADIUS_CLASS_MAP[menuRadius][part];\n}\n\nfunction getHeadbarFrameClass(\n layoutMode: HeadbarLayoutMode = \"boxed\",\n navPosition: HeadbarNavPosition = \"center\",\n) {\n const columns =\n navPosition === \"center\"\n ? \"grid-cols-[minmax(max-content,1fr)_minmax(0,max-content)_minmax(max-content,1fr)]\"\n : \"grid-cols-[max-content_minmax(0,1fr)_max-content]\";\n return layoutMode === \"full-bleed\"\n ? cn(\n \"sticky top-0 z-40 grid w-full shrink-0 items-center gap-4 rounded-none border-b border-x-0 border-t-0 border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]\",\n columns,\n )\n : cn(\n \"sticky top-0 z-40 grid w-full shrink-0 items-center gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]\",\n columns,\n );\n}\n\nfunction getHeadbarFrameStyle(\n layoutMode: HeadbarLayoutMode = \"boxed\",\n heightPx: number,\n surface: HeadbarSurface = \"card\",\n): CSSProperties {\n const verticalPaddingPx = getHeadbarVerticalPaddingPx(heightPx);\n const fallbackBackground = \"hsl(var(--background))\";\n const style: CSSProperties = {\n height: `var(--monkeys-component-navigation-headbar-height, ${heightPx}px)`,\n minHeight: `var(--monkeys-component-navigation-headbar-height, ${heightPx}px)`,\n paddingTop: `${verticalPaddingPx}px`,\n paddingBottom: `${verticalPaddingPx}px`,\n background: `var(--monkeys-component-navigation-headbar-frame-background, ${fallbackBackground})`,\n color:\n \"var(--monkeys-component-navigation-headbar-frame-foreground, hsl(var(--foreground)))\",\n borderColor:\n surface === \"glassy\"\n ? \"var(--monkeys-component-navigation-headbar-frame-border-color, rgb(255 255 255 / 0.5))\"\n : \"var(--monkeys-component-navigation-headbar-frame-border-color, hsl(var(--input)))\",\n borderRadius:\n layoutMode === \"full-bleed\"\n ? \"0\"\n : \"var(--monkeys-component-navigation-headbar-frame-radius, var(--radius, 0.75rem))\",\n boxShadow:\n surface === \"glassy\"\n ? \"var(--monkeys-component-navigation-headbar-frame-shadow, inset 0 0 0 0 rgb(0 0 0 / 0.1))\"\n : \"var(--monkeys-component-navigation-headbar-frame-shadow, none)\",\n backdropFilter: `blur(var(--monkeys-component-navigation-headbar-frame-backdrop-blur, ${surface === \"glassy\" ? \"45px\" : \"0px\"}))`,\n };\n\n if (layoutMode === \"full-bleed\") {\n style.marginLeft = \"calc(var(--global-spacing,0.75rem) * -1)\";\n style.marginRight = \"calc(var(--global-spacing,0.75rem) * -1)\";\n style.marginTop = \"calc(var(--global-spacing,0.75rem) * -1)\";\n style.width = \"calc(100% + (var(--global-spacing,0.75rem) * 2))\";\n }\n\n return style;\n}\n\nfunction getHeadbarNavClass(navPosition: HeadbarNavPosition = \"center\") {\n if (navPosition === \"left\") return \"justify-start\";\n if (navPosition === \"right\") return \"justify-end\";\n return \"justify-center\";\n}\n\nfunction getHeadbarItemStyle(\n active: boolean,\n useTokenRadius = true,\n): CSSProperties {\n return {\n height: \"var(--monkeys-component-navigation-headbar-item-height, 2.25rem)\",\n borderRadius: useTokenRadius\n ? \"var(--monkeys-component-navigation-headbar-item-radius, var(--radius, 0.5rem))\"\n : undefined,\n paddingInline:\n \"var(--monkeys-component-navigation-headbar-item-padding-inline, 0.75rem)\",\n columnGap: \"var(--monkeys-component-navigation-headbar-item-gap, 0.375rem)\",\n color: active\n ? \"var(--monkeys-component-navigation-headbar-item-active-foreground, hsl(var(--foreground)))\"\n : \"var(--monkeys-component-navigation-headbar-item-foreground, hsl(var(--muted-foreground)))\",\n background: active\n ? \"var(--monkeys-component-navigation-headbar-item-active-background, hsl(var(--muted)))\"\n : \"transparent\",\n borderColor: active\n ? \"var(--monkeys-component-navigation-headbar-item-active-border-color, transparent)\"\n : \"transparent\",\n fontSize:\n \"var(--monkeys-component-navigation-headbar-item-font-size, 0.875rem)\",\n fontWeight:\n \"var(--monkeys-component-navigation-headbar-item-font-weight, 500)\",\n };\n}\n\nfunction getHeadbarCompoundStyle(\n active: boolean,\n useTokenRadius = true,\n): CSSProperties {\n return {\n ...getHeadbarItemStyle(active, useTokenRadius),\n paddingInline: undefined,\n columnGap: undefined,\n };\n}\n\nfunction findNavigationRootId(\n items: LayoutNavItem[],\n activeItemId?: string,\n): string | undefined {\n for (const item of items) {\n if (item.id === activeItemId) return item.id;\n if (item.children?.some((child) => child.id === activeItemId))\n return item.id;\n }\n return activeItemId;\n}\n\nfunction getNavigationActionTitle(action: NavigationLayoutAction) {\n return (\n action.title ||\n (typeof action.label === \"string\" ? action.label : undefined)\n );\n}\n\nfunction NavigationLayoutActionButtons({\n actions,\n compact,\n}: {\n actions: NavigationLayoutAction[];\n compact: boolean;\n}) {\n if (!actions.length) return null;\n\n if (compact) {\n return (\n <div className=\"flex flex-col items-center gap-2\">\n {actions.map((action) => {\n const title = getNavigationActionTitle(action);\n return (\n <BaseTooltip\n key={action.id}\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n content={action.label}\n placement=\"right\"\n portal\n >\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n iconOnly\n icon={action.icon}\n onClick={action.onClick}\n title={title}\n ariaLabel={title}\n className={cn(\n \"h-10 w-10 rounded-lg border-transparent text-[hsl(var(--muted-foreground))] shadow-none\",\n \"hover:-translate-y-0.5 hover:border-[hsl(var(--input))]/80 hover:bg-[hsl(var(--muted))] hover:text-[hsl(var(--foreground))]\",\n \"active:translate-y-0 active:scale-[0.96]\",\n )}\n />\n </BaseTooltip>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {actions.map((action) => (\n <BaseButton\n key={action.id}\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n icon={action.icon}\n label={<span className=\"truncate\">{action.label}</span>}\n onClick={action.onClick}\n title={getNavigationActionTitle(action)}\n className={cn(\n \"h-9 w-full justify-start gap-2.5 rounded-lg border-transparent px-3 text-left text-[13px] text-[hsl(var(--muted-foreground))] shadow-none\",\n \"hover:-translate-y-0.5 hover:border-[hsl(var(--input))]/80 hover:bg-[hsl(var(--muted))]/70 hover:text-[hsl(var(--foreground))]\",\n \"active:translate-y-0 active:scale-[0.985]\",\n )}\n />\n ))}\n </div>\n );\n}\n\nfunction SidebarNavigationList({\n activeItemId,\n items,\n onNavigate,\n revealRequest,\n}: {\n activeItemId?: string;\n items: LayoutNavItem[];\n onNavigate?: (itemId: string) => void;\n revealRequest?: { id: string; nonce: number } | null;\n}) {\n const navRef = useRef<HTMLDivElement | null>(null);\n const [expandedByRoot, setExpandedByRoot] = useState<Record<string, boolean>>(\n {},\n );\n\n const toggleRoot = (id: string) => {\n setExpandedByRoot((current) => ({\n ...current,\n [id]: !current[id],\n }));\n };\n\n useEffect(() => {\n if (!revealRequest) return;\n setExpandedByRoot((current) => ({\n ...current,\n [revealRequest.id]: true,\n }));\n\n const frameId = window.requestAnimationFrame(() => {\n const targetElement = navRef.current?.querySelector(\n `[data-navigation-sidebar-root-id=\"${CSS.escape(revealRequest.id)}\"]`,\n );\n if (targetElement instanceof HTMLElement) {\n targetElement.scrollIntoView({\n behavior: \"auto\",\n block: \"nearest\",\n inline: \"nearest\",\n });\n }\n });\n\n return () => window.cancelAnimationFrame(frameId);\n }, [revealRequest]);\n\n return (\n <div\n className=\"h-full flex-1 overflow-y-auto\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n <style>{`.monkeys-navigation-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\n <div\n ref={navRef}\n className=\"monkeys-navigation-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\"\n >\n {items.map((item) => {\n const isGroup = Boolean(item.children?.length);\n const isExpanded = Boolean(expandedByRoot[item.id]);\n const isActive = activeItemId === item.id;\n\n if (isGroup) {\n return (\n <div key={item.id} data-navigation-sidebar-root-id={item.id}>\n <NavButton\n icon={item.icon}\n onClick={() => toggleRoot(item.id)}\n postfix={\n <div className=\"flex flex-1 justify-end\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\n style={{\n transform: isExpanded\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n }}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </div>\n }\n >\n {item.label}\n </NavButton>\n {isExpanded ? (\n <div className=\"mt-1 flex flex-col gap-1\">\n {item.children?.map((child) => (\n <NavButton\n key={child.id}\n active={activeItemId === child.id}\n onClick={() => onNavigate?.(child.id)}\n >\n {child.label}\n </NavButton>\n ))}\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div key={item.id} data-navigation-sidebar-root-id={item.id}>\n <NavButton\n active={isActive}\n icon={item.icon}\n onClick={() => onNavigate?.(item.id)}\n >\n {item.label}\n </NavButton>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction SidebarBrand({\n collapsed,\n logo,\n title,\n}: {\n collapsed?: boolean;\n logo?: AppHeaderLogo;\n title?: ReactNode;\n}) {\n if (!logo) return null;\n\n const brandTitle = title ?? logo.title;\n const logoMark = (\n <div\n className={cn(\n \"flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-lg\",\n logo.url\n ? \"bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"h-full w-full object-contain\"\n />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n );\n\n if (collapsed) {\n return (\n <BaseTooltip\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n content={brandTitle}\n placement=\"right\"\n portal\n >\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n ariaLabel={typeof brandTitle === \"string\" ? brandTitle : logo.title}\n className=\"h-10 w-10 rounded-lg border-transparent bg-transparent p-0 shadow-none hover:bg-[hsl(var(--muted))]/60\"\n icon={logoMark}\n iconOnly\n onClick={logo.onClick}\n title={typeof brandTitle === \"string\" ? brandTitle : logo.title}\n tone=\"muted\"\n />\n </BaseTooltip>\n );\n }\n\n return (\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n ariaLabel={logo.title}\n className=\"h-auto w-full justify-start gap-3 border-transparent bg-transparent p-0 text-left shadow-none hover:bg-transparent\"\n classNames={{ icon: \"h-9 w-9\" }}\n icon={logoMark}\n label={\n <span className=\"min-w-0 truncate text-sm font-semibold text-[hsl(var(--foreground))]\">\n {brandTitle}\n </span>\n }\n onClick={logo.onClick}\n title={typeof brandTitle === \"string\" ? brandTitle : logo.title}\n tone=\"muted\"\n />\n );\n}\n\nfunction Sidebar({\n accountMenu,\n activeItemId,\n actions = [],\n collapsed,\n collapsedAccountMenu,\n footer,\n header,\n items,\n logo,\n onCollapsedChange,\n onNavigate,\n onRevealRoot,\n revealRequest,\n title,\n}: {\n accountMenu?: ReactNode;\n activeItemId?: string;\n actions?: NavigationLayoutAction[];\n collapsed?: boolean;\n collapsedAccountMenu?: ReactNode;\n footer?: ReactNode;\n header?: ReactNode;\n items: LayoutNavItem[];\n logo?: AppHeaderLogo;\n onCollapsedChange?: (collapsed: boolean) => void;\n onNavigate?: (itemId: string) => void;\n onRevealRoot?: (rootId: string) => void;\n revealRequest?: { id: string; nonce: number } | null;\n title?: ReactNode;\n}) {\n if (collapsed) {\n const activeRootId = findNavigationRootId(items, activeItemId);\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-2 shadow-sm\">\n <div className=\"mb-3 flex shrink-0 justify-center\">\n {header ?? <SidebarBrand collapsed logo={logo} title={title} />}\n </div>\n <div\n className=\"flex min-h-0 flex-1 flex-col items-center gap-2 overflow-y-auto pb-3\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {items.map((item) => {\n const isActive = activeRootId === item.id;\n return (\n <BaseTooltip\n key={item.id}\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n content={item.label}\n placement=\"right\"\n portal\n >\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n active={isActive}\n iconOnly\n icon={item.icon}\n onClick={() => {\n onRevealRoot?.(item.id);\n onCollapsedChange?.(false);\n if (item.children?.length) return;\n onNavigate?.(item.id);\n }}\n title={\n typeof item.label === \"string\" ? item.label : undefined\n }\n ariaLabel={\n typeof item.label === \"string\" ? item.label : item.id\n }\n className={cn(\n \"h-10 w-10 rounded-lg border text-[hsl(var(--muted-foreground))] shadow-none\",\n \"hover:-translate-y-0.5 active:translate-y-0 active:scale-[0.96]\",\n isActive\n ? \"border-[hsl(var(--input))] bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm\"\n : \"border-transparent hover:border-[hsl(var(--input))]/80 hover:bg-[hsl(var(--muted))]/70 hover:text-[hsl(var(--foreground))]\",\n )}\n />\n </BaseTooltip>\n );\n })}\n </div>\n <div className=\"-mx-2 mt-2 border-t border-[hsl(var(--input))] bg-[hsl(var(--background))] px-2 pt-2.5 pb-0.5\">\n <NavigationLayoutActionButtons actions={actions} compact />\n {collapsedAccountMenu ? (\n <div className=\"mt-2 flex justify-center border-t border-[hsl(var(--input))] pt-2\">\n {collapsedAccountMenu}\n </div>\n ) : null}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col justify-between gap-0 overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] px-5 pt-5 pb-1.5\">\n <div className=\"mb-4 shrink-0\">\n {header ?? <SidebarBrand logo={logo} title={title} />}\n </div>\n <SidebarNavigationList\n activeItemId={activeItemId}\n items={items}\n onNavigate={onNavigate}\n revealRequest={revealRequest}\n />\n <div className=\"-mx-5 mt-2 border-t border-[hsl(var(--input))] bg-[hsl(var(--background))] px-4 pt-2.5 pb-1\">\n <NavigationLayoutActionButtons actions={actions} compact={false} />\n {footer}\n {accountMenu ? (\n <div className=\"mt-2 border-t border-[hsl(var(--input))] pt-2\">\n {accountMenu}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction HeadbarChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\n \"h-4 w-4 shrink-0 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction HeadbarNavMenuItem({\n activeItemId,\n compound,\n isActive,\n item,\n label,\n menuButtonRadiusClass,\n menuContentRadiusClass,\n menuItemRadiusClass,\n onNavigate,\n useTokenRadius,\n}: {\n activeItemId?: string;\n compound?: boolean;\n isActive: boolean;\n item: LayoutNavItem;\n label: ReactNode;\n menuButtonRadiusClass: string;\n menuContentRadiusClass: string;\n menuItemRadiusClass: string;\n onNavigate?: (itemId: string) => void;\n useTokenRadius: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wasOpenOnPointerDownRef = useRef(false);\n\n const clearCloseTimer = () => {\n if (!closeTimerRef.current) return;\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n };\n\n const openMenu = () => {\n clearCloseTimer();\n setOpen(true);\n };\n\n const scheduleCloseMenu = () => {\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setOpen(false);\n closeTimerRef.current = null;\n }, 120);\n };\n\n const navigateToFirstEnabledChild = () => {\n const firstEnabledChild = item.children?.find((child) => !child.disabled);\n if (!firstEnabledChild) return false;\n\n setOpen(false);\n onNavigate?.(firstEnabledChild.id);\n return true;\n };\n\n useEffect(() => clearCloseTimer, []);\n\n return (\n <DropdownMenu.Root modal={false} open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n active={isActive || open}\n icon={item.icon}\n endIcon={<HeadbarChevronIcon open={open} />}\n label={<span className=\"truncate whitespace-nowrap\">{label}</span>}\n disabled={item.disabled}\n onClick={() => {\n const wasOpenOnPointerDown = wasOpenOnPointerDownRef.current;\n wasOpenOnPointerDownRef.current = false;\n if (wasOpenOnPointerDown && navigateToFirstEnabledChild()) return;\n setOpen(true);\n }}\n onPointerDown={() => {\n wasOpenOnPointerDownRef.current = open;\n }}\n onPointerCancel={() => {\n wasOpenOnPointerDownRef.current = false;\n }}\n onKeyDown={(event) => {\n if (!open || (event.key !== \"Enter\" && event.key !== \" \")) return;\n if (navigateToFirstEnabledChild()) event.preventDefault();\n }}\n onMouseEnter={openMenu}\n onMouseLeave={scheduleCloseMenu}\n style={getHeadbarItemStyle(\n isActive || open,\n compound ? false : useTokenRadius,\n )}\n classNames={{\n icon: \"text-[inherit] [&_*]:!text-[inherit] [&_svg]:!stroke-current\",\n label: \"text-[inherit] [&_*]:!text-[inherit]\",\n }}\n className={cn(\n \"max-w-[12rem] shrink-0 border shadow-none\",\n compound && \"!rounded-none !border-0 !bg-transparent\",\n menuButtonRadiusClass,\n isActive || open\n ? \"\"\n : \"hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--muted)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--foreground)))]\",\n )}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={5}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onMouseEnter={openMenu}\n onMouseLeave={scheduleCloseMenu}\n className={cn(\n \"z-50 min-w-56 border p-1.5 animate-in fade-in-0 zoom-in-95\",\n menuContentRadiusClass,\n )}\n style={{\n background:\n \"var(--monkeys-component-navigation-headbar-menu-background, hsl(var(--popover)))\",\n borderColor:\n \"var(--monkeys-component-navigation-headbar-menu-border-color, hsl(var(--border)))\",\n color:\n \"var(--monkeys-component-navigation-headbar-menu-foreground, hsl(var(--popover-foreground)))\",\n boxShadow:\n \"var(--monkeys-component-navigation-headbar-menu-shadow, 0 10px 15px -3px rgb(0 0 0 / 0.1))\",\n backdropFilter:\n \"blur(var(--monkeys-component-navigation-headbar-menu-backdrop-blur, 0px))\",\n }}\n >\n {item.children?.map((child) => (\n <DropdownMenu.Item\n key={child.id}\n disabled={child.disabled}\n className={cn(\n \"relative flex cursor-pointer select-none items-center gap-2.5 px-3 py-2 text-sm outline-none transition-colors hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--accent)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--accent-foreground)))] focus:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--accent)))] focus:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--accent-foreground)))] data-[highlighted]:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--accent)))] data-[highlighted]:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--accent-foreground)))]\",\n menuItemRadiusClass,\n )}\n style={getHeadbarItemStyle(\n child.id === activeItemId,\n useTokenRadius,\n )}\n onSelect={() => {\n if (child.disabled) return;\n setOpen(false);\n onNavigate?.(child.id);\n }}\n >\n {child.icon ? (\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-[hsl(var(--muted-foreground))]\">\n {child.icon}\n </span>\n ) : null}\n <span className=\"min-w-0 truncate\">\n {child.headbarLabel ?? child.label}\n </span>\n {child.trailing}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n}\n\nexport interface NavigationHeadbarMenuProps {\n activeItemId?: string;\n activeRootId?: string;\n items: LayoutNavItem[];\n menuRadius?: HeadbarMenuRadius;\n onNavigate?: (itemId: string) => void;\n}\n\nexport function NavigationHeadbarMenu({\n activeItemId,\n activeRootId,\n items,\n menuRadius = \"default\",\n onNavigate,\n}: NavigationHeadbarMenuProps) {\n const menuButtonRadiusClass = getHeadbarMenuRadiusClass(menuRadius);\n const menuContentRadiusClass = getHeadbarMenuRadiusClass(menuRadius);\n const menuItemRadiusClass = getHeadbarMenuRadiusClass(menuRadius);\n const useTokenRadius = menuRadius === \"default\";\n\n return (\n <div className=\"flex w-max min-w-0 shrink-0 items-center gap-1\">\n {items.map((item) => {\n const isActive = activeRootId === item.id || activeItemId === item.id;\n const hasSecondaryAction = Boolean(item.headbarSecondaryAction);\n const label = item.headbarLabel ?? item.label;\n\n const primaryAction = item.children?.length ? (\n <HeadbarNavMenuItem\n activeItemId={activeItemId}\n compound={hasSecondaryAction}\n isActive={isActive}\n item={item}\n label={label}\n menuButtonRadiusClass={menuButtonRadiusClass}\n menuContentRadiusClass={menuContentRadiusClass}\n menuItemRadiusClass={menuItemRadiusClass}\n onNavigate={onNavigate}\n useTokenRadius={useTokenRadius}\n />\n ) : (\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n active={isActive}\n disabled={item.disabled}\n icon={item.icon}\n label={\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate whitespace-nowrap\">{label}</span>\n {item.trailing}\n </span>\n }\n onClick={() => onNavigate?.(item.id)}\n style={getHeadbarItemStyle(\n isActive,\n hasSecondaryAction ? false : useTokenRadius,\n )}\n classNames={{\n icon: \"text-[inherit] [&_*]:!text-[inherit] [&_svg]:!stroke-current\",\n label: \"text-[inherit] [&_*]:!text-[inherit]\",\n }}\n className={cn(\n \"max-w-[12rem] shrink-0 border shadow-none\",\n hasSecondaryAction &&\n \"!rounded-none !border-0 !bg-transparent\",\n menuButtonRadiusClass,\n isActive\n ? \"\"\n : \"hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--muted)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--foreground)))]\",\n )}\n />\n );\n\n if (!hasSecondaryAction) {\n return <Fragment key={item.id}>{primaryAction}</Fragment>;\n }\n\n return (\n <div\n key={item.id}\n data-navigation-headbar-compound-item={item.id}\n className={cn(\n \"inline-flex min-w-0 shrink-0 items-center gap-0 overflow-hidden border shadow-none\",\n menuButtonRadiusClass,\n isActive\n ? \"\"\n : \"hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--muted)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--foreground)))]\",\n )}\n style={getHeadbarCompoundStyle(isActive, useTokenRadius)}\n >\n <span\n data-navigation-headbar-primary-action=\"\"\n className=\"inline-flex min-w-0 shrink-0\"\n >\n {primaryAction}\n </span>\n <span\n data-navigation-headbar-secondary-action={item.id}\n className=\"inline-flex min-w-0 shrink-0 items-center\"\n >\n {item.headbarSecondaryAction}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport interface NavigationHeadbarProps {\n activeItemId?: string;\n activeRootId?: string;\n actions?: ReactNode;\n accountMenu?: ReactNode;\n className?: string;\n extra?: ReactNode;\n layout?: HeadbarLayout;\n brand?: ReactNode;\n logo?: AppHeaderLogo;\n navigation?: ReactNode;\n navItems?: LayoutNavItem[];\n onNavigate?: (itemId: string) => void;\n}\n\nexport function NavigationHeadbar({\n activeItemId,\n activeRootId,\n actions,\n accountMenu,\n className,\n extra,\n layout,\n brand,\n logo,\n navigation,\n navItems = [],\n onNavigate,\n}: NavigationHeadbarProps) {\n const heightPx = clampHeadbarHeight(layout?.heightPx);\n const layoutMode = layout?.layoutMode ?? \"boxed\";\n const menuRadius = layout?.menuRadius ?? \"default\";\n const surface = layout?.surface ?? \"card\";\n const logoHeightPx = getHeadbarLogoSizePx(heightPx);\n const frameStyle = getHeadbarFrameStyle(layoutMode, heightPx, surface);\n const showBrandTitle = Boolean(layout?.brandTitle);\n\n return (\n <header\n className={cn(\n getHeadbarFrameClass(layoutMode, layout?.navPosition),\n className,\n )}\n data-navigation-headbar=\"\"\n data-navigation-headbar-surface={surface}\n style={frameStyle}\n >\n <div className=\"flex min-w-0 items-center justify-start\">\n {brand ??\n (logo ? (\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n icon={\n <div\n className={cn(\n \"flex items-center justify-center overflow-hidden rounded-lg\",\n logo.url\n ? \"w-auto max-w-[min(22rem,30vw)] bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n style={\n logo.url\n ? { height: logoHeightPx }\n : { width: logoHeightPx, height: logoHeightPx }\n }\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"block h-full w-auto object-contain\"\n />\n ) : (\n <span className=\"text-base font-bold\">\n {logo.title.charAt(0)}\n </span>\n )}\n </div>\n }\n label={\n showBrandTitle ? (\n <span className=\"truncate whitespace-nowrap text-base font-medium text-[hsl(var(--foreground))]\">\n {layout?.brandTitle}\n </span>\n ) : null\n }\n ariaLabel={logo.title}\n title={logo.title}\n className=\"h-auto min-w-0 justify-start border-transparent bg-transparent p-0 shadow-none hover:bg-transparent\"\n classNames={\n logo.url ? { icon: \"!h-auto !w-auto shrink-0\" } : undefined\n }\n onClick={logo.onClick}\n />\n ) : null)}\n </div>\n\n <div\n className={cn(\n \"flex min-w-0 items-center\",\n getHeadbarNavClass(layout?.navPosition),\n )}\n >\n <div className=\"no-scrollbar flex max-w-full min-w-0 items-center overflow-x-auto overscroll-x-contain\">\n {navigation ?? (\n <NavigationHeadbarMenu\n activeItemId={activeItemId}\n activeRootId={activeRootId}\n items={navItems}\n menuRadius={menuRadius}\n onNavigate={onNavigate}\n />\n )}\n </div>\n </div>\n\n <div className=\"flex min-w-0 items-center justify-end gap-3\">\n {actions}\n {extra}\n {accountMenu}\n </div>\n </header>\n );\n}\n\nexport function NavigationLayout({\n activeItemId,\n activeRootId,\n allowModeSwitch = false,\n accountMenu,\n children,\n className,\n collapsedSidebarAccountMenu,\n collapsedSidebarWidth = NAVIGATION_LAYOUT_SIDEBAR_COLLAPSED_WIDTH,\n defaultMode = \"headbar\",\n defaultSidebarCollapsed = false,\n expandedSidebarWidth = NAVIGATION_LAYOUT_SIDEBAR_EXPANDED_WIDTH,\n expandSidebarLabel = \"Expand sidebar\",\n flush = false,\n headbarActions,\n headbarLayout,\n logo,\n mode,\n navItems,\n onModeChange,\n onNavigate,\n onSidebarCollapsedChange,\n renderHeadbarExtra,\n collapseSidebarLabel = \"Collapse sidebar\",\n sidebarCollapsed: controlledSidebarCollapsed,\n sidebarAccountMenu,\n sidebarFooter,\n sidebarHeader,\n switchToHeadbarLabel = \"Switch to headbar\",\n switchToSidebarLabel = \"Switch to sidebar\",\n}: NavigationLayoutProps) {\n const [uncontrolledMode, setUncontrolledMode] =\n useState<NavigationMode>(defaultMode);\n const [uncontrolledSidebarCollapsed, setUncontrolledSidebarCollapsed] =\n useState(defaultSidebarCollapsed);\n const [revealRequest, setRevealRequest] = useState<{\n id: string;\n nonce: number;\n } | null>(null);\n const isModeControlled = mode !== undefined;\n const isSidebarCollapsedControlled = controlledSidebarCollapsed !== undefined;\n const navigationMode = isModeControlled ? mode : uncontrolledMode;\n const sidebarCollapsed = isSidebarCollapsedControlled\n ? controlledSidebarCollapsed\n : uncontrolledSidebarCollapsed;\n const isHeadbarMode = navigationMode === \"headbar\";\n const sidebarWidth = sidebarCollapsed\n ? collapsedSidebarWidth\n : expandedSidebarWidth;\n\n useEffect(() => {\n if (!isModeControlled) {\n setUncontrolledMode(defaultMode);\n }\n }, [defaultMode, isModeControlled]);\n\n useEffect(() => {\n if (!isSidebarCollapsedControlled) {\n setUncontrolledSidebarCollapsed(defaultSidebarCollapsed);\n }\n }, [defaultSidebarCollapsed, isSidebarCollapsedControlled]);\n\n const setNavigationMode = (nextMode: NavigationMode) => {\n if (!isModeControlled) {\n setUncontrolledMode(nextMode);\n }\n onModeChange?.(nextMode);\n };\n\n const setCollapsed = (collapsed: boolean) => {\n if (!isSidebarCollapsedControlled) {\n setUncontrolledSidebarCollapsed(collapsed);\n }\n onSidebarCollapsedChange?.(collapsed);\n };\n\n const navigationActions: NavigationLayoutAction[] = [];\n if (allowModeSwitch) {\n navigationActions.push({\n id: \"toggle-headbar\",\n label: switchToHeadbarLabel,\n onClick: () => setNavigationMode(\"headbar\"),\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-[18px] w-[18px] rotate-180\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n </svg>\n ),\n });\n }\n navigationActions.push({\n id: \"toggle-sidebar\",\n label: sidebarCollapsed ? expandSidebarLabel : collapseSidebarLabel,\n onClick: () => setCollapsed(!sidebarCollapsed),\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-[18px] w-[18px]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d={sidebarCollapsed ? \"m14 9 3 3-3 3\" : \"m16 15-3-3 3-3\"} />\n </svg>\n ),\n });\n\n const sidebar = isHeadbarMode ? null : (\n <div\n className={cn(\n \"relative h-full min-h-0 shrink-0 transition-[width] duration-260\",\n sidebarCollapsed ? \"z-20 overflow-visible\" : \"z-10 overflow-hidden\",\n )}\n style={{\n width: sidebarWidth,\n transitionTimingFunction: NAVIGATION_LAYOUT_TRANSITION_TIMING,\n }}\n >\n <Sidebar\n accountMenu={sidebarAccountMenu ?? accountMenu}\n activeItemId={activeItemId}\n actions={navigationActions}\n collapsed={sidebarCollapsed}\n collapsedAccountMenu={collapsedSidebarAccountMenu ?? accountMenu}\n footer={sidebarFooter}\n header={sidebarHeader}\n items={navItems}\n logo={logo}\n onCollapsedChange={setCollapsed}\n onNavigate={onNavigate}\n onRevealRoot={(rootId) =>\n setRevealRequest((prev) => ({\n id: rootId,\n nonce: (prev?.nonce ?? 0) + 1,\n }))\n }\n revealRequest={revealRequest}\n title={headbarLayout?.brandTitle}\n />\n </div>\n );\n\n const header = isHeadbarMode ? (\n <NavigationHeadbar\n activeItemId={activeItemId}\n activeRootId={\n activeRootId ?? findNavigationRootId(navItems, activeItemId)\n }\n actions={\n allowModeSwitch ? (\n <>\n {headbarActions}\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 shrink-0\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"m14 9 3 3-3 3\" />\n </svg>\n }\n label={\n <span className=\"truncate whitespace-nowrap\">\n {switchToSidebarLabel}\n </span>\n }\n onClick={() => setNavigationMode(\"sidebar\")}\n className={cn(\n \"h-auto min-w-0 shrink px-3 py-2 text-sm font-medium text-[hsl(var(--muted-foreground))] shadow-none hover:border-[hsl(var(--input))]/70 hover:bg-[hsl(var(--muted))]/60 hover:text-[hsl(var(--foreground))]\",\n getHeadbarMenuRadiusClass(headbarLayout?.menuRadius),\n )}\n />\n </>\n ) : (\n headbarActions\n )\n }\n accountMenu={accountMenu}\n extra={renderHeadbarExtra}\n layout={headbarLayout}\n logo={logo}\n navItems={navItems}\n onNavigate={onNavigate}\n />\n ) : null;\n\n return (\n <AppLayout\n header={header}\n sidebar={sidebar}\n flush={flush}\n className={className}\n >\n {children}\n </AppLayout>\n );\n}\n","import * as React from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronDown } from \"lucide-react\";\n\nimport { cn } from \"../base/utils\";\n\n/** Design-owned polymorphic slot for product compositions that need `asChild`. */\nexport const PolymorphicSlot = Slot;\n\nexport const Accordion = AccordionPrimitive.Root;\n\nexport const AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, style, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b\", className)}\n style={{\n borderColor:\n \"var(--monkeys-component-accordion-item-border-color, hsl(var(--border)))\",\n ...style,\n }}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\nexport const AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0 transition-transform duration-200\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = \"AccordionTrigger\";\n\nexport const AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = \"AccordionContent\";\n\nexport const Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check aria-hidden=\"true\" className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = \"Checkbox\";\n\nexport const buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-sm px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: { variant: \"default\", size: \"default\" },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : \"button\";\n return (\n <Component\n ref={ref}\n className={buttonVariants({ variant, size, className })}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport const Popover = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\nexport const PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-lg border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = \"PopoverContent\";\n\nexport interface ScrollAreaProps extends React.ComponentPropsWithoutRef<\n typeof ScrollAreaPrimitive.Root\n> {\n viewportClassName?: string;\n viewportRef?: React.Ref<HTMLDivElement>;\n onViewportScroll?: React.UIEventHandler<HTMLDivElement>;\n scrollbar?: boolean;\n scrollbarOrientation?: \"vertical\" | \"horizontal\";\n scrollBarDisabled?: boolean;\n}\n\nexport const ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n ScrollAreaProps\n>(\n (\n {\n className,\n children,\n viewportClassName,\n viewportRef,\n onViewportScroll,\n scrollbar = true,\n scrollbarOrientation = \"vertical\",\n scrollBarDisabled = false,\n ...props\n },\n ref,\n ) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\n \"group relative overflow-hidden\",\n scrollBarDisabled && \"no-scrollbar\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n onScroll={onViewportScroll}\n className={cn(\"h-full w-full rounded-[inherit]\", viewportClassName)}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {scrollbar ? (\n <ScrollBar\n orientation={scrollbarOrientation}\n className={cn(scrollBarDisabled && \"size-0 p-0\")}\n />\n ) : null}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n ),\n);\nScrollArea.displayName = \"ScrollArea\";\n\nexport const ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 data-[state=visible]:opacity-100\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-px\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-px\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = \"ScrollBar\";\n\nexport const Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb className=\"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0\" />\n </SwitchPrimitive.Root>\n));\nSwitch.displayName = \"Switch\";\n\nexport type TabsVariant = \"default\" | \"ghost\" | \"rounded\";\nexport type TabsProps = React.ComponentPropsWithoutRef<\n typeof TabsPrimitive.Root\n> & { variant?: TabsVariant };\nexport const Tabs = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Root>,\n TabsProps\n>(({ variant = \"default\", ...props }, ref) => (\n <TabsPrimitive.Root ref={ref} data-variant={variant} {...props} />\n));\nTabs.displayName = \"Tabs\";\nexport const TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {\n gap?: string | number;\n }\n>(({ className, gap, style, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className,\n )}\n style={{ gap, ...style }}\n {...props}\n />\n));\nTabsList.displayName = \"TabsList\";\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = \"TabsTrigger\";\nexport const TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = \"TabsContent\";\n\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport const Tooltip = TooltipPrimitive.Root;\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\nexport const TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = \"TooltipContent\";\n","import * as React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronRight, ChevronUp, Circle } from 'lucide-react';\n\nimport { cn } from '../base/utils';\n\nconst menuItemClassName = 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0';\nconst menuContentClassName = 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2';\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\nexport const DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub;\nexport const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\nexport const DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger ref={ref} className={cn(menuItemClassName, 'data-[state=open]:bg-accent', inset && 'pl-8', className)} {...props}>\n {children}<ChevronRight aria-hidden=\"true\" className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = 'DropdownMenuSubTrigger';\nexport const DropdownMenuSubContent = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.SubContent>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>>(\n ({ className, ...props }, ref) => <DropdownMenuPrimitive.SubContent ref={ref} className={cn(menuContentClassName, className)} {...props} />,\n);\nDropdownMenuSubContent.displayName = 'DropdownMenuSubContent';\nexport const DropdownMenuContent = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Content>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>>(\n ({ className, sideOffset = 4, ...props }, ref) => <DropdownMenuPrimitive.Portal><DropdownMenuPrimitive.Content ref={ref} sideOffset={sideOffset} className={cn(menuContentClassName, className)} {...props} /></DropdownMenuPrimitive.Portal>,\n);\nDropdownMenuContent.displayName = 'DropdownMenuContent';\nexport const DropdownMenuItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Item>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }>(\n ({ className, inset, ...props }, ref) => <DropdownMenuPrimitive.Item ref={ref} className={cn(menuItemClassName, inset && 'pl-8', className)} {...props} />,\n);\nDropdownMenuItem.displayName = 'DropdownMenuItem';\nexport const DropdownMenuCheckboxItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>>(\n ({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem ref={ref} className={cn(menuItemClassName, 'pl-8', className)} checked={checked} {...props}>\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\"><DropdownMenuPrimitive.ItemIndicator><Check aria-hidden=\"true\" className=\"h-4 w-4\" /></DropdownMenuPrimitive.ItemIndicator></span>{children}\n </DropdownMenuPrimitive.CheckboxItem>\n ),\n);\nDropdownMenuCheckboxItem.displayName = 'DropdownMenuCheckboxItem';\nexport const DropdownMenuRadioItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>>(\n ({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem ref={ref} className={cn(menuItemClassName, 'pl-8', className)} {...props}>\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\"><DropdownMenuPrimitive.ItemIndicator><Circle aria-hidden=\"true\" className=\"h-2 w-2 fill-current\" /></DropdownMenuPrimitive.ItemIndicator></span>{children}\n </DropdownMenuPrimitive.RadioItem>\n ),\n);\nDropdownMenuRadioItem.displayName = 'DropdownMenuRadioItem';\nexport const DropdownMenuLabel = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Label>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }>(\n ({ className, inset, ...props }, ref) => <DropdownMenuPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)} {...props} />,\n);\nDropdownMenuLabel.displayName = 'DropdownMenuLabel';\nexport const DropdownMenuSeparator = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Separator>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>>(\n ({ className, ...props }, ref) => <DropdownMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />,\n);\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\nexport const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />;\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport const Select = SelectPrimitive.Root;\nexport const SelectGroup = SelectPrimitive.Group;\nexport const SelectValue = SelectPrimitive.Value;\nexport interface SelectTriggerProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> {\n iconClassName?: string;\n size?: 'default' | 'sm';\n}\nexport const SelectTrigger = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Trigger>, SelectTriggerProps>(\n ({ className, children, iconClassName, size = 'default', ...props }, ref) => (\n <SelectPrimitive.Trigger ref={ref} className={cn('flex h-10 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-background px-3 py-2 text-left text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 [&>span]:min-w-0 [&>span]:flex-1 [&>span]:text-left', size === 'sm' && 'h-8 px-2 py-1 text-xs', className)} {...props}>\n {children}<SelectPrimitive.Icon asChild><ChevronDown aria-hidden=\"true\" className={cn('h-4 w-4 opacity-50', iconClassName)} /></SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n ),\n);\nSelectTrigger.displayName = 'SelectTrigger';\nexport const SelectScrollUpButton = React.forwardRef<React.ElementRef<typeof SelectPrimitive.ScrollUpButton>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>>(\n ({ className, ...props }, ref) => <SelectPrimitive.ScrollUpButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}><ChevronUp aria-hidden=\"true\" className=\"h-4 w-4\" /></SelectPrimitive.ScrollUpButton>,\n);\nSelectScrollUpButton.displayName = 'SelectScrollUpButton';\nexport const SelectScrollDownButton = React.forwardRef<React.ElementRef<typeof SelectPrimitive.ScrollDownButton>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>>(\n ({ className, ...props }, ref) => <SelectPrimitive.ScrollDownButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}><ChevronDown aria-hidden=\"true\" className=\"h-4 w-4\" /></SelectPrimitive.ScrollDownButton>,\n);\nSelectScrollDownButton.displayName = 'SelectScrollDownButton';\nexport interface SelectContentProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> {\n viewportClassName?: string;\n disableTriggerViewportSizing?: boolean;\n}\nexport const SelectContent = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Content>, SelectContentProps>(\n ({ className, children, position = 'popper', viewportClassName, disableTriggerViewportSizing = false, ...props }, ref) => (\n <SelectPrimitive.Portal><SelectPrimitive.Content ref={ref} position={position} className={cn(menuContentClassName, 'relative max-h-[var(--radix-select-content-available-height)] overflow-y-auto overflow-x-hidden', position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className)} {...props}>\n <SelectScrollUpButton /><SelectPrimitive.Viewport className={cn('p-1', position === 'popper' && 'w-full min-w-[var(--radix-select-trigger-width)]', position === 'popper' && !disableTriggerViewportSizing && 'h-[var(--radix-select-trigger-height)]', viewportClassName)}>{children}</SelectPrimitive.Viewport><SelectScrollDownButton />\n </SelectPrimitive.Content></SelectPrimitive.Portal>\n ),\n);\nSelectContent.displayName = 'SelectContent';\nexport const SelectLabel = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Label>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>>(\n ({ className, ...props }, ref) => <SelectPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} />,\n);\nSelectLabel.displayName = 'SelectLabel';\nexport interface SelectItemProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> {\n indicatorClassName?: string;\n itemText?: React.ReactNode;\n hideIndicator?: boolean;\n}\nexport const SelectItem = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Item>, SelectItemProps>(\n ({ className, children, indicatorClassName, itemText, hideIndicator = false, ...props }, ref) => (\n <SelectPrimitive.Item ref={ref} className={cn(menuItemClassName, 'w-full', hideIndicator ? 'px-2' : 'pl-8 pr-2', className)} {...props}>\n {!hideIndicator ? <span className={cn('absolute left-2 flex h-3.5 w-3.5 items-center justify-center', indicatorClassName)}><SelectPrimitive.ItemIndicator><Check aria-hidden=\"true\" className=\"h-4 w-4\" /></SelectPrimitive.ItemIndicator></span> : null}\n {itemText ? <><SelectPrimitive.ItemText asChild><span className=\"sr-only\">{itemText}</span></SelectPrimitive.ItemText>{children}</> : <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>}\n </SelectPrimitive.Item>\n ),\n);\nSelectItem.displayName = 'SelectItem';\nexport const SelectSeparator = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Separator>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>>(\n ({ className, ...props }, ref) => <SelectPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />,\n);\nSelectSeparator.displayName = 'SelectSeparator';\n","import type {\n AgentSessionPermissionProfile,\n AgentWorkbenchComposerModelOption,\n AgentWorkbenchComposerViewModel,\n} from '@inf-monkeys-tech/monkeys';\nimport {\n ArrowDown,\n ArrowUp,\n File,\n Image as ImageIcon,\n Mic,\n Paperclip,\n Pencil,\n Send,\n Square,\n Trash2,\n X,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport { Switch } from '../primitives';\n\nconst iconButtonClass = 'inline-flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40';\n\nexport type AgentWorkbenchComposerIntent =\n | { type: 'change-value'; value: string }\n | { type: 'submit' }\n | { type: 'stop' }\n | { type: 'request-attachments'; files: File[] }\n | { type: 'request-voice-input' }\n | { type: 'remove-attachment'; attachmentId: string }\n | { type: 'change-mode'; mode: 'chat' | 'work' }\n | { type: 'select-model'; modelId: string; mode: 'chat' | 'work' }\n | { type: 'change-reasoning'; value: 'low' | 'medium' | 'high' | 'xhigh' }\n | { type: 'change-permission'; value: AgentSessionPermissionProfile }\n | { type: 'toggle-web-search'; enabled: boolean }\n | { type: 'edit-queued-draft'; draftId: string; text: string }\n | { type: 'delete-queued-draft'; draftId: string }\n | { type: 'move-queued-draft'; draftId: string; direction: 'up' | 'down' };\n\nexport interface AgentWorkbenchComposerClassNames {\n root?: string;\n queue?: string;\n attachments?: string;\n textarea?: string;\n toolbar?: string;\n}\n\nexport interface AgentWorkbenchComposerProps {\n viewModel: AgentWorkbenchComposerViewModel;\n modeSelectionEnabled?: boolean;\n modeFilteringEnabled?: boolean;\n className?: string;\n classNames?: AgentWorkbenchComposerClassNames;\n onIntent?: (intent: AgentWorkbenchComposerIntent) => void;\n}\n\nfunction modelOptionValue(option: AgentWorkbenchComposerModelOption): string {\n return `${option.mode}:${option.id}`;\n}\n\nexport function AgentWorkbenchComposer({\n viewModel,\n modeSelectionEnabled = false,\n modeFilteringEnabled = false,\n className,\n classNames,\n onIntent,\n}: AgentWorkbenchComposerProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const fileInputRef = useRef<HTMLInputElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const [editingDraftId, setEditingDraftId] = useState<string>();\n const [editingText, setEditingText] = useState('');\n const [isNarrow, setIsNarrow] = useState(false);\n const narrowBreakpoint = modeSelectionEnabled ? 900 : 704;\n const isBusy = viewModel.status === 'loading' || viewModel.status === 'streaming' || viewModel.status === 'stopping';\n const isStopping = viewModel.status === 'stopping';\n const isUploading = viewModel.attachments.some((attachment) => attachment.status === 'uploading');\n const canSubmit = !isStopping && !isUploading && (viewModel.value.trim().length > 0 || viewModel.attachments.some((item) => item.status === 'ready'));\n const showSubmitButton = !isBusy || canSubmit;\n const filterModelsByMode = modeSelectionEnabled || modeFilteringEnabled;\n const visibleModelOptions = useMemo(\n () => filterModelsByMode ? viewModel.model.options.filter((option) => option.mode === viewModel.mode) : viewModel.model.options,\n [filterModelsByMode, viewModel.mode, viewModel.model.options],\n );\n const selectedModelValue = useMemo(() => {\n const selected = visibleModelOptions.find((option) => option.id === viewModel.model.selectedId && option.mode === viewModel.mode);\n return selected ? modelOptionValue(selected) : visibleModelOptions[0] ? modelOptionValue(visibleModelOptions[0]) : '';\n }, [viewModel.mode, viewModel.model.selectedId, visibleModelOptions]);\n\n useEffect(() => {\n const surface = surfaceRef.current;\n if (!surface) return undefined;\n\n const updateLayout = () => setIsNarrow(surface.getBoundingClientRect().width <= narrowBreakpoint);\n updateLayout();\n window.addEventListener('resize', updateLayout);\n if (typeof ResizeObserver === 'undefined') {\n const interval = window.setInterval(updateLayout, 250);\n return () => {\n window.clearInterval(interval);\n window.removeEventListener('resize', updateLayout);\n };\n }\n\n const observer = new ResizeObserver(updateLayout);\n observer.observe(surface);\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', updateLayout);\n };\n }, [narrowBreakpoint]);\n\n const submit = () => {\n if (canSubmit) onIntent?.({ type: 'submit' });\n };\n\n return (\n <form\n className={cn('agent-workbench-composer flex min-w-0 w-full flex-col gap-2', className, classNames?.root)}\n aria-label={messages.composer.message}\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n >\n {viewModel.capabilities.queue && viewModel.queuedDrafts.length > 0 ? (\n <section\n aria-label={messages.composer.queued}\n className={cn('min-w-0 max-w-full rounded-md border border-border bg-muted/40 p-2', classNames?.queue)}\n >\n <ol className=\"space-y-1.5\">\n {viewModel.queuedDrafts.map((draft, index) => (\n <li key={draft.id} className=\"flex min-h-9 min-w-0 max-w-full items-center gap-2 overflow-hidden rounded-md bg-background px-2 py-1.5 text-sm\">\n <span className=\"w-5 shrink-0 text-center text-xs text-muted-foreground\">{index + 1}</span>\n {editingDraftId === draft.id ? (\n <input\n autoFocus\n value={editingText}\n aria-label={messages.composer.editQueued}\n className=\"min-w-0 flex-1 rounded border border-input bg-background px-2 py-1 outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onChange={(event) => setEditingText(event.target.value)}\n onBlur={() => {\n if (editingText.trim()) onIntent?.({ type: 'edit-queued-draft', draftId: draft.id, text: editingText });\n setEditingDraftId(undefined);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') setEditingDraftId(undefined);\n if (event.key === 'Enter' && editingText.trim()) {\n event.preventDefault();\n onIntent?.({ type: 'edit-queued-draft', draftId: draft.id, text: editingText });\n setEditingDraftId(undefined);\n }\n }}\n />\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{draft.text || messages.composer.attachmentOnly}</span>\n )}\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.moveUp} disabled={index === 0} onClick={() => onIntent?.({ type: 'move-queued-draft', draftId: draft.id, direction: 'up' })}>\n <ArrowUp className=\"size-3.5\" />\n </button>\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.moveDown} disabled={index === viewModel.queuedDrafts.length - 1} onClick={() => onIntent?.({ type: 'move-queued-draft', draftId: draft.id, direction: 'down' })}>\n <ArrowDown className=\"size-3.5\" />\n </button>\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.editQueued} onClick={() => { setEditingDraftId(draft.id); setEditingText(draft.text); }}>\n <Pencil className=\"size-3.5\" />\n </button>\n <button type=\"button\" className={cn(iconButtonClass, 'text-destructive-text')} aria-label={messages.composer.deleteQueued} onClick={() => onIntent?.({ type: 'delete-queued-draft', draftId: draft.id })}>\n <Trash2 className=\"size-3.5\" />\n </button>\n </div>\n </li>\n ))}\n </ol>\n </section>\n ) : null}\n\n <div ref={surfaceRef} className=\"agent-workbench-composer__surface min-w-0 max-w-full rounded-lg border border-input bg-background p-3 shadow-sm focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/30\">\n {viewModel.attachments.length > 0 ? (\n <div className={cn('mb-2 flex max-w-full gap-2 overflow-x-auto', classNames?.attachments)}>\n {viewModel.attachments.map((attachment) => (\n <div key={attachment.id} className=\"relative flex size-16 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-muted\">\n {attachment.previewUrl && attachment.mediaType?.startsWith('image/') ? (\n <img src={attachment.previewUrl} alt=\"\" className=\"size-full object-cover\" />\n ) : attachment.mediaType?.startsWith('image/') ? (\n <ImageIcon className=\"size-5 text-muted-foreground\" />\n ) : (\n <File className=\"size-5 text-muted-foreground\" />\n )}\n {attachment.status === 'uploading' ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/80 text-[10px] font-medium\">{messages.composer.uploading}</span>\n ) : null}\n <button\n type=\"button\"\n className=\"absolute right-1 top-1 flex size-5 items-center justify-center rounded-full bg-background/90 text-foreground shadow\"\n aria-label={messages.composer.removeAttachment}\n onClick={() => onIntent?.({ type: 'remove-attachment', attachmentId: attachment.id })}\n >\n <X className=\"size-3\" />\n </button>\n <span className=\"absolute inset-x-0 bottom-0 truncate bg-background/85 px-1 py-0.5 text-[9px]\">{attachment.name}</span>\n </div>\n ))}\n </div>\n ) : null}\n\n <textarea\n value={viewModel.value}\n rows={2}\n aria-label={messages.composer.message}\n placeholder={viewModel.placeholder}\n className={cn('max-h-64 min-h-14 min-w-0 w-full resize-none border-0 bg-transparent text-sm leading-relaxed text-foreground outline-none placeholder:text-muted-foreground', classNames?.textarea)}\n onChange={(event) => onIntent?.({ type: 'change-value', value: event.target.value })}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault();\n submit();\n }\n }}\n />\n\n <div className={cn('agent-workbench-composer__toolbar mt-2 flex min-h-8 min-w-0 max-w-full items-center gap-2', isNarrow ? 'flex-wrap' : 'flex-nowrap', classNames?.toolbar)}>\n <div className={cn('agent-workbench-composer__controls flex min-w-0 max-w-full flex-1 items-center gap-1.5', isNarrow ? 'w-full flex-wrap' : 'flex-nowrap')}>\n {viewModel.capabilities.attachments ? (\n <>\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.attach} onClick={() => fileInputRef.current?.click()}>\n <Paperclip className=\"size-4\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n multiple\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n if (files.length > 0) onIntent?.({ type: 'request-attachments', files });\n event.target.value = '';\n }}\n />\n </>\n ) : null}\n {viewModel.capabilities.voiceInput ? (\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.voice} onClick={() => onIntent?.({ type: 'request-voice-input' })}>\n <Mic className=\"size-4\" />\n </button>\n ) : null}\n {viewModel.capabilities.webSearch ? (\n <label className=\"flex shrink-0 items-center gap-1.5 whitespace-nowrap px-1 text-xs font-medium text-foreground\">\n {messages.composer.webSearch}\n <Switch checked={viewModel.webSearchEnabled} onCheckedChange={(enabled) => onIntent?.({ type: 'toggle-web-search', enabled })} />\n </label>\n ) : null}\n {modeSelectionEnabled ? (\n <div\n className=\"flex h-8 shrink-0 items-center rounded-md border border-border bg-muted p-0.5\"\n role=\"group\"\n aria-label={messages.composer.chatMode}\n >\n {(['chat', 'work'] as const).map((mode) => (\n <button\n key={mode}\n type=\"button\"\n aria-pressed={viewModel.mode === mode}\n className={cn(\n 'h-7 rounded px-2.5 text-xs font-medium transition-colors',\n viewModel.mode === mode ? 'bg-background text-foreground shadow-sm' : 'text-foreground/75 hover:text-foreground',\n )}\n onClick={() => onIntent?.({ type: 'change-mode', mode })}\n >\n {messages.modes[mode]}\n </button>\n ))}\n </div>\n ) : null}\n {viewModel.capabilities.modelSelection ? (\n <label className=\"sr-only\" htmlFor=\"agent-workbench-model\">{messages.composer.model}</label>\n ) : null}\n {viewModel.capabilities.modelSelection ? (\n <select\n id=\"agent-workbench-model\"\n value={selectedModelValue}\n aria-label={messages.composer.model}\n className=\"h-8 w-48 min-w-36 shrink rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground\"\n onChange={(event) => {\n const option = visibleModelOptions.find((item) => modelOptionValue(item) === event.target.value);\n if (option) onIntent?.({ type: 'select-model', modelId: option.id, mode: option.mode });\n }}\n >\n {visibleModelOptions.length === 0 ? <option value=\"\">{messages.composer.noModels}</option> : null}\n {visibleModelOptions.map((option) => (\n <option key={modelOptionValue(option)} value={modelOptionValue(option)} disabled={option.disabled}>\n {option.label} · {messages.modes[option.mode]}\n </option>\n ))}\n </select>\n ) : null}\n {viewModel.capabilities.reasoning && viewModel.reasoning ? (\n <select\n value={viewModel.reasoning.value}\n aria-label={messages.composer.reasoning}\n className=\"h-8 w-32 min-w-24 shrink rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground\"\n onChange={(event) => onIntent?.({ type: 'change-reasoning', value: event.target.value as 'low' | 'medium' | 'high' | 'xhigh' })}\n >\n {viewModel.reasoning.options.map((value) => <option key={value} value={value}>{messages.composer.reasoningOptions[value]}</option>)}\n </select>\n ) : null}\n {viewModel.capabilities.permissions && viewModel.permissionProfile ? (\n <select\n value={viewModel.permissionProfile}\n aria-label={messages.composer.permissions}\n className=\"h-8 w-40 min-w-32 shrink rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground\"\n onChange={(event) => onIntent?.({ type: 'change-permission', value: event.target.value as AgentSessionPermissionProfile })}\n >\n {(['approval-required', 'auto-approve', 'full-access'] as const).map((value) => <option key={value} value={value}>{messages.composer.permissionOptions[value]}</option>)}\n </select>\n ) : null}\n </div>\n\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {showSubmitButton ? (\n <button\n type=\"submit\"\n className={cn(\n iconButtonClass,\n 'bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground disabled:bg-primary/40 disabled:!opacity-100',\n )}\n aria-label={isBusy && viewModel.capabilities.queue ? messages.composer.queue : messages.composer.send}\n disabled={!canSubmit}\n >\n <Send className=\"size-4 !text-white [&_path]:!stroke-white\" />\n </button>\n ) : null}\n {isBusy && !canSubmit && viewModel.capabilities.stop ? (\n <button\n type=\"button\"\n className={cn(iconButtonClass, 'border border-border')}\n aria-label={isStopping ? messages.run.stopping : messages.composer.stop}\n disabled={isStopping}\n onClick={() => onIntent?.({ type: 'stop' })}\n >\n <Square className=\"size-3 fill-current\" />\n </button>\n ) : null}\n </div>\n </div>\n </div>\n {viewModel.status === 'error' && viewModel.error ? <p role=\"alert\" className=\"text-sm text-destructive-text\">{viewModel.error}</p> : null}\n </form>\n );\n}\n","import { ArrowLeft, ArrowUpRight, Code2, FileText, Palette, Search, ShoppingBag, Sparkles, Upload, type LucideIcon } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\n\nexport type AgentWorkbenchQuickStartIcon = 'sparkles' | 'palette' | 'search' | 'file-text' | 'code' | 'shopping-bag';\n\nexport interface AgentWorkbenchQuickStartTemplate {\n id: string;\n title: string;\n description?: string;\n prompt: string;\n action?: 'prompt' | 'upload';\n icon?: AgentWorkbenchQuickStartIcon;\n coverImageUrl?: string;\n accept?: string;\n multiple?: boolean;\n modes?: Array<'chat' | 'work'>;\n}\n\nexport interface AgentWorkbenchQuickStartSection {\n id: string;\n label: string;\n templates: AgentWorkbenchQuickStartTemplate[];\n}\n\nexport interface AgentWorkbenchQuickStartCategory {\n id: string;\n label: string;\n icon?: AgentWorkbenchQuickStartIcon;\n sections: AgentWorkbenchQuickStartSection[];\n}\n\nexport interface AgentWorkbenchQuickStartViewModel {\n contract: 'AgentWorkbenchQuickStartViewModel';\n mode: 'chat' | 'work';\n categories: AgentWorkbenchQuickStartCategory[];\n disabled?: boolean;\n}\n\nexport type AgentWorkbenchQuickStartIntent =\n | { type: 'change-category'; categoryId?: string }\n | { type: 'change-section'; categoryId: string; sectionId: string }\n | {\n type: 'select-template';\n templateId: string;\n prompt: string;\n files?: File[];\n };\n\nexport interface AgentWorkbenchQuickStartProps {\n viewModel: AgentWorkbenchQuickStartViewModel;\n className?: string;\n onIntent?: (intent: AgentWorkbenchQuickStartIntent) => void;\n}\n\nconst ICONS: Record<AgentWorkbenchQuickStartIcon, LucideIcon> = {\n sparkles: Sparkles,\n palette: Palette,\n search: Search,\n 'file-text': FileText,\n code: Code2,\n 'shopping-bag': ShoppingBag,\n};\n\nfunction TemplateVisual({ template }: { template: AgentWorkbenchQuickStartTemplate }) {\n const Icon = ICONS[template.icon || 'sparkles'];\n\n if (template.coverImageUrl) {\n return <img src={template.coverImageUrl} alt=\"\" className=\"size-full bg-muted object-contain\" />;\n }\n\n return (\n <span className=\"flex size-full items-center justify-center bg-gradient-to-br from-primary/5 via-muted/50 to-primary/15\">\n <span className=\"flex size-14 items-center justify-center rounded-2xl border border-primary/10 bg-background/85 text-primary shadow-sm\">\n <Icon className=\"size-7\" aria-hidden=\"true\" />\n </span>\n </span>\n );\n}\n\nexport function AgentWorkbenchQuickStart({ viewModel, className, onIntent }: AgentWorkbenchQuickStartProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.quickStart;\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [activeCategoryId, setActiveCategoryId] = useState<string>();\n const [activeSectionId, setActiveSectionId] = useState<string>();\n const [pendingTemplate, setPendingTemplate] = useState<AgentWorkbenchQuickStartTemplate>();\n const categories = useMemo(\n () =>\n viewModel.categories\n .map((category) => ({\n ...category,\n sections: category.sections\n .map((section) => ({\n ...section,\n templates: section.templates.filter((template) => !template.modes || template.modes.includes(viewModel.mode)),\n }))\n .filter((section) => section.templates.length > 0),\n }))\n .filter((category) => category.sections.length > 0),\n [viewModel.categories, viewModel.mode],\n );\n const activeCategory = categories.find((category) => category.id === activeCategoryId);\n const activeSection = activeCategory?.sections.find((section) => section.id === activeSectionId) || activeCategory?.sections[0];\n const usesCompactList = activeSection?.templates.length\n ? activeSection.templates.every((template) => !template.coverImageUrl)\n : false;\n\n useEffect(() => {\n if (activeCategoryId && !categories.some((category) => category.id === activeCategoryId)) {\n setActiveCategoryId(undefined);\n setActiveSectionId(undefined);\n }\n }, [activeCategoryId, categories]);\n\n if (categories.length === 0) return null;\n\n const selectCategory = (category: AgentWorkbenchQuickStartCategory) => {\n setActiveCategoryId(category.id);\n setActiveSectionId(category.sections[0]?.id);\n onIntent?.({ type: 'change-category', categoryId: category.id });\n };\n\n const selectSection = (sectionId: string) => {\n if (!activeCategory) return;\n setActiveSectionId(sectionId);\n onIntent?.({\n type: 'change-section',\n categoryId: activeCategory.id,\n sectionId,\n });\n };\n\n const selectTemplate = (template: AgentWorkbenchQuickStartTemplate) => {\n if (viewModel.disabled) return;\n if (template.action !== 'upload') {\n onIntent?.({\n type: 'select-template',\n templateId: template.id,\n prompt: template.prompt,\n });\n return;\n }\n\n const input = fileInputRef.current;\n if (!input) return;\n input.accept = template.accept || '*/*';\n input.multiple = template.multiple === true;\n setPendingTemplate(template);\n input.click();\n };\n\n return (\n <section className={cn('agent-workbench-quick-start min-w-0 max-w-full', className)} aria-label={messages.label}>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n if (pendingTemplate && files.length > 0) {\n onIntent?.({\n type: 'select-template',\n templateId: pendingTemplate.id,\n prompt: pendingTemplate.prompt,\n files: pendingTemplate.multiple ? files : files.slice(0, 1),\n });\n }\n setPendingTemplate(undefined);\n event.target.value = '';\n }}\n />\n\n {!activeCategory ? (\n <div className=\"flex max-w-full items-center justify-center gap-2 overflow-x-auto px-1 pb-1\">\n {categories.map((category) => {\n const Icon = ICONS[category.icon || 'sparkles'];\n return (\n <button key={category.id} type=\"button\" className=\"inline-flex h-10 shrink-0 items-center gap-2 rounded-full border border-border bg-background px-4 text-sm font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\" onClick={() => selectCategory(category)}>\n <Icon className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n {category.label}\n </button>\n );\n })}\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"flex min-w-0 max-w-full items-center gap-1 overflow-x-auto pb-1\">\n <button\n type=\"button\"\n className=\"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full px-3 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => {\n setActiveCategoryId(undefined);\n setActiveSectionId(undefined);\n onIntent?.({ type: 'change-category' });\n }}\n >\n <ArrowLeft className=\"size-4\" aria-hidden=\"true\" />\n {messages.back}\n </button>\n {activeCategory.sections.map((section) => (\n <button key={section.id} type=\"button\" aria-pressed={activeSection?.id === section.id} className={cn('h-9 shrink-0 rounded-full px-4 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', activeSection?.id === section.id ? 'bg-muted text-foreground' : 'text-muted-foreground hover:bg-muted/70 hover:text-foreground')} onClick={() => selectSection(section.id)}>\n {section.label}\n </button>\n ))}\n </div>\n\n <div\n data-quick-start-layout={usesCompactList ? 'list' : 'cards'}\n className={cn(\n 'grid',\n usesCompactList ? 'grid-cols-1 gap-0' : 'grid-cols-[repeat(auto-fit,minmax(min(100%,14rem),1fr))] gap-3',\n )}\n >\n {activeSection?.templates.map((template) => (\n <button\n key={template.id}\n type=\"button\"\n disabled={viewModel.disabled}\n data-quick-start-template-id={template.id}\n className={cn(\n 'group min-w-0 overflow-hidden text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n usesCompactList\n ? 'flex min-h-14 items-center rounded-none border-x-0 border-t-0 bg-transparent shadow-none hover:border-border hover:bg-muted/40 last:border-b-0'\n : 'rounded-xl border border-border bg-background hover:border-primary/30 hover:bg-muted/20',\n )}\n onClick={() => selectTemplate(template)}\n >\n <span className={cn(usesCompactList ? 'min-w-0 flex-1 px-2 py-2.5' : 'block px-4 pb-3 pt-4')}>\n <span className={cn('flex items-center gap-2 text-sm text-foreground', usesCompactList ? 'font-medium' : 'font-semibold')}>\n {template.title}\n {template.action === 'upload' ? (\n <span className=\"ml-auto inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground\">\n <Upload className=\"size-3\" aria-hidden=\"true\" />\n {messages.addFile}\n </span>\n ) : null}\n </span>\n {template.description ? (\n <span\n className={cn(\n 'line-clamp-2 block text-xs leading-4 text-muted-foreground',\n usesCompactList ? 'mt-0.5 min-h-0 text-muted-foreground/75' : 'mt-1 min-h-8',\n )}\n >\n {template.description}\n </span>\n ) : null}\n </span>\n {usesCompactList ? (\n <ArrowUpRight className=\"mr-2 size-4 shrink-0 text-muted-foreground/45\" aria-hidden=\"true\" />\n ) : (\n <span className={cn('block overflow-hidden', template.coverImageUrl ? 'aspect-[5/2]' : 'h-28')}>\n <TemplateVisual template={template} />\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </section>\n );\n}\n","import type {\n AgentWorkbenchAgentItem,\n AgentWorkbenchNavigationViewModel,\n AgentWorkbenchSessionItem,\n} from '@inf-monkeys-tech/monkeys';\nimport {\n AlertCircle,\n Blocks,\n Bot,\n CheckCircle2,\n Ellipsis,\n Image as ImageIcon,\n Loader2,\n MessageSquare,\n Pencil,\n Pin,\n Plus,\n RefreshCw,\n Search,\n Settings,\n SquarePen,\n Trash2,\n X,\n} from 'lucide-react';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useMonkeysLocale, useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../primitives';\n\nexport type AgentWorkbenchSidebarIntent =\n | { type: 'change-tab'; tab: 'agents' | 'sessions' }\n | { type: 'change-search'; query: string }\n | { type: 'create-agent' }\n | { type: 'create-session' }\n | { type: 'select-agent'; itemId: string }\n | { type: 'select-session'; sessionId: string }\n | { type: 'toggle-agent-pin'; itemId: string; pinned: boolean }\n | { type: 'toggle-session-pin'; sessionId: string; pinned: boolean }\n | { type: 'rename-session'; sessionId: string; title: string }\n | { type: 'delete-session'; sessionId: string }\n | { type: 'retry-agents' }\n | { type: 'retry-sessions' }\n | { type: 'open-capabilities' }\n | { type: 'open-agent-settings' };\n\nexport interface AgentWorkbenchSidebarClassNames {\n root?: string;\n search?: string;\n tabs?: string;\n body?: string;\n item?: string;\n footer?: string;\n}\n\nexport interface AgentWorkbenchSidebarProps {\n viewModel: AgentWorkbenchNavigationViewModel;\n navigationMode?: 'agents-and-sessions' | 'sessions-only';\n headerActions?: ReactNode;\n className?: string;\n classNames?: AgentWorkbenchSidebarClassNames;\n onIntent?: (intent: AgentWorkbenchSidebarIntent) => void;\n}\n\nfunction ItemAvatar({ item }: { item: AgentWorkbenchAgentItem }) {\n const [failed, setFailed] = useState(false);\n if (item.iconUrl && !failed) {\n return <img src={item.iconUrl} alt=\"\" className=\"size-full object-cover\" onError={() => setFailed(true)} />;\n }\n const initial = item.name.trim().charAt(0).toLocaleUpperCase();\n return initial ? <span className=\"text-sm font-semibold\">{initial}</span> : <Bot className=\"size-4\" />;\n}\n\nfunction SessionAvatar({ item }: { item: AgentWorkbenchSessionItem }) {\n const [failed, setFailed] = useState(false);\n if (item.thumbnailUrl && !failed) {\n return (\n <img\n src={item.thumbnailUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n loading=\"lazy\"\n onError={() => setFailed(true)}\n />\n );\n }\n return <ImageIcon className=\"size-5\" aria-hidden=\"true\" />;\n}\n\nfunction SessionMeta({ item, locale }: { item: AgentWorkbenchSessionItem; locale: string }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n return (\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-xs text-foreground/80\">{new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(item.updatedAt))}</span>\n {item.mode ? (\n <span className={cn('shrink-0 rounded-full px-1.5 py-0.5 text-[10px] font-medium leading-none', item.mode === 'work' ? 'bg-primary/10 text-primary' : 'bg-muted text-foreground')}>\n {item.mode === 'work' ? messages.work : messages.chat}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction CollectionState({\n status,\n empty,\n noResults,\n hasItems,\n query,\n error,\n onRetry,\n}: {\n status: 'loading' | 'ready' | 'error';\n empty: string;\n noResults: string;\n hasItems: boolean;\n query: string;\n error?: string;\n onRetry: () => void;\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n if (status === 'loading' && !hasItems) {\n return <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{messages.loading}</div>;\n }\n if (status === 'error') {\n return (\n <div className=\"flex flex-col items-center gap-3 px-3 py-8 text-center\">\n <p className=\"text-sm text-muted-foreground\" role=\"alert\">{error}</p>\n <button type=\"button\" className=\"inline-flex items-center gap-1.5 text-sm font-medium text-primary\" onClick={onRetry}>\n <RefreshCw className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.retry}\n </button>\n </div>\n );\n }\n if (!hasItems) {\n return <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{query ? noResults : empty}</div>;\n }\n return null;\n}\n\nfunction StatusIndicator({ status }: { status: AgentWorkbenchSessionItem['status'] }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n if (status === 'running') {\n return <Loader2 className=\"size-4 animate-spin text-primary\" aria-label={messages.running} />;\n }\n if (status === 'completed') {\n return <CheckCircle2 className=\"size-4 text-primary\" aria-label={messages.completed} />;\n }\n if (status === 'error') {\n return <AlertCircle className=\"size-4 text-destructive-text\" aria-label={messages.failed} />;\n }\n return null;\n}\n\nfunction SessionActions({\n item,\n capabilities,\n onIntent,\n}: {\n item: AgentWorkbenchSessionItem;\n capabilities: AgentWorkbenchNavigationViewModel['capabilities'];\n onIntent?: AgentWorkbenchSidebarProps['onIntent'];\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n if (!capabilities.renameSessions && !capabilities.deleteSessions) return null;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" className=\"flex size-8 items-center justify-center rounded-md hover:bg-muted\" aria-label={messages.actions}>\n <Ellipsis className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {capabilities.renameSessions ? (\n <DropdownMenuItem onSelect={() => onIntent?.({ type: 'rename-session', sessionId: item.id, title: item.title })}>\n <Pencil className=\"mr-2 size-4\" aria-hidden=\"true\" />{messages.rename}\n </DropdownMenuItem>\n ) : null}\n {capabilities.deleteSessions ? (\n <DropdownMenuItem className=\"text-destructive-text\" onSelect={() => onIntent?.({ type: 'delete-session', sessionId: item.id })}>\n <Trash2 className=\"mr-2 size-4\" aria-hidden=\"true\" />{messages.delete}\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nexport function AgentWorkbenchSidebar({\n viewModel,\n navigationMode = 'agents-and-sessions',\n headerActions,\n className,\n classNames,\n onIntent,\n}: AgentWorkbenchSidebarProps) {\n const { locale } = useMonkeysLocale();\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n const sessionsOnly = navigationMode === 'sessions-only';\n const searchRef = useRef<HTMLInputElement>(null);\n const renameInputRef = useRef<HTMLInputElement>(null);\n const [editingSessionId, setEditingSessionId] = useState<string>();\n const [editingTitle, setEditingTitle] = useState('');\n const query = viewModel.searchQuery.trim().toLocaleLowerCase();\n const agents = useMemo(\n () => viewModel.agents.items.filter((item) => !query || `${item.name} ${item.description ?? ''}`.toLocaleLowerCase().includes(query)),\n [query, viewModel.agents.items],\n );\n const sessions = useMemo(\n () => viewModel.sessions.items.filter((item) => !query || item.title.toLocaleLowerCase().includes(query)),\n [query, viewModel.sessions.items],\n );\n const chatbotSessions = useMemo(() => sessions.filter((item) => item.mode !== 'work'), [sessions]);\n const agentSessions = useMemo(() => sessions.filter((item) => item.mode === 'work'), [sessions]);\n\n useEffect(() => {\n const handleShortcut = (event: KeyboardEvent) => {\n if (!(event.ctrlKey || event.metaKey) || event.key.toLocaleLowerCase() !== 'k') return;\n event.preventDefault();\n searchRef.current?.focus();\n searchRef.current?.select();\n };\n window.addEventListener('keydown', handleShortcut);\n return () => window.removeEventListener('keydown', handleShortcut);\n }, []);\n\n useEffect(() => {\n if (!editingSessionId) return;\n renameInputRef.current?.focus();\n renameInputRef.current?.select();\n }, [editingSessionId]);\n\n const beginRenameSession = (item: AgentWorkbenchSessionItem) => {\n setEditingSessionId(item.id);\n setEditingTitle(item.title);\n };\n\n const cancelRenameSession = () => {\n setEditingSessionId(undefined);\n setEditingTitle('');\n };\n\n const saveRenameSession = (item: AgentWorkbenchSessionItem) => {\n const title = editingTitle.trim();\n if (title && title !== item.title) {\n onIntent?.({ type: 'rename-session', sessionId: item.id, title });\n }\n cancelRenameSession();\n };\n\n const renderSessionItems = (items: AgentWorkbenchSessionItem[]) => (\n <div className=\"space-y-1\">\n {items.map((item) => {\n const percent = item.contextUsage && item.contextUsage.maxTokens > 0\n ? Math.min(100, Math.round(item.contextUsage.usedTokens / item.contextUsage.maxTokens * 100))\n : undefined;\n return (\n <div key={item.id} aria-current={item.id === viewModel.selectedSessionItem ? 'page' : undefined} className={cn('group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-2 text-left hover:bg-muted aria-[current=page]:border-primary aria-[current=page]:bg-muted', classNames?.item)}>\n {editingSessionId === item.id ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted\"><SessionAvatar item={item} /></span>\n <span className=\"min-w-0 flex-1\">\n <input\n ref={renameInputRef}\n value={editingTitle}\n aria-label={messages.rename}\n className=\"h-6 w-full rounded border border-primary bg-background px-1.5 text-sm font-medium outline-none\"\n onChange={(event) => setEditingTitle(event.target.value)}\n onClick={(event) => event.stopPropagation()}\n onBlur={() => saveRenameSession(item)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n saveRenameSession(item);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n cancelRenameSession();\n }\n }}\n />\n <SessionMeta item={item} locale={locale} />\n </span>\n </div>\n ) : (\n <button type=\"button\" className=\"flex min-w-0 flex-1 items-center gap-3 text-left\" onClick={() => onIntent?.({ type: 'select-session', sessionId: item.id })}>\n <span className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted\"><SessionAvatar item={item} /></span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{item.title}</span>\n <SessionMeta item={item} locale={locale} />\n </span>\n </button>\n )}\n <span className=\"flex items-center gap-1\">\n {percent !== undefined && item.status === 'idle' ? <span className=\"text-xs text-foreground\" aria-label={messages.contextUsage({ percent })}>{percent}%</span> : <StatusIndicator status={item.status} />}\n {viewModel.capabilities.pinSessions ? <button type=\"button\" aria-label={item.pinned ? messages.unpin : messages.pin} className={cn('flex size-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-muted group-hover:opacity-100', item.pinned && 'text-primary opacity-100')} onClick={(event) => { event.stopPropagation(); onIntent?.({ type: 'toggle-session-pin', sessionId: item.id, pinned: !item.pinned }); }}><Pin className={cn('size-4', item.pinned && 'fill-current')} /></button> : null}\n <span onClick={(event) => event.stopPropagation()} onKeyDown={(event) => event.stopPropagation()}><SessionActions item={item} capabilities={viewModel.capabilities} onIntent={(intent) => intent.type === 'rename-session' ? beginRenameSession(item) : onIntent?.(intent)} /></span>\n </span>\n </div>\n );\n })}\n </div>\n );\n\n return (\n <nav aria-label={messages.tabsLabel} className={cn('h-full min-h-0', classNames?.root, className)}>\n <Tabs\n value={sessionsOnly ? 'sessions' : viewModel.activeTab}\n onValueChange={(value) => {\n if (!sessionsOnly && (value === 'agents' || value === 'sessions')) onIntent?.({ type: 'change-tab', tab: value });\n }}\n className=\"flex h-full min-h-0 flex-col bg-background text-foreground\"\n >\n <div className=\"shrink-0 space-y-3 p-4 pb-2\">\n <div className={cn('flex h-10 items-center gap-2 rounded-lg border border-border bg-card px-3 focus-within:ring-2 focus-within:ring-ring', classNames?.search)}>\n <Search className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={viewModel.searchQuery}\n aria-label={sessionsOnly ? messages.searchSessions : messages.search}\n placeholder={sessionsOnly ? messages.searchSessions : messages.search}\n className=\"min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:hidden\"\n onChange={(event) => onIntent?.({ type: 'change-search', query: event.target.value })}\n onKeyDown={(event) => {\n if (event.key !== 'Escape') return;\n onIntent?.({ type: 'change-search', query: '' });\n event.currentTarget.blur();\n }}\n />\n {viewModel.searchQuery ? (\n <button type=\"button\" className=\"flex size-6 items-center justify-center rounded-md hover:bg-muted\" aria-label={messages.clearSearch} onClick={() => onIntent?.({ type: 'change-search', query: '' })}>\n <X className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n ) : (\n <kbd className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">Ctrl K</kbd>\n )}\n </div>\n {!sessionsOnly || headerActions ? <div className=\"flex items-center gap-2\">\n {!sessionsOnly ? <TabsList className={cn('grid min-w-0 flex-1 grid-cols-2 text-foreground', classNames?.tabs)} aria-label={messages.tabsLabel}>\n <TabsTrigger value=\"agents\">{messages.agents}</TabsTrigger>\n <TabsTrigger value=\"sessions\">{messages.sessions}</TabsTrigger>\n </TabsList> : null}\n {headerActions ? <div className=\"flex shrink-0 items-center\">{headerActions}</div> : null}\n </div> : null}\n </div>\n\n {!sessionsOnly ? <TabsContent value=\"agents\" className={cn('mt-0 min-h-0 flex-1 overflow-y-auto px-4 pb-4', classNames?.body)}>\n {viewModel.capabilities.createAgent ? (\n <button type=\"button\" className=\"mb-3 flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'create-agent' })}>\n <Plus className=\"size-4\" aria-hidden=\"true\" />{messages.newAgent}\n </button>\n ) : null}\n <h3 className=\"mb-2 px-3 text-xs font-medium text-muted-foreground\">{messages.allAgents}</h3>\n <CollectionState status={viewModel.agents.status} empty={messages.emptyAgents} noResults={messages.noResults} hasItems={agents.length > 0} query={query} error={viewModel.agents.error} onRetry={() => onIntent?.({ type: 'retry-agents' })} />\n <div className=\"space-y-1\">\n {agents.map((item) => (\n <div\n key={item.id}\n aria-current={item.id === viewModel.selectedAgentItem ? 'page' : undefined}\n className={cn('group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-2 text-left hover:bg-muted aria-[current=page]:border-primary aria-[current=page]:bg-muted', classNames?.item)}\n >\n <button type=\"button\" className=\"flex min-w-0 flex-1 items-center gap-3 text-left\" onClick={() => onIntent?.({ type: 'select-agent', itemId: item.id })}>\n <span className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted\"><ItemAvatar item={item} /></span>\n <span className=\"min-w-0 flex-1\"><span className=\"block truncate text-sm font-medium\">{item.name}</span><span className=\"block truncate text-xs text-foreground/80\">{item.description || messages.noDescription}</span></span>\n </button>\n {item.builtIn ? <span className=\"rounded-full bg-muted px-1.5 py-1 text-[10px] text-foreground\">{messages.builtIn}</span> : null}\n {viewModel.capabilities.pinAgents ? (\n <button\n type=\"button\"\n aria-label={item.pinned ? messages.unpin : messages.pin}\n className={cn('flex size-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-muted group-hover:opacity-100', item.pinned && 'text-primary opacity-100')}\n onClick={(event) => { event.stopPropagation(); onIntent?.({ type: 'toggle-agent-pin', itemId: item.id, pinned: !item.pinned }); }}\n onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); onIntent?.({ type: 'toggle-agent-pin', itemId: item.id, pinned: !item.pinned }); } }}\n ><Pin className={cn('size-4', item.pinned && 'fill-current', item.pinPending && 'animate-pulse')} /></button>\n ) : null}\n </div>\n ))}\n </div>\n </TabsContent> : null}\n\n <TabsContent value=\"sessions\" className={cn('mt-0 min-h-0 flex-1 overflow-y-auto px-4 pb-4', classNames?.body)}>\n {viewModel.capabilities.createSession ? (\n <button type=\"button\" className=\"flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'create-session' })}>\n <SquarePen className=\"size-4\" aria-hidden=\"true\" />{messages.newSession}\n </button>\n ) : null}\n {!sessionsOnly && viewModel.capabilities.manageCapabilities ? (\n <button type=\"button\" className=\"mb-3 flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'open-capabilities' })}>\n <Blocks className=\"size-4\" aria-hidden=\"true\" />{messages.capabilities}\n </button>\n ) : null}\n {!sessionsOnly ? <h3 className=\"mb-2 px-3 text-xs font-medium text-muted-foreground\">{messages.recentSessions}</h3> : null}\n <CollectionState status={viewModel.sessions.status} empty={messages.emptySessions} noResults={messages.noResults} hasItems={sessions.length > 0} query={query} error={viewModel.sessions.error} onRetry={() => onIntent?.({ type: 'retry-sessions' })} />\n {sessionsOnly && sessions.length > 0 ? (\n <div className=\"space-y-2\">\n {[\n { id: 'chatbot', label: messages.chats, icon: MessageSquare, items: chatbotSessions },\n { id: 'agent', label: messages.agents, icon: Bot, items: agentSessions },\n ].map(({ id, label, icon: Icon, items }) => (\n <details key={id} open aria-label={label}>\n <summary className=\"flex h-9 cursor-pointer list-none items-center gap-2 rounded-md px-3 text-sm font-semibold hover:bg-muted\">\n <Icon className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n {label}\n </summary>\n {renderSessionItems(items)}\n </details>\n ))}\n </div>\n ) : !sessionsOnly ? renderSessionItems(sessions) : null}\n </TabsContent>\n\n {!sessionsOnly && viewModel.capabilities.manageAgentSettings ? (\n <div className={cn('shrink-0 border-t border-border p-4', classNames?.footer)}>\n <button type=\"button\" className=\"flex h-10 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'open-agent-settings' })}>\n <Settings className=\"size-4\" aria-hidden=\"true\" />{messages.settings}\n </button>\n </div>\n ) : null}\n </Tabs>\n </nav>\n );\n}\n","import type {\n AgentSessionCapabilities,\n AgentSessionEvent,\n AgentSessionViewModel,\n} from '@inf-monkeys-tech/monkeys';\n\ntype SessionEventType = AgentSessionEvent['eventType'];\nexport type AgentWorkbenchEventOf<Type extends SessionEventType> = Extract<\n AgentSessionEvent,\n { eventType: Type }\n>;\n\nconst EVENT_CAPABILITIES = {\n reasoning: 'reasoning',\n plan: 'plan',\n task: 'tasks',\n tool: 'tools',\n approval: 'approval',\n artifact: 'artifacts',\n usage: 'usage',\n} as const satisfies Partial<\n Record<SessionEventType, keyof AgentSessionCapabilities>\n>;\n\nexport interface AgentWorkbenchActivityModel {\n mode: AgentSessionViewModel['snapshot']['mode'];\n status: AgentSessionViewModel['status'];\n reasoning: AgentWorkbenchEventOf<'reasoning'>[];\n plans: AgentWorkbenchEventOf<'plan'>[];\n tasks: AgentWorkbenchEventOf<'task'>[];\n tools: AgentWorkbenchEventOf<'tool'>[];\n approvals: AgentWorkbenchEventOf<'approval'>[];\n artifacts: AgentWorkbenchEventOf<'artifact'>[];\n usage?: AgentWorkbenchEventOf<'usage'>;\n run?: AgentWorkbenchEventOf<'status'> & { resolvedDurationMs?: number };\n}\n\nfunction projectRun(events: AgentSessionEvent[]): AgentWorkbenchActivityModel['run'] {\n const statuses = events.filter(\n (event): event is AgentWorkbenchEventOf<'status'> => event.eventType === 'status',\n );\n const run = statuses.at(-1);\n if (!run) return undefined;\n if (run.payload.status !== 'stopped' || run.payload.durationMs !== undefined) return run;\n\n const runStatuses = run.runId\n ? statuses.filter((event) => event.runId === run.runId && event.sequence <= run.sequence)\n : statuses.filter((event) => event.sequence <= run.sequence);\n let previousStoppedIndex = -1;\n for (let index = runStatuses.length - 1; index >= 0; index -= 1) {\n const event = runStatuses[index];\n if (event.sequence < run.sequence && event.payload.status === 'stopped') {\n previousStoppedIndex = index;\n break;\n }\n }\n const started = runStatuses\n .slice(previousStoppedIndex + 1)\n .reverse()\n .find((event) => event.payload.status === 'running' || event.payload.status === 'queued');\n const startedAt = started?.payload.startedAt ?? started?.occurredAt;\n const stoppedAt = run.payload.stoppedAt ?? run.occurredAt;\n if (!startedAt || !stoppedAt) return run;\n const durationMs = Date.parse(stoppedAt) - Date.parse(startedAt);\n return Number.isFinite(durationMs) && durationMs >= 0\n ? { ...run, resolvedDurationMs: durationMs }\n : run;\n}\n\nfunction isVisible(\n event: AgentSessionEvent,\n capabilities: AgentSessionCapabilities,\n): boolean {\n const capability = EVENT_CAPABILITIES[\n event.eventType as keyof typeof EVENT_CAPABILITIES\n ];\n return capability ? capabilities[capability] === true : true;\n}\n\nfunction latestBy<Type extends SessionEventType>(\n events: AgentSessionEvent[],\n eventType: Type,\n key: (event: AgentWorkbenchEventOf<Type>) => string,\n): AgentWorkbenchEventOf<Type>[] {\n const latest = new Map<string, AgentWorkbenchEventOf<Type>>();\n for (const event of events) {\n if (event.eventType !== eventType) continue;\n const typedEvent = event as AgentWorkbenchEventOf<Type>;\n latest.set(key(typedEvent), typedEvent);\n }\n return [...latest.values()].sort(\n (left, right) => left.sequence - right.sequence,\n );\n}\n\nexport function createAgentWorkbenchActivityModel(\n viewModel: AgentSessionViewModel,\n): AgentWorkbenchActivityModel {\n const visibleEvents = viewModel.events.filter((event) =>\n isVisible(event, viewModel.snapshot.capabilities),\n );\n\n return {\n mode: viewModel.snapshot.mode,\n status: viewModel.status,\n reasoning: latestBy(\n visibleEvents,\n 'reasoning',\n (event) => event.payload.reasoningId,\n ),\n plans: latestBy(\n visibleEvents,\n 'plan',\n (event) => event.payload.planId,\n ),\n tasks: latestBy(\n visibleEvents,\n 'task',\n (event) => event.payload.taskId,\n ),\n tools: latestBy(\n visibleEvents,\n 'tool',\n (event) => event.payload.toolCallId,\n ),\n approvals: latestBy(\n visibleEvents,\n 'approval',\n (event) => event.payload.approvalId,\n ),\n artifacts: latestBy(\n visibleEvents,\n 'artifact',\n (event) => event.payload.artifactId,\n ),\n usage: [...visibleEvents]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'usage'> =>\n event.eventType === 'usage',\n ),\n run: projectRun(visibleEvents),\n };\n}\n","import { CheckCircle2, ChevronDown, Clock3, Loader2, TerminalSquare, XCircle } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport type { AgentWorkbenchEventOf } from './activity-model';\n\nexport interface AgentWorkbenchToolClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n input?: string;\n output?: string;\n}\n\nexport interface AgentWorkbenchToolProps {\n event: AgentWorkbenchEventOf<'tool'>;\n expanded?: boolean;\n defaultExpanded?: boolean;\n className?: string;\n classNames?: AgentWorkbenchToolClassNames;\n onExpandedChange?: (expanded: boolean) => void;\n}\n\nfunction JsonValue({ value, className }: { value: unknown; className?: string }) {\n if (value === undefined) return null;\n const content = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return (\n <pre\n className={cn(\n 'max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted p-3 font-mono text-xs text-foreground',\n className,\n )}\n >\n {content}\n </pre>\n );\n}\n\nfunction ToolStatus({ status }: { status: AgentWorkbenchEventOf<'tool'>['payload']['status'] }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.tool.status;\n const commonClassName = 'size-3.5 shrink-0';\n\n if (status === 'pending') {\n return <Clock3 className={commonClassName} aria-hidden=\"true\" />;\n }\n if (status === 'running') {\n return <Loader2 className={cn(commonClassName, 'animate-spin')} aria-hidden=\"true\" />;\n }\n if (status === 'completed') {\n return <CheckCircle2 className={cn(commonClassName, 'text-primary')} aria-hidden=\"true\" />;\n }\n return <XCircle className={cn(commonClassName, 'text-destructive-text')} aria-hidden=\"true\" />;\n}\n\nexport function AgentWorkbenchTool({\n event,\n expanded,\n defaultExpanded = event.payload.status === 'failed',\n className,\n classNames,\n onExpandedChange,\n}: AgentWorkbenchToolProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.tool;\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(defaultExpanded);\n const isControlled = expanded !== undefined;\n const isExpanded = expanded ?? uncontrolledExpanded;\n const status = event.payload.status;\n const setExpanded = (nextExpanded: boolean) => {\n if (!isControlled) setUncontrolledExpanded(nextExpanded);\n onExpandedChange?.(nextExpanded);\n };\n\n return (\n <details\n open={isExpanded}\n className={cn(\n 'group rounded-lg border border-border bg-card text-card-foreground',\n classNames?.root,\n className,\n )}\n data-tool-status={status}\n >\n <summary\n className={cn(\n 'flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden',\n classNames?.trigger,\n )}\n onClick={(event) => {\n event.preventDefault();\n setExpanded(!isExpanded);\n }}\n >\n <TerminalSquare className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate font-medium\">{event.payload.toolName}</span>\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-foreground\">\n <ToolStatus status={status} />\n {messages.status[status]}\n </span>\n <ChevronDown\n className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\"\n aria-hidden=\"true\"\n />\n </summary>\n <div className={cn('space-y-3 border-t border-border px-3 py-3 text-sm', classNames?.content)}>\n {event.payload.input !== undefined ? (\n <div className=\"space-y-1.5\">\n <div className=\"text-xs font-medium text-muted-foreground\">{messages.input}</div>\n <JsonValue value={event.payload.input} className={classNames?.input} />\n </div>\n ) : null}\n {event.payload.output !== undefined ? (\n <div className=\"space-y-1.5\">\n <div className=\"text-xs font-medium text-muted-foreground\">{messages.output}</div>\n <JsonValue value={event.payload.output} className={classNames?.output} />\n </div>\n ) : null}\n {event.payload.error ? (\n <p className=\"text-sm text-destructive-text\" role=\"alert\">\n {event.payload.error}\n </p>\n ) : null}\n </div>\n </details>\n );\n}\n","import type { AgentSessionViewModel } from '@inf-monkeys-tech/monkeys';\nimport {\n Check,\n CheckCircle2,\n ChevronDown,\n Circle,\n CircleStop,\n Clock3,\n Download,\n FileOutput,\n Loader2,\n X,\n XCircle,\n} from 'lucide-react';\nimport type { ComponentType, ReactNode } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n createAgentWorkbenchActivityModel,\n type AgentWorkbenchEventOf,\n} from './activity-model';\nimport { AgentWorkbenchTool } from './AgentWorkbenchTool';\n\nexport interface AgentWorkbenchApprovalIntent {\n approvalId: string;\n approved: boolean;\n}\n\nexport interface AgentWorkbenchArtifactIntent {\n artifactId: string;\n name: string;\n url: string;\n}\n\nexport interface AgentWorkbenchActivityClassNames {\n root?: string;\n item?: string;\n trigger?: string;\n content?: string;\n approval?: string;\n artifact?: string;\n usage?: string;\n}\n\nexport interface AgentWorkbenchActivityProps {\n viewModel?: AgentSessionViewModel;\n ariaLabel?: string;\n hiddenToolCallIds?: ReadonlySet<string>;\n hideReasoning?: boolean;\n hideStoppedRun?: boolean;\n className?: string;\n classNames?: AgentWorkbenchActivityClassNames;\n onApprovalDecision?: (intent: AgentWorkbenchApprovalIntent) => void;\n onArtifactOpen?: (intent: AgentWorkbenchArtifactIntent) => void;\n}\n\ninterface ActivityDetailsProps {\n icon: ComponentType<{ className?: string }>;\n title: ReactNode;\n open?: boolean;\n streaming?: boolean;\n className?: string;\n triggerClassName?: string;\n contentClassName?: string;\n children: ReactNode;\n}\n\nfunction ActivityDetails({\n icon: Icon,\n title,\n open,\n streaming,\n className,\n triggerClassName,\n contentClassName,\n children,\n}: ActivityDetailsProps) {\n return (\n <details\n className={cn(\n 'group rounded-lg border border-border bg-card text-card-foreground',\n className,\n )}\n open={open}\n >\n <summary\n className={cn(\n 'flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden',\n triggerClassName,\n )}\n >\n {streaming ? (\n <Loader2 className=\"size-4 shrink-0 animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n <ChevronDown\n className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\"\n aria-hidden=\"true\"\n />\n </summary>\n <div\n className={cn(\n 'border-t border-border px-3 py-3 text-sm',\n contentClassName,\n )}\n >\n {children}\n </div>\n </details>\n );\n}\n\nfunction StatusIcon({ status }: { status: string }) {\n if (status === 'completed' || status === 'passed') {\n return <CheckCircle2 className=\"size-4 text-primary\" aria-hidden=\"true\" />;\n }\n if (status === 'failed') {\n return <XCircle className=\"size-4 text-destructive-text\" aria-hidden=\"true\" />;\n }\n if (status === 'running') {\n return <Clock3 className=\"size-4 animate-pulse\" aria-hidden=\"true\" />;\n }\n return <Circle className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />;\n}\n\nfunction JsonValue({ value }: { value: unknown }) {\n if (value === undefined) return null;\n const content =\n typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return (\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted p-3 font-mono text-xs text-foreground\">\n {content}\n </pre>\n );\n}\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1_000) return '<1s';\n const totalSeconds = Math.floor(durationMs / 1_000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;\n}\n\nfunction RunStatus({\n event,\n}: {\n event: AgentWorkbenchEventOf<'status'> & { resolvedDurationMs?: number };\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const status = event.payload.status;\n if (status !== 'stopping' && status !== 'stopped') return null;\n\n return (\n <div\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n role=\"status\"\n >\n {status === 'stopping' ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n ) : (\n <CircleStop className=\"size-4\" aria-hidden=\"true\" />\n )}\n <span>\n {status === 'stopping'\n ? messages.run.stopping\n : messages.run.stoppedAfter({\n duration: formatDuration(\n event.payload.durationMs ?? event.resolvedDurationMs ?? 0,\n ),\n })}\n </span>\n </div>\n );\n}\n\nexport function AgentWorkbenchActivity({\n viewModel,\n ariaLabel,\n hiddenToolCallIds,\n hideReasoning = false,\n hideStoppedRun = false,\n className,\n classNames,\n onApprovalDecision,\n onArtifactOpen,\n}: AgentWorkbenchActivityProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n if (!viewModel) return null;\n\n const activity = createAgentWorkbenchActivityModel(viewModel);\n const reasoning = hideReasoning ? [] : activity.reasoning;\n const tools = activity.tools.filter(\n (event) => !hiddenToolCallIds?.has(event.payload.toolCallId),\n );\n const approvals = activity.approvals.filter(\n (event) =>\n !event.payload.toolCallId ||\n !hiddenToolCallIds?.has(event.payload.toolCallId),\n );\n const usage = activity.usage?.payload;\n const contextWindow =\n typeof usage?.contextWindow === 'number' && usage.contextWindow > 0\n ? usage.contextWindow\n : undefined;\n const showRun =\n activity.run?.payload.status === 'stopping' ||\n (activity.run?.payload.status === 'stopped' && !hideStoppedRun);\n const hasActivity =\n reasoning.length > 0 ||\n activity.plans.length > 0 ||\n activity.tasks.length > 0 ||\n tools.length > 0 ||\n approvals.length > 0 ||\n activity.artifacts.length > 0 ||\n showRun ||\n contextWindow !== undefined;\n if (!hasActivity) return null;\n\n return (\n <section\n className={cn('space-y-3', classNames?.root, className)}\n aria-label={ariaLabel ?? messages.label}\n data-agent-workbench-mode={activity.mode}\n data-agent-workbench-status={activity.status}\n >\n {reasoning.map((event) => (\n <ActivityDetails\n key={event.payload.reasoningId}\n icon={Circle}\n title={messages.reasoning}\n open={event.payload.status === 'streaming'}\n streaming={event.payload.status === 'streaming'}\n className={classNames?.item}\n triggerClassName={classNames?.trigger}\n contentClassName={classNames?.content}\n >\n <div className=\"whitespace-pre-wrap text-muted-foreground\">\n {event.payload.text}\n </div>\n </ActivityDetails>\n ))}\n\n {activity.plans.map((event) => (\n <ActivityDetails\n key={event.payload.planId}\n icon={Circle}\n title={event.payload.title || messages.plan}\n open={event.payload.status === 'running'}\n streaming={event.payload.status === 'running'}\n className={classNames?.item}\n triggerClassName={classNames?.trigger}\n contentClassName={classNames?.content}\n >\n <ol className=\"space-y-2\">\n {event.payload.steps.map((step) => (\n <li key={step.id} className=\"flex items-center gap-2\">\n <StatusIcon status={step.status} />\n <span>{step.title}</span>\n </li>\n ))}\n </ol>\n </ActivityDetails>\n ))}\n\n {activity.tasks.map((event) => (\n <ActivityDetails\n key={event.payload.taskId}\n icon={Circle}\n title={event.payload.title}\n open={event.payload.status === 'running'}\n streaming={event.payload.status === 'running'}\n className={classNames?.item}\n triggerClassName={classNames?.trigger}\n contentClassName={classNames?.content}\n >\n <div className=\"flex items-start gap-2\">\n <StatusIcon status={event.payload.status} />\n <span className=\"whitespace-pre-wrap text-muted-foreground\">\n {event.payload.detail || messages.taskNoDetail}\n </span>\n </div>\n </ActivityDetails>\n ))}\n\n {tools.map((event) => (\n <AgentWorkbenchTool\n key={event.payload.toolCallId}\n event={event}\n defaultExpanded={event.payload.status === 'failed'}\n classNames={{\n root: classNames?.item,\n trigger: classNames?.trigger,\n content: classNames?.content,\n }}\n />\n ))}\n\n {approvals.map((event) => {\n const requested = event.payload.status === 'requested';\n const approved = event.payload.status === 'approved';\n return (\n <article\n key={event.payload.approvalId}\n className={cn(\n 'rounded-lg border border-border bg-card p-3 text-card-foreground',\n classNames?.approval,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {requested ? (\n <Clock3 className=\"mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n ) : approved ? (\n <Check className=\"mt-0.5 size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n ) : (\n <X className=\"mt-0.5 size-4 shrink-0 text-destructive-text\" aria-hidden=\"true\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-medium\">{event.payload.title}</h3>\n {event.payload.description ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {event.payload.description}\n </p>\n ) : null}\n {event.payload.requestedAction !== undefined ? (\n <div className=\"mt-3\">\n <JsonValue value={event.payload.requestedAction} />\n </div>\n ) : null}\n {requested ? (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground outline-none hover:bg-primary/90 focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n disabled={!onApprovalDecision}\n onClick={() =>\n onApprovalDecision?.({\n approvalId: event.payload.approvalId,\n approved: true,\n })\n }\n >\n {messages.approval.approve}\n </button>\n <button\n type=\"button\"\n className=\"rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium text-foreground outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n disabled={!onApprovalDecision}\n onClick={() =>\n onApprovalDecision?.({\n approvalId: event.payload.approvalId,\n approved: false,\n })\n }\n >\n {messages.approval.reject}\n </button>\n </div>\n ) : (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {approved\n ? messages.approval.approved\n : messages.approval.rejected}\n </p>\n )}\n </div>\n </div>\n </article>\n );\n })}\n\n {activity.artifacts.map((event) => {\n const canOpen = Boolean(event.payload.url && onArtifactOpen);\n return (\n <article\n key={event.payload.artifactId}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border bg-card p-3 text-card-foreground',\n classNames?.artifact,\n )}\n >\n <FileOutput className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">\n {event.payload.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {messages.artifact[event.payload.status]}\n </div>\n </div>\n {event.payload.url ? (\n <button\n type=\"button\"\n className=\"rounded-md p-2 text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={messages.artifact.open({\n name: event.payload.name,\n })}\n disabled={!canOpen}\n onClick={() => {\n if (!event.payload.url) return;\n onArtifactOpen?.({\n artifactId: event.payload.artifactId,\n name: event.payload.name,\n url: event.payload.url,\n });\n }}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </article>\n );\n })}\n\n {showRun && activity.run ? <RunStatus event={activity.run} /> : null}\n\n {usage && contextWindow !== undefined ? (\n <div\n className={cn('flex justify-end', classNames?.usage)}\n aria-label={messages.usage.label}\n >\n <span className=\"rounded-full border border-border bg-muted px-2.5 py-1 text-xs text-foreground\">\n {messages.usage.context({\n used: usage.contextTokens ?? usage.totalTokens ?? 0,\n total: contextWindow,\n })}\n </span>\n </div>\n ) : null}\n </section>\n );\n}\n","import type {\n AgentSessionCapabilities,\n AgentSessionEvent,\n AgentSessionViewModel,\n} from '@inf-monkeys-tech/monkeys';\n\nimport type { AgentWorkbenchEventOf } from './activity-model';\n\nconst WORKSPACE_CAPABILITIES = {\n diff: 'diff',\n 'workspace-file': 'workspaceFiles',\n terminal: 'terminal',\n 'test-result': 'testResults',\n artifact: 'artifacts',\n} as const satisfies Partial<\n Record<AgentSessionEvent['eventType'], keyof AgentSessionCapabilities>\n>;\n\nexport interface AgentWorkbenchTerminalModel {\n terminalId: string;\n stdin: string;\n stdout: string;\n stderr: string;\n status: string;\n exitCode?: number;\n sequence: number;\n}\n\nexport interface AgentWorkbenchDetailsModel {\n mode: AgentSessionViewModel['snapshot']['mode'];\n modelId: string;\n permissionProfile?: AgentSessionViewModel['snapshot']['permissionProfile'];\n status: AgentSessionViewModel['status'];\n sessionId: string;\n capabilities: AgentSessionCapabilities;\n resumable: boolean;\n summary?: AgentWorkbenchEventOf<'summary'>;\n error?: AgentWorkbenchEventOf<'error'>;\n run?: AgentWorkbenchEventOf<'status'>;\n usage?: AgentWorkbenchEventOf<'usage'>;\n workspace: {\n diffs: AgentWorkbenchEventOf<'diff'>[];\n files: AgentWorkbenchEventOf<'workspace-file'>[];\n terminals: AgentWorkbenchTerminalModel[];\n tests: AgentWorkbenchEventOf<'test-result'>[];\n artifacts: AgentWorkbenchEventOf<'artifact'>[];\n };\n}\n\nfunction latestBy<Type extends AgentSessionEvent['eventType']>(\n events: AgentSessionEvent[],\n eventType: Type,\n key: (event: AgentWorkbenchEventOf<Type>) => string,\n): AgentWorkbenchEventOf<Type>[] {\n const latest = new Map<string, AgentWorkbenchEventOf<Type>>();\n for (const event of events) {\n if (event.eventType !== eventType) continue;\n const typedEvent = event as AgentWorkbenchEventOf<Type>;\n latest.set(key(typedEvent), typedEvent);\n }\n return [...latest.values()].sort(\n (left, right) => left.sequence - right.sequence,\n );\n}\n\nfunction projectTerminals(\n events: AgentWorkbenchEventOf<'terminal'>[],\n): AgentWorkbenchTerminalModel[] {\n const terminals = new Map<string, AgentWorkbenchTerminalModel>();\n for (const event of events) {\n const current = terminals.get(event.payload.terminalId) ?? {\n terminalId: event.payload.terminalId,\n stdin: '',\n stdout: '',\n stderr: '',\n status: '',\n sequence: event.sequence,\n };\n const stream = event.payload.stream;\n terminals.set(event.payload.terminalId, {\n ...current,\n ...(stream === 'status'\n ? { status: event.payload.chunk }\n : { [stream]: `${current[stream]}${event.payload.chunk}` }),\n ...(event.payload.exitCode === undefined\n ? {}\n : { exitCode: event.payload.exitCode }),\n sequence: event.sequence,\n });\n }\n return [...terminals.values()].sort(\n (left, right) => left.sequence - right.sequence,\n );\n}\n\nexport function createAgentWorkbenchDetailsModel(\n viewModel: AgentSessionViewModel,\n): AgentWorkbenchDetailsModel {\n const capabilities = viewModel.snapshot.capabilities;\n const workspaceEvents = viewModel.events.filter((event) => {\n const capability = WORKSPACE_CAPABILITIES[\n event.eventType as keyof typeof WORKSPACE_CAPABILITIES\n ];\n return capability ? capabilities[capability] === true : false;\n });\n const run = [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'status'> =>\n event.eventType === 'status',\n );\n const currentRunId = run?.runId;\n const summary = [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'summary'> =>\n event.eventType === 'summary' &&\n capabilities.summary === true &&\n (!currentRunId || event.runId === currentRunId),\n );\n\n return {\n mode: viewModel.snapshot.mode,\n modelId: viewModel.snapshot.modelId,\n permissionProfile: viewModel.snapshot.permissionProfile,\n status: viewModel.status,\n sessionId: viewModel.sessionId,\n capabilities,\n resumable: capabilities.resume === true && viewModel.resumable,\n summary,\n error: [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'error'> =>\n event.eventType === 'error',\n ),\n run,\n usage: capabilities.usage\n ? [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'usage'> =>\n event.eventType === 'usage',\n )\n : undefined,\n workspace: {\n diffs: latestBy(workspaceEvents, 'diff', (event) => event.payload.path),\n files: latestBy(\n workspaceEvents,\n 'workspace-file',\n (event) => event.payload.path,\n ),\n terminals: projectTerminals(\n workspaceEvents.filter(\n (event): event is AgentWorkbenchEventOf<'terminal'> =>\n event.eventType === 'terminal',\n ),\n ),\n tests: latestBy(\n workspaceEvents,\n 'test-result',\n (event) => event.payload.testId,\n ),\n artifacts: latestBy(\n workspaceEvents,\n 'artifact',\n (event) => event.payload.artifactId,\n ),\n },\n };\n}\n","import type { AgentSessionViewModel } from '@inf-monkeys-tech/monkeys';\nimport {\n AlertCircle,\n CheckCircle2,\n ChevronDown,\n Circle,\n Clock3,\n Copy,\n Download,\n FileCode2,\n FileOutput,\n Files,\n GitFork,\n PencilLine,\n RefreshCw,\n RotateCcw,\n TerminalSquare,\n TestTube2,\n X,\n XCircle,\n} from 'lucide-react';\nimport type { ComponentType, KeyboardEvent, ReactNode } from 'react';\n\nimport { useMonkeysLocale, useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n createAgentWorkbenchDetailsModel,\n type AgentWorkbenchDetailsModel,\n} from './details-model';\n\nexport type AgentWorkbenchDetailsTab = 'summary' | 'workspace';\nexport type AgentWorkbenchDetailsState =\n | 'ready'\n | 'loading'\n | 'empty'\n | 'error';\n\nexport type AgentWorkbenchDetailsIntent =\n | { type: 'close' }\n | { type: 'copy-summary'; summaryId: string; text: string }\n | { type: 'retry'; eventId: string }\n | { type: 'retry-summary'; eventId: string }\n | { type: 'resume'; sessionId: string }\n | { type: 'continue-in-new-task'; sessionId: string }\n | { type: 'edit-and-rerun'; sessionId: string }\n | { type: 'export'; sessionId: string };\n\nexport interface AgentWorkbenchTaskDetailsClassNames {\n root?: string;\n header?: string;\n tabs?: string;\n body?: string;\n section?: string;\n code?: string;\n}\n\nexport interface AgentWorkbenchTaskDetailsProps {\n viewModel?: AgentSessionViewModel;\n state?: AgentWorkbenchDetailsState;\n activeTab?: AgentWorkbenchDetailsTab;\n className?: string;\n classNames?: AgentWorkbenchTaskDetailsClassNames;\n onActiveTabChange?: (tab: AgentWorkbenchDetailsTab) => void;\n onIntent?: (intent: AgentWorkbenchDetailsIntent) => void;\n}\n\nfunction formatDuration(durationMs: number | undefined): string {\n if (durationMs === undefined) return '-';\n const seconds = Math.max(0, Math.round(durationMs / 1_000));\n if (seconds < 60) return `${seconds}s`;\n return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\nfunction formatDate(value: string | undefined, locale: string): string {\n if (!value) return '-';\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return '-';\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n}\n\nfunction Count({ value }: { value: number }) {\n return (\n <span className=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-semibold text-foreground\">\n {value}\n </span>\n );\n}\n\nfunction DetailsSection({\n title,\n count,\n icon: Icon,\n className,\n children,\n}: {\n title: string;\n count: number;\n icon: ComponentType<{ className?: string }>;\n className?: string;\n children: ReactNode;\n}) {\n if (count === 0) return null;\n return (\n <details\n className={cn(\n 'group rounded-lg border border-border bg-card text-card-foreground',\n className,\n )}\n open\n >\n <summary className=\"flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden\">\n <Icon className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n <Count value={count} />\n <ChevronDown\n className=\"size-4 text-muted-foreground transition-transform group-open:rotate-180\"\n aria-hidden=\"true\"\n />\n </summary>\n <div className=\"border-t border-border p-3\">{children}</div>\n </details>\n );\n}\n\nfunction StatusIcon({ status }: { status: string }) {\n if (status === 'completed' || status === 'passed') {\n return <CheckCircle2 className=\"size-4 text-primary\" aria-hidden=\"true\" />;\n }\n if (status === 'failed') {\n return <XCircle className=\"size-4 text-destructive-text\" aria-hidden=\"true\" />;\n }\n if (status === 'running') {\n return <Clock3 className=\"size-4 animate-pulse\" aria-hidden=\"true\" />;\n }\n return <Circle className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />;\n}\n\nfunction StateContent({ state }: { state: Exclude<AgentWorkbenchDetailsState, 'ready'> }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.details;\n const error = state === 'error';\n return (\n <div\n className=\"flex min-h-48 flex-col items-center justify-center gap-2 px-6 text-center\"\n role={error ? 'alert' : state === 'loading' ? 'status' : undefined}\n aria-busy={state === 'loading' || undefined}\n >\n {state === 'loading' ? (\n <RefreshCw className=\"size-5 animate-spin text-muted-foreground\" aria-hidden=\"true\" />\n ) : error ? (\n <AlertCircle className=\"size-5 text-destructive-text\" aria-hidden=\"true\" />\n ) : (\n <FileOutput className=\"size-5 text-muted-foreground\" aria-hidden=\"true\" />\n )}\n <div className=\"text-sm font-medium\">{messages.state[state].title}</div>\n <div className=\"text-xs text-muted-foreground\">\n {messages.state[state].description}\n </div>\n </div>\n );\n}\n\nfunction SummaryPanel({\n model,\n onIntent,\n}: {\n model: AgentWorkbenchDetailsModel;\n onIntent?: (intent: AgentWorkbenchDetailsIntent) => void;\n}) {\n const workbenchMessages = useMonkeysLocaleMessages().agentWorkbench;\n const messages = workbenchMessages.details;\n const locale = useMonkeysLocale().locale;\n const summary = model.summary;\n const run = model.run?.payload;\n const error = model.error;\n const retryable = model.status === 'failed' && error?.payload.retryable;\n const canResume =\n model.resumable && ['stopped', 'completed', 'failed'].includes(model.status);\n const canContinueInNewTask = model.capabilities.threadForking;\n const canEditAndRerun = model.capabilities.editAndRerun;\n const tokenUsage =\n model.usage?.payload.totalTokens ??\n (model.usage?.payload.inputTokens !== undefined ||\n model.usage?.payload.outputTokens !== undefined\n ? (model.usage.payload.inputTokens ?? 0) +\n (model.usage.payload.outputTokens ?? 0)\n : undefined);\n\n return (\n <div className=\"space-y-3\">\n <section className=\"rounded-lg border border-border bg-muted/40 p-3\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon status={model.status} />\n <span className=\"text-sm font-semibold\">\n {messages.status[model.status]}\n </span>\n </div>\n <dl className=\"mt-3 grid grid-cols-2 gap-3 text-xs\">\n <div>\n <dt className=\"text-muted-foreground\">{messages.duration}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {formatDuration(run?.durationMs)}\n </dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{messages.updated}</dt>\n <dd className=\"mt-0.5 truncate font-medium\">\n {formatDate(\n run?.stoppedAt ?? run?.completedAt ?? run?.failedAt,\n locale,\n )}\n </dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{messages.model}</dt>\n <dd className=\"mt-0.5 truncate font-medium\">{model.modelId}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{messages.mode}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {workbenchMessages.modes[model.mode]}\n </dd>\n </div>\n {model.permissionProfile ? (\n <div>\n <dt className=\"text-muted-foreground\">{messages.permissions}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {workbenchMessages.composer.permissionOptions[model.permissionProfile]}\n </dd>\n </div>\n ) : null}\n {tokenUsage !== undefined ? (\n <div>\n <dt className=\"text-muted-foreground\">{messages.tokenUsage}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {new Intl.NumberFormat(locale).format(tokenUsage)}\n </dd>\n </div>\n ) : null}\n </dl>\n {error ? (\n <div className=\"mt-3 rounded-md border border-destructive/30 bg-destructive/5 p-2.5 text-sm text-destructive-text\" role=\"alert\">\n {error.payload.message}\n </div>\n ) : null}\n {retryable || canResume ? (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {retryable ? (\n <button\n type=\"button\"\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'retry', eventId: error.eventId })}\n >\n {messages.actions.retry}\n </button>\n ) : null}\n {canResume ? (\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-2.5 py-1.5 text-xs font-medium text-primary-foreground outline-none hover:bg-primary/90 focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() =>\n onIntent?.({ type: 'resume', sessionId: model.sessionId })\n }\n >\n {messages.actions.resume}\n </button>\n ) : null}\n </div>\n ) : null}\n </section>\n\n <section className=\"flex flex-wrap gap-2 rounded-lg border border-border bg-card p-3 text-card-foreground\">\n {canContinueInNewTask ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'continue-in-new-task', sessionId: model.sessionId })}\n >\n <GitFork className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.continueInNewTask}\n </button>\n ) : null}\n {canEditAndRerun ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'edit-and-rerun', sessionId: model.sessionId })}\n >\n <PencilLine className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.editAndRerun}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'export', sessionId: model.sessionId })}\n >\n <Download className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.export}\n </button>\n </section>\n\n <section className=\"rounded-lg border border-border bg-card p-3 text-card-foreground\">\n <div className=\"flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-semibold\">{messages.summary}</h3>\n {summary?.payload.text ? (\n <button\n type=\"button\"\n className=\"rounded-md p-1.5 text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.actions.copySummary}\n disabled={!onIntent}\n onClick={() =>\n onIntent?.({\n type: 'copy-summary',\n summaryId: summary.payload.summaryId,\n text: summary.payload.text,\n })\n }\n >\n <Copy className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n {summary?.payload.status === 'failed' ? (\n <div className=\"mt-3 space-y-2\">\n <p className=\"text-sm text-destructive-text\" role=\"alert\">\n {messages.summaryFailed}\n </p>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() =>\n onIntent?.({ type: 'retry-summary', eventId: summary.eventId })\n }\n >\n <RotateCcw className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.retrySummary}\n </button>\n </div>\n ) : summary?.payload.text ? (\n <div className=\"mt-3 space-y-3 text-sm\">\n <p className=\"whitespace-pre-wrap text-muted-foreground\">\n {summary.payload.text}\n </p>\n {summary.payload.highlights.length > 0 ? (\n <div>\n <h4 className=\"text-xs font-medium\">{messages.highlights}</h4>\n <ul className=\"mt-1 list-disc space-y-1 pl-5 text-muted-foreground\">\n {summary.payload.highlights.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n </div>\n ) : null}\n {summary.payload.pendingItems.length > 0 ? (\n <div>\n <h4 className=\"text-xs font-medium\">{messages.pendingItems}</h4>\n <ul className=\"mt-1 list-disc space-y-1 pl-5 text-muted-foreground\">\n {summary.payload.pendingItems.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n ) : (\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {messages.summaryEmpty}\n </p>\n )}\n </section>\n </div>\n );\n}\n\nfunction WorkspacePanel({\n model,\n sectionClassName,\n codeClassName,\n}: {\n model: AgentWorkbenchDetailsModel;\n sectionClassName?: string;\n codeClassName?: string;\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.details.workspace;\n const workspace = model.workspace;\n return (\n <div className=\"space-y-3\">\n <DetailsSection\n title={messages.diffs}\n count={workspace.diffs.length}\n icon={FileCode2}\n className={sectionClassName}\n >\n <div className=\"space-y-3\">\n {workspace.diffs.map((event) => (\n <div key={event.payload.path} className=\"min-w-0\">\n <div className=\"flex items-center justify-between gap-2 text-xs\">\n <span className=\"truncate font-medium\">{event.payload.path}</span>\n <span className=\"shrink-0 text-muted-foreground\">\n {messages.diffStatus[event.payload.status]}\n </span>\n </div>\n {event.payload.patch ? (\n <pre className={cn('mt-2 max-h-72 overflow-auto whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs', codeClassName)}>\n {event.payload.patch}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </DetailsSection>\n\n <DetailsSection\n title={messages.files}\n count={workspace.files.length}\n icon={Files}\n className={sectionClassName}\n >\n <ul className=\"space-y-2 text-xs\">\n {workspace.files.map((event) => (\n <li key={event.payload.path} className=\"flex items-center gap-2\">\n <FileOutput className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{event.payload.path}</span>\n <span className=\"text-muted-foreground\">\n {messages.fileOperation[event.payload.operation]}\n </span>\n </li>\n ))}\n </ul>\n </DetailsSection>\n\n <DetailsSection\n title={messages.terminals}\n count={workspace.terminals.length}\n icon={TerminalSquare}\n className={sectionClassName}\n >\n <div className=\"space-y-3\">\n {workspace.terminals.map((terminal) => (\n <div key={terminal.terminalId}>\n <div className=\"flex justify-between gap-2 text-xs font-medium\">\n <span>{terminal.terminalId}</span>\n <span className=\"text-muted-foreground\">\n {terminal.exitCode === undefined\n ? terminal.status\n : messages.exitCode({ code: terminal.exitCode })}\n </span>\n </div>\n <pre className={cn('mt-2 max-h-72 overflow-auto whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs', codeClassName)}>\n {[terminal.stdin, terminal.stdout, terminal.stderr]\n .filter(Boolean)\n .join('\\n')}\n </pre>\n </div>\n ))}\n </div>\n </DetailsSection>\n\n <DetailsSection\n title={messages.tests}\n count={workspace.tests.length}\n icon={TestTube2}\n className={sectionClassName}\n >\n <ul className=\"space-y-2 text-xs\">\n {workspace.tests.map((event) => (\n <li key={event.payload.testId}>\n <div className=\"flex items-center gap-2\">\n <StatusIcon status={event.payload.status} />\n <span className=\"min-w-0 flex-1 truncate\">{event.payload.name}</span>\n {event.payload.durationMs === undefined ? null : (\n <span className=\"text-muted-foreground\">\n {formatDuration(event.payload.durationMs)}\n </span>\n )}\n </div>\n {event.payload.output ? (\n <pre className={cn('mt-2 max-h-48 overflow-auto whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs', codeClassName)}>\n {event.payload.output}\n </pre>\n ) : null}\n </li>\n ))}\n </ul>\n </DetailsSection>\n\n <DetailsSection\n title={messages.artifacts}\n count={workspace.artifacts.length}\n icon={FileOutput}\n className={sectionClassName}\n >\n <ul className=\"space-y-2 text-xs\">\n {workspace.artifacts.map((event) => (\n <li key={event.payload.artifactId} className=\"flex items-center gap-2\">\n <FileOutput className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{event.payload.name}</span>\n <span className=\"text-muted-foreground\">\n {event.payload.kind}\n </span>\n </li>\n ))}\n </ul>\n </DetailsSection>\n </div>\n );\n}\n\nexport function AgentWorkbenchTaskDetails({\n viewModel,\n state = 'ready',\n activeTab = 'summary',\n className,\n classNames,\n onActiveTabChange,\n onIntent,\n}: AgentWorkbenchTaskDetailsProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.details;\n if (state !== 'ready') {\n return (\n <aside className={cn('flex h-full min-h-0 flex-col border-l border-border bg-background', classNames?.root, className)}>\n <StateContent state={state} />\n </aside>\n );\n }\n if (!viewModel) {\n return (\n <aside className={cn('flex h-full min-h-0 flex-col border-l border-border bg-background', classNames?.root, className)}>\n <StateContent state=\"empty\" />\n </aside>\n );\n }\n\n const model = createAgentWorkbenchDetailsModel(viewModel);\n const workspaceCount = Object.values(model.workspace).reduce(\n (total, items) => total + items.length,\n 0,\n );\n const workspaceAvailable = workspaceCount > 0;\n const resolvedTab = activeTab === 'workspace' && !workspaceAvailable ? 'summary' : activeTab;\n const tabs: Array<{ id: AgentWorkbenchDetailsTab; label: string; count: number }> = [\n { id: 'summary', label: messages.tabs.summary, count: model.summary ? 1 : 0 },\n ...(workspaceAvailable\n ? [{ id: 'workspace' as const, label: messages.tabs.workspace, count: workspaceCount }]\n : []),\n ];\n const tabId = (tab: AgentWorkbenchDetailsTab) =>\n `agent-workbench-details-${viewModel.sessionId}-${tab}`.replace(\n /[^a-zA-Z0-9_-]/g,\n '-',\n );\n const onTabKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const nextIndex =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? tabs.length - 1\n : (index + (event.key === 'ArrowRight' ? 1 : -1) + tabs.length) %\n tabs.length;\n onActiveTabChange?.(tabs[nextIndex].id);\n };\n\n return (\n <aside\n className={cn(\n 'flex h-full min-h-0 min-w-0 flex-col border-l border-border bg-background text-foreground',\n classNames?.root,\n className,\n )}\n data-agent-workbench-mode={model.mode}\n >\n <header className={cn('flex shrink-0 items-center gap-2 border-b border-border px-4 py-3', classNames?.header)}>\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold\">{messages.title}</h2>\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {messages.description}\n </p>\n </div>\n {onIntent ? (\n <button\n type=\"button\"\n className=\"rounded-md p-2 text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.actions.close}\n onClick={() => onIntent({ type: 'close' })}\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </header>\n\n <div className={cn('flex shrink-0 gap-1 border-b border-border px-3 py-2', classNames?.tabs)} role=\"tablist\" aria-label={messages.tabs.label}>\n {tabs.map((tab, index) => (\n <button\n key={tab.id}\n id={tabId(tab.id)}\n type=\"button\"\n role=\"tab\"\n aria-selected={resolvedTab === tab.id}\n aria-controls={`${tabId(tab.id)}-panel`}\n tabIndex={resolvedTab === tab.id ? 0 : -1}\n className={cn(\n 'inline-flex min-w-0 flex-1 items-center justify-center gap-1 rounded-md px-2 py-1.5 text-xs font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring',\n resolvedTab === tab.id\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n onClick={() => onActiveTabChange?.(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n <span className=\"truncate\">{tab.label}</span>\n <Count value={tab.count} />\n </button>\n ))}\n </div>\n\n <div\n id={`${tabId(resolvedTab)}-panel`}\n role=\"tabpanel\"\n aria-labelledby={tabId(resolvedTab)}\n tabIndex={0}\n className={cn('min-h-0 flex-1 overflow-y-auto p-3 outline-none', classNames?.body)}\n >\n {resolvedTab === 'summary' ? (\n <SummaryPanel model={model} onIntent={onIntent} />\n ) : (\n <WorkspacePanel\n model={model}\n sectionClassName={classNames?.section}\n codeClassName={classNames?.code}\n />\n )}\n </div>\n </aside>\n );\n}\n","import type { AgentSessionEvent, AgentSessionViewModel } from '@inf-monkeys-tech/monkeys';\nimport {\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n AgentWorkbenchActivity,\n type AgentWorkbenchApprovalIntent,\n type AgentWorkbenchArtifactIntent,\n} from './AgentWorkbenchActivity';\n\ntype MessageEvent = Extract<AgentSessionEvent, { eventType: 'message' }>;\n\nexport interface AgentWorkbenchThreadMessage {\n id: string;\n role: MessageEvent['payload']['role'];\n parts: MessageEvent['payload']['parts'];\n sequence: number;\n}\n\ntype ThreadEntry =\n | { type: 'message'; sequence: number; message: AgentWorkbenchThreadMessage }\n | { type: 'error'; sequence: number; event: Extract<AgentSessionEvent, { eventType: 'error' }> }\n | { type: 'activity'; sequence: number; event: AgentSessionEvent };\n\nexport interface AgentWorkbenchThreadClassNames {\n root?: string;\n list?: string;\n message?: string;\n messageContent?: string;\n activity?: string;\n empty?: string;\n loading?: string;\n}\n\nexport interface AgentWorkbenchThreadProps {\n viewModel?: AgentSessionViewModel;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n autoScroll?: boolean;\n className?: string;\n classNames?: AgentWorkbenchThreadClassNames;\n renderMessageContent?: (message: AgentWorkbenchThreadMessage) => ReactNode;\n onApprovalDecision?: (intent: AgentWorkbenchApprovalIntent) => void;\n onArtifactOpen?: (intent: AgentWorkbenchArtifactIntent) => void;\n}\n\nfunction materializeMessages(events: readonly AgentSessionEvent[]): AgentWorkbenchThreadMessage[] {\n const messages = new Map<string, AgentWorkbenchThreadMessage>();\n for (const event of events) {\n if (event.eventType !== 'message') continue;\n const current = messages.get(event.payload.messageId);\n const parts = event.payload.operation === 'replace'\n ? event.payload.parts\n : [...(current?.parts ?? []), ...event.payload.parts];\n messages.set(event.payload.messageId, {\n id: event.payload.messageId,\n role: event.payload.role,\n parts,\n sequence: event.sequence,\n });\n }\n return [...messages.values()];\n}\n\nfunction logicalActivityKey(event: AgentSessionEvent): string | undefined {\n switch (event.eventType) {\n case 'reasoning': return `reasoning:${event.payload.reasoningId}`;\n case 'plan': return `plan:${event.payload.planId}`;\n case 'task': return `task:${event.payload.taskId}`;\n case 'tool': return `tool:${event.payload.toolCallId}`;\n case 'approval': return `approval:${event.payload.approvalId}`;\n case 'artifact': return `artifact:${event.payload.artifactId}`;\n case 'usage': return 'usage';\n case 'status': return 'status';\n default: return undefined;\n }\n}\n\nfunction createThreadEntries(viewModel: AgentSessionViewModel): ThreadEntry[] {\n const messages = materializeMessages(viewModel.events).map<ThreadEntry>((message) => ({\n type: 'message',\n sequence: message.sequence,\n message,\n }));\n const activity = new Map<string, AgentSessionEvent>();\n for (const event of viewModel.events) {\n const key = logicalActivityKey(event);\n if (key) activity.set(key, event);\n }\n return [\n ...messages,\n ...viewModel.events\n .filter((event): event is Extract<AgentSessionEvent, { eventType: 'error' }> => event.eventType === 'error')\n .map<ThreadEntry>((event) => ({ type: 'error', sequence: event.sequence, event })),\n ...[...activity.values()].map<ThreadEntry>((event) => ({\n type: 'activity',\n sequence: event.sequence,\n event,\n })),\n ].sort((left, right) => left.sequence - right.sequence);\n}\n\nfunction partText(part: unknown): string {\n if (typeof part === 'string') return part;\n if (!part || typeof part !== 'object' || Array.isArray(part)) return String(part ?? '');\n const record = part as Record<string, unknown>;\n if (typeof record.text === 'string') return record.text;\n if (typeof record.name === 'string') return record.name;\n return JSON.stringify(record, null, 2);\n}\n\nfunction DefaultMessageContent({ message }: { message: AgentWorkbenchThreadMessage }) {\n const content = message.parts.map(partText).filter(Boolean).join('');\n return <div className=\"whitespace-pre-wrap break-words\">{content}</div>;\n}\n\nfunction singleEventViewModel(\n viewModel: AgentSessionViewModel,\n event: AgentSessionEvent,\n): AgentSessionViewModel {\n return {\n ...viewModel,\n events: [event],\n lastSequence: event.sequence,\n };\n}\n\nexport function AgentWorkbenchThread({\n viewModel,\n loading = false,\n emptyTitle,\n emptyDescription,\n autoScroll = true,\n className,\n classNames,\n renderMessageContent,\n onApprovalDecision,\n onArtifactOpen,\n}: AgentWorkbenchThreadProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const scrollRef = useRef<HTMLDivElement>(null);\n const entries = useMemo(\n () => viewModel ? createThreadEntries(viewModel) : [],\n [viewModel],\n );\n\n useEffect(() => {\n if (!autoScroll || !viewModel) return;\n const element = scrollRef.current;\n if (element) element.scrollTop = element.scrollHeight;\n }, [autoScroll, viewModel?.lastSequence, viewModel?.sessionId]);\n\n return (\n <div\n ref={scrollRef}\n role=\"log\"\n aria-label={messages.label}\n className={cn('min-h-0 flex-1 overflow-y-auto bg-background', classNames?.root, className)}\n >\n {loading && entries.length === 0 ? (\n <div className={cn('flex min-h-48 items-center justify-center gap-2 text-sm text-muted-foreground', classNames?.loading)} role=\"status\">\n <span className=\"size-4 animate-spin rounded-full border-2 border-muted-foreground/30 border-t-muted-foreground\" aria-hidden=\"true\" />\n <span>{messages.navigation.loading}</span>\n </div>\n ) : entries.length === 0 ? (\n <div className={cn('flex min-h-48 flex-col items-center justify-center px-6 text-center', classNames?.empty)}>\n {emptyTitle ? <h2 className=\"text-base font-semibold text-foreground\">{emptyTitle}</h2> : null}\n {emptyDescription ? <p className=\"mt-1 max-w-lg text-sm text-muted-foreground\">{emptyDescription}</p> : null}\n </div>\n ) : (\n <div className={cn('mx-auto flex w-full max-w-4xl flex-col gap-4 px-4 py-6 sm:px-6', classNames?.list)}>\n {entries.map((entry) => {\n if (entry.type === 'error') {\n return (\n <div\n key={`error:${entry.event.eventId}`}\n role=\"alert\"\n className={cn('rounded-lg border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive-text', classNames?.activity)}\n >\n {entry.event.payload.message}\n </div>\n );\n }\n if (entry.type === 'activity') {\n return (\n <AgentWorkbenchActivity\n key={`activity:${entry.event.eventId}`}\n viewModel={singleEventViewModel(viewModel!, entry.event)}\n ariaLabel={`${messages.label} ${entry.sequence + 1}`}\n className={classNames?.activity}\n onApprovalDecision={onApprovalDecision}\n onArtifactOpen={onArtifactOpen}\n />\n );\n }\n const { message } = entry;\n const isUser = message.role === 'user';\n const isSystem = message.role === 'system';\n if (isSystem) {\n return (\n <div key={message.id} className={cn('text-center text-xs text-muted-foreground', classNames?.message)}>\n {renderMessageContent?.(message) ?? <DefaultMessageContent message={message} />}\n </div>\n );\n }\n return (\n <article\n key={message.id}\n className={cn('flex items-start gap-3', isUser && 'flex-row-reverse', classNames?.message)}\n data-message-role={message.role}\n >\n <span className={cn('flex size-8 shrink-0 items-center justify-center rounded-full', isUser ? 'bg-primary text-primary-foreground' : 'bg-muted text-foreground')} aria-hidden=\"true\">\n <span className=\"size-2 rounded-full bg-current\" />\n </span>\n <div className={cn(\n 'min-w-0 max-w-[85%] rounded-2xl px-4 py-2.5 text-sm leading-6',\n isUser ? 'bg-primary text-primary-foreground' : 'bg-card text-card-foreground',\n classNames?.messageContent,\n )}>\n {renderMessageContent?.(message) ?? <DefaultMessageContent message={message} />}\n </div>\n </article>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';\nimport {\n BookOpen,\n Check,\n ChevronRight,\n Circle,\n CircleAlert,\n Clock3,\n FileText,\n Loader2,\n Search,\n TerminalSquare,\n Wrench,\n} from 'lucide-react';\nimport {\n type ComponentType,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\n\nexport type AgentWorkbenchProcessStatus =\n | 'queued'\n | 'running'\n | 'waiting_approval'\n | 'completed'\n | 'failed'\n | 'stopped';\n\nexport interface AgentWorkbenchProcessProps {\n status: AgentWorkbenchProcessStatus;\n children: ReactNode;\n durationMs?: number;\n completedCount?: number;\n totalCount?: number;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n contentClassName?: string;\n label?: string;\n showStatusIcon?: boolean;\n}\n\nfunction formatDuration(durationMs: number): string {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1_000));\n const hours = Math.floor(totalSeconds / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;\n if (minutes === 0) return `${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n\nfunction isActive(status: AgentWorkbenchProcessStatus): boolean {\n return status === 'queued' || status === 'running' || status === 'waiting_approval';\n}\n\nexport function AgentWorkbenchProcess({\n status,\n children,\n durationMs,\n completedCount,\n totalCount,\n open,\n defaultOpen,\n onOpenChange,\n className,\n contentClassName,\n label,\n showStatusIcon = true,\n}: AgentWorkbenchProcessProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const controlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? isActive(status));\n const userChangedOpen = useRef(false);\n const previousStatus = useRef(status);\n const resolvedOpen = controlled ? open : internalOpen;\n\n useEffect(() => {\n if (controlled || userChangedOpen.current || previousStatus.current === status) return;\n previousStatus.current = status;\n setInternalOpen(isActive(status));\n }, [controlled, status]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n userChangedOpen.current = true;\n if (!controlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n };\n\n const duration = durationMs === undefined ? undefined : formatDuration(durationMs);\n const title = label ?? (\n isActive(status)\n ? messages.process.running\n : duration\n ? messages.process.processedFor({ duration })\n : messages.process.processed\n );\n const showCount = totalCount !== undefined && totalCount > 0;\n\n return (\n <CollapsiblePrimitive.Root\n open={resolvedOpen}\n onOpenChange={handleOpenChange}\n className={cn('group/process w-full min-w-0', className)}\n data-agent-process-status={status}\n >\n <CollapsiblePrimitive.Trigger\n className=\"flex min-h-9 w-full min-w-0 items-center gap-2 border-b border-border/70 py-2 text-left text-sm text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showStatusIcon ? (\n isActive(status) ? (\n <Loader2 className=\"size-4 shrink-0 animate-spin\" aria-hidden=\"true\" />\n ) : status === 'failed' ? (\n <CircleAlert className=\"size-4 shrink-0 text-destructive-text\" aria-hidden=\"true\" />\n ) : (\n <Clock3 className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n )\n ) : null}\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n {showCount ? (\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-0.5 text-xs text-foreground\">\n {messages.process.completedCount({\n completed: completedCount ?? 0,\n total: totalCount,\n })}\n </span>\n ) : null}\n <ChevronRight\n className=\"size-4 shrink-0 transition-transform group-data-[state=open]/process:rotate-90\"\n aria-hidden=\"true\"\n />\n </CollapsiblePrimitive.Trigger>\n <CollapsiblePrimitive.Content\n className={cn(\n 'overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down',\n contentClassName,\n )}\n >\n <div className=\"flex min-w-0 flex-col gap-3 py-4\">{children}</div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n\nexport type AgentWorkbenchActionKind =\n | 'read'\n | 'search'\n | 'tool'\n | 'command'\n | 'file';\n\nexport type AgentWorkbenchActionStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'failed'\n | 'denied';\n\nexport interface AgentWorkbenchActionProps {\n summary: ReactNode;\n kind?: AgentWorkbenchActionKind;\n status?: AgentWorkbenchActionStatus;\n children?: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n icon?: ComponentType<{ className?: string; 'aria-hidden'?: boolean | 'true' }>;\n className?: string;\n contentClassName?: string;\n}\n\nconst ACTION_ICONS: Record<AgentWorkbenchActionKind, ComponentType<{ className?: string }>> = {\n read: BookOpen,\n search: Search,\n tool: Wrench,\n command: TerminalSquare,\n file: FileText,\n};\n\nfunction ActionStatusIcon({ status }: { status: AgentWorkbenchActionStatus }) {\n if (status === 'running' || status === 'pending') {\n return <Loader2 className=\"size-3.5 shrink-0 animate-spin\" aria-hidden=\"true\" />;\n }\n if (status === 'failed' || status === 'denied') {\n return <CircleAlert className=\"size-3.5 shrink-0 text-destructive-text\" aria-hidden=\"true\" />;\n }\n if (status === 'completed') {\n return <Check className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />;\n }\n return <Circle className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />;\n}\n\nexport function AgentWorkbenchAction({\n summary,\n kind = 'tool',\n status = 'completed',\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n icon,\n className,\n contentClassName,\n}: AgentWorkbenchActionProps) {\n const Icon = icon ?? ACTION_ICONS[kind];\n const row = (\n <>\n <Icon className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{summary}</span>\n <ActionStatusIcon status={status} />\n {children ? (\n <ChevronRight\n className=\"size-3.5 shrink-0 transition-transform group-data-[state=open]/action:rotate-90\"\n aria-hidden=\"true\"\n />\n ) : null}\n </>\n );\n\n if (!children) {\n return (\n <div\n className={cn('flex min-h-7 min-w-0 items-center gap-2 text-[13px] text-muted-foreground', className)}\n data-agent-action-status={status}\n >\n {row}\n </div>\n );\n }\n\n return (\n <CollapsiblePrimitive.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n className={cn('group/action min-w-0', className)}\n data-agent-action-status={status}\n >\n <CollapsiblePrimitive.Trigger className=\"flex min-h-7 w-full min-w-0 items-center gap-2 text-left text-[13px] text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\">\n {row}\n </CollapsiblePrimitive.Trigger>\n <CollapsiblePrimitive.Content className=\"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n <div className={cn('ml-6 mt-2 min-w-0 border-l border-border pl-3', contentClassName)}>{children}</div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport {\n File,\n FileCode2,\n FileImage,\n FileText,\n Film,\n Globe2,\n Link2,\n ListFilter,\n Music2,\n Presentation,\n} from 'lucide-react';\nimport type { ComponentType } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport type {\n AgentWorkbenchArtifactItem,\n AgentWorkbenchArtifactKind,\n} from './artifact-model';\n\nexport interface AgentWorkbenchArtifactSummaryProps {\n artifacts: readonly AgentWorkbenchArtifactItem[];\n open?: boolean;\n defaultOpen?: boolean;\n maxItemsPerGroup?: number;\n showAll?: boolean;\n className?: string;\n contentClassName?: string;\n onOpenChange?: (open: boolean) => void;\n onArtifactOpen?: (artifact: AgentWorkbenchArtifactItem) => void;\n onViewAll?: () => void;\n}\n\nconst ARTIFACT_ICONS: Record<AgentWorkbenchArtifactKind, ComponentType<{ className?: string }>> = {\n audio: Music2,\n file: File,\n html: FileCode2,\n image: FileImage,\n markdown: FileText,\n pdf: FileText,\n presentation: Presentation,\n video: Film,\n web: Globe2,\n};\n\nfunction ArtifactThumbnail({ artifact }: { artifact: AgentWorkbenchArtifactItem }) {\n if (artifact.thumbnailUrl) {\n return (\n <img\n src={artifact.thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n className=\"size-7 rounded object-cover\"\n />\n );\n }\n const Icon = ARTIFACT_ICONS[artifact.kind];\n return (\n <span className=\"flex size-7 items-center justify-center rounded bg-muted text-muted-foreground\">\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n );\n}\n\nfunction ArtifactGroup({\n title,\n artifacts,\n maxItems,\n onArtifactOpen,\n}: {\n title: string;\n artifacts: readonly AgentWorkbenchArtifactItem[];\n maxItems: number;\n onArtifactOpen?: (artifact: AgentWorkbenchArtifactItem) => void;\n}) {\n return (\n <section className=\"flex min-w-0 flex-col gap-2\">\n <div role=\"heading\" aria-level={2} className=\"text-sm font-medium text-muted-foreground\">{title}</div>\n {artifacts.slice(0, maxItems).map((artifact) => (\n <button\n key={artifact.id}\n type=\"button\"\n className=\"flex min-w-0 items-center gap-2 rounded-md px-0.5 py-0.5 text-left text-sm outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-default\"\n disabled={!onArtifactOpen || artifact.status === 'loading'}\n onClick={() => onArtifactOpen?.(artifact)}\n >\n <ArtifactThumbnail artifact={artifact} />\n <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">{artifact.name}</span>\n </button>\n ))}\n </section>\n );\n}\n\nexport function AgentWorkbenchArtifactSummary({\n artifacts,\n open,\n defaultOpen = false,\n maxItemsPerGroup = 3,\n showAll = false,\n className,\n contentClassName,\n onOpenChange,\n onArtifactOpen,\n onViewAll,\n}: AgentWorkbenchArtifactSummaryProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.artifactWorkspace;\n const outputs = artifacts.filter((artifact) => artifact.origin === 'output');\n const sources = artifacts.filter((artifact) => artifact.origin === 'source');\n if (artifacts.length === 0) return null;\n\n return (\n <PopoverPrimitive.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <PopoverPrimitive.Trigger\n type=\"button\"\n className={cn(\n 'flex size-9 items-center justify-center rounded-xl bg-muted text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:text-foreground',\n className,\n )}\n aria-label={messages.toggleSummary}\n >\n <ListFilter className=\"size-4\" aria-hidden=\"true\" />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Content\n aria-label={messages.toggleSummary}\n side=\"bottom\"\n align=\"end\"\n sideOffset={8}\n collisionPadding={12}\n className={cn(\n 'z-50 w-[min(22rem,calc(100vw-1.5rem))] rounded-3xl border border-border bg-popover p-4 text-popover-foreground shadow-xl outline-none',\n contentClassName,\n )}\n >\n <div className=\"flex max-h-[min(34rem,calc(100vh-5rem))] min-w-0 flex-col gap-4 overflow-y-auto\">\n {outputs.length > 0 ? (\n <ArtifactGroup\n title={messages.outputs}\n artifacts={outputs}\n maxItems={showAll ? outputs.length : maxItemsPerGroup}\n onArtifactOpen={onArtifactOpen}\n />\n ) : null}\n {outputs.length > 0 && sources.length > 0 ? <div className=\"h-px bg-border\" /> : null}\n {sources.length > 0 ? (\n <ArtifactGroup\n title={messages.sources}\n artifacts={sources}\n maxItems={showAll ? sources.length : maxItemsPerGroup}\n onArtifactOpen={onArtifactOpen}\n />\n ) : null}\n {onViewAll && !showAll && (outputs.length > maxItemsPerGroup || sources.length > maxItemsPerGroup) ? (\n <button\n type=\"button\"\n className=\"flex min-h-8 items-center gap-2 rounded-md text-sm text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={onViewAll}\n >\n <Link2 className=\"size-4\" aria-hidden=\"true\" />\n <span>{messages.viewAll}</span>\n </button>\n ) : null}\n </div>\n <PopoverPrimitive.Arrow className=\"fill-popover\" />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Root>\n );\n}\n","import {\n closestCenter,\n DndContext,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n horizontalListSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport {\n Download,\n ExternalLink,\n File,\n FileCode2,\n FileImage,\n FileText,\n Film,\n Globe2,\n Music2,\n PanelRightClose,\n Presentation,\n X,\n} from 'lucide-react';\nimport type { ComponentType, KeyboardEvent, MouseEvent, ReactNode } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport type {\n AgentWorkbenchArtifactItem,\n AgentWorkbenchArtifactKind,\n AgentWorkbenchArtifactWorkspaceIntent,\n} from './artifact-model';\n\nexport interface AgentWorkbenchArtifactWorkspaceProps {\n artifacts: readonly AgentWorkbenchArtifactItem[];\n activeArtifactId?: string;\n className?: string;\n renderArtifact: (artifact: AgentWorkbenchArtifactItem) => ReactNode;\n onIntent?: (intent: AgentWorkbenchArtifactWorkspaceIntent) => void;\n}\n\nconst ARTIFACT_ICONS: Record<AgentWorkbenchArtifactKind, ComponentType<{ className?: string }>> = {\n audio: Music2,\n file: File,\n html: FileCode2,\n image: FileImage,\n markdown: FileText,\n pdf: FileText,\n presentation: Presentation,\n video: Film,\n web: Globe2,\n};\n\nfunction SortableArtifactTab({\n artifact,\n selected,\n onClose,\n}: {\n artifact: AgentWorkbenchArtifactItem;\n selected: boolean;\n onClose: () => void;\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.artifactWorkspace;\n const Icon = ARTIFACT_ICONS[artifact.kind];\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({\n id: artifact.id,\n });\n const { role: _sortableRole, tabIndex: _sortableTabIndex, ...sortableA11y } = attributes;\n const setTabRef = (node: HTMLButtonElement | null) => {\n setNodeRef(node);\n setActivatorNodeRef(node);\n };\n const handleMouseDown = (event: MouseEvent<HTMLButtonElement>) => {\n if (event.button !== 1) return;\n event.preventDefault();\n onClose();\n };\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (!(event.target instanceof Element) || !event.target.closest('[data-close-artifact-tab]')) return;\n event.preventDefault();\n onClose();\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n listeners?.onKeyDown?.(event);\n if (event.key !== 'Delete' && event.key !== 'Backspace') return;\n event.preventDefault();\n onClose();\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={setTabRef}\n value={artifact.id}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={cn(\n 'group/tab relative flex h-9 max-w-56 shrink-0 items-center gap-2 rounded-lg pl-3 pr-8 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:bg-background/60',\n isDragging && 'opacity-60',\n )}\n onMouseDown={handleMouseDown}\n onClick={handleClick}\n {...sortableA11y}\n {...listeners}\n onKeyDown={handleKeyDown}\n >\n <Icon className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{artifact.name}</span>\n <span\n className=\"absolute right-1.5 flex size-6 items-center justify-center rounded-md opacity-0 hover:bg-muted group-focus/tab:opacity-100 group-hover/tab:opacity-100 data-[selected=true]:opacity-100\"\n data-selected={selected}\n data-close-artifact-tab=\"\"\n title={messages.closeTab({ name: artifact.name })}\n aria-hidden=\"true\"\n >\n <X className=\"size-3.5\" aria-hidden=\"true\" />\n </span>\n </TabsPrimitive.Trigger>\n );\n}\n\nexport function AgentWorkbenchArtifactWorkspace({\n artifacts,\n activeArtifactId,\n className,\n renderArtifact,\n onIntent,\n}: AgentWorkbenchArtifactWorkspaceProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.artifactWorkspace;\n const activeArtifact = artifacts.find((artifact) => artifact.id === activeArtifactId) ?? artifacts[0];\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n if (!activeArtifact) return null;\n\n const handleDragEnd = ({ active, over }: DragEndEvent) => {\n if (!over || active.id === over.id) return;\n onIntent?.({ type: 'reorder', artifactId: String(active.id), overArtifactId: String(over.id) });\n };\n\n return (\n <TabsPrimitive.Root\n value={activeArtifact.id}\n onValueChange={(artifactId) => onIntent?.({ type: 'select', artifactId })}\n className={cn('flex size-full min-h-0 min-w-0 flex-col bg-background text-foreground', className)}\n orientation=\"horizontal\"\n >\n <header className=\"relative z-10 flex h-12 shrink-0 items-center gap-2 border-b border-border bg-muted/50 px-2\">\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={artifacts.map((artifact) => artifact.id)} strategy={horizontalListSortingStrategy}>\n <TabsPrimitive.List\n className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n aria-label={messages.tabs}\n >\n {artifacts.map((artifact) => (\n <SortableArtifactTab\n key={artifact.id}\n artifact={artifact}\n selected={artifact.id === activeArtifact.id}\n onClose={() => onIntent?.({ type: 'close', artifactId: artifact.id })}\n />\n ))}\n </TabsPrimitive.List>\n </SortableContext>\n </DndContext>\n <div className=\"relative z-20 flex shrink-0 items-center gap-2\">\n {activeArtifact.url ? (\n <>\n <button\n type=\"button\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.download({ name: activeArtifact.name })}\n onClick={() => onIntent?.({ type: 'download', artifactId: activeArtifact.id })}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.openExternal({ name: activeArtifact.name })}\n onClick={() => onIntent?.({ type: 'open-external', artifactId: activeArtifact.id })}\n >\n <ExternalLink className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </>\n ) : null}\n <button\n type=\"button\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.closeWorkspace}\n onClick={() => onIntent?.({ type: 'close-workspace' })}\n >\n <PanelRightClose className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n </header>\n <div className=\"min-h-0 min-w-0 flex-1 overflow-hidden\">\n {artifacts.map((artifact) => (\n <TabsPrimitive.Content\n key={artifact.id}\n value={artifact.id}\n className=\"size-full min-h-0 min-w-0 outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n {artifact.id === activeArtifact.id ? renderArtifact(artifact) : null}\n </TabsPrimitive.Content>\n ))}\n </div>\n </TabsPrimitive.Root>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/locale/en-US.ts","../../../src/locale/resolve-locale.ts","../../../src/provider/context.ts","../../../src/components/base/utils.ts","../../../src/components/layout/index.tsx","../../../src/components/primitives/InteractiveControls.tsx","../../../src/components/primitives/Menus.tsx","../../../src/components/agent-workbench/AgentWorkbenchComposer.tsx","../../../src/components/agent-workbench/AgentWorkbenchQuickStart.tsx","../../../src/components/agent-workbench/AgentWorkbenchSidebar.tsx","../../../src/components/agent-workbench/activity-model.ts","../../../src/components/agent-workbench/AgentWorkbenchTool.tsx","../../../src/components/agent-workbench/AgentWorkbenchActivity.tsx","../../../src/components/agent-workbench/details-model.ts","../../../src/components/agent-workbench/AgentWorkbenchTaskDetails.tsx","../../../src/components/agent-workbench/AgentWorkbenchThread.tsx","../../../src/components/agent-workbench/AgentWorkbenchProcess.tsx","../../../src/components/agent-workbench/AgentWorkbenchArtifactSummary.tsx","../../../src/components/agent-workbench/AgentWorkbenchArtifactWorkspace.tsx"],"names":["createContext","useContext","twMerge","cn","React","jsx","AccordionPrimitive","jsxs","ChevronDown","CheckboxPrimitive","Check","cva","Slot","PopoverPrimitive","ScrollAreaPrimitive","SwitchPrimitive","TabsPrimitive","TooltipPrimitive","DropdownMenu","DropdownMenuPrimitive","React2","ChevronRight","Circle","SelectPrimitive","ChevronUp","Fragment","useRef","useState","useMemo","useEffect","ArrowUp","ArrowDown","Pencil","Trash2","ImageIcon","File","X","Paperclip","Mic","Send","Square","Sparkles","Palette","Search","FileText","Code2","ShoppingBag","Icon","ArrowLeft","Upload","ArrowUpRight","Bot","RefreshCw","Loader2","CheckCircle2","AlertCircle","Ellipsis","Pin","Plus","SquarePen","Blocks","MessageSquare","Settings","Clock3","XCircle","event","TerminalSquare","JsonValue","CircleStop","FileOutput","Download","latestBy","formatDuration","StatusIcon","GitFork","PencilLine","Copy","RotateCcw","FileCode2","Files","TestTube2","CollapsiblePrimitive","CircleAlert","BookOpen","Wrench","Music2","FileImage","Presentation","Film","Globe2","PopoverPrimitive2","ListFilter","Link2","ARTIFACT_ICONS","useSortable","TabsPrimitive2","CSS","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","ExternalLink","PanelRightClose"],"mappings":"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","file":"index.js","sourcesContent":["import type { MonkeysLocale } from './types';\n\nexport const enUS = {\n locale: 'en-US',\n messages: {\n pagination: {\n navigation: 'Pagination',\n first: 'First',\n previous: 'Previous',\n next: 'Next',\n last: 'Last',\n page: ({ page, pageCount }) => `Page ${page} of ${pageCount}`,\n currentPage: ({ page, pageCount }) =>\n `Page ${page} of ${pageCount}, current page`,\n emptyResults: '0 results',\n range: ({ start, end, total }) => `${start}-${end} of ${total}`,\n },\n dialog: {\n close: 'Close dialog',\n },\n dropdownMenu: {\n actions: 'Actions',\n },\n loading: {\n spinner: 'Loading',\n },\n layout: {\n resizePanels: 'Resize panels',\n },\n steps: {\n label: 'Progress',\n current: 'Current',\n completed: 'Completed',\n error: 'Error',\n disabled: 'Disabled',\n },\n numberInput: {\n increment: 'Increase value',\n decrement: 'Decrease value',\n },\n passwordInput: {\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n },\n multiSelect: {\n placeholder: 'Select options',\n empty: 'No options',\n removeOption: ({ value }) => `Remove ${value}`,\n },\n table: {\n dragColumn: ({ columnId }) => `Drag column ${columnId}`,\n resizeColumn: ({ columnId }) => `Resize column ${columnId}`,\n sortColumn: ({ columnId }) =>\n columnId ? `Sort column ${columnId}` : 'Sort column',\n loadingRow: 'Loading table row',\n },\n toolbar: {\n theme: {\n label: 'Appearance',\n toggle: 'Toggle theme',\n auto: 'Auto',\n light: 'Light',\n dark: 'Dark',\n },\n language: {\n label: 'Language',\n switch: 'Switch language',\n },\n },\n toast: {\n errorTitle: 'Error',\n warningTitle: 'Warning',\n defaultErrorDescription: 'Something went wrong.',\n defaultWarningDescription: 'Please check and try again.',\n },\n dataExplorer: {\n viewTree: {\n actions: 'More actions',\n expand: 'Expand',\n collapse: 'Collapse',\n loading: 'Loading...',\n empty: 'No views',\n error: 'Unable to load views',\n },\n },\n workbench: {\n interactiveTable: {\n columnActions: 'Column actions',\n freezeColumn: 'Freeze to left',\n freezeEndColumn: 'Freeze to right',\n unfreezeColumn: 'Unfreeze from left',\n unfreezeEndColumn: 'Unfreeze from right',\n unfreezeAllColumns: 'Unfreeze all columns',\n resetColumnWidth: 'Reset column width',\n frozenColumnTitle: 'Frozen column',\n },\n },\n agentWorkbench: {\n label: 'Session activity',\n reasoning: 'Reasoning',\n plan: 'Plan',\n taskNoDetail: 'No additional details',\n modes: { chat: 'Chat', work: 'Work' },\n composer: {\n send: 'Send message',\n stop: 'Stop generating',\n queue: 'Queue message',\n attach: 'Add photos or files',\n voice: 'Start voice input',\n webSearch: 'Web search',\n chatMode: 'Chat mode',\n model: 'Model',\n reasoning: 'Reasoning effort',\n permissions: 'Permissions',\n removeAttachment: 'Remove attachment',\n editQueued: 'Edit queued message',\n deleteQueued: 'Delete queued message',\n moveUp: 'Move message up',\n moveDown: 'Move message down',\n queued: 'Queued messages',\n uploading: 'Uploading',\n noModels: 'No models available',\n message: 'Message',\n attachmentOnly: 'Attachment',\n reasoningOptions: { low: 'Low', medium: 'Medium', high: 'High', xhigh: 'Extra high' },\n permissionOptions: { 'approval-required': 'Approval required', 'auto-approve': 'Auto approve', 'full-access': 'Full access' },\n },\n quickStart: {\n label: 'Quick start',\n back: 'Back',\n addFile: 'Add file',\n },\n tool: {\n input: 'Input',\n output: 'Output',\n status: {\n pending: 'Pending',\n running: 'Running',\n completed: 'Completed',\n failed: 'Error',\n denied: 'Denied',\n },\n },\n approval: {\n approve: 'Approve',\n reject: 'Reject',\n approved: 'Approved',\n rejected: 'Rejected',\n },\n artifact: {\n pending: 'Preparing',\n ready: 'Ready',\n failed: 'Failed',\n open: ({ name }) => `Open ${name}`,\n },\n run: {\n stopping: 'Stopping...',\n stoppedAfter: ({ duration }) => `You stopped after ${duration}`,\n },\n process: {\n running: 'Working',\n processed: 'Processed',\n processedFor: ({ duration }) => `Worked for ${duration}`,\n completedCount: ({ completed, total }) => `${completed}/${total} completed`,\n },\n artifactWorkspace: {\n outputs: 'Outputs',\n sources: 'Sources',\n viewAll: 'View all',\n toggleSummary: 'Toggle files',\n tabs: 'Open files',\n closeTab: ({ name }) => `Close ${name}`,\n closeWorkspace: 'Close workspace',\n download: ({ name }) => `Download ${name}`,\n openExternal: ({ name }) => `Open ${name} in a new window`,\n },\n usage: {\n label: 'Context usage',\n context: ({ used, total }) => `${used} / ${total} tokens`,\n },\n navigation: {\n search: 'Search agents and sessions',\n searchSessions: 'Search sessions',\n searchShortcut: 'Focus search',\n clearSearch: 'Clear search',\n tabsLabel: 'Agent workbench navigation',\n agents: 'Agents',\n sessions: 'Sessions',\n newAgent: 'New Agent',\n newSession: 'New Session',\n capabilities: 'Capabilities & Extensions',\n settings: 'Agent Settings',\n allAgents: 'All Agents',\n recentSessions: 'Recent Sessions',\n chat: 'Chat',\n work: 'Work',\n chats: 'Chats',\n builtIn: 'Built-in',\n noDescription: 'No description',\n loading: 'Loading...',\n emptyAgents: 'No agents yet',\n emptySessions: 'No sessions yet',\n noResults: 'No matching results',\n retry: 'Retry',\n pin: 'Pin',\n unpin: 'Unpin',\n rename: 'Rename',\n delete: 'Delete',\n actions: 'Actions',\n save: 'Save',\n cancel: 'Cancel',\n running: 'Running',\n completed: 'Completed',\n failed: 'Failed',\n contextUsage: ({ percent }) => `${percent}% context used`,\n },\n details: {\n title: 'Task details',\n description: 'Summary and workspace activity',\n duration: 'Duration',\n updated: 'Updated',\n model: 'Model',\n mode: 'Mode',\n permissions: 'Permissions',\n tokenUsage: 'Token usage',\n summary: 'Summary',\n summaryEmpty: 'No summary is available yet.',\n summaryFailed: 'The summary could not be generated.',\n highlights: 'Highlights',\n pendingItems: 'Pending items',\n tabs: {\n label: 'Task detail views',\n summary: 'Summary',\n workspace: 'Workspace',\n },\n status: {\n queued: 'Queued',\n running: 'Running',\n waiting_approval: 'Waiting for approval',\n stopping: 'Stopping',\n stopped: 'Stopped',\n completed: 'Completed',\n failed: 'Failed',\n },\n state: {\n loading: { title: 'Loading task details', description: 'Restoring the latest session activity.' },\n empty: { title: 'No task selected', description: 'Select a task to inspect its details.' },\n error: { title: 'Unable to load task details', description: 'Try again after the session is available.' },\n },\n actions: {\n close: 'Close task details',\n copySummary: 'Copy summary',\n retry: 'Retry',\n retrySummary: 'Retry summary',\n resume: 'Resume',\n continueInNewTask: 'Continue in new task',\n editAndRerun: 'Edit and rerun',\n export: 'Export',\n },\n workspace: {\n diffs: 'Code changes',\n files: 'Files',\n terminals: 'Terminals',\n tests: 'Tests',\n artifacts: 'Artifacts',\n exitCode: ({ code }) => `Exit code ${code}`,\n diffStatus: { added: 'Added', modified: 'Modified', deleted: 'Deleted', renamed: 'Renamed' },\n fileOperation: { upsert: 'Updated', delete: 'Deleted' },\n },\n },\n },\n },\n} satisfies MonkeysLocale;\n","import { enUS } from './en-US';\nimport type {\n MonkeysBuiltInLocaleId,\n MonkeysLocale,\n MonkeysLocaleInput,\n MonkeysLocaleMessages,\n MonkeysLocaleMessagesOverride,\n MonkeysResolvedLocale,\n} from './types';\nimport { zhCN } from './zh-CN';\n\nconst BUILT_IN_LOCALES: Record<MonkeysBuiltInLocaleId, MonkeysLocale> = {\n 'en-US': enUS,\n 'zh-CN': zhCN,\n};\n\nfunction normalizeLocaleId(locale: unknown): string {\n if (typeof locale !== 'string' || !locale.trim()) {\n throw new TypeError('Monkeys locale must be a non-empty BCP 47 string.');\n }\n\n try {\n return Intl.getCanonicalLocales(locale)[0];\n } catch {\n throw new RangeError(\n `Monkeys locale \"${locale}\" is not a valid BCP 47 identifier.`,\n );\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction validateMessageOverride(\n value: unknown,\n schema: unknown,\n path: string,\n) {\n if (!isRecord(value) || !isRecord(schema)) {\n throw new TypeError(`${path} must be an object.`);\n }\n\n for (const [key, candidate] of Object.entries(value)) {\n if (candidate === undefined) continue;\n if (!(key in schema)) {\n throw new TypeError(`${path}.${key} is not a supported Monkeys message.`);\n }\n\n const expected = schema[key];\n const candidatePath = `${path}.${key}`;\n if (typeof expected === 'function') {\n if (typeof candidate !== 'function') {\n throw new TypeError(`${candidatePath} must be a function.`);\n }\n } else if (typeof expected === 'string') {\n if (typeof candidate !== 'string') {\n throw new TypeError(`${candidatePath} must be a string.`);\n }\n } else {\n validateMessageOverride(candidate, expected, candidatePath);\n }\n }\n}\n\nfunction assertMessagesOverride(\n value: unknown,\n path: string,\n): asserts value is MonkeysLocaleMessagesOverride {\n validateMessageOverride(value, enUS.messages, path);\n}\n\nfunction isBuiltInLocale(locale: string): locale is MonkeysBuiltInLocaleId {\n return locale === 'en-US' || locale === 'zh-CN';\n}\n\nfunction normalizeLocaleInput(input: MonkeysLocaleInput | undefined): {\n locale: string | undefined;\n messages: MonkeysLocaleMessagesOverride | undefined;\n hasExplicitLocale: boolean;\n} {\n if (input === undefined) {\n return {\n locale: undefined,\n messages: undefined,\n hasExplicitLocale: false,\n };\n }\n\n if (typeof input === 'string') {\n const locale = normalizeLocaleId(input);\n if (!isBuiltInLocale(locale)) {\n throw new RangeError(\n `Unsupported built-in Monkeys locale \"${locale}\". Provide a locale pack object for custom locales.`,\n );\n }\n return { locale, messages: undefined, hasExplicitLocale: true };\n }\n\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('Monkeys locale must be a locale id or locale pack object.');\n }\n\n const locale = normalizeLocaleId(input.locale);\n assertMessagesOverride(input.messages, 'Monkeys locale messages');\n\n return {\n locale,\n messages: input.messages,\n hasExplicitLocale: true,\n };\n}\n\nexport function mergeMonkeysLocaleMessages(\n base: MonkeysLocaleMessages,\n override?: MonkeysLocaleMessagesOverride,\n): MonkeysLocaleMessages {\n if (!override) return base;\n\n return {\n pagination: { ...base.pagination, ...override.pagination },\n dialog: { ...base.dialog, ...override.dialog },\n dropdownMenu: { ...base.dropdownMenu, ...override.dropdownMenu },\n loading: { ...base.loading, ...override.loading },\n layout: { ...base.layout, ...override.layout },\n steps: { ...base.steps, ...override.steps },\n numberInput: { ...base.numberInput, ...override.numberInput },\n passwordInput: { ...base.passwordInput, ...override.passwordInput },\n multiSelect: { ...base.multiSelect, ...override.multiSelect },\n table: { ...base.table, ...override.table },\n toolbar: {\n theme: { ...base.toolbar.theme, ...override.toolbar?.theme },\n language: { ...base.toolbar.language, ...override.toolbar?.language },\n },\n toast: { ...base.toast, ...override.toast },\n dataExplorer: {\n viewTree: {\n ...base.dataExplorer.viewTree,\n ...override.dataExplorer?.viewTree,\n },\n },\n workbench: {\n interactiveTable: {\n ...base.workbench.interactiveTable,\n ...override.workbench?.interactiveTable,\n },\n },\n agentWorkbench: {\n ...base.agentWorkbench,\n ...override.agentWorkbench,\n modes: {\n ...base.agentWorkbench.modes,\n ...override.agentWorkbench?.modes,\n },\n composer: {\n ...base.agentWorkbench.composer,\n ...override.agentWorkbench?.composer,\n },\n quickStart: {\n ...base.agentWorkbench.quickStart,\n ...override.agentWorkbench?.quickStart,\n },\n tool: {\n ...base.agentWorkbench.tool,\n ...override.agentWorkbench?.tool,\n status: {\n ...base.agentWorkbench.tool.status,\n ...override.agentWorkbench?.tool?.status,\n },\n },\n approval: {\n ...base.agentWorkbench.approval,\n ...override.agentWorkbench?.approval,\n },\n artifact: {\n ...base.agentWorkbench.artifact,\n ...override.agentWorkbench?.artifact,\n },\n run: {\n ...base.agentWorkbench.run,\n ...override.agentWorkbench?.run,\n },\n process: {\n ...base.agentWorkbench.process,\n ...override.agentWorkbench?.process,\n },\n artifactWorkspace: {\n ...base.agentWorkbench.artifactWorkspace,\n ...override.agentWorkbench?.artifactWorkspace,\n },\n usage: {\n ...base.agentWorkbench.usage,\n ...override.agentWorkbench?.usage,\n },\n navigation: {\n ...base.agentWorkbench.navigation,\n ...override.agentWorkbench?.navigation,\n },\n details: {\n ...base.agentWorkbench.details,\n ...override.agentWorkbench?.details,\n tabs: {\n ...base.agentWorkbench.details.tabs,\n ...override.agentWorkbench?.details?.tabs,\n },\n status: {\n ...base.agentWorkbench.details.status,\n ...override.agentWorkbench?.details?.status,\n },\n state: {\n loading: {\n ...base.agentWorkbench.details.state.loading,\n ...override.agentWorkbench?.details?.state?.loading,\n },\n empty: {\n ...base.agentWorkbench.details.state.empty,\n ...override.agentWorkbench?.details?.state?.empty,\n },\n error: {\n ...base.agentWorkbench.details.state.error,\n ...override.agentWorkbench?.details?.state?.error,\n },\n },\n actions: {\n ...base.agentWorkbench.details.actions,\n ...override.agentWorkbench?.details?.actions,\n },\n workspace: {\n ...base.agentWorkbench.details.workspace,\n ...override.agentWorkbench?.details?.workspace,\n diffStatus: {\n ...base.agentWorkbench.details.workspace.diffStatus,\n ...override.agentWorkbench?.details?.workspace?.diffStatus,\n },\n fileOperation: {\n ...base.agentWorkbench.details.workspace.fileOperation,\n ...override.agentWorkbench?.details?.workspace?.fileOperation,\n },\n },\n },\n },\n };\n}\n\nexport const defaultMonkeysLocale: MonkeysResolvedLocale = {\n locale: enUS.locale,\n messages: mergeMonkeysLocaleMessages(\n enUS.messages as MonkeysLocaleMessages,\n ),\n};\n\nexport function resolveMonkeysLocale(\n input?: MonkeysLocaleInput,\n override?: MonkeysLocaleMessagesOverride,\n parent?: MonkeysResolvedLocale,\n): MonkeysResolvedLocale {\n if (override !== undefined) {\n assertMessagesOverride(override, 'MonkeysProvider messages');\n }\n const normalized = normalizeLocaleInput(input);\n const locale = normalized.locale ?? parent?.locale ?? enUS.locale;\n const builtInMessages = isBuiltInLocale(locale)\n ? BUILT_IN_LOCALES[locale].messages\n : undefined;\n let messages = mergeMonkeysLocaleMessages(\n enUS.messages as MonkeysLocaleMessages,\n builtInMessages,\n );\n\n if (parent && (!normalized.hasExplicitLocale || parent.locale === locale)) {\n messages = mergeMonkeysLocaleMessages(messages, parent.messages);\n }\n\n messages = mergeMonkeysLocaleMessages(messages, normalized.messages);\n messages = mergeMonkeysLocaleMessages(messages, override);\n\n return { locale, messages };\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type Context,\n} from 'react';\n\nimport type { BaseAppearance } from '../components/base/types';\nimport type { DataExplorerAppearance } from '../components/data-explorer/types';\nimport {\n defaultMonkeysLocale,\n type MonkeysLocaleMessages,\n type MonkeysResolvedLocale,\n} from '../locale';\nimport type { CompiledThemeTokens } from '../theme-system';\n\nexport type MonkeysDirection = 'ltr' | 'rtl';\n\nexport interface MonkeysEnvironment {\n getDocument?: () => Document | null;\n getWindow?: () => Window | null;\n}\n\nexport type MonkeysPortalContainer =\n | Element\n | null\n | (() => Element | null);\n\nexport interface MonkeysPortalOptions {\n container?: MonkeysPortalContainer;\n disabled?: boolean;\n}\n\nexport interface MonkeysComponentAttributes {\n dir?: MonkeysDirection;\n 'data-monkeys-direction'?: MonkeysDirection;\n 'data-monkeys-locale'?: string;\n 'data-monkeys-theme'?: string;\n 'data-monkeys-theme-mode'?: string;\n}\n\ninterface MonkeysLocaleContextValue extends MonkeysResolvedLocale {\n provided: boolean;\n}\n\ninterface MonkeysThemeContextValue {\n provided: boolean;\n resolvedTheme?: CompiledThemeTokens;\n themeId?: string;\n baseAppearance?: BaseAppearance;\n dataExplorerAppearance?: DataExplorerAppearance;\n}\n\ninterface MonkeysDirectionContextValue {\n provided: boolean;\n direction?: MonkeysDirection;\n}\n\ninterface MonkeysEnvironmentContextValue {\n provided: boolean;\n environment: MonkeysEnvironment;\n portal: MonkeysPortalOptions;\n}\n\nconst EMPTY_ENVIRONMENT = Object.freeze({}) satisfies MonkeysEnvironment;\nconst EMPTY_PORTAL = Object.freeze({}) satisfies MonkeysPortalOptions;\n\ninterface MonkeysProviderContexts {\n locale: Context<MonkeysLocaleContextValue>;\n theme: Context<MonkeysThemeContextValue>;\n direction: Context<MonkeysDirectionContextValue>;\n environment: Context<MonkeysEnvironmentContextValue>;\n}\n\n// Every bundled public entry contains this module. Keep only the Context\n// identities in a realm-wide registry so root, provider, and component\n// subpaths interoperate in both CJS and ESM builds. Provider values remain in\n// React trees, so SSR requests are isolated. Bump the contract key only when\n// these Context value shapes become intentionally incompatible.\nconst MONKEYS_PROVIDER_CONTEXTS_KEY = Symbol.for(\n '@inf-monkeys-tech/monkeys-design/provider-context@1',\n);\n\ntype MonkeysProviderContextHost = typeof globalThis & {\n [MONKEYS_PROVIDER_CONTEXTS_KEY]?: MonkeysProviderContexts;\n};\n\nfunction createMonkeysProviderContexts(): MonkeysProviderContexts {\n return Object.freeze({\n locale: createContext<MonkeysLocaleContextValue>({\n ...defaultMonkeysLocale,\n provided: false,\n }),\n theme: createContext<MonkeysThemeContextValue>({\n provided: false,\n }),\n direction: createContext<MonkeysDirectionContextValue>({\n provided: false,\n }),\n environment: createContext<MonkeysEnvironmentContextValue>({\n provided: false,\n environment: EMPTY_ENVIRONMENT,\n portal: EMPTY_PORTAL,\n }),\n });\n}\n\nfunction getMonkeysProviderContexts(): MonkeysProviderContexts {\n const host = globalThis as MonkeysProviderContextHost;\n const existing = host[MONKEYS_PROVIDER_CONTEXTS_KEY];\n if (existing) return existing;\n\n const contexts = createMonkeysProviderContexts();\n Object.defineProperty(host, MONKEYS_PROVIDER_CONTEXTS_KEY, {\n value: contexts,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return contexts;\n}\n\nconst providerContexts = getMonkeysProviderContexts();\n\nexport const MonkeysLocaleContext = providerContexts.locale;\n\nexport const MonkeysThemeContext = providerContexts.theme;\n\nexport const MonkeysDirectionContext = providerContexts.direction;\n\nexport const MonkeysEnvironmentContext = providerContexts.environment;\n\nfunction mergeAppearance<T extends { slots?: object; styles?: object }>(\n inherited: T | undefined,\n explicit: T | undefined,\n): T | undefined {\n if (explicit === undefined) return inherited;\n if (inherited === undefined) return explicit;\n\n return {\n ...inherited,\n ...explicit,\n slots:\n inherited.slots || explicit.slots\n ? { ...inherited.slots, ...explicit.slots }\n : undefined,\n styles:\n inherited.styles || explicit.styles\n ? { ...inherited.styles, ...explicit.styles }\n : undefined,\n };\n}\n\nexport function useMonkeysLocale() {\n return useContext(MonkeysLocaleContext);\n}\n\nexport function useMonkeysLocaleMessages(): MonkeysLocaleMessages {\n return useContext(MonkeysLocaleContext).messages;\n}\n\nexport function useMonkeysResolvedTheme() {\n return useContext(MonkeysThemeContext).resolvedTheme;\n}\n\nexport function useMonkeysBaseAppearance(\n explicit?: BaseAppearance,\n): BaseAppearance | undefined {\n const inherited = useContext(MonkeysThemeContext).baseAppearance;\n return useMemo(\n () => mergeAppearance(inherited, explicit),\n [explicit, inherited],\n );\n}\n\nexport function useMonkeysDataExplorerAppearance(\n explicit?: DataExplorerAppearance,\n): DataExplorerAppearance | undefined {\n const inherited = useContext(MonkeysThemeContext).dataExplorerAppearance;\n return useMemo(\n () => mergeAppearance(inherited, explicit),\n [explicit, inherited],\n );\n}\n\nexport function useMonkeysDirection() {\n return useContext(MonkeysDirectionContext).direction;\n}\n\nexport function useMonkeysEnvironment() {\n return useContext(MonkeysEnvironmentContext).environment;\n}\n\nexport function useMonkeysPortalOptions() {\n return useContext(MonkeysEnvironmentContext).portal;\n}\n\nexport function useMonkeysComponentAttributes(): MonkeysComponentAttributes {\n const locale = useContext(MonkeysLocaleContext);\n const theme = useContext(MonkeysThemeContext);\n const direction = useContext(MonkeysDirectionContext);\n const providerActive = locale.provided || theme.provided || direction.provided;\n\n return useMemo(\n () =>\n providerActive\n ? {\n dir: direction.direction,\n 'data-monkeys-direction': direction.direction,\n 'data-monkeys-locale': locale.locale,\n 'data-monkeys-theme': theme.themeId,\n 'data-monkeys-theme-mode': theme.resolvedTheme?.colorMode,\n }\n : {},\n [\n direction.direction,\n locale.locale,\n providerActive,\n theme.resolvedTheme?.colorMode,\n theme.themeId,\n ],\n );\n}\n","import type { ReactNode } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...parts: Array<string | false | null | undefined>) {\n return twMerge(parts.filter(Boolean).join(' '));\n}\n\nexport function hasRenderableNode(node: ReactNode) {\n return node !== undefined && node !== null && typeof node !== 'boolean';\n}\n\nexport function hasNonEmptyRenderableNode(node: ReactNode) {\n if (typeof node === 'string') return node.trim().length > 0;\n return hasRenderableNode(node);\n}\n","import {\n Fragment,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type SyntheticEvent,\n} from \"react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { BaseButton, BaseTooltip, type BaseAppearance } from \"../base\";\nexport { AppShellSidebar } from \"./AppShellSidebar\";\nexport type {\n AppShellSidebarClassNames,\n AppShellSidebarProps,\n} from \"./AppShellSidebar\";\nexport { UserAccountMenu } from \"./UserAccountMenu\";\nexport type {\n UserAccountMenuClassNames,\n UserAccountMenuItem,\n UserAccountMenuProps,\n UserAccountMenuRadius,\n UserAccountMenuSelectorConfig,\n UserAccountMenuSelectorOption,\n UserAccountMenuSide,\n UserAccountMenuTriggerVariant,\n UserAccountMenuUser,\n} from \"./UserAccountMenu\";\n\n// ============================================================\n// cn utility (inline clsx + tailwind-merge–lite for zero deps)\n// ============================================================\nexport function cn(...inputs: (string | undefined | null | false)[]): string {\n return inputs.filter(Boolean).join(\" \");\n}\n\n// ============================================================\n// NavButton\n// ============================================================\nexport interface NavButtonProps {\n /** 是否处于激活状态 */\n active?: boolean;\n /** 是否显示但禁止交互 */\n disabled?: boolean;\n /** 左侧图标 */\n icon?: ReactNode;\n /** 右侧附加内容(如 chevron) */\n postfix?: ReactNode;\n /** 点击回调 */\n onClick?: () => void;\n className?: string;\n children: ReactNode;\n}\n\nexport function NavButton({\n active,\n disabled,\n icon,\n postfix,\n onClick,\n className,\n children,\n}: NavButtonProps) {\n return (\n <button\n type=\"button\"\n aria-disabled={disabled}\n aria-pressed={active}\n disabled={disabled}\n className={cn(\n \"flex w-full cursor-pointer select-none items-center gap-2 rounded-xl border p-2 text-left text-xs text-[hsl(var(--foreground))] transition-colors\",\n active\n ? \"border-[hsl(var(--input))] bg-[hsl(var(--muted))] font-bold\"\n : disabled\n ? \"border-transparent\"\n : \"border-transparent hover:border-[hsl(var(--input))]/60 hover:bg-[hsl(var(--muted))]/60\",\n disabled && \"!cursor-not-allowed opacity-60\",\n className,\n )}\n onClick={onClick}\n >\n <div className=\"w-[20px] [&_svg]:h-[16px] [&_svg]:w-[16px]\">{icon}</div>\n <span className=\"text-sm\">{children}</span>\n {postfix}\n </button>\n );\n}\n\n// ============================================================\n// AppHeader\n// ============================================================\nexport interface HeaderTab {\n id: string;\n label: string;\n}\n\nexport interface AppHeaderLogo {\n /** Logo 图片 URL,若为空则显示 fallback */\n url?: string;\n /** 品牌名称 */\n title: string;\n /** 点击 Logo 回调 */\n onClick?: () => void;\n}\n\nexport interface AppHeaderUser {\n name?: string;\n email?: string;\n photo?: string;\n}\n\nexport interface AppHeaderProps {\n /** 品牌 Logo */\n logo: AppHeaderLogo;\n /** 导航 tabs */\n tabs?: HeaderTab[];\n /** 当前激活的 tab id */\n activeTab?: string;\n /** tab 切换回调 */\n onTabChange?: (tabId: string) => void;\n /** 用户信息 */\n user?: AppHeaderUser;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 用户菜单中的额外菜单项(在退出登录按钮之前渲染) */\n userMenuItems?: ReactNode;\n /** header 右侧额外内容 */\n extra?: ReactNode;\n className?: string;\n}\n\nexport function AppHeader({\n logo,\n tabs,\n activeTab,\n onTabChange,\n user,\n onLogout,\n logoutLabel = \"退出登录\",\n userMenuItems,\n extra,\n className,\n}: AppHeaderProps) {\n const getUserInitials = (name: string) =>\n name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2);\n\n return (\n <header\n className={cn(\n \"flex h-[72px] w-full shrink-0 items-center justify-between gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]\",\n className,\n )}\n >\n {/* Logo */}\n <div\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\n onClick={logo.onClick}\n >\n <div\n className={cn(\n \"flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden\",\n logo.url\n ? \"bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"h-full w-full object-contain\"\n />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">\n {logo.title}\n </span>\n </div>\n\n {/* Separator + Tabs */}\n {tabs && tabs.length > 0 && (\n <>\n <div className=\"h-1/2 w-px bg-[hsl(var(--border))]\" />\n <div className=\"flex flex-1 items-center\">\n <div className=\"inline-flex h-9 items-center gap-1 rounded-md bg-transparent p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all\",\n tab.id === activeTab\n ? \"bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm\"\n : \"text-[hsl(var(--muted-foreground))] hover:bg-[hsl(var(--muted))]/50\",\n )}\n onClick={() => onTabChange?.(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n {(!tabs || tabs.length === 0) && <div className=\"flex-1\" />}\n\n {/* Right side */}\n <div className=\"flex shrink-0 items-center gap-4\">\n {extra}\n {user && (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button className=\"flex h-8 w-8 items-center justify-center rounded-full hover:ring-2 hover:ring-[hsl(var(--ring))]/20 transition-all overflow-hidden focus-visible:outline-none\">\n {user.photo ? (\n <img\n src={user.photo}\n alt={user.name}\n className=\"h-8 w-8 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : \"U\"}\n </div>\n )}\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 w-52 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95\"\n sideOffset={5}\n align=\"end\"\n >\n {/* User info label */}\n <DropdownMenu.Label className=\"flex items-center gap-2 px-2 py-1.5 font-normal\">\n {user.photo ? (\n <img\n src={user.photo}\n alt={user.name}\n className=\"h-8 w-8 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-xs font-medium\">\n {user.name ? getUserInitials(user.name) : \"U\"}\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium leading-none\">\n {user.name}\n </span>\n {user.email && (\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] leading-none mt-1\">\n {user.email}\n </span>\n )}\n </div>\n </DropdownMenu.Label>\n\n <DropdownMenu.Separator className=\"h-px bg-[hsl(var(--border))] my-1\" />\n\n <DropdownMenu.Group>\n {userMenuItems}\n\n {/* Logout */}\n <DropdownMenu.Item\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-[hsl(var(--destructive))] outline-none transition-colors hover:bg-[hsl(var(--accent))]\"\n onSelect={() => onLogout?.()}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n {logoutLabel}\n </DropdownMenu.Item>\n </DropdownMenu.Group>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )}\n </div>\n </header>\n );\n}\n\n// ============================================================\n// AppSidebar\n// ============================================================\nexport interface SidebarNavItem {\n id: string;\n label: string;\n icon?: ReactNode;\n disabled?: boolean;\n /** 如果有 children 则为分组,点击展开/折叠 */\n children?: SidebarNavItem[];\n}\n\nexport interface SidebarAccount {\n name?: string;\n photo?: string;\n}\n\nexport interface AppSidebarProps {\n /** Logo */\n logo?: AppHeaderLogo;\n /** 导航菜单 */\n navItems: SidebarNavItem[];\n /** 当前路径/激活的 item id */\n activeItemId?: string;\n /** 点击导航项回调 */\n onNavigate?: (itemId: string) => void;\n /** 账户信息 */\n account?: SidebarAccount;\n /** 退出登录回调 */\n onLogout?: () => void;\n /** 退出登录文案 */\n logoutLabel?: string;\n /** 底部额外内容(如版本号) */\n footer?: ReactNode;\n /** 默认展开的分组 id 列表 */\n defaultExpandedGroups?: string[];\n className?: string;\n}\n\nexport function AppSidebar({\n logo,\n navItems,\n activeItemId,\n onNavigate,\n account,\n onLogout,\n logoutLabel = \"退出登录\",\n footer,\n defaultExpandedGroups,\n className,\n}: AppSidebarProps) {\n return (\n <div\n className={cn(\n \"flex w-[13.7rem] shrink-0 flex-col justify-between gap-[var(--global-spacing,0.75rem)] overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-5\",\n className,\n )}\n >\n {/* Logo */}\n {logo && (\n <div\n className=\"flex shrink-0 cursor-pointer items-center gap-2\"\n onClick={logo.onClick}\n >\n <div\n className={cn(\n \"flex h-8 w-8 items-center justify-center rounded-lg overflow-hidden\",\n logo.url\n ? \"bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"h-full w-full object-contain\"\n />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n <span className=\"text-lg font-semibold whitespace-nowrap\">\n {logo.title}\n </span>\n </div>\n )}\n\n {/* Navigation */}\n <SidebarNavList\n items={navItems}\n activeItemId={activeItemId}\n onNavigate={onNavigate}\n defaultExpandedGroups={defaultExpandedGroups}\n />\n\n {/* Account Section */}\n {(account || footer) && (\n <div className=\"flex flex-col gap-2\">\n {account && (\n <div className=\"flex w-full flex-col gap-2 rounded-lg bg-[hsl(var(--muted))] p-2 shadow-sm\">\n <div className=\"flex w-full items-center justify-between px-3 py-1\">\n <div className=\"flex items-center gap-2\">\n {account.photo ? (\n <img\n src={account.photo}\n alt={account.name}\n className=\"h-5 w-5 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-[hsl(var(--muted))] text-[10px] font-medium\">\n {account.name\n ? account.name.charAt(0).toUpperCase()\n : \"U\"}\n </div>\n )}\n <span className=\"text-xs font-medium truncate max-w-[100px]\">\n {account.name}\n </span>\n </div>\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"flex items-center justify-center text-[hsl(var(--destructive))] hover:opacity-80 transition-opacity\"\n title={logoutLabel}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )}\n {footer}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================\n// SidebarNavList (internal accordion-style nav)\n// ============================================================\ninterface SidebarNavListProps {\n items: SidebarNavItem[];\n activeItemId?: string;\n onNavigate?: (itemId: string) => void;\n defaultExpandedGroups?: string[];\n}\n\nfunction SidebarNavList({\n items,\n activeItemId,\n onNavigate,\n defaultExpandedGroups,\n}: SidebarNavListProps) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>(() => {\n const map: Record<string, boolean> = {};\n (defaultExpandedGroups ?? items.map((i) => i.id)).forEach((id) => {\n map[id] = true;\n });\n return map;\n });\n const [localActiveItemId, setLocalActiveItemId] = useState<\n string | undefined\n >(activeItemId);\n\n useEffect(() => {\n if (activeItemId !== undefined) {\n setLocalActiveItemId(activeItemId);\n }\n }, [activeItemId]);\n\n const toggle = (id: string) => {\n setExpanded((prev: Record<string, boolean>) => ({\n ...prev,\n [id]: !prev[id],\n }));\n };\n const resolvedActiveItemId = activeItemId ?? localActiveItemId;\n\n return (\n <div\n className=\"h-full flex-1 overflow-y-auto\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n <style>{`.monkeys-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\n <div className=\"monkeys-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\">\n {items.map((item) => {\n if (item.children && item.children.length > 0) {\n const isExpanded = expanded[item.id] ?? true;\n return (\n <div key={item.id}>\n <NavButton\n active={item.id === resolvedActiveItemId}\n disabled={item.disabled}\n icon={item.icon}\n onClick={() => toggle(item.id)}\n postfix={\n <div className=\"flex flex-1 justify-end\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\n style={{\n transform: isExpanded\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n }}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </div>\n }\n >\n {item.label}\n </NavButton>\n {isExpanded && !item.disabled && (\n <div className=\"flex flex-col gap-1 mt-1\">\n {item.children.map((child) => (\n <NavButton\n key={child.id}\n active={child.id === resolvedActiveItemId}\n disabled={child.disabled}\n onClick={() => {\n setLocalActiveItemId(child.id);\n onNavigate?.(child.id);\n }}\n >\n {child.label}\n </NavButton>\n ))}\n </div>\n )}\n </div>\n );\n }\n return (\n <NavButton\n key={item.id}\n icon={item.icon}\n active={item.id === resolvedActiveItemId}\n disabled={item.disabled}\n onClick={() => {\n setLocalActiveItemId(item.id);\n onNavigate?.(item.id);\n }}\n >\n {item.label}\n </NavButton>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ============================================================\n// AppLayout\n// ============================================================\nexport interface AppLayoutProps {\n /** header 组件 */\n header?: ReactNode;\n /** sidebar 组件 */\n sidebar?: ReactNode;\n /** 主内容 */\n children: ReactNode;\n /** 是否 flush 布局(无内边距) */\n flush?: boolean;\n className?: string;\n}\n\nexport function AppLayout({\n header,\n sidebar,\n children,\n flush = false,\n className,\n}: AppLayoutProps) {\n return (\n <div\n className={cn(\n \"flex h-screen flex-col gap-[var(--global-spacing,0.75rem)] overflow-hidden p-[var(--global-spacing,0.75rem)]\",\n className,\n )}\n style={{ backgroundColor: \"hsl(var(--muted))\" }}\n >\n {header ? header : null}\n <div className=\"flex flex-1 gap-[var(--global-spacing,0.75rem)] overflow-hidden min-h-0\">\n {sidebar ? sidebar : null}\n <main\n className={cn(\n \"flex-1 min-h-0 overflow-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))]\",\n !flush && \"overflow-y-auto\",\n )}\n >\n {flush ? (\n children\n ) : (\n <div className=\"h-full overflow-y-auto\">{children}</div>\n )}\n </main>\n </div>\n </div>\n );\n}\n\n// ============================================================\n// NavigationLayout\n// ============================================================\nexport type NavigationMode = \"sidebar\" | \"headbar\";\nexport type HeadbarLayoutMode = \"boxed\" | \"full-bleed\";\nexport type HeadbarMenuRadius =\n \"default\" | \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\nexport type HeadbarNavPosition = \"left\" | \"center\" | \"right\";\nexport type HeadbarSurface = \"card\" | \"glassy\" | \"ghost\";\n\nexport interface LayoutNavItem {\n id: string;\n label: ReactNode;\n headbarLabel?: ReactNode;\n icon?: ReactNode;\n children?: LayoutNavItem[];\n disabled?: boolean;\n trailing?: ReactNode;\n headbarSecondaryAction?: ReactNode;\n}\n\ninterface NavigationLayoutAction {\n id: string;\n label: ReactNode;\n title?: string;\n icon?: ReactNode;\n onClick?: () => void;\n}\n\nexport interface HeadbarLayout {\n brandTitle?: ReactNode;\n heightPx?: number;\n layoutMode?: HeadbarLayoutMode;\n menuRadius?: HeadbarMenuRadius;\n navPosition?: HeadbarNavPosition;\n surface?: HeadbarSurface;\n}\n\nexport interface NavigationLayoutProps {\n activeItemId?: string;\n activeRootId?: string;\n allowModeSwitch?: boolean;\n accountMenu?: ReactNode;\n children: ReactNode;\n className?: string;\n collapsedSidebarAccountMenu?: ReactNode;\n collapsedSidebarWidth?: string;\n defaultMode?: NavigationMode;\n defaultSidebarCollapsed?: boolean;\n expandedSidebarWidth?: string;\n expandSidebarLabel?: string;\n flush?: boolean;\n headbarActions?: ReactNode;\n headbarLayout?: HeadbarLayout;\n logo?: AppHeaderLogo;\n mode?: NavigationMode;\n navItems: LayoutNavItem[];\n onModeChange?: (mode: NavigationMode) => void;\n onNavigate?: (itemId: string) => void;\n onSidebarCollapsedChange?: (collapsed: boolean) => void;\n renderHeadbarExtra?: ReactNode;\n collapseSidebarLabel?: string;\n sidebarCollapsed?: boolean;\n sidebarAccountMenu?: ReactNode;\n sidebarFooter?: ReactNode;\n sidebarHeader?: ReactNode;\n switchToHeadbarLabel?: string;\n switchToSidebarLabel?: string;\n}\n\nconst NAVIGATION_LAYOUT_SIDEBAR_EXPANDED_WIDTH = \"13.7rem\";\nconst NAVIGATION_LAYOUT_SIDEBAR_COLLAPSED_WIDTH = \"4.25rem\";\nconst NAVIGATION_LAYOUT_TRANSITION_TIMING = \"cubic-bezier(0.22, 1, 0.36, 1)\";\nconst NAVIGATION_LAYOUT_HEADBAR_DEFAULT_HEIGHT_PX = 72;\nconst NAVIGATION_LAYOUT_HEADBAR_MIN_HEIGHT_PX = 56;\nconst NAVIGATION_LAYOUT_HEADBAR_MAX_HEIGHT_PX = 120;\nconst NAVIGATION_LAYOUT_HEADBAR_COMPACT_HEIGHT_THRESHOLD_PX = 64;\nconst NAVIGATION_LAYOUT_HEADBAR_BOXED_VERTICAL_PADDING_PX = 12;\nconst NAVIGATION_LAYOUT_HEADBAR_COMPACT_VERTICAL_PADDING_PX = 8;\nconst NAVIGATION_LAYOUT_HEADBAR_LOGO_DEFAULT_SIZE_PX = 44;\nconst NAVIGATION_LAYOUT_HEADBAR_LOGO_COMPACT_SIZE_PX = 36;\nconst NAVIGATION_LAYOUT_DEFAULT_APPEARANCE: BaseAppearance = {\n preset: \"soft\",\n density: \"compact\",\n radius: \"lg\",\n border: \"subtle\",\n background: \"soft\",\n};\n\nconst NAVIGATION_LAYOUT_MENU_RADIUS_CLASS_MAP: Record<\n Exclude<HeadbarMenuRadius, \"default\">,\n { all: string; left: string; right: string }\n> = {\n none: { all: \"rounded-none\", left: \"!rounded-none\", right: \"!rounded-none\" },\n sm: {\n all: \"rounded-sm\",\n left: \"!rounded-l-sm !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-sm\",\n },\n md: {\n all: \"rounded-md\",\n left: \"!rounded-l-md !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-md\",\n },\n lg: {\n all: \"rounded-lg\",\n left: \"!rounded-l-lg !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-lg\",\n },\n xl: {\n all: \"rounded-xl\",\n left: \"!rounded-l-xl !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-xl\",\n },\n full: {\n all: \"rounded-full\",\n left: \"!rounded-l-full !rounded-r-none\",\n right: \"!rounded-l-none !rounded-r-full\",\n },\n};\n\nfunction clampHeadbarHeight(value?: number) {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n return NAVIGATION_LAYOUT_HEADBAR_DEFAULT_HEIGHT_PX;\n return Math.min(\n NAVIGATION_LAYOUT_HEADBAR_MAX_HEIGHT_PX,\n Math.max(NAVIGATION_LAYOUT_HEADBAR_MIN_HEIGHT_PX, Math.round(value)),\n );\n}\n\nfunction getHeadbarVerticalPaddingPx(heightPx: number) {\n return heightPx <= NAVIGATION_LAYOUT_HEADBAR_COMPACT_HEIGHT_THRESHOLD_PX\n ? NAVIGATION_LAYOUT_HEADBAR_COMPACT_VERTICAL_PADDING_PX\n : NAVIGATION_LAYOUT_HEADBAR_BOXED_VERTICAL_PADDING_PX;\n}\n\nfunction getHeadbarLogoSizePx(heightPx: number) {\n return heightPx <= NAVIGATION_LAYOUT_HEADBAR_COMPACT_HEIGHT_THRESHOLD_PX\n ? NAVIGATION_LAYOUT_HEADBAR_LOGO_COMPACT_SIZE_PX\n : NAVIGATION_LAYOUT_HEADBAR_LOGO_DEFAULT_SIZE_PX;\n}\n\nfunction getHeadbarMenuRadiusClass(\n menuRadius: HeadbarMenuRadius = \"default\",\n part: \"all\" | \"left\" | \"right\" = \"all\",\n) {\n if (menuRadius === \"default\") {\n if (part === \"left\") return \"rounded-l-lg rounded-r-none\";\n if (part === \"right\") return \"rounded-l-none rounded-r-lg\";\n return \"rounded-lg\";\n }\n return NAVIGATION_LAYOUT_MENU_RADIUS_CLASS_MAP[menuRadius][part];\n}\n\nfunction getHeadbarFrameClass(\n layoutMode: HeadbarLayoutMode = \"boxed\",\n navPosition: HeadbarNavPosition = \"center\",\n) {\n const columns =\n navPosition === \"center\"\n ? \"grid-cols-[minmax(max-content,1fr)_minmax(0,max-content)_minmax(max-content,1fr)]\"\n : \"grid-cols-[max-content_minmax(0,1fr)_max-content]\";\n return layoutMode === \"full-bleed\"\n ? cn(\n \"sticky top-0 z-40 grid w-full shrink-0 items-center gap-4 rounded-none border-b border-x-0 border-t-0 border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]\",\n columns,\n )\n : cn(\n \"sticky top-0 z-40 grid w-full shrink-0 items-center gap-4 rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-[var(--global-spacing,0.75rem)]\",\n columns,\n );\n}\n\nfunction getHeadbarFrameStyle(\n layoutMode: HeadbarLayoutMode = \"boxed\",\n heightPx: number,\n surface: HeadbarSurface = \"card\",\n): CSSProperties {\n const verticalPaddingPx = getHeadbarVerticalPaddingPx(heightPx);\n const fallbackBackground = \"hsl(var(--background))\";\n const style: CSSProperties = {\n height: `var(--monkeys-component-navigation-headbar-height, ${heightPx}px)`,\n minHeight: `var(--monkeys-component-navigation-headbar-height, ${heightPx}px)`,\n paddingTop: `${verticalPaddingPx}px`,\n paddingBottom: `${verticalPaddingPx}px`,\n background: `var(--monkeys-component-navigation-headbar-frame-background, ${fallbackBackground})`,\n color:\n \"var(--monkeys-component-navigation-headbar-frame-foreground, hsl(var(--foreground)))\",\n borderColor:\n surface === \"glassy\"\n ? \"var(--monkeys-component-navigation-headbar-frame-border-color, rgb(255 255 255 / 0.5))\"\n : \"var(--monkeys-component-navigation-headbar-frame-border-color, hsl(var(--input)))\",\n borderRadius:\n layoutMode === \"full-bleed\"\n ? \"0\"\n : \"var(--monkeys-component-navigation-headbar-frame-radius, var(--radius, 0.75rem))\",\n boxShadow:\n surface === \"glassy\"\n ? \"var(--monkeys-component-navigation-headbar-frame-shadow, inset 0 0 0 0 rgb(0 0 0 / 0.1))\"\n : \"var(--monkeys-component-navigation-headbar-frame-shadow, none)\",\n backdropFilter: `blur(var(--monkeys-component-navigation-headbar-frame-backdrop-blur, ${surface === \"glassy\" ? \"45px\" : \"0px\"}))`,\n };\n\n if (layoutMode === \"full-bleed\") {\n style.marginLeft = \"calc(var(--global-spacing,0.75rem) * -1)\";\n style.marginRight = \"calc(var(--global-spacing,0.75rem) * -1)\";\n style.marginTop = \"calc(var(--global-spacing,0.75rem) * -1)\";\n style.width = \"calc(100% + (var(--global-spacing,0.75rem) * 2))\";\n }\n\n return style;\n}\n\nfunction getHeadbarNavClass(navPosition: HeadbarNavPosition = \"center\") {\n if (navPosition === \"left\") return \"justify-start\";\n if (navPosition === \"right\") return \"justify-end\";\n return \"justify-center\";\n}\n\nfunction getHeadbarItemStyle(\n active: boolean,\n useTokenRadius = true,\n): CSSProperties {\n return {\n height: \"var(--monkeys-component-navigation-headbar-item-height, 2.25rem)\",\n borderRadius: useTokenRadius\n ? \"var(--monkeys-component-navigation-headbar-item-radius, var(--radius, 0.5rem))\"\n : undefined,\n paddingInline:\n \"var(--monkeys-component-navigation-headbar-item-padding-inline, 0.75rem)\",\n columnGap: \"var(--monkeys-component-navigation-headbar-item-gap, 0.375rem)\",\n color: active\n ? \"var(--monkeys-component-navigation-headbar-item-active-foreground, hsl(var(--foreground)))\"\n : \"var(--monkeys-component-navigation-headbar-item-foreground, hsl(var(--muted-foreground)))\",\n background: active\n ? \"var(--monkeys-component-navigation-headbar-item-active-background, hsl(var(--muted)))\"\n : \"transparent\",\n borderColor: active\n ? \"var(--monkeys-component-navigation-headbar-item-active-border-color, transparent)\"\n : \"transparent\",\n fontSize:\n \"var(--monkeys-component-navigation-headbar-item-font-size, 0.875rem)\",\n fontWeight:\n \"var(--monkeys-component-navigation-headbar-item-font-weight, 500)\",\n };\n}\n\nfunction getHeadbarCompoundStyle(\n active: boolean,\n useTokenRadius = true,\n): CSSProperties {\n return {\n ...getHeadbarItemStyle(active, useTokenRadius),\n paddingInline: undefined,\n columnGap: undefined,\n };\n}\n\nfunction findNavigationRootId(\n items: LayoutNavItem[],\n activeItemId?: string,\n): string | undefined {\n for (const item of items) {\n if (item.id === activeItemId) return item.id;\n if (item.children?.some((child) => child.id === activeItemId))\n return item.id;\n }\n return activeItemId;\n}\n\nfunction getNavigationActionTitle(action: NavigationLayoutAction) {\n return (\n action.title ||\n (typeof action.label === \"string\" ? action.label : undefined)\n );\n}\n\nfunction NavigationLayoutActionButtons({\n actions,\n compact,\n}: {\n actions: NavigationLayoutAction[];\n compact: boolean;\n}) {\n if (!actions.length) return null;\n\n if (compact) {\n return (\n <div className=\"flex flex-col items-center gap-2\">\n {actions.map((action) => {\n const title = getNavigationActionTitle(action);\n return (\n <BaseTooltip\n key={action.id}\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n content={action.label}\n placement=\"right\"\n portal\n >\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n iconOnly\n icon={action.icon}\n onClick={action.onClick}\n title={title}\n ariaLabel={title}\n className={cn(\n \"h-10 w-10 rounded-lg border-transparent text-[hsl(var(--muted-foreground))] shadow-none\",\n \"hover:-translate-y-0.5 hover:border-[hsl(var(--input))]/80 hover:bg-[hsl(var(--muted))] hover:text-[hsl(var(--foreground))]\",\n \"active:translate-y-0 active:scale-[0.96]\",\n )}\n />\n </BaseTooltip>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {actions.map((action) => (\n <BaseButton\n key={action.id}\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n icon={action.icon}\n label={<span className=\"truncate\">{action.label}</span>}\n onClick={action.onClick}\n title={getNavigationActionTitle(action)}\n className={cn(\n \"h-9 w-full justify-start gap-2.5 rounded-lg border-transparent px-3 text-left text-[13px] text-[hsl(var(--muted-foreground))] shadow-none\",\n \"hover:-translate-y-0.5 hover:border-[hsl(var(--input))]/80 hover:bg-[hsl(var(--muted))]/70 hover:text-[hsl(var(--foreground))]\",\n \"active:translate-y-0 active:scale-[0.985]\",\n )}\n />\n ))}\n </div>\n );\n}\n\nfunction SidebarNavigationList({\n activeItemId,\n items,\n onNavigate,\n revealRequest,\n}: {\n activeItemId?: string;\n items: LayoutNavItem[];\n onNavigate?: (itemId: string) => void;\n revealRequest?: { id: string; nonce: number } | null;\n}) {\n const navRef = useRef<HTMLDivElement | null>(null);\n const [expandedByRoot, setExpandedByRoot] = useState<Record<string, boolean>>(\n {},\n );\n const canReveal = revealRequest\n ? items.some(\n (item) => item.id === revealRequest.id && !item.disabled,\n )\n : false;\n const activeRootId = findNavigationRootId(items, activeItemId);\n\n const toggleRoot = (id: string) => {\n setExpandedByRoot((current) => ({\n ...current,\n [id]: !current[id],\n }));\n };\n\n useEffect(() => {\n if (!revealRequest || !canReveal) return;\n setExpandedByRoot((current) => ({\n ...current,\n [revealRequest.id]: true,\n }));\n\n const frameId = window.requestAnimationFrame(() => {\n const targetElement = navRef.current?.querySelector(\n `[data-navigation-sidebar-root-id=\"${CSS.escape(revealRequest.id)}\"]`,\n );\n if (targetElement instanceof HTMLElement) {\n targetElement.scrollIntoView({\n behavior: \"auto\",\n block: \"nearest\",\n inline: \"nearest\",\n });\n }\n });\n\n return () => window.cancelAnimationFrame(frameId);\n }, [canReveal, revealRequest]);\n\n return (\n <div\n className=\"h-full flex-1 overflow-y-auto\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n <style>{`.monkeys-navigation-sidebar-nav::-webkit-scrollbar { display: none; }`}</style>\n <div\n ref={navRef}\n className=\"monkeys-navigation-sidebar-nav flex w-full flex-col gap-2 text-xs text-[hsl(var(--foreground))]\"\n >\n {items.map((item) => {\n const isGroup = Boolean(item.children?.length);\n const isExpanded = !item.disabled && Boolean(expandedByRoot[item.id]);\n const isActive = activeRootId === item.id;\n\n if (isGroup) {\n return (\n <div key={item.id} data-navigation-sidebar-root-id={item.id}>\n <NavButton\n active={isActive}\n disabled={item.disabled}\n icon={item.icon}\n onClick={() => toggleRoot(item.id)}\n postfix={\n <div className=\"flex flex-1 justify-end\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-[hsl(var(--foreground))] transition-transform duration-200\"\n style={{\n transform: isExpanded\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n }}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </div>\n }\n >\n {item.label}\n </NavButton>\n {isExpanded ? (\n <div className=\"mt-1 flex flex-col gap-1\">\n {item.children?.map((child) => (\n <NavButton\n key={child.id}\n active={activeItemId === child.id}\n disabled={child.disabled}\n onClick={() => onNavigate?.(child.id)}\n >\n {child.label}\n </NavButton>\n ))}\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div key={item.id} data-navigation-sidebar-root-id={item.id}>\n <NavButton\n active={isActive}\n disabled={item.disabled}\n icon={item.icon}\n onClick={() => onNavigate?.(item.id)}\n >\n {item.label}\n </NavButton>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction SidebarBrand({\n collapsed,\n logo,\n title,\n}: {\n collapsed?: boolean;\n logo?: AppHeaderLogo;\n title?: ReactNode;\n}) {\n if (!logo) return null;\n\n const brandTitle = title ?? logo.title;\n const logoMark = (\n <div\n className={cn(\n \"flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-lg\",\n logo.url\n ? \"bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"h-full w-full object-contain\"\n />\n ) : (\n <span className=\"text-sm font-bold\">{logo.title.charAt(0)}</span>\n )}\n </div>\n );\n\n if (collapsed) {\n return (\n <BaseTooltip\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n content={brandTitle}\n placement=\"right\"\n portal\n >\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n ariaLabel={typeof brandTitle === \"string\" ? brandTitle : logo.title}\n className=\"h-10 w-10 rounded-lg border-transparent bg-transparent p-0 shadow-none hover:bg-[hsl(var(--muted))]/60\"\n icon={logoMark}\n iconOnly\n onClick={logo.onClick}\n title={typeof brandTitle === \"string\" ? brandTitle : logo.title}\n tone=\"muted\"\n />\n </BaseTooltip>\n );\n }\n\n return (\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n ariaLabel={logo.title}\n className=\"h-auto w-full justify-start gap-3 border-transparent bg-transparent p-0 text-left shadow-none hover:bg-transparent\"\n classNames={{ icon: \"h-9 w-9\" }}\n icon={logoMark}\n label={\n <span className=\"min-w-0 truncate text-sm font-semibold text-[hsl(var(--foreground))]\">\n {brandTitle}\n </span>\n }\n onClick={logo.onClick}\n title={typeof brandTitle === \"string\" ? brandTitle : logo.title}\n tone=\"muted\"\n />\n );\n}\n\nfunction Sidebar({\n accountMenu,\n activeItemId,\n actions = [],\n collapsed,\n collapsedAccountMenu,\n footer,\n header,\n items,\n logo,\n onCollapsedChange,\n onNavigate,\n onRevealRoot,\n revealRequest,\n title,\n}: {\n accountMenu?: ReactNode;\n activeItemId?: string;\n actions?: NavigationLayoutAction[];\n collapsed?: boolean;\n collapsedAccountMenu?: ReactNode;\n footer?: ReactNode;\n header?: ReactNode;\n items: LayoutNavItem[];\n logo?: AppHeaderLogo;\n onCollapsedChange?: (collapsed: boolean) => void;\n onNavigate?: (itemId: string) => void;\n onRevealRoot?: (rootId: string) => void;\n revealRequest?: { id: string; nonce: number } | null;\n title?: ReactNode;\n}) {\n if (collapsed) {\n const activeRootId = findNavigationRootId(items, activeItemId);\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] p-2 shadow-sm\">\n <div className=\"mb-3 flex shrink-0 justify-center\">\n {header ?? <SidebarBrand collapsed logo={logo} title={title} />}\n </div>\n <div\n className=\"flex min-h-0 flex-1 flex-col items-center gap-2 overflow-y-auto pb-3\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {items.map((item) => {\n const isActive = activeRootId === item.id;\n return (\n <BaseTooltip\n key={item.id}\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n content={item.label}\n placement=\"right\"\n portal\n >\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n active={isActive}\n disabled={item.disabled}\n iconOnly\n icon={item.icon}\n onClick={() => {\n if (item.disabled) return;\n onRevealRoot?.(item.id);\n onCollapsedChange?.(false);\n if (item.children?.length) return;\n onNavigate?.(item.id);\n }}\n title={\n typeof item.label === \"string\" ? item.label : undefined\n }\n ariaLabel={\n typeof item.label === \"string\" ? item.label : item.id\n }\n className={cn(\n \"h-10 w-10 rounded-lg border text-[hsl(var(--muted-foreground))] shadow-none\",\n \"hover:-translate-y-0.5 active:translate-y-0 active:scale-[0.96]\",\n isActive\n ? \"border-[hsl(var(--input))] bg-[hsl(var(--muted))] text-[hsl(var(--foreground))] shadow-sm\"\n : \"border-transparent hover:border-[hsl(var(--input))]/80 hover:bg-[hsl(var(--muted))]/70 hover:text-[hsl(var(--foreground))]\",\n )}\n />\n </BaseTooltip>\n );\n })}\n </div>\n <div className=\"-mx-2 mt-2 border-t border-[hsl(var(--input))] bg-[hsl(var(--background))] px-2 pt-2.5 pb-0.5\">\n <NavigationLayoutActionButtons actions={actions} compact />\n {collapsedAccountMenu ? (\n <div className=\"mt-2 flex justify-center border-t border-[hsl(var(--input))] pt-2\">\n {collapsedAccountMenu}\n </div>\n ) : null}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col justify-between gap-0 overflow-y-hidden rounded-xl border border-[hsl(var(--input))] bg-[hsl(var(--background))] px-5 pt-5 pb-1.5\">\n <div className=\"mb-4 shrink-0\">\n {header ?? <SidebarBrand logo={logo} title={title} />}\n </div>\n <SidebarNavigationList\n activeItemId={activeItemId}\n items={items}\n onNavigate={onNavigate}\n revealRequest={revealRequest}\n />\n <div className=\"-mx-5 mt-2 border-t border-[hsl(var(--input))] bg-[hsl(var(--background))] px-4 pt-2.5 pb-1\">\n <NavigationLayoutActionButtons actions={actions} compact={false} />\n {footer}\n {accountMenu ? (\n <div className=\"mt-2 border-t border-[hsl(var(--input))] pt-2\">\n {accountMenu}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction HeadbarChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\n \"h-4 w-4 shrink-0 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction HeadbarNavMenuItem({\n activeItemId,\n compound,\n isActive,\n item,\n label,\n menuButtonRadiusClass,\n menuContentRadiusClass,\n menuItemRadiusClass,\n onNavigate,\n useTokenRadius,\n}: {\n activeItemId?: string;\n compound?: boolean;\n isActive: boolean;\n item: LayoutNavItem;\n label: ReactNode;\n menuButtonRadiusClass: string;\n menuContentRadiusClass: string;\n menuItemRadiusClass: string;\n onNavigate?: (itemId: string) => void;\n useTokenRadius: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const isOpen = !item.disabled && open;\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wasOpenOnPointerDownRef = useRef(false);\n\n const clearCloseTimer = () => {\n if (!closeTimerRef.current) return;\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n };\n\n const openMenu = () => {\n if (item.disabled) return;\n clearCloseTimer();\n setOpen(true);\n };\n\n const scheduleCloseMenu = () => {\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setOpen(false);\n closeTimerRef.current = null;\n }, 120);\n };\n\n const navigateToFirstEnabledChild = () => {\n const firstEnabledChild = item.children?.find((child) => !child.disabled);\n if (!firstEnabledChild) return false;\n\n setOpen(false);\n onNavigate?.(firstEnabledChild.id);\n return true;\n };\n\n useEffect(() => clearCloseTimer, []);\n\n return (\n <DropdownMenu.Root\n modal={false}\n open={isOpen}\n onOpenChange={(nextOpen) => setOpen(!item.disabled && nextOpen)}\n >\n <DropdownMenu.Trigger asChild>\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n active={isActive || isOpen}\n icon={item.icon}\n endIcon={<HeadbarChevronIcon open={isOpen} />}\n label={<span className=\"truncate whitespace-nowrap\">{label}</span>}\n disabled={item.disabled}\n onClick={() => {\n const wasOpenOnPointerDown = wasOpenOnPointerDownRef.current;\n wasOpenOnPointerDownRef.current = false;\n if (wasOpenOnPointerDown && navigateToFirstEnabledChild()) return;\n setOpen(true);\n }}\n onPointerDown={() => {\n wasOpenOnPointerDownRef.current = isOpen;\n }}\n onPointerCancel={() => {\n wasOpenOnPointerDownRef.current = false;\n }}\n onKeyDown={(event) => {\n if (\n !isOpen ||\n (event.key !== \"Enter\" && event.key !== \" \")\n )\n return;\n if (navigateToFirstEnabledChild()) event.preventDefault();\n }}\n onMouseEnter={openMenu}\n onMouseLeave={scheduleCloseMenu}\n style={getHeadbarItemStyle(\n isActive || isOpen,\n compound ? false : useTokenRadius,\n )}\n classNames={{\n icon: \"text-[inherit] [&_*]:!text-[inherit] [&_svg]:!stroke-current\",\n label: \"text-[inherit] [&_*]:!text-[inherit]\",\n }}\n className={cn(\n \"max-w-[12rem] shrink-0 border shadow-none\",\n compound && \"!rounded-none !border-0 !bg-transparent\",\n menuButtonRadiusClass,\n isActive || isOpen\n ? \"\"\n : \"hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--muted)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--foreground)))]\",\n )}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={5}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onMouseEnter={openMenu}\n onMouseLeave={scheduleCloseMenu}\n className={cn(\n \"z-50 min-w-56 border p-1.5 animate-in fade-in-0 zoom-in-95\",\n menuContentRadiusClass,\n )}\n style={{\n background:\n \"var(--monkeys-component-navigation-headbar-menu-background, hsl(var(--popover)))\",\n borderColor:\n \"var(--monkeys-component-navigation-headbar-menu-border-color, hsl(var(--border)))\",\n color:\n \"var(--monkeys-component-navigation-headbar-menu-foreground, hsl(var(--popover-foreground)))\",\n boxShadow:\n \"var(--monkeys-component-navigation-headbar-menu-shadow, 0 10px 15px -3px rgb(0 0 0 / 0.1))\",\n backdropFilter:\n \"blur(var(--monkeys-component-navigation-headbar-menu-backdrop-blur, 0px))\",\n }}\n >\n {item.children?.map((child) => (\n <DropdownMenu.Item\n key={child.id}\n disabled={child.disabled}\n className={cn(\n \"relative flex cursor-pointer select-none items-center gap-2.5 px-3 py-2 text-sm outline-none transition-colors hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--accent)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--accent-foreground)))] focus:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--accent)))] focus:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--accent-foreground)))] data-[highlighted]:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--accent)))] data-[highlighted]:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--accent-foreground)))]\",\n menuItemRadiusClass,\n )}\n style={getHeadbarItemStyle(\n child.id === activeItemId,\n useTokenRadius,\n )}\n onSelect={() => {\n if (child.disabled) return;\n setOpen(false);\n onNavigate?.(child.id);\n }}\n >\n {child.icon ? (\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-[hsl(var(--muted-foreground))]\">\n {child.icon}\n </span>\n ) : null}\n <span className=\"min-w-0 truncate\">\n {child.headbarLabel ?? child.label}\n </span>\n {child.trailing}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n}\n\nfunction blockEvent(event: SyntheticEvent) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport interface NavigationHeadbarMenuProps {\n activeItemId?: string;\n activeRootId?: string;\n items: LayoutNavItem[];\n menuRadius?: HeadbarMenuRadius;\n onNavigate?: (itemId: string) => void;\n}\n\nexport function NavigationHeadbarMenu({\n activeItemId,\n activeRootId,\n items,\n menuRadius = \"default\",\n onNavigate,\n}: NavigationHeadbarMenuProps) {\n const menuButtonRadiusClass = getHeadbarMenuRadiusClass(menuRadius);\n const menuContentRadiusClass = getHeadbarMenuRadiusClass(menuRadius);\n const menuItemRadiusClass = getHeadbarMenuRadiusClass(menuRadius);\n const useTokenRadius = menuRadius === \"default\";\n\n return (\n <div className=\"flex w-max min-w-0 shrink-0 items-center gap-1\">\n {items.map((item) => {\n const isActive = activeRootId === item.id || activeItemId === item.id;\n const hasSecondaryAction = Boolean(item.headbarSecondaryAction);\n const label = item.headbarLabel ?? item.label;\n\n const primaryAction = item.children?.length ? (\n <HeadbarNavMenuItem\n activeItemId={activeItemId}\n compound={hasSecondaryAction}\n isActive={isActive}\n item={item}\n label={label}\n menuButtonRadiusClass={menuButtonRadiusClass}\n menuContentRadiusClass={menuContentRadiusClass}\n menuItemRadiusClass={menuItemRadiusClass}\n onNavigate={onNavigate}\n useTokenRadius={useTokenRadius}\n />\n ) : (\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n active={isActive}\n disabled={item.disabled}\n icon={item.icon}\n label={\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate whitespace-nowrap\">{label}</span>\n {item.trailing}\n </span>\n }\n onClick={() => onNavigate?.(item.id)}\n style={getHeadbarItemStyle(\n isActive,\n hasSecondaryAction ? false : useTokenRadius,\n )}\n classNames={{\n icon: \"text-[inherit] [&_*]:!text-[inherit] [&_svg]:!stroke-current\",\n label: \"text-[inherit] [&_*]:!text-[inherit]\",\n }}\n className={cn(\n \"max-w-[12rem] shrink-0 border shadow-none\",\n hasSecondaryAction &&\n \"!rounded-none !border-0 !bg-transparent\",\n menuButtonRadiusClass,\n isActive\n ? \"\"\n : \"hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--muted)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--foreground)))]\",\n )}\n />\n );\n\n if (!hasSecondaryAction) {\n return <Fragment key={item.id}>{primaryAction}</Fragment>;\n }\n\n return (\n <div\n key={item.id}\n data-navigation-headbar-compound-item={item.id}\n aria-disabled={item.disabled}\n className={cn(\n \"inline-flex min-w-0 shrink-0 items-center gap-0 overflow-hidden border shadow-none\",\n menuButtonRadiusClass,\n isActive\n ? \"\"\n : \"hover:!bg-[var(--monkeys-component-navigation-headbar-item-hover-background,hsl(var(--muted)))] hover:!text-[var(--monkeys-component-navigation-headbar-item-hover-foreground,hsl(var(--foreground)))]\",\n )}\n style={getHeadbarCompoundStyle(isActive, useTokenRadius)}\n >\n <span\n data-navigation-headbar-primary-action=\"\"\n className=\"inline-flex min-w-0 shrink-0\"\n >\n {primaryAction}\n </span>\n <span\n data-navigation-headbar-secondary-action={item.id}\n {...(item.disabled && {\n inert: \"\",\n onClickCapture: blockEvent,\n onKeyDownCapture: blockEvent,\n onKeyUpCapture: blockEvent,\n onPointerDownCapture: blockEvent,\n })}\n className={cn(\n \"inline-flex min-w-0 shrink-0 items-center\",\n item.disabled && \"!cursor-not-allowed opacity-60\",\n )}\n >\n {item.headbarSecondaryAction}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport interface NavigationHeadbarProps {\n activeItemId?: string;\n activeRootId?: string;\n actions?: ReactNode;\n accountMenu?: ReactNode;\n className?: string;\n extra?: ReactNode;\n layout?: HeadbarLayout;\n brand?: ReactNode;\n logo?: AppHeaderLogo;\n navigation?: ReactNode;\n navItems?: LayoutNavItem[];\n onNavigate?: (itemId: string) => void;\n}\n\nexport function NavigationHeadbar({\n activeItemId,\n activeRootId,\n actions,\n accountMenu,\n className,\n extra,\n layout,\n brand,\n logo,\n navigation,\n navItems = [],\n onNavigate,\n}: NavigationHeadbarProps) {\n const heightPx = clampHeadbarHeight(layout?.heightPx);\n const layoutMode = layout?.layoutMode ?? \"boxed\";\n const menuRadius = layout?.menuRadius ?? \"default\";\n const surface = layout?.surface ?? \"card\";\n const logoHeightPx = getHeadbarLogoSizePx(heightPx);\n const frameStyle = getHeadbarFrameStyle(layoutMode, heightPx, surface);\n const showBrandTitle = Boolean(layout?.brandTitle);\n\n return (\n <header\n className={cn(\n getHeadbarFrameClass(layoutMode, layout?.navPosition),\n className,\n )}\n data-navigation-headbar=\"\"\n data-navigation-headbar-surface={surface}\n style={frameStyle}\n >\n <div className=\"flex min-w-0 items-center justify-start\">\n {brand ??\n (logo ? (\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n icon={\n <div\n className={cn(\n \"flex items-center justify-center overflow-hidden rounded-lg\",\n logo.url\n ? \"w-auto max-w-[min(22rem,30vw)] bg-transparent\"\n : \"bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\",\n )}\n style={\n logo.url\n ? { height: logoHeightPx }\n : { width: logoHeightPx, height: logoHeightPx }\n }\n >\n {logo.url ? (\n <img\n src={logo.url}\n alt={logo.title}\n className=\"block h-full w-auto object-contain\"\n />\n ) : (\n <span className=\"text-base font-bold\">\n {logo.title.charAt(0)}\n </span>\n )}\n </div>\n }\n label={\n showBrandTitle ? (\n <span className=\"truncate whitespace-nowrap text-base font-medium text-[hsl(var(--foreground))]\">\n {layout?.brandTitle}\n </span>\n ) : null\n }\n ariaLabel={logo.title}\n title={logo.title}\n className=\"h-auto min-w-0 justify-start border-transparent bg-transparent p-0 shadow-none hover:bg-transparent\"\n classNames={\n logo.url ? { icon: \"!h-auto !w-auto shrink-0\" } : undefined\n }\n onClick={logo.onClick}\n />\n ) : null)}\n </div>\n\n <div\n className={cn(\n \"flex min-w-0 items-center\",\n getHeadbarNavClass(layout?.navPosition),\n )}\n >\n <div className=\"no-scrollbar flex max-w-full min-w-0 items-center overflow-x-auto overscroll-x-contain\">\n {navigation ?? (\n <NavigationHeadbarMenu\n activeItemId={activeItemId}\n activeRootId={activeRootId}\n items={navItems}\n menuRadius={menuRadius}\n onNavigate={onNavigate}\n />\n )}\n </div>\n </div>\n\n <div className=\"flex min-w-0 items-center justify-end gap-3\">\n {actions}\n {extra}\n {accountMenu}\n </div>\n </header>\n );\n}\n\nexport function NavigationLayout({\n activeItemId,\n activeRootId,\n allowModeSwitch = false,\n accountMenu,\n children,\n className,\n collapsedSidebarAccountMenu,\n collapsedSidebarWidth = NAVIGATION_LAYOUT_SIDEBAR_COLLAPSED_WIDTH,\n defaultMode = \"headbar\",\n defaultSidebarCollapsed = false,\n expandedSidebarWidth = NAVIGATION_LAYOUT_SIDEBAR_EXPANDED_WIDTH,\n expandSidebarLabel = \"Expand sidebar\",\n flush = false,\n headbarActions,\n headbarLayout,\n logo,\n mode,\n navItems,\n onModeChange,\n onNavigate,\n onSidebarCollapsedChange,\n renderHeadbarExtra,\n collapseSidebarLabel = \"Collapse sidebar\",\n sidebarCollapsed: controlledSidebarCollapsed,\n sidebarAccountMenu,\n sidebarFooter,\n sidebarHeader,\n switchToHeadbarLabel = \"Switch to headbar\",\n switchToSidebarLabel = \"Switch to sidebar\",\n}: NavigationLayoutProps) {\n const [uncontrolledMode, setUncontrolledMode] =\n useState<NavigationMode>(defaultMode);\n const [uncontrolledSidebarCollapsed, setUncontrolledSidebarCollapsed] =\n useState(defaultSidebarCollapsed);\n const [revealRequest, setRevealRequest] = useState<{\n id: string;\n nonce: number;\n } | null>(null);\n const isModeControlled = mode !== undefined;\n const isSidebarCollapsedControlled = controlledSidebarCollapsed !== undefined;\n const navigationMode = isModeControlled ? mode : uncontrolledMode;\n const sidebarCollapsed = isSidebarCollapsedControlled\n ? controlledSidebarCollapsed\n : uncontrolledSidebarCollapsed;\n const isHeadbarMode = navigationMode === \"headbar\";\n const sidebarWidth = sidebarCollapsed\n ? collapsedSidebarWidth\n : expandedSidebarWidth;\n\n useEffect(() => {\n if (!isModeControlled) {\n setUncontrolledMode(defaultMode);\n }\n }, [defaultMode, isModeControlled]);\n\n useEffect(() => {\n if (!isSidebarCollapsedControlled) {\n setUncontrolledSidebarCollapsed(defaultSidebarCollapsed);\n }\n }, [defaultSidebarCollapsed, isSidebarCollapsedControlled]);\n\n const setNavigationMode = (nextMode: NavigationMode) => {\n if (!isModeControlled) {\n setUncontrolledMode(nextMode);\n }\n onModeChange?.(nextMode);\n };\n\n const setCollapsed = (collapsed: boolean) => {\n if (!isSidebarCollapsedControlled) {\n setUncontrolledSidebarCollapsed(collapsed);\n }\n onSidebarCollapsedChange?.(collapsed);\n };\n\n const navigationActions: NavigationLayoutAction[] = [];\n if (allowModeSwitch) {\n navigationActions.push({\n id: \"toggle-headbar\",\n label: switchToHeadbarLabel,\n onClick: () => setNavigationMode(\"headbar\"),\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-[18px] w-[18px] rotate-180\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n </svg>\n ),\n });\n }\n navigationActions.push({\n id: \"toggle-sidebar\",\n label: sidebarCollapsed ? expandSidebarLabel : collapseSidebarLabel,\n onClick: () => setCollapsed(!sidebarCollapsed),\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-[18px] w-[18px]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d={sidebarCollapsed ? \"m14 9 3 3-3 3\" : \"m16 15-3-3 3-3\"} />\n </svg>\n ),\n });\n\n const sidebar = isHeadbarMode ? null : (\n <div\n className={cn(\n \"relative h-full min-h-0 shrink-0 transition-[width] duration-260\",\n sidebarCollapsed ? \"z-20 overflow-visible\" : \"z-10 overflow-hidden\",\n )}\n style={{\n width: sidebarWidth,\n transitionTimingFunction: NAVIGATION_LAYOUT_TRANSITION_TIMING,\n }}\n >\n <Sidebar\n accountMenu={sidebarAccountMenu ?? accountMenu}\n activeItemId={activeItemId}\n actions={navigationActions}\n collapsed={sidebarCollapsed}\n collapsedAccountMenu={collapsedSidebarAccountMenu ?? accountMenu}\n footer={sidebarFooter}\n header={sidebarHeader}\n items={navItems}\n logo={logo}\n onCollapsedChange={setCollapsed}\n onNavigate={onNavigate}\n onRevealRoot={(rootId) =>\n setRevealRequest((prev) => ({\n id: rootId,\n nonce: (prev?.nonce ?? 0) + 1,\n }))\n }\n revealRequest={revealRequest}\n title={headbarLayout?.brandTitle}\n />\n </div>\n );\n\n const header = isHeadbarMode ? (\n <NavigationHeadbar\n activeItemId={activeItemId}\n activeRootId={\n activeRootId ?? findNavigationRootId(navItems, activeItemId)\n }\n actions={\n allowModeSwitch ? (\n <>\n {headbarActions}\n <BaseButton\n appearance={NAVIGATION_LAYOUT_DEFAULT_APPEARANCE}\n tone=\"muted\"\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 shrink-0\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"m14 9 3 3-3 3\" />\n </svg>\n }\n label={\n <span className=\"truncate whitespace-nowrap\">\n {switchToSidebarLabel}\n </span>\n }\n onClick={() => setNavigationMode(\"sidebar\")}\n className={cn(\n \"h-auto min-w-0 shrink px-3 py-2 text-sm font-medium text-[hsl(var(--muted-foreground))] shadow-none hover:border-[hsl(var(--input))]/70 hover:bg-[hsl(var(--muted))]/60 hover:text-[hsl(var(--foreground))]\",\n getHeadbarMenuRadiusClass(headbarLayout?.menuRadius),\n )}\n />\n </>\n ) : (\n headbarActions\n )\n }\n accountMenu={accountMenu}\n extra={renderHeadbarExtra}\n layout={headbarLayout}\n logo={logo}\n navItems={navItems}\n onNavigate={onNavigate}\n />\n ) : null;\n\n return (\n <AppLayout\n header={header}\n sidebar={sidebar}\n flush={flush}\n className={className}\n >\n {children}\n </AppLayout>\n );\n}\n","import * as React from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronDown } from \"lucide-react\";\n\nimport { cn } from \"../base/utils\";\n\n/** Design-owned polymorphic slot for product compositions that need `asChild`. */\nexport const PolymorphicSlot = Slot;\n\nexport const Accordion = AccordionPrimitive.Root;\n\nexport const AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, style, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b\", className)}\n style={{\n borderColor:\n \"var(--monkeys-component-accordion-item-border-color, hsl(var(--border)))\",\n ...style,\n }}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\nexport const AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0 transition-transform duration-200\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = \"AccordionTrigger\";\n\nexport const AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = \"AccordionContent\";\n\nexport const Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check aria-hidden=\"true\" className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = \"Checkbox\";\n\nexport const buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-sm px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: { variant: \"default\", size: \"default\" },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : \"button\";\n return (\n <Component\n ref={ref}\n className={buttonVariants({ variant, size, className })}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport const Popover = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\nexport const PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-lg border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = \"PopoverContent\";\n\nexport interface ScrollAreaProps extends React.ComponentPropsWithoutRef<\n typeof ScrollAreaPrimitive.Root\n> {\n viewportClassName?: string;\n viewportRef?: React.Ref<HTMLDivElement>;\n onViewportScroll?: React.UIEventHandler<HTMLDivElement>;\n scrollbar?: boolean;\n scrollbarOrientation?: \"vertical\" | \"horizontal\";\n scrollBarDisabled?: boolean;\n}\n\nexport const ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n ScrollAreaProps\n>(\n (\n {\n className,\n children,\n viewportClassName,\n viewportRef,\n onViewportScroll,\n scrollbar = true,\n scrollbarOrientation = \"vertical\",\n scrollBarDisabled = false,\n ...props\n },\n ref,\n ) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\n \"group relative overflow-hidden\",\n scrollBarDisabled && \"no-scrollbar\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n onScroll={onViewportScroll}\n className={cn(\"h-full w-full rounded-[inherit]\", viewportClassName)}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {scrollbar ? (\n <ScrollBar\n orientation={scrollbarOrientation}\n className={cn(scrollBarDisabled && \"size-0 p-0\")}\n />\n ) : null}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n ),\n);\nScrollArea.displayName = \"ScrollArea\";\n\nexport const ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 data-[state=visible]:opacity-100\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-px\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-px\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = \"ScrollBar\";\n\nexport const Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb className=\"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0\" />\n </SwitchPrimitive.Root>\n));\nSwitch.displayName = \"Switch\";\n\nexport type TabsVariant = \"default\" | \"ghost\" | \"rounded\";\nexport type TabsProps = React.ComponentPropsWithoutRef<\n typeof TabsPrimitive.Root\n> & { variant?: TabsVariant };\nexport const Tabs = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Root>,\n TabsProps\n>(({ variant = \"default\", ...props }, ref) => (\n <TabsPrimitive.Root ref={ref} data-variant={variant} {...props} />\n));\nTabs.displayName = \"Tabs\";\nexport const TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {\n gap?: string | number;\n }\n>(({ className, gap, style, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className,\n )}\n style={{ gap, ...style }}\n {...props}\n />\n));\nTabsList.displayName = \"TabsList\";\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = \"TabsTrigger\";\nexport const TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = \"TabsContent\";\n\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport const Tooltip = TooltipPrimitive.Root;\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\nexport const TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = \"TooltipContent\";\n","import * as React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronRight, ChevronUp, Circle } from 'lucide-react';\n\nimport { cn } from '../base/utils';\n\nconst menuItemClassName = 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0';\nconst menuContentClassName = 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2';\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\nexport const DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub;\nexport const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\nexport const DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger ref={ref} className={cn(menuItemClassName, 'data-[state=open]:bg-accent', inset && 'pl-8', className)} {...props}>\n {children}<ChevronRight aria-hidden=\"true\" className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = 'DropdownMenuSubTrigger';\nexport const DropdownMenuSubContent = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.SubContent>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>>(\n ({ className, ...props }, ref) => <DropdownMenuPrimitive.SubContent ref={ref} className={cn(menuContentClassName, className)} {...props} />,\n);\nDropdownMenuSubContent.displayName = 'DropdownMenuSubContent';\nexport const DropdownMenuContent = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Content>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>>(\n ({ className, sideOffset = 4, ...props }, ref) => <DropdownMenuPrimitive.Portal><DropdownMenuPrimitive.Content ref={ref} sideOffset={sideOffset} className={cn(menuContentClassName, className)} {...props} /></DropdownMenuPrimitive.Portal>,\n);\nDropdownMenuContent.displayName = 'DropdownMenuContent';\nexport const DropdownMenuItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Item>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }>(\n ({ className, inset, ...props }, ref) => <DropdownMenuPrimitive.Item ref={ref} className={cn(menuItemClassName, inset && 'pl-8', className)} {...props} />,\n);\nDropdownMenuItem.displayName = 'DropdownMenuItem';\nexport const DropdownMenuCheckboxItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>>(\n ({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem ref={ref} className={cn(menuItemClassName, 'pl-8', className)} checked={checked} {...props}>\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\"><DropdownMenuPrimitive.ItemIndicator><Check aria-hidden=\"true\" className=\"h-4 w-4\" /></DropdownMenuPrimitive.ItemIndicator></span>{children}\n </DropdownMenuPrimitive.CheckboxItem>\n ),\n);\nDropdownMenuCheckboxItem.displayName = 'DropdownMenuCheckboxItem';\nexport const DropdownMenuRadioItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>>(\n ({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem ref={ref} className={cn(menuItemClassName, 'pl-8', className)} {...props}>\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\"><DropdownMenuPrimitive.ItemIndicator><Circle aria-hidden=\"true\" className=\"h-2 w-2 fill-current\" /></DropdownMenuPrimitive.ItemIndicator></span>{children}\n </DropdownMenuPrimitive.RadioItem>\n ),\n);\nDropdownMenuRadioItem.displayName = 'DropdownMenuRadioItem';\nexport const DropdownMenuLabel = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Label>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }>(\n ({ className, inset, ...props }, ref) => <DropdownMenuPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)} {...props} />,\n);\nDropdownMenuLabel.displayName = 'DropdownMenuLabel';\nexport const DropdownMenuSeparator = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Separator>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>>(\n ({ className, ...props }, ref) => <DropdownMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />,\n);\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\nexport const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />;\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport const Select = SelectPrimitive.Root;\nexport const SelectGroup = SelectPrimitive.Group;\nexport const SelectValue = SelectPrimitive.Value;\nexport interface SelectTriggerProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> {\n iconClassName?: string;\n size?: 'default' | 'sm';\n}\nexport const SelectTrigger = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Trigger>, SelectTriggerProps>(\n ({ className, children, iconClassName, size = 'default', ...props }, ref) => (\n <SelectPrimitive.Trigger ref={ref} className={cn('flex h-10 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-background px-3 py-2 text-left text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 [&>span]:min-w-0 [&>span]:flex-1 [&>span]:text-left', size === 'sm' && 'h-8 px-2 py-1 text-xs', className)} {...props}>\n {children}<SelectPrimitive.Icon asChild><ChevronDown aria-hidden=\"true\" className={cn('h-4 w-4 opacity-50', iconClassName)} /></SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n ),\n);\nSelectTrigger.displayName = 'SelectTrigger';\nexport const SelectScrollUpButton = React.forwardRef<React.ElementRef<typeof SelectPrimitive.ScrollUpButton>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>>(\n ({ className, ...props }, ref) => <SelectPrimitive.ScrollUpButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}><ChevronUp aria-hidden=\"true\" className=\"h-4 w-4\" /></SelectPrimitive.ScrollUpButton>,\n);\nSelectScrollUpButton.displayName = 'SelectScrollUpButton';\nexport const SelectScrollDownButton = React.forwardRef<React.ElementRef<typeof SelectPrimitive.ScrollDownButton>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>>(\n ({ className, ...props }, ref) => <SelectPrimitive.ScrollDownButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}><ChevronDown aria-hidden=\"true\" className=\"h-4 w-4\" /></SelectPrimitive.ScrollDownButton>,\n);\nSelectScrollDownButton.displayName = 'SelectScrollDownButton';\nexport interface SelectContentProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> {\n viewportClassName?: string;\n disableTriggerViewportSizing?: boolean;\n}\nexport const SelectContent = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Content>, SelectContentProps>(\n ({ className, children, position = 'popper', viewportClassName, disableTriggerViewportSizing = false, ...props }, ref) => (\n <SelectPrimitive.Portal><SelectPrimitive.Content ref={ref} position={position} className={cn(menuContentClassName, 'relative max-h-[var(--radix-select-content-available-height)] overflow-y-auto overflow-x-hidden', position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className)} {...props}>\n <SelectScrollUpButton /><SelectPrimitive.Viewport className={cn('p-1', position === 'popper' && 'w-full min-w-[var(--radix-select-trigger-width)]', position === 'popper' && !disableTriggerViewportSizing && 'h-[var(--radix-select-trigger-height)]', viewportClassName)}>{children}</SelectPrimitive.Viewport><SelectScrollDownButton />\n </SelectPrimitive.Content></SelectPrimitive.Portal>\n ),\n);\nSelectContent.displayName = 'SelectContent';\nexport const SelectLabel = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Label>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>>(\n ({ className, ...props }, ref) => <SelectPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} />,\n);\nSelectLabel.displayName = 'SelectLabel';\nexport interface SelectItemProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> {\n indicatorClassName?: string;\n itemText?: React.ReactNode;\n hideIndicator?: boolean;\n}\nexport const SelectItem = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Item>, SelectItemProps>(\n ({ className, children, indicatorClassName, itemText, hideIndicator = false, ...props }, ref) => (\n <SelectPrimitive.Item ref={ref} className={cn(menuItemClassName, 'w-full', hideIndicator ? 'px-2' : 'pl-8 pr-2', className)} {...props}>\n {!hideIndicator ? <span className={cn('absolute left-2 flex h-3.5 w-3.5 items-center justify-center', indicatorClassName)}><SelectPrimitive.ItemIndicator><Check aria-hidden=\"true\" className=\"h-4 w-4\" /></SelectPrimitive.ItemIndicator></span> : null}\n {itemText ? <><SelectPrimitive.ItemText asChild><span className=\"sr-only\">{itemText}</span></SelectPrimitive.ItemText>{children}</> : <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>}\n </SelectPrimitive.Item>\n ),\n);\nSelectItem.displayName = 'SelectItem';\nexport const SelectSeparator = React.forwardRef<React.ElementRef<typeof SelectPrimitive.Separator>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>>(\n ({ className, ...props }, ref) => <SelectPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />,\n);\nSelectSeparator.displayName = 'SelectSeparator';\n","import type {\n AgentSessionPermissionProfile,\n AgentWorkbenchComposerModelOption,\n AgentWorkbenchComposerViewModel,\n} from '@inf-monkeys-tech/monkeys';\nimport {\n ArrowDown,\n ArrowUp,\n File,\n Image as ImageIcon,\n Mic,\n Paperclip,\n Pencil,\n Send,\n Square,\n Trash2,\n X,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport { Switch } from '../primitives';\n\nconst iconButtonClass = 'inline-flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40';\n\nexport type AgentWorkbenchComposerIntent =\n | { type: 'change-value'; value: string }\n | { type: 'submit' }\n | { type: 'stop' }\n | { type: 'request-attachments'; files: File[] }\n | { type: 'request-voice-input' }\n | { type: 'remove-attachment'; attachmentId: string }\n | { type: 'change-mode'; mode: 'chat' | 'work' }\n | { type: 'select-model'; modelId: string; mode: 'chat' | 'work' }\n | { type: 'change-reasoning'; value: 'low' | 'medium' | 'high' | 'xhigh' }\n | { type: 'change-permission'; value: AgentSessionPermissionProfile }\n | { type: 'toggle-web-search'; enabled: boolean }\n | { type: 'edit-queued-draft'; draftId: string; text: string }\n | { type: 'delete-queued-draft'; draftId: string }\n | { type: 'move-queued-draft'; draftId: string; direction: 'up' | 'down' };\n\nexport interface AgentWorkbenchComposerClassNames {\n root?: string;\n queue?: string;\n attachments?: string;\n textarea?: string;\n toolbar?: string;\n}\n\nexport interface AgentWorkbenchComposerProps {\n viewModel: AgentWorkbenchComposerViewModel;\n modeSelectionEnabled?: boolean;\n modeFilteringEnabled?: boolean;\n className?: string;\n classNames?: AgentWorkbenchComposerClassNames;\n onIntent?: (intent: AgentWorkbenchComposerIntent) => void;\n}\n\nfunction modelOptionValue(option: AgentWorkbenchComposerModelOption): string {\n return `${option.mode}:${option.id}`;\n}\n\nexport function AgentWorkbenchComposer({\n viewModel,\n modeSelectionEnabled = false,\n modeFilteringEnabled = false,\n className,\n classNames,\n onIntent,\n}: AgentWorkbenchComposerProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const fileInputRef = useRef<HTMLInputElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const [editingDraftId, setEditingDraftId] = useState<string>();\n const [editingText, setEditingText] = useState('');\n const [isNarrow, setIsNarrow] = useState(false);\n const narrowBreakpoint = modeSelectionEnabled ? 900 : 704;\n const isBusy = viewModel.status === 'loading' || viewModel.status === 'streaming' || viewModel.status === 'stopping';\n const isStopping = viewModel.status === 'stopping';\n const isUploading = viewModel.attachments.some((attachment) => attachment.status === 'uploading');\n const canSubmit = !isStopping && !isUploading && (viewModel.value.trim().length > 0 || viewModel.attachments.some((item) => item.status === 'ready'));\n const showSubmitButton = !isBusy || canSubmit;\n const filterModelsByMode = modeSelectionEnabled || modeFilteringEnabled;\n const visibleModelOptions = useMemo(\n () => filterModelsByMode ? viewModel.model.options.filter((option) => option.mode === viewModel.mode) : viewModel.model.options,\n [filterModelsByMode, viewModel.mode, viewModel.model.options],\n );\n const selectedModelValue = useMemo(() => {\n const selected = visibleModelOptions.find((option) => option.id === viewModel.model.selectedId && option.mode === viewModel.mode);\n return selected ? modelOptionValue(selected) : visibleModelOptions[0] ? modelOptionValue(visibleModelOptions[0]) : '';\n }, [viewModel.mode, viewModel.model.selectedId, visibleModelOptions]);\n\n useEffect(() => {\n const surface = surfaceRef.current;\n if (!surface) return undefined;\n\n const updateLayout = () => setIsNarrow(surface.getBoundingClientRect().width <= narrowBreakpoint);\n updateLayout();\n window.addEventListener('resize', updateLayout);\n if (typeof ResizeObserver === 'undefined') {\n const interval = window.setInterval(updateLayout, 250);\n return () => {\n window.clearInterval(interval);\n window.removeEventListener('resize', updateLayout);\n };\n }\n\n const observer = new ResizeObserver(updateLayout);\n observer.observe(surface);\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', updateLayout);\n };\n }, [narrowBreakpoint]);\n\n const submit = () => {\n if (canSubmit) onIntent?.({ type: 'submit' });\n };\n\n return (\n <form\n className={cn('agent-workbench-composer flex min-w-0 w-full flex-col gap-2', className, classNames?.root)}\n aria-label={messages.composer.message}\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n >\n {viewModel.capabilities.queue && viewModel.queuedDrafts.length > 0 ? (\n <section\n aria-label={messages.composer.queued}\n className={cn('min-w-0 max-w-full rounded-md border border-border bg-muted/40 p-2', classNames?.queue)}\n >\n <ol className=\"space-y-1.5\">\n {viewModel.queuedDrafts.map((draft, index) => (\n <li key={draft.id} className=\"flex min-h-9 min-w-0 max-w-full items-center gap-2 overflow-hidden rounded-md bg-background px-2 py-1.5 text-sm\">\n <span className=\"w-5 shrink-0 text-center text-xs text-muted-foreground\">{index + 1}</span>\n {editingDraftId === draft.id ? (\n <input\n autoFocus\n value={editingText}\n aria-label={messages.composer.editQueued}\n className=\"min-w-0 flex-1 rounded border border-input bg-background px-2 py-1 outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onChange={(event) => setEditingText(event.target.value)}\n onBlur={() => {\n if (editingText.trim()) onIntent?.({ type: 'edit-queued-draft', draftId: draft.id, text: editingText });\n setEditingDraftId(undefined);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') setEditingDraftId(undefined);\n if (event.key === 'Enter' && editingText.trim()) {\n event.preventDefault();\n onIntent?.({ type: 'edit-queued-draft', draftId: draft.id, text: editingText });\n setEditingDraftId(undefined);\n }\n }}\n />\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{draft.text || messages.composer.attachmentOnly}</span>\n )}\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.moveUp} disabled={index === 0} onClick={() => onIntent?.({ type: 'move-queued-draft', draftId: draft.id, direction: 'up' })}>\n <ArrowUp className=\"size-3.5\" />\n </button>\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.moveDown} disabled={index === viewModel.queuedDrafts.length - 1} onClick={() => onIntent?.({ type: 'move-queued-draft', draftId: draft.id, direction: 'down' })}>\n <ArrowDown className=\"size-3.5\" />\n </button>\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.editQueued} onClick={() => { setEditingDraftId(draft.id); setEditingText(draft.text); }}>\n <Pencil className=\"size-3.5\" />\n </button>\n <button type=\"button\" className={cn(iconButtonClass, 'text-destructive-text')} aria-label={messages.composer.deleteQueued} onClick={() => onIntent?.({ type: 'delete-queued-draft', draftId: draft.id })}>\n <Trash2 className=\"size-3.5\" />\n </button>\n </div>\n </li>\n ))}\n </ol>\n </section>\n ) : null}\n\n <div ref={surfaceRef} className=\"agent-workbench-composer__surface min-w-0 max-w-full rounded-lg border border-input bg-background p-3 shadow-sm focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/30\">\n {viewModel.attachments.length > 0 ? (\n <div className={cn('mb-2 flex max-w-full gap-2 overflow-x-auto', classNames?.attachments)}>\n {viewModel.attachments.map((attachment) => (\n <div key={attachment.id} className=\"relative flex size-16 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-muted\">\n {attachment.previewUrl && attachment.mediaType?.startsWith('image/') ? (\n <img src={attachment.previewUrl} alt=\"\" className=\"size-full object-cover\" />\n ) : attachment.mediaType?.startsWith('image/') ? (\n <ImageIcon className=\"size-5 text-muted-foreground\" />\n ) : (\n <File className=\"size-5 text-muted-foreground\" />\n )}\n {attachment.status === 'uploading' ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/80 text-[10px] font-medium\">{messages.composer.uploading}</span>\n ) : null}\n <button\n type=\"button\"\n className=\"absolute right-1 top-1 flex size-5 items-center justify-center rounded-full bg-background/90 text-foreground shadow\"\n aria-label={messages.composer.removeAttachment}\n onClick={() => onIntent?.({ type: 'remove-attachment', attachmentId: attachment.id })}\n >\n <X className=\"size-3\" />\n </button>\n <span className=\"absolute inset-x-0 bottom-0 truncate bg-background/85 px-1 py-0.5 text-[9px]\">{attachment.name}</span>\n </div>\n ))}\n </div>\n ) : null}\n\n <textarea\n value={viewModel.value}\n rows={2}\n aria-label={messages.composer.message}\n placeholder={viewModel.placeholder}\n className={cn('max-h-64 min-h-14 min-w-0 w-full resize-none border-0 bg-transparent text-sm leading-relaxed text-foreground outline-none placeholder:text-muted-foreground', classNames?.textarea)}\n onChange={(event) => onIntent?.({ type: 'change-value', value: event.target.value })}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault();\n submit();\n }\n }}\n />\n\n <div className={cn('agent-workbench-composer__toolbar mt-2 flex min-h-8 min-w-0 max-w-full items-center gap-2', isNarrow ? 'flex-wrap' : 'flex-nowrap', classNames?.toolbar)}>\n <div className={cn('agent-workbench-composer__controls flex min-w-0 max-w-full flex-1 items-center gap-1.5', isNarrow ? 'w-full flex-wrap' : 'flex-nowrap')}>\n {viewModel.capabilities.attachments ? (\n <>\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.attach} onClick={() => fileInputRef.current?.click()}>\n <Paperclip className=\"size-4\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n multiple\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n if (files.length > 0) onIntent?.({ type: 'request-attachments', files });\n event.target.value = '';\n }}\n />\n </>\n ) : null}\n {viewModel.capabilities.voiceInput ? (\n <button type=\"button\" className={iconButtonClass} aria-label={messages.composer.voice} onClick={() => onIntent?.({ type: 'request-voice-input' })}>\n <Mic className=\"size-4\" />\n </button>\n ) : null}\n {viewModel.capabilities.webSearch ? (\n <label className=\"flex shrink-0 items-center gap-1.5 whitespace-nowrap px-1 text-xs font-medium text-foreground\">\n {messages.composer.webSearch}\n <Switch checked={viewModel.webSearchEnabled} onCheckedChange={(enabled) => onIntent?.({ type: 'toggle-web-search', enabled })} />\n </label>\n ) : null}\n {modeSelectionEnabled ? (\n <div\n className=\"flex h-8 shrink-0 items-center rounded-md border border-border bg-muted p-0.5\"\n role=\"group\"\n aria-label={messages.composer.chatMode}\n >\n {(['chat', 'work'] as const).map((mode) => (\n <button\n key={mode}\n type=\"button\"\n aria-pressed={viewModel.mode === mode}\n className={cn(\n 'h-7 rounded px-2.5 text-xs font-medium transition-colors',\n viewModel.mode === mode ? 'bg-background text-foreground shadow-sm' : 'text-foreground/75 hover:text-foreground',\n )}\n onClick={() => onIntent?.({ type: 'change-mode', mode })}\n >\n {messages.modes[mode]}\n </button>\n ))}\n </div>\n ) : null}\n {viewModel.capabilities.modelSelection ? (\n <label className=\"sr-only\" htmlFor=\"agent-workbench-model\">{messages.composer.model}</label>\n ) : null}\n {viewModel.capabilities.modelSelection ? (\n <select\n id=\"agent-workbench-model\"\n value={selectedModelValue}\n aria-label={messages.composer.model}\n className=\"h-8 w-48 min-w-36 shrink rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground\"\n onChange={(event) => {\n const option = visibleModelOptions.find((item) => modelOptionValue(item) === event.target.value);\n if (option) onIntent?.({ type: 'select-model', modelId: option.id, mode: option.mode });\n }}\n >\n {visibleModelOptions.length === 0 ? <option value=\"\">{messages.composer.noModels}</option> : null}\n {visibleModelOptions.map((option) => (\n <option key={modelOptionValue(option)} value={modelOptionValue(option)} disabled={option.disabled}>\n {option.label} · {messages.modes[option.mode]}\n </option>\n ))}\n </select>\n ) : null}\n {viewModel.capabilities.reasoning && viewModel.reasoning ? (\n <select\n value={viewModel.reasoning.value}\n aria-label={messages.composer.reasoning}\n className=\"h-8 w-32 min-w-24 shrink rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground\"\n onChange={(event) => onIntent?.({ type: 'change-reasoning', value: event.target.value as 'low' | 'medium' | 'high' | 'xhigh' })}\n >\n {viewModel.reasoning.options.map((value) => <option key={value} value={value}>{messages.composer.reasoningOptions[value]}</option>)}\n </select>\n ) : null}\n {viewModel.capabilities.permissions && viewModel.permissionProfile ? (\n <select\n value={viewModel.permissionProfile}\n aria-label={messages.composer.permissions}\n className=\"h-8 w-40 min-w-32 shrink rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground\"\n onChange={(event) => onIntent?.({ type: 'change-permission', value: event.target.value as AgentSessionPermissionProfile })}\n >\n {(['approval-required', 'auto-approve', 'full-access'] as const).map((value) => <option key={value} value={value}>{messages.composer.permissionOptions[value]}</option>)}\n </select>\n ) : null}\n </div>\n\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {showSubmitButton ? (\n <button\n type=\"submit\"\n className={cn(\n iconButtonClass,\n 'bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground disabled:bg-primary/40 disabled:!opacity-100',\n )}\n aria-label={isBusy && viewModel.capabilities.queue ? messages.composer.queue : messages.composer.send}\n disabled={!canSubmit}\n >\n <Send className=\"size-4 !text-white [&_path]:!stroke-white\" />\n </button>\n ) : null}\n {isBusy && !canSubmit && viewModel.capabilities.stop ? (\n <button\n type=\"button\"\n className={cn(iconButtonClass, 'border border-border')}\n aria-label={isStopping ? messages.run.stopping : messages.composer.stop}\n disabled={isStopping}\n onClick={() => onIntent?.({ type: 'stop' })}\n >\n <Square className=\"size-3 fill-current\" />\n </button>\n ) : null}\n </div>\n </div>\n </div>\n {viewModel.status === 'error' && viewModel.error ? <p role=\"alert\" className=\"text-sm text-destructive-text\">{viewModel.error}</p> : null}\n </form>\n );\n}\n","import { ArrowLeft, ArrowUpRight, Code2, FileText, Palette, Search, ShoppingBag, Sparkles, Upload, type LucideIcon } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\n\nexport type AgentWorkbenchQuickStartIcon = 'sparkles' | 'palette' | 'search' | 'file-text' | 'code' | 'shopping-bag';\n\nexport interface AgentWorkbenchQuickStartTemplate {\n id: string;\n title: string;\n description?: string;\n prompt: string;\n action?: 'prompt' | 'upload';\n icon?: AgentWorkbenchQuickStartIcon;\n coverImageUrl?: string;\n accept?: string;\n multiple?: boolean;\n modes?: Array<'chat' | 'work'>;\n}\n\nexport interface AgentWorkbenchQuickStartSection {\n id: string;\n label: string;\n templates: AgentWorkbenchQuickStartTemplate[];\n}\n\nexport interface AgentWorkbenchQuickStartCategory {\n id: string;\n label: string;\n icon?: AgentWorkbenchQuickStartIcon;\n sections: AgentWorkbenchQuickStartSection[];\n}\n\nexport interface AgentWorkbenchQuickStartViewModel {\n contract: 'AgentWorkbenchQuickStartViewModel';\n mode: 'chat' | 'work';\n categories: AgentWorkbenchQuickStartCategory[];\n disabled?: boolean;\n}\n\nexport type AgentWorkbenchQuickStartIntent =\n | { type: 'change-category'; categoryId?: string }\n | { type: 'change-section'; categoryId: string; sectionId: string }\n | {\n type: 'select-template';\n templateId: string;\n prompt: string;\n files?: File[];\n };\n\nexport interface AgentWorkbenchQuickStartProps {\n viewModel: AgentWorkbenchQuickStartViewModel;\n className?: string;\n onIntent?: (intent: AgentWorkbenchQuickStartIntent) => void;\n}\n\nconst ICONS: Record<AgentWorkbenchQuickStartIcon, LucideIcon> = {\n sparkles: Sparkles,\n palette: Palette,\n search: Search,\n 'file-text': FileText,\n code: Code2,\n 'shopping-bag': ShoppingBag,\n};\n\nfunction TemplateVisual({ template }: { template: AgentWorkbenchQuickStartTemplate }) {\n const Icon = ICONS[template.icon || 'sparkles'];\n\n if (template.coverImageUrl) {\n return <img src={template.coverImageUrl} alt=\"\" className=\"size-full bg-muted object-contain\" />;\n }\n\n return (\n <span className=\"flex size-full items-center justify-center bg-gradient-to-br from-primary/5 via-muted/50 to-primary/15\">\n <span className=\"flex size-14 items-center justify-center rounded-2xl border border-primary/10 bg-background/85 text-primary shadow-sm\">\n <Icon className=\"size-7\" aria-hidden=\"true\" />\n </span>\n </span>\n );\n}\n\nexport function AgentWorkbenchQuickStart({ viewModel, className, onIntent }: AgentWorkbenchQuickStartProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.quickStart;\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [activeCategoryId, setActiveCategoryId] = useState<string>();\n const [activeSectionId, setActiveSectionId] = useState<string>();\n const [pendingTemplate, setPendingTemplate] = useState<AgentWorkbenchQuickStartTemplate>();\n const categories = useMemo(\n () =>\n viewModel.categories\n .map((category) => ({\n ...category,\n sections: category.sections\n .map((section) => ({\n ...section,\n templates: section.templates.filter((template) => !template.modes || template.modes.includes(viewModel.mode)),\n }))\n .filter((section) => section.templates.length > 0),\n }))\n .filter((category) => category.sections.length > 0),\n [viewModel.categories, viewModel.mode],\n );\n const activeCategory = categories.find((category) => category.id === activeCategoryId);\n const activeSection = activeCategory?.sections.find((section) => section.id === activeSectionId) || activeCategory?.sections[0];\n const usesCompactList = activeSection?.templates.length\n ? activeSection.templates.every((template) => !template.coverImageUrl)\n : false;\n\n useEffect(() => {\n if (activeCategoryId && !categories.some((category) => category.id === activeCategoryId)) {\n setActiveCategoryId(undefined);\n setActiveSectionId(undefined);\n }\n }, [activeCategoryId, categories]);\n\n if (categories.length === 0) return null;\n\n const selectCategory = (category: AgentWorkbenchQuickStartCategory) => {\n setActiveCategoryId(category.id);\n setActiveSectionId(category.sections[0]?.id);\n onIntent?.({ type: 'change-category', categoryId: category.id });\n };\n\n const selectSection = (sectionId: string) => {\n if (!activeCategory) return;\n setActiveSectionId(sectionId);\n onIntent?.({\n type: 'change-section',\n categoryId: activeCategory.id,\n sectionId,\n });\n };\n\n const selectTemplate = (template: AgentWorkbenchQuickStartTemplate) => {\n if (viewModel.disabled) return;\n if (template.action !== 'upload') {\n onIntent?.({\n type: 'select-template',\n templateId: template.id,\n prompt: template.prompt,\n });\n return;\n }\n\n const input = fileInputRef.current;\n if (!input) return;\n input.accept = template.accept || '*/*';\n input.multiple = template.multiple === true;\n setPendingTemplate(template);\n input.click();\n };\n\n return (\n <section className={cn('agent-workbench-quick-start min-w-0 max-w-full', className)} aria-label={messages.label}>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(event) => {\n const files = Array.from(event.target.files || []);\n if (pendingTemplate && files.length > 0) {\n onIntent?.({\n type: 'select-template',\n templateId: pendingTemplate.id,\n prompt: pendingTemplate.prompt,\n files: pendingTemplate.multiple ? files : files.slice(0, 1),\n });\n }\n setPendingTemplate(undefined);\n event.target.value = '';\n }}\n />\n\n {!activeCategory ? (\n <div className=\"flex max-w-full items-center justify-center gap-2 overflow-x-auto px-1 pb-1\">\n {categories.map((category) => {\n const Icon = ICONS[category.icon || 'sparkles'];\n return (\n <button key={category.id} type=\"button\" className=\"inline-flex h-10 shrink-0 items-center gap-2 rounded-full border border-border bg-background px-4 text-sm font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\" onClick={() => selectCategory(category)}>\n <Icon className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n {category.label}\n </button>\n );\n })}\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"flex min-w-0 max-w-full items-center gap-1 overflow-x-auto pb-1\">\n <button\n type=\"button\"\n className=\"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full px-3 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => {\n setActiveCategoryId(undefined);\n setActiveSectionId(undefined);\n onIntent?.({ type: 'change-category' });\n }}\n >\n <ArrowLeft className=\"size-4\" aria-hidden=\"true\" />\n {messages.back}\n </button>\n {activeCategory.sections.map((section) => (\n <button key={section.id} type=\"button\" aria-pressed={activeSection?.id === section.id} className={cn('h-9 shrink-0 rounded-full px-4 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', activeSection?.id === section.id ? 'bg-muted text-foreground' : 'text-muted-foreground hover:bg-muted/70 hover:text-foreground')} onClick={() => selectSection(section.id)}>\n {section.label}\n </button>\n ))}\n </div>\n\n <div\n data-quick-start-layout={usesCompactList ? 'list' : 'cards'}\n className={cn(\n 'grid',\n usesCompactList ? 'grid-cols-1 gap-0' : 'grid-cols-[repeat(auto-fit,minmax(min(100%,14rem),1fr))] gap-3',\n )}\n >\n {activeSection?.templates.map((template) => (\n <button\n key={template.id}\n type=\"button\"\n disabled={viewModel.disabled}\n data-quick-start-template-id={template.id}\n className={cn(\n 'group min-w-0 overflow-hidden text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n usesCompactList\n ? 'flex min-h-14 items-center rounded-none border-x-0 border-t-0 bg-transparent shadow-none hover:border-border hover:bg-muted/40 last:border-b-0'\n : 'rounded-xl border border-border bg-background hover:border-primary/30 hover:bg-muted/20',\n )}\n onClick={() => selectTemplate(template)}\n >\n <span className={cn(usesCompactList ? 'min-w-0 flex-1 px-2 py-2.5' : 'block px-4 pb-3 pt-4')}>\n <span className={cn('flex items-center gap-2 text-sm text-foreground', usesCompactList ? 'font-medium' : 'font-semibold')}>\n {template.title}\n {template.action === 'upload' ? (\n <span className=\"ml-auto inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground\">\n <Upload className=\"size-3\" aria-hidden=\"true\" />\n {messages.addFile}\n </span>\n ) : null}\n </span>\n {template.description ? (\n <span\n className={cn(\n 'line-clamp-2 block text-xs leading-4 text-muted-foreground',\n usesCompactList ? 'mt-0.5 min-h-0 text-muted-foreground/75' : 'mt-1 min-h-8',\n )}\n >\n {template.description}\n </span>\n ) : null}\n </span>\n {usesCompactList ? (\n <ArrowUpRight className=\"mr-2 size-4 shrink-0 text-muted-foreground/45\" aria-hidden=\"true\" />\n ) : (\n <span className={cn('block overflow-hidden', template.coverImageUrl ? 'aspect-[5/2]' : 'h-28')}>\n <TemplateVisual template={template} />\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </section>\n );\n}\n","import type {\n AgentWorkbenchAgentItem,\n AgentWorkbenchNavigationViewModel,\n AgentWorkbenchSessionItem,\n} from '@inf-monkeys-tech/monkeys';\nimport {\n AlertCircle,\n Blocks,\n Bot,\n CheckCircle2,\n Ellipsis,\n Image as ImageIcon,\n Loader2,\n MessageSquare,\n Pencil,\n Pin,\n Plus,\n RefreshCw,\n Search,\n Settings,\n SquarePen,\n Trash2,\n X,\n} from 'lucide-react';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useMonkeysLocale, useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../primitives';\n\nexport type AgentWorkbenchSidebarIntent =\n | { type: 'change-tab'; tab: 'agents' | 'sessions' }\n | { type: 'change-search'; query: string }\n | { type: 'create-agent' }\n | { type: 'create-session' }\n | { type: 'select-agent'; itemId: string }\n | { type: 'select-session'; sessionId: string }\n | { type: 'toggle-agent-pin'; itemId: string; pinned: boolean }\n | { type: 'toggle-session-pin'; sessionId: string; pinned: boolean }\n | { type: 'rename-session'; sessionId: string; title: string }\n | { type: 'delete-session'; sessionId: string }\n | { type: 'retry-agents' }\n | { type: 'retry-sessions' }\n | { type: 'open-capabilities' }\n | { type: 'open-agent-settings' };\n\nexport interface AgentWorkbenchSidebarClassNames {\n root?: string;\n search?: string;\n tabs?: string;\n body?: string;\n item?: string;\n footer?: string;\n}\n\nexport interface AgentWorkbenchSidebarProps {\n viewModel: AgentWorkbenchNavigationViewModel;\n navigationMode?: 'agents-and-sessions' | 'sessions-only';\n headerActions?: ReactNode;\n className?: string;\n classNames?: AgentWorkbenchSidebarClassNames;\n onIntent?: (intent: AgentWorkbenchSidebarIntent) => void;\n}\n\nfunction ItemAvatar({ item }: { item: AgentWorkbenchAgentItem }) {\n const [failed, setFailed] = useState(false);\n if (item.iconUrl && !failed) {\n return <img src={item.iconUrl} alt=\"\" className=\"size-full object-cover\" onError={() => setFailed(true)} />;\n }\n const initial = item.name.trim().charAt(0).toLocaleUpperCase();\n return initial ? <span className=\"text-sm font-semibold\">{initial}</span> : <Bot className=\"size-4\" />;\n}\n\nfunction SessionAvatar({ item }: { item: AgentWorkbenchSessionItem }) {\n const [failed, setFailed] = useState(false);\n if (item.thumbnailUrl && !failed) {\n return (\n <img\n src={item.thumbnailUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n loading=\"lazy\"\n onError={() => setFailed(true)}\n />\n );\n }\n return <ImageIcon className=\"size-5\" aria-hidden=\"true\" />;\n}\n\nfunction SessionMeta({ item, locale }: { item: AgentWorkbenchSessionItem; locale: string }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n return (\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-xs text-foreground/80\">{new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(item.updatedAt))}</span>\n {item.mode ? (\n <span className={cn('shrink-0 rounded-full px-1.5 py-0.5 text-[10px] font-medium leading-none', item.mode === 'work' ? 'bg-primary/10 text-primary' : 'bg-muted text-foreground')}>\n {item.mode === 'work' ? messages.work : messages.chat}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction CollectionState({\n status,\n empty,\n noResults,\n hasItems,\n query,\n error,\n onRetry,\n}: {\n status: 'loading' | 'ready' | 'error';\n empty: string;\n noResults: string;\n hasItems: boolean;\n query: string;\n error?: string;\n onRetry: () => void;\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n if (status === 'loading' && !hasItems) {\n return <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{messages.loading}</div>;\n }\n if (status === 'error') {\n return (\n <div className=\"flex flex-col items-center gap-3 px-3 py-8 text-center\">\n <p className=\"text-sm text-muted-foreground\" role=\"alert\">{error}</p>\n <button type=\"button\" className=\"inline-flex items-center gap-1.5 text-sm font-medium text-primary\" onClick={onRetry}>\n <RefreshCw className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.retry}\n </button>\n </div>\n );\n }\n if (!hasItems) {\n return <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{query ? noResults : empty}</div>;\n }\n return null;\n}\n\nfunction StatusIndicator({ status }: { status: AgentWorkbenchSessionItem['status'] }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n if (status === 'running') {\n return <Loader2 className=\"size-4 animate-spin text-primary\" aria-label={messages.running} />;\n }\n if (status === 'completed') {\n return <CheckCircle2 className=\"size-4 text-primary\" aria-label={messages.completed} />;\n }\n if (status === 'error') {\n return <AlertCircle className=\"size-4 text-destructive-text\" aria-label={messages.failed} />;\n }\n return null;\n}\n\nfunction SessionActions({\n item,\n capabilities,\n onIntent,\n}: {\n item: AgentWorkbenchSessionItem;\n capabilities: AgentWorkbenchNavigationViewModel['capabilities'];\n onIntent?: AgentWorkbenchSidebarProps['onIntent'];\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n if (!capabilities.renameSessions && !capabilities.deleteSessions) return null;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" className=\"flex size-8 items-center justify-center rounded-md hover:bg-muted\" aria-label={messages.actions}>\n <Ellipsis className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {capabilities.renameSessions ? (\n <DropdownMenuItem onSelect={() => onIntent?.({ type: 'rename-session', sessionId: item.id, title: item.title })}>\n <Pencil className=\"mr-2 size-4\" aria-hidden=\"true\" />{messages.rename}\n </DropdownMenuItem>\n ) : null}\n {capabilities.deleteSessions ? (\n <DropdownMenuItem className=\"text-destructive-text\" onSelect={() => onIntent?.({ type: 'delete-session', sessionId: item.id })}>\n <Trash2 className=\"mr-2 size-4\" aria-hidden=\"true\" />{messages.delete}\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nexport function AgentWorkbenchSidebar({\n viewModel,\n navigationMode = 'agents-and-sessions',\n headerActions,\n className,\n classNames,\n onIntent,\n}: AgentWorkbenchSidebarProps) {\n const { locale } = useMonkeysLocale();\n const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;\n const sessionsOnly = navigationMode === 'sessions-only';\n const searchRef = useRef<HTMLInputElement>(null);\n const renameInputRef = useRef<HTMLInputElement>(null);\n const [editingSessionId, setEditingSessionId] = useState<string>();\n const [editingTitle, setEditingTitle] = useState('');\n const query = viewModel.searchQuery.trim().toLocaleLowerCase();\n const agents = useMemo(\n () => viewModel.agents.items.filter((item) => !query || `${item.name} ${item.description ?? ''}`.toLocaleLowerCase().includes(query)),\n [query, viewModel.agents.items],\n );\n const sessions = useMemo(\n () => viewModel.sessions.items.filter((item) => !query || item.title.toLocaleLowerCase().includes(query)),\n [query, viewModel.sessions.items],\n );\n const chatbotSessions = useMemo(() => sessions.filter((item) => item.mode !== 'work'), [sessions]);\n const agentSessions = useMemo(() => sessions.filter((item) => item.mode === 'work'), [sessions]);\n\n useEffect(() => {\n const handleShortcut = (event: KeyboardEvent) => {\n if (!(event.ctrlKey || event.metaKey) || event.key.toLocaleLowerCase() !== 'k') return;\n event.preventDefault();\n searchRef.current?.focus();\n searchRef.current?.select();\n };\n window.addEventListener('keydown', handleShortcut);\n return () => window.removeEventListener('keydown', handleShortcut);\n }, []);\n\n useEffect(() => {\n if (!editingSessionId) return;\n renameInputRef.current?.focus();\n renameInputRef.current?.select();\n }, [editingSessionId]);\n\n const beginRenameSession = (item: AgentWorkbenchSessionItem) => {\n setEditingSessionId(item.id);\n setEditingTitle(item.title);\n };\n\n const cancelRenameSession = () => {\n setEditingSessionId(undefined);\n setEditingTitle('');\n };\n\n const saveRenameSession = (item: AgentWorkbenchSessionItem) => {\n const title = editingTitle.trim();\n if (title && title !== item.title) {\n onIntent?.({ type: 'rename-session', sessionId: item.id, title });\n }\n cancelRenameSession();\n };\n\n const renderSessionItems = (items: AgentWorkbenchSessionItem[]) => (\n <div className=\"space-y-1\">\n {items.map((item) => {\n const percent = item.contextUsage && item.contextUsage.maxTokens > 0\n ? Math.min(100, Math.round(item.contextUsage.usedTokens / item.contextUsage.maxTokens * 100))\n : undefined;\n return (\n <div key={item.id} aria-current={item.id === viewModel.selectedSessionItem ? 'page' : undefined} className={cn('group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-2 text-left hover:bg-muted aria-[current=page]:border-primary aria-[current=page]:bg-muted', classNames?.item)}>\n {editingSessionId === item.id ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted\"><SessionAvatar item={item} /></span>\n <span className=\"min-w-0 flex-1\">\n <input\n ref={renameInputRef}\n value={editingTitle}\n aria-label={messages.rename}\n className=\"h-6 w-full rounded border border-primary bg-background px-1.5 text-sm font-medium outline-none\"\n onChange={(event) => setEditingTitle(event.target.value)}\n onClick={(event) => event.stopPropagation()}\n onBlur={() => saveRenameSession(item)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n saveRenameSession(item);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n cancelRenameSession();\n }\n }}\n />\n <SessionMeta item={item} locale={locale} />\n </span>\n </div>\n ) : (\n <button type=\"button\" className=\"flex min-w-0 flex-1 items-center gap-3 text-left\" onClick={() => onIntent?.({ type: 'select-session', sessionId: item.id })}>\n <span className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted\"><SessionAvatar item={item} /></span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{item.title}</span>\n <SessionMeta item={item} locale={locale} />\n </span>\n </button>\n )}\n <span className=\"flex items-center gap-1\">\n {percent !== undefined && item.status === 'idle' ? <span className=\"text-xs text-foreground\" aria-label={messages.contextUsage({ percent })}>{percent}%</span> : <StatusIndicator status={item.status} />}\n {viewModel.capabilities.pinSessions ? <button type=\"button\" aria-label={item.pinned ? messages.unpin : messages.pin} className={cn('flex size-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-muted group-hover:opacity-100', item.pinned && 'text-primary opacity-100')} onClick={(event) => { event.stopPropagation(); onIntent?.({ type: 'toggle-session-pin', sessionId: item.id, pinned: !item.pinned }); }}><Pin className={cn('size-4', item.pinned && 'fill-current')} /></button> : null}\n <span onClick={(event) => event.stopPropagation()} onKeyDown={(event) => event.stopPropagation()}><SessionActions item={item} capabilities={viewModel.capabilities} onIntent={(intent) => intent.type === 'rename-session' ? beginRenameSession(item) : onIntent?.(intent)} /></span>\n </span>\n </div>\n );\n })}\n </div>\n );\n\n return (\n <nav aria-label={messages.tabsLabel} className={cn('h-full min-h-0', classNames?.root, className)}>\n <Tabs\n value={sessionsOnly ? 'sessions' : viewModel.activeTab}\n onValueChange={(value) => {\n if (!sessionsOnly && (value === 'agents' || value === 'sessions')) onIntent?.({ type: 'change-tab', tab: value });\n }}\n className=\"flex h-full min-h-0 flex-col bg-background text-foreground\"\n >\n <div className=\"shrink-0 space-y-3 p-4 pb-2\">\n <div className={cn('flex h-10 items-center gap-2 rounded-lg border border-border bg-card px-3 focus-within:ring-2 focus-within:ring-ring', classNames?.search)}>\n <Search className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={viewModel.searchQuery}\n aria-label={sessionsOnly ? messages.searchSessions : messages.search}\n placeholder={sessionsOnly ? messages.searchSessions : messages.search}\n className=\"min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:hidden\"\n onChange={(event) => onIntent?.({ type: 'change-search', query: event.target.value })}\n onKeyDown={(event) => {\n if (event.key !== 'Escape') return;\n onIntent?.({ type: 'change-search', query: '' });\n event.currentTarget.blur();\n }}\n />\n {viewModel.searchQuery ? (\n <button type=\"button\" className=\"flex size-6 items-center justify-center rounded-md hover:bg-muted\" aria-label={messages.clearSearch} onClick={() => onIntent?.({ type: 'change-search', query: '' })}>\n <X className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n ) : (\n <kbd className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">Ctrl K</kbd>\n )}\n </div>\n {!sessionsOnly || headerActions ? <div className=\"flex items-center gap-2\">\n {!sessionsOnly ? <TabsList className={cn('grid min-w-0 flex-1 grid-cols-2 text-foreground', classNames?.tabs)} aria-label={messages.tabsLabel}>\n <TabsTrigger value=\"agents\">{messages.agents}</TabsTrigger>\n <TabsTrigger value=\"sessions\">{messages.sessions}</TabsTrigger>\n </TabsList> : null}\n {headerActions ? <div className=\"flex shrink-0 items-center\">{headerActions}</div> : null}\n </div> : null}\n </div>\n\n {!sessionsOnly ? <TabsContent value=\"agents\" className={cn('mt-0 min-h-0 flex-1 overflow-y-auto px-4 pb-4', classNames?.body)}>\n {viewModel.capabilities.createAgent ? (\n <button type=\"button\" className=\"mb-3 flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'create-agent' })}>\n <Plus className=\"size-4\" aria-hidden=\"true\" />{messages.newAgent}\n </button>\n ) : null}\n <h3 className=\"mb-2 px-3 text-xs font-medium text-muted-foreground\">{messages.allAgents}</h3>\n <CollectionState status={viewModel.agents.status} empty={messages.emptyAgents} noResults={messages.noResults} hasItems={agents.length > 0} query={query} error={viewModel.agents.error} onRetry={() => onIntent?.({ type: 'retry-agents' })} />\n <div className=\"space-y-1\">\n {agents.map((item) => (\n <div\n key={item.id}\n aria-current={item.id === viewModel.selectedAgentItem ? 'page' : undefined}\n className={cn('group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-2 text-left hover:bg-muted aria-[current=page]:border-primary aria-[current=page]:bg-muted', classNames?.item)}\n >\n <button type=\"button\" className=\"flex min-w-0 flex-1 items-center gap-3 text-left\" onClick={() => onIntent?.({ type: 'select-agent', itemId: item.id })}>\n <span className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted\"><ItemAvatar item={item} /></span>\n <span className=\"min-w-0 flex-1\"><span className=\"block truncate text-sm font-medium\">{item.name}</span><span className=\"block truncate text-xs text-foreground/80\">{item.description || messages.noDescription}</span></span>\n </button>\n {item.builtIn ? <span className=\"rounded-full bg-muted px-1.5 py-1 text-[10px] text-foreground\">{messages.builtIn}</span> : null}\n {viewModel.capabilities.pinAgents ? (\n <button\n type=\"button\"\n aria-label={item.pinned ? messages.unpin : messages.pin}\n className={cn('flex size-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-muted group-hover:opacity-100', item.pinned && 'text-primary opacity-100')}\n onClick={(event) => { event.stopPropagation(); onIntent?.({ type: 'toggle-agent-pin', itemId: item.id, pinned: !item.pinned }); }}\n onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); onIntent?.({ type: 'toggle-agent-pin', itemId: item.id, pinned: !item.pinned }); } }}\n ><Pin className={cn('size-4', item.pinned && 'fill-current', item.pinPending && 'animate-pulse')} /></button>\n ) : null}\n </div>\n ))}\n </div>\n </TabsContent> : null}\n\n <TabsContent value=\"sessions\" className={cn('mt-0 min-h-0 flex-1 overflow-y-auto px-4 pb-4', classNames?.body)}>\n {viewModel.capabilities.createSession ? (\n <button type=\"button\" className=\"flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'create-session' })}>\n <SquarePen className=\"size-4\" aria-hidden=\"true\" />{messages.newSession}\n </button>\n ) : null}\n {!sessionsOnly && viewModel.capabilities.manageCapabilities ? (\n <button type=\"button\" className=\"mb-3 flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'open-capabilities' })}>\n <Blocks className=\"size-4\" aria-hidden=\"true\" />{messages.capabilities}\n </button>\n ) : null}\n {!sessionsOnly ? <h3 className=\"mb-2 px-3 text-xs font-medium text-muted-foreground\">{messages.recentSessions}</h3> : null}\n <CollectionState status={viewModel.sessions.status} empty={messages.emptySessions} noResults={messages.noResults} hasItems={sessions.length > 0} query={query} error={viewModel.sessions.error} onRetry={() => onIntent?.({ type: 'retry-sessions' })} />\n {sessionsOnly && sessions.length > 0 ? (\n <div className=\"space-y-2\">\n {[\n { id: 'chatbot', label: messages.chats, icon: MessageSquare, items: chatbotSessions },\n { id: 'agent', label: messages.agents, icon: Bot, items: agentSessions },\n ].map(({ id, label, icon: Icon, items }) => (\n <details key={id} open aria-label={label}>\n <summary className=\"flex h-9 cursor-pointer list-none items-center gap-2 rounded-md px-3 text-sm font-semibold hover:bg-muted\">\n <Icon className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n {label}\n </summary>\n {renderSessionItems(items)}\n </details>\n ))}\n </div>\n ) : !sessionsOnly ? renderSessionItems(sessions) : null}\n </TabsContent>\n\n {!sessionsOnly && viewModel.capabilities.manageAgentSettings ? (\n <div className={cn('shrink-0 border-t border-border p-4', classNames?.footer)}>\n <button type=\"button\" className=\"flex h-10 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted\" onClick={() => onIntent?.({ type: 'open-agent-settings' })}>\n <Settings className=\"size-4\" aria-hidden=\"true\" />{messages.settings}\n </button>\n </div>\n ) : null}\n </Tabs>\n </nav>\n );\n}\n","import type {\n AgentSessionCapabilities,\n AgentSessionEvent,\n AgentSessionViewModel,\n} from '@inf-monkeys-tech/monkeys';\n\ntype SessionEventType = AgentSessionEvent['eventType'];\nexport type AgentWorkbenchEventOf<Type extends SessionEventType> = Extract<\n AgentSessionEvent,\n { eventType: Type }\n>;\n\nconst EVENT_CAPABILITIES = {\n reasoning: 'reasoning',\n plan: 'plan',\n task: 'tasks',\n tool: 'tools',\n approval: 'approval',\n artifact: 'artifacts',\n usage: 'usage',\n} as const satisfies Partial<\n Record<SessionEventType, keyof AgentSessionCapabilities>\n>;\n\nexport interface AgentWorkbenchActivityModel {\n mode: AgentSessionViewModel['snapshot']['mode'];\n status: AgentSessionViewModel['status'];\n reasoning: AgentWorkbenchEventOf<'reasoning'>[];\n plans: AgentWorkbenchEventOf<'plan'>[];\n tasks: AgentWorkbenchEventOf<'task'>[];\n tools: AgentWorkbenchEventOf<'tool'>[];\n approvals: AgentWorkbenchEventOf<'approval'>[];\n artifacts: AgentWorkbenchEventOf<'artifact'>[];\n usage?: AgentWorkbenchEventOf<'usage'>;\n run?: AgentWorkbenchEventOf<'status'> & { resolvedDurationMs?: number };\n}\n\nfunction projectRun(events: AgentSessionEvent[]): AgentWorkbenchActivityModel['run'] {\n const statuses = events.filter(\n (event): event is AgentWorkbenchEventOf<'status'> => event.eventType === 'status',\n );\n const run = statuses.at(-1);\n if (!run) return undefined;\n if (run.payload.status !== 'stopped' || run.payload.durationMs !== undefined) return run;\n\n const runStatuses = run.runId\n ? statuses.filter((event) => event.runId === run.runId && event.sequence <= run.sequence)\n : statuses.filter((event) => event.sequence <= run.sequence);\n let previousStoppedIndex = -1;\n for (let index = runStatuses.length - 1; index >= 0; index -= 1) {\n const event = runStatuses[index];\n if (event.sequence < run.sequence && event.payload.status === 'stopped') {\n previousStoppedIndex = index;\n break;\n }\n }\n const started = runStatuses\n .slice(previousStoppedIndex + 1)\n .reverse()\n .find((event) => event.payload.status === 'running' || event.payload.status === 'queued');\n const startedAt = started?.payload.startedAt ?? started?.occurredAt;\n const stoppedAt = run.payload.stoppedAt ?? run.occurredAt;\n if (!startedAt || !stoppedAt) return run;\n const durationMs = Date.parse(stoppedAt) - Date.parse(startedAt);\n return Number.isFinite(durationMs) && durationMs >= 0\n ? { ...run, resolvedDurationMs: durationMs }\n : run;\n}\n\nfunction isVisible(\n event: AgentSessionEvent,\n capabilities: AgentSessionCapabilities,\n): boolean {\n const capability = EVENT_CAPABILITIES[\n event.eventType as keyof typeof EVENT_CAPABILITIES\n ];\n return capability ? capabilities[capability] === true : true;\n}\n\nfunction latestBy<Type extends SessionEventType>(\n events: AgentSessionEvent[],\n eventType: Type,\n key: (event: AgentWorkbenchEventOf<Type>) => string,\n): AgentWorkbenchEventOf<Type>[] {\n const latest = new Map<string, AgentWorkbenchEventOf<Type>>();\n for (const event of events) {\n if (event.eventType !== eventType) continue;\n const typedEvent = event as AgentWorkbenchEventOf<Type>;\n latest.set(key(typedEvent), typedEvent);\n }\n return [...latest.values()].sort(\n (left, right) => left.sequence - right.sequence,\n );\n}\n\nexport function createAgentWorkbenchActivityModel(\n viewModel: AgentSessionViewModel,\n): AgentWorkbenchActivityModel {\n const visibleEvents = viewModel.events.filter((event) =>\n isVisible(event, viewModel.snapshot.capabilities),\n );\n\n return {\n mode: viewModel.snapshot.mode,\n status: viewModel.status,\n reasoning: latestBy(\n visibleEvents,\n 'reasoning',\n (event) => event.payload.reasoningId,\n ),\n plans: latestBy(\n visibleEvents,\n 'plan',\n (event) => event.payload.planId,\n ),\n tasks: latestBy(\n visibleEvents,\n 'task',\n (event) => event.payload.taskId,\n ),\n tools: latestBy(\n visibleEvents,\n 'tool',\n (event) => event.payload.toolCallId,\n ),\n approvals: latestBy(\n visibleEvents,\n 'approval',\n (event) => event.payload.approvalId,\n ),\n artifacts: latestBy(\n visibleEvents,\n 'artifact',\n (event) => event.payload.artifactId,\n ),\n usage: [...visibleEvents]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'usage'> =>\n event.eventType === 'usage',\n ),\n run: projectRun(visibleEvents),\n };\n}\n","import { CheckCircle2, ChevronDown, Clock3, Loader2, TerminalSquare, XCircle } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport type { AgentWorkbenchEventOf } from './activity-model';\n\nexport interface AgentWorkbenchToolClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n input?: string;\n output?: string;\n}\n\nexport interface AgentWorkbenchToolProps {\n event: AgentWorkbenchEventOf<'tool'>;\n expanded?: boolean;\n defaultExpanded?: boolean;\n className?: string;\n classNames?: AgentWorkbenchToolClassNames;\n onExpandedChange?: (expanded: boolean) => void;\n}\n\nfunction JsonValue({ value, className }: { value: unknown; className?: string }) {\n if (value === undefined) return null;\n const content = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return (\n <pre\n className={cn(\n 'max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted p-3 font-mono text-xs text-foreground',\n className,\n )}\n >\n {content}\n </pre>\n );\n}\n\nfunction ToolStatus({ status }: { status: AgentWorkbenchEventOf<'tool'>['payload']['status'] }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.tool.status;\n const commonClassName = 'size-3.5 shrink-0';\n\n if (status === 'pending') {\n return <Clock3 className={commonClassName} aria-hidden=\"true\" />;\n }\n if (status === 'running') {\n return <Loader2 className={cn(commonClassName, 'animate-spin')} aria-hidden=\"true\" />;\n }\n if (status === 'completed') {\n return <CheckCircle2 className={cn(commonClassName, 'text-primary')} aria-hidden=\"true\" />;\n }\n return <XCircle className={cn(commonClassName, 'text-destructive-text')} aria-hidden=\"true\" />;\n}\n\nexport function AgentWorkbenchTool({\n event,\n expanded,\n defaultExpanded = event.payload.status === 'failed',\n className,\n classNames,\n onExpandedChange,\n}: AgentWorkbenchToolProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.tool;\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(defaultExpanded);\n const isControlled = expanded !== undefined;\n const isExpanded = expanded ?? uncontrolledExpanded;\n const status = event.payload.status;\n const setExpanded = (nextExpanded: boolean) => {\n if (!isControlled) setUncontrolledExpanded(nextExpanded);\n onExpandedChange?.(nextExpanded);\n };\n\n return (\n <details\n open={isExpanded}\n className={cn(\n 'group rounded-lg border border-border bg-card text-card-foreground',\n classNames?.root,\n className,\n )}\n data-tool-status={status}\n >\n <summary\n className={cn(\n 'flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden',\n classNames?.trigger,\n )}\n onClick={(event) => {\n event.preventDefault();\n setExpanded(!isExpanded);\n }}\n >\n <TerminalSquare className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate font-medium\">{event.payload.toolName}</span>\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-foreground\">\n <ToolStatus status={status} />\n {messages.status[status]}\n </span>\n <ChevronDown\n className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\"\n aria-hidden=\"true\"\n />\n </summary>\n <div className={cn('space-y-3 border-t border-border px-3 py-3 text-sm', classNames?.content)}>\n {event.payload.input !== undefined ? (\n <div className=\"space-y-1.5\">\n <div className=\"text-xs font-medium text-muted-foreground\">{messages.input}</div>\n <JsonValue value={event.payload.input} className={classNames?.input} />\n </div>\n ) : null}\n {event.payload.output !== undefined ? (\n <div className=\"space-y-1.5\">\n <div className=\"text-xs font-medium text-muted-foreground\">{messages.output}</div>\n <JsonValue value={event.payload.output} className={classNames?.output} />\n </div>\n ) : null}\n {event.payload.error ? (\n <p className=\"text-sm text-destructive-text\" role=\"alert\">\n {event.payload.error}\n </p>\n ) : null}\n </div>\n </details>\n );\n}\n","import type { AgentSessionViewModel } from '@inf-monkeys-tech/monkeys';\nimport {\n Check,\n CheckCircle2,\n ChevronDown,\n Circle,\n CircleStop,\n Clock3,\n Download,\n FileOutput,\n Loader2,\n X,\n XCircle,\n} from 'lucide-react';\nimport type { ComponentType, ReactNode } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n createAgentWorkbenchActivityModel,\n type AgentWorkbenchEventOf,\n} from './activity-model';\nimport { AgentWorkbenchTool } from './AgentWorkbenchTool';\n\nexport interface AgentWorkbenchApprovalIntent {\n approvalId: string;\n approved: boolean;\n}\n\nexport interface AgentWorkbenchArtifactIntent {\n artifactId: string;\n name: string;\n url: string;\n}\n\nexport interface AgentWorkbenchActivityClassNames {\n root?: string;\n item?: string;\n trigger?: string;\n content?: string;\n approval?: string;\n artifact?: string;\n usage?: string;\n}\n\nexport interface AgentWorkbenchActivityProps {\n viewModel?: AgentSessionViewModel;\n ariaLabel?: string;\n hiddenToolCallIds?: ReadonlySet<string>;\n hideReasoning?: boolean;\n hideStoppedRun?: boolean;\n className?: string;\n classNames?: AgentWorkbenchActivityClassNames;\n onApprovalDecision?: (intent: AgentWorkbenchApprovalIntent) => void;\n onArtifactOpen?: (intent: AgentWorkbenchArtifactIntent) => void;\n}\n\ninterface ActivityDetailsProps {\n icon: ComponentType<{ className?: string }>;\n title: ReactNode;\n open?: boolean;\n streaming?: boolean;\n className?: string;\n triggerClassName?: string;\n contentClassName?: string;\n children: ReactNode;\n}\n\nfunction ActivityDetails({\n icon: Icon,\n title,\n open,\n streaming,\n className,\n triggerClassName,\n contentClassName,\n children,\n}: ActivityDetailsProps) {\n return (\n <details\n className={cn(\n 'group rounded-lg border border-border bg-card text-card-foreground',\n className,\n )}\n open={open}\n >\n <summary\n className={cn(\n 'flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden',\n triggerClassName,\n )}\n >\n {streaming ? (\n <Loader2 className=\"size-4 shrink-0 animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n <ChevronDown\n className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\"\n aria-hidden=\"true\"\n />\n </summary>\n <div\n className={cn(\n 'border-t border-border px-3 py-3 text-sm',\n contentClassName,\n )}\n >\n {children}\n </div>\n </details>\n );\n}\n\nfunction StatusIcon({ status }: { status: string }) {\n if (status === 'completed' || status === 'passed') {\n return <CheckCircle2 className=\"size-4 text-primary\" aria-hidden=\"true\" />;\n }\n if (status === 'failed') {\n return <XCircle className=\"size-4 text-destructive-text\" aria-hidden=\"true\" />;\n }\n if (status === 'running') {\n return <Clock3 className=\"size-4 animate-pulse\" aria-hidden=\"true\" />;\n }\n return <Circle className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />;\n}\n\nfunction JsonValue({ value }: { value: unknown }) {\n if (value === undefined) return null;\n const content =\n typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return (\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted p-3 font-mono text-xs text-foreground\">\n {content}\n </pre>\n );\n}\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1_000) return '<1s';\n const totalSeconds = Math.floor(durationMs / 1_000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;\n}\n\nfunction RunStatus({\n event,\n}: {\n event: AgentWorkbenchEventOf<'status'> & { resolvedDurationMs?: number };\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const status = event.payload.status;\n if (status !== 'stopping' && status !== 'stopped') return null;\n\n return (\n <div\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n role=\"status\"\n >\n {status === 'stopping' ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n ) : (\n <CircleStop className=\"size-4\" aria-hidden=\"true\" />\n )}\n <span>\n {status === 'stopping'\n ? messages.run.stopping\n : messages.run.stoppedAfter({\n duration: formatDuration(\n event.payload.durationMs ?? event.resolvedDurationMs ?? 0,\n ),\n })}\n </span>\n </div>\n );\n}\n\nexport function AgentWorkbenchActivity({\n viewModel,\n ariaLabel,\n hiddenToolCallIds,\n hideReasoning = false,\n hideStoppedRun = false,\n className,\n classNames,\n onApprovalDecision,\n onArtifactOpen,\n}: AgentWorkbenchActivityProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n if (!viewModel) return null;\n\n const activity = createAgentWorkbenchActivityModel(viewModel);\n const reasoning = hideReasoning ? [] : activity.reasoning;\n const tools = activity.tools.filter(\n (event) => !hiddenToolCallIds?.has(event.payload.toolCallId),\n );\n const approvals = activity.approvals.filter(\n (event) =>\n !event.payload.toolCallId ||\n !hiddenToolCallIds?.has(event.payload.toolCallId),\n );\n const usage = activity.usage?.payload;\n const contextWindow =\n typeof usage?.contextWindow === 'number' && usage.contextWindow > 0\n ? usage.contextWindow\n : undefined;\n const showRun =\n activity.run?.payload.status === 'stopping' ||\n (activity.run?.payload.status === 'stopped' && !hideStoppedRun);\n const hasActivity =\n reasoning.length > 0 ||\n activity.plans.length > 0 ||\n activity.tasks.length > 0 ||\n tools.length > 0 ||\n approvals.length > 0 ||\n activity.artifacts.length > 0 ||\n showRun ||\n contextWindow !== undefined;\n if (!hasActivity) return null;\n\n return (\n <section\n className={cn('space-y-3', classNames?.root, className)}\n aria-label={ariaLabel ?? messages.label}\n data-agent-workbench-mode={activity.mode}\n data-agent-workbench-status={activity.status}\n >\n {reasoning.map((event) => (\n <ActivityDetails\n key={event.payload.reasoningId}\n icon={Circle}\n title={messages.reasoning}\n open={event.payload.status === 'streaming'}\n streaming={event.payload.status === 'streaming'}\n className={classNames?.item}\n triggerClassName={classNames?.trigger}\n contentClassName={classNames?.content}\n >\n <div className=\"whitespace-pre-wrap text-muted-foreground\">\n {event.payload.text}\n </div>\n </ActivityDetails>\n ))}\n\n {activity.plans.map((event) => (\n <ActivityDetails\n key={event.payload.planId}\n icon={Circle}\n title={event.payload.title || messages.plan}\n open={event.payload.status === 'running'}\n streaming={event.payload.status === 'running'}\n className={classNames?.item}\n triggerClassName={classNames?.trigger}\n contentClassName={classNames?.content}\n >\n <ol className=\"space-y-2\">\n {event.payload.steps.map((step) => (\n <li key={step.id} className=\"flex items-center gap-2\">\n <StatusIcon status={step.status} />\n <span>{step.title}</span>\n </li>\n ))}\n </ol>\n </ActivityDetails>\n ))}\n\n {activity.tasks.map((event) => (\n <ActivityDetails\n key={event.payload.taskId}\n icon={Circle}\n title={event.payload.title}\n open={event.payload.status === 'running'}\n streaming={event.payload.status === 'running'}\n className={classNames?.item}\n triggerClassName={classNames?.trigger}\n contentClassName={classNames?.content}\n >\n <div className=\"flex items-start gap-2\">\n <StatusIcon status={event.payload.status} />\n <span className=\"whitespace-pre-wrap text-muted-foreground\">\n {event.payload.detail || messages.taskNoDetail}\n </span>\n </div>\n </ActivityDetails>\n ))}\n\n {tools.map((event) => (\n <AgentWorkbenchTool\n key={event.payload.toolCallId}\n event={event}\n defaultExpanded={event.payload.status === 'failed'}\n classNames={{\n root: classNames?.item,\n trigger: classNames?.trigger,\n content: classNames?.content,\n }}\n />\n ))}\n\n {approvals.map((event) => {\n const requested = event.payload.status === 'requested';\n const approved = event.payload.status === 'approved';\n return (\n <article\n key={event.payload.approvalId}\n className={cn(\n 'rounded-lg border border-border bg-card p-3 text-card-foreground',\n classNames?.approval,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {requested ? (\n <Clock3 className=\"mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n ) : approved ? (\n <Check className=\"mt-0.5 size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n ) : (\n <X className=\"mt-0.5 size-4 shrink-0 text-destructive-text\" aria-hidden=\"true\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-medium\">{event.payload.title}</h3>\n {event.payload.description ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {event.payload.description}\n </p>\n ) : null}\n {event.payload.requestedAction !== undefined ? (\n <div className=\"mt-3\">\n <JsonValue value={event.payload.requestedAction} />\n </div>\n ) : null}\n {requested ? (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground outline-none hover:bg-primary/90 focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n disabled={!onApprovalDecision}\n onClick={() =>\n onApprovalDecision?.({\n approvalId: event.payload.approvalId,\n approved: true,\n })\n }\n >\n {messages.approval.approve}\n </button>\n <button\n type=\"button\"\n className=\"rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium text-foreground outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n disabled={!onApprovalDecision}\n onClick={() =>\n onApprovalDecision?.({\n approvalId: event.payload.approvalId,\n approved: false,\n })\n }\n >\n {messages.approval.reject}\n </button>\n </div>\n ) : (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {approved\n ? messages.approval.approved\n : messages.approval.rejected}\n </p>\n )}\n </div>\n </div>\n </article>\n );\n })}\n\n {activity.artifacts.map((event) => {\n const canOpen = Boolean(event.payload.url && onArtifactOpen);\n return (\n <article\n key={event.payload.artifactId}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border bg-card p-3 text-card-foreground',\n classNames?.artifact,\n )}\n >\n <FileOutput className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">\n {event.payload.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {messages.artifact[event.payload.status]}\n </div>\n </div>\n {event.payload.url ? (\n <button\n type=\"button\"\n className=\"rounded-md p-2 text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={messages.artifact.open({\n name: event.payload.name,\n })}\n disabled={!canOpen}\n onClick={() => {\n if (!event.payload.url) return;\n onArtifactOpen?.({\n artifactId: event.payload.artifactId,\n name: event.payload.name,\n url: event.payload.url,\n });\n }}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </article>\n );\n })}\n\n {showRun && activity.run ? <RunStatus event={activity.run} /> : null}\n\n {usage && contextWindow !== undefined ? (\n <div\n className={cn('flex justify-end', classNames?.usage)}\n aria-label={messages.usage.label}\n >\n <span className=\"rounded-full border border-border bg-muted px-2.5 py-1 text-xs text-foreground\">\n {messages.usage.context({\n used: usage.contextTokens ?? usage.totalTokens ?? 0,\n total: contextWindow,\n })}\n </span>\n </div>\n ) : null}\n </section>\n );\n}\n","import type {\n AgentSessionCapabilities,\n AgentSessionEvent,\n AgentSessionViewModel,\n} from '@inf-monkeys-tech/monkeys';\n\nimport type { AgentWorkbenchEventOf } from './activity-model';\n\nconst WORKSPACE_CAPABILITIES = {\n diff: 'diff',\n 'workspace-file': 'workspaceFiles',\n terminal: 'terminal',\n 'test-result': 'testResults',\n artifact: 'artifacts',\n} as const satisfies Partial<\n Record<AgentSessionEvent['eventType'], keyof AgentSessionCapabilities>\n>;\n\nexport interface AgentWorkbenchTerminalModel {\n terminalId: string;\n stdin: string;\n stdout: string;\n stderr: string;\n status: string;\n exitCode?: number;\n sequence: number;\n}\n\nexport interface AgentWorkbenchDetailsModel {\n mode: AgentSessionViewModel['snapshot']['mode'];\n modelId: string;\n permissionProfile?: AgentSessionViewModel['snapshot']['permissionProfile'];\n status: AgentSessionViewModel['status'];\n sessionId: string;\n capabilities: AgentSessionCapabilities;\n resumable: boolean;\n summary?: AgentWorkbenchEventOf<'summary'>;\n error?: AgentWorkbenchEventOf<'error'>;\n run?: AgentWorkbenchEventOf<'status'>;\n usage?: AgentWorkbenchEventOf<'usage'>;\n workspace: {\n diffs: AgentWorkbenchEventOf<'diff'>[];\n files: AgentWorkbenchEventOf<'workspace-file'>[];\n terminals: AgentWorkbenchTerminalModel[];\n tests: AgentWorkbenchEventOf<'test-result'>[];\n artifacts: AgentWorkbenchEventOf<'artifact'>[];\n };\n}\n\nfunction latestBy<Type extends AgentSessionEvent['eventType']>(\n events: AgentSessionEvent[],\n eventType: Type,\n key: (event: AgentWorkbenchEventOf<Type>) => string,\n): AgentWorkbenchEventOf<Type>[] {\n const latest = new Map<string, AgentWorkbenchEventOf<Type>>();\n for (const event of events) {\n if (event.eventType !== eventType) continue;\n const typedEvent = event as AgentWorkbenchEventOf<Type>;\n latest.set(key(typedEvent), typedEvent);\n }\n return [...latest.values()].sort(\n (left, right) => left.sequence - right.sequence,\n );\n}\n\nfunction projectTerminals(\n events: AgentWorkbenchEventOf<'terminal'>[],\n): AgentWorkbenchTerminalModel[] {\n const terminals = new Map<string, AgentWorkbenchTerminalModel>();\n for (const event of events) {\n const current = terminals.get(event.payload.terminalId) ?? {\n terminalId: event.payload.terminalId,\n stdin: '',\n stdout: '',\n stderr: '',\n status: '',\n sequence: event.sequence,\n };\n const stream = event.payload.stream;\n terminals.set(event.payload.terminalId, {\n ...current,\n ...(stream === 'status'\n ? { status: event.payload.chunk }\n : { [stream]: `${current[stream]}${event.payload.chunk}` }),\n ...(event.payload.exitCode === undefined\n ? {}\n : { exitCode: event.payload.exitCode }),\n sequence: event.sequence,\n });\n }\n return [...terminals.values()].sort(\n (left, right) => left.sequence - right.sequence,\n );\n}\n\nexport function createAgentWorkbenchDetailsModel(\n viewModel: AgentSessionViewModel,\n): AgentWorkbenchDetailsModel {\n const capabilities = viewModel.snapshot.capabilities;\n const workspaceEvents = viewModel.events.filter((event) => {\n const capability = WORKSPACE_CAPABILITIES[\n event.eventType as keyof typeof WORKSPACE_CAPABILITIES\n ];\n return capability ? capabilities[capability] === true : false;\n });\n const run = [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'status'> =>\n event.eventType === 'status',\n );\n const currentRunId = run?.runId;\n const summary = [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'summary'> =>\n event.eventType === 'summary' &&\n capabilities.summary === true &&\n (!currentRunId || event.runId === currentRunId),\n );\n\n return {\n mode: viewModel.snapshot.mode,\n modelId: viewModel.snapshot.modelId,\n permissionProfile: viewModel.snapshot.permissionProfile,\n status: viewModel.status,\n sessionId: viewModel.sessionId,\n capabilities,\n resumable: capabilities.resume === true && viewModel.resumable,\n summary,\n error: [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'error'> =>\n event.eventType === 'error',\n ),\n run,\n usage: capabilities.usage\n ? [...viewModel.events]\n .reverse()\n .find(\n (event): event is AgentWorkbenchEventOf<'usage'> =>\n event.eventType === 'usage',\n )\n : undefined,\n workspace: {\n diffs: latestBy(workspaceEvents, 'diff', (event) => event.payload.path),\n files: latestBy(\n workspaceEvents,\n 'workspace-file',\n (event) => event.payload.path,\n ),\n terminals: projectTerminals(\n workspaceEvents.filter(\n (event): event is AgentWorkbenchEventOf<'terminal'> =>\n event.eventType === 'terminal',\n ),\n ),\n tests: latestBy(\n workspaceEvents,\n 'test-result',\n (event) => event.payload.testId,\n ),\n artifacts: latestBy(\n workspaceEvents,\n 'artifact',\n (event) => event.payload.artifactId,\n ),\n },\n };\n}\n","import type { AgentSessionViewModel } from '@inf-monkeys-tech/monkeys';\nimport {\n AlertCircle,\n CheckCircle2,\n ChevronDown,\n Circle,\n Clock3,\n Copy,\n Download,\n FileCode2,\n FileOutput,\n Files,\n GitFork,\n PencilLine,\n RefreshCw,\n RotateCcw,\n TerminalSquare,\n TestTube2,\n X,\n XCircle,\n} from 'lucide-react';\nimport type { ComponentType, KeyboardEvent, ReactNode } from 'react';\n\nimport { useMonkeysLocale, useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n createAgentWorkbenchDetailsModel,\n type AgentWorkbenchDetailsModel,\n} from './details-model';\n\nexport type AgentWorkbenchDetailsTab = 'summary' | 'workspace';\nexport type AgentWorkbenchDetailsState =\n | 'ready'\n | 'loading'\n | 'empty'\n | 'error';\n\nexport type AgentWorkbenchDetailsIntent =\n | { type: 'close' }\n | { type: 'copy-summary'; summaryId: string; text: string }\n | { type: 'retry'; eventId: string }\n | { type: 'retry-summary'; eventId: string }\n | { type: 'resume'; sessionId: string }\n | { type: 'continue-in-new-task'; sessionId: string }\n | { type: 'edit-and-rerun'; sessionId: string }\n | { type: 'export'; sessionId: string };\n\nexport interface AgentWorkbenchTaskDetailsClassNames {\n root?: string;\n header?: string;\n tabs?: string;\n body?: string;\n section?: string;\n code?: string;\n}\n\nexport interface AgentWorkbenchTaskDetailsProps {\n viewModel?: AgentSessionViewModel;\n state?: AgentWorkbenchDetailsState;\n activeTab?: AgentWorkbenchDetailsTab;\n className?: string;\n classNames?: AgentWorkbenchTaskDetailsClassNames;\n onActiveTabChange?: (tab: AgentWorkbenchDetailsTab) => void;\n onIntent?: (intent: AgentWorkbenchDetailsIntent) => void;\n}\n\nfunction formatDuration(durationMs: number | undefined): string {\n if (durationMs === undefined) return '-';\n const seconds = Math.max(0, Math.round(durationMs / 1_000));\n if (seconds < 60) return `${seconds}s`;\n return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\nfunction formatDate(value: string | undefined, locale: string): string {\n if (!value) return '-';\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return '-';\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n}\n\nfunction Count({ value }: { value: number }) {\n return (\n <span className=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-semibold text-foreground\">\n {value}\n </span>\n );\n}\n\nfunction DetailsSection({\n title,\n count,\n icon: Icon,\n className,\n children,\n}: {\n title: string;\n count: number;\n icon: ComponentType<{ className?: string }>;\n className?: string;\n children: ReactNode;\n}) {\n if (count === 0) return null;\n return (\n <details\n className={cn(\n 'group rounded-lg border border-border bg-card text-card-foreground',\n className,\n )}\n open\n >\n <summary className=\"flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden\">\n <Icon className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n <Count value={count} />\n <ChevronDown\n className=\"size-4 text-muted-foreground transition-transform group-open:rotate-180\"\n aria-hidden=\"true\"\n />\n </summary>\n <div className=\"border-t border-border p-3\">{children}</div>\n </details>\n );\n}\n\nfunction StatusIcon({ status }: { status: string }) {\n if (status === 'completed' || status === 'passed') {\n return <CheckCircle2 className=\"size-4 text-primary\" aria-hidden=\"true\" />;\n }\n if (status === 'failed') {\n return <XCircle className=\"size-4 text-destructive-text\" aria-hidden=\"true\" />;\n }\n if (status === 'running') {\n return <Clock3 className=\"size-4 animate-pulse\" aria-hidden=\"true\" />;\n }\n return <Circle className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />;\n}\n\nfunction StateContent({ state }: { state: Exclude<AgentWorkbenchDetailsState, 'ready'> }) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.details;\n const error = state === 'error';\n return (\n <div\n className=\"flex min-h-48 flex-col items-center justify-center gap-2 px-6 text-center\"\n role={error ? 'alert' : state === 'loading' ? 'status' : undefined}\n aria-busy={state === 'loading' || undefined}\n >\n {state === 'loading' ? (\n <RefreshCw className=\"size-5 animate-spin text-muted-foreground\" aria-hidden=\"true\" />\n ) : error ? (\n <AlertCircle className=\"size-5 text-destructive-text\" aria-hidden=\"true\" />\n ) : (\n <FileOutput className=\"size-5 text-muted-foreground\" aria-hidden=\"true\" />\n )}\n <div className=\"text-sm font-medium\">{messages.state[state].title}</div>\n <div className=\"text-xs text-muted-foreground\">\n {messages.state[state].description}\n </div>\n </div>\n );\n}\n\nfunction SummaryPanel({\n model,\n onIntent,\n}: {\n model: AgentWorkbenchDetailsModel;\n onIntent?: (intent: AgentWorkbenchDetailsIntent) => void;\n}) {\n const workbenchMessages = useMonkeysLocaleMessages().agentWorkbench;\n const messages = workbenchMessages.details;\n const locale = useMonkeysLocale().locale;\n const summary = model.summary;\n const run = model.run?.payload;\n const error = model.error;\n const retryable = model.status === 'failed' && error?.payload.retryable;\n const canResume =\n model.resumable && ['stopped', 'completed', 'failed'].includes(model.status);\n const canContinueInNewTask = model.capabilities.threadForking;\n const canEditAndRerun = model.capabilities.editAndRerun;\n const tokenUsage =\n model.usage?.payload.totalTokens ??\n (model.usage?.payload.inputTokens !== undefined ||\n model.usage?.payload.outputTokens !== undefined\n ? (model.usage.payload.inputTokens ?? 0) +\n (model.usage.payload.outputTokens ?? 0)\n : undefined);\n\n return (\n <div className=\"space-y-3\">\n <section className=\"rounded-lg border border-border bg-muted/40 p-3\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon status={model.status} />\n <span className=\"text-sm font-semibold\">\n {messages.status[model.status]}\n </span>\n </div>\n <dl className=\"mt-3 grid grid-cols-2 gap-3 text-xs\">\n <div>\n <dt className=\"text-muted-foreground\">{messages.duration}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {formatDuration(run?.durationMs)}\n </dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{messages.updated}</dt>\n <dd className=\"mt-0.5 truncate font-medium\">\n {formatDate(\n run?.stoppedAt ?? run?.completedAt ?? run?.failedAt,\n locale,\n )}\n </dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{messages.model}</dt>\n <dd className=\"mt-0.5 truncate font-medium\">{model.modelId}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">{messages.mode}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {workbenchMessages.modes[model.mode]}\n </dd>\n </div>\n {model.permissionProfile ? (\n <div>\n <dt className=\"text-muted-foreground\">{messages.permissions}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {workbenchMessages.composer.permissionOptions[model.permissionProfile]}\n </dd>\n </div>\n ) : null}\n {tokenUsage !== undefined ? (\n <div>\n <dt className=\"text-muted-foreground\">{messages.tokenUsage}</dt>\n <dd className=\"mt-0.5 font-medium\">\n {new Intl.NumberFormat(locale).format(tokenUsage)}\n </dd>\n </div>\n ) : null}\n </dl>\n {error ? (\n <div className=\"mt-3 rounded-md border border-destructive/30 bg-destructive/5 p-2.5 text-sm text-destructive-text\" role=\"alert\">\n {error.payload.message}\n </div>\n ) : null}\n {retryable || canResume ? (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {retryable ? (\n <button\n type=\"button\"\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'retry', eventId: error.eventId })}\n >\n {messages.actions.retry}\n </button>\n ) : null}\n {canResume ? (\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-2.5 py-1.5 text-xs font-medium text-primary-foreground outline-none hover:bg-primary/90 focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() =>\n onIntent?.({ type: 'resume', sessionId: model.sessionId })\n }\n >\n {messages.actions.resume}\n </button>\n ) : null}\n </div>\n ) : null}\n </section>\n\n <section className=\"flex flex-wrap gap-2 rounded-lg border border-border bg-card p-3 text-card-foreground\">\n {canContinueInNewTask ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'continue-in-new-task', sessionId: model.sessionId })}\n >\n <GitFork className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.continueInNewTask}\n </button>\n ) : null}\n {canEditAndRerun ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'edit-and-rerun', sessionId: model.sessionId })}\n >\n <PencilLine className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.editAndRerun}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() => onIntent?.({ type: 'export', sessionId: model.sessionId })}\n >\n <Download className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.export}\n </button>\n </section>\n\n <section className=\"rounded-lg border border-border bg-card p-3 text-card-foreground\">\n <div className=\"flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-semibold\">{messages.summary}</h3>\n {summary?.payload.text ? (\n <button\n type=\"button\"\n className=\"rounded-md p-1.5 text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.actions.copySummary}\n disabled={!onIntent}\n onClick={() =>\n onIntent?.({\n type: 'copy-summary',\n summaryId: summary.payload.summaryId,\n text: summary.payload.text,\n })\n }\n >\n <Copy className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n {summary?.payload.status === 'failed' ? (\n <div className=\"mt-3 space-y-2\">\n <p className=\"text-sm text-destructive-text\" role=\"alert\">\n {messages.summaryFailed}\n </p>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n disabled={!onIntent}\n onClick={() =>\n onIntent?.({ type: 'retry-summary', eventId: summary.eventId })\n }\n >\n <RotateCcw className=\"size-3.5\" aria-hidden=\"true\" />\n {messages.actions.retrySummary}\n </button>\n </div>\n ) : summary?.payload.text ? (\n <div className=\"mt-3 space-y-3 text-sm\">\n <p className=\"whitespace-pre-wrap text-muted-foreground\">\n {summary.payload.text}\n </p>\n {summary.payload.highlights.length > 0 ? (\n <div>\n <h4 className=\"text-xs font-medium\">{messages.highlights}</h4>\n <ul className=\"mt-1 list-disc space-y-1 pl-5 text-muted-foreground\">\n {summary.payload.highlights.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n </div>\n ) : null}\n {summary.payload.pendingItems.length > 0 ? (\n <div>\n <h4 className=\"text-xs font-medium\">{messages.pendingItems}</h4>\n <ul className=\"mt-1 list-disc space-y-1 pl-5 text-muted-foreground\">\n {summary.payload.pendingItems.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n ) : (\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {messages.summaryEmpty}\n </p>\n )}\n </section>\n </div>\n );\n}\n\nfunction WorkspacePanel({\n model,\n sectionClassName,\n codeClassName,\n}: {\n model: AgentWorkbenchDetailsModel;\n sectionClassName?: string;\n codeClassName?: string;\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.details.workspace;\n const workspace = model.workspace;\n return (\n <div className=\"space-y-3\">\n <DetailsSection\n title={messages.diffs}\n count={workspace.diffs.length}\n icon={FileCode2}\n className={sectionClassName}\n >\n <div className=\"space-y-3\">\n {workspace.diffs.map((event) => (\n <div key={event.payload.path} className=\"min-w-0\">\n <div className=\"flex items-center justify-between gap-2 text-xs\">\n <span className=\"truncate font-medium\">{event.payload.path}</span>\n <span className=\"shrink-0 text-muted-foreground\">\n {messages.diffStatus[event.payload.status]}\n </span>\n </div>\n {event.payload.patch ? (\n <pre className={cn('mt-2 max-h-72 overflow-auto whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs', codeClassName)}>\n {event.payload.patch}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </DetailsSection>\n\n <DetailsSection\n title={messages.files}\n count={workspace.files.length}\n icon={Files}\n className={sectionClassName}\n >\n <ul className=\"space-y-2 text-xs\">\n {workspace.files.map((event) => (\n <li key={event.payload.path} className=\"flex items-center gap-2\">\n <FileOutput className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{event.payload.path}</span>\n <span className=\"text-muted-foreground\">\n {messages.fileOperation[event.payload.operation]}\n </span>\n </li>\n ))}\n </ul>\n </DetailsSection>\n\n <DetailsSection\n title={messages.terminals}\n count={workspace.terminals.length}\n icon={TerminalSquare}\n className={sectionClassName}\n >\n <div className=\"space-y-3\">\n {workspace.terminals.map((terminal) => (\n <div key={terminal.terminalId}>\n <div className=\"flex justify-between gap-2 text-xs font-medium\">\n <span>{terminal.terminalId}</span>\n <span className=\"text-muted-foreground\">\n {terminal.exitCode === undefined\n ? terminal.status\n : messages.exitCode({ code: terminal.exitCode })}\n </span>\n </div>\n <pre className={cn('mt-2 max-h-72 overflow-auto whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs', codeClassName)}>\n {[terminal.stdin, terminal.stdout, terminal.stderr]\n .filter(Boolean)\n .join('\\n')}\n </pre>\n </div>\n ))}\n </div>\n </DetailsSection>\n\n <DetailsSection\n title={messages.tests}\n count={workspace.tests.length}\n icon={TestTube2}\n className={sectionClassName}\n >\n <ul className=\"space-y-2 text-xs\">\n {workspace.tests.map((event) => (\n <li key={event.payload.testId}>\n <div className=\"flex items-center gap-2\">\n <StatusIcon status={event.payload.status} />\n <span className=\"min-w-0 flex-1 truncate\">{event.payload.name}</span>\n {event.payload.durationMs === undefined ? null : (\n <span className=\"text-muted-foreground\">\n {formatDuration(event.payload.durationMs)}\n </span>\n )}\n </div>\n {event.payload.output ? (\n <pre className={cn('mt-2 max-h-48 overflow-auto whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs', codeClassName)}>\n {event.payload.output}\n </pre>\n ) : null}\n </li>\n ))}\n </ul>\n </DetailsSection>\n\n <DetailsSection\n title={messages.artifacts}\n count={workspace.artifacts.length}\n icon={FileOutput}\n className={sectionClassName}\n >\n <ul className=\"space-y-2 text-xs\">\n {workspace.artifacts.map((event) => (\n <li key={event.payload.artifactId} className=\"flex items-center gap-2\">\n <FileOutput className=\"size-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{event.payload.name}</span>\n <span className=\"text-muted-foreground\">\n {event.payload.kind}\n </span>\n </li>\n ))}\n </ul>\n </DetailsSection>\n </div>\n );\n}\n\nexport function AgentWorkbenchTaskDetails({\n viewModel,\n state = 'ready',\n activeTab = 'summary',\n className,\n classNames,\n onActiveTabChange,\n onIntent,\n}: AgentWorkbenchTaskDetailsProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.details;\n if (state !== 'ready') {\n return (\n <aside className={cn('flex h-full min-h-0 flex-col border-l border-border bg-background', classNames?.root, className)}>\n <StateContent state={state} />\n </aside>\n );\n }\n if (!viewModel) {\n return (\n <aside className={cn('flex h-full min-h-0 flex-col border-l border-border bg-background', classNames?.root, className)}>\n <StateContent state=\"empty\" />\n </aside>\n );\n }\n\n const model = createAgentWorkbenchDetailsModel(viewModel);\n const workspaceCount = Object.values(model.workspace).reduce(\n (total, items) => total + items.length,\n 0,\n );\n const workspaceAvailable = workspaceCount > 0;\n const resolvedTab = activeTab === 'workspace' && !workspaceAvailable ? 'summary' : activeTab;\n const tabs: Array<{ id: AgentWorkbenchDetailsTab; label: string; count: number }> = [\n { id: 'summary', label: messages.tabs.summary, count: model.summary ? 1 : 0 },\n ...(workspaceAvailable\n ? [{ id: 'workspace' as const, label: messages.tabs.workspace, count: workspaceCount }]\n : []),\n ];\n const tabId = (tab: AgentWorkbenchDetailsTab) =>\n `agent-workbench-details-${viewModel.sessionId}-${tab}`.replace(\n /[^a-zA-Z0-9_-]/g,\n '-',\n );\n const onTabKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const nextIndex =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? tabs.length - 1\n : (index + (event.key === 'ArrowRight' ? 1 : -1) + tabs.length) %\n tabs.length;\n onActiveTabChange?.(tabs[nextIndex].id);\n };\n\n return (\n <aside\n className={cn(\n 'flex h-full min-h-0 min-w-0 flex-col border-l border-border bg-background text-foreground',\n classNames?.root,\n className,\n )}\n data-agent-workbench-mode={model.mode}\n >\n <header className={cn('flex shrink-0 items-center gap-2 border-b border-border px-4 py-3', classNames?.header)}>\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold\">{messages.title}</h2>\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {messages.description}\n </p>\n </div>\n {onIntent ? (\n <button\n type=\"button\"\n className=\"rounded-md p-2 text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.actions.close}\n onClick={() => onIntent({ type: 'close' })}\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </header>\n\n <div className={cn('flex shrink-0 gap-1 border-b border-border px-3 py-2', classNames?.tabs)} role=\"tablist\" aria-label={messages.tabs.label}>\n {tabs.map((tab, index) => (\n <button\n key={tab.id}\n id={tabId(tab.id)}\n type=\"button\"\n role=\"tab\"\n aria-selected={resolvedTab === tab.id}\n aria-controls={`${tabId(tab.id)}-panel`}\n tabIndex={resolvedTab === tab.id ? 0 : -1}\n className={cn(\n 'inline-flex min-w-0 flex-1 items-center justify-center gap-1 rounded-md px-2 py-1.5 text-xs font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring',\n resolvedTab === tab.id\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n onClick={() => onActiveTabChange?.(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n <span className=\"truncate\">{tab.label}</span>\n <Count value={tab.count} />\n </button>\n ))}\n </div>\n\n <div\n id={`${tabId(resolvedTab)}-panel`}\n role=\"tabpanel\"\n aria-labelledby={tabId(resolvedTab)}\n tabIndex={0}\n className={cn('min-h-0 flex-1 overflow-y-auto p-3 outline-none', classNames?.body)}\n >\n {resolvedTab === 'summary' ? (\n <SummaryPanel model={model} onIntent={onIntent} />\n ) : (\n <WorkspacePanel\n model={model}\n sectionClassName={classNames?.section}\n codeClassName={classNames?.code}\n />\n )}\n </div>\n </aside>\n );\n}\n","import type { AgentSessionEvent, AgentSessionViewModel } from '@inf-monkeys-tech/monkeys';\nimport {\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport {\n AgentWorkbenchActivity,\n type AgentWorkbenchApprovalIntent,\n type AgentWorkbenchArtifactIntent,\n} from './AgentWorkbenchActivity';\n\ntype MessageEvent = Extract<AgentSessionEvent, { eventType: 'message' }>;\n\nexport interface AgentWorkbenchThreadMessage {\n id: string;\n role: MessageEvent['payload']['role'];\n parts: MessageEvent['payload']['parts'];\n sequence: number;\n}\n\ntype ThreadEntry =\n | { type: 'message'; sequence: number; message: AgentWorkbenchThreadMessage }\n | { type: 'error'; sequence: number; event: Extract<AgentSessionEvent, { eventType: 'error' }> }\n | { type: 'activity'; sequence: number; event: AgentSessionEvent };\n\nexport interface AgentWorkbenchThreadClassNames {\n root?: string;\n list?: string;\n message?: string;\n messageContent?: string;\n activity?: string;\n empty?: string;\n loading?: string;\n}\n\nexport interface AgentWorkbenchThreadProps {\n viewModel?: AgentSessionViewModel;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n autoScroll?: boolean;\n className?: string;\n classNames?: AgentWorkbenchThreadClassNames;\n renderMessageContent?: (message: AgentWorkbenchThreadMessage) => ReactNode;\n onApprovalDecision?: (intent: AgentWorkbenchApprovalIntent) => void;\n onArtifactOpen?: (intent: AgentWorkbenchArtifactIntent) => void;\n}\n\nfunction materializeMessages(events: readonly AgentSessionEvent[]): AgentWorkbenchThreadMessage[] {\n const messages = new Map<string, AgentWorkbenchThreadMessage>();\n for (const event of events) {\n if (event.eventType !== 'message') continue;\n const current = messages.get(event.payload.messageId);\n const parts = event.payload.operation === 'replace'\n ? event.payload.parts\n : [...(current?.parts ?? []), ...event.payload.parts];\n messages.set(event.payload.messageId, {\n id: event.payload.messageId,\n role: event.payload.role,\n parts,\n sequence: event.sequence,\n });\n }\n return [...messages.values()];\n}\n\nfunction logicalActivityKey(event: AgentSessionEvent): string | undefined {\n switch (event.eventType) {\n case 'reasoning': return `reasoning:${event.payload.reasoningId}`;\n case 'plan': return `plan:${event.payload.planId}`;\n case 'task': return `task:${event.payload.taskId}`;\n case 'tool': return `tool:${event.payload.toolCallId}`;\n case 'approval': return `approval:${event.payload.approvalId}`;\n case 'artifact': return `artifact:${event.payload.artifactId}`;\n case 'usage': return 'usage';\n case 'status': return 'status';\n default: return undefined;\n }\n}\n\nfunction createThreadEntries(viewModel: AgentSessionViewModel): ThreadEntry[] {\n const messages = materializeMessages(viewModel.events).map<ThreadEntry>((message) => ({\n type: 'message',\n sequence: message.sequence,\n message,\n }));\n const activity = new Map<string, AgentSessionEvent>();\n for (const event of viewModel.events) {\n const key = logicalActivityKey(event);\n if (key) activity.set(key, event);\n }\n return [\n ...messages,\n ...viewModel.events\n .filter((event): event is Extract<AgentSessionEvent, { eventType: 'error' }> => event.eventType === 'error')\n .map<ThreadEntry>((event) => ({ type: 'error', sequence: event.sequence, event })),\n ...[...activity.values()].map<ThreadEntry>((event) => ({\n type: 'activity',\n sequence: event.sequence,\n event,\n })),\n ].sort((left, right) => left.sequence - right.sequence);\n}\n\nfunction partText(part: unknown): string {\n if (typeof part === 'string') return part;\n if (!part || typeof part !== 'object' || Array.isArray(part)) return String(part ?? '');\n const record = part as Record<string, unknown>;\n if (typeof record.text === 'string') return record.text;\n if (typeof record.name === 'string') return record.name;\n return JSON.stringify(record, null, 2);\n}\n\nfunction DefaultMessageContent({ message }: { message: AgentWorkbenchThreadMessage }) {\n const content = message.parts.map(partText).filter(Boolean).join('');\n return <div className=\"whitespace-pre-wrap break-words\">{content}</div>;\n}\n\nfunction singleEventViewModel(\n viewModel: AgentSessionViewModel,\n event: AgentSessionEvent,\n): AgentSessionViewModel {\n return {\n ...viewModel,\n events: [event],\n lastSequence: event.sequence,\n };\n}\n\nexport function AgentWorkbenchThread({\n viewModel,\n loading = false,\n emptyTitle,\n emptyDescription,\n autoScroll = true,\n className,\n classNames,\n renderMessageContent,\n onApprovalDecision,\n onArtifactOpen,\n}: AgentWorkbenchThreadProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const scrollRef = useRef<HTMLDivElement>(null);\n const entries = useMemo(\n () => viewModel ? createThreadEntries(viewModel) : [],\n [viewModel],\n );\n\n useEffect(() => {\n if (!autoScroll || !viewModel) return;\n const element = scrollRef.current;\n if (element) element.scrollTop = element.scrollHeight;\n }, [autoScroll, viewModel?.lastSequence, viewModel?.sessionId]);\n\n return (\n <div\n ref={scrollRef}\n role=\"log\"\n aria-label={messages.label}\n className={cn('min-h-0 flex-1 overflow-y-auto bg-background', classNames?.root, className)}\n >\n {loading && entries.length === 0 ? (\n <div className={cn('flex min-h-48 items-center justify-center gap-2 text-sm text-muted-foreground', classNames?.loading)} role=\"status\">\n <span className=\"size-4 animate-spin rounded-full border-2 border-muted-foreground/30 border-t-muted-foreground\" aria-hidden=\"true\" />\n <span>{messages.navigation.loading}</span>\n </div>\n ) : entries.length === 0 ? (\n <div className={cn('flex min-h-48 flex-col items-center justify-center px-6 text-center', classNames?.empty)}>\n {emptyTitle ? <h2 className=\"text-base font-semibold text-foreground\">{emptyTitle}</h2> : null}\n {emptyDescription ? <p className=\"mt-1 max-w-lg text-sm text-muted-foreground\">{emptyDescription}</p> : null}\n </div>\n ) : (\n <div className={cn('mx-auto flex w-full max-w-4xl flex-col gap-4 px-4 py-6 sm:px-6', classNames?.list)}>\n {entries.map((entry) => {\n if (entry.type === 'error') {\n return (\n <div\n key={`error:${entry.event.eventId}`}\n role=\"alert\"\n className={cn('rounded-lg border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive-text', classNames?.activity)}\n >\n {entry.event.payload.message}\n </div>\n );\n }\n if (entry.type === 'activity') {\n return (\n <AgentWorkbenchActivity\n key={`activity:${entry.event.eventId}`}\n viewModel={singleEventViewModel(viewModel!, entry.event)}\n ariaLabel={`${messages.label} ${entry.sequence + 1}`}\n className={classNames?.activity}\n onApprovalDecision={onApprovalDecision}\n onArtifactOpen={onArtifactOpen}\n />\n );\n }\n const { message } = entry;\n const isUser = message.role === 'user';\n const isSystem = message.role === 'system';\n if (isSystem) {\n return (\n <div key={message.id} className={cn('text-center text-xs text-muted-foreground', classNames?.message)}>\n {renderMessageContent?.(message) ?? <DefaultMessageContent message={message} />}\n </div>\n );\n }\n return (\n <article\n key={message.id}\n className={cn('flex items-start gap-3', isUser && 'flex-row-reverse', classNames?.message)}\n data-message-role={message.role}\n >\n <span className={cn('flex size-8 shrink-0 items-center justify-center rounded-full', isUser ? 'bg-primary text-primary-foreground' : 'bg-muted text-foreground')} aria-hidden=\"true\">\n <span className=\"size-2 rounded-full bg-current\" />\n </span>\n <div className={cn(\n 'min-w-0 max-w-[85%] rounded-2xl px-4 py-2.5 text-sm leading-6',\n isUser ? 'bg-primary text-primary-foreground' : 'bg-card text-card-foreground',\n classNames?.messageContent,\n )}>\n {renderMessageContent?.(message) ?? <DefaultMessageContent message={message} />}\n </div>\n </article>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';\nimport {\n BookOpen,\n Check,\n ChevronRight,\n Circle,\n CircleAlert,\n Clock3,\n FileText,\n Loader2,\n Search,\n TerminalSquare,\n Wrench,\n} from 'lucide-react';\nimport {\n type ComponentType,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\n\nexport type AgentWorkbenchProcessStatus =\n | 'queued'\n | 'running'\n | 'waiting_approval'\n | 'completed'\n | 'failed'\n | 'stopped';\n\nexport interface AgentWorkbenchProcessProps {\n status: AgentWorkbenchProcessStatus;\n children: ReactNode;\n durationMs?: number;\n completedCount?: number;\n totalCount?: number;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n contentClassName?: string;\n label?: string;\n showStatusIcon?: boolean;\n}\n\nfunction formatDuration(durationMs: number): string {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1_000));\n const hours = Math.floor(totalSeconds / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;\n if (minutes === 0) return `${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n\nfunction isActive(status: AgentWorkbenchProcessStatus): boolean {\n return status === 'queued' || status === 'running' || status === 'waiting_approval';\n}\n\nexport function AgentWorkbenchProcess({\n status,\n children,\n durationMs,\n completedCount,\n totalCount,\n open,\n defaultOpen,\n onOpenChange,\n className,\n contentClassName,\n label,\n showStatusIcon = true,\n}: AgentWorkbenchProcessProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench;\n const controlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? isActive(status));\n const userChangedOpen = useRef(false);\n const previousStatus = useRef(status);\n const resolvedOpen = controlled ? open : internalOpen;\n\n useEffect(() => {\n if (controlled || userChangedOpen.current || previousStatus.current === status) return;\n previousStatus.current = status;\n setInternalOpen(isActive(status));\n }, [controlled, status]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n userChangedOpen.current = true;\n if (!controlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n };\n\n const duration = durationMs === undefined ? undefined : formatDuration(durationMs);\n const title = label ?? (\n isActive(status)\n ? messages.process.running\n : duration\n ? messages.process.processedFor({ duration })\n : messages.process.processed\n );\n const showCount = totalCount !== undefined && totalCount > 0;\n\n return (\n <CollapsiblePrimitive.Root\n open={resolvedOpen}\n onOpenChange={handleOpenChange}\n className={cn('group/process w-full min-w-0', className)}\n data-agent-process-status={status}\n >\n <CollapsiblePrimitive.Trigger\n className=\"flex min-h-9 w-full min-w-0 items-center gap-2 border-b border-border/70 py-2 text-left text-sm text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showStatusIcon ? (\n isActive(status) ? (\n <Loader2 className=\"size-4 shrink-0 animate-spin\" aria-hidden=\"true\" />\n ) : status === 'failed' ? (\n <CircleAlert className=\"size-4 shrink-0 text-destructive-text\" aria-hidden=\"true\" />\n ) : (\n <Clock3 className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n )\n ) : null}\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n {showCount ? (\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-0.5 text-xs text-foreground\">\n {messages.process.completedCount({\n completed: completedCount ?? 0,\n total: totalCount,\n })}\n </span>\n ) : null}\n <ChevronRight\n className=\"size-4 shrink-0 transition-transform group-data-[state=open]/process:rotate-90\"\n aria-hidden=\"true\"\n />\n </CollapsiblePrimitive.Trigger>\n <CollapsiblePrimitive.Content\n className={cn(\n 'overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down',\n contentClassName,\n )}\n >\n <div className=\"flex min-w-0 flex-col gap-3 py-4\">{children}</div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n\nexport type AgentWorkbenchActionKind =\n | 'read'\n | 'search'\n | 'tool'\n | 'command'\n | 'file';\n\nexport type AgentWorkbenchActionStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'failed'\n | 'denied';\n\nexport interface AgentWorkbenchActionProps {\n summary: ReactNode;\n kind?: AgentWorkbenchActionKind;\n status?: AgentWorkbenchActionStatus;\n children?: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n icon?: ComponentType<{ className?: string; 'aria-hidden'?: boolean | 'true' }>;\n className?: string;\n contentClassName?: string;\n}\n\nconst ACTION_ICONS: Record<AgentWorkbenchActionKind, ComponentType<{ className?: string }>> = {\n read: BookOpen,\n search: Search,\n tool: Wrench,\n command: TerminalSquare,\n file: FileText,\n};\n\nfunction ActionStatusIcon({ status }: { status: AgentWorkbenchActionStatus }) {\n if (status === 'running' || status === 'pending') {\n return <Loader2 className=\"size-3.5 shrink-0 animate-spin\" aria-hidden=\"true\" />;\n }\n if (status === 'failed' || status === 'denied') {\n return <CircleAlert className=\"size-3.5 shrink-0 text-destructive-text\" aria-hidden=\"true\" />;\n }\n if (status === 'completed') {\n return <Check className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />;\n }\n return <Circle className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />;\n}\n\nexport function AgentWorkbenchAction({\n summary,\n kind = 'tool',\n status = 'completed',\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n icon,\n className,\n contentClassName,\n}: AgentWorkbenchActionProps) {\n const Icon = icon ?? ACTION_ICONS[kind];\n const row = (\n <>\n <Icon className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span className=\"min-w-0 flex-1 truncate\">{summary}</span>\n <ActionStatusIcon status={status} />\n {children ? (\n <ChevronRight\n className=\"size-3.5 shrink-0 transition-transform group-data-[state=open]/action:rotate-90\"\n aria-hidden=\"true\"\n />\n ) : null}\n </>\n );\n\n if (!children) {\n return (\n <div\n className={cn('flex min-h-7 min-w-0 items-center gap-2 text-[13px] text-muted-foreground', className)}\n data-agent-action-status={status}\n >\n {row}\n </div>\n );\n }\n\n return (\n <CollapsiblePrimitive.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n className={cn('group/action min-w-0', className)}\n data-agent-action-status={status}\n >\n <CollapsiblePrimitive.Trigger className=\"flex min-h-7 w-full min-w-0 items-center gap-2 text-left text-[13px] text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\">\n {row}\n </CollapsiblePrimitive.Trigger>\n <CollapsiblePrimitive.Content className=\"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n <div className={cn('ml-6 mt-2 min-w-0 border-l border-border pl-3', contentClassName)}>{children}</div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport {\n File,\n FileCode2,\n FileImage,\n FileText,\n Film,\n Globe2,\n Link2,\n ListFilter,\n Music2,\n Presentation,\n} from 'lucide-react';\nimport type { ComponentType } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport type {\n AgentWorkbenchArtifactItem,\n AgentWorkbenchArtifactKind,\n} from './artifact-model';\n\nexport interface AgentWorkbenchArtifactSummaryProps {\n artifacts: readonly AgentWorkbenchArtifactItem[];\n open?: boolean;\n defaultOpen?: boolean;\n maxItemsPerGroup?: number;\n showAll?: boolean;\n className?: string;\n contentClassName?: string;\n onOpenChange?: (open: boolean) => void;\n onArtifactOpen?: (artifact: AgentWorkbenchArtifactItem) => void;\n onViewAll?: () => void;\n}\n\nconst ARTIFACT_ICONS: Record<AgentWorkbenchArtifactKind, ComponentType<{ className?: string }>> = {\n audio: Music2,\n file: File,\n html: FileCode2,\n image: FileImage,\n markdown: FileText,\n pdf: FileText,\n presentation: Presentation,\n video: Film,\n web: Globe2,\n};\n\nfunction ArtifactThumbnail({ artifact }: { artifact: AgentWorkbenchArtifactItem }) {\n if (artifact.thumbnailUrl) {\n return (\n <img\n src={artifact.thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n className=\"size-7 rounded object-cover\"\n />\n );\n }\n const Icon = ARTIFACT_ICONS[artifact.kind];\n return (\n <span className=\"flex size-7 items-center justify-center rounded bg-muted text-muted-foreground\">\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n );\n}\n\nfunction ArtifactGroup({\n title,\n artifacts,\n maxItems,\n onArtifactOpen,\n}: {\n title: string;\n artifacts: readonly AgentWorkbenchArtifactItem[];\n maxItems: number;\n onArtifactOpen?: (artifact: AgentWorkbenchArtifactItem) => void;\n}) {\n return (\n <section className=\"flex min-w-0 flex-col gap-2\">\n <div role=\"heading\" aria-level={2} className=\"text-sm font-medium text-muted-foreground\">{title}</div>\n {artifacts.slice(0, maxItems).map((artifact) => (\n <button\n key={artifact.id}\n type=\"button\"\n className=\"flex min-w-0 items-center gap-2 rounded-md px-0.5 py-0.5 text-left text-sm outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-default\"\n disabled={!onArtifactOpen || artifact.status === 'loading'}\n onClick={() => onArtifactOpen?.(artifact)}\n >\n <ArtifactThumbnail artifact={artifact} />\n <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">{artifact.name}</span>\n </button>\n ))}\n </section>\n );\n}\n\nexport function AgentWorkbenchArtifactSummary({\n artifacts,\n open,\n defaultOpen = false,\n maxItemsPerGroup = 3,\n showAll = false,\n className,\n contentClassName,\n onOpenChange,\n onArtifactOpen,\n onViewAll,\n}: AgentWorkbenchArtifactSummaryProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.artifactWorkspace;\n const outputs = artifacts.filter((artifact) => artifact.origin === 'output');\n const sources = artifacts.filter((artifact) => artifact.origin === 'source');\n if (artifacts.length === 0) return null;\n\n return (\n <PopoverPrimitive.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <PopoverPrimitive.Trigger\n type=\"button\"\n className={cn(\n 'flex size-9 items-center justify-center rounded-xl bg-muted text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:text-foreground',\n className,\n )}\n aria-label={messages.toggleSummary}\n >\n <ListFilter className=\"size-4\" aria-hidden=\"true\" />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Content\n aria-label={messages.toggleSummary}\n side=\"bottom\"\n align=\"end\"\n sideOffset={8}\n collisionPadding={12}\n className={cn(\n 'z-50 w-[min(22rem,calc(100vw-1.5rem))] rounded-3xl border border-border bg-popover p-4 text-popover-foreground shadow-xl outline-none',\n contentClassName,\n )}\n >\n <div className=\"flex max-h-[min(34rem,calc(100vh-5rem))] min-w-0 flex-col gap-4 overflow-y-auto\">\n {outputs.length > 0 ? (\n <ArtifactGroup\n title={messages.outputs}\n artifacts={outputs}\n maxItems={showAll ? outputs.length : maxItemsPerGroup}\n onArtifactOpen={onArtifactOpen}\n />\n ) : null}\n {outputs.length > 0 && sources.length > 0 ? <div className=\"h-px bg-border\" /> : null}\n {sources.length > 0 ? (\n <ArtifactGroup\n title={messages.sources}\n artifacts={sources}\n maxItems={showAll ? sources.length : maxItemsPerGroup}\n onArtifactOpen={onArtifactOpen}\n />\n ) : null}\n {onViewAll && !showAll && (outputs.length > maxItemsPerGroup || sources.length > maxItemsPerGroup) ? (\n <button\n type=\"button\"\n className=\"flex min-h-8 items-center gap-2 rounded-md text-sm text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={onViewAll}\n >\n <Link2 className=\"size-4\" aria-hidden=\"true\" />\n <span>{messages.viewAll}</span>\n </button>\n ) : null}\n </div>\n <PopoverPrimitive.Arrow className=\"fill-popover\" />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Root>\n );\n}\n","import {\n closestCenter,\n DndContext,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n horizontalListSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport {\n Download,\n ExternalLink,\n File,\n FileCode2,\n FileImage,\n FileText,\n Film,\n Globe2,\n Music2,\n PanelRightClose,\n Presentation,\n X,\n} from 'lucide-react';\nimport type { ComponentType, KeyboardEvent, MouseEvent, ReactNode } from 'react';\n\nimport { useMonkeysLocaleMessages } from '../../provider';\nimport { cn } from '../layout';\nimport type {\n AgentWorkbenchArtifactItem,\n AgentWorkbenchArtifactKind,\n AgentWorkbenchArtifactWorkspaceIntent,\n} from './artifact-model';\n\nexport interface AgentWorkbenchArtifactWorkspaceProps {\n artifacts: readonly AgentWorkbenchArtifactItem[];\n activeArtifactId?: string;\n className?: string;\n renderArtifact: (artifact: AgentWorkbenchArtifactItem) => ReactNode;\n onIntent?: (intent: AgentWorkbenchArtifactWorkspaceIntent) => void;\n}\n\nconst ARTIFACT_ICONS: Record<AgentWorkbenchArtifactKind, ComponentType<{ className?: string }>> = {\n audio: Music2,\n file: File,\n html: FileCode2,\n image: FileImage,\n markdown: FileText,\n pdf: FileText,\n presentation: Presentation,\n video: Film,\n web: Globe2,\n};\n\nfunction SortableArtifactTab({\n artifact,\n selected,\n onClose,\n}: {\n artifact: AgentWorkbenchArtifactItem;\n selected: boolean;\n onClose: () => void;\n}) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.artifactWorkspace;\n const Icon = ARTIFACT_ICONS[artifact.kind];\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({\n id: artifact.id,\n });\n const { role: _sortableRole, tabIndex: _sortableTabIndex, ...sortableA11y } = attributes;\n const setTabRef = (node: HTMLButtonElement | null) => {\n setNodeRef(node);\n setActivatorNodeRef(node);\n };\n const handleMouseDown = (event: MouseEvent<HTMLButtonElement>) => {\n if (event.button !== 1) return;\n event.preventDefault();\n onClose();\n };\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (!(event.target instanceof Element) || !event.target.closest('[data-close-artifact-tab]')) return;\n event.preventDefault();\n onClose();\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n listeners?.onKeyDown?.(event);\n if (event.key !== 'Delete' && event.key !== 'Backspace') return;\n event.preventDefault();\n onClose();\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={setTabRef}\n value={artifact.id}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={cn(\n 'group/tab relative flex h-9 max-w-56 shrink-0 items-center gap-2 rounded-lg pl-3 pr-8 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:bg-background/60',\n isDragging && 'opacity-60',\n )}\n onMouseDown={handleMouseDown}\n onClick={handleClick}\n {...sortableA11y}\n {...listeners}\n onKeyDown={handleKeyDown}\n >\n <Icon className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{artifact.name}</span>\n <span\n className=\"absolute right-1.5 flex size-6 items-center justify-center rounded-md opacity-0 hover:bg-muted group-focus/tab:opacity-100 group-hover/tab:opacity-100 data-[selected=true]:opacity-100\"\n data-selected={selected}\n data-close-artifact-tab=\"\"\n title={messages.closeTab({ name: artifact.name })}\n aria-hidden=\"true\"\n >\n <X className=\"size-3.5\" aria-hidden=\"true\" />\n </span>\n </TabsPrimitive.Trigger>\n );\n}\n\nexport function AgentWorkbenchArtifactWorkspace({\n artifacts,\n activeArtifactId,\n className,\n renderArtifact,\n onIntent,\n}: AgentWorkbenchArtifactWorkspaceProps) {\n const messages = useMonkeysLocaleMessages().agentWorkbench.artifactWorkspace;\n const activeArtifact = artifacts.find((artifact) => artifact.id === activeArtifactId) ?? artifacts[0];\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n if (!activeArtifact) return null;\n\n const handleDragEnd = ({ active, over }: DragEndEvent) => {\n if (!over || active.id === over.id) return;\n onIntent?.({ type: 'reorder', artifactId: String(active.id), overArtifactId: String(over.id) });\n };\n\n return (\n <TabsPrimitive.Root\n value={activeArtifact.id}\n onValueChange={(artifactId) => onIntent?.({ type: 'select', artifactId })}\n className={cn('flex size-full min-h-0 min-w-0 flex-col bg-background text-foreground', className)}\n orientation=\"horizontal\"\n >\n <header className=\"relative z-10 flex h-12 shrink-0 items-center gap-2 border-b border-border bg-muted/50 px-2\">\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={artifacts.map((artifact) => artifact.id)} strategy={horizontalListSortingStrategy}>\n <TabsPrimitive.List\n className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n aria-label={messages.tabs}\n >\n {artifacts.map((artifact) => (\n <SortableArtifactTab\n key={artifact.id}\n artifact={artifact}\n selected={artifact.id === activeArtifact.id}\n onClose={() => onIntent?.({ type: 'close', artifactId: artifact.id })}\n />\n ))}\n </TabsPrimitive.List>\n </SortableContext>\n </DndContext>\n <div className=\"relative z-20 flex shrink-0 items-center gap-2\">\n {activeArtifact.url ? (\n <>\n <button\n type=\"button\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.download({ name: activeArtifact.name })}\n onClick={() => onIntent?.({ type: 'download', artifactId: activeArtifact.id })}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.openExternal({ name: activeArtifact.name })}\n onClick={() => onIntent?.({ type: 'open-external', artifactId: activeArtifact.id })}\n >\n <ExternalLink className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </>\n ) : null}\n <button\n type=\"button\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={messages.closeWorkspace}\n onClick={() => onIntent?.({ type: 'close-workspace' })}\n >\n <PanelRightClose className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n </header>\n <div className=\"min-h-0 min-w-0 flex-1 overflow-hidden\">\n {artifacts.map((artifact) => (\n <TabsPrimitive.Content\n key={artifact.id}\n value={artifact.id}\n className=\"size-full min-h-0 min-w-0 outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n {artifact.id === activeArtifact.id ? renderArtifact(artifact) : null}\n </TabsPrimitive.Content>\n ))}\n </div>\n </TabsPrimitive.Root>\n );\n}\n"]}
|