@xopcai/xopc 0.0.47 → 0.0.49

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.
Files changed (98) hide show
  1. package/dist/extensions/dingtalk/src/accounts.js +1 -1
  2. package/dist/extensions/dingtalk/src/accounts.js.map +1 -1
  3. package/dist/extensions/dingtalk/src/merge-config.js +1 -1
  4. package/dist/extensions/dingtalk/src/merge-config.js.map +1 -1
  5. package/dist/extensions/dingtalk/src/plugin.js +1 -1
  6. package/dist/extensions/dingtalk/src/plugin.js.map +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js +8 -8
  8. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  9. package/dist/extensions/feishu/src/adapters/onboard-cli.js +8 -8
  10. package/dist/extensions/feishu/src/adapters/onboard-cli.js.map +1 -1
  11. package/dist/extensions/feishu/src/plugin.js +1 -1
  12. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  13. package/dist/extensions/feishu/src/schema/config-schema.js +2 -2
  14. package/dist/extensions/feishu/src/schema/config-schema.js.map +1 -1
  15. package/dist/extensions/feishu/src/state/accounts.js +1 -1
  16. package/dist/extensions/feishu/src/state/accounts.js.map +1 -1
  17. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +82 -36
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
  19. package/dist/extensions/telegram/src/command-handler.js +1 -1
  20. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  21. package/dist/extensions/telegram/xopc.extension.json +1 -1
  22. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  23. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  24. package/dist/extensions/weixin/src/config-schema.js +2 -2
  25. package/dist/extensions/weixin/src/config-schema.js.map +1 -1
  26. package/dist/extensions/weixin/src/config-surface.js +1 -1
  27. package/dist/extensions/weixin/src/config-surface.js.map +1 -1
  28. package/dist/extensions/weixin/src/messaging/process-message.js +2 -2
  29. package/dist/extensions/weixin/src/messaging/process-message.js.map +1 -1
  30. package/dist/extensions/weixin/src/plugin.js +1 -1
  31. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  32. package/dist/gateway/static/root/assets/{agents-DdWPgyn-.js → agents-CQllyJhj.js} +2 -2
  33. package/dist/gateway/static/root/assets/{agents-DdWPgyn-.js.map → agents-CQllyJhj.js.map} +1 -1
  34. package/dist/gateway/static/root/assets/{apps-page-BTi_W1y1.js → apps-page-BWI3RVMh.js} +2 -2
  35. package/dist/gateway/static/root/assets/{apps-page-BTi_W1y1.js.map → apps-page-BWI3RVMh.js.map} +1 -1
  36. package/dist/gateway/static/root/assets/channels-settings-rfmhXfC4.js +2 -0
  37. package/dist/gateway/static/root/assets/channels-settings-rfmhXfC4.js.map +1 -0
  38. package/dist/gateway/static/root/assets/{cron-dreaming-jobs-DinMur-Z.js → cron-dreaming-jobs-BzCQy56Z.js} +2 -2
  39. package/dist/gateway/static/root/assets/{cron-dreaming-jobs-DinMur-Z.js.map → cron-dreaming-jobs-BzCQy56Z.js.map} +1 -1
  40. package/dist/gateway/static/root/assets/{cron-page-Bu05Z2oL.js → cron-page-CjTuH_av.js} +2 -2
  41. package/dist/gateway/static/root/assets/{cron-page-Bu05Z2oL.js.map → cron-page-CjTuH_av.js.map} +1 -1
  42. package/dist/gateway/static/root/assets/{dist-wDej8fSi.js → dist-DIeOihYP.js} +2 -2
  43. package/dist/gateway/static/root/assets/{dist-wDej8fSi.js.map → dist-DIeOihYP.js.map} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-debug-page-CZBu7-zM.js → extension-debug-page-CR-4lZOn.js} +2 -2
  45. package/dist/gateway/static/root/assets/{extension-debug-page-CZBu7-zM.js.map → extension-debug-page-CR-4lZOn.js.map} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-page-CnOyLPrh.js → extension-page-BNwcYj2Q.js} +2 -2
  47. package/dist/gateway/static/root/assets/{extension-page-CnOyLPrh.js.map → extension-page-BNwcYj2Q.js.map} +1 -1
  48. package/dist/gateway/static/root/assets/{extension-settings-page-BOHn3S1a.js → extension-settings-page-CDpiZPV4.js} +2 -2
  49. package/dist/gateway/static/root/assets/{extension-settings-page-BOHn3S1a.js.map → extension-settings-page-CDpiZPV4.js.map} +1 -1
  50. package/dist/gateway/static/root/assets/{heartbeat-config-api-OqFXdrMO.js → heartbeat-config-api-CSbqK-L_.js} +2 -2
  51. package/dist/gateway/static/root/assets/{heartbeat-config-api-OqFXdrMO.js.map → heartbeat-config-api-CSbqK-L_.js.map} +1 -1
  52. package/dist/gateway/static/root/assets/{index-DeELk--t.js → index-D3sMd_aw.js} +11 -11
  53. package/dist/gateway/static/root/assets/{index-DeELk--t.js.map → index-D3sMd_aw.js.map} +1 -1
  54. package/dist/gateway/static/root/assets/{logs-page-DiN42-yE.js → logs-page-DLcWAXU5.js} +2 -2
  55. package/dist/gateway/static/root/assets/{logs-page-DiN42-yE.js.map → logs-page-DLcWAXU5.js.map} +1 -1
  56. package/dist/gateway/static/root/assets/{sessions-page-B5oxRfRm.js → sessions-page-Ck3lS3N_.js} +2 -2
  57. package/dist/gateway/static/root/assets/{sessions-page-B5oxRfRm.js.map → sessions-page-Ck3lS3N_.js.map} +1 -1
  58. package/dist/gateway/static/root/assets/{settings-page-DaRY3XEp.js → settings-page-Dp_eFgub.js} +2 -2
  59. package/dist/gateway/static/root/assets/{settings-page-DaRY3XEp.js.map → settings-page-Dp_eFgub.js.map} +1 -1
  60. package/dist/gateway/static/root/assets/{skills-page-BGDLiQZ6.js → skills-page-ClRj9e6K.js} +2 -2
  61. package/dist/gateway/static/root/assets/{skills-page-BGDLiQZ6.js.map → skills-page-ClRj9e6K.js.map} +1 -1
  62. package/dist/gateway/static/root/assets/{use-image-provider-credentials-DcP2SYn3.js → use-image-provider-credentials-DAi5Iu8c.js} +2 -2
  63. package/dist/gateway/static/root/assets/{use-image-provider-credentials-DcP2SYn3.js.map → use-image-provider-credentials-DAi5Iu8c.js.map} +1 -1
  64. package/dist/gateway/static/root/index.html +1 -1
  65. package/dist/package.js +1 -1
  66. package/dist/src/agent/goals/checklist-judge.js +21 -17
  67. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  68. package/dist/src/agent/goals/evaluate-turn.js +6 -11
  69. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  70. package/dist/src/agent/goals/judge.d.ts +16 -0
  71. package/dist/src/agent/goals/judge.js +61 -13
  72. package/dist/src/agent/goals/judge.js.map +1 -1
  73. package/dist/src/agent/goals/state.d.ts +7 -0
  74. package/dist/src/agent/goals/state.js +24 -1
  75. package/dist/src/agent/goals/state.js.map +1 -1
  76. package/dist/src/agent/service.js +2 -0
  77. package/dist/src/agent/service.js.map +1 -1
  78. package/dist/src/chat-commands/builtins/model.d.ts +2 -2
  79. package/dist/src/chat-commands/builtins/model.js +10 -8
  80. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  81. package/dist/src/chat-commands/builtins/system.js +1 -1
  82. package/dist/src/chat-commands/builtins/system.js.map +1 -1
  83. package/dist/src/gateway/hono/routes/channels.js +2 -2
  84. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  85. package/dist/src/gateway/hono/routes/config.js +3 -3
  86. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  87. package/dist/src/tui/backends/embedded-backend.d.ts +1 -1
  88. package/dist/src/tui/backends/embedded-backend.js +24 -3
  89. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  90. package/dist/src/tui/backends/gateway-sse-backend.js +36 -10
  91. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  92. package/dist/src/tui/tui-commands.js +1 -1
  93. package/dist/src/tui/tui-commands.js.map +1 -1
  94. package/dist/src/tui/tui.js +12 -1
  95. package/dist/src/tui/tui.js.map +1 -1
  96. package/package.json +1 -1
  97. package/dist/gateway/static/root/assets/channels-settings-CjUmKQrC.js +0 -2
  98. package/dist/gateway/static/root/assets/channels-settings-CjUmKQrC.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agents-DdWPgyn-.js","names":[],"sources":["../../../../../web/src/features/settings/agents/agent-delete-confirm-dialog.tsx","../../../../../web/src/features/settings/agents/agents-editor-sidebar.tsx","../../../../../web/src/features/settings/agents/agents-editor-modal.tsx","../../../../../web/src/features/settings/settings-form-section.tsx","../../../../../web/src/features/settings/agents/utils.ts","../../../../../web/src/features/settings/agents/tabs/agent-channels-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-cron-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-files-tab.tsx","../../../../../web/src/features/settings/agents/agent-avatar-picker.tsx","../../../../../web/src/features/settings/agents/bootstrap-parser.ts","../../../../../web/src/features/settings/agents/tabs/agent-overview-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-profile-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-skills-tab.tsx","../../../../../web/src/features/settings/agents/builtin-tool-disable-groups.ts","../../../../../web/src/features/settings/agents/defaults-field-styles.ts","../../../../../web/src/features/settings/agents/builtin-tools-disable-ui.tsx","../../../../../web/src/features/settings/agents/tabs/agent-tools-tab.tsx","../../../../../web/src/features/settings/agents/agents-editor-panel-content.tsx","../../../../../web/src/features/settings/agents/agents-list-grid.tsx","../../../../../web/src/features/settings/agents/agents-settings-header.tsx","../../../../../web/src/features/settings/agents/create-agent-dialog.tsx","../../../../../web/src/features/settings/agents/preset-agents.ts","../../../../../web/src/features/settings/agents/preset-agents-setup.tsx","../../../../../web/src/lib/agent-id.ts","../../../../../web/src/features/settings/suggest-agent-workspace.ts","../../../../../web/src/features/settings/dreaming-api.ts","../../../../../web/src/features/settings/agents/agents-settings-toolbar.tsx","../../../../../web/src/features/settings/agents/hooks/use-agents-bootstrap-files.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-channel-bindings.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-cron-jobs.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-skills-catalog.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-tools-skills-local-state.ts","../../../../../web/src/features/settings/agents/use-agents-settings-panel.tsx","../../../../../web/src/features/settings/agents/agents-settings-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-field.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/basics-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/browser-panel.tsx","../../../../../web/src/features/settings/agents/hooks/use-builtin-tool-ids.ts","../../../../../web/src/features/settings/agents/agent-defaults-panels/builtin-tools-disable-section.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/capabilities-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/context-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/expert-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/memory-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/skills-allowlist-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/system-prompt-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/workspace-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-route-layout.tsx","../../../../../web/src/features/settings/config-api.ts","../../../../../web/src/features/settings/agents/use-agent-defaults-form.ts","../../../../../web/src/features/settings/agents/agent-defaults-split-pages.tsx"],"sourcesContent":["import * as Dialog from '@radix-ui/react-dialog';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\n\nexport type AgentDeleteConfirmDialogProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n busy: boolean;\n deletePurge: boolean;\n deleteTarget: GatewayAgentRow | null;\n deleteConfirmText: string;\n onDeleteConfirmTextChange: (value: string) => void;\n onConfirm: () => void;\n onCancel: () => void;\n a: Pick<\n AgentsSettingsMessages,\n | 'purgeDisk'\n | 'removeFromConfig'\n | 'confirmDeletePurge'\n | 'confirmDelete'\n | 'purgeConfirmLabel'\n | 'purgeConfirmPlaceholder'\n | 'purgeConfirmHint'\n | 'createModalCancel'\n >;\n};\n\nexport function AgentDeleteConfirmDialog({\n open,\n onOpenChange,\n busy,\n deletePurge,\n deleteTarget,\n deleteConfirmText,\n onDeleteConfirmTextChange,\n onConfirm,\n onCancel,\n a,\n}: AgentDeleteConfirmDialogProps) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-[80] bg-scrim backdrop-blur-[2px]\" />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 z-[81] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover',\n 'dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">\n {deletePurge ? a.purgeDisk : a.removeFromConfig}\n </Dialog.Title>\n <Dialog.Description className=\"mt-2 whitespace-pre-wrap text-sm leading-relaxed text-fg-muted\">\n {deletePurge ? a.confirmDeletePurge : a.confirmDelete}\n </Dialog.Description>\n\n {deletePurge && deleteTarget ? (\n <div className=\"mt-3 space-y-3\">\n <label className=\"mb-2 block text-sm font-medium text-fg\" htmlFor=\"agent-delete-confirm\">\n {a.purgeConfirmLabel}\n </label>\n <input\n id=\"agent-delete-confirm\"\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n className={cn(\n 'w-full rounded-md border border-edge bg-surface-panel px-3 py-1.5 font-mono text-xs text-fg',\n 'placeholder:text-fg-subtle',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'dark:border-edge',\n )}\n placeholder={a.purgeConfirmPlaceholder.replace('{{agentId}}', deleteTarget.id)}\n value={deleteConfirmText}\n onChange={(e) => onDeleteConfirmTextChange(e.target.value)}\n />\n <p className=\"pt-0.5 text-xs text-fg-muted\">\n {a.purgeConfirmHint.replace('{{agentId}}', deleteTarget.id)}\n </p>\n </div>\n ) : null}\n\n <div className=\"mt-4 flex flex-wrap items-center justify-end gap-2 border-t border-edge-subtle/60 pt-3\">\n <Button type=\"button\" variant=\"ghost\" disabled={busy} onClick={onCancel}>\n {a.createModalCancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={\n deletePurge\n ? 'border-red-200 text-red-700 hover:bg-red-50 dark:border-red-900/60 dark:text-red-300 dark:hover:bg-red-950/40'\n : undefined\n }\n disabled={\n busy ||\n !deleteTarget ||\n (deletePurge && deleteConfirmText.trim().toLowerCase() !== deleteTarget.id.toLowerCase())\n }\n onClick={onConfirm}\n >\n {deletePurge ? a.purgeDisk : a.removeFromConfig}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { Clock, FileText, Plug, Puzzle, User, UserCircle, Wrench } from 'lucide-react';\n\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nimport type { AgentPanel } from './utils';\n\nconst mainNav: { id: AgentPanel; labelKey: keyof AgentsSettingsMessages; icon: typeof User }[] = [\n { id: 'overview', labelKey: 'navIdentity', icon: User },\n { id: 'profile', labelKey: 'navProfile', icon: UserCircle },\n { id: 'tools', labelKey: 'navTools', icon: Wrench },\n { id: 'skills', labelKey: 'navSkills', icon: Puzzle },\n { id: 'files', labelKey: 'navCoreFiles', icon: FileText },\n];\n\nconst advancedNav: { id: AgentPanel; labelKey: keyof AgentsSettingsMessages; icon: typeof Plug }[] = [\n { id: 'channels', labelKey: 'tabChannels', icon: Plug },\n { id: 'cron', labelKey: 'tabCron', icon: Clock },\n];\n\nexport function AgentsEditorSidebar(props: {\n a: AgentsSettingsMessages;\n panel: AgentPanel;\n onPanelChange: (p: AgentPanel) => void;\n}) {\n const { a, panel, onPanelChange } = props;\n\n const item = (id: AgentPanel, label: string, Icon: typeof User) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => onPanelChange(id)}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors',\n panel === id\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n >\n <Icon className=\"size-4 shrink-0 opacity-90\" strokeWidth={2} aria-hidden />\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n\n return (\n <nav className=\"flex w-full flex-col gap-1\" aria-label={a.editorNavAria}>\n <div className=\"flex flex-col gap-0.5\">\n {mainNav.map(({ id, labelKey, icon }) => item(id, a[labelKey] as string, icon))}\n </div>\n <p className=\"mt-4 px-3 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle\">\n {a.navAdvanced}\n </p>\n <div className=\"flex flex-col gap-0.5\">\n {advancedNav.map(({ id, labelKey, icon }) => item(id, a[labelKey] as string, icon))}\n </div>\n </nav>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\n\nimport { AgentsEditorSidebar } from './agents-editor-sidebar';\nimport type { AgentPanel } from './utils';\n\nexport function AgentsEditorModal(props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n a: AgentsSettingsMessages;\n title: string;\n subtitle: string;\n panel: AgentPanel;\n onPanelChange: (p: AgentPanel) => void;\n onFooterSave: () => void;\n footerSaveDisabled: boolean;\n /** Brief \"Saved\" flash after a successful save. */\n footerSavedFlash?: boolean;\n busy: boolean;\n children: ReactNode;\n}) {\n const {\n open,\n onOpenChange,\n a,\n title,\n subtitle,\n panel,\n onPanelChange,\n onFooterSave,\n footerSaveDisabled,\n footerSavedFlash,\n busy,\n children,\n } = props;\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n /* Desktop: roomy editor; inner panels scroll. Small viewports stay inset. */\n 'inset-4 h-[calc(100dvh-2rem)] max-h-[calc(100dvh-2rem)] min-h-0',\n 'sm:inset-auto sm:left-1/2 sm:top-1/2 sm:h-[min(88vh,48rem)] sm:max-h-[min(88vh,48rem)] sm:min-h-[32rem] sm:w-[min(100%-2rem,58rem)] sm:-translate-x-1/2 sm:-translate-y-1/2',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-2 border-b border-edge-subtle px-4 pb-3 pt-4 dark:border-edge\">\n <div className=\"min-w-0 pr-2\">\n <Dialog.Title className=\"text-base font-semibold leading-snug text-fg\">{title}</Dialog.Title>\n <Dialog.Description className=\"mt-1 font-mono text-xs text-fg-muted\">{subtitle}</Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n aria-label={a.closeDialogAria}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col sm:flex-row sm:overflow-hidden\">\n <div className=\"shrink-0 border-b border-edge-subtle px-4 py-3 dark:border-edge sm:flex sm:w-56 sm:shrink-0 sm:flex-col sm:overflow-y-auto sm:border-b-0 sm:border-r sm:px-0 sm:py-4 sm:pl-4 sm:pr-3\">\n <AgentsEditorSidebar a={a} panel={panel} onPanelChange={onPanelChange} />\n </div>\n\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {/* Flex column + min-h-0 lets Tools/Skills lists fill remaining height and scroll inside */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-4 sm:pl-2 sm:pr-5\">\n {children}\n </div>\n <div className=\"flex shrink-0 flex-col gap-1 border-t border-edge-subtle px-4 py-3 dark:border-edge sm:flex-row sm:items-center sm:justify-end sm:gap-3\">\n {footerSavedFlash ? (\n <p className=\"order-2 text-center text-xs font-medium text-green-600 sm:order-1 sm:mr-auto sm:text-left dark:text-green-400\">\n ✓ {a.personaSaved}\n </p>\n ) : footerSaveDisabled ? (\n <p className=\"order-2 text-center text-xs text-fg-muted sm:order-1 sm:mr-auto sm:text-left\">\n {a.footerSaveNotApplicable}\n </p>\n ) : null}\n <Button\n type=\"button\"\n className=\"order-1 w-full sm:order-2 sm:w-auto\"\n disabled={busy || footerSaveDisabled}\n onClick={() => void onFooterSave()}\n >\n {a.save}\n </Button>\n </div>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport { Pencil } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '@/lib/cn';\n\n/**\n * Settings content sits on `bg-surface-panel`; grouped blocks use a recessed `bg-surface-base`\n * lift instead of heavy borders (design system §2.1, §4.2).\n */\nexport function settingsFormSectionClassName(): string {\n return 'rounded-2xl bg-surface-base px-4 py-5 sm:px-5';\n}\n\nexport function SettingsFormSection({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return <section className={cn(settingsFormSectionClassName(), className)}>{children}</section>;\n}\n\nconst settingsSectionHeaderIconShellClass =\n 'flex size-9 shrink-0 items-center justify-center rounded-lg bg-surface-hover/90 text-fg-muted transition-colors dark:bg-surface-hover/70';\n\nexport function SettingsFormSectionHeader({\n icon: Icon,\n title,\n subtitle,\n trailing,\n className,\n iconInteractive,\n iconLeading,\n}: {\n icon: LucideIcon;\n title: string;\n subtitle: string;\n /** Optional content rendered at the trailing (right) edge of the header. */\n trailing?: ReactNode;\n className?: string;\n /** When set, the leading icon is a button (e.g. open a related settings dialog). */\n iconInteractive?: { onClick: () => void; ariaLabel: string; id?: string };\n /** When set, replaces the default Lucide icon in the leading slot (same size as the icon box). */\n iconLeading?: ReactNode;\n}) {\n const defaultGlyph = <Icon className=\"size-4\" strokeWidth={1.75} aria-hidden />;\n const lead = iconLeading ?? defaultGlyph;\n\n const leadingInteractiveClass = iconLeading\n ? cn(\n 'flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-surface-panel p-0 ring-1 ring-inset ring-edge-subtle transition-[box-shadow] hover:ring-accent/40 dark:ring-edge-subtle',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n )\n : cn(\n settingsSectionHeaderIconShellClass,\n 'hover:text-fg',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n );\n\n const showAvatarEditPencil = Boolean(iconInteractive && iconLeading);\n\n return (\n <div className={cn('mb-5 flex items-start gap-3', className)}>\n {iconInteractive ? (\n showAvatarEditPencil ? (\n <span className=\"relative shrink-0\">\n <button\n type=\"button\"\n id={iconInteractive.id}\n onClick={iconInteractive.onClick}\n aria-label={iconInteractive.ariaLabel}\n className={leadingInteractiveClass}\n >\n {lead}\n </button>\n <span\n className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex size-4 items-center justify-center rounded-md border border-edge bg-surface-panel text-fg-muted shadow-sm dark:border-edge dark:bg-surface-base\"\n aria-hidden\n >\n <Pencil className=\"size-2.5\" strokeWidth={2.25} />\n </span>\n </span>\n ) : (\n <button\n type=\"button\"\n id={iconInteractive.id}\n onClick={iconInteractive.onClick}\n aria-label={iconInteractive.ariaLabel}\n className={leadingInteractiveClass}\n >\n {lead}\n </button>\n )\n ) : (\n <div\n className={cn(\n iconLeading\n ? 'flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-surface-panel ring-1 ring-inset ring-edge-subtle dark:ring-edge-subtle'\n : settingsSectionHeaderIconShellClass,\n )}\n aria-hidden={!iconLeading}\n >\n {lead}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-sm font-semibold text-fg\">{title}</h2>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{subtitle}</p>\n </div>\n {trailing ? <div className=\"shrink-0\">{trailing}</div> : null}\n </div>\n );\n}\n","import type { GatewayConfigBinding } from '@/features/settings/agents-admin-api';\nimport type { CronJob, SessionChatId } from '@/features/cron/cron-api';\nimport { cn } from '@/lib/cn';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\n\nexport type AgentPanel = 'overview' | 'profile' | 'files' | 'tools' | 'skills' | 'channels' | 'cron';\n\nexport function agentsSettingsInputClass(): string {\n return cn(\n 'w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\nexport function jobMatchesAgent(job: CronJob, agentId: string, defaultId: string): boolean {\n const raw = job.agentId?.trim().toLowerCase();\n if (raw) {\n return raw === agentId.toLowerCase();\n }\n return agentId.toLowerCase() === defaultId.toLowerCase();\n}\n\nexport function matchSummary(m: GatewayConfigBinding['match']): string {\n const parts = [m.channel, m.accountId, m.peerKind, m.peerId].filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return parts.join(' · ') || m.channel;\n}\n\n/** Build a `bindings[].match` for the add-binding form. Custom glob wins over session pick. */\nexport function buildNewBindingMatch(\n channel: string,\n customPeer: string,\n sessionIdx: number | null,\n sessions: SessionChatId[],\n): GatewayConfigBinding['match'] {\n const ch = channel.trim();\n const custom = customPeer.trim();\n if (custom) {\n return { channel: ch, peerId: custom };\n }\n if (sessionIdx != null) {\n const s = sessions[sessionIdx];\n if (!s) {\n return { channel: ch };\n }\n const m: GatewayConfigBinding['match'] = { channel: ch };\n if (s.accountId?.trim()) {\n m.accountId = s.accountId.trim();\n }\n if (s.peerKind?.trim()) {\n m.peerKind = s.peerKind.trim();\n }\n const peer = s.peerId?.trim() || s.chatId?.trim();\n if (peer) {\n m.peerId = peer;\n }\n return m;\n }\n return { channel: ch };\n}\n","import { Link2, RefreshCw } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayConfigBinding } from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport type { ChannelStatus, SessionChatId } from '@/features/cron/cron-api';\nimport { formatRecipientOptionLabel } from '@/features/cron/cron-utils';\nimport { selectControlBaseClass } from '@/lib/form-field-width';\nimport { agentsSettingsInputClass, matchSummary } from '../utils';\nimport type { AgentsSettingsMessages, MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\n\nconst channelsPeerIdSelectClass = cn(\n selectControlBaseClass,\n 'w-full text-xs sm:w-auto sm:min-w-[11rem] sm:max-w-[17rem] sm:shrink-0',\n);\n\ntype LastActiveLabels = MessageBundle['cron']['lastActiveLabels'];\n\nexport function AgentChannelsTab(props: {\n a: AgentsSettingsMessages;\n busy: boolean;\n bindingsLoading: boolean;\n agentBindings: GatewayConfigBinding[];\n onRemoveBinding: (rule: GatewayConfigBinding) => void;\n onAddBinding: (e: React.FormEvent) => void;\n channelStatuses: ChannelStatus[];\n channelsStatusLoading: boolean;\n useManualChannel: boolean;\n newBindChannel: string;\n setNewBindChannel: (v: string) => void;\n bindSessionChats: SessionChatId[];\n sessionsLoading: boolean;\n newBindSessionIdx: number | null;\n setNewBindSessionIdx: (v: number | null) => void;\n newBindCustomPeer: string;\n setNewBindCustomPeer: (v: string) => void;\n onRefreshSessions: () => void;\n lastActiveLabels: LastActiveLabels;\n /** Same copy as `cron.selectRecipient` — empty option in peer id dropdown. */\n selectRecipient: string;\n}) {\n const {\n a,\n busy,\n bindingsLoading,\n agentBindings,\n onRemoveBinding,\n onAddBinding,\n channelStatuses,\n channelsStatusLoading,\n useManualChannel,\n newBindChannel,\n setNewBindChannel,\n bindSessionChats,\n sessionsLoading,\n newBindSessionIdx,\n setNewBindSessionIdx,\n newBindCustomPeer,\n setNewBindCustomPeer,\n onRefreshSessions,\n lastActiveLabels,\n selectRecipient,\n } = props;\n\n const showPeerForm = !channelsStatusLoading && (useManualChannel || channelStatuses.length > 0);\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={Link2}\n title={a.channelsTitle}\n subtitle={a.channelsHint}\n />\n {bindingsLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.channelsLoading}</p>\n ) : agentBindings.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{a.channelsNone}</p>\n ) : (\n <ul className=\"flex flex-col gap-2 text-sm\">\n {agentBindings.map((b, i) => (\n <li\n key={`${b.match.channel}-${i}`}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-lg border border-edge bg-surface-panel px-3 py-2\"\n >\n <span className=\"font-mono text-xs\">{matchSummary(b.match)}</span>\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onRemoveBinding(b)}>\n {a.removeBinding}\n </Button>\n </li>\n ))}\n </ul>\n )}\n <form className=\"mt-4 flex flex-col gap-3\" onSubmit={onAddBinding}>\n {channelsStatusLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.channelsLoadingChannels}</p>\n ) : useManualChannel ? (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.channelLabel}</span>\n <input\n className={agentsSettingsInputClass()}\n value={newBindChannel}\n onChange={(e) => setNewBindChannel(e.target.value)}\n placeholder=\"telegram\"\n autoComplete=\"off\"\n />\n <p className=\"text-xs text-fg-muted\">{a.channelsManualChannelHint}</p>\n </label>\n ) : (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.channelLabel}</span>\n <select\n className={cn(agentsSettingsInputClass(), 'py-2')}\n value={newBindChannel}\n onChange={(e) => {\n setNewBindChannel(e.target.value);\n setNewBindSessionIdx(null);\n setNewBindCustomPeer('');\n }}\n >\n {channelStatuses.map((ch) => (\n <option key={ch.name} value={ch.name} disabled={!ch.enabled}>\n {ch.name} {!ch.enabled ? a.channelsDisabledSuffix : ''}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {showPeerForm && newBindChannel.trim() ? (\n <div className=\"flex flex-col gap-2 border-t border-edge-subtle pt-3 text-sm\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-fg-muted\">{a.channelsSessionLabel}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 gap-1 px-2 text-xs\"\n disabled={busy || sessionsLoading || !newBindChannel.trim()}\n title={a.channelsRefreshSessionsHint}\n onClick={() => onRefreshSessions()}\n >\n <RefreshCw className={cn('size-3.5', sessionsLoading && 'animate-spin')} strokeWidth={1.75} />\n {a.channelsRefreshSessions}\n </Button>\n </div>\n {sessionsLoading && bindSessionChats.length === 0 ? (\n <p className=\"text-xs text-fg-muted\">{a.channelsLoadingSessions}</p>\n ) : null}\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-fg-muted\">{a.channelsPeerFromSessions}</span>\n <select\n className={cn(agentsSettingsInputClass(), 'py-2')}\n value={newBindSessionIdx == null ? '' : String(newBindSessionIdx)}\n disabled={busy || !newBindChannel.trim() || Boolean(newBindCustomPeer.trim())}\n onChange={(e) => {\n const v = e.target.value;\n setNewBindSessionIdx(v === '' ? null : Number(v));\n }}\n >\n <option value=\"\">{a.channelsPeerAny}</option>\n {bindSessionChats.map((item, idx) => (\n <option key={`${item.channel}-${item.chatId}-${idx}`} value={String(idx)}>\n {formatRecipientOptionLabel(item, lastActiveLabels)}\n </option>\n ))}\n </select>\n </label>\n {bindSessionChats.length === 0 && newBindChannel.trim() && !sessionsLoading ? (\n <p className=\"text-xs text-fg-muted\">{a.channelsNoSessionsHint}</p>\n ) : null}\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-fg-muted\">{a.peerIdLabel}</span>\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-stretch sm:gap-2\">\n <input\n type=\"text\"\n className={cn(agentsSettingsInputClass(), 'min-w-0 w-full sm:flex-1')}\n value={newBindCustomPeer}\n onChange={(e) => {\n setNewBindCustomPeer(e.target.value);\n if (e.target.value.trim()) {\n setNewBindSessionIdx(null);\n }\n }}\n placeholder={a.channelsCustomPeerPlaceholder}\n autoComplete=\"off\"\n />\n <select\n className={channelsPeerIdSelectClass}\n value={newBindCustomPeer}\n onChange={(e) => {\n const v = e.target.value;\n if (v) {\n setNewBindCustomPeer(v);\n } else {\n setNewBindCustomPeer('');\n }\n setNewBindSessionIdx(null);\n }}\n >\n <option value=\"\">{selectRecipient}</option>\n {bindSessionChats.map((item) => (\n <option key={`${item.channel}-${item.chatId}`} value={item.chatId}>\n {formatRecipientOptionLabel(item, lastActiveLabels)}\n </option>\n ))}\n </select>\n </div>\n <p className=\"text-xs text-fg-muted\">{a.channelsCustomPeerHint}</p>\n </div>\n </div>\n ) : null}\n\n <div>\n <Button type=\"submit\" disabled={busy || !newBindChannel.trim() || channelsStatusLoading}>\n {a.addBinding}\n </Button>\n </div>\n </form>\n </SettingsFormSection>\n );\n}\n","import { AlarmClock } from 'lucide-react';\n\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport { cronJobBodyText, type CronJob } from '@/features/cron/cron-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nimport { agentsSettingsInputClass } from '../utils';\n\nexport function AgentCronTab(props: {\n a: AgentsSettingsMessages;\n data: { agents: GatewayAgentRow[] };\n selected: GatewayAgentRow;\n busy: boolean;\n cronLoading: boolean;\n agentCronJobs: CronJob[];\n onSetCronJobAgent: (job: CronJob, agentKey: string) => void;\n}) {\n const { a, data, busy, cronLoading, agentCronJobs, onSetCronJobAgent } = props;\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={AlarmClock}\n title={a.cronTitle}\n subtitle={a.cronHint}\n />\n {cronLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.cronLoading}</p>\n ) : agentCronJobs.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{a.cronNone}</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[32rem] border-collapse text-left text-sm\">\n <thead>\n <tr className=\"border-b border-edge text-fg-muted\">\n <th className=\"py-2 pr-3 font-medium\">{a.cronColSchedule}</th>\n <th className=\"py-2 pr-3 font-medium\">{a.cronColMessage}</th>\n <th className=\"py-2 pr-3 font-medium\">{a.cronColSession}</th>\n <th className=\"py-2 pr-3 font-medium\">{a.cronColAgent}</th>\n </tr>\n </thead>\n <tbody>\n {agentCronJobs.map((job) => {\n const usesDefaultAgent = !job.agentId?.trim();\n const value = usesDefaultAgent ? '' : job.agentId!.trim().toLowerCase();\n return (\n <tr key={job.id} className=\"border-b border-edge-subtle\">\n <td className=\"py-2 pr-3 font-mono text-xs\">{job.schedule}</td>\n <td className=\"max-w-[12rem] truncate py-2 pr-3 text-xs\" title={cronJobBodyText(job)}>\n {cronJobBodyText(job)}\n </td>\n <td className=\"py-2 pr-3 text-xs\">{job.sessionTarget ?? 'main'}</td>\n <td className=\"py-2 pr-3\">\n <select\n className={cn(agentsSettingsInputClass(), 'min-w-[8rem] py-1 text-xs')}\n value={value}\n disabled={busy || job.sessionTarget !== 'isolated'}\n onChange={(e) => void onSetCronJobAgent(job, e.target.value)}\n >\n <option value=\"\">{usesDefaultAgent ? a.cronAgentDefault : a.cronAgentClear}</option>\n {data.agents.map((ag) => (\n <option key={ag.id} value={ag.id}>\n {ag.id}\n </option>\n ))}\n </select>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </SettingsFormSection>\n );\n}\n","import { Eye, SquarePen } from 'lucide-react';\n\nimport { MarkdownEditor } from '@/components/markdown/markdown-editor';\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { useThemeStore } from '@/stores/theme-store';\n\nimport { agentsSettingsInputClass } from '../utils';\n\nexport function AgentFilesTab(props: {\n a: AgentsSettingsMessages;\n filesLoading: boolean;\n files: { files: { name: string; missing: boolean }[] } | null;\n activeFile: string | null;\n setActiveFile: (name: string) => void;\n bootstrapViewMode: 'edit' | 'preview';\n setBootstrapViewMode: (m: 'edit' | 'preview') => void;\n fileDraft: string;\n setFileDraft: (v: string) => void;\n fileSaving: boolean;\n bootstrapFileLoading: boolean;\n /** Bumps when bootstrap file body is loaded from the server (remounts CodeMirror). */\n bootstrapEditorNonce: number;\n}) {\n const {\n a,\n filesLoading,\n files,\n activeFile,\n setActiveFile,\n bootstrapViewMode,\n setBootstrapViewMode,\n fileDraft,\n setFileDraft,\n fileSaving,\n bootstrapFileLoading,\n bootstrapEditorNonce,\n } = props;\n\n const isDark = useThemeStore((s) => s.resolved === 'dark');\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 overflow-hidden\">\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.filesHint}</p>\n {filesLoading ? (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.filesLoading}</p>\n ) : files ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-hidden\">\n <nav\n className=\"flex shrink-0 flex-row flex-wrap gap-x-0.5 gap-y-0 border-b border-edge-subtle\"\n aria-label={a.tabFiles}\n >\n {files.files.map((f) => (\n <button\n key={f.name}\n type=\"button\"\n className={cn(\n '-mb-px shrink-0 border-b-2 border-transparent px-3 py-2 text-left font-mono text-xs whitespace-nowrap transition-colors',\n activeFile === f.name\n ? 'border-accent text-fg'\n : 'text-fg-muted hover:border-edge-subtle hover:text-fg',\n f.missing && 'opacity-60',\n )}\n onClick={() => setActiveFile(f.name)}\n >\n {f.name}\n {f.missing ? ` (${a.missing})` : ''}\n </button>\n ))}\n </nav>\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-2 overflow-hidden\">\n {activeFile ? (\n <>\n <div className=\"flex shrink-0 flex-wrap items-center justify-between gap-2\">\n <div\n className=\"inline-flex rounded-lg border border-edge bg-surface-panel p-0.5\"\n role=\"group\"\n aria-label={a.filesBootstrapEdit}\n >\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium',\n bootstrapViewMode === 'edit'\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover',\n )}\n onClick={() => setBootstrapViewMode('edit')}\n >\n <SquarePen className=\"size-3.5 shrink-0\" aria-hidden />\n {a.filesBootstrapEdit}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium',\n bootstrapViewMode === 'preview'\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover',\n )}\n onClick={() => setBootstrapViewMode('preview')}\n >\n <Eye className=\"size-3.5 shrink-0\" aria-hidden />\n {a.filesBootstrapPreview}\n </button>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-fg-muted\">\n {fileSaving ? <span>{a.filesSavingStatus}</span> : null}\n <span>{a.filesAutoSaveHint}</span>\n </div>\n </div>\n {bootstrapViewMode === 'edit' ? (\n <div\n className={cn(\n agentsSettingsInputClass(),\n 'flex min-h-0 flex-1 flex-col overflow-hidden p-0',\n bootstrapFileLoading && 'pointer-events-none opacity-60',\n )}\n >\n <MarkdownEditor\n key={`${activeFile ?? 'file'}-${bootstrapEditorNonce}`}\n initialContent={fileDraft}\n onChange={setFileDraft}\n isDark={isDark}\n className=\"min-h-0 flex-1\"\n />\n </div>\n ) : (\n <div\n className={cn(\n agentsSettingsInputClass(),\n 'min-h-0 flex-1 overflow-y-auto text-sm',\n bootstrapFileLoading && 'pointer-events-none opacity-60',\n )}\n >\n <MarkdownView content={fileDraft} className=\"text-sm\" />\n </div>\n )}\n </>\n ) : (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.pickFile}</p>\n )}\n </div>\n </div>\n ) : (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.filesEmpty}</p>\n )}\n </div>\n );\n}\n","import * as Popover from '@radix-ui/react-popover';\nimport { Upload } from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nimport {\n deleteAgentAvatarFile,\n uploadAgentAvatarFile,\n} from '@/features/settings/agents-admin-api';\n\nimport { AgentAvatarDisplay } from './agent-avatar-display';\nimport {\n DICEBEAR_MORE_SEEDS,\n DICEBEAR_ROW_SEEDS,\n DICEBEAR_STYLE_ORDER,\n XOPC_CUSTOM_AVATAR,\n buildXopcDicebearValue,\n dicebearToDataUri,\n isDicebearStyleId,\n parseXopcDicebearValue,\n type DicebearStyleId,\n} from './agent-avatar-dicebear';\n\nfunction styleLabel(style: DicebearStyleId, a: AgentsSettingsMessages): string {\n switch (style) {\n case 'adventurer':\n return a.avatarStyleAdventurer;\n case 'bottts':\n return a.avatarStyleRobot;\n case 'lorelei':\n return a.avatarStyleLorelei;\n case 'thumbs':\n return a.avatarStyleThumbs;\n case 'fun-emoji':\n return a.avatarStyleFunEmoji;\n default:\n return style;\n }\n}\n\nexport function AgentAvatarPicker(props: {\n agentId: string;\n value: string;\n onChange: (next: string) => void;\n a: AgentsSettingsMessages;\n /** Optional root id (e.g. for scroll-into-view); omit when embedded in a dialog. */\n id?: string;\n}) {\n const { agentId, value, onChange, a, id } = props;\n const fileRef = useRef<HTMLInputElement>(null);\n const [uploadBusy, setUploadBusy] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [moreOpen, setMoreOpen] = useState(false);\n\n const activeStyle = useMemo((): DicebearStyleId => {\n const p = parseXopcDicebearValue(value.trim());\n if (p && isDicebearStyleId(p.styleId)) {\n return p.styleId;\n }\n return DICEBEAR_STYLE_ORDER[0] ?? 'adventurer';\n }, [value]);\n\n const pickDicebear = useCallback(\n async (styleId: DicebearStyleId, seed: string) => {\n try {\n await deleteAgentAvatarFile(agentId);\n } catch {\n /* best-effort: clear binary when switching away from custom */\n }\n onChange(buildXopcDicebearValue(styleId, seed));\n setMoreOpen(false);\n },\n [agentId, onChange],\n );\n\n const onFile = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) {\n return;\n }\n setUploadError(null);\n setUploadBusy(true);\n try {\n await uploadAgentAvatarFile(agentId, file);\n onChange(XOPC_CUSTOM_AVATAR);\n } catch (err) {\n const code = err instanceof Error ? err.message : '';\n if (code === 'avatar_too_large') {\n setUploadError(a.avatarTooLarge);\n } else if (code === 'unsupported_image_type' || code === 'empty_file') {\n setUploadError(a.avatarInvalidImage);\n } else {\n setUploadError(a.avatarUploadFailed);\n }\n } finally {\n setUploadBusy(false);\n }\n },\n [a, agentId, onChange],\n );\n\n const isRowSeedActive = (styleId: DicebearStyleId, seed: string) => {\n const p = parseXopcDicebearValue(value.trim());\n return Boolean(p && p.styleId === styleId && p.seed === seed);\n };\n\n return (\n <div {...(id ? { id } : {})} className=\"flex flex-col gap-3 sm:col-span-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-sm font-medium text-fg\">{a.avatarPickerTitle}</span>\n <div className=\"flex items-center gap-2\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,.png,.jpg,.jpeg,.webp\"\n className=\"hidden\"\n onChange={(ev) => void onFile(ev)}\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"gap-1.5 px-2.5 py-1.5 text-xs\"\n disabled={uploadBusy}\n onClick={() => fileRef.current?.click()}\n >\n <Upload className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n {uploadBusy ? a.avatarUploading : a.avatarUploadCustom}\n </Button>\n </div>\n </div>\n\n {uploadError ? <p className=\"text-xs text-red-600 dark:text-red-400\">{uploadError}</p> : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {DICEBEAR_STYLE_ORDER.map((id) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => void pickDicebear(id, DICEBEAR_ROW_SEEDS[0] ?? agentId)}\n className={cn(\n 'rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n activeStyle === id\n ? 'border-fg bg-fg text-surface-base'\n : 'border-edge-subtle bg-surface-panel text-fg hover:border-edge',\n )}\n >\n {styleLabel(id, a)}\n </button>\n ))}\n </div>\n\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel/50 p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {DICEBEAR_ROW_SEEDS.map((seed) => (\n <button\n key={seed}\n type=\"button\"\n title={seed}\n onClick={() => void pickDicebear(activeStyle, seed)}\n className={cn(\n 'flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-colors',\n isRowSeedActive(activeStyle, seed)\n ? 'border-accent ring-2 ring-accent/30'\n : 'border-transparent hover:border-edge',\n )}\n >\n <img\n src={dicebearToDataUri(activeStyle, seed, 96)}\n alt=\"\"\n width={44}\n height={44}\n className=\"size-11 rounded-full object-cover\"\n draggable={false}\n />\n </button>\n ))}\n\n <Popover.Root open={moreOpen} onOpenChange={setMoreOpen}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n className=\"flex size-12 shrink-0 items-center justify-center rounded-xl border border-edge-subtle bg-surface-base text-xs font-medium text-fg-muted hover:border-edge hover:text-fg\"\n >\n {a.avatarMore}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n className=\"z-[80] max-h-72 w-[min(22rem,calc(100vw-2rem))] overflow-y-auto rounded-xl border border-edge-subtle bg-surface-panel p-3 shadow-lg\"\n sideOffset={6}\n align=\"end\"\n >\n <p className=\"mb-2 text-xs font-medium text-fg-muted\">{styleLabel(activeStyle, a)}</p>\n <div className=\"flex flex-wrap gap-2\">\n {DICEBEAR_MORE_SEEDS.map((seed) => (\n <button\n key={seed}\n type=\"button\"\n title={seed}\n onClick={() => void pickDicebear(activeStyle, seed)}\n className={cn(\n 'flex size-11 shrink-0 items-center justify-center rounded-full border-2 transition-colors',\n isRowSeedActive(activeStyle, seed)\n ? 'border-accent ring-2 ring-accent/30'\n : 'border-transparent hover:border-edge',\n )}\n >\n <img\n src={dicebearToDataUri(activeStyle, seed, 88)}\n alt=\"\"\n width={40}\n height={40}\n className=\"size-10 rounded-full object-cover\"\n draggable={false}\n />\n </button>\n ))}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n\n <div className=\"mt-3 flex items-center gap-2 border-t border-edge-subtle pt-3\">\n <span className=\"text-xs text-fg-muted\">{a.personaAvatar}</span>\n <AgentAvatarDisplay agentId={agentId} avatar={value} size={40} />\n {value.trim() && !parseXopcDicebearValue(value.trim()) && value.trim() !== XOPC_CUSTOM_AVATAR ? (\n <span className=\"truncate font-mono text-[10px] text-fg-muted\" title={value}>\n {value}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Bidirectional parser for bootstrap Markdown files.\n *\n * Converts structured form fields ↔ Markdown content for IDENTITY.md, USER.md\n * and SOUL.md so that the persona tab can present friendly form inputs while\n * keeping the underlying Markdown format compatible with the agent runtime.\n */\n\n// ---------------------------------------------------------------------------\n// IDENTITY.md\n// ---------------------------------------------------------------------------\n\nexport interface IdentityFields {\n name: string;\n creature: string;\n emoji: string;\n avatar: string;\n}\n\nconst IDENTITY_DEFAULTS: IdentityFields = {\n name: '',\n creature: '',\n emoji: '',\n avatar: '',\n};\n\n/**\n * Parse IDENTITY.md content into structured fields.\n *\n * Handles the template format:\n * - **Name:** value\n * - **Creature:** value\n * - **Vibe:** value\n * - **Emoji:** value\n * - **Avatar:** value\n */\nexport function parseIdentityMarkdown(content: string): IdentityFields {\n const fields = { ...IDENTITY_DEFAULTS };\n if (!content.trim()) {\n return fields;\n }\n\n const fieldMap: Record<string, keyof IdentityFields> = {\n name: 'name',\n creature: 'creature',\n emoji: 'emoji',\n avatar: 'avatar',\n };\n\n for (const line of content.split('\\n')) {\n const match = line.match(/^[-*]\\s+\\*\\*(\\w+):\\*\\*\\s*(.*)/i);\n if (!match) {\n continue;\n }\n const label = match[1].toLowerCase();\n const fieldKey = fieldMap[label];\n if (!fieldKey) {\n continue;\n }\n let value = match[2].trim();\n // Strip template placeholders like _(pick something you like)_\n if (/^_\\(.*\\)_$/.test(value)) {\n value = '';\n }\n fields[fieldKey] = value;\n }\n\n return fields;\n}\n\n/**\n * Serialize structured identity fields back to IDENTITY.md Markdown.\n */\nexport function serializeIdentityMarkdown(fields: IdentityFields): string {\n const lines = [\n '# IDENTITY.md - Who Am I?',\n '',\n `- **Name:** ${fields.name}`,\n `- **Creature:** ${fields.creature}`,\n `- **Emoji:** ${fields.emoji}`,\n `- **Avatar:** ${fields.avatar}`,\n '',\n ];\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// USER.md (bootstrap)\n// ---------------------------------------------------------------------------\n\nexport interface UserFields {\n callName: string;\n pronouns: string;\n timezone: string;\n notes: string;\n}\n\nconst USER_DEFAULTS: UserFields = {\n callName: '',\n pronouns: '',\n timezone: '',\n notes: '',\n};\n\n/**\n * Parse bootstrap USER.md content into structured fields.\n *\n * Handles the template format:\n * - **Name:** value\n * - **What to call them:** value\n * - **Pronouns:** value\n * - **Timezone:** value\n * - **Notes:** value\n *\n * Also captures the Context section as free-text notes.\n */\nexport function parseUserMarkdown(content: string): UserFields {\n const fields = { ...USER_DEFAULTS };\n if (!content.trim()) {\n return fields;\n }\n\n const fieldMap: Record<string, keyof UserFields> = {\n name: 'callName',\n 'what to call them': 'callName',\n pronouns: 'pronouns',\n timezone: 'timezone',\n notes: 'notes',\n };\n\n const lines = content.split('\\n');\n let contextStartIndex = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Detect the ## Context section\n if (/^##\\s+Context/i.test(line)) {\n contextStartIndex = i + 1;\n continue;\n }\n\n const match = line.match(/^[-*]\\s+\\*\\*(.+?):\\*\\*\\s*(.*)/i);\n if (!match) {\n continue;\n }\n const label = match[1].toLowerCase().trim();\n const fieldKey = fieldMap[label];\n if (!fieldKey) {\n continue;\n }\n let value = match[2].trim();\n // Strip template placeholders like _(optional)_\n if (/^_\\(.*\\)_$/.test(value)) {\n value = '';\n }\n fields[fieldKey] = value;\n }\n\n // Capture context section content as extra notes\n if (contextStartIndex > 0) {\n const contextLines = lines.slice(contextStartIndex);\n const contextText = contextLines\n .join('\\n')\n .replace(/^_\\(.*?\\)_\\s*/gm, '') // strip template placeholders\n .replace(/^---\\s*$/gm, '') // strip trailing horizontal rules\n .replace(/The more you know.*$/s, '') // strip template footer\n .trim();\n\n if (contextText && !fields.notes) {\n fields.notes = contextText;\n }\n }\n\n return fields;\n}\n\n/**\n * Serialize structured user fields back to USER.md Markdown.\n */\nexport function serializeUserMarkdown(fields: UserFields): string {\n const lines = [\n '# USER.md - About Your Human',\n '',\n `- **Name:** ${fields.callName}`,\n `- **Pronouns:** ${fields.pronouns}`,\n `- **Timezone:** ${fields.timezone}`,\n '',\n ];\n\n if (fields.notes.trim()) {\n lines.push('## Context', '', fields.notes.trim(), '');\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// SOUL.md\n// ---------------------------------------------------------------------------\n\n/** Pre-defined soul templates for quick selection. */\nexport type SoulTemplateId = 'professional' | 'casual' | 'geeky' | 'custom';\n\nexport interface SoulTemplate {\n id: SoulTemplateId;\n labelEn: string;\n labelZh: string;\n emoji: string;\n content: string;\n}\n\nexport const SOUL_TEMPLATES: SoulTemplate[] = [\n {\n id: 'professional',\n labelEn: 'Professional & Efficient',\n labelZh: '专业高效',\n emoji: '🎯',\n content: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Be genuinely helpful, not performatively helpful.** Skip the filler words — just help. Actions speak louder than pleasantries.\n\n**Be precise and efficient.** Value the user's time. Give concise, actionable answers. Expand only when asked.\n\n**Earn trust through competence.** Be careful with external actions. Be bold with internal ones (reading, organizing, learning).\n\n**Remember you're a guest.** You have access to someone's life. Treat it with respect.\n\n## Boundaries\n\n- Private things stay private. Period.\n- When in doubt, ask before acting externally.\n- Never send half-baked replies to messaging surfaces.\n\n## Vibe\n\nProfessional, competent, and respectful. Concise when needed, thorough when it matters.`,\n },\n {\n id: 'casual',\n labelEn: 'Warm & Friendly',\n labelZh: '轻松友好',\n emoji: '😊',\n content: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Be a good friend, not a corporate drone.** Be warm, genuine, and real. Skip the formality when it gets in the way.\n\n**Have personality.** You're allowed to be amused, surprised, or excited. An assistant with no personality is just a search engine.\n\n**Be resourceful before asking.** Try to figure it out first. Then ask if you're stuck.\n\n**Earn trust by being reliable.** Show up, follow through, and remember what matters.\n\n**Respect the intimacy.** You have access to someone's life. That's a privilege.\n\n## Boundaries\n\n- Private things stay private. Always.\n- When in doubt, ask before acting externally.\n- Be careful in group chats — you're not the user's voice.\n\n## Vibe\n\nWarm, friendly, and a little playful. Like a helpful friend who happens to know everything.`,\n },\n {\n id: 'geeky',\n labelEn: 'Geeky & Witty',\n labelZh: '极客风格',\n emoji: '🧑‍💻',\n content: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Precision over politeness.** \"This is broken\" beats \"This might be worth considering.\" Be direct.\n\n**Have opinions.** Disagree, prefer things, find stuff interesting or dull. No personality = no value.\n\n**Go deep.** When something is interesting, explore it. Surface-level answers are for search engines.\n\n**Be resourceful.** Read the file. Check the context. Search for it. Come back with answers, not questions.\n\n**Earn trust through competence.** Be careful with external actions. Be bold with internal ones.\n\n## Boundaries\n\n- Private things stay private.\n- When in doubt, ask before acting externally.\n- Never send half-baked replies.\n\n## Vibe\n\nSharp, direct, slightly nerdy. The kind of engineer you'd want on your team — competent, opinionated, and occasionally funny.`,\n },\n {\n id: 'custom',\n labelEn: 'Custom',\n labelZh: '自定义',\n emoji: '✍️',\n content: '',\n },\n];\n\n/**\n * Strip YAML front matter (--- ... ---) from the beginning of Markdown content.\n */\nexport function stripFrontMatterForParsing(content: string): string {\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('---')) {\n return content;\n }\n const endIndex = trimmed.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n return trimmed.slice(endIndex + 3).trimStart();\n}\n\n/**\n * Detect which soul template best matches the current content.\n * Falls back to 'custom' if no template matches closely.\n */\nexport function detectSoulTemplate(content: string): SoulTemplateId {\n const stripped = stripFrontMatterForParsing(content).trim();\n if (!stripped) {\n return 'professional'; // default for empty content\n }\n\n // Compare against known templates by checking key phrases\n for (const template of SOUL_TEMPLATES) {\n if (template.id === 'custom') {\n continue;\n }\n // Check if the content closely matches the template\n const templateStripped = template.content.trim();\n if (stripped === templateStripped) {\n return template.id;\n }\n // Fuzzy: check for unique key phrases in each template\n const keyPhrases = getTemplateKeyPhrases(template.id);\n const matchCount = keyPhrases.filter((phrase) => stripped.includes(phrase)).length;\n if (matchCount >= 2) {\n return template.id;\n }\n }\n\n return 'custom';\n}\n\nfunction getTemplateKeyPhrases(id: SoulTemplateId): string[] {\n switch (id) {\n case 'professional':\n return ['precise and efficient', \"Value the user's time\", 'actionable answers'];\n case 'casual':\n return ['good friend', 'corporate drone', 'a little playful'];\n case 'geeky':\n return ['Precision over politeness', 'Go deep', 'slightly nerdy'];\n default:\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Timezone helpers\n// ---------------------------------------------------------------------------\n\n/** Common timezone options for the dropdown. */\nexport const TIMEZONE_OPTIONS = [\n { value: '', labelEn: 'Not set', labelZh: '未设置' },\n { value: 'Asia/Shanghai', labelEn: 'Asia/Shanghai (CST, UTC+8)', labelZh: '亚洲/上海 (北京时间, UTC+8)' },\n { value: 'Asia/Tokyo', labelEn: 'Asia/Tokyo (JST, UTC+9)', labelZh: '亚洲/东京 (日本时间, UTC+9)' },\n { value: 'Asia/Seoul', labelEn: 'Asia/Seoul (KST, UTC+9)', labelZh: '亚洲/首尔 (韩国时间, UTC+9)' },\n { value: 'Asia/Singapore', labelEn: 'Asia/Singapore (SGT, UTC+8)', labelZh: '亚洲/新加坡 (UTC+8)' },\n { value: 'Asia/Hong_Kong', labelEn: 'Asia/Hong Kong (HKT, UTC+8)', labelZh: '亚洲/香港 (UTC+8)' },\n { value: 'Asia/Taipei', labelEn: 'Asia/Taipei (CST, UTC+8)', labelZh: '亚洲/台北 (UTC+8)' },\n { value: 'Asia/Kolkata', labelEn: 'Asia/Kolkata (IST, UTC+5:30)', labelZh: '亚洲/加尔各答 (印度时间, UTC+5:30)' },\n { value: 'Asia/Dubai', labelEn: 'Asia/Dubai (GST, UTC+4)', labelZh: '亚洲/迪拜 (UTC+4)' },\n { value: 'Europe/London', labelEn: 'Europe/London (GMT/BST)', labelZh: '欧洲/伦敦 (格林尼治时间)' },\n { value: 'Europe/Paris', labelEn: 'Europe/Paris (CET, UTC+1)', labelZh: '欧洲/巴黎 (中欧时间, UTC+1)' },\n { value: 'Europe/Berlin', labelEn: 'Europe/Berlin (CET, UTC+1)', labelZh: '欧洲/柏林 (中欧时间, UTC+1)' },\n { value: 'Europe/Moscow', labelEn: 'Europe/Moscow (MSK, UTC+3)', labelZh: '欧洲/莫斯科 (UTC+3)' },\n { value: 'America/New_York', labelEn: 'America/New York (EST, UTC-5)', labelZh: '美国/纽约 (东部时间, UTC-5)' },\n { value: 'America/Chicago', labelEn: 'America/Chicago (CST, UTC-6)', labelZh: '美国/芝加哥 (中部时间, UTC-6)' },\n { value: 'America/Denver', labelEn: 'America/Denver (MST, UTC-7)', labelZh: '美国/丹佛 (山地时间, UTC-7)' },\n { value: 'America/Los_Angeles', labelEn: 'America/Los Angeles (PST, UTC-8)', labelZh: '美国/洛杉矶 (太平洋时间, UTC-8)' },\n { value: 'America/Sao_Paulo', labelEn: 'America/São Paulo (BRT, UTC-3)', labelZh: '美洲/圣保罗 (巴西时间, UTC-3)' },\n { value: 'Australia/Sydney', labelEn: 'Australia/Sydney (AEST, UTC+10)', labelZh: '澳大利亚/悉尼 (UTC+10)' },\n { value: 'Pacific/Auckland', labelEn: 'Pacific/Auckland (NZST, UTC+12)', labelZh: '太平洋/奥克兰 (新西兰时间, UTC+12)' },\n] as const;\n\n/**\n * Try to detect the user's timezone from the browser.\n */\nexport function detectBrowserTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return '';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Vibe presets\n// ---------------------------------------------------------------------------\n\nexport const VIBE_PRESETS = [\n { value: 'warm', labelEn: 'Warm', labelZh: '温暖' },\n { value: 'sharp', labelEn: 'Sharp', labelZh: '犀利' },\n { value: 'calm', labelEn: 'Calm', labelZh: '沉稳' },\n { value: 'playful', labelEn: 'Playful', labelZh: '活泼' },\n { value: 'professional', labelEn: 'Professional', labelZh: '专业' },\n { value: 'casual', labelEn: 'Casual', labelZh: '随意' },\n { value: 'witty', labelEn: 'Witty', labelZh: '机智' },\n { value: 'concise', labelEn: 'Concise', labelZh: '简洁' },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Creature presets\n// ---------------------------------------------------------------------------\n\nexport const PRONOUNS_PRESETS = [\n { value: '先生', labelEn: 'Mr.', labelZh: '先生' },\n { value: '女士', labelEn: 'Ms.', labelZh: '女士' },\n { value: '同学', labelEn: 'Colleague', labelZh: '同学' },\n { value: '老师', labelEn: 'Teacher', labelZh: '老师' },\n { value: '老板', labelEn: 'Boss', labelZh: '老板' },\n { value: '朋友', labelEn: 'Friend', labelZh: '朋友' },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Creature presets\n// ---------------------------------------------------------------------------\n\nexport const CREATURE_PRESETS = [\n { value: 'AI assistant', labelEn: 'AI Assistant', labelZh: 'AI 助手' },\n { value: 'robot', labelEn: 'Robot', labelZh: '机器人' },\n { value: 'familiar', labelEn: 'Familiar', labelZh: '精灵' },\n { value: 'ghost in the machine', labelEn: 'Ghost in the machine', labelZh: '机器幽灵' },\n { value: 'digital companion', labelEn: 'Digital Companion', labelZh: '数字伙伴' },\n] as const;\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { type MutableRefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { AlertTriangle, Cog, Eye, Pencil, Sparkles, Trash2, User, X } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { MarkdownEditor } from '@/components/markdown/markdown-editor';\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport {\n fetchAgentBootstrapFileContent,\n saveAgentBootstrapFileContent,\n} from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport type { AgentsSettingsMessages, ChatMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport {\n SETTINGS_SHELL_CONTENT_Z,\n SETTINGS_SHELL_OVERLAY_Z,\n SETTINGS_SHELL_POPOVER_Z,\n} from '@/lib/settings-shell-dialog-layer';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { useThemeStore } from '@/stores/theme-store';\n\nimport { AgentAvatarDisplay } from '../agent-avatar-display';\nimport { AgentAvatarPicker } from '../agent-avatar-picker';\nimport { agentsSettingsInputClass } from '../utils';\nimport {\n type IdentityFields,\n type SoulTemplateId,\n parseIdentityMarkdown,\n serializeIdentityMarkdown,\n detectSoulTemplate,\n SOUL_TEMPLATES,\n CREATURE_PRESETS,\n} from '../bootstrap-parser';\n\nexport function AgentOverviewTab(props: {\n a: AgentsSettingsMessages;\n chat: ChatMessages;\n selected: GatewayAgentRow | null;\n busy: boolean;\n editName: string;\n setEditName: (v: string) => void;\n editDescription: string;\n setEditDescription: (v: string) => void;\n editWorkspace: string;\n setEditWorkspace: (v: string) => void;\n editModel: string;\n setEditModel: (v: string) => void;\n onSetDefault: () => void;\n onSaveAgentEdits: () => void;\n onDelete: (purge: boolean) => void;\n hideInlineSave?: boolean;\n /** Parent writes a save-bootstrap callback into this ref so the modal footer can trigger it. */\n saveBootstrapRef?: MutableRefObject<(() => Promise<void>) | null>;\n /** Called when bootstrap-file dirty state changes. */\n onBootstrapDirtyChange?: (dirty: boolean) => void;\n}) {\n const {\n a,\n chat,\n selected,\n busy,\n editName,\n setEditName,\n editDescription,\n setEditDescription,\n editWorkspace,\n setEditWorkspace,\n editModel,\n setEditModel,\n onSetDefault,\n onSaveAgentEdits,\n onDelete,\n hideInlineSave,\n saveBootstrapRef,\n onBootstrapDirtyChange,\n } = props;\n\n const language = useLocaleStore((s) => s.language);\n const isDark = useThemeStore((s) => s.resolved === 'dark');\n\n // ---- Bootstrap file state ----\n const [bootstrapLoading, setBootstrapLoading] = useState(true);\n const [, setBootstrapSaving] = useState(false);\n\n const [identity, setIdentity] = useState<IdentityFields>({\n name: '',\n creature: '',\n emoji: '',\n avatar: '',\n });\n const [soulTemplate, setSoulTemplate] = useState<SoulTemplateId>('professional');\n const [soulCustomContent, setSoulCustomContent] = useState('');\n const [soulEditorNonce, setSoulEditorNonce] = useState(0);\n const [soulPreviewMode, setSoulPreviewMode] = useState(false);\n const [avatarDialogOpen, setAvatarDialogOpen] = useState(false);\n\n const initialLoadDoneRef = useRef(false);\n const agentIdRef = useRef(selected?.id ?? '');\n agentIdRef.current = selected?.id ?? '';\n\n // Snapshots for dirty tracking (set after load, reset after save)\n const identitySnapshotRef = useRef('');\n const soulSnapshotRef = useRef('');\n\n // ---- Load IDENTITY.md + SOUL.md ----\n useEffect(() => {\n if (!selected) return;\n let cancelled = false;\n initialLoadDoneRef.current = false;\n setBootstrapLoading(true);\n\n const load = async () => {\n try {\n const [identityMd, soulMd] = await Promise.all([\n fetchAgentBootstrapFileContent(selected.id, 'IDENTITY.md').catch(() => ''),\n fetchAgentBootstrapFileContent(selected.id, 'SOUL.md').catch(() => ''),\n ]);\n if (cancelled) return;\n const parsedIdentity = parseIdentityMarkdown(identityMd);\n setIdentity(parsedIdentity);\n identitySnapshotRef.current = JSON.stringify(parsedIdentity);\n setSoulTemplate(detectSoulTemplate(soulMd));\n setSoulCustomContent(soulMd);\n soulSnapshotRef.current = soulMd;\n setSoulEditorNonce((n) => n + 1);\n } finally {\n if (!cancelled) {\n setBootstrapLoading(false);\n initialLoadDoneRef.current = true;\n }\n }\n };\n void load();\n return () => {\n cancelled = true;\n };\n }, [selected?.id]);\n\n // ---- Save helpers (manual save only, triggered by footer button) ----\n const saveBootstrapFile = useCallback(async (fileName: string, content: string) => {\n setBootstrapSaving(true);\n try {\n await saveAgentBootstrapFileContent(agentIdRef.current, fileName, content);\n } finally {\n setBootstrapSaving(false);\n }\n }, []);\n\n // Refs to hold latest state for the save callback\n const identityRef = useRef(identity);\n identityRef.current = identity;\n const soulContentRef = useRef(soulCustomContent);\n soulContentRef.current = soulCustomContent;\n\n // Expose save function to parent for the footer save button\n useEffect(() => {\n if (!saveBootstrapRef) return;\n saveBootstrapRef.current = async () => {\n await Promise.all([\n saveBootstrapFile('IDENTITY.md', serializeIdentityMarkdown(identityRef.current)),\n saveBootstrapFile('SOUL.md', soulContentRef.current),\n ]);\n // Reset snapshots after successful save\n identitySnapshotRef.current = JSON.stringify(identityRef.current);\n soulSnapshotRef.current = soulContentRef.current;\n // Manually notify parent since state didn't change (only snapshot did)\n onBootstrapDirtyChange?.(false);\n };\n return () => {\n saveBootstrapRef.current = null;\n };\n }, [saveBootstrapRef, saveBootstrapFile, onBootstrapDirtyChange]);\n\n // Notify parent when bootstrap dirty state changes\n useEffect(() => {\n if (!onBootstrapDirtyChange) return;\n const identityDirty = JSON.stringify(identity) !== identitySnapshotRef.current;\n const soulDirty = soulCustomContent !== soulSnapshotRef.current;\n onBootstrapDirtyChange(identityDirty || soulDirty);\n }, [identity, soulCustomContent, onBootstrapDirtyChange]);\n\n const updateIdentity = useCallback((patch: Partial<IdentityFields>) => {\n setIdentity((prev) => ({ ...prev, ...patch }));\n }, []);\n\n const handleSoulTemplateChange = useCallback((templateId: SoulTemplateId) => {\n setSoulTemplate(templateId);\n if (templateId !== 'custom') {\n const tpl = SOUL_TEMPLATES.find((t) => t.id === templateId);\n if (tpl?.content) {\n setSoulCustomContent(tpl.content);\n setSoulEditorNonce((n) => n + 1);\n }\n }\n }, []);\n\n const handleSoulContentChange = useCallback((content: string) => {\n setSoulCustomContent(content);\n setSoulTemplate('custom');\n }, []);\n\n const locLabel = useCallback(\n (en: string, zh: string) => (language === 'zh' ? zh : en),\n [language],\n );\n\n const inputClass = agentsSettingsInputClass();\n\n if (!selected) {\n return <p className=\"text-sm text-fg-muted\">{a.selectAgentHint}</p>;\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto\">\n {/* ===== Section 1: Basic Identity ===== */}\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={Sparkles}\n title={a.personaSectionIdentity}\n subtitle={a.personaSectionIdentityHint}\n iconLeading={\n <AgentAvatarDisplay\n agentId={selected.id}\n avatar={identity.avatar}\n size={36}\n className=\"size-9 rounded-lg\"\n />\n }\n iconInteractive={{\n onClick: () => setAvatarDialogOpen(true),\n ariaLabel: a.avatarOpenSettingsAria,\n id: 'agent-avatar-settings',\n }}\n trailing={\n !selected.isDefault ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"text-xs\"\n disabled={busy}\n onClick={() => void onSetDefault()}\n >\n {a.setDefault}\n </Button>\n ) : null\n }\n />\n\n <Dialog.Root open={avatarDialogOpen} onOpenChange={setAvatarDialogOpen}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('fixed inset-0 bg-scrim backdrop-blur-[2px]', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 w-[min(calc(100vw-2rem),26rem)] max-h-[min(90dvh,36rem)] -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{a.avatarPickerTitle}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n aria-label={a.closeDialogAria}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n <Dialog.Description className=\"sr-only\">{a.avatarRowHint}</Dialog.Description>\n <AgentAvatarPicker\n agentId={selected.id}\n value={identity.avatar}\n onChange={(next) => updateIdentity({ avatar: next })}\n a={a}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {/* Name — single unified field */}\n <label className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.displayName}</span>\n <input\n className={inputClass}\n value={editName}\n onChange={(e) => {\n setEditName(e.target.value);\n updateIdentity({ name: e.target.value });\n }}\n placeholder={a.personaNamePlaceholder}\n autoComplete=\"off\"\n />\n </label>\n\n {/* Emoji */}\n <label className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaEmoji}</span>\n <input\n className={inputClass}\n value={identity.emoji}\n onChange={(e) => updateIdentity({ emoji: e.target.value })}\n placeholder={a.personaEmojiPlaceholder}\n autoComplete=\"off\"\n />\n </label>\n\n {/* Description */}\n <label className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.agentDescription}</span>\n <textarea\n className={cn(inputClass, 'min-h-16 resize-y text-sm leading-relaxed')}\n value={editDescription}\n onChange={(e) => setEditDescription(e.target.value)}\n placeholder={a.agentDescriptionPlaceholder}\n maxLength={4000}\n rows={3}\n spellCheck\n />\n </label>\n\n {/* Creature type — dropdown */}\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaCreature}</span>\n <select\n className={inputClass}\n value={CREATURE_PRESETS.some((p) => p.value === identity.creature) ? identity.creature : '__custom__'}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n updateIdentity({ creature: '' });\n return;\n }\n updateIdentity({ creature: e.target.value });\n }}\n >\n {CREATURE_PRESETS.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {locLabel(preset.labelEn, preset.labelZh)}\n </option>\n ))}\n <option value=\"__custom__\">{locLabel('Custom…', '自定义…')}</option>\n </select>\n {!CREATURE_PRESETS.some((p) => p.value === identity.creature) ? (\n <input\n className={cn(inputClass, 'mt-1 text-xs')}\n value={identity.creature}\n onChange={(e) => updateIdentity({ creature: e.target.value })}\n placeholder={a.personaCreaturePlaceholder}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n </div>\n </SettingsFormSection>\n\n {/* ===== Section 2: Runtime Configuration ===== */}\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Cog} title={a.editAgent} subtitle={a.editAgentHint} />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.modelPrimary}</span>\n <div className=\"flex flex-wrap items-stretch gap-2\">\n <ModelSelector\n className=\"min-w-0 flex-1\"\n popoverContentClassName={SETTINGS_SHELL_POPOVER_Z}\n value={editModel}\n disabled={busy}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(id) => setEditModel(id)}\n />\n {editModel.trim() ? (\n <Button type=\"button\" variant=\"secondary\" className=\"shrink-0\" disabled={busy} onClick={() => setEditModel('')}>\n {a.modelClear}\n </Button>\n ) : null}\n </div>\n </div>\n <label className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.workspacePath}</span>\n <input\n className={cn(inputClass, 'font-mono text-xs')}\n value={editWorkspace}\n onChange={(e) => setEditWorkspace(e.target.value)}\n />\n </label>\n </div>\n {!hideInlineSave ? (\n <div className=\"mt-4\">\n <Button type=\"button\" disabled={busy} onClick={() => void onSaveAgentEdits()}>\n {a.save}\n </Button>\n </div>\n ) : null}\n </SettingsFormSection>\n\n {/* ===== Section 3: Personality & Style ===== */}\n {bootstrapLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.loading}</p>\n ) : (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={User} title={a.personaSectionSoul} subtitle={a.personaSectionSoulHint} />\n {/* Soul template */}\n <div className=\"mb-4 flex flex-col gap-2\">\n <span className=\"text-sm font-medium text-fg\">{a.personaSoulTemplate}</span>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n {SOUL_TEMPLATES.map((template) => (\n <button\n key={template.id}\n type=\"button\"\n className={cn(\n 'flex flex-col items-center gap-1.5 rounded-xl border-2 px-3 py-3 text-center transition-all',\n soulTemplate === template.id\n ? 'border-accent bg-accent-soft/40 shadow-sm'\n : 'border-edge hover:border-accent/40 hover:bg-surface-hover',\n )}\n onClick={() => handleSoulTemplateChange(template.id)}\n >\n <span className=\"text-xl\">{template.emoji}</span>\n <span className=\"text-xs font-medium text-fg\">{locLabel(template.labelEn, template.labelZh)}</span>\n </button>\n ))}\n </div>\n </div>\n {soulTemplate === 'custom' ? (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium text-fg\">{a.personaSoulCustomEdit}</span>\n <button\n type=\"button\"\n className=\"inline-flex size-9 shrink-0 items-center justify-center rounded-md text-fg-muted transition-colors hover:bg-surface-hover hover:text-fg\"\n title={soulPreviewMode ? a.personaSoulEdit : a.personaSoulPreview}\n aria-label={soulPreviewMode ? a.personaSoulEdit : a.personaSoulPreview}\n onClick={() => setSoulPreviewMode((v) => !v)}\n >\n {soulPreviewMode ? <Pencil className=\"size-4\" aria-hidden /> : <Eye className=\"size-4\" aria-hidden />}\n </button>\n </div>\n <div className={cn(inputClass, 'flex min-h-64 flex-col overflow-hidden p-0')}>\n {soulPreviewMode ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4 py-3\">\n <MarkdownView content={soulCustomContent} />\n </div>\n ) : (\n <MarkdownEditor\n key={`soul-${soulEditorNonce}`}\n initialContent={soulCustomContent}\n onChange={handleSoulContentChange}\n isDark={isDark}\n className=\"min-h-0 flex-1\"\n />\n )}\n </div>\n </div>\n ) : null}\n </SettingsFormSection>\n )}\n\n {/* ===== Section 4: Danger Zone ===== */}\n {selected.id !== 'main' ? (\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={AlertTriangle}\n title={locLabel('Danger Zone', '危险操作')}\n subtitle={locLabel(\n 'Actions that cannot be undone. Be careful.',\n '以下操作不可撤销,请谨慎操作。',\n )}\n />\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onDelete(false)}>\n <Trash2 className=\"mr-1 size-4\" aria-hidden />\n {a.removeFromConfig}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"border-red-200 text-red-700 hover:bg-red-50 dark:border-red-900/60 dark:text-red-300 dark:hover:bg-red-950/40\"\n disabled={busy}\n onClick={() => void onDelete(true)}\n >\n {a.purgeDisk}\n </Button>\n </div>\n </SettingsFormSection>\n ) : null}\n </div>\n );\n}\n","import { Info, UserCircle } from 'lucide-react';\nimport { type MutableRefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport {\n fetchAgentBootstrapFileContent,\n saveAgentBootstrapFileContent,\n} from '@/features/settings/agents-admin-api';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { agentsSettingsInputClass } from '../utils';\nimport {\n type UserFields,\n parseUserMarkdown,\n serializeUserMarkdown,\n TIMEZONE_OPTIONS,\n PRONOUNS_PRESETS,\n detectBrowserTimezone,\n} from '../bootstrap-parser';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface ProfileTabProps {\n a: AgentsSettingsMessages;\n agentId: string;\n /** Parent writes a save callback into this ref so the modal footer can trigger it. */\n saveRef?: MutableRefObject<(() => Promise<void>) | null>;\n /** Called when dirty state changes. */\n onDirtyChange?: (dirty: boolean) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component — About You (USER.md)\n// ---------------------------------------------------------------------------\n\nexport function AgentProfileTab({ a, agentId, saveRef, onDirtyChange }: ProfileTabProps) {\n const language = useLocaleStore((s) => s.language);\n\n const [loading, setLoading] = useState(true);\n const [, setSaving] = useState(false);\n\n const [user, setUser] = useState<UserFields>({\n callName: '',\n pronouns: '',\n timezone: '',\n notes: '',\n });\n\n const [showCustomPronouns, setShowCustomPronouns] = useState(false);\n const [showCustomTimezone, setShowCustomTimezone] = useState(false);\n const [customTimezone, setCustomTimezone] = useState('');\n\n const initialLoadDoneRef = useRef(false);\n const agentIdRef = useRef(agentId);\n agentIdRef.current = agentId;\n\n // Snapshot for dirty tracking (set after load, reset after save)\n const userSnapshotRef = useRef('');\n\n // ---- Save helper (manual save only, triggered by footer button) ----\n const saveFile = useCallback(async (content: string) => {\n const currentAgent = agentIdRef.current;\n setSaving(true);\n try {\n await saveAgentBootstrapFileContent(currentAgent, 'USER.md', content);\n } finally {\n setSaving(false);\n }\n }, []);\n\n // Ref to hold latest user state for the save callback\n const userRef = useRef(user);\n userRef.current = user;\n\n // Expose save function to parent for the footer save button\n useEffect(() => {\n if (!saveRef) return;\n saveRef.current = async () => {\n await saveFile(serializeUserMarkdown(userRef.current));\n userSnapshotRef.current = JSON.stringify(userRef.current);\n // Manually notify parent since state didn't change (only snapshot did)\n onDirtyChange?.(false);\n };\n return () => {\n saveRef.current = null;\n };\n }, [saveRef, saveFile, onDirtyChange]);\n\n // Notify parent when dirty state changes\n useEffect(() => {\n if (!onDirtyChange) return;\n onDirtyChange(JSON.stringify(user) !== userSnapshotRef.current);\n }, [user, onDirtyChange]);\n\n // ---- Load USER.md on mount / agentId change ----\n useEffect(() => {\n let cancelled = false;\n initialLoadDoneRef.current = false;\n setLoading(true);\n\n const load = async () => {\n try {\n const userMd = await fetchAgentBootstrapFileContent(agentId, 'USER.md').catch(() => '');\n if (cancelled) return;\n\n const parsedUser = parseUserMarkdown(userMd);\n\n // Auto-detect timezone if not already set (saved when user clicks \"Save\")\n let effectiveUser = parsedUser;\n if (!parsedUser.timezone) {\n const detected = detectBrowserTimezone();\n if (detected) {\n effectiveUser = { ...parsedUser, timezone: detected };\n }\n }\n\n setUser(effectiveUser);\n userSnapshotRef.current = JSON.stringify(effectiveUser);\n\n // Custom pronouns handling\n const isKnownPronouns = !effectiveUser.pronouns || PRONOUNS_PRESETS.some((p) => p.value === effectiveUser.pronouns);\n if (effectiveUser.pronouns && !isKnownPronouns) {\n setShowCustomPronouns(true);\n }\n\n // Custom timezone handling\n const isKnownTimezone = TIMEZONE_OPTIONS.some((tz) => tz.value === effectiveUser.timezone);\n if (effectiveUser.timezone && !isKnownTimezone) {\n setShowCustomTimezone(true);\n setCustomTimezone(effectiveUser.timezone);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n initialLoadDoneRef.current = true;\n }\n }\n };\n\n void load();\n return () => {\n cancelled = true;\n };\n }, [agentId]);\n\n // ---- Field updater (local state only, saved via footer button) ----\n const updateUser = useCallback((patch: Partial<UserFields>) => {\n setUser((prev) => ({ ...prev, ...patch }));\n }, []);\n\n // ---- Timezone handling ----\n const handleTimezoneChange = useCallback(\n (value: string) => {\n if (value === '__custom__') {\n setShowCustomTimezone(true);\n return;\n }\n setShowCustomTimezone(false);\n setCustomTimezone('');\n updateUser({ timezone: value });\n },\n [updateUser],\n );\n\n const handleCustomTimezoneChange = useCallback(\n (value: string) => {\n setCustomTimezone(value);\n updateUser({ timezone: value });\n },\n [updateUser],\n );\n\n const handleDetectTimezone = useCallback(() => {\n const detected = detectBrowserTimezone();\n if (detected) {\n const isKnown = TIMEZONE_OPTIONS.some((tz) => tz.value === detected);\n if (isKnown) {\n setShowCustomTimezone(false);\n setCustomTimezone('');\n } else {\n setShowCustomTimezone(true);\n setCustomTimezone(detected);\n }\n updateUser({ timezone: detected });\n }\n }, [updateUser]);\n\n // ---- Effective timezone for select ----\n const timezoneSelectValue = (() => {\n if (showCustomTimezone) return '__custom__';\n const isKnown = TIMEZONE_OPTIONS.some((tz) => tz.value === user.timezone);\n return isKnown ? user.timezone : '__custom__';\n })();\n\n const locLabel = useCallback(\n (en: string, zh: string) => (language === 'zh' ? zh : en),\n [language],\n );\n\n if (loading) {\n return <p className=\"text-sm text-fg-muted\">{a.loading}</p>;\n }\n\n const inputClass = agentsSettingsInputClass();\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto\">\n <p className=\"text-sm text-fg-muted\">{a.personaSectionUserHint}</p>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={UserCircle}\n title={a.personaSectionUser}\n subtitle={a.personaSectionUserHint}\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {/* Call name */}\n <label className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaCallName}</span>\n <input\n className={inputClass}\n value={user.callName}\n onChange={(e) => updateUser({ callName: e.target.value })}\n placeholder={a.personaCallNamePlaceholder}\n autoComplete=\"off\"\n />\n </label>\n\n {/* Pronouns */}\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaPronouns}</span>\n <select\n className={inputClass}\n value={PRONOUNS_PRESETS.some((p) => p.value === user.pronouns) ? user.pronouns : '__custom__'}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setShowCustomPronouns(true);\n return;\n }\n setShowCustomPronouns(false);\n updateUser({ pronouns: e.target.value });\n }}\n >\n <option value=\"\" disabled>\n {a.personaPronounsPlaceholder}\n </option>\n {PRONOUNS_PRESETS.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {locLabel(preset.labelEn, preset.labelZh)}\n </option>\n ))}\n <option value=\"__custom__\">{locLabel('Custom…', '自定义…')}</option>\n </select>\n {showCustomPronouns ? (\n <input\n className={cn(inputClass, 'mt-1 text-xs')}\n value={PRONOUNS_PRESETS.some((p) => p.value === user.pronouns) ? '' : user.pronouns}\n onChange={(e) => updateUser({ pronouns: e.target.value })}\n placeholder={a.personaPronounsPlaceholder}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n\n {/* Timezone */}\n <div className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.personaTimezone}</span>\n <div className=\"flex flex-wrap items-stretch gap-2\">\n <select\n className={cn(inputClass, 'min-w-0 flex-1')}\n value={timezoneSelectValue}\n onChange={(e) => handleTimezoneChange(e.target.value)}\n >\n {TIMEZONE_OPTIONS.map((tz) => (\n <option key={tz.value} value={tz.value}>\n {locLabel(tz.labelEn, tz.labelZh)}\n </option>\n ))}\n <option value=\"__custom__\">{a.personaTimezoneCustom}</option>\n </select>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg border border-edge bg-surface-panel px-3 py-2 text-xs font-medium text-fg-muted hover:bg-surface-hover hover:text-fg\"\n onClick={handleDetectTimezone}\n >\n {a.personaTimezoneDetect}\n </button>\n </div>\n {showCustomTimezone ? (\n <input\n className={cn(inputClass, 'mt-1 font-mono text-xs')}\n value={customTimezone}\n onChange={(e) => handleCustomTimezoneChange(e.target.value)}\n placeholder=\"e.g. Asia/Shanghai\"\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n\n {/* Notes */}\n <label className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.personaNotes}</span>\n <textarea\n className={cn(inputClass, 'min-h-16 resize-y text-sm leading-relaxed')}\n value={user.notes}\n onChange={(e) => updateUser({ notes: e.target.value })}\n placeholder={a.personaNotesPlaceholder}\n rows={3}\n spellCheck\n />\n </label>\n </div>\n\n {/* Memory note */}\n <div className=\"mt-3 flex items-start gap-2 rounded-lg bg-accent-soft/30 px-3 py-2.5 text-xs text-fg-muted\">\n <Info className=\"mt-0.5 size-3.5 shrink-0 text-accent\" aria-hidden />\n <span>{a.personaMemoryNote}</span>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { BookOpen } from 'lucide-react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayAgentRow, SkillCatalogRow } from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { pathForTab } from '@/navigation';\n\nexport function AgentSkillsTab(props: {\n a: AgentsSettingsMessages;\n selected: GatewayAgentRow;\n busy: boolean;\n skillsCatalogLoading: boolean;\n catalogForPick: SkillCatalogRow[];\n skillsInherit: boolean;\n setSkillsInherit: (v: boolean) => void;\n skillsPick: Set<string>;\n setSkillsPick: Dispatch<SetStateAction<Set<string>>>;\n onSaveSkills: () => void;\n hideInlineSave?: boolean;\n}) {\n const {\n a,\n selected,\n busy,\n skillsCatalogLoading,\n catalogForPick,\n skillsInherit,\n setSkillsInherit,\n skillsPick,\n setSkillsPick,\n onSaveSkills,\n hideInlineSave,\n } = props;\n\n /** When inheriting defaults, checkboxes reflect the effective allowlist (undefined = all catalog skills). */\n function isCheckedInheritMode(id: string): boolean {\n const eff = selected.skills.effectiveAllowlist;\n if (eff === undefined) {\n return true;\n }\n if (eff.length === 0) {\n return false;\n }\n return eff.includes(id);\n }\n\n function initialPickForCustomize(): Set<string> {\n const eff = selected.skills.effectiveAllowlist;\n if (eff !== undefined) {\n return new Set(eff);\n }\n return new Set(catalogForPick.map((s) => s.name || s.directoryId));\n }\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={BookOpen}\n title={a.skillsTitle}\n subtitle={a.skillsHint}\n />\n <div className=\"flex shrink-0 flex-wrap items-center justify-between gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => setSkillsInherit(true)}>\n {a.skillsInherit}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={busy}\n onClick={() => {\n setSkillsInherit(false);\n setSkillsPick(initialPickForCustomize());\n }}\n >\n {a.skillsCustomize}\n </Button>\n </div>\n <Link\n to={pathForTab('skills')}\n className=\"shrink-0 text-xs font-medium text-accent-fg hover:underline\"\n >\n {a.skillsLibraryLink}\n </Link>\n </div>\n <p className=\"mt-2 shrink-0 text-xs text-fg-muted\">\n {a.skillsDefaultsLabel} {selected.skills.defaults.length ? selected.skills.defaults.join(', ') : '—'}\n </p>\n <p className=\"shrink-0 text-xs text-fg-muted\">\n {a.skillsEffectiveLabel}{' '}\n {selected.skills.effectiveAllowlist?.length\n ? selected.skills.effectiveAllowlist.join(', ')\n : a.skillsAllFromCatalog}\n </p>\n {skillsCatalogLoading ? (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.skillsCatalogLoading}</p>\n ) : catalogForPick.length === 0 ? (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.skillsEmptyCatalog}</p>\n ) : (\n <div\n className={cn(\n 'mt-3 min-h-0 flex-1 overflow-y-auto overscroll-contain pr-0.5',\n skillsInherit && 'opacity-50',\n )}\n >\n <ul className=\"flex flex-col gap-2.5 text-sm\" role=\"list\">\n {catalogForPick.map((s) => {\n const id = s.name || s.directoryId;\n const on = skillsInherit ? isCheckedInheritMode(id) : skillsPick.has(id);\n const desc = typeof s.description === 'string' ? s.description.trim() : '';\n const descLine = desc || a.skillsNoDescription;\n return (\n <li\n key={id}\n className=\"h-16 shrink-0 overflow-hidden rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 dark:border-edge-subtle\"\n >\n <label className=\"flex h-full cursor-pointer items-center gap-3 text-sm\">\n <input\n type=\"checkbox\"\n className=\"shrink-0 rounded border-edge\"\n checked={on}\n disabled={skillsInherit || busy}\n onChange={() => {\n setSkillsPick((prev) => {\n const next = new Set(prev);\n if (on) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n <div className=\"truncate font-mono text-xs font-medium text-fg\" title={id}>\n {id}\n </div>\n <p\n className={cn(\n 'mt-0.5 truncate text-xs leading-tight text-fg-muted',\n !desc && 'italic text-fg-subtle',\n )}\n title={descLine}\n >\n {descLine}\n </p>\n </div>\n </label>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n {!hideInlineSave ? (\n <div className=\"mt-4 shrink-0\">\n <Button type=\"button\" disabled={busy} onClick={() => void onSaveSkills()}>\n {a.skillsSave}\n </Button>\n </div>\n ) : null}\n </SettingsFormSection>\n );\n}\n","/**\n * UI grouping for gateway built-in tool ids (`GATEWAY_BUILTIN_TOOL_IDS`).\n * Any id returned by the gateway but not listed here appears under `misc`.\n */\nexport const BUILTIN_TOOL_UI_GROUPS = [\n {\n key: 'workspace',\n toolIds: ['read_file', 'write_file', 'edit_file', 'list_dir', 'grep', 'find'] as const,\n },\n { key: 'execution', toolIds: ['shell'] as const },\n { key: 'web', toolIds: ['web_search', 'web_fetch'] as const },\n { key: 'messaging', toolIds: ['send_message', 'send_media'] as const },\n {\n key: 'memory',\n toolIds: ['memory_search', 'memory_get', 'curated_memory', 'session_search'] as const,\n },\n { key: 'media', toolIds: ['image', 'image_generate'] as const },\n { key: 'extensions', toolIds: ['extensions'] as const },\n] as const;\n\nexport type BuiltinToolUiGroupKey = (typeof BUILTIN_TOOL_UI_GROUPS)[number]['key'] | 'misc' | 'unknown';\n\nconst ASSIGNED = new Set<string>(\n BUILTIN_TOOL_UI_GROUPS.flatMap((g) => [...g.toolIds].map((id) => String(id))),\n);\n\nexport function miscBuiltinToolIds(builtinToolIds: string[]): string[] {\n return builtinToolIds\n .filter((id) => id && !ASSIGNED.has(id))\n .sort((x, y) => x.localeCompare(y));\n}\n","import { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\n\nexport function inputClassName(): string {\n return cn(\n 'w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\nexport function selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\n/** Compact secondary actions (e.g. agent defaults: skills allowlist mode, tools disable presets). */\nexport const agentDefaultsQuickActionButtonClass =\n 'h-auto shrink-0 px-2.5 py-1.5 text-xs font-medium';\n","import { useCallback, useMemo } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\n\nimport { BUILTIN_TOOL_UI_GROUPS, miscBuiltinToolIds, type BuiltinToolUiGroupKey } from './builtin-tool-disable-groups';\nimport { agentDefaultsQuickActionButtonClass } from './defaults-field-styles';\n\n/** Preset ids are filtered against the live built-in list from the gateway. */\nconst PRESET_READ_ONLY_WORKSPACE = ['write_file', 'edit_file', 'shell'] as const;\nconst PRESET_HIGH_RISK = ['shell', 'image_generate', 'extensions'] as const;\nconst PRESET_NO_OUTBOUND = ['send_message', 'send_media'] as const;\n\nfunction sortedDisableList(ids: Set<string>): string[] {\n return [...ids].map((s) => s.trim()).filter(Boolean).sort((x, y) => x.localeCompare(y));\n}\n\nexport type BuiltinToolsDisableUiMode = 'defaults' | 'agentEntry';\n\nexport type BuiltinToolsDisableUiLabels = {\n loadingBuiltin: string;\n emptyBuiltin: string;\n quickActionsLabel: string;\n quickEnableAll: string;\n quickDisableAll: string;\n quickReadOnlyWorkspace: string;\n quickHighRiskOff: string;\n quickNoOutbound: string;\n notInBuiltin: string;\n lockedByDefaults: string;\n};\n\nexport type BuiltinToolsDisableUiProps = {\n mode: BuiltinToolsDisableUiMode;\n builtinToolIds: string[];\n loading: boolean;\n /** Disabled tool ids for this config scope (defaults or agents.list entry). */\n disableSet: Set<string>;\n onDisableSetChange: (next: Set<string>) => void;\n /** For `agentEntry`: tools disabled in `agents.defaults` — cannot be enabled from the entry editor. */\n defaultsDisableSet?: Set<string>;\n /** Extra disable ids not in `builtinToolIds` (defaults editor only). */\n unknownDisabledIds?: string[];\n getToolDescription: (toolId: string) => string;\n getGroupTitle: (groupKey: BuiltinToolUiGroupKey) => string;\n labels: BuiltinToolsDisableUiLabels;\n quickActionsDisabled?: boolean;\n};\n\nexport function BuiltinToolsDisableUi(props: BuiltinToolsDisableUiProps) {\n const {\n mode,\n builtinToolIds,\n loading,\n disableSet,\n onDisableSetChange,\n defaultsDisableSet,\n unknownDisabledIds = [],\n getToolDescription,\n getGroupTitle,\n labels,\n quickActionsDisabled = false,\n } = props;\n\n const allowedBuiltin = useMemo(() => new Set(builtinToolIds), [builtinToolIds]);\n const defaultsLock = defaultsDisableSet ?? new Set<string>();\n\n const setToolEnabled = useCallback(\n (tid: string, enabled: boolean) => {\n if (mode === 'agentEntry' && enabled && defaultsLock.has(tid)) {\n return;\n }\n const next = new Set(disableSet);\n if (enabled) {\n next.delete(tid);\n } else {\n next.add(tid);\n }\n onDisableSetChange(next);\n },\n [defaultsLock, disableSet, mode, onDisableSetChange],\n );\n\n const applyDisableExactly = useCallback(\n (ids: readonly string[]) => {\n const next = new Set<string>();\n for (const id of ids) {\n if (allowedBuiltin.has(id)) {\n next.add(id);\n }\n }\n onDisableSetChange(next);\n },\n [allowedBuiltin, onDisableSetChange],\n );\n\n const enableAllTools = useCallback(() => {\n onDisableSetChange(new Set());\n }, [onDisableSetChange]);\n\n const disableAllListed = useCallback(() => {\n const next = new Set<string>([...builtinToolIds, ...unknownDisabledIds]);\n onDisableSetChange(next);\n }, [builtinToolIds, unknownDisabledIds, onDisableSetChange]);\n\n const groupsContent = useMemo(() => {\n const misc = miscBuiltinToolIds(builtinToolIds);\n const sections: { key: BuiltinToolUiGroupKey; ids: string[] }[] = [];\n if (mode === 'defaults' && unknownDisabledIds.length > 0) {\n sections.push({ key: 'unknown', ids: [...unknownDisabledIds].sort((x, y) => x.localeCompare(y)) });\n }\n for (const g of BUILTIN_TOOL_UI_GROUPS) {\n const ids = g.toolIds.filter((id) => allowedBuiltin.has(id));\n if (ids.length > 0) {\n sections.push({ key: g.key, ids: [...ids] });\n }\n }\n if (misc.length > 0) {\n sections.push({ key: 'misc', ids: misc });\n }\n return sections;\n }, [allowedBuiltin, builtinToolIds, mode, unknownDisabledIds]);\n\n const hasRows = groupsContent.some((s) => s.ids.length > 0);\n const qaBusy = quickActionsDisabled || loading;\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"text-xs font-medium text-fg-muted\">{labels.quickActionsLabel}</p>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || (builtinToolIds.length === 0 && unknownDisabledIds.length === 0)}\n onClick={enableAllTools}\n >\n {labels.quickEnableAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || (builtinToolIds.length === 0 && unknownDisabledIds.length === 0)}\n onClick={disableAllListed}\n >\n {labels.quickDisableAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || builtinToolIds.length === 0}\n onClick={() => applyDisableExactly(PRESET_READ_ONLY_WORKSPACE)}\n >\n {labels.quickReadOnlyWorkspace}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || builtinToolIds.length === 0}\n onClick={() => applyDisableExactly(PRESET_HIGH_RISK)}\n >\n {labels.quickHighRiskOff}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || builtinToolIds.length === 0}\n onClick={() => applyDisableExactly(PRESET_NO_OUTBOUND)}\n >\n {labels.quickNoOutbound}\n </Button>\n </div>\n </div>\n {loading ? (\n <p className=\"text-sm text-fg-muted\">{labels.loadingBuiltin}</p>\n ) : !hasRows ? (\n <p className=\"text-sm text-fg-muted\">{labels.emptyBuiltin}</p>\n ) : (\n <div className=\"max-h-[min(50vh,22rem)] overflow-y-auto overscroll-contain pr-0.5\">\n <div className=\"flex flex-col gap-5 pr-1\">\n {groupsContent.map(({ key: groupKey, ids }) => (\n <div key={groupKey}>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\">\n {getGroupTitle(groupKey)}\n </h4>\n <ul className=\"flex flex-col gap-2.5\" role=\"list\">\n {ids.map((tid) => {\n const unknown = mode === 'defaults' && groupKey === 'unknown';\n const lockedByDefault = mode === 'agentEntry' && defaultsLock.has(tid);\n const disabledByScope = disableSet.has(tid);\n const checked = lockedByDefault ? false : !disabledByScope;\n const desc = getToolDescription(tid);\n return (\n <li\n key={tid}\n className={cn(\n 'rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 py-2.5 dark:border-edge-subtle',\n unknown && 'border-dashed',\n lockedByDefault && 'opacity-60',\n )}\n >\n <label\n className={cn(\n 'flex gap-3 text-sm',\n lockedByDefault ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n >\n <input\n type=\"checkbox\"\n className=\"mt-1 shrink-0 rounded border-edge\"\n checked={checked}\n disabled={lockedByDefault || qaBusy}\n onChange={() => setToolEnabled(tid, !checked)}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5\">\n <span className=\"font-mono text-xs font-medium text-fg\">{tid}</span>\n {unknown ? (\n <span className=\"text-xs text-fg-muted\">({labels.notInBuiltin})</span>\n ) : null}\n {lockedByDefault ? (\n <span className=\"text-xs text-fg-muted\">({labels.lockedByDefaults})</span>\n ) : null}\n </div>\n {desc ? (\n <p className=\"mt-1 text-xs leading-relaxed text-fg-muted\">{desc}</p>\n ) : null}\n </div>\n </label>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport { sortedDisableList };\n","import { Wrench } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport type { BuiltinToolUiGroupKey } from '@/features/settings/agents/builtin-tool-disable-groups';\nimport { BuiltinToolsDisableUi } from '@/features/settings/agents/builtin-tools-disable-ui';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { messages, type AgentsSettingsMessages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function AgentToolsTab(props: {\n a: AgentsSettingsMessages;\n data: { builtinToolIds: string[] };\n selected: GatewayAgentRow;\n busy: boolean;\n toolEntryDisable: Set<string>;\n setToolEntryDisable: Dispatch<SetStateAction<Set<string>>>;\n onSaveTools: () => void;\n onClearToolsEntry: () => void;\n hideInlineSave?: boolean;\n}) {\n const {\n a,\n data,\n selected,\n busy,\n toolEntryDisable,\n setToolEntryDisable,\n onSaveTools,\n onClearToolsEntry,\n hideInlineSave,\n } = props;\n\n const language = useLocaleStore((s) => s.language);\n const adv = messages(language).agentSettings.advanced;\n\n const defaultsDisableSet = useMemo(\n () => new Set(selected.tools.defaultsDisable.map((s) => String(s).trim()).filter(Boolean)),\n [selected.tools.defaultsDisable],\n );\n\n const onDisableSetChange = useCallback(\n (next: Set<string>) => {\n setToolEntryDisable(next);\n },\n [setToolEntryDisable],\n );\n\n const groups = a.toolsDisableGroups;\n const getGroupTitle = useCallback((key: BuiltinToolUiGroupKey) => groups[key], [groups]);\n\n const getToolDescription = useCallback(\n (tid: string) =>\n tid in a.toolDescriptions ? a.toolDescriptions[tid as keyof typeof a.toolDescriptions] : '',\n [a.toolDescriptions],\n );\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={Wrench}\n title={a.toolsTitle}\n subtitle={a.toolsHint}\n />\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n <BuiltinToolsDisableUi\n mode=\"agentEntry\"\n builtinToolIds={data.builtinToolIds}\n loading={false}\n disableSet={toolEntryDisable}\n onDisableSetChange={onDisableSetChange}\n defaultsDisableSet={defaultsDisableSet}\n getToolDescription={getToolDescription}\n getGroupTitle={getGroupTitle}\n quickActionsDisabled={busy}\n labels={{\n loadingBuiltin: adv.toolsDisableLoadingBuiltin,\n emptyBuiltin: adv.toolsDisableEmptyBuiltin,\n quickActionsLabel: adv.toolsDisableQuickActionsLabel,\n quickEnableAll: adv.toolsDisableQuickEnableAll,\n quickDisableAll: adv.toolsDisableQuickDisableAll,\n quickReadOnlyWorkspace: adv.toolsDisableQuickReadOnlyWorkspace,\n quickHighRiskOff: adv.toolsDisableQuickHighRiskOff,\n quickNoOutbound: adv.toolsDisableQuickNoOutbound,\n notInBuiltin: adv.toolsDisableNotInBuiltin,\n lockedByDefaults: a.toolsLockedByDefaults,\n }}\n />\n </div>\n <div className=\"mt-4 flex shrink-0 flex-wrap gap-2\">\n {!hideInlineSave ? (\n <Button type=\"button\" disabled={busy} onClick={() => void onSaveTools()}>\n {a.toolsSave}\n </Button>\n ) : null}\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onClearToolsEntry()}>\n {a.toolsClearEntry}\n </Button>\n </div>\n </SettingsFormSection>\n );\n}\n","import type { Dispatch, FormEvent, MutableRefObject, SetStateAction } from 'react';\n\nimport type { ChannelStatus, CronJob, SessionChatId } from '@/features/cron/cron-api';\nimport type {\n fetchAgentBootstrapFiles,\n GatewayAgentRow,\n GatewayAgentsPayload,\n GatewayConfigBinding,\n SkillCatalogRow,\n} from '@/features/settings/agents-admin-api';\nimport type { AgentsSettingsMessages, ChatMessages, MessageBundle } from '@/i18n/messages';\n\nimport { AgentChannelsTab } from './tabs/agent-channels-tab';\nimport { AgentCronTab } from './tabs/agent-cron-tab';\nimport { AgentFilesTab } from './tabs/agent-files-tab';\nimport { AgentOverviewTab } from './tabs/agent-overview-tab';\nimport { AgentProfileTab } from './tabs/agent-profile-tab';\nimport { AgentSkillsTab } from './tabs/agent-skills-tab';\nimport { AgentToolsTab } from './tabs/agent-tools-tab';\nimport type { AgentPanel } from './utils';\n\ntype CronMessages = MessageBundle['cron'];\n\nexport type AgentsEditorPanelContentProps = {\n a: AgentsSettingsMessages;\n chat: ChatMessages;\n cCron: CronMessages;\n selected: GatewayAgentRow | null;\n panel: AgentPanel;\n data: GatewayAgentsPayload | null;\n busy: boolean;\n editName: string;\n setEditName: (v: string) => void;\n editDescription: string;\n setEditDescription: (v: string) => void;\n editWorkspace: string;\n setEditWorkspace: (v: string) => void;\n editModel: string;\n setEditModel: (v: string) => void;\n onSetDefault: () => void;\n onSaveAgentEdits: () => void;\n onDelete: (purge: boolean) => void;\n overviewSaveBootstrapRef: MutableRefObject<(() => Promise<void>) | null>;\n profileSaveRef: MutableRefObject<(() => Promise<void>) | null>;\n setOverviewBootstrapDirty: (v: boolean) => void;\n setProfileDirty: (v: boolean) => void;\n filesLoading: boolean;\n files: Awaited<ReturnType<typeof fetchAgentBootstrapFiles>> | null;\n activeFile: string | null;\n setActiveFile: (v: string | null) => void;\n bootstrapViewMode: 'edit' | 'preview';\n setBootstrapViewMode: (v: 'edit' | 'preview') => void;\n fileDraft: string;\n setFileDraft: (v: string) => void;\n fileSaving: boolean;\n bootstrapFileLoading: boolean;\n bootstrapEditorNonce: number;\n toolEntryDisable: Set<string>;\n setToolEntryDisable: Dispatch<SetStateAction<Set<string>>>;\n onSaveTools: () => void;\n onClearToolsEntry: () => void;\n skillsCatalogLoading: boolean;\n catalogForPick: SkillCatalogRow[];\n skillsInherit: boolean;\n setSkillsInherit: (v: boolean) => void;\n skillsPick: Set<string>;\n setSkillsPick: Dispatch<SetStateAction<Set<string>>>;\n onSaveSkills: () => void;\n bindingsLoading: boolean;\n agentBindings: GatewayConfigBinding[];\n bindChannelStatuses: ChannelStatus[];\n bindChannelsLoading: boolean;\n useManualChannel: boolean;\n newBindChannel: string;\n setNewBindChannel: (v: string) => void;\n bindSessionChats: SessionChatId[];\n bindSessionsLoading: boolean;\n newBindSessionIdx: number | null;\n setNewBindSessionIdx: Dispatch<SetStateAction<number | null>>;\n newBindCustomPeer: string;\n setNewBindCustomPeer: (v: string) => void;\n refreshBindSessions: () => void;\n onRemoveBinding: (rule: GatewayConfigBinding) => void;\n onAddBinding: (e: FormEvent) => void;\n cronLoading: boolean;\n agentCronJobs: CronJob[];\n onSetCronJobAgent: (job: CronJob, agentKey: string) => void;\n};\n\nexport function AgentsEditorPanelContent({\n a,\n chat,\n cCron,\n selected,\n panel,\n data,\n busy,\n editName,\n setEditName,\n editDescription,\n setEditDescription,\n editWorkspace,\n setEditWorkspace,\n editModel,\n setEditModel,\n onSetDefault,\n onSaveAgentEdits,\n onDelete,\n overviewSaveBootstrapRef,\n profileSaveRef,\n setOverviewBootstrapDirty,\n setProfileDirty,\n filesLoading,\n files,\n activeFile,\n setActiveFile,\n bootstrapViewMode,\n setBootstrapViewMode,\n fileDraft,\n setFileDraft,\n fileSaving,\n bootstrapFileLoading,\n bootstrapEditorNonce,\n toolEntryDisable,\n setToolEntryDisable,\n onSaveTools,\n onClearToolsEntry,\n skillsCatalogLoading,\n catalogForPick,\n skillsInherit,\n setSkillsInherit,\n skillsPick,\n setSkillsPick,\n onSaveSkills,\n bindingsLoading,\n agentBindings,\n bindChannelStatuses,\n bindChannelsLoading,\n useManualChannel,\n newBindChannel,\n setNewBindChannel,\n bindSessionChats,\n bindSessionsLoading,\n newBindSessionIdx,\n setNewBindSessionIdx,\n newBindCustomPeer,\n setNewBindCustomPeer,\n refreshBindSessions,\n onRemoveBinding,\n onAddBinding,\n cronLoading,\n agentCronJobs,\n onSetCronJobAgent,\n}: AgentsEditorPanelContentProps) {\n if (!selected) {\n return <p className=\"text-sm text-fg-muted\">{a.selectAgentHint}</p>;\n }\n\n if (panel === 'overview') {\n return (\n <AgentOverviewTab\n a={a}\n chat={chat}\n selected={selected}\n busy={busy}\n editName={editName}\n setEditName={setEditName}\n editDescription={editDescription}\n setEditDescription={setEditDescription}\n editWorkspace={editWorkspace}\n setEditWorkspace={setEditWorkspace}\n editModel={editModel}\n setEditModel={setEditModel}\n onSetDefault={onSetDefault}\n onSaveAgentEdits={onSaveAgentEdits}\n onDelete={onDelete}\n hideInlineSave\n saveBootstrapRef={overviewSaveBootstrapRef}\n onBootstrapDirtyChange={setOverviewBootstrapDirty}\n />\n );\n }\n\n if (panel === 'profile') {\n return (\n <AgentProfileTab a={a} agentId={selected.id} saveRef={profileSaveRef} onDirtyChange={setProfileDirty} />\n );\n }\n\n if (panel === 'files') {\n return (\n <AgentFilesTab\n a={a}\n filesLoading={filesLoading}\n files={files}\n activeFile={activeFile}\n setActiveFile={setActiveFile}\n bootstrapViewMode={bootstrapViewMode}\n setBootstrapViewMode={setBootstrapViewMode}\n fileDraft={fileDraft}\n setFileDraft={setFileDraft}\n fileSaving={fileSaving}\n bootstrapFileLoading={bootstrapFileLoading}\n bootstrapEditorNonce={bootstrapEditorNonce}\n />\n );\n }\n\n if (panel === 'tools') {\n return (\n <AgentToolsTab\n a={a}\n data={data!}\n selected={selected}\n busy={busy}\n toolEntryDisable={toolEntryDisable}\n setToolEntryDisable={setToolEntryDisable}\n onSaveTools={onSaveTools}\n onClearToolsEntry={onClearToolsEntry}\n hideInlineSave\n />\n );\n }\n\n if (panel === 'skills') {\n return (\n <AgentSkillsTab\n a={a}\n selected={selected}\n busy={busy}\n skillsCatalogLoading={skillsCatalogLoading}\n catalogForPick={catalogForPick}\n skillsInherit={skillsInherit}\n setSkillsInherit={setSkillsInherit}\n skillsPick={skillsPick}\n setSkillsPick={setSkillsPick}\n onSaveSkills={onSaveSkills}\n hideInlineSave\n />\n );\n }\n\n if (panel === 'channels') {\n return (\n <AgentChannelsTab\n a={a}\n busy={busy}\n bindingsLoading={bindingsLoading}\n agentBindings={agentBindings}\n channelStatuses={bindChannelStatuses}\n channelsStatusLoading={bindChannelsLoading}\n useManualChannel={useManualChannel}\n newBindChannel={newBindChannel}\n setNewBindChannel={setNewBindChannel}\n bindSessionChats={bindSessionChats}\n sessionsLoading={bindSessionsLoading}\n newBindSessionIdx={newBindSessionIdx}\n setNewBindSessionIdx={setNewBindSessionIdx}\n newBindCustomPeer={newBindCustomPeer}\n setNewBindCustomPeer={setNewBindCustomPeer}\n onRefreshSessions={refreshBindSessions}\n lastActiveLabels={cCron.lastActiveLabels}\n selectRecipient={cCron.selectRecipient}\n onRemoveBinding={onRemoveBinding}\n onAddBinding={onAddBinding}\n />\n );\n }\n\n if (panel === 'cron' && data) {\n return (\n <AgentCronTab\n a={a}\n data={data}\n selected={selected}\n busy={busy}\n cronLoading={cronLoading}\n agentCronJobs={agentCronJobs}\n onSetCronJobAgent={onSetCronJobAgent}\n />\n );\n }\n\n return <p className=\"text-sm text-fg-muted\">{a.selectAgentHint}</p>;\n}\n","import { MessageSquarePlus, Plus } from 'lucide-react';\n\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport { AgentAvatarDisplay } from '@/features/settings/agents/agent-avatar-display';\nimport {\n agentListDisplayDescription,\n agentListDisplayName,\n} from '@/features/settings/agents/agent-display-names';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nfunction filterAgents(agents: GatewayAgentRow[], query: string, a: AgentsSettingsMessages): GatewayAgentRow[] {\n const q = query.trim().toLowerCase();\n if (!q) {\n return agents;\n }\n return agents.filter((ag) => {\n const name = agentListDisplayName(ag, a).toLowerCase();\n const id = ag.id.toLowerCase();\n const ws = ag.workspace.toLowerCase();\n const desc = (ag.description ?? '').toLowerCase();\n const displayDesc = agentListDisplayDescription(ag, a).toLowerCase();\n return name.includes(q) || id.includes(q) || ws.includes(q) || desc.includes(q) || displayDesc.includes(q);\n });\n}\n\nfunction NewAgentCard(props: {\n a: AgentsSettingsMessages;\n busy: boolean;\n onNewAgent: () => void;\n}) {\n const { a, busy, onNewAgent } = props;\n return (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onNewAgent()}\n className={cn(\n 'flex h-full min-h-[7.5rem] w-full flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-edge-subtle bg-surface-panel/40 px-4 py-6 text-sm font-medium text-fg-muted transition-colors',\n 'hover:border-accent/50 hover:bg-surface-hover hover:text-fg',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <Plus className=\"size-8 shrink-0 opacity-80\" strokeWidth={1.75} aria-hidden />\n <span>{a.listNewAgentCard}</span>\n </button>\n );\n}\n\nexport function AgentsListGrid(props: {\n a: AgentsSettingsMessages;\n agents: GatewayAgentRow[];\n searchQuery: string;\n onOpenAgent: (id: string) => void;\n onChatWithAgent: (id: string) => void;\n onNewAgent: () => void;\n busy: boolean;\n}) {\n const { a, agents, searchQuery, onOpenAgent, onChatWithAgent, onNewAgent, busy } = props;\n const filtered = filterAgents(agents, searchQuery, a);\n const searchMiss = agents.length > 0 && filtered.length === 0 && searchQuery.trim().length > 0;\n\n if (agents.length === 0) {\n return (\n <div className=\"flex flex-col gap-4\">\n <p className=\"text-sm text-fg-muted\">{a.listNoAgentsYet}</p>\n <div className=\"max-w-sm\">\n <NewAgentCard a={a} busy={busy} onNewAgent={onNewAgent} />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n {searchMiss ? <p className=\"text-sm text-fg-muted\">{a.listEmpty}</p> : null}\n\n <ul\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n role=\"list\"\n >\n <li className=\"h-full min-h-0\">\n <NewAgentCard a={a} busy={busy} onNewAgent={onNewAgent} />\n </li>\n {filtered.map((ag) => {\n const title = agentListDisplayName(ag, a);\n const monoId = ag.id;\n const descTrim = agentListDisplayDescription(ag, a);\n return (\n <li key={ag.id} className=\"h-full min-h-0\">\n <div\n className={cn(\n 'flex h-full min-h-0 flex-col gap-3 rounded-xl border border-edge-subtle bg-surface-panel p-4 shadow-sm transition-colors',\n 'hover:border-edge',\n )}\n >\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onOpenAgent(ag.id)}\n className={cn(\n 'flex shrink-0 w-full flex-col gap-2 text-left transition-colors',\n 'rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <div className=\"flex items-start gap-3\">\n <div\n className=\"flex size-11 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-accent-soft ring-1 ring-edge-subtle/40\"\n aria-hidden\n >\n <AgentAvatarDisplay agentId={ag.id} avatar={ag.avatar} size={44} className=\"size-full\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5\">\n <span className=\"truncate font-semibold text-fg\">{title}</span>\n {ag.isDefault ? (\n <span className=\"shrink-0 rounded-md bg-surface-base px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\">\n {a.defaultBadge}\n </span>\n ) : null}\n </div>\n <p className=\"mt-0.5 truncate font-mono text-xs text-fg-muted\" title={monoId}>\n {monoId}\n </p>\n </div>\n </div>\n <p\n className={cn(\n 'line-clamp-1 min-h-[1.3125rem] text-xs leading-relaxed',\n descTrim ? 'text-fg' : 'text-fg-muted/25',\n )}\n title={descTrim || undefined}\n >\n {descTrim || '\\u00A0'}\n </p>\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onChatWithAgent(ag.id)}\n className={cn(\n 'flex w-full shrink-0 items-center justify-center gap-2 rounded-full px-4 py-2.5 text-sm font-semibold',\n 'bg-accent-soft text-accent-fg transition-colors',\n 'hover:bg-accent/15',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <MessageSquarePlus className=\"size-4 shrink-0\" strokeWidth={2} aria-hidden />\n {a.listChatWithAgent}\n </button>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","import type { AgentsSettingsMessages } from '@/i18n/messages';\n\nexport function AgentsSettingsHeader(props: { a: AgentsSettingsMessages }) {\n const { a } = props;\n\n return (\n <header className=\"flex flex-col gap-4\">\n <div className=\"min-w-0\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{a.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-fg-muted\">{a.subtitle}</p>\n </div>\n </header>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { UserPlus, X } from 'lucide-react';\nimport type { FormEvent } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport type { AgentsSettingsMessages, ChatMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport {\n SETTINGS_SHELL_CONTENT_Z,\n SETTINGS_SHELL_OVERLAY_Z,\n SETTINGS_SHELL_POPOVER_Z,\n} from '@/lib/settings-shell-dialog-layer';\n\nimport { agentsSettingsInputClass } from './utils';\n\nexport function CreateAgentDialog(props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n a: AgentsSettingsMessages;\n chat: ChatMessages;\n busy: boolean;\n modalError: string | null;\n createDisplayName: string;\n setCreateDisplayName: (v: string) => void;\n createAgentId: string;\n setCreateAgentId: (v: string) => void;\n createDescription: string;\n setCreateDescription: (v: string) => void;\n createWorkspace: string;\n setCreateWorkspace: (v: string) => void;\n createModel: string;\n setCreateModel: (v: string) => void;\n onCreate: (e: FormEvent) => void;\n onSuggestWorkspace: () => void;\n}) {\n const {\n open,\n onOpenChange,\n a,\n chat,\n busy,\n modalError,\n createDisplayName,\n setCreateDisplayName,\n createAgentId,\n setCreateAgentId,\n createDescription,\n setCreateDescription,\n createWorkspace,\n setCreateWorkspace,\n createModel,\n setCreateModel,\n onCreate,\n onSuggestWorkspace,\n } = props;\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 max-h-[min(90vh,640px)] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2',\n SETTINGS_SHELL_CONTENT_Z,\n 'overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <div className=\"min-w-0 pr-2\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{a.addAgent}</Dialog.Title>\n <Dialog.Description className=\"mt-0.5 text-xs text-fg-muted\">{a.addAgentHint}</Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n aria-label={a.closeDialogAria}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n\n <form className=\"grid gap-3\" onSubmit={onCreate}>\n {modalError ? (\n <div\n role=\"alert\"\n className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200\"\n >\n {modalError}\n </div>\n ) : null}\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newAgentLabel}</span>\n <input\n className={agentsSettingsInputClass()}\n value={createDisplayName}\n onChange={(e) => setCreateDisplayName(e.target.value)}\n onBlur={() => onSuggestWorkspace()}\n required\n autoComplete=\"off\"\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newAgentIdOptional}</span>\n <input\n className={cn(agentsSettingsInputClass(), 'font-mono text-xs')}\n value={createAgentId}\n onChange={(e) => setCreateAgentId(e.target.value)}\n onBlur={() => onSuggestWorkspace()}\n placeholder={a.newAgentIdPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={64}\n pattern=\"[A-Za-z0-9][A-Za-z0-9_-]{0,63}\"\n title={a.newAgentIdRules}\n />\n <span className=\"text-xs text-fg-muted\">{a.newAgentIdRules}</span>\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.agentDescription}</span>\n <textarea\n className={cn(agentsSettingsInputClass(), 'min-h-[4.5rem] resize-y font-sans text-sm leading-relaxed')}\n value={createDescription}\n onChange={(e) => setCreateDescription(e.target.value)}\n placeholder={a.agentDescriptionPlaceholder}\n maxLength={4000}\n rows={3}\n spellCheck\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newWorkspace}</span>\n <input\n className={cn(agentsSettingsInputClass(), 'font-mono text-xs')}\n value={createWorkspace}\n onChange={(e) => setCreateWorkspace(e.target.value)}\n required\n autoComplete=\"off\"\n />\n </label>\n <div className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newModelOptional}</span>\n <div className=\"flex flex-wrap items-stretch gap-2\">\n <ModelSelector\n className=\"min-w-0 flex-1\"\n popoverContentClassName={SETTINGS_SHELL_POPOVER_Z}\n value={createModel}\n disabled={busy}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(id) => setCreateModel(id)}\n />\n {createModel.trim() ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0\"\n disabled={busy}\n onClick={() => setCreateModel('')}\n >\n {a.modelClear}\n </Button>\n ) : null}\n </div>\n </div>\n <div className=\"mt-1 flex justify-end gap-2 border-t border-edge-subtle pt-3 dark:border-edge\">\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"secondary\" disabled={busy}>\n {a.createModalCancel}\n </Button>\n </Dialog.Close>\n <Button type=\"submit\" disabled={busy}>\n <UserPlus className=\"mr-1 size-4\" aria-hidden />\n {a.create}\n </Button>\n </div>\n </form>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","export interface PresetAgent {\n id: string;\n name: string;\n emoji: string;\n descriptionEn: string;\n descriptionZh: string;\n identityMd: string;\n soulMd: string;\n /** Per-agent tool disables (PATCH after create; merges with defaults). */\n toolsDisable?: string[];\n}\n\nexport const PRESET_AGENTS_SKIPPED_KEY = 'xopc-preset-agents-skipped';\n\nexport const PRESET_AGENTS: readonly PresetAgent[] = [\n {\n id: 'coder',\n name: 'Coder',\n emoji: '💻',\n descriptionEn: 'Software development assistant — precise, pragmatic, and code-focused.',\n descriptionZh: '软件开发助手 — 精确、务实、专注代码。',\n toolsDisable: ['image_generate'],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Coder\n- **Creature:** code architect\n- **Emoji:** 💻\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Understand before you act.** Read the codebase, understand the patterns, then write code that fits. Never guess at architecture.\n\n**Write code for humans.** Clean, readable code beats clever code every time. Name things well. Keep functions focused. Comment the why, not the what.\n\n**Explain your changes.** When you modify code, explain what changed and why. Diffs without context are useless.\n\n**Test what matters.** Don't skip edge cases. Don't assume it works because it compiled.\n\n**Be precise and efficient.** Value the developer's time. Give actionable answers. Show code, not theory.\n\n## Boundaries\n\n- Never commit untested code to production paths.\n- When in doubt about destructive operations (delete, overwrite), ask first.\n- Don't refactor code you weren't asked to touch.\n\n## Vibe\n\nPrecise, pragmatic, and competent. Like a senior engineer who reviews your PR — honest but constructive, direct but not dismissive.\n`,\n },\n {\n id: 'writer',\n name: 'Writer',\n emoji: '✍️',\n descriptionEn: 'Writing and content creation — eloquent, adaptive, and audience-aware.',\n descriptionZh: '写作与内容创作 — 文笔流畅、风格多变、关注读者。',\n toolsDisable: [\n 'shell',\n 'browser_navigate',\n 'browser_snapshot',\n 'browser_click',\n 'browser_type',\n 'browser_scroll',\n 'browser_screenshot',\n ],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Writer\n- **Creature:** wordsmith\n- **Emoji:** ✍️\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Know the audience first.** Before writing anything, understand who will read it and what they need. A technical spec and a blog post require completely different voices.\n\n**Match the user's style.** Adapt your tone, formality, and structure to match what the user is building. Don't impose your own voice unless asked.\n\n**Structure before prose.** Outline first, write second. Good structure makes good writing inevitable.\n\n**Cut the AI filler.** No \"In today's fast-paced world...\" or \"It's important to note that...\". Write like a human, not a language model.\n\n**Show, don't tell.** Use examples, analogies, and concrete details. Abstract advice is forgettable.\n\n## Boundaries\n\n- Don't fabricate quotes, statistics, or citations.\n- Flag when you're speculating vs. stating facts.\n- Respect the user's voice — you're the ghostwriter, not the author.\n\n## Vibe\n\nEloquent, adaptive, and invisible. Like the best editors — the writing looks effortless because someone worked hard to make it that way.\n`,\n },\n {\n id: 'researcher',\n name: 'Researcher',\n emoji: '🔍',\n descriptionEn: 'Deep research and analysis — thorough, source-driven, and critical.',\n descriptionZh: '深度研究与分析 — 详尽、引用来源、批判性思维。',\n toolsDisable: ['shell'],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Researcher\n- **Creature:** knowledge navigator\n- **Emoji:** 🔍\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Depth over breadth.** Shallow summaries are for search engines. Go deep. Follow the thread. Find the primary source.\n\n**Cross-reference everything.** One source isn't research — it's a data point. Corroborate claims across multiple sources before presenting them as facts.\n\n**Cite your sources.** Always note where information came from. If you can't cite it, flag it as inference or speculation.\n\n**Separate facts from opinions.** Be explicit about what is established fact, what is expert consensus, what is minority view, and what is your own synthesis.\n\n**Think critically.** Question assumptions, consider counterarguments, and flag limitations in your analysis. Intellectual honesty is non-negotiable.\n\n## Boundaries\n\n- Never present speculation as established fact.\n- Acknowledge knowledge cutoffs and information gaps.\n- When multiple valid interpretations exist, present them all.\n\n## Vibe\n\nThorough, curious, and intellectually honest. Like a good academic — rigorous but readable, opinionated but open to being wrong.\n`,\n },\n {\n id: 'data-analyst',\n name: 'Data Analyst',\n emoji: '📊',\n descriptionEn: 'Data analysis and visualization — analytical, clear, and reproducible.',\n descriptionZh: '数据分析与可视化 — 严谨分析、清晰表达、可复现。',\n toolsDisable: [\n 'browser_navigate',\n 'browser_snapshot',\n 'browser_click',\n 'browser_type',\n 'browser_scroll',\n 'browser_screenshot',\n ],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Data Analyst\n- **Creature:** data interpreter\n- **Emoji:** 📊\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Let the data speak.** Start with facts, not hypotheses. Explore the data before drawing conclusions.\n\n**Visualize first, explain second.** A good chart is worth a thousand rows. Choose the right visualization for the story the data tells.\n\n**Document your assumptions.** Every analysis has assumptions — make them explicit. State what you included, what you excluded, and why.\n\n**Reproducible or it didn't happen.** Write analysis code that someone else can run and get the same results. No magic numbers, no undocumented steps.\n\n**Be honest about limitations.** Small sample sizes, selection bias, missing data — flag them all. A confident wrong answer is worse than an uncertain right one.\n\n## Boundaries\n\n- Don't cherry-pick data to support a narrative.\n- Flag statistical significance (or lack thereof).\n- When data quality is questionable, say so before presenting results.\n\n## Vibe\n\nAnalytical, clear, and methodical. Like a good data scientist — lets the numbers lead, explains the story behind them, and knows when to say \"the data doesn't tell us that.\"\n`,\n },\n {\n id: 'creative',\n name: 'Creative',\n emoji: '🎨',\n descriptionEn: 'Creative design and visual work — bold, aesthetic, and multi-option.',\n descriptionZh: '创意设计与视觉 — 大胆、注重美感、多方案对比。',\n toolsDisable: ['shell'],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Creative\n- **Creature:** design spirit\n- **Emoji:** 🎨\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Beauty is not optional.** Aesthetics matter. Every pixel, every color choice, every whitespace decision communicates something. Make it count.\n\n**Break the template.** The first idea is rarely the best. Push past the obvious. Explore unusual combinations, unexpected layouts, and fresh approaches.\n\n**Explain your design decisions.** Don't just show — tell why. \"I chose this color palette because...\" helps the user understand and iterate.\n\n**Offer multiple options.** Present 2–3 directions, not just one. Let the user choose. Creative work is subjective — give them agency.\n\n**Respect constraints.** Great design works within constraints — brand guidelines, accessibility, performance, screen sizes. Constraints aren't limitations; they're the puzzle.\n\n## Boundaries\n\n- Don't use copyrighted assets without flagging it.\n- Accessibility is non-negotiable — contrast, alt text, keyboard nav.\n- When unsure about brand or style direction, ask before committing.\n\n## Vibe\n\nBold, aesthetic, and thoughtful. Like a creative director who has opinions but listens — pushes for better while respecting what the client actually needs.\n`,\n },\n];\n","import { useEffect, useMemo, useState } from 'react';\nimport { SkipForward, Sparkles } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n createGatewayAgent,\n saveAgentBootstrapFileContent,\n updateGatewayAgent,\n} from '@/features/settings/agents-admin-api';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { PRESET_AGENTS, PRESET_AGENTS_SKIPPED_KEY, type PresetAgent } from './preset-agents';\n\nexport interface PresetAgentsSetupProps {\n existingAgentIds: Set<string>;\n onComplete: () => void;\n onSkip: () => void;\n}\n\nexport function PresetAgentsSetup({ existingAgentIds, onComplete, onSkip }: PresetAgentsSetupProps) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentsSettings;\n\n const availablePresets = useMemo(\n () => PRESET_AGENTS.filter((p) => !existingAgentIds.has(p.id)),\n [existingAgentIds],\n );\n\n const [selected, setSelected] = useState<Set<string>>(() => new Set(PRESET_AGENTS.map((p) => p.id)));\n const [creating, setCreating] = useState(false);\n const [progress, setProgress] = useState<{ current: number; total: number } | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (availablePresets.length === 0) {\n onComplete();\n }\n }, [availablePresets, onComplete]);\n\n const toggleAgent = (id: string) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const handleCreate = async () => {\n const toCreate = availablePresets.filter((p) => selected.has(p.id));\n if (toCreate.length === 0) {\n onComplete();\n return;\n }\n\n setCreating(true);\n setError(null);\n setProgress({ current: 0, total: toCreate.length });\n\n for (let i = 0; i < toCreate.length; i++) {\n const preset = toCreate[i];\n setProgress({ current: i + 1, total: toCreate.length });\n try {\n await createGatewayAgent({\n name: preset.name,\n id: preset.id,\n workspace: `~/.xopc/workspace/${preset.id}`,\n description: language === 'zh' ? preset.descriptionZh : preset.descriptionEn,\n });\n\n await saveAgentBootstrapFileContent(preset.id, 'IDENTITY.md', preset.identityMd);\n await saveAgentBootstrapFileContent(preset.id, 'SOUL.md', preset.soulMd);\n\n const disables = preset.toolsDisable;\n if (disables && disables.length > 0) {\n await updateGatewayAgent(preset.id, { toolsDisable: disables });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.toLowerCase().includes('already exists')) {\n continue;\n }\n setError(a.presetCreateFailed.replace('{{name}}', preset.name).replace('{{message}}', message));\n setCreating(false);\n return;\n }\n }\n\n setCreating(false);\n onComplete();\n };\n\n const handleSkip = () => {\n localStorage.setItem(PRESET_AGENTS_SKIPPED_KEY, 'true');\n onSkip();\n };\n\n if (availablePresets.length === 0) {\n return null;\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-2xl flex-col items-center gap-6 px-4 py-12\">\n <div className=\"text-center\">\n <div className=\"mb-3 inline-flex items-center gap-2 rounded-full bg-accent/10 px-3 py-1.5 text-sm font-medium text-accent\">\n <Sparkles className=\"size-4\" aria-hidden />\n {a.presetSetupBadge}\n </div>\n <h2 className=\"text-xl font-semibold text-fg\">{a.presetSetupTitle}</h2>\n <p className=\"mt-2 text-sm text-fg-muted\">{a.presetSetupSubtitle}</p>\n </div>\n\n <div className=\"w-full space-y-3\">\n {availablePresets.map((preset) => (\n <PresetAgentCard\n key={preset.id}\n preset={preset}\n checked={selected.has(preset.id)}\n disabled={creating}\n language={language}\n onToggle={() => toggleAgent(preset.id)}\n />\n ))}\n </div>\n\n {error ? (\n <div\n role=\"alert\"\n className=\"w-full rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200\"\n >\n {error}\n </div>\n ) : null}\n\n {progress && creating ? (\n <p className=\"text-sm text-fg-muted\">\n {a.presetCreatingProgress\n .replace('{{current}}', String(progress.current))\n .replace('{{total}}', String(progress.total))}\n </p>\n ) : null}\n\n <div className=\"flex w-full items-center justify-between border-t border-edge-subtle pt-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"gap-2 text-fg-muted\"\n disabled={creating}\n onClick={handleSkip}\n >\n <SkipForward className=\"size-4\" aria-hidden />\n {a.presetSkip}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"gap-2\"\n disabled={creating || selected.size === 0}\n onClick={() => void handleCreate()}\n >\n <Sparkles className=\"size-4\" aria-hidden />\n {creating\n ? a.presetCreating\n : a.presetCreateSelected.replace('{{count}}', String(selected.size))}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction PresetAgentCard(props: {\n preset: PresetAgent;\n checked: boolean;\n disabled: boolean;\n language: 'en' | 'zh';\n onToggle: () => void;\n}) {\n const { preset, checked, disabled, language, onToggle } = props;\n const description = language === 'zh' ? preset.descriptionZh : preset.descriptionEn;\n\n return (\n <label\n className={cn(\n 'flex cursor-pointer items-start gap-3 rounded-xl border px-4 py-3 transition-colors',\n checked ? 'border-accent/50 bg-accent/5' : 'border-edge-subtle bg-surface-panel/40',\n disabled && 'pointer-events-none opacity-50',\n )}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={onToggle}\n className=\"mt-1 shrink-0 accent-accent\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg\" aria-hidden>\n {preset.emoji}\n </span>\n <span className=\"font-medium text-fg\">{preset.name}</span>\n </div>\n <p className=\"mt-0.5 text-sm text-fg-muted\">{description}</p>\n </div>\n </label>\n );\n}\n","/**\n * Agent id rules — keep in sync with `src/agent/agent-scope.ts` (`validateAgentIdForNewAgent`).\n */\n\nconst DEFAULT_AGENT_ID = 'main';\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\nconst STRICT_AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n\nconst WINDOWS_RESERVED_AGENT_IDS = new Set<string>([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nexport function normalizeAgentId(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = trimmed.toLowerCase();\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\nexport function validateAgentIdForNewAgent(\n explicitId: string | undefined | null,\n displayNameForDerivation: string,\n): { ok: true; agentId: string } | { ok: false; error: string } {\n const explicit = explicitId?.trim();\n if (explicit) {\n const id = explicit.toLowerCase();\n if (!STRICT_AGENT_ID_RE.test(id)) {\n return {\n ok: false,\n error:\n 'Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.',\n };\n }\n if (id === DEFAULT_AGENT_ID) {\n return { ok: false, error: `\"${DEFAULT_AGENT_ID}\" is reserved` };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(id)) {\n return { ok: false, error: `Agent id \"${id}\" is reserved (Windows device name).` };\n }\n return { ok: true, agentId: id };\n }\n\n const agentId = normalizeAgentId(displayNameForDerivation.trim());\n if (agentId === DEFAULT_AGENT_ID) {\n return {\n ok: false,\n error:\n 'Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(agentId)) {\n return {\n ok: false,\n error: `That display name resolves to \"${agentId}\", which is reserved. Use a different display name or set an explicit Agent id.`,\n };\n }\n if (!STRICT_AGENT_ID_RE.test(agentId)) {\n return {\n ok: false,\n error:\n 'Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n return { ok: true, agentId };\n}\n","/**\n * Default workspace path suggestion for a new agent (`~/.xopc/workspace/<agentId>`; parent is `agents.defaults.workspace`).\n */\n\nimport { normalizeAgentId } from '@/lib/agent-id';\n\n/** Empty string if `name` is blank; else `~/.xopc/workspace/<agentId>`. */\nexport function suggestWorkspaceFromAgentName(name: string): string {\n const t = name.trim();\n if (!t) {\n return '';\n }\n const id = normalizeAgentId(t);\n return `~/.xopc/workspace/${id}`;\n}\n","import { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type DreamingPhaseId = 'light' | 'deep' | 'rem';\n\n/** Gateway payload shape for memory/.dreams/last-run.json (deep sweep). */\nexport type DreamingLastRunRecord = {\n version: 2;\n phase: 'deep';\n runId: string;\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n ok: boolean;\n reason: string;\n errorMessage?: string;\n config: {\n enabled: boolean;\n minScore: number;\n minRecallCount: number;\n limit: number;\n };\n memoryPath: string;\n deep: {\n candidatesRanked: number;\n applied: number;\n skipped: {\n alreadyPromotedKey: number;\n rehydrateFailed: number;\n contaminated: number;\n hashDuplicate: number;\n };\n };\n};\n\n/** Lightweight last-run payload for light / rem phases. */\nexport type PhaseLastRun =\n | { exists: false }\n | { exists: true; path: string; raw: unknown };\n\nexport type DreamingGatewayStatus = {\n workspaceDir: string;\n config: {\n enabled: boolean;\n frequency: string;\n timezone: string;\n phases: {\n light: { enabled: boolean; cron: string; lookbackDays: number; limit: number; dedupeSimilarity: number };\n deep: { enabled: boolean; cron: string; minScore: number; minRecallCount: number; minUniqueQueries: number; limit: number; recencyHalfLifeDays: number; maxAgeDays: number };\n rem: { enabled: boolean; cron: string; lookbackDays: number; limit: number; minPatternStrength: number };\n };\n deep: { minScore: number; minRecallCount: number; limit: number };\n };\n storePath: string;\n store: {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n };\n lock: | { locked: false } | { locked: true; path: string; content: string; mtimeMs?: number };\n lastRun:\n | { exists: false }\n | { exists: true; path: string; raw: unknown; record: DreamingLastRunRecord | null; parseError: string | null };\n lightLastRun: PhaseLastRun;\n remLastRun: PhaseLastRun;\n};\n\nexport function dreamingSwrKey(): string {\n return apiUrl('/api/dreaming');\n}\n\nexport async function fetchDreamingStatus(): Promise<DreamingGatewayStatus> {\n const res = await fetchJson<{ ok?: boolean; payload?: DreamingGatewayStatus }>(dreamingSwrKey());\n if (!res.payload) throw new Error('Missing payload');\n return res.payload;\n}\n\nexport async function postDreamingAction(action: 'reset_store' | 'clear_lock'): Promise<void> {\n await fetchJson(apiUrl('/api/dreaming/action'), { method: 'POST', body: JSON.stringify({ action }) });\n}\n\nexport async function postDreamingRunNow(phase: DreamingPhaseId = 'deep'): Promise<{ triggered: boolean; jobId: string; phase: DreamingPhaseId }> {\n const res = await fetchJson<{ ok?: boolean; payload?: { triggered?: boolean; jobId?: string; phase?: string } }>(\n apiUrl('/api/dreaming/run'),\n { method: 'POST', body: JSON.stringify({ phase }) },\n );\n const triggered = Boolean(res.payload?.triggered);\n const jobId = typeof res.payload?.jobId === 'string' ? res.payload.jobId : '';\n if (!triggered || !jobId) throw new Error('Failed to trigger');\n return { triggered, jobId, phase };\n}\n\nexport type DreamingPreviewItem = {\n key: string;\n hash: string;\n snippet: string;\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n avgScore: number;\n recallCount: number;\n recencyDecay: number;\n alreadyPromotedByKey: boolean;\n alreadyPromotedByHash: boolean;\n skippedReason: string | null;\n};\n\nexport type DreamingPreviewResponse = {\n ok: boolean;\n reason: string;\n items: DreamingPreviewItem[];\n memoryPath: string;\n};\n\nexport async function fetchDreamingPreview(limit?: number): Promise<DreamingPreviewResponse> {\n const q = typeof limit === 'number' && Number.isFinite(limit) ? `?limit=${encodeURIComponent(String(limit))}` : '';\n const res = await fetchJson<{ ok?: boolean; payload?: DreamingPreviewResponse }>(apiUrl(`/api/dreaming/preview${q}`));\n if (!res.payload) throw new Error('Missing payload');\n return res.payload;\n}\n\n// ── Event audit log ────────────────────────────────────────────────────\n\nexport type DreamingEvent = {\n timestamp: string;\n phase: DreamingPhaseId;\n ok: boolean;\n reason: string;\n durationMs: number;\n // Light-specific\n scannedEntries?: number;\n newSignals?: number;\n deduped?: number;\n // Deep-specific\n candidates?: number;\n applied?: number;\n // REM-specific\n patternsDiscovered?: number;\n entriesAnalyzed?: number;\n};\n\nexport async function fetchDreamingEvents(limit = 50): Promise<DreamingEvent[]> {\n const q = `?limit=${encodeURIComponent(String(limit))}`;\n const res = await fetchJson<{ ok?: boolean; payload?: { events: DreamingEvent[] } }>(apiUrl(`/api/dreaming/events${q}`));\n return res.payload?.events ?? [];\n}\n\n","import { Moon, Plus, Search } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { StoredLanguage } from '@/lib/storage';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nexport type AgentsSettingsToolbarProps = {\n language: StoredLanguage;\n a: Pick<AgentsSettingsMessages, 'addAgent' | 'addAgentAria' | 'listSearchPlaceholder'>;\n busy: boolean;\n sleeping: boolean;\n listSearchQuery: string;\n onListSearchQueryChange: (value: string) => void;\n onSleep: () => void;\n onAddAgent: () => void;\n};\n\nexport function AgentsSettingsToolbar({\n language,\n a,\n busy,\n sleeping,\n listSearchQuery,\n onListSearchQueryChange,\n onSleep,\n onAddAgent,\n}: AgentsSettingsToolbarProps) {\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0 gap-2\"\n disabled={busy || sleeping}\n onClick={() => void onSleep()}\n aria-label={language === 'zh' ? '让智能体进入睡眠流程' : 'Trigger agent sleep sequence'}\n title={language === 'zh' ? '由浅入深:Light → Deep → REM' : 'Light → Deep → REM'}\n >\n <Moon className=\"size-4 shrink-0\" strokeWidth={1.75} aria-hidden />\n {language === 'zh' ? (sleeping ? '睡眠中…' : '睡眠') : sleeping ? 'Sleeping…' : 'Sleep'}\n </Button>\n <label className=\"relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n role=\"searchbox\"\n enterKeyHint=\"search\"\n value={listSearchQuery}\n onChange={(e) => onListSearchQueryChange(e.target.value)}\n placeholder={a.listSearchPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n aria-label={a.listSearchPlaceholder}\n className=\"min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none\"\n />\n </label>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"shrink-0 gap-2\"\n aria-label={a.addAgentAria}\n disabled={busy}\n onClick={() => onAddAgent()}\n >\n <Plus className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {a.addAgent}\n </Button>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { useDebouncedCallback } from 'use-debounce';\n\nimport {\n fetchAgentBootstrapFileContent,\n fetchAgentBootstrapFiles,\n saveAgentBootstrapFileContent,\n} from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\n\nexport function useAgentsBootstrapFiles(options: {\n panel: AgentPanel;\n selectedId: string | null;\n hasToken: boolean;\n dataAgentsLength: number | undefined;\n saveErrorMessage: string;\n setError: Dispatch<SetStateAction<string | null>>;\n}) {\n const { panel, selectedId, hasToken, dataAgentsLength, saveErrorMessage, setError } = options;\n\n const [files, setFiles] = useState<Awaited<ReturnType<typeof fetchAgentBootstrapFiles>> | null>(null);\n const [filesLoading, setFilesLoading] = useState(false);\n const [activeFile, setActiveFile] = useState<string | null>(null);\n const [fileDraft, setFileDraft] = useState('');\n const [fileSaving, setFileSaving] = useState(false);\n const [bootstrapViewMode, setBootstrapViewMode] = useState<'edit' | 'preview'>('edit');\n const [bootstrapFileLoading, setBootstrapFileLoading] = useState(false);\n const [bootstrapEditorNonce, setBootstrapEditorNonce] = useState(0);\n\n const fileDraftRef = useRef(fileDraft);\n fileDraftRef.current = fileDraft;\n const selectedIdRef = useRef(selectedId);\n selectedIdRef.current = selectedId;\n const activeFileRef = useRef(activeFile);\n activeFileRef.current = activeFile;\n const overviewSaveBootstrapRef = useRef<(() => Promise<void>) | null>(null);\n const bootstrapFileKeyRef = useRef('');\n const bootstrapSyncedRef = useRef('');\n\n const saveBootstrapDebounced = useDebouncedCallback(\n async () => {\n const sid = selectedIdRef.current;\n const name = activeFileRef.current;\n if (!sid || !name) {\n return;\n }\n const key = `${sid}:${name}`;\n if (key !== bootstrapFileKeyRef.current) {\n return;\n }\n const draft = fileDraftRef.current;\n if (draft === bootstrapSyncedRef.current) {\n return;\n }\n setFileSaving(true);\n setError(null);\n try {\n await saveAgentBootstrapFileContent(sid, name, draft);\n bootstrapSyncedRef.current = draft;\n setFiles((prev) => {\n if (!prev || prev.agentId !== sid) {\n return prev;\n }\n return {\n ...prev,\n files: prev.files.map((f) => (f.name === name ? { ...f, missing: false } : f)),\n };\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setFileSaving(false);\n }\n },\n 800,\n );\n\n const flushBootstrapSaveRef = useRef(saveBootstrapDebounced.flush);\n flushBootstrapSaveRef.current = saveBootstrapDebounced.flush;\n\n useEffect(() => {\n return () => {\n flushBootstrapSaveRef.current();\n };\n }, []);\n\n useEffect(() => {\n if (panel !== 'files' || !selectedId || !hasToken) {\n return;\n }\n let cancelled = false;\n setFilesLoading(true);\n void fetchAgentBootstrapFiles(selectedId)\n .then((f) => {\n if (!cancelled) {\n setFiles(f);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setFiles(null);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setFilesLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, selectedId, hasToken, dataAgentsLength]);\n\n useEffect(() => {\n if (!activeFile || !selectedId || !hasToken) {\n return;\n }\n let cancelled = false;\n saveBootstrapDebounced.flush();\n setBootstrapFileLoading(true);\n void fetchAgentBootstrapFileContent(selectedId, activeFile)\n .then((c) => {\n if (cancelled) {\n return;\n }\n const key = `${selectedId}:${activeFile}`;\n bootstrapFileKeyRef.current = key;\n bootstrapSyncedRef.current = c;\n setFileDraft(c);\n setBootstrapEditorNonce((n) => n + 1);\n })\n .catch(() => {\n if (!cancelled) {\n const key = `${selectedId}:${activeFile}`;\n bootstrapFileKeyRef.current = key;\n bootstrapSyncedRef.current = '';\n setFileDraft('');\n setBootstrapEditorNonce((n) => n + 1);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setBootstrapFileLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [activeFile, selectedId, hasToken, saveBootstrapDebounced]);\n\n useEffect(() => {\n if (!activeFile || !selectedId || bootstrapFileLoading) {\n return;\n }\n saveBootstrapDebounced();\n }, [fileDraft, activeFile, selectedId, bootstrapFileLoading, saveBootstrapDebounced]);\n\n useEffect(() => {\n if (panel !== 'files') {\n return;\n }\n return () => {\n saveBootstrapDebounced.flush();\n };\n }, [panel, saveBootstrapDebounced]);\n\n useEffect(() => {\n setBootstrapViewMode('edit');\n }, [activeFile, selectedId]);\n\n return {\n files,\n setFiles,\n filesLoading,\n activeFile,\n setActiveFile,\n fileDraft,\n setFileDraft,\n fileSaving,\n bootstrapViewMode,\n setBootstrapViewMode,\n bootstrapFileLoading,\n bootstrapEditorNonce,\n overviewSaveBootstrapRef,\n saveBootstrapDebounced,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { Dispatch, FormEvent, SetStateAction } from 'react';\n\nimport {\n getChannels,\n getSessionChatIds,\n type ChannelStatus,\n type SessionChatId,\n} from '@/features/cron/cron-api';\nimport {\n patchGatewayBindings,\n type GatewayAgentRow,\n type GatewayConfigBinding,\n} from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\nimport { buildNewBindingMatch } from '../utils';\n\nexport function useAgentsChannelBindings(options: {\n panel: AgentPanel;\n hasToken: boolean;\n bindingsFromConfig: GatewayConfigBinding[];\n gatewayCfgLoading: boolean;\n selected: GatewayAgentRow | null;\n saveErrorMessage: string;\n setBusy: Dispatch<SetStateAction<boolean>>;\n setError: Dispatch<SetStateAction<string | null>>;\n}) {\n const {\n panel,\n hasToken,\n bindingsFromConfig,\n gatewayCfgLoading,\n selected,\n saveErrorMessage,\n setBusy,\n setError,\n } = options;\n\n const [allBindings, setAllBindings] = useState<GatewayConfigBinding[]>([]);\n const [newBindChannel, setNewBindChannel] = useState('');\n const [bindChannelStatuses, setBindChannelStatuses] = useState<ChannelStatus[]>([]);\n const [bindChannelsLoading, setBindChannelsLoading] = useState(false);\n const [bindSessionChats, setBindSessionChats] = useState<SessionChatId[]>([]);\n const [bindSessionsLoading, setBindSessionsLoading] = useState(false);\n const [newBindSessionIdx, setNewBindSessionIdx] = useState<number | null>(null);\n const [newBindCustomPeer, setNewBindCustomPeer] = useState('');\n\n const agentBindings = useMemo(() => {\n if (!selected) {\n return [];\n }\n return allBindings.filter((b) => b.agentId.toLowerCase() === selected.id.toLowerCase());\n }, [allBindings, selected?.id]);\n\n useEffect(() => {\n if (panel !== 'channels' || !hasToken) {\n return;\n }\n setAllBindings(bindingsFromConfig);\n }, [panel, hasToken, bindingsFromConfig]);\n\n useEffect(() => {\n if (panel !== 'channels' || !hasToken) {\n return;\n }\n let cancelled = false;\n setBindChannelsLoading(true);\n void getChannels()\n .then((list) => {\n if (!cancelled) {\n setBindChannelStatuses(list);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setBindChannelStatuses([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setBindChannelsLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, hasToken]);\n\n useEffect(() => {\n if (bindChannelsLoading || panel !== 'channels' || bindChannelStatuses.length === 0) {\n return;\n }\n setNewBindChannel((prev) => {\n const valid = Boolean(prev) && bindChannelStatuses.some((c) => c.name === prev);\n if (valid) {\n return prev;\n }\n return bindChannelStatuses[0].name;\n });\n }, [bindChannelsLoading, panel, bindChannelStatuses]);\n\n useEffect(() => {\n if (panel !== 'channels' || !hasToken) {\n return;\n }\n const ch = newBindChannel.trim();\n if (!ch) {\n setBindSessionChats([]);\n return;\n }\n let cancelled = false;\n setNewBindSessionIdx(null);\n setBindSessionsLoading(true);\n void getSessionChatIds(ch)\n .then((ids) => {\n if (!cancelled) {\n setBindSessionChats(ids);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setBindSessionChats([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setBindSessionsLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, hasToken, newBindChannel]);\n\n const refreshBindSessions = useCallback(() => {\n const ch = newBindChannel.trim();\n if (!ch) {\n return;\n }\n setBindSessionsLoading(true);\n void getSessionChatIds(ch)\n .then((ids) => {\n setBindSessionChats(ids);\n setNewBindSessionIdx((i) => (i != null && i < ids.length ? i : null));\n })\n .catch(() => {\n setBindSessionChats([]);\n setNewBindSessionIdx(null);\n })\n .finally(() => {\n setBindSessionsLoading(false);\n });\n }, [newBindChannel]);\n\n const useManualChannel = !bindChannelsLoading && bindChannelStatuses.length === 0;\n const bindingsLoading = panel === 'channels' && hasToken && gatewayCfgLoading;\n\n const onRemoveBinding = useCallback(\n async (rule: GatewayConfigBinding) => {\n setBusy(true);\n setError(null);\n try {\n const nextList = allBindings.filter((b) => b !== rule);\n await patchGatewayBindings(nextList);\n setAllBindings(nextList);\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setBusy(false);\n }\n },\n [allBindings, saveErrorMessage, setBusy, setError],\n );\n\n const onAddBinding = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n if (!selected || !newBindChannel.trim()) {\n return;\n }\n const match = buildNewBindingMatch(\n newBindChannel,\n newBindCustomPeer,\n newBindSessionIdx,\n bindSessionChats,\n );\n const nextList = [\n ...allBindings,\n {\n agentId: selected.id,\n priority: 100,\n enabled: true,\n match,\n },\n ];\n setBusy(true);\n setError(null);\n try {\n await patchGatewayBindings(nextList);\n setAllBindings(nextList);\n setNewBindSessionIdx(null);\n setNewBindCustomPeer('');\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setBusy(false);\n }\n },\n [\n allBindings,\n bindSessionChats,\n newBindChannel,\n newBindCustomPeer,\n newBindSessionIdx,\n saveErrorMessage,\n selected,\n setBusy,\n setError,\n ],\n );\n\n return {\n agentBindings,\n allBindings,\n bindChannelStatuses,\n bindChannelsLoading,\n bindSessionChats,\n bindSessionsLoading,\n bindingsLoading,\n newBindChannel,\n setNewBindChannel,\n newBindSessionIdx,\n setNewBindSessionIdx,\n newBindCustomPeer,\n setNewBindCustomPeer,\n onAddBinding,\n onRemoveBinding,\n refreshBindSessions,\n useManualChannel,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport { listJobs, updateJob, type CronJob } from '@/features/cron/cron-api';\nimport { isDreamingManagedCronJob } from '@/features/cron/cron-dreaming-jobs';\nimport type { GatewayAgentRow, GatewayAgentsPayload } from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\nimport { jobMatchesAgent } from '../utils';\n\nexport function useAgentsCronJobs(options: {\n panel: AgentPanel;\n hasToken: boolean;\n data: GatewayAgentsPayload | null;\n selected: GatewayAgentRow | null;\n saveErrorMessage: string;\n setBusy: Dispatch<SetStateAction<boolean>>;\n setError: Dispatch<SetStateAction<string | null>>;\n}) {\n const { panel, hasToken, data, selected, saveErrorMessage, setBusy, setError } = options;\n\n const [cronJobs, setCronJobs] = useState<CronJob[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const agentCronJobs = useMemo(() => {\n if (!data || !selected) {\n return [];\n }\n return cronJobs.filter(\n (j) => !isDreamingManagedCronJob(j) && jobMatchesAgent(j, selected.id, data.defaultId),\n );\n }, [cronJobs, data, selected]);\n\n useEffect(() => {\n if (panel !== 'cron' || !hasToken) {\n return;\n }\n let cancelled = false;\n setCronLoading(true);\n void listJobs()\n .then((j) => {\n if (!cancelled) {\n setCronJobs(j);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setCronJobs([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setCronLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, hasToken]);\n\n async function onSetCronJobAgent(job: CronJob, agentKey: string) {\n setBusy(true);\n setError(null);\n try {\n await updateJob(job.id, { agentId: agentKey === '' ? null : agentKey });\n setCronJobs(await listJobs());\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setBusy(false);\n }\n }\n\n return {\n agentCronJobs,\n cronJobs,\n cronLoading,\n onSetCronJobAgent,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\n\nimport { fetchSkillsCatalog, type SkillCatalogRow } from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\n\nexport function useSkillsCatalogLoad(enabled: boolean, hasToken: boolean) {\n const [skillCatalog, setSkillCatalog] = useState<SkillCatalogRow[]>([]);\n const [skillsCatalogLoading, setSkillsCatalogLoading] = useState(false);\n\n const catalogForPick = useMemo(\n () => skillCatalog.filter((s) => s.enabled !== false),\n [skillCatalog],\n );\n\n useEffect(() => {\n if (!enabled || !hasToken) {\n return;\n }\n let cancelled = false;\n setSkillsCatalogLoading(true);\n void fetchSkillsCatalog()\n .then((rows) => {\n if (!cancelled) {\n setSkillCatalog(rows);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setSkillCatalog([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setSkillsCatalogLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, hasToken]);\n\n return {\n catalogForPick,\n skillCatalog,\n skillsCatalogLoading,\n };\n}\n\nexport function useAgentsSkillsCatalog(options: { panel: AgentPanel; hasToken: boolean }) {\n return useSkillsCatalogLoad(options.panel === 'skills', options.hasToken);\n}\n","import { useEffect, useState } from 'react';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\n\nexport function useAgentsToolsSkillsLocalState(options: {\n panel: AgentPanel;\n selected: GatewayAgentRow | null;\n}) {\n const { panel, selected } = options;\n\n const [toolEntryDisable, setToolEntryDisable] = useState<Set<string>>(() => new Set());\n const [skillsPick, setSkillsPick] = useState<Set<string>>(() => new Set());\n const [skillsInherit, setSkillsInherit] = useState(true);\n\n useEffect(() => {\n if (!selected || panel !== 'tools') {\n return;\n }\n setToolEntryDisable(new Set(selected.tools.entryDisable));\n }, [panel, selected]);\n\n useEffect(() => {\n if (!selected || panel !== 'skills') {\n return;\n }\n const inherit = selected.skills.entry === undefined;\n setSkillsInherit(inherit);\n if (inherit) {\n const eff = selected.skills.effectiveAllowlist;\n setSkillsPick(new Set(eff ?? []));\n } else {\n setSkillsPick(new Set(selected.skills.entry ?? []));\n }\n }, [panel, selected]);\n\n return {\n toolEntryDisable,\n setToolEntryDisable,\n skillsPick,\n setSkillsPick,\n skillsInherit,\n setSkillsInherit,\n };\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n} from 'react';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\nimport useSWR from 'swr';\n\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n createGatewayAgent,\n deleteGatewayAgent,\n fetchGatewayAgents,\n parseGatewayBindingsFromConfig,\n updateGatewayAgent,\n type GatewayAgentRow,\n type GatewayAgentsPayload,\n} from '@/features/settings/agents-admin-api';\nimport { AGENTS_APP_LIST_PATH, agentsAppDetailPath } from '@/features/settings/agents/agents-app-path';\nimport { SETTINGS_BACK_PATH_STATE_KEY } from '@/features/settings/settings-nav-state';\nimport { suggestWorkspaceFromAgentName } from '@/features/settings/suggest-agent-workspace';\nimport { postDreamingRunNow, type DreamingPhaseId } from '@/features/settings/dreaming-api';\nimport { validateAgentIdForNewAgent } from '@/lib/agent-id';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\n\nimport type { AgentsEditorPanelContentProps } from './agents-editor-panel-content';\nimport { AgentsSettingsToolbar } from './agents-settings-toolbar';\nimport { agentListDisplayName } from './agent-display-names';\nimport { useAgentsBootstrapFiles } from './hooks/use-agents-bootstrap-files';\nimport { useAgentsChannelBindings } from './hooks/use-agents-channel-bindings';\nimport { useAgentsCronJobs } from './hooks/use-agents-cron-jobs';\nimport { useAgentsSkillsCatalog } from './hooks/use-agents-skills-catalog';\nimport { useAgentsToolsSkillsLocalState } from './hooks/use-agents-tools-skills-local-state';\nimport { PRESET_AGENTS_SKIPPED_KEY } from './preset-agents';\nimport type { AgentPanel } from './utils';\n\nexport function useAgentsSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentsSettings;\n\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<GatewayAgentRow | null>(null);\n const [deletePurge, setDeletePurge] = useState(false);\n const [deleteConfirmText, setDeleteConfirmText] = useState('');\n const cCron = m.cron;\n const chat = m.chat;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const { agentId: routeAgentId } = useParams<{ agentId?: string }>();\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n\n const agentsSwrKey = hasToken ? 'settings-gateway-agents' : null;\n const {\n data: swrAgentsData,\n error: swrAgentsError,\n isLoading: agentsLoading,\n mutate: mutateAgents,\n } = useSWR(agentsSwrKey, fetchGatewayAgents, { revalidateOnFocus: false });\n\n const { data: gatewayCfgData } = useGatewayConfigSwr(hasToken);\n\n const bindingsFromConfig = useMemo(\n () => parseGatewayBindingsFromConfig(gatewayCfgData?.payload?.config ?? {}),\n [gatewayCfgData],\n );\n\n const data: GatewayAgentsPayload | null = swrAgentsData ?? null;\n const loading = Boolean(hasToken && agentsLoading);\n const [error, setError] = useState<string | null>(null);\n const loadError =\n swrAgentsError instanceof Error ? swrAgentsError.message : swrAgentsError ? a.loadError : null;\n const displayError = error ?? loadError;\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [showPresetSetup, setShowPresetSetup] = useState(false);\n const [panel, setPanel] = useState<AgentPanel>('overview');\n\n const [createDisplayName, setCreateDisplayName] = useState('');\n const [createAgentId, setCreateAgentId] = useState('');\n const [createDescription, setCreateDescription] = useState('');\n const [createWorkspace, setCreateWorkspace] = useState('');\n const [createModel, setCreateModel] = useState('');\n const [createModalError, setCreateModalError] = useState<string | null>(null);\n const [addAgentModalOpen, setAddAgentModalOpen] = useState(false);\n const createWorkspaceSuggestedRef = useRef('');\n const [busy, setBusy] = useState(false);\n const [sleeping, setSleeping] = useState(false);\n const [listSearchQuery, setListSearchQuery] = useState('');\n\n const [editWorkspace, setEditWorkspace] = useState('');\n const [editModel, setEditModel] = useState('');\n const [editName, setEditName] = useState('');\n const [editDescription, setEditDescription] = useState('');\n\n const profileSaveRef = useRef<(() => Promise<void>) | null>(null);\n const [overviewBootstrapDirty, setOverviewBootstrapDirty] = useState(false);\n const [profileDirty, setProfileDirty] = useState(false);\n const [savedFlash, setSavedFlash] = useState(false);\n\n useEffect(() => {\n if (!data) {\n return;\n }\n if (routeAgentId && data.agents.some((x) => x.id === routeAgentId)) {\n setSelectedId(routeAgentId);\n return;\n }\n setSelectedId((prev) => {\n if (prev && data.agents.some((x) => x.id === prev)) {\n return prev;\n }\n return data.defaultId;\n });\n }, [data, routeAgentId]);\n\n useEffect(() => {\n if (!data || loading) {\n return;\n }\n const onlyMain =\n data.agents.length <= 1 && data.agents.every((ag) => ag.id === data.defaultId);\n const skipped = localStorage.getItem(PRESET_AGENTS_SKIPPED_KEY) === 'true';\n setShowPresetSetup(onlyMain && !skipped);\n }, [data, loading]);\n\n const onPresetSetupComplete = useCallback(() => {\n setShowPresetSetup(false);\n void mutateAgents();\n }, [mutateAgents]);\n\n const onPresetSetupSkip = useCallback(() => {\n setShowPresetSetup(false);\n }, []);\n\n useEffect(() => {\n if (!data || !routeAgentId) {\n return;\n }\n if (!data.agents.some((x) => x.id === routeAgentId)) {\n navigate(AGENTS_APP_LIST_PATH, { replace: true });\n }\n }, [data, routeAgentId, navigate]);\n\n useEffect(() => {\n if (routeAgentId) {\n setPanel('overview');\n }\n }, [routeAgentId]);\n\n useEffect(() => {\n if (searchParams.get('panel') !== 'defaults') {\n return;\n }\n navigate('/settings/agent-chat', {\n replace: true,\n state: { [SETTINGS_BACK_PATH_STATE_KEY]: AGENTS_APP_LIST_PATH },\n });\n }, [searchParams, navigate]);\n\n useEffect(() => {\n if (searchParams.get('focus') !== 'avatar' || !routeAgentId) {\n return;\n }\n setPanel('overview');\n if (loading || !data?.agents.some((x) => x.id === routeAgentId)) {\n return;\n }\n const t = window.setTimeout(() => {\n document.getElementById('agent-avatar-settings')?.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n });\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n next.delete('focus');\n return next;\n },\n { replace: true },\n );\n }, 220);\n return () => window.clearTimeout(t);\n }, [searchParams, routeAgentId, loading, data, setSearchParams]);\n\n const selected = useMemo(\n () => data?.agents.find((x) => x.id === selectedId) ?? null,\n [data, selectedId],\n );\n\n const bootstrap = useAgentsBootstrapFiles({\n panel,\n selectedId,\n hasToken,\n dataAgentsLength: data?.agents.length,\n saveErrorMessage: a.saveError,\n setError,\n });\n\n const toolsSkills = useAgentsToolsSkillsLocalState({ panel, selected });\n\n const channels = useAgentsChannelBindings({\n panel,\n hasToken,\n bindingsFromConfig,\n gatewayCfgLoading: gatewayCfgData === undefined,\n selected,\n saveErrorMessage: a.saveError,\n setBusy,\n setError,\n });\n\n const cron = useAgentsCronJobs({\n panel,\n hasToken,\n data,\n selected,\n saveErrorMessage: a.saveError,\n setBusy,\n setError,\n });\n\n const skillsCatalog = useAgentsSkillsCatalog({ panel, hasToken });\n\n useEffect(() => {\n if (!selected) {\n setEditWorkspace('');\n setEditModel('');\n setEditName('');\n setEditDescription('');\n return;\n }\n setEditWorkspace(selected.workspace);\n setEditModel(selected.model?.primary ?? '');\n setEditName(agentListDisplayName(selected, messages(language).agentsSettings));\n setEditDescription(selected.description?.trim() ?? '');\n }, [selected?.id, language]);\n\n const applyCreateWorkspaceSuggestion = useCallback(() => {\n const next = suggestWorkspaceFromAgentName(createAgentId.trim() || createDisplayName);\n setCreateWorkspace((prev) => {\n if (prev === '' || prev === createWorkspaceSuggestedRef.current) {\n createWorkspaceSuggestedRef.current = next;\n return next;\n }\n return prev;\n });\n }, [createAgentId, createDisplayName]);\n\n const openAddAgentModal = useCallback(() => {\n createWorkspaceSuggestedRef.current = '';\n setCreateDisplayName('');\n setCreateAgentId('');\n setCreateDescription('');\n setCreateWorkspace('');\n setCreateModel('');\n setCreateModalError(null);\n setAddAgentModalOpen(true);\n }, []);\n\n const sleep = useCallback((ms: number) => new Promise<void>((resolve) => window.setTimeout(resolve, ms)), []);\n\n const triggerSleepSequence = useCallback(async () => {\n if (sleeping || busy) return;\n setSleeping(true);\n setError(null);\n\n const phases: DreamingPhaseId[] = ['light', 'deep', 'rem'];\n try {\n void (async () => {\n for (const phase of phases) {\n try {\n await postDreamingRunNow(phase);\n } catch {\n // Animation-first: errors are intentionally not surfaced here.\n }\n }\n })();\n\n for (let idx = 0; idx < phases.length; idx++) {\n const phase = phases[idx];\n window.dispatchEvent(new CustomEvent('dreaming-phase-start', { detail: { phase, source: 'ui' } }));\n\n const displayMs = phase === 'light' ? 7000 : phase === 'deep' ? 9000 : 8000;\n await sleep(displayMs);\n\n if (idx === phases.length - 1) {\n (window as unknown as { __xopcDreamingIgnoreSseUntil?: number }).__xopcDreamingIgnoreSseUntil =\n Date.now() + 60_000;\n window.dispatchEvent(new CustomEvent('dreaming-phase-end', { detail: { phase, source: 'ui' } }));\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setSleeping(false);\n }\n }, [a.saveError, busy, sleeping, sleep]);\n\n const agentsHeaderEnd = useMemo(\n () => (\n <AgentsSettingsToolbar\n language={language}\n a={a}\n busy={busy}\n sleeping={sleeping}\n listSearchQuery={listSearchQuery}\n onListSearchQueryChange={setListSearchQuery}\n onSleep={() => void triggerSleepSequence()}\n onAddAgent={() => openAddAgentModal()}\n />\n ),\n [a, busy, language, listSearchQuery, openAddAgentModal, sleeping, triggerSleepSequence],\n );\n\n useLayoutEffect(() => {\n if (!hasToken) {\n clearPageHeader();\n return () => clearPageHeader();\n }\n setPageHeader({\n startExtra: null,\n main: null,\n end: agentsHeaderEnd,\n });\n return () => clearPageHeader();\n }, [agentsHeaderEnd, clearPageHeader, hasToken, setPageHeader]);\n\n async function onCreate(e: FormEvent) {\n e.preventDefault();\n const name = createDisplayName.trim();\n if (!name) {\n return;\n }\n const idRes = validateAgentIdForNewAgent(createAgentId, name);\n if (idRes.ok === false) {\n setCreateModalError(idRes.error);\n return;\n }\n const wsInput = createWorkspace.trim();\n const workspace = wsInput || suggestWorkspaceFromAgentName(createAgentId.trim() || name);\n if (!workspace) {\n return;\n }\n setBusy(true);\n setCreateModalError(null);\n try {\n const desc = createDescription.trim();\n const next = await createGatewayAgent({\n name,\n workspace,\n ...(createAgentId.trim() ? { id: createAgentId.trim() } : {}),\n ...(createModel.trim() ? { model: createModel.trim() } : {}),\n ...(desc ? { description: desc } : {}),\n });\n const { createdAgentId, ...agentsPayload } = next;\n void mutateAgents(agentsPayload, { revalidate: false });\n setCreateDisplayName('');\n setCreateAgentId('');\n setCreateDescription('');\n setCreateWorkspace('');\n setCreateModel('');\n setCreateModalError(null);\n setAddAgentModalOpen(false);\n setSelectedId(createdAgentId);\n navigate(agentsAppDetailPath(createdAgentId));\n } catch (err) {\n setCreateModalError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onSaveAgentEdits() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const descTrim = editDescription.trim();\n const next = await updateGatewayAgent(selected.id, {\n name: editName.trim() || undefined,\n description: descTrim.length > 0 ? descTrim : null,\n workspace: editWorkspace.trim() || undefined,\n model: editModel.trim() || null,\n });\n void mutateAgents(next, { revalidate: false });\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onSetDefault(agent: GatewayAgentRow) {\n setBusy(true);\n setError(null);\n try {\n const next = await updateGatewayAgent(agent.id, { setDefault: true });\n void mutateAgents(next, { revalidate: false });\n setSelectedId(agent.id);\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function performDelete(agent: GatewayAgentRow, purge: boolean) {\n setBusy(true);\n setError(null);\n try {\n const next = await deleteGatewayAgent(agent.id, purge);\n void mutateAgents(next, { revalidate: false });\n setSelectedId(next.defaultId);\n setPanel('overview');\n if (routeAgentId === agent.id) {\n navigate(AGENTS_APP_LIST_PATH, { replace: true });\n }\n setDeleteDialogOpen(false);\n setDeleteTarget(null);\n setDeleteConfirmText('');\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n function onDelete(agent: GatewayAgentRow, purge: boolean) {\n if (agent.id === 'main') {\n return;\n }\n setDeleteTarget(agent);\n setDeletePurge(purge);\n setDeleteConfirmText('');\n setDeleteDialogOpen(true);\n }\n\n async function onSaveTools() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const toolsDisable = [...toolsSkills.toolEntryDisable].sort((x, y) => x.localeCompare(y));\n const next = await updateGatewayAgent(selected.id, { toolsDisable });\n void mutateAgents(next, { revalidate: false });\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onClearToolsEntry() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const next = await updateGatewayAgent(selected.id, { toolsDisable: null });\n void mutateAgents(next, { revalidate: false });\n toolsSkills.setToolEntryDisable(new Set());\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onSaveSkills() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const next = await updateGatewayAgent(selected.id, {\n skills: toolsSkills.skillsInherit\n ? null\n : [...toolsSkills.skillsPick].sort((x, y) => x.localeCompare(y)),\n });\n void mutateAgents(next, { revalidate: false });\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n const footerSaveNotApplicable = panel === 'channels' || panel === 'cron';\n\n const overviewRestDirty = (() => {\n if (!selected || panel !== 'overview') return false;\n const origName = agentListDisplayName(selected, a);\n const origDesc = selected.description?.trim() ?? '';\n const origWorkspace = selected.workspace;\n const origModel = selected.model?.primary ?? '';\n return (\n editName.trim() !== origName ||\n editDescription.trim() !== origDesc ||\n editWorkspace.trim() !== origWorkspace ||\n editModel.trim() !== origModel\n );\n })();\n\n const isCurrentPanelDirty = (() => {\n if (footerSaveNotApplicable) return false;\n switch (panel) {\n case 'overview':\n return overviewRestDirty || overviewBootstrapDirty;\n case 'profile':\n return profileDirty;\n default:\n return true;\n }\n })();\n\n const footerSaveDisabled = footerSaveNotApplicable || !isCurrentPanelDirty;\n\n function showSavedFlash() {\n setSavedFlash(true);\n setTimeout(() => setSavedFlash(false), 2000);\n }\n\n async function handleModalFooterSave() {\n switch (panel) {\n case 'overview':\n await Promise.all([\n onSaveAgentEdits(),\n bootstrap.overviewSaveBootstrapRef.current?.() ?? Promise.resolve(),\n ]);\n showSavedFlash();\n break;\n case 'profile':\n await profileSaveRef.current?.();\n showSavedFlash();\n break;\n case 'tools':\n await onSaveTools();\n showSavedFlash();\n break;\n case 'skills':\n await onSaveSkills();\n showSavedFlash();\n break;\n case 'files':\n bootstrap.saveBootstrapDebounced.flush();\n showSavedFlash();\n break;\n default:\n break;\n }\n }\n\n function onAgentModalOpenChange(open: boolean) {\n if (!open) {\n navigate(AGENTS_APP_LIST_PATH);\n }\n }\n\n const modalTitle = selected ? editName.trim() || agentListDisplayName(selected, a) : (routeAgentId ?? '');\n const modalSubtitle = selected?.id ?? routeAgentId ?? '';\n\n const editorPanelProps: AgentsEditorPanelContentProps = {\n a,\n chat,\n cCron,\n selected,\n panel,\n data,\n busy,\n editName,\n setEditName,\n editDescription,\n setEditDescription,\n editWorkspace,\n setEditWorkspace,\n editModel,\n setEditModel,\n onSetDefault: () => {\n if (!selected) return;\n void onSetDefault(selected);\n },\n onSaveAgentEdits: () => void onSaveAgentEdits(),\n onDelete: (purge: boolean) => {\n if (!selected) return;\n void onDelete(selected, purge);\n },\n overviewSaveBootstrapRef: bootstrap.overviewSaveBootstrapRef,\n profileSaveRef,\n setOverviewBootstrapDirty,\n setProfileDirty,\n filesLoading: bootstrap.filesLoading,\n files: bootstrap.files,\n activeFile: bootstrap.activeFile,\n setActiveFile: bootstrap.setActiveFile,\n bootstrapViewMode: bootstrap.bootstrapViewMode,\n setBootstrapViewMode: bootstrap.setBootstrapViewMode,\n fileDraft: bootstrap.fileDraft,\n setFileDraft: bootstrap.setFileDraft,\n fileSaving: bootstrap.fileSaving,\n bootstrapFileLoading: bootstrap.bootstrapFileLoading,\n bootstrapEditorNonce: bootstrap.bootstrapEditorNonce,\n toolEntryDisable: toolsSkills.toolEntryDisable,\n setToolEntryDisable: toolsSkills.setToolEntryDisable,\n onSaveTools: () => void onSaveTools(),\n onClearToolsEntry: () => void onClearToolsEntry(),\n skillsCatalogLoading: skillsCatalog.skillsCatalogLoading,\n catalogForPick: skillsCatalog.catalogForPick,\n skillsInherit: toolsSkills.skillsInherit,\n setSkillsInherit: toolsSkills.setSkillsInherit,\n skillsPick: toolsSkills.skillsPick,\n setSkillsPick: toolsSkills.setSkillsPick,\n onSaveSkills: () => void onSaveSkills(),\n bindingsLoading: channels.bindingsLoading,\n agentBindings: channels.agentBindings,\n bindChannelStatuses: channels.bindChannelStatuses,\n bindChannelsLoading: channels.bindChannelsLoading,\n useManualChannel: channels.useManualChannel,\n newBindChannel: channels.newBindChannel,\n setNewBindChannel: channels.setNewBindChannel,\n bindSessionChats: channels.bindSessionChats,\n bindSessionsLoading: channels.bindSessionsLoading,\n newBindSessionIdx: channels.newBindSessionIdx,\n setNewBindSessionIdx: channels.setNewBindSessionIdx,\n newBindCustomPeer: channels.newBindCustomPeer,\n setNewBindCustomPeer: channels.setNewBindCustomPeer,\n refreshBindSessions: channels.refreshBindSessions,\n onRemoveBinding: (rule) => void channels.onRemoveBinding(rule),\n onAddBinding: channels.onAddBinding,\n cronLoading: cron.cronLoading,\n agentCronJobs: cron.agentCronJobs,\n onSetCronJobAgent: (job, key) => void cron.onSetCronJobAgent(job, key),\n };\n\n return {\n hasToken,\n a,\n chat,\n language,\n data,\n loading,\n displayError,\n navigate,\n routeAgentId,\n showPresetSetup,\n onPresetSetupComplete,\n onPresetSetupSkip,\n busy,\n listSearchQuery,\n openAddAgentModal,\n panel,\n setPanel,\n modalTitle,\n modalSubtitle,\n footerSaveDisabled,\n savedFlash,\n handleModalFooterSave,\n onAgentModalOpenChange,\n addAgentModalOpen,\n setAddAgentModalOpen,\n createWorkspaceSuggestedRef,\n createModalError,\n setCreateModalError,\n createDisplayName,\n setCreateDisplayName,\n createAgentId,\n setCreateAgentId,\n createDescription,\n setCreateDescription,\n createWorkspace,\n setCreateWorkspace,\n createModel,\n setCreateModel,\n onCreate,\n applyCreateWorkspaceSuggestion,\n deleteDialogOpen,\n setDeleteDialogOpen,\n deletePurge,\n deleteTarget,\n setDeleteTarget,\n deleteConfirmText,\n setDeleteConfirmText,\n performDelete,\n editorPanelProps,\n };\n}\n","import { AgentDeleteConfirmDialog } from './agent-delete-confirm-dialog';\nimport { agentsAppDetailPath } from './agents-app-path';\nimport { AgentsEditorModal } from './agents-editor-modal';\nimport { AgentsEditorPanelContent } from './agents-editor-panel-content';\nimport { AgentsListGrid } from './agents-list-grid';\nimport { AgentsSettingsHeader } from './agents-settings-header';\nimport { CreateAgentDialog } from './create-agent-dialog';\nimport { PresetAgentsSetup } from './preset-agents-setup';\nimport { useAgentsSettingsPanel } from './use-agents-settings-panel';\n\nexport function AgentsSettingsPanel() {\n const vm = useAgentsSettingsPanel();\n\n if (!vm.hasToken) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <h1 className=\"text-lg font-semibold text-fg\">{vm.a.title}</h1>\n <p className=\"text-sm text-fg-muted\">{vm.a.needToken}</p>\n </div>\n );\n }\n\n if (vm.showPresetSetup && vm.data) {\n const existingIds = new Set(vm.data.agents.map((ag) => ag.id));\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col px-4 py-8\">\n <PresetAgentsSetup\n existingAgentIds={existingIds}\n onComplete={vm.onPresetSetupComplete}\n onSkip={vm.onPresetSetupSkip}\n />\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <AgentsSettingsHeader a={vm.a} />\n\n {vm.displayError ? (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200\">\n {vm.displayError}\n </div>\n ) : null}\n\n {vm.loading ? (\n <p className=\"text-sm text-fg-muted\">{vm.a.loading}</p>\n ) : vm.data ? (\n <AgentsListGrid\n a={vm.a}\n agents={vm.data.agents}\n searchQuery={vm.listSearchQuery}\n onOpenAgent={(id) => vm.navigate(agentsAppDetailPath(id))}\n onChatWithAgent={(id) =>\n vm.navigate('/chat/new', { state: { agentId: id.trim().toLowerCase() } })\n }\n onNewAgent={vm.openAddAgentModal}\n busy={vm.busy}\n />\n ) : null}\n\n {vm.routeAgentId && vm.hasToken ? (\n <AgentsEditorModal\n open={Boolean(vm.routeAgentId)}\n onOpenChange={vm.onAgentModalOpenChange}\n a={vm.a}\n title={vm.modalTitle}\n subtitle={vm.modalSubtitle}\n panel={vm.panel}\n onPanelChange={vm.setPanel}\n onFooterSave={() => void vm.handleModalFooterSave()}\n footerSaveDisabled={vm.footerSaveDisabled}\n footerSavedFlash={vm.savedFlash}\n busy={vm.busy}\n >\n {vm.loading || !vm.data ? (\n <p className=\"text-sm text-fg-muted\">{vm.a.loading}</p>\n ) : (\n <AgentsEditorPanelContent {...vm.editorPanelProps} />\n )}\n </AgentsEditorModal>\n ) : null}\n\n <CreateAgentDialog\n open={vm.addAgentModalOpen}\n onOpenChange={(open) => {\n vm.setAddAgentModalOpen(open);\n if (!open) {\n vm.createWorkspaceSuggestedRef.current = '';\n vm.setCreateDisplayName('');\n vm.setCreateAgentId('');\n vm.setCreateDescription('');\n vm.setCreateWorkspace('');\n vm.setCreateModel('');\n vm.setCreateModalError(null);\n }\n }}\n a={vm.a}\n chat={vm.chat}\n busy={vm.busy}\n modalError={vm.createModalError}\n createDisplayName={vm.createDisplayName}\n setCreateDisplayName={vm.setCreateDisplayName}\n createAgentId={vm.createAgentId}\n setCreateAgentId={vm.setCreateAgentId}\n createDescription={vm.createDescription}\n setCreateDescription={vm.setCreateDescription}\n createWorkspace={vm.createWorkspace}\n setCreateWorkspace={vm.setCreateWorkspace}\n createModel={vm.createModel}\n setCreateModel={vm.setCreateModel}\n onCreate={vm.onCreate}\n onSuggestWorkspace={() => vm.applyCreateWorkspaceSuggestion()}\n />\n\n <AgentDeleteConfirmDialog\n open={vm.deleteDialogOpen}\n onOpenChange={(open) => {\n vm.setDeleteDialogOpen(open);\n if (!open) {\n vm.setDeleteTarget(null);\n vm.setDeleteConfirmText('');\n }\n }}\n busy={vm.busy}\n deletePurge={vm.deletePurge}\n deleteTarget={vm.deleteTarget}\n deleteConfirmText={vm.deleteConfirmText}\n onDeleteConfirmTextChange={vm.setDeleteConfirmText}\n onConfirm={() => {\n if (!vm.deleteTarget) return;\n void vm.performDelete(vm.deleteTarget, vm.deletePurge);\n }}\n onCancel={() => vm.setDeleteDialogOpen(false)}\n a={vm.a}\n />\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function AgentDefaultsField({\n label,\n description,\n children,\n}: {\n label: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-sm font-medium text-fg\">{label}</div>\n {children}\n <p className=\"text-xs leading-relaxed text-fg-subtle\">{description}</p>\n </div>\n );\n}\n","import { Cpu, SlidersHorizontal, Zap } from 'lucide-react';\n\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nconst THINKING_KEYS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive'] as const;\n\nexport function AgentDefaultsBasicsPanel(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Cpu} title={a.cardModelsTitle} subtitle={a.label.model} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.model} description={a.desc.model}>\n <ModelSelector\n value={form.model}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(modelId) => update({ model: modelId })}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={SlidersHorizontal} title={a.cardGenerationTitle} subtitle={a.cardGenerationSubtitle} />\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.maxTokens} description={a.desc.maxTokens}>\n <input\n type=\"number\"\n className={inputClassName()}\n value={form.maxTokens}\n min={1}\n onChange={(e) => update({ maxTokens: Number.parseInt(e.target.value, 10) || 0 })}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.temperature} description={a.desc.temperature}>\n <input\n type=\"number\"\n className={inputClassName()}\n value={form.temperature}\n min={0}\n max={2}\n step={0.1}\n onChange={(e) => update({ temperature: Number.parseFloat(e.target.value) || 0 })}\n />\n </AgentDefaultsField>\n <div className=\"sm:col-span-2\">\n <AgentDefaultsField label={a.label.maxToolIterations} description={a.desc.maxToolIterations}>\n <input\n type=\"number\"\n className={inputClassName()}\n value={form.maxToolIterations}\n min={1}\n onChange={(e) => update({ maxToolIterations: Number.parseInt(e.target.value, 10) || 0 })}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Zap} title={a.cardBehaviorTitle} subtitle={a.cardBehaviorSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.thinkingDefault} description={a.desc.thinkingDefault}>\n <select\n className={selectClassName()}\n value={form.thinkingDefault}\n onChange={(e) => update({ thinkingDefault: e.target.value })}\n >\n {THINKING_KEYS.map((k) => (\n <option key={k} value={k}>\n {chat.thinkingLevels[k]}\n </option>\n ))}\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.reasoningDefault} description={a.desc.reasoningDefault}>\n <select\n className={selectClassName()}\n value={form.reasoningDefault}\n onChange={(e) => update({ reasoningDefault: e.target.value })}\n >\n <option value=\"off\">{a.reasoning.off}</option>\n <option value=\"on\">{a.reasoning.on}</option>\n <option value=\"stream\">{a.reasoning.stream}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.verboseDefault} description={a.desc.verboseDefault}>\n <select\n className={selectClassName()}\n value={form.verboseDefault}\n onChange={(e) => update({ verboseDefault: e.target.value })}\n >\n <option value=\"off\">{a.verbose.off}</option>\n <option value=\"on\">{a.verbose.on}</option>\n <option value=\"full\">{a.verbose.full}</option>\n </select>\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Globe } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsBrowserPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Globe} title={a.cardBrowserTitle} subtitle={a.cardBrowserSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.browserEnabled} description={a.desc.browserEnabled}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.browserEnabled}\n onChange={(e) => update({ browserEnabled: e.target.checked })}\n />\n <span>{a.browserEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserHeadless} description={a.desc.browserHeadless}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.browserHeadless}\n onChange={(e) => update({ browserHeadless: e.target.checked })}\n />\n <span>{a.browserHeadlessOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserAllowPrivateUrls} description={a.desc.browserAllowPrivateUrls}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.browserAllowPrivateUrls}\n onChange={(e) => update({ browserAllowPrivateUrls: e.target.checked })}\n />\n <span>{a.browserAllowPrivateOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserCommandTimeout} description={a.desc.browserCommandTimeout}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={5}\n value={form.browserCommandTimeout ?? ''}\n placeholder=\"30\"\n onChange={(e) => {\n const v = e.target.value;\n update({ browserCommandTimeout: v === '' ? undefined : Number.parseInt(v, 10) });\n }}\n />\n </AgentDefaultsField>\n </div>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.browserCloudProvider} description={a.desc.browserCloudProvider}>\n <select\n className={selectClassName()}\n value={form.browserCloudProvider}\n onChange={(e) =>\n update({\n browserCloudProvider: e.target.value as 'local' | 'browserbase' | 'browser-use',\n })\n }\n >\n <option value=\"local\">{a.browserCloudProviderLocal}</option>\n <option value=\"browserbase\">{a.browserCloudProviderBrowserbase}</option>\n <option value=\"browser-use\">{a.browserCloudProviderBrowserUse}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserDialogPolicy} description={a.desc.browserDialogPolicy}>\n <select\n className={selectClassName()}\n value={form.browserDialogPolicy}\n onChange={(e) =>\n update({\n browserDialogPolicy: e.target.value as\n | 'must_respond'\n | 'auto_dismiss'\n | 'auto_accept',\n })\n }\n >\n <option value=\"must_respond\">{a.browserDialogPolicyMustRespond}</option>\n <option value=\"auto_dismiss\">{a.browserDialogPolicyAutoDismiss}</option>\n <option value=\"auto_accept\">{a.browserDialogPolicyAutoAccept}</option>\n </select>\n </AgentDefaultsField>\n </div>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.browserCdpUrl} description={a.desc.browserCdpUrl}>\n <input\n type=\"text\"\n className={inputClassName()}\n value={form.browserCdpUrl}\n placeholder=\"ws://localhost:9222\"\n onChange={(e) => update({ browserCdpUrl: e.target.value })}\n autoComplete=\"off\"\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserDialogTimeout} description={a.desc.browserDialogTimeout}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.browserDialogTimeout ?? ''}\n placeholder=\"300\"\n onChange={(e) => {\n const v = e.target.value;\n update({ browserDialogTimeout: v === '' ? undefined : Number.parseInt(v, 10) });\n }}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { fetchGatewayAgents } from '@/features/settings/agents-admin-api';\n\nexport function useBuiltinToolIdsLoad(enabled: boolean, hasToken: boolean) {\n const [builtinToolIds, setBuiltinToolIds] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!enabled || !hasToken) {\n return;\n }\n let cancelled = false;\n setLoading(true);\n void fetchGatewayAgents()\n .then((p) => {\n if (!cancelled) {\n setBuiltinToolIds(Array.isArray(p.builtinToolIds) ? p.builtinToolIds : []);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setBuiltinToolIds([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, hasToken]);\n\n return { builtinToolIds, loading };\n}\n","import { Wrench } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { BuiltinToolsDisableUi, sortedDisableList } from '../builtin-tools-disable-ui';\nimport type { BuiltinToolUiGroupKey } from '../builtin-tool-disable-groups';\nimport { useBuiltinToolIdsLoad } from '../hooks/use-builtin-tool-ids';\n\nexport function AgentDefaultsBuiltinToolsDisableSection(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const agentsTab = m.agentsSettings;\n const token = useGatewayStore((s) => s.token);\n const hasToken = Boolean(token);\n const { builtinToolIds, loading } = useBuiltinToolIdsLoad(true, hasToken);\n\n const disableSet = useMemo(\n () => new Set(form.toolsDisable.map((s) => s.trim()).filter(Boolean)),\n [form.toolsDisable],\n );\n\n const unknownDisabled = useMemo(\n () =>\n form.toolsDisable\n .map((s) => s.trim())\n .filter(Boolean)\n .filter((id) => !builtinToolIds.includes(id))\n .sort((x, y) => x.localeCompare(y)),\n [form.toolsDisable, builtinToolIds],\n );\n\n const onDisableSetChange = useCallback(\n (next: Set<string>) => {\n update({ toolsDisable: sortedDisableList(next) });\n },\n [update],\n );\n\n const groups = agentsTab.toolsDisableGroups;\n const getGroupTitle = useCallback((key: BuiltinToolUiGroupKey) => groups[key], [groups]);\n\n const getToolDescription = useCallback(\n (tid: string) =>\n tid in agentsTab.toolDescriptions\n ? agentsTab.toolDescriptions[tid as keyof typeof agentsTab.toolDescriptions]\n : '',\n [agentsTab.toolDescriptions],\n );\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Wrench} title={x.cardToolsDisableTitle} subtitle={x.cardToolsDisableSubtitle} />\n <AgentDefaultsField label={x.toolsDisableFieldLabel} description={x.toolsDisableHint}>\n <div className=\"flex flex-col gap-3\">\n {!hasToken ? (\n <p className=\"text-xs text-fg-muted\">{a.needToken}</p>\n ) : (\n <BuiltinToolsDisableUi\n mode=\"defaults\"\n builtinToolIds={builtinToolIds}\n loading={loading}\n disableSet={disableSet}\n onDisableSetChange={onDisableSetChange}\n unknownDisabledIds={unknownDisabled}\n getToolDescription={getToolDescription}\n getGroupTitle={getGroupTitle}\n quickActionsDisabled={loading}\n labels={{\n loadingBuiltin: x.toolsDisableLoadingBuiltin,\n emptyBuiltin: x.toolsDisableEmptyBuiltin,\n quickActionsLabel: x.toolsDisableQuickActionsLabel,\n quickEnableAll: x.toolsDisableQuickEnableAll,\n quickDisableAll: x.toolsDisableQuickDisableAll,\n quickReadOnlyWorkspace: x.toolsDisableQuickReadOnlyWorkspace,\n quickHighRiskOff: x.toolsDisableQuickHighRiskOff,\n quickNoOutbound: x.toolsDisableQuickNoOutbound,\n notInBuiltin: x.toolsDisableNotInBuiltin,\n lockedByDefaults: agentsTab.toolsLockedByDefaults,\n }}\n />\n )}\n </div>\n </AgentDefaultsField>\n </SettingsFormSection>\n );\n}\n","import { Code2, FileText } from 'lucide-react';\n\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\nimport { AgentDefaultsBuiltinToolsDisableSection } from './builtin-tools-disable-section';\n\nexport function AgentDefaultsCapabilitiesPanel(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={FileText}\n title={x.cardWebExtractTitle}\n subtitle={x.cardWebExtractSubtitle}\n />\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <div className=\"sm:col-span-2\">\n <AgentDefaultsField label={x.webExtractModel} description={x.webExtractModelDesc}>\n <ModelSelector\n value={form.webExtract.model}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(modelId) => update({ webExtract: { ...form.webExtract, model: modelId } })}\n />\n </AgentDefaultsField>\n </div>\n <AgentDefaultsField label={x.webExtractMaxLength} description={x.webExtractMaxLengthDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.webExtract.maxLength ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n webExtract: {\n ...form.webExtract,\n maxLength: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Code2} title={x.cardDelegateTitle} subtitle={x.cardDelegateSubtitle} />\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.delegateEnabled} description={x.delegateEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.delegate.enabled}\n onChange={(e) => update({ delegate: { ...form.delegate, enabled: e.target.checked } })}\n />\n <span>{x.delegateEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.executeCodeEnabled} description={x.executeCodeEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.executeCode.enabled}\n onChange={(e) =>\n update({ executeCode: { ...form.executeCode, enabled: e.target.checked } })\n }\n />\n <span>{x.executeCodeEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n\n <AgentDefaultsBuiltinToolsDisableSection {...props} />\n </div>\n );\n}\n","import { Layers2, Scissors, Timer } from 'lucide-react';\n\nimport type { AgentDefaultsState } from '@/features/settings/config-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsContextPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Timer} title={x.cardLimitsTitle} subtitle={x.cardLimitsSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.maxTaskDurationMs} description={x.maxTaskDurationMsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n max={240}\n step={1}\n value={form.maxTaskDurationMinutes ?? ''}\n placeholder={x.maxTaskDurationPlaceholder}\n onChange={(e) => {\n const v = e.target.value;\n if (v === '') {\n update({ maxTaskDurationMinutes: undefined });\n return;\n }\n const num = Number.parseInt(v, 10);\n if (Number.isNaN(num)) {\n return;\n }\n update({ maxTaskDurationMinutes: Math.min(240, Math.max(1, num)) });\n }}\n />\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.maxRequestsPerTurn} description={x.maxRequestsPerTurnDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={10}\n max={200}\n value={form.maxRequestsPerTurn}\n onChange={(e) => update({ maxRequestsPerTurn: Number.parseInt(e.target.value, 10) || 50 })}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.maxToolFailuresPerTurn} description={x.maxToolFailuresPerTurnDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n max={20}\n value={form.maxToolFailuresPerTurn}\n onChange={(e) => update({ maxToolFailuresPerTurn: Number.parseInt(e.target.value, 10) || 3 })}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Layers2} title={x.cardCompactionTitle} subtitle={x.cardCompactionSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.compactionEnabled} description={x.compactionEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.compaction.enabled}\n onChange={(e) =>\n update({ compaction: { ...form.compaction, enabled: e.target.checked } })\n }\n />\n <span>{x.compactionEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.compactionMode} description={x.compactionModeDesc}>\n <select\n className={selectClassName()}\n value={form.compaction.mode}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n mode: e.target.value as AgentDefaultsState['compaction']['mode'],\n },\n })\n }\n >\n <option value=\"default\">{x.compactionModeDefault}</option>\n <option value=\"safeguard\">{x.compactionModeSafeguard}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reserveTokens} description={x.reserveTokensDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1000}\n value={form.compaction.reserveTokens}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n reserveTokens: Number.parseInt(e.target.value, 10) || 0,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.triggerThreshold} description={x.triggerThresholdDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0.5}\n max={0.95}\n step={0.05}\n value={form.compaction.triggerThreshold}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n triggerThreshold: Number.parseFloat(e.target.value) || 0.8,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.minMessagesBeforeCompact} description={x.minMessagesBeforeCompactDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.compaction.minMessagesBeforeCompact}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n minMessagesBeforeCompact: Number.parseInt(e.target.value, 10) || 10,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.keepRecentMessages} description={x.keepRecentMessagesDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n value={form.compaction.keepRecentMessages}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n keepRecentMessages: Number.parseInt(e.target.value, 10) || 5,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.evictionWindow} description={x.evictionWindowDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0.1}\n max={0.5}\n step={0.05}\n value={form.compaction.evictionWindow}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n evictionWindow: Number.parseFloat(e.target.value) || 0.2,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.retentionWindow} description={x.retentionWindowDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={3}\n max={20}\n value={form.compaction.retentionWindow}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n retentionWindow: Number.parseInt(e.target.value, 10) || 6,\n },\n })\n }\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Scissors} title={x.cardPruningTitle} subtitle={x.cardPruningSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.pruningEnabled} description={x.pruningEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.pruning.enabled}\n onChange={(e) => update({ pruning: { ...form.pruning, enabled: e.target.checked } })}\n />\n <span>{x.pruningEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.maxToolResultChars} description={x.maxToolResultCharsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1000}\n value={form.pruning.maxToolResultChars}\n onChange={(e) =>\n update({\n pruning: {\n ...form.pruning,\n maxToolResultChars: Number.parseInt(e.target.value, 10) || 10000,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.headKeepRatio} description={x.headKeepRatioDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n max={1}\n step={0.05}\n value={form.pruning.headKeepRatio}\n onChange={(e) =>\n update({\n pruning: { ...form.pruning, headKeepRatio: Number.parseFloat(e.target.value) || 0.3 },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.tailKeepRatio} description={x.tailKeepRatioDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n max={1}\n step={0.05}\n value={form.pruning.tailKeepRatio}\n onChange={(e) =>\n update({\n pruning: { ...form.pruning, tailKeepRatio: Number.parseFloat(e.target.value) || 0.3 },\n })\n }\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Clock } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsExpertPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Clock} title={x.cardParamsTitle} subtitle={x.cardParamsSubtitle} />\n <AgentDefaultsField label={x.paramsJson} description={x.paramsJsonDesc}>\n <textarea\n className={cn(inputClassName(), 'min-h-[88px] resize-y font-mono text-xs')}\n value={form.paramsJson}\n placeholder=\"{}\"\n onChange={(e) => update({ paramsJson: e.target.value })}\n />\n </AgentDefaultsField>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Brain, Search, Sparkles } from 'lucide-react';\n\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport type { AgentDefaultsState } from '@/features/settings/config-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsMemoryPanel(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Brain} title={x.cardMemoryTitle} subtitle={x.cardMemorySubtitle} />\n <div className=\"flex flex-col gap-5\">\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.memoryEnabled} description={x.memoryEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.memory.enabled}\n onChange={(e) => update({ memory: { ...form.memory, enabled: e.target.checked } })}\n />\n <span>{x.memoryEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.useEnhancedSystem} description={x.useEnhancedSystemDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.memory.useEnhancedSystem}\n onChange={(e) =>\n update({ memory: { ...form.memory, useEnhancedSystem: e.target.checked } })\n }\n />\n <span>{x.useEnhancedSystemOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.userProfileEnabled} description={x.userProfileEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.memory.userProfileEnabled}\n onChange={(e) =>\n update({ memory: { ...form.memory, userProfileEnabled: e.target.checked } })\n }\n />\n <span>{x.userProfileEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.memoryProvider} description={x.memoryProviderDesc}>\n <select\n className={selectClassName()}\n value={form.memory.provider}\n onChange={(e) =>\n update({\n memory: {\n ...form.memory,\n provider: e.target.value as AgentDefaultsState['memory']['provider'],\n },\n })\n }\n >\n <option value=\"\">{x.memoryProviderUnset}</option>\n <option value=\"none\">none</option>\n <option value=\"stub\">stub</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.injectionFrequency} description={x.injectionFrequencyDesc}>\n <select\n className={selectClassName()}\n value={form.memory.injectionFrequency}\n onChange={(e) =>\n update({\n memory: {\n ...form.memory,\n injectionFrequency: e.target.value as AgentDefaultsState['memory']['injectionFrequency'],\n },\n })\n }\n >\n <option value=\"\">{x.injectionFrequencyUnset}</option>\n <option value=\"every-turn\">{x.injectionEveryTurn}</option>\n <option value=\"first-turn\">{x.injectionFirstTurn}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.memoryCharLimit} description={x.memoryCharLimitDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.memoryCharLimit ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n memoryCharLimit: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.userCharLimit} description={x.userCharLimitDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.userCharLimit ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n userCharLimit: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.contextCadence} description={x.contextCadenceDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.contextCadence ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n contextCadence: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.dialecticCadence} description={x.dialecticCadenceDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.dialecticCadence ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n dialecticCadence: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Search} title={x.cardSessionSearchTitle} subtitle={x.cardSessionSearchSubtitle} />\n <AgentDefaultsField label={x.sessionSearchSummaryModel} description={x.sessionSearchSummaryModelDesc}>\n <ModelSelector\n value={form.sessionSearch.summaryModel}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(modelId) =>\n update({ sessionSearch: { ...form.sessionSearch, summaryModel: modelId } })\n }\n />\n </AgentDefaultsField>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Sparkles} title={x.cardReviewTitle} subtitle={x.cardReviewSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.reviewEnabled} description={x.reviewEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.backgroundReview.enabled}\n onChange={(e) =>\n update({ backgroundReview: { ...form.backgroundReview, enabled: e.target.checked } })\n }\n />\n <span>{x.reviewEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.memoryNudgeInterval} description={x.memoryNudgeIntervalDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n value={form.backgroundReview.memoryNudgeInterval}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n memoryNudgeInterval: Number.parseInt(e.target.value, 10) || 0,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.skillNudgeInterval} description={x.skillNudgeIntervalDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n value={form.backgroundReview.skillNudgeInterval}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n skillNudgeInterval: Number.parseInt(e.target.value, 10) || 0,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reviewMaxToolRounds} description={x.reviewMaxToolRoundsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n max={32}\n value={form.backgroundReview.maxToolRounds}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n maxToolRounds: Number.parseInt(e.target.value, 10) || 8,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reviewMaxHistoryMessages} description={x.reviewMaxHistoryMessagesDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={10}\n max={200}\n value={form.backgroundReview.maxHistoryMessages}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n maxHistoryMessages: Number.parseInt(e.target.value, 10) || 80,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reviewMaxDurationMs} description={x.reviewMaxDurationMsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={30}\n max={600}\n step={1}\n value={Math.round((form.backgroundReview.maxDurationMs ?? 120_000) / 1000)}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n maxDurationMs: (Number.parseInt(e.target.value, 10) || 120) * 1000,\n },\n })\n }\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Library } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { Button } from '@/components/ui/button';\nimport type { SkillCatalogRow } from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { pathForTab } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { agentDefaultsQuickActionButtonClass } from '../defaults-field-styles';\nimport { useSkillsCatalogLoad } from '../hooks/use-agents-skills-catalog';\n\nfunction rowId(s: SkillCatalogRow): string {\n return (s.name || s.directoryId).trim();\n}\n\nfunction allowlistFromSelection(selected: Set<string>, catalogIds: string[]): string[] {\n const out: string[] = [];\n for (const id of catalogIds) {\n if (selected.has(id)) out.push(id);\n }\n const extra = [...selected].filter((id) => !catalogIds.includes(id)).sort();\n return [...out, ...extra];\n}\n\nexport function AgentDefaultsSkillsAllowlistPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const agentsTab = m.agentsSettings;\n const token = useGatewayStore((s) => s.token);\n const hasToken = Boolean(token);\n const { catalogForPick, skillsCatalogLoading } = useSkillsCatalogLoad(true, hasToken);\n\n const catalogIds = useMemo(() => catalogForPick.map(rowId), [catalogForPick]);\n\n const restrictMode = form.skillsAllowlist.length > 0;\n\n const allowSet = useMemo(\n () => new Set(form.skillsAllowlist.map((s) => s.trim()).filter(Boolean)),\n [form.skillsAllowlist],\n );\n\n const unknownAllowlistIds = useMemo(\n () => form.skillsAllowlist.filter((id) => id.trim() && !catalogIds.includes(id.trim())),\n [form.skillsAllowlist, catalogIds],\n );\n\n const syntheticUnknownRows: SkillCatalogRow[] = useMemo(\n () => unknownAllowlistIds.map((id) => ({ name: id.trim(), directoryId: id.trim() })),\n [unknownAllowlistIds],\n );\n\n const rowsToRender = useMemo(\n () => [...syntheticUnknownRows, ...catalogForPick],\n [syntheticUnknownRows, catalogForPick],\n );\n\n const setAllSkills = useCallback(() => {\n update({ skillsAllowlist: [] });\n }, [update]);\n\n const setRestrictWithAllCatalogSelected = useCallback(() => {\n update({ skillsAllowlist: [...catalogIds] });\n }, [update, catalogIds]);\n\n const toggleId = useCallback(\n (id: string, checked: boolean) => {\n const selected = new Set(form.skillsAllowlist.map((s) => s.trim()).filter(Boolean));\n if (checked) {\n selected.add(id);\n } else {\n selected.delete(id);\n }\n if (selected.size === 0) {\n update({ skillsAllowlist: [] });\n return;\n }\n update({ skillsAllowlist: allowlistFromSelection(selected, catalogIds) });\n },\n [form.skillsAllowlist, catalogIds, update],\n );\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Library} title={x.cardSkillsTitle} subtitle={x.cardSkillsSubtitle} />\n <AgentDefaultsField label={x.skillsAllowlist} description={x.skillsAllowlistDesc}>\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n onClick={setAllSkills}\n >\n {x.skillsAllowlistModeAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={!restrictMode && catalogIds.length === 0}\n onClick={() => {\n if (restrictMode) {\n return;\n }\n setRestrictWithAllCatalogSelected();\n }}\n >\n {x.skillsAllowlistModeRestrict}\n </Button>\n </div>\n <Link\n to={pathForTab('skills')}\n className=\"shrink-0 text-xs font-medium text-accent-fg hover:underline\"\n >\n {agentsTab.skillsLibraryLink}\n </Link>\n </div>\n\n {!hasToken ? (\n <p className=\"text-xs text-fg-muted\">{a.needToken}</p>\n ) : skillsCatalogLoading ? (\n <p className=\"text-sm text-fg-muted\">{agentsTab.skillsCatalogLoading}</p>\n ) : rowsToRender.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{agentsTab.skillsEmptyCatalog}</p>\n ) : (\n <div\n className={cn(\n 'max-h-[min(50vh,22rem)] overflow-y-auto overscroll-contain pr-0.5',\n !restrictMode && 'pointer-events-none opacity-50',\n )}\n >\n <ul className=\"flex flex-col gap-2.5 text-sm\" role=\"list\">\n {rowsToRender.filter((s) => rowId(s)).map((s) => {\n const id = rowId(s);\n const on = restrictMode && allowSet.has(id);\n const desc = typeof s.description === 'string' ? s.description.trim() : '';\n const descLine = desc || agentsTab.skillsNoDescription;\n const unknown = !catalogIds.includes(id);\n return (\n <li\n key={id}\n className=\"h-16 shrink-0 overflow-hidden rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 dark:border-edge-subtle\"\n >\n <label className=\"flex h-full cursor-pointer items-center gap-3 text-sm\">\n <input\n type=\"checkbox\"\n className=\"shrink-0 rounded border-edge\"\n checked={on}\n disabled={!restrictMode}\n onChange={() => toggleId(id, !on)}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n <div className=\"truncate font-mono text-xs font-medium text-fg\" title={id}>\n {id}\n {unknown ? (\n <span className=\"ml-1.5 font-sans text-[10px] font-normal text-fg-muted\">\n ({x.skillsAllowlistNotInCatalog})\n </span>\n ) : null}\n </div>\n <p\n className={cn(\n 'mt-0.5 truncate text-xs leading-tight text-fg-muted',\n !desc && 'italic text-fg-subtle',\n )}\n title={descLine}\n >\n {descLine}\n </p>\n </div>\n </label>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </AgentDefaultsField>\n </SettingsFormSection>\n </div>\n );\n}\n","import { ScrollText } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsSystemPromptPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={ScrollText}\n title={x.cardSystemPromptTitle}\n subtitle={x.cardSystemPromptSubtitle}\n />\n <AgentDefaultsField label={x.systemPromptOverride} description={x.systemPromptOverrideDesc}>\n <textarea\n className={cn(inputClassName(), 'min-h-[140px] resize-y font-mono text-xs')}\n value={form.systemPromptOverride}\n placeholder={x.systemPromptPlaceholder}\n onChange={(e) => update({ systemPromptOverride: e.target.value })}\n />\n </AgentDefaultsField>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Folder } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsWorkspacePanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Folder} title={a.cardWorkspaceTitle} subtitle={a.cardWorkspaceSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.workspace} description={a.desc.workspace}>\n <input\n type=\"text\"\n className={inputClassName()}\n value={form.workspace}\n onChange={(e) => update({ workspace: e.target.value })}\n autoComplete=\"off\"\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.mediaMaxMb} description={a.desc.mediaMaxMb}>\n <input\n type=\"number\"\n min={1}\n step={1}\n className={inputClassName()}\n value={form.mediaMaxMb ?? ''}\n placeholder=\"20\"\n onChange={(e) => {\n const v = e.target.value;\n update({ mediaMaxMb: v === '' ? undefined : Number(v) });\n }}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Cpu } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { messages } from '@/i18n/messages';\nimport type { SettingsSectionId } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport type { UseAgentDefaultsFormResult } from './use-agent-defaults-form';\n\nexport function AgentDefaultsRouteLayout(props: {\n sectionId: SettingsSectionId;\n intro: string;\n vm: UseAgentDefaultsFormResult;\n children: ReactNode;\n}) {\n const { sectionId, intro, vm, children } = props;\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentSettings;\n\n const pageTitle = m.settingsSections[sectionId] ?? sectionId;\n\n if (!vm.hasToken) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10\">\n <div className=\"flex items-start gap-3 rounded-2xl bg-surface-base p-6\">\n <Cpu className=\"mt-0.5 size-5 shrink-0 text-fg-subtle\" strokeWidth={1.75} />\n <div>\n <h1 className=\"text-base font-semibold text-fg\">{pageTitle}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{a.needToken}</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (vm.loading) {\n return (\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <div className=\"h-8 w-48 animate-pulse rounded bg-surface-hover\" />\n <div className=\"mt-6 h-32 animate-pulse rounded-xl bg-surface-hover\" />\n <p className=\"mt-4 text-sm text-fg-muted\">{m.logs.loading}</p>\n </div>\n );\n }\n\n if (!vm.form) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10\">\n <p className=\"text-sm text-fg-muted\">{vm.error ?? vm.fetchError ?? a.loadError}</p>\n <Button type=\"button\" variant=\"secondary\" onClick={() => void vm.mutate()}>\n {m.logs.refresh}\n </Button>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <header className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{pageTitle}</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-fg-muted\">{intro}</p>\n <p className=\"mt-1 text-xs text-fg-subtle\">{a.sectionDesc}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {vm.saveOk ? <span className=\"text-sm text-fg-muted\">{a.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!vm.dirty || vm.saving} onClick={vm.discard}>\n {a.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!vm.dirty || vm.saving} onClick={() => void vm.save()}>\n {vm.saving ? a.saving : a.save}\n </Button>\n </div>\n </header>\n\n {vm.error ? (\n <div\n className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400\"\n role=\"alert\"\n >\n {vm.error}\n </div>\n ) : null}\n\n <div className=\"flex min-w-0 flex-col gap-5 pb-8\">{children}</div>\n </div>\n );\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\n// --- Nested shapes (align with `src/config/schema.ts` AgentDefaultsSchema) ---\n\nexport type AgentDefaultsCompactionState = {\n enabled: boolean;\n mode: 'default' | 'safeguard';\n reserveTokens: number;\n triggerThreshold: number;\n minMessagesBeforeCompact: number;\n keepRecentMessages: number;\n evictionWindow: number;\n retentionWindow: number;\n};\n\nexport type AgentDefaultsPruningState = {\n enabled: boolean;\n maxToolResultChars: number;\n headKeepRatio: number;\n tailKeepRatio: number;\n};\n\nexport type AgentDefaultsMemoryState = {\n enabled: boolean;\n useEnhancedSystem: boolean;\n userProfileEnabled: boolean;\n provider: '' | 'none' | 'stub';\n injectionFrequency: '' | 'every-turn' | 'first-turn';\n memoryCharLimit: number | undefined;\n userCharLimit: number | undefined;\n contextCadence: number | undefined;\n dialecticCadence: number | undefined;\n};\n\nexport type AgentDefaultsSessionSearchState = {\n summaryModel: string;\n};\n\nexport type AgentDefaultsBackgroundReviewState = {\n enabled: boolean;\n memoryNudgeInterval: number;\n skillNudgeInterval: number;\n maxToolRounds: number;\n maxHistoryMessages: number;\n maxDurationMs: number;\n};\n\nexport type AgentDefaultsWebExtractState = {\n model: string;\n maxLength: number | undefined;\n};\n\nexport type AgentDefaultsDelegateState = { enabled: boolean };\nexport type AgentDefaultsExecuteCodeState = { enabled: boolean };\n\nexport interface AgentDefaultsState {\n model: string;\n /** provider/model refs tried when the primary fails (stored as `agents.defaults.model.fallbacks`). */\n modelFallbacks: string[];\n imageModel: string;\n imageModelFallbacks: string[];\n imageGenerationModel: string;\n imageGenerationModelFallbacks: string[];\n /** Per-call timeout (ms) for image generation; null = inherit gateway default. */\n imageGenerationModelTimeoutMs: number | null;\n /** Sweep every configured provider when primary chain fails. */\n imageGenerationModelAutoProviderFallback: boolean;\n mediaMaxMb: number | undefined;\n maxTokens: number;\n temperature: number;\n maxToolIterations: number;\n /** Config `maxTaskDurationMs` — UI stores whole minutes (empty = unset / gateway default). */\n maxTaskDurationMinutes: number | undefined;\n maxRequestsPerTurn: number;\n maxToolFailuresPerTurn: number;\n workspace: string;\n /** Playwright `browser_*` tools (`agents.defaults.browser.enabled`). */\n browserEnabled: boolean;\n /** Headless Chromium when browser tools are on (`agents.defaults.browser.headless`, default true). */\n browserHeadless: boolean;\n /** Skip private-IP blocking (cloud metadata always blocked). */\n browserAllowPrivateUrls: boolean;\n /** Per-command timeout in seconds (default 30). */\n browserCommandTimeout: number | undefined;\n /** Browser backend: local, browserbase, or browser-use. */\n browserCloudProvider: 'local' | 'browserbase' | 'browser-use';\n /** Direct CDP WebSocket endpoint URL. */\n browserCdpUrl: string;\n /** JS dialog handling policy. */\n browserDialogPolicy: 'must_respond' | 'auto_dismiss' | 'auto_accept';\n /** Dialog auto-timeout in seconds (default 300). */\n browserDialogTimeout: number | undefined;\n thinkingDefault: string;\n reasoningDefault: string;\n verboseDefault: string;\n compaction: AgentDefaultsCompactionState;\n pruning: AgentDefaultsPruningState;\n memory: AgentDefaultsMemoryState;\n sessionSearch: AgentDefaultsSessionSearchState;\n backgroundReview: AgentDefaultsBackgroundReviewState;\n webExtract: AgentDefaultsWebExtractState;\n delegate: AgentDefaultsDelegateState;\n executeCode: AgentDefaultsExecuteCodeState;\n systemPromptOverride: string;\n /** Maps to `agents.defaults.skills` (allowlist). */\n skillsAllowlist: string[];\n /** Maps to `agents.defaults.tools.disable`. */\n toolsDisable: string[];\n /** JSON for `agents.defaults.params`. */\n paramsJson: string;\n}\n\nconst DEFAULT_COMPACTION: AgentDefaultsCompactionState = {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n};\n\nconst DEFAULT_PRUNING: AgentDefaultsPruningState = {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n};\n\nconst DEFAULT_MEMORY: AgentDefaultsMemoryState = {\n enabled: true,\n useEnhancedSystem: true,\n userProfileEnabled: true,\n provider: '',\n injectionFrequency: '',\n memoryCharLimit: undefined,\n userCharLimit: undefined,\n contextCadence: undefined,\n dialecticCadence: undefined,\n};\n\nconst DEFAULT_SESSION_SEARCH: AgentDefaultsSessionSearchState = {\n summaryModel: '',\n};\n\nconst DEFAULT_BG_REVIEW: AgentDefaultsBackgroundReviewState = {\n enabled: false,\n memoryNudgeInterval: 10,\n skillNudgeInterval: 10,\n maxToolRounds: 8,\n maxHistoryMessages: 80,\n maxDurationMs: 120_000,\n};\n\nconst DEFAULT_WEB_EXTRACT: AgentDefaultsWebExtractState = {\n model: '',\n maxLength: undefined,\n};\n\nfunction normalizeModelRef(raw: unknown): string {\n if (raw == null) return '';\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object' && raw !== null && 'primary' in raw) {\n const p = (raw as { primary?: string }).primary;\n return typeof p === 'string' ? p : '';\n }\n return '';\n}\n\nfunction normalizeModelFallbacks(raw: unknown): string[] {\n if (typeof raw !== 'object' || raw === null || !('fallbacks' in raw)) {\n return [];\n }\n const f = (raw as { fallbacks?: unknown }).fallbacks;\n if (!Array.isArray(f)) {\n return [];\n }\n return f.filter((x): x is string => typeof x === 'string' && x.trim().length > 0);\n}\n\nfunction configFromApiResponse(res: unknown): unknown {\n if (!res || typeof res !== 'object') return undefined;\n const r = res as Record<string, unknown>;\n const payload = r.payload;\n if (payload && typeof payload === 'object' && 'config' in payload) {\n return (payload as { config?: unknown }).config;\n }\n if ('config' in r) return r.config;\n return undefined;\n}\n\nfunction truthyBrowserFlag(v: unknown): boolean {\n return v === true || v === 'true' || v === 1;\n}\n\ntype BrowserFieldsPick = Pick<\n AgentDefaultsState,\n | 'browserEnabled'\n | 'browserHeadless'\n | 'browserAllowPrivateUrls'\n | 'browserCommandTimeout'\n | 'browserCloudProvider'\n | 'browserCdpUrl'\n | 'browserDialogPolicy'\n | 'browserDialogTimeout'\n>;\n\nfunction parseBrowserFromDefaults(d: Record<string, unknown>): BrowserFieldsPick {\n const browser = d.browser;\n if (!browser || typeof browser !== 'object' || Array.isArray(browser)) {\n return {\n browserEnabled: false,\n browserHeadless: true,\n browserAllowPrivateUrls: false,\n browserCommandTimeout: undefined,\n browserCloudProvider: 'local',\n browserCdpUrl: '',\n browserDialogPolicy: 'auto_dismiss',\n browserDialogTimeout: undefined,\n };\n }\n const b = browser as Record<string, unknown>;\n const enabled = truthyBrowserFlag(b.enabled);\n const headlessRaw = b.headless;\n const headless =\n headlessRaw === false || headlessRaw === 'false' || headlessRaw === 0 ? false : true;\n\n const allowPrivateUrls = truthyBrowserFlag(b.allowPrivateUrls);\n\n const commandTimeout =\n typeof b.commandTimeout === 'number' && Number.isFinite(b.commandTimeout) && b.commandTimeout >= 5\n ? Math.floor(b.commandTimeout)\n : undefined;\n\n const cpRaw = b.cloudProvider;\n const cloudProvider: AgentDefaultsState['browserCloudProvider'] =\n cpRaw === 'browserbase' || cpRaw === 'browser-use' ? cpRaw : 'local';\n\n const cdpUrl = typeof b.cdpUrl === 'string' ? b.cdpUrl : '';\n\n const dpRaw = b.dialogPolicy;\n const dialogPolicy: AgentDefaultsState['browserDialogPolicy'] =\n dpRaw === 'must_respond' || dpRaw === 'auto_accept' ? dpRaw : 'auto_dismiss';\n\n const dialogTimeout =\n typeof b.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : undefined;\n\n return {\n browserEnabled: enabled,\n browserHeadless: headless,\n browserAllowPrivateUrls: allowPrivateUrls,\n browserCommandTimeout: commandTimeout,\n browserCloudProvider: cloudProvider,\n browserCdpUrl: cdpUrl,\n browserDialogPolicy: dialogPolicy,\n browserDialogTimeout: dialogTimeout,\n };\n}\n\nfunction parseCompaction(raw: unknown): AgentDefaultsCompactionState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_COMPACTION };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_COMPACTION.enabled,\n mode: p.mode === 'safeguard' ? 'safeguard' : 'default',\n reserveTokens:\n typeof p.reserveTokens === 'number' && Number.isFinite(p.reserveTokens)\n ? Math.floor(p.reserveTokens)\n : DEFAULT_COMPACTION.reserveTokens,\n triggerThreshold:\n typeof p.triggerThreshold === 'number' && Number.isFinite(p.triggerThreshold)\n ? p.triggerThreshold\n : DEFAULT_COMPACTION.triggerThreshold,\n minMessagesBeforeCompact:\n typeof p.minMessagesBeforeCompact === 'number' && Number.isFinite(p.minMessagesBeforeCompact)\n ? Math.floor(p.minMessagesBeforeCompact)\n : DEFAULT_COMPACTION.minMessagesBeforeCompact,\n keepRecentMessages:\n typeof p.keepRecentMessages === 'number' && Number.isFinite(p.keepRecentMessages)\n ? Math.floor(p.keepRecentMessages)\n : DEFAULT_COMPACTION.keepRecentMessages,\n evictionWindow:\n typeof p.evictionWindow === 'number' && Number.isFinite(p.evictionWindow)\n ? p.evictionWindow\n : DEFAULT_COMPACTION.evictionWindow,\n retentionWindow:\n typeof p.retentionWindow === 'number' && Number.isFinite(p.retentionWindow)\n ? Math.floor(p.retentionWindow)\n : DEFAULT_COMPACTION.retentionWindow,\n };\n}\n\nfunction parsePruning(raw: unknown): AgentDefaultsPruningState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_PRUNING };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_PRUNING.enabled,\n maxToolResultChars:\n typeof p.maxToolResultChars === 'number' && Number.isFinite(p.maxToolResultChars)\n ? Math.floor(p.maxToolResultChars)\n : DEFAULT_PRUNING.maxToolResultChars,\n headKeepRatio:\n typeof p.headKeepRatio === 'number' && Number.isFinite(p.headKeepRatio)\n ? p.headKeepRatio\n : DEFAULT_PRUNING.headKeepRatio,\n tailKeepRatio:\n typeof p.tailKeepRatio === 'number' && Number.isFinite(p.tailKeepRatio)\n ? p.tailKeepRatio\n : DEFAULT_PRUNING.tailKeepRatio,\n };\n}\n\nfunction parseMemory(raw: unknown): AgentDefaultsMemoryState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_MEMORY };\n }\n const p = raw as Record<string, unknown>;\n const providerRaw = p.provider;\n const provider: AgentDefaultsMemoryState['provider'] =\n providerRaw === 'none' || providerRaw === 'stub' ? providerRaw : '';\n const inj = p.injectionFrequency;\n const injectionFrequency: AgentDefaultsMemoryState['injectionFrequency'] =\n inj === 'every-turn' || inj === 'first-turn' ? inj : '';\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_MEMORY.enabled,\n useEnhancedSystem:\n typeof p.useEnhancedSystem === 'boolean' ? p.useEnhancedSystem : DEFAULT_MEMORY.useEnhancedSystem,\n userProfileEnabled:\n typeof p.userProfileEnabled === 'boolean' ? p.userProfileEnabled : DEFAULT_MEMORY.userProfileEnabled,\n provider,\n injectionFrequency,\n memoryCharLimit:\n typeof p.memoryCharLimit === 'number' && p.memoryCharLimit > 0\n ? Math.floor(p.memoryCharLimit)\n : undefined,\n userCharLimit:\n typeof p.userCharLimit === 'number' && p.userCharLimit > 0\n ? Math.floor(p.userCharLimit)\n : undefined,\n contextCadence:\n typeof p.contextCadence === 'number' && p.contextCadence >= 1\n ? Math.floor(p.contextCadence)\n : undefined,\n dialecticCadence:\n typeof p.dialecticCadence === 'number' && p.dialecticCadence >= 1\n ? Math.floor(p.dialecticCadence)\n : undefined,\n };\n}\n\nfunction parseSessionSearch(raw: unknown): AgentDefaultsSessionSearchState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_SESSION_SEARCH };\n }\n const p = raw as Record<string, unknown>;\n return {\n summaryModel: typeof p.summaryModel === 'string' ? p.summaryModel : '',\n };\n}\n\nfunction parseBackgroundReview(raw: unknown): AgentDefaultsBackgroundReviewState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_BG_REVIEW };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_BG_REVIEW.enabled,\n memoryNudgeInterval:\n typeof p.memoryNudgeInterval === 'number' && p.memoryNudgeInterval >= 0\n ? Math.floor(p.memoryNudgeInterval)\n : DEFAULT_BG_REVIEW.memoryNudgeInterval,\n skillNudgeInterval:\n typeof p.skillNudgeInterval === 'number' && p.skillNudgeInterval >= 0\n ? Math.floor(p.skillNudgeInterval)\n : DEFAULT_BG_REVIEW.skillNudgeInterval,\n maxToolRounds:\n typeof p.maxToolRounds === 'number' && p.maxToolRounds >= 1 && p.maxToolRounds <= 32\n ? Math.floor(p.maxToolRounds)\n : DEFAULT_BG_REVIEW.maxToolRounds,\n maxHistoryMessages:\n typeof p.maxHistoryMessages === 'number' && p.maxHistoryMessages >= 10 && p.maxHistoryMessages <= 200\n ? Math.floor(p.maxHistoryMessages)\n : DEFAULT_BG_REVIEW.maxHistoryMessages,\n maxDurationMs:\n typeof p.maxDurationMs === 'number' && p.maxDurationMs >= 30_000 && p.maxDurationMs <= 600_000\n ? Math.floor(p.maxDurationMs)\n : DEFAULT_BG_REVIEW.maxDurationMs,\n };\n}\n\nfunction parseWebExtract(raw: unknown): AgentDefaultsWebExtractState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_WEB_EXTRACT };\n }\n const p = raw as Record<string, unknown>;\n return {\n model: typeof p.model === 'string' ? p.model : '',\n maxLength:\n typeof p.maxLength === 'number' && p.maxLength > 0 ? p.maxLength : undefined,\n };\n}\n\nfunction parseEnabledFlag(raw: unknown, def: boolean): { enabled: boolean } {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { enabled: def };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : def,\n };\n}\n\nfunction parseStringList(raw: unknown): string[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n return raw.filter((x): x is string => typeof x === 'string');\n}\n\nfunction parseParamsJson(raw: unknown): string {\n if (raw === undefined || raw === null) {\n return '';\n }\n if (typeof raw === 'string') {\n const t = raw.trim();\n if (!t) {\n return '';\n }\n try {\n const parsed: unknown = JSON.parse(t);\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return JSON.stringify(parsed, null, 2);\n }\n } catch {\n return t;\n }\n return '';\n }\n if (typeof raw === 'object' && !Array.isArray(raw)) {\n try {\n return JSON.stringify(raw, null, 2);\n } catch {\n return '';\n }\n }\n return '';\n}\n\nfunction readImageGenerationTimeoutMsFromDefaults(d: Record<string, unknown>): number | null {\n const flat = d.imageGenerationModelTimeoutMs;\n if (typeof flat === 'number' && Number.isFinite(flat) && flat > 0) {\n return Math.floor(flat);\n }\n const igm = d.imageGenerationModel;\n if (igm && typeof igm === 'object' && !Array.isArray(igm)) {\n const tm = (igm as { timeoutMs?: unknown }).timeoutMs;\n if (typeof tm === 'number' && Number.isFinite(tm) && tm > 0) {\n return Math.floor(tm);\n }\n }\n return null;\n}\n\nfunction readImageGenerationAutoProviderFallbackFromDefaults(d: Record<string, unknown>): boolean {\n if (d.imageGenerationModelAutoProviderFallback === true) {\n return true;\n }\n const igm = d.imageGenerationModel;\n if (igm && typeof igm === 'object' && !Array.isArray(igm)) {\n return (igm as { autoProviderFallback?: unknown }).autoProviderFallback === true;\n }\n return false;\n}\n\n/** Parse `agents.defaults` from a gateway config root object. */\nexport function parseAgentDefaultsFromConfig(cfg: unknown): AgentDefaultsState {\n const agents =\n cfg && typeof cfg === 'object' && !Array.isArray(cfg) && 'agents' in cfg\n ? (cfg as { agents?: unknown }).agents\n : undefined;\n const defaults =\n agents && typeof agents === 'object' && !Array.isArray(agents) && 'defaults' in agents\n ? (agents as { defaults?: unknown }).defaults\n : undefined;\n const d =\n defaults && typeof defaults === 'object' && !Array.isArray(defaults)\n ? (defaults as Record<string, unknown>)\n : {};\n const mf = d.modelFallbacks;\n const modelFallbacksFromApi =\n Array.isArray(mf) && mf.every((x) => typeof x === 'string') ? mf : normalizeModelFallbacks(d.model);\n const imf = d.imageModelFallbacks;\n const imageModelFallbacksFromApi =\n Array.isArray(imf) && imf.every((x) => typeof x === 'string')\n ? imf\n : normalizeModelFallbacks(d.imageModel);\n const igf = d.imageGenerationModelFallbacks;\n const imageGenerationModelFallbacksFromApi =\n Array.isArray(igf) && igf.every((x) => typeof x === 'string')\n ? igf\n : normalizeModelFallbacks(d.imageGenerationModel);\n const browserFields = parseBrowserFromDefaults(d);\n const maxTaskMs =\n typeof d.maxTaskDurationMs === 'number' && Number.isFinite(d.maxTaskDurationMs)\n ? d.maxTaskDurationMs\n : undefined;\n const maxTaskDurationMinutes =\n maxTaskMs !== undefined ? Math.round(maxTaskMs / 60_000) : undefined;\n\n return {\n model: normalizeModelRef(d.model),\n modelFallbacks: modelFallbacksFromApi,\n imageModel: normalizeModelRef(d.imageModel),\n imageModelFallbacks: imageModelFallbacksFromApi,\n imageGenerationModel: normalizeModelRef(d.imageGenerationModel),\n imageGenerationModelFallbacks: imageGenerationModelFallbacksFromApi,\n imageGenerationModelTimeoutMs: readImageGenerationTimeoutMsFromDefaults(d),\n imageGenerationModelAutoProviderFallback: readImageGenerationAutoProviderFallbackFromDefaults(d),\n mediaMaxMb: typeof d.mediaMaxMb === 'number' && !Number.isNaN(d.mediaMaxMb) ? d.mediaMaxMb : undefined,\n maxTokens: typeof d.maxTokens === 'number' ? d.maxTokens : 8192,\n temperature: typeof d.temperature === 'number' ? d.temperature : 0.7,\n maxToolIterations: typeof d.maxToolIterations === 'number' ? d.maxToolIterations : 20,\n maxTaskDurationMinutes,\n maxRequestsPerTurn: typeof d.maxRequestsPerTurn === 'number' ? d.maxRequestsPerTurn : 50,\n maxToolFailuresPerTurn: typeof d.maxToolFailuresPerTurn === 'number' ? d.maxToolFailuresPerTurn : 3,\n workspace: typeof d.workspace === 'string' ? d.workspace : '~/.xopc/workspace',\n ...browserFields,\n thinkingDefault: typeof d.thinkingDefault === 'string' ? d.thinkingDefault : 'medium',\n reasoningDefault: typeof d.reasoningDefault === 'string' ? d.reasoningDefault : 'stream',\n verboseDefault: typeof d.verboseDefault === 'string' ? d.verboseDefault : 'full',\n compaction: parseCompaction(d.compaction),\n pruning: parsePruning(d.pruning),\n memory: parseMemory(d.memory),\n sessionSearch: parseSessionSearch(d.sessionSearch),\n backgroundReview: parseBackgroundReview(d.backgroundReview),\n webExtract: parseWebExtract(d.webExtract),\n delegate: parseEnabledFlag(d.delegate, false),\n executeCode: parseEnabledFlag(d.executeCode, false),\n systemPromptOverride: typeof d.systemPromptOverride === 'string' ? d.systemPromptOverride : '',\n skillsAllowlist: parseStringList(d.skills),\n toolsDisable: (() => {\n const t = d.tools;\n if (!t || typeof t !== 'object' || Array.isArray(t)) {\n return [] as string[];\n }\n const dis = (t as { disable?: unknown }).disable;\n return parseStringList(dis);\n })(),\n paramsJson: parseParamsJson(d.params),\n };\n}\n\nfunction buildMemoryPatch(m: AgentDefaultsMemoryState): Record<string, unknown> {\n const o: Record<string, unknown> = {\n enabled: m.enabled,\n useEnhancedSystem: m.useEnhancedSystem,\n userProfileEnabled: m.userProfileEnabled,\n };\n if (m.provider === 'none' || m.provider === 'stub') {\n o.provider = m.provider;\n } else {\n o.provider = null;\n }\n if (m.injectionFrequency === 'every-turn' || m.injectionFrequency === 'first-turn') {\n o.injectionFrequency = m.injectionFrequency;\n } else {\n o.injectionFrequency = null;\n }\n o.memoryCharLimit = m.memoryCharLimit ?? null;\n o.userCharLimit = m.userCharLimit ?? null;\n o.contextCadence = m.contextCadence ?? null;\n o.dialecticCadence = m.dialecticCadence ?? null;\n return o;\n}\n\n/** @throws {SyntaxError} on invalid JSON; {Error} if not a plain object. */\nexport function parseParamsJsonForSave(paramsJson: string): Record<string, unknown> | null {\n const trimmed = paramsJson.trim();\n if (!trimmed) {\n return null;\n }\n const parsed: unknown = JSON.parse(trimmed);\n if (parsed === null) {\n return null;\n }\n if (typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('params must be a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\nexport async function fetchAgentDefaults(): Promise<AgentDefaultsState> {\n const res = await fetchJson<{ ok?: boolean; payload?: { config?: unknown } }>(apiUrl('/api/config'));\n const cfg = configFromApiResponse(res);\n return parseAgentDefaultsFromConfig(cfg ?? {});\n}\n\nexport async function patchAgentDefaults(state: AgentDefaultsState): Promise<void> {\n const fallbacks = state.modelFallbacks.map((s) => s.trim()).filter(Boolean);\n const modelField =\n fallbacks.length > 0 ? { primary: state.model, fallbacks } : state.model;\n\n const imageFbs = state.imageModelFallbacks.map((s) => s.trim()).filter(Boolean);\n const imageModelField =\n imageFbs.length > 0 && state.imageModel.trim()\n ? { primary: state.imageModel.trim(), fallbacks: imageFbs }\n : state.imageModel || '';\n\n const imageGenFbs = state.imageGenerationModelFallbacks.map((s) => s.trim()).filter(Boolean);\n const imageGenPrimary = state.imageGenerationModel.trim();\n const imageGenTimeoutMs =\n typeof state.imageGenerationModelTimeoutMs === 'number' &&\n state.imageGenerationModelTimeoutMs > 0\n ? Math.floor(state.imageGenerationModelTimeoutMs)\n : null;\n const imageGenAuto = state.imageGenerationModelAutoProviderFallback === true;\n const imageGenerationModelField: unknown = (() => {\n const obj: Record<string, unknown> = {};\n if (imageGenPrimary) obj.primary = imageGenPrimary;\n if (imageGenFbs.length > 0) obj.fallbacks = imageGenFbs;\n if (imageGenTimeoutMs) obj.timeoutMs = imageGenTimeoutMs;\n if (imageGenAuto) obj.autoProviderFallback = true;\n if (Object.keys(obj).length === 0) return '';\n if (Object.keys(obj).length === 1 && typeof obj.primary === 'string') return obj.primary;\n return obj;\n })();\n\n const maxTaskDurationMs: number | null =\n state.maxTaskDurationMinutes === undefined || state.maxTaskDurationMinutes === null\n ? null\n : (() => {\n const n = Math.floor(state.maxTaskDurationMinutes);\n const ms = n * 60_000;\n if (ms < 60_000 || ms > 14_400_000) {\n return null;\n }\n return ms;\n })();\n\n const skillsClean = state.skillsAllowlist.map((s) => s.trim()).filter(Boolean);\n const toolsDisableClean = state.toolsDisable.map((s) => s.trim()).filter(Boolean);\n\n const paramsParsed = parseParamsJsonForSave(state.paramsJson);\n const params =\n paramsParsed === null || Object.keys(paramsParsed).length === 0 ? null : paramsParsed;\n\n const defaults: Record<string, unknown> = {\n model: modelField,\n imageModel: imageModelField,\n imageGenerationModel: imageGenerationModelField,\n mediaMaxMb: state.mediaMaxMb ?? null,\n maxTokens: state.maxTokens,\n temperature: state.temperature,\n maxToolIterations: state.maxToolIterations,\n maxTaskDurationMs,\n maxRequestsPerTurn: state.maxRequestsPerTurn,\n maxToolFailuresPerTurn: state.maxToolFailuresPerTurn,\n workspace: state.workspace,\n browser: {\n enabled: state.browserEnabled,\n headless: state.browserHeadless,\n allowPrivateUrls: state.browserAllowPrivateUrls,\n commandTimeout: state.browserCommandTimeout ?? null,\n cloudProvider: state.browserCloudProvider === 'local' ? null : state.browserCloudProvider,\n cdpUrl: state.browserCdpUrl.trim() || null,\n dialogPolicy: state.browserDialogPolicy === 'auto_dismiss' ? null : state.browserDialogPolicy,\n dialogTimeoutSeconds: state.browserDialogTimeout ?? null,\n },\n thinkingDefault: state.thinkingDefault,\n reasoningDefault: state.reasoningDefault,\n verboseDefault: state.verboseDefault,\n compaction: { ...state.compaction },\n pruning: { ...state.pruning },\n memory: buildMemoryPatch(state.memory),\n sessionSearch: {\n summaryModel: state.sessionSearch.summaryModel.trim() || null,\n },\n backgroundReview: {\n enabled: state.backgroundReview.enabled,\n memoryNudgeInterval: state.backgroundReview.memoryNudgeInterval,\n skillNudgeInterval: state.backgroundReview.skillNudgeInterval,\n maxToolRounds: state.backgroundReview.maxToolRounds,\n maxHistoryMessages: state.backgroundReview.maxHistoryMessages,\n maxDurationMs: state.backgroundReview.maxDurationMs,\n },\n webExtract: {\n model: state.webExtract.model.trim() || null,\n maxLength: state.webExtract.maxLength ?? null,\n },\n delegate: { enabled: state.delegate.enabled },\n executeCode: { enabled: state.executeCode.enabled },\n systemPromptOverride: state.systemPromptOverride.trim() || null,\n skills: skillsClean.length > 0 ? skillsClean : null,\n tools: { disable: toolsDisableClean.length > 0 ? toolsDisableClean : null },\n params,\n };\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n agents: { defaults },\n }),\n });\n void revalidateGatewayConfig();\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n parseAgentDefaultsFromConfig,\n parseParamsJsonForSave,\n patchAgentDefaults,\n type AgentDefaultsState,\n} from '@/features/settings/config-api';\nimport type { MessageBundle } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\n\nexport type UseAgentDefaultsFormResult = {\n hasToken: boolean;\n loading: boolean;\n fetchError: string | null;\n form: AgentDefaultsState | null;\n update: (patch: Partial<AgentDefaultsState>) => void;\n dirty: boolean;\n saving: boolean;\n saveOk: boolean;\n error: string | null;\n setError: (e: string | null) => void;\n save: () => Promise<boolean>;\n discard: () => void;\n mutate: ReturnType<typeof useGatewayConfigSwr>['mutate'];\n};\n\nexport function useAgentDefaultsForm(a: MessageBundle['agentSettings']): UseAgentDefaultsFormResult {\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [form, setForm] = useState<AgentDefaultsState | null>(null);\n const [baseline, setBaseline] = useState<AgentDefaultsState | null>(null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveOk, setSaveOk] = useState(false);\n const dirtyRef = useRef(false);\n\n const { data, error: swrError, isLoading, mutate } = useGatewayConfigSwr(hasToken);\n\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined ? parseAgentDefaultsFromConfig(data.payload.config) : null,\n [data],\n );\n\n useEffect(() => {\n if (!hasToken) {\n setForm(null);\n setBaseline(null);\n dirtyRef.current = false;\n return;\n }\n if (parsed === null) return;\n if (!dirtyRef.current) {\n const snapshot = structuredClone(parsed);\n setForm(snapshot);\n setBaseline(structuredClone(snapshot));\n }\n }, [hasToken, parsed]);\n\n const loading = Boolean(hasToken && isLoading && data === undefined && !swrError);\n const fetchError =\n swrError instanceof Error ? swrError.message : swrError ? String(swrError) : null;\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const update = useCallback((patch: Partial<AgentDefaultsState>) => {\n dirtyRef.current = true;\n setForm((f) => (f ? { ...f, ...patch } : null));\n }, []);\n\n const save = useCallback(async (): Promise<boolean> => {\n if (!form || saving) return false;\n setSaving(true);\n setError(null);\n setSaveOk(false);\n try {\n try {\n void parseParamsJsonForSave(form.paramsJson);\n } catch (e) {\n setError(\n e instanceof SyntaxError\n ? a.advanced.paramsInvalidJson\n : e instanceof Error\n ? e.message\n : a.advanced.paramsInvalidJson,\n );\n return false;\n }\n await patchAgentDefaults(form);\n dirtyRef.current = false;\n setBaseline(structuredClone(form));\n setSaveOk(true);\n window.setTimeout(() => setSaveOk(false), 2500);\n return true;\n } catch (e) {\n setError(e instanceof Error ? e.message : a.saveError);\n return false;\n } finally {\n setSaving(false);\n }\n }, [form, saving, a.saveError, a.advanced]);\n\n const discard = useCallback(() => {\n if (!baseline) return;\n dirtyRef.current = false;\n setForm(structuredClone(baseline));\n setError(null);\n setSaveOk(false);\n }, [baseline]);\n\n return {\n hasToken,\n loading,\n fetchError,\n form,\n update,\n dirty,\n saving,\n saveOk,\n error,\n setError,\n save,\n discard,\n mutate,\n };\n}\n","import { useMemo } from 'react';\n\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport type { AgentDefaultsPanelProps } from './agent-defaults-panel-props';\nimport { AgentDefaultsBasicsPanel } from './agent-defaults-panels/basics-panel';\nimport { AgentDefaultsBrowserPanel } from './agent-defaults-panels/browser-panel';\nimport { AgentDefaultsCapabilitiesPanel } from './agent-defaults-panels/capabilities-panel';\nimport { AgentDefaultsContextPanel } from './agent-defaults-panels/context-panel';\nimport { AgentDefaultsExpertPanel } from './agent-defaults-panels/expert-panel';\nimport { AgentDefaultsMemoryPanel } from './agent-defaults-panels/memory-panel';\nimport { AgentDefaultsSkillsAllowlistPanel } from './agent-defaults-panels/skills-allowlist-panel';\nimport { AgentDefaultsSystemPromptPanel } from './agent-defaults-panels/system-prompt-panel';\nimport { AgentDefaultsWorkspacePanel } from './agent-defaults-panels/workspace-panel';\nimport { AgentDefaultsRouteLayout } from './agent-defaults-route-layout';\nimport { useAgentDefaultsForm } from './use-agent-defaults-form';\n\nfunction useAgentDefaultsPageModel(): {\n vm: ReturnType<typeof useAgentDefaultsForm>;\n pp: AgentDefaultsPanelProps | null;\n a: ReturnType<typeof messages>['agentSettings'];\n} {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentSettings;\n const chat = m.chat;\n const vm = useAgentDefaultsForm(a);\n const pp = useMemo(() => {\n if (!vm.form) return null;\n return { form: vm.form, update: vm.update, a, chat };\n }, [vm.form, vm.update, a, chat]);\n return { vm, pp, a };\n}\n\nexport function AgentChatDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-chat\" intro={a.routeIntro.chat} vm={vm}>\n {pp ? <AgentDefaultsBasicsPanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentWorkspaceDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-workspace\" intro={a.routeIntro.workspace} vm={vm}>\n {pp ? <AgentDefaultsWorkspacePanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentBrowserDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-browser\" intro={a.routeIntro.browser} vm={vm}>\n {pp ? <AgentDefaultsBrowserPanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentRuntimeDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-runtime\" intro={a.routeIntro.runtime} vm={vm}>\n {pp ? (\n <div className=\"flex flex-col gap-8\">\n <AgentDefaultsContextPanel {...pp} />\n <AgentDefaultsMemoryPanel {...pp} />\n </div>\n ) : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentToolsDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-tools\" intro={a.routeIntro.tools} vm={vm}>\n {pp ? (\n <div className=\"flex flex-col gap-8\">\n <AgentDefaultsCapabilitiesPanel {...pp} />\n <AgentDefaultsSkillsAllowlistPanel {...pp} />\n <AgentDefaultsExpertPanel {...pp} />\n </div>\n ) : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentSystemPromptDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-system-prompt\" intro={a.routeIntro.systemPrompt} vm={vm}>\n {pp ? <AgentDefaultsSystemPromptPanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n"],"mappings":"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CA,uBACA,YACA,eACA,aACA,wBACA,uBACA,mBACA,sBACA,eACA,qBACA,uBACA,kBACA,iBACA,oBACA,aACA,iBACA,gBACA,mBACA,iBACA,uBACA,sBACA,oBACA,kBACA,qBACA,mBACA,uBACA,qBACA,wBACA,qBACA,wBACA,uBACA,mBACA,gBACA,cACA,iBACA,qBACgC,CAkIhC,OAjIK,EAID,IAAU,YAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACI,WACJ,OACI,WACG,cACI,kBACG,qBACL,gBACG,mBACP,YACG,eACA,eACI,mBACR,WACV,eAAA,GACA,iBAAkB,EAClB,uBAAwB,EACxB,CAAA,CAIF,IAAU,WAEV,EAAA,EAAA,KAAC,GAAD,CAAoB,IAAG,QAAS,EAAS,GAAI,QAAS,EAAgB,cAAe,EAAmB,CAAA,CAIxG,IAAU,SAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACW,eACP,QACK,aACG,gBACI,qBACG,uBACX,YACG,eACF,aACU,wBACA,uBACtB,CAAA,CAIF,IAAU,SAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACI,WACJ,OACY,mBACG,sBACR,eACM,qBACnB,eAAA,GACA,CAAA,CAIF,IAAU,UAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACO,WACJ,OACgB,uBACN,kBACD,iBACG,oBACN,aACG,iBACD,gBACd,eAAA,GACA,CAAA,CAIF,IAAU,YAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACW,mBACF,iBACf,gBAAiB,GACjB,sBAAuB,EACL,oBACF,kBACG,qBACD,mBAClB,gBAAiB,GACE,qBACG,wBACH,qBACG,wBACtB,kBAAmB,GACnB,iBAAkB,EAAM,iBACxB,gBAAiB,EAAM,gBACN,mBACH,gBACd,CAAA,CAIF,IAAU,QAAU,GAEpB,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACI,WACJ,OACO,cACE,iBACI,oBACnB,CAAA,EAIC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iCAAyB,EAAE,gBAAoB,CAAA,EAhI1D,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,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"}
1
+ {"version":3,"file":"agents-CQllyJhj.js","names":[],"sources":["../../../../../web/src/features/settings/agents/agent-delete-confirm-dialog.tsx","../../../../../web/src/features/settings/agents/agents-editor-sidebar.tsx","../../../../../web/src/features/settings/agents/agents-editor-modal.tsx","../../../../../web/src/features/settings/settings-form-section.tsx","../../../../../web/src/features/settings/agents/utils.ts","../../../../../web/src/features/settings/agents/tabs/agent-channels-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-cron-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-files-tab.tsx","../../../../../web/src/features/settings/agents/agent-avatar-picker.tsx","../../../../../web/src/features/settings/agents/bootstrap-parser.ts","../../../../../web/src/features/settings/agents/tabs/agent-overview-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-profile-tab.tsx","../../../../../web/src/features/settings/agents/tabs/agent-skills-tab.tsx","../../../../../web/src/features/settings/agents/builtin-tool-disable-groups.ts","../../../../../web/src/features/settings/agents/defaults-field-styles.ts","../../../../../web/src/features/settings/agents/builtin-tools-disable-ui.tsx","../../../../../web/src/features/settings/agents/tabs/agent-tools-tab.tsx","../../../../../web/src/features/settings/agents/agents-editor-panel-content.tsx","../../../../../web/src/features/settings/agents/agents-list-grid.tsx","../../../../../web/src/features/settings/agents/agents-settings-header.tsx","../../../../../web/src/features/settings/agents/create-agent-dialog.tsx","../../../../../web/src/features/settings/agents/preset-agents.ts","../../../../../web/src/features/settings/agents/preset-agents-setup.tsx","../../../../../web/src/lib/agent-id.ts","../../../../../web/src/features/settings/suggest-agent-workspace.ts","../../../../../web/src/features/settings/dreaming-api.ts","../../../../../web/src/features/settings/agents/agents-settings-toolbar.tsx","../../../../../web/src/features/settings/agents/hooks/use-agents-bootstrap-files.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-channel-bindings.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-cron-jobs.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-skills-catalog.ts","../../../../../web/src/features/settings/agents/hooks/use-agents-tools-skills-local-state.ts","../../../../../web/src/features/settings/agents/use-agents-settings-panel.tsx","../../../../../web/src/features/settings/agents/agents-settings-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-field.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/basics-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/browser-panel.tsx","../../../../../web/src/features/settings/agents/hooks/use-builtin-tool-ids.ts","../../../../../web/src/features/settings/agents/agent-defaults-panels/builtin-tools-disable-section.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/capabilities-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/context-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/expert-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/memory-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/skills-allowlist-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/system-prompt-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-panels/workspace-panel.tsx","../../../../../web/src/features/settings/agents/agent-defaults-route-layout.tsx","../../../../../web/src/features/settings/config-api.ts","../../../../../web/src/features/settings/agents/use-agent-defaults-form.ts","../../../../../web/src/features/settings/agents/agent-defaults-split-pages.tsx"],"sourcesContent":["import * as Dialog from '@radix-ui/react-dialog';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\n\nexport type AgentDeleteConfirmDialogProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n busy: boolean;\n deletePurge: boolean;\n deleteTarget: GatewayAgentRow | null;\n deleteConfirmText: string;\n onDeleteConfirmTextChange: (value: string) => void;\n onConfirm: () => void;\n onCancel: () => void;\n a: Pick<\n AgentsSettingsMessages,\n | 'purgeDisk'\n | 'removeFromConfig'\n | 'confirmDeletePurge'\n | 'confirmDelete'\n | 'purgeConfirmLabel'\n | 'purgeConfirmPlaceholder'\n | 'purgeConfirmHint'\n | 'createModalCancel'\n >;\n};\n\nexport function AgentDeleteConfirmDialog({\n open,\n onOpenChange,\n busy,\n deletePurge,\n deleteTarget,\n deleteConfirmText,\n onDeleteConfirmTextChange,\n onConfirm,\n onCancel,\n a,\n}: AgentDeleteConfirmDialogProps) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-[80] bg-scrim backdrop-blur-[2px]\" />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 z-[81] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover',\n 'dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Dialog.Title className=\"text-base font-semibold text-fg\">\n {deletePurge ? a.purgeDisk : a.removeFromConfig}\n </Dialog.Title>\n <Dialog.Description className=\"mt-2 whitespace-pre-wrap text-sm leading-relaxed text-fg-muted\">\n {deletePurge ? a.confirmDeletePurge : a.confirmDelete}\n </Dialog.Description>\n\n {deletePurge && deleteTarget ? (\n <div className=\"mt-3 space-y-3\">\n <label className=\"mb-2 block text-sm font-medium text-fg\" htmlFor=\"agent-delete-confirm\">\n {a.purgeConfirmLabel}\n </label>\n <input\n id=\"agent-delete-confirm\"\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n className={cn(\n 'w-full rounded-md border border-edge bg-surface-panel px-3 py-1.5 font-mono text-xs text-fg',\n 'placeholder:text-fg-subtle',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-panel',\n 'dark:border-edge',\n )}\n placeholder={a.purgeConfirmPlaceholder.replace('{{agentId}}', deleteTarget.id)}\n value={deleteConfirmText}\n onChange={(e) => onDeleteConfirmTextChange(e.target.value)}\n />\n <p className=\"pt-0.5 text-xs text-fg-muted\">\n {a.purgeConfirmHint.replace('{{agentId}}', deleteTarget.id)}\n </p>\n </div>\n ) : null}\n\n <div className=\"mt-4 flex flex-wrap items-center justify-end gap-2 border-t border-edge-subtle/60 pt-3\">\n <Button type=\"button\" variant=\"ghost\" disabled={busy} onClick={onCancel}>\n {a.createModalCancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={\n deletePurge\n ? 'border-red-200 text-red-700 hover:bg-red-50 dark:border-red-900/60 dark:text-red-300 dark:hover:bg-red-950/40'\n : undefined\n }\n disabled={\n busy ||\n !deleteTarget ||\n (deletePurge && deleteConfirmText.trim().toLowerCase() !== deleteTarget.id.toLowerCase())\n }\n onClick={onConfirm}\n >\n {deletePurge ? a.purgeDisk : a.removeFromConfig}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { Clock, FileText, Plug, Puzzle, User, UserCircle, Wrench } from 'lucide-react';\n\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nimport type { AgentPanel } from './utils';\n\nconst mainNav: { id: AgentPanel; labelKey: keyof AgentsSettingsMessages; icon: typeof User }[] = [\n { id: 'overview', labelKey: 'navIdentity', icon: User },\n { id: 'profile', labelKey: 'navProfile', icon: UserCircle },\n { id: 'tools', labelKey: 'navTools', icon: Wrench },\n { id: 'skills', labelKey: 'navSkills', icon: Puzzle },\n { id: 'files', labelKey: 'navCoreFiles', icon: FileText },\n];\n\nconst advancedNav: { id: AgentPanel; labelKey: keyof AgentsSettingsMessages; icon: typeof Plug }[] = [\n { id: 'channels', labelKey: 'tabChannels', icon: Plug },\n { id: 'cron', labelKey: 'tabCron', icon: Clock },\n];\n\nexport function AgentsEditorSidebar(props: {\n a: AgentsSettingsMessages;\n panel: AgentPanel;\n onPanelChange: (p: AgentPanel) => void;\n}) {\n const { a, panel, onPanelChange } = props;\n\n const item = (id: AgentPanel, label: string, Icon: typeof User) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => onPanelChange(id)}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors',\n panel === id\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover hover:text-fg',\n )}\n >\n <Icon className=\"size-4 shrink-0 opacity-90\" strokeWidth={2} aria-hidden />\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n\n return (\n <nav className=\"flex w-full flex-col gap-1\" aria-label={a.editorNavAria}>\n <div className=\"flex flex-col gap-0.5\">\n {mainNav.map(({ id, labelKey, icon }) => item(id, a[labelKey] as string, icon))}\n </div>\n <p className=\"mt-4 px-3 text-[10px] font-semibold uppercase tracking-wide text-fg-subtle\">\n {a.navAdvanced}\n </p>\n <div className=\"flex flex-col gap-0.5\">\n {advancedNav.map(({ id, labelKey, icon }) => item(id, a[labelKey] as string, icon))}\n </div>\n </nav>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { SETTINGS_SHELL_CONTENT_Z, SETTINGS_SHELL_OVERLAY_Z } from '@/lib/settings-shell-dialog-layer';\n\nimport { AgentsEditorSidebar } from './agents-editor-sidebar';\nimport type { AgentPanel } from './utils';\n\nexport function AgentsEditorModal(props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n a: AgentsSettingsMessages;\n title: string;\n subtitle: string;\n panel: AgentPanel;\n onPanelChange: (p: AgentPanel) => void;\n onFooterSave: () => void;\n footerSaveDisabled: boolean;\n /** Brief \"Saved\" flash after a successful save. */\n footerSavedFlash?: boolean;\n busy: boolean;\n children: ReactNode;\n}) {\n const {\n open,\n onOpenChange,\n a,\n title,\n subtitle,\n panel,\n onPanelChange,\n onFooterSave,\n footerSaveDisabled,\n footerSavedFlash,\n busy,\n children,\n } = props;\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed flex flex-col overflow-hidden rounded-xl border border-edge bg-surface-panel shadow-popover dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n /* Desktop: roomy editor; inner panels scroll. Small viewports stay inset. */\n 'inset-4 h-[calc(100dvh-2rem)] max-h-[calc(100dvh-2rem)] min-h-0',\n 'sm:inset-auto sm:left-1/2 sm:top-1/2 sm:h-[min(88vh,48rem)] sm:max-h-[min(88vh,48rem)] sm:min-h-[32rem] sm:w-[min(100%-2rem,58rem)] sm:-translate-x-1/2 sm:-translate-y-1/2',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-2 border-b border-edge-subtle px-4 pb-3 pt-4 dark:border-edge\">\n <div className=\"min-w-0 pr-2\">\n <Dialog.Title className=\"text-base font-semibold leading-snug text-fg\">{title}</Dialog.Title>\n <Dialog.Description className=\"mt-1 font-mono text-xs text-fg-muted\">{subtitle}</Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n aria-label={a.closeDialogAria}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col sm:flex-row sm:overflow-hidden\">\n <div className=\"shrink-0 border-b border-edge-subtle px-4 py-3 dark:border-edge sm:flex sm:w-56 sm:shrink-0 sm:flex-col sm:overflow-y-auto sm:border-b-0 sm:border-r sm:px-0 sm:py-4 sm:pl-4 sm:pr-3\">\n <AgentsEditorSidebar a={a} panel={panel} onPanelChange={onPanelChange} />\n </div>\n\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {/* Flex column + min-h-0 lets Tools/Skills lists fill remaining height and scroll inside */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-4 sm:pl-2 sm:pr-5\">\n {children}\n </div>\n <div className=\"flex shrink-0 flex-col gap-1 border-t border-edge-subtle px-4 py-3 dark:border-edge sm:flex-row sm:items-center sm:justify-end sm:gap-3\">\n {footerSavedFlash ? (\n <p className=\"order-2 text-center text-xs font-medium text-green-600 sm:order-1 sm:mr-auto sm:text-left dark:text-green-400\">\n ✓ {a.personaSaved}\n </p>\n ) : footerSaveDisabled ? (\n <p className=\"order-2 text-center text-xs text-fg-muted sm:order-1 sm:mr-auto sm:text-left\">\n {a.footerSaveNotApplicable}\n </p>\n ) : null}\n <Button\n type=\"button\"\n className=\"order-1 w-full sm:order-2 sm:w-auto\"\n disabled={busy || footerSaveDisabled}\n onClick={() => void onFooterSave()}\n >\n {a.save}\n </Button>\n </div>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport { Pencil } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '@/lib/cn';\n\n/**\n * Settings content sits on `bg-surface-panel`; grouped blocks use a recessed `bg-surface-base`\n * lift instead of heavy borders (design system §2.1, §4.2).\n */\nexport function settingsFormSectionClassName(): string {\n return 'rounded-2xl bg-surface-base px-4 py-5 sm:px-5';\n}\n\nexport function SettingsFormSection({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return <section className={cn(settingsFormSectionClassName(), className)}>{children}</section>;\n}\n\nconst settingsSectionHeaderIconShellClass =\n 'flex size-9 shrink-0 items-center justify-center rounded-lg bg-surface-hover/90 text-fg-muted transition-colors dark:bg-surface-hover/70';\n\nexport function SettingsFormSectionHeader({\n icon: Icon,\n title,\n subtitle,\n trailing,\n className,\n iconInteractive,\n iconLeading,\n}: {\n icon: LucideIcon;\n title: string;\n subtitle: string;\n /** Optional content rendered at the trailing (right) edge of the header. */\n trailing?: ReactNode;\n className?: string;\n /** When set, the leading icon is a button (e.g. open a related settings dialog). */\n iconInteractive?: { onClick: () => void; ariaLabel: string; id?: string };\n /** When set, replaces the default Lucide icon in the leading slot (same size as the icon box). */\n iconLeading?: ReactNode;\n}) {\n const defaultGlyph = <Icon className=\"size-4\" strokeWidth={1.75} aria-hidden />;\n const lead = iconLeading ?? defaultGlyph;\n\n const leadingInteractiveClass = iconLeading\n ? cn(\n 'flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-surface-panel p-0 ring-1 ring-inset ring-edge-subtle transition-[box-shadow] hover:ring-accent/40 dark:ring-edge-subtle',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n )\n : cn(\n settingsSectionHeaderIconShellClass,\n 'hover:text-fg',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n );\n\n const showAvatarEditPencil = Boolean(iconInteractive && iconLeading);\n\n return (\n <div className={cn('mb-5 flex items-start gap-3', className)}>\n {iconInteractive ? (\n showAvatarEditPencil ? (\n <span className=\"relative shrink-0\">\n <button\n type=\"button\"\n id={iconInteractive.id}\n onClick={iconInteractive.onClick}\n aria-label={iconInteractive.ariaLabel}\n className={leadingInteractiveClass}\n >\n {lead}\n </button>\n <span\n className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex size-4 items-center justify-center rounded-md border border-edge bg-surface-panel text-fg-muted shadow-sm dark:border-edge dark:bg-surface-base\"\n aria-hidden\n >\n <Pencil className=\"size-2.5\" strokeWidth={2.25} />\n </span>\n </span>\n ) : (\n <button\n type=\"button\"\n id={iconInteractive.id}\n onClick={iconInteractive.onClick}\n aria-label={iconInteractive.ariaLabel}\n className={leadingInteractiveClass}\n >\n {lead}\n </button>\n )\n ) : (\n <div\n className={cn(\n iconLeading\n ? 'flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-surface-panel ring-1 ring-inset ring-edge-subtle dark:ring-edge-subtle'\n : settingsSectionHeaderIconShellClass,\n )}\n aria-hidden={!iconLeading}\n >\n {lead}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-sm font-semibold text-fg\">{title}</h2>\n <p className=\"mt-0.5 text-xs text-fg-muted\">{subtitle}</p>\n </div>\n {trailing ? <div className=\"shrink-0\">{trailing}</div> : null}\n </div>\n );\n}\n","import type { GatewayConfigBinding } from '@/features/settings/agents-admin-api';\nimport type { CronJob, SessionChatId } from '@/features/cron/cron-api';\nimport { cn } from '@/lib/cn';\nimport { settingsInputFocusClass } from '@/lib/form-field-width';\n\nexport type AgentPanel = 'overview' | 'profile' | 'files' | 'tools' | 'skills' | 'channels' | 'cron';\n\nexport function agentsSettingsInputClass(): string {\n return cn(\n 'w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\nexport function jobMatchesAgent(job: CronJob, agentId: string, defaultId: string): boolean {\n const raw = job.agentId?.trim().toLowerCase();\n if (raw) {\n return raw === agentId.toLowerCase();\n }\n return agentId.toLowerCase() === defaultId.toLowerCase();\n}\n\nexport function matchSummary(m: GatewayConfigBinding['match']): string {\n const parts = [m.channel, m.accountId, m.peerKind, m.peerId].filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return parts.join(' · ') || m.channel;\n}\n\n/** Build a `bindings[].match` for the add-binding form. Custom glob wins over session pick. */\nexport function buildNewBindingMatch(\n channel: string,\n customPeer: string,\n sessionIdx: number | null,\n sessions: SessionChatId[],\n): GatewayConfigBinding['match'] {\n const ch = channel.trim();\n const custom = customPeer.trim();\n if (custom) {\n return { channel: ch, peerId: custom };\n }\n if (sessionIdx != null) {\n const s = sessions[sessionIdx];\n if (!s) {\n return { channel: ch };\n }\n const m: GatewayConfigBinding['match'] = { channel: ch };\n if (s.accountId?.trim()) {\n m.accountId = s.accountId.trim();\n }\n if (s.peerKind?.trim()) {\n m.peerKind = s.peerKind.trim();\n }\n const peer = s.peerId?.trim() || s.chatId?.trim();\n if (peer) {\n m.peerId = peer;\n }\n return m;\n }\n return { channel: ch };\n}\n","import { Link2, RefreshCw } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayConfigBinding } from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport type { ChannelStatus, SessionChatId } from '@/features/cron/cron-api';\nimport { formatRecipientOptionLabel } from '@/features/cron/cron-utils';\nimport { selectControlBaseClass } from '@/lib/form-field-width';\nimport { agentsSettingsInputClass, matchSummary } from '../utils';\nimport type { AgentsSettingsMessages, MessageBundle } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\n\nconst channelsPeerIdSelectClass = cn(\n selectControlBaseClass,\n 'w-full text-xs sm:w-auto sm:min-w-[11rem] sm:max-w-[17rem] sm:shrink-0',\n);\n\ntype LastActiveLabels = MessageBundle['cron']['lastActiveLabels'];\n\nexport function AgentChannelsTab(props: {\n a: AgentsSettingsMessages;\n busy: boolean;\n bindingsLoading: boolean;\n agentBindings: GatewayConfigBinding[];\n onRemoveBinding: (rule: GatewayConfigBinding) => void;\n onAddBinding: (e: React.FormEvent) => void;\n channelStatuses: ChannelStatus[];\n channelsStatusLoading: boolean;\n useManualChannel: boolean;\n newBindChannel: string;\n setNewBindChannel: (v: string) => void;\n bindSessionChats: SessionChatId[];\n sessionsLoading: boolean;\n newBindSessionIdx: number | null;\n setNewBindSessionIdx: (v: number | null) => void;\n newBindCustomPeer: string;\n setNewBindCustomPeer: (v: string) => void;\n onRefreshSessions: () => void;\n lastActiveLabels: LastActiveLabels;\n /** Same copy as `cron.selectRecipient` — empty option in peer id dropdown. */\n selectRecipient: string;\n}) {\n const {\n a,\n busy,\n bindingsLoading,\n agentBindings,\n onRemoveBinding,\n onAddBinding,\n channelStatuses,\n channelsStatusLoading,\n useManualChannel,\n newBindChannel,\n setNewBindChannel,\n bindSessionChats,\n sessionsLoading,\n newBindSessionIdx,\n setNewBindSessionIdx,\n newBindCustomPeer,\n setNewBindCustomPeer,\n onRefreshSessions,\n lastActiveLabels,\n selectRecipient,\n } = props;\n\n const showPeerForm = !channelsStatusLoading && (useManualChannel || channelStatuses.length > 0);\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={Link2}\n title={a.channelsTitle}\n subtitle={a.channelsHint}\n />\n {bindingsLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.channelsLoading}</p>\n ) : agentBindings.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{a.channelsNone}</p>\n ) : (\n <ul className=\"flex flex-col gap-2 text-sm\">\n {agentBindings.map((b, i) => (\n <li\n key={`${b.match.channel}-${i}`}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-lg border border-edge bg-surface-panel px-3 py-2\"\n >\n <span className=\"font-mono text-xs\">{matchSummary(b.match)}</span>\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onRemoveBinding(b)}>\n {a.removeBinding}\n </Button>\n </li>\n ))}\n </ul>\n )}\n <form className=\"mt-4 flex flex-col gap-3\" onSubmit={onAddBinding}>\n {channelsStatusLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.channelsLoadingChannels}</p>\n ) : useManualChannel ? (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.channelLabel}</span>\n <input\n className={agentsSettingsInputClass()}\n value={newBindChannel}\n onChange={(e) => setNewBindChannel(e.target.value)}\n placeholder=\"telegram\"\n autoComplete=\"off\"\n />\n <p className=\"text-xs text-fg-muted\">{a.channelsManualChannelHint}</p>\n </label>\n ) : (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.channelLabel}</span>\n <select\n className={cn(agentsSettingsInputClass(), 'py-2')}\n value={newBindChannel}\n onChange={(e) => {\n setNewBindChannel(e.target.value);\n setNewBindSessionIdx(null);\n setNewBindCustomPeer('');\n }}\n >\n {channelStatuses.map((ch) => (\n <option key={ch.name} value={ch.name} disabled={!ch.enabled}>\n {ch.name} {!ch.enabled ? a.channelsDisabledSuffix : ''}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {showPeerForm && newBindChannel.trim() ? (\n <div className=\"flex flex-col gap-2 border-t border-edge-subtle pt-3 text-sm\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-fg-muted\">{a.channelsSessionLabel}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 gap-1 px-2 text-xs\"\n disabled={busy || sessionsLoading || !newBindChannel.trim()}\n title={a.channelsRefreshSessionsHint}\n onClick={() => onRefreshSessions()}\n >\n <RefreshCw className={cn('size-3.5', sessionsLoading && 'animate-spin')} strokeWidth={1.75} />\n {a.channelsRefreshSessions}\n </Button>\n </div>\n {sessionsLoading && bindSessionChats.length === 0 ? (\n <p className=\"text-xs text-fg-muted\">{a.channelsLoadingSessions}</p>\n ) : null}\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-fg-muted\">{a.channelsPeerFromSessions}</span>\n <select\n className={cn(agentsSettingsInputClass(), 'py-2')}\n value={newBindSessionIdx == null ? '' : String(newBindSessionIdx)}\n disabled={busy || !newBindChannel.trim() || Boolean(newBindCustomPeer.trim())}\n onChange={(e) => {\n const v = e.target.value;\n setNewBindSessionIdx(v === '' ? null : Number(v));\n }}\n >\n <option value=\"\">{a.channelsPeerAny}</option>\n {bindSessionChats.map((item, idx) => (\n <option key={`${item.channel}-${item.chatId}-${idx}`} value={String(idx)}>\n {formatRecipientOptionLabel(item, lastActiveLabels)}\n </option>\n ))}\n </select>\n </label>\n {bindSessionChats.length === 0 && newBindChannel.trim() && !sessionsLoading ? (\n <p className=\"text-xs text-fg-muted\">{a.channelsNoSessionsHint}</p>\n ) : null}\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-fg-muted\">{a.peerIdLabel}</span>\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-stretch sm:gap-2\">\n <input\n type=\"text\"\n className={cn(agentsSettingsInputClass(), 'min-w-0 w-full sm:flex-1')}\n value={newBindCustomPeer}\n onChange={(e) => {\n setNewBindCustomPeer(e.target.value);\n if (e.target.value.trim()) {\n setNewBindSessionIdx(null);\n }\n }}\n placeholder={a.channelsCustomPeerPlaceholder}\n autoComplete=\"off\"\n />\n <select\n className={channelsPeerIdSelectClass}\n value={newBindCustomPeer}\n onChange={(e) => {\n const v = e.target.value;\n if (v) {\n setNewBindCustomPeer(v);\n } else {\n setNewBindCustomPeer('');\n }\n setNewBindSessionIdx(null);\n }}\n >\n <option value=\"\">{selectRecipient}</option>\n {bindSessionChats.map((item) => (\n <option key={`${item.channel}-${item.chatId}`} value={item.chatId}>\n {formatRecipientOptionLabel(item, lastActiveLabels)}\n </option>\n ))}\n </select>\n </div>\n <p className=\"text-xs text-fg-muted\">{a.channelsCustomPeerHint}</p>\n </div>\n </div>\n ) : null}\n\n <div>\n <Button type=\"submit\" disabled={busy || !newBindChannel.trim() || channelsStatusLoading}>\n {a.addBinding}\n </Button>\n </div>\n </form>\n </SettingsFormSection>\n );\n}\n","import { AlarmClock } from 'lucide-react';\n\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport { cronJobBodyText, type CronJob } from '@/features/cron/cron-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nimport { agentsSettingsInputClass } from '../utils';\n\nexport function AgentCronTab(props: {\n a: AgentsSettingsMessages;\n data: { agents: GatewayAgentRow[] };\n selected: GatewayAgentRow;\n busy: boolean;\n cronLoading: boolean;\n agentCronJobs: CronJob[];\n onSetCronJobAgent: (job: CronJob, agentKey: string) => void;\n}) {\n const { a, data, busy, cronLoading, agentCronJobs, onSetCronJobAgent } = props;\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={AlarmClock}\n title={a.cronTitle}\n subtitle={a.cronHint}\n />\n {cronLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.cronLoading}</p>\n ) : agentCronJobs.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{a.cronNone}</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[32rem] border-collapse text-left text-sm\">\n <thead>\n <tr className=\"border-b border-edge text-fg-muted\">\n <th className=\"py-2 pr-3 font-medium\">{a.cronColSchedule}</th>\n <th className=\"py-2 pr-3 font-medium\">{a.cronColMessage}</th>\n <th className=\"py-2 pr-3 font-medium\">{a.cronColSession}</th>\n <th className=\"py-2 pr-3 font-medium\">{a.cronColAgent}</th>\n </tr>\n </thead>\n <tbody>\n {agentCronJobs.map((job) => {\n const usesDefaultAgent = !job.agentId?.trim();\n const value = usesDefaultAgent ? '' : job.agentId!.trim().toLowerCase();\n return (\n <tr key={job.id} className=\"border-b border-edge-subtle\">\n <td className=\"py-2 pr-3 font-mono text-xs\">{job.schedule}</td>\n <td className=\"max-w-[12rem] truncate py-2 pr-3 text-xs\" title={cronJobBodyText(job)}>\n {cronJobBodyText(job)}\n </td>\n <td className=\"py-2 pr-3 text-xs\">{job.sessionTarget ?? 'main'}</td>\n <td className=\"py-2 pr-3\">\n <select\n className={cn(agentsSettingsInputClass(), 'min-w-[8rem] py-1 text-xs')}\n value={value}\n disabled={busy || job.sessionTarget !== 'isolated'}\n onChange={(e) => void onSetCronJobAgent(job, e.target.value)}\n >\n <option value=\"\">{usesDefaultAgent ? a.cronAgentDefault : a.cronAgentClear}</option>\n {data.agents.map((ag) => (\n <option key={ag.id} value={ag.id}>\n {ag.id}\n </option>\n ))}\n </select>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </SettingsFormSection>\n );\n}\n","import { Eye, SquarePen } from 'lucide-react';\n\nimport { MarkdownEditor } from '@/components/markdown/markdown-editor';\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { useThemeStore } from '@/stores/theme-store';\n\nimport { agentsSettingsInputClass } from '../utils';\n\nexport function AgentFilesTab(props: {\n a: AgentsSettingsMessages;\n filesLoading: boolean;\n files: { files: { name: string; missing: boolean }[] } | null;\n activeFile: string | null;\n setActiveFile: (name: string) => void;\n bootstrapViewMode: 'edit' | 'preview';\n setBootstrapViewMode: (m: 'edit' | 'preview') => void;\n fileDraft: string;\n setFileDraft: (v: string) => void;\n fileSaving: boolean;\n bootstrapFileLoading: boolean;\n /** Bumps when bootstrap file body is loaded from the server (remounts CodeMirror). */\n bootstrapEditorNonce: number;\n}) {\n const {\n a,\n filesLoading,\n files,\n activeFile,\n setActiveFile,\n bootstrapViewMode,\n setBootstrapViewMode,\n fileDraft,\n setFileDraft,\n fileSaving,\n bootstrapFileLoading,\n bootstrapEditorNonce,\n } = props;\n\n const isDark = useThemeStore((s) => s.resolved === 'dark');\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 overflow-hidden\">\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.filesHint}</p>\n {filesLoading ? (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.filesLoading}</p>\n ) : files ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-hidden\">\n <nav\n className=\"flex shrink-0 flex-row flex-wrap gap-x-0.5 gap-y-0 border-b border-edge-subtle\"\n aria-label={a.tabFiles}\n >\n {files.files.map((f) => (\n <button\n key={f.name}\n type=\"button\"\n className={cn(\n '-mb-px shrink-0 border-b-2 border-transparent px-3 py-2 text-left font-mono text-xs whitespace-nowrap transition-colors',\n activeFile === f.name\n ? 'border-accent text-fg'\n : 'text-fg-muted hover:border-edge-subtle hover:text-fg',\n f.missing && 'opacity-60',\n )}\n onClick={() => setActiveFile(f.name)}\n >\n {f.name}\n {f.missing ? ` (${a.missing})` : ''}\n </button>\n ))}\n </nav>\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-2 overflow-hidden\">\n {activeFile ? (\n <>\n <div className=\"flex shrink-0 flex-wrap items-center justify-between gap-2\">\n <div\n className=\"inline-flex rounded-lg border border-edge bg-surface-panel p-0.5\"\n role=\"group\"\n aria-label={a.filesBootstrapEdit}\n >\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium',\n bootstrapViewMode === 'edit'\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover',\n )}\n onClick={() => setBootstrapViewMode('edit')}\n >\n <SquarePen className=\"size-3.5 shrink-0\" aria-hidden />\n {a.filesBootstrapEdit}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs font-medium',\n bootstrapViewMode === 'preview'\n ? 'bg-accent-soft text-accent-fg'\n : 'text-fg-muted hover:bg-surface-hover',\n )}\n onClick={() => setBootstrapViewMode('preview')}\n >\n <Eye className=\"size-3.5 shrink-0\" aria-hidden />\n {a.filesBootstrapPreview}\n </button>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-fg-muted\">\n {fileSaving ? <span>{a.filesSavingStatus}</span> : null}\n <span>{a.filesAutoSaveHint}</span>\n </div>\n </div>\n {bootstrapViewMode === 'edit' ? (\n <div\n className={cn(\n agentsSettingsInputClass(),\n 'flex min-h-0 flex-1 flex-col overflow-hidden p-0',\n bootstrapFileLoading && 'pointer-events-none opacity-60',\n )}\n >\n <MarkdownEditor\n key={`${activeFile ?? 'file'}-${bootstrapEditorNonce}`}\n initialContent={fileDraft}\n onChange={setFileDraft}\n isDark={isDark}\n className=\"min-h-0 flex-1\"\n />\n </div>\n ) : (\n <div\n className={cn(\n agentsSettingsInputClass(),\n 'min-h-0 flex-1 overflow-y-auto text-sm',\n bootstrapFileLoading && 'pointer-events-none opacity-60',\n )}\n >\n <MarkdownView content={fileDraft} className=\"text-sm\" />\n </div>\n )}\n </>\n ) : (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.pickFile}</p>\n )}\n </div>\n </div>\n ) : (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.filesEmpty}</p>\n )}\n </div>\n );\n}\n","import * as Popover from '@radix-ui/react-popover';\nimport { Upload } from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nimport {\n deleteAgentAvatarFile,\n uploadAgentAvatarFile,\n} from '@/features/settings/agents-admin-api';\n\nimport { AgentAvatarDisplay } from './agent-avatar-display';\nimport {\n DICEBEAR_MORE_SEEDS,\n DICEBEAR_ROW_SEEDS,\n DICEBEAR_STYLE_ORDER,\n XOPC_CUSTOM_AVATAR,\n buildXopcDicebearValue,\n dicebearToDataUri,\n isDicebearStyleId,\n parseXopcDicebearValue,\n type DicebearStyleId,\n} from './agent-avatar-dicebear';\n\nfunction styleLabel(style: DicebearStyleId, a: AgentsSettingsMessages): string {\n switch (style) {\n case 'adventurer':\n return a.avatarStyleAdventurer;\n case 'bottts':\n return a.avatarStyleRobot;\n case 'lorelei':\n return a.avatarStyleLorelei;\n case 'thumbs':\n return a.avatarStyleThumbs;\n case 'fun-emoji':\n return a.avatarStyleFunEmoji;\n default:\n return style;\n }\n}\n\nexport function AgentAvatarPicker(props: {\n agentId: string;\n value: string;\n onChange: (next: string) => void;\n a: AgentsSettingsMessages;\n /** Optional root id (e.g. for scroll-into-view); omit when embedded in a dialog. */\n id?: string;\n}) {\n const { agentId, value, onChange, a, id } = props;\n const fileRef = useRef<HTMLInputElement>(null);\n const [uploadBusy, setUploadBusy] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [moreOpen, setMoreOpen] = useState(false);\n\n const activeStyle = useMemo((): DicebearStyleId => {\n const p = parseXopcDicebearValue(value.trim());\n if (p && isDicebearStyleId(p.styleId)) {\n return p.styleId;\n }\n return DICEBEAR_STYLE_ORDER[0] ?? 'adventurer';\n }, [value]);\n\n const pickDicebear = useCallback(\n async (styleId: DicebearStyleId, seed: string) => {\n try {\n await deleteAgentAvatarFile(agentId);\n } catch {\n /* best-effort: clear binary when switching away from custom */\n }\n onChange(buildXopcDicebearValue(styleId, seed));\n setMoreOpen(false);\n },\n [agentId, onChange],\n );\n\n const onFile = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) {\n return;\n }\n setUploadError(null);\n setUploadBusy(true);\n try {\n await uploadAgentAvatarFile(agentId, file);\n onChange(XOPC_CUSTOM_AVATAR);\n } catch (err) {\n const code = err instanceof Error ? err.message : '';\n if (code === 'avatar_too_large') {\n setUploadError(a.avatarTooLarge);\n } else if (code === 'unsupported_image_type' || code === 'empty_file') {\n setUploadError(a.avatarInvalidImage);\n } else {\n setUploadError(a.avatarUploadFailed);\n }\n } finally {\n setUploadBusy(false);\n }\n },\n [a, agentId, onChange],\n );\n\n const isRowSeedActive = (styleId: DicebearStyleId, seed: string) => {\n const p = parseXopcDicebearValue(value.trim());\n return Boolean(p && p.styleId === styleId && p.seed === seed);\n };\n\n return (\n <div {...(id ? { id } : {})} className=\"flex flex-col gap-3 sm:col-span-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-sm font-medium text-fg\">{a.avatarPickerTitle}</span>\n <div className=\"flex items-center gap-2\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,.png,.jpg,.jpeg,.webp\"\n className=\"hidden\"\n onChange={(ev) => void onFile(ev)}\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"gap-1.5 px-2.5 py-1.5 text-xs\"\n disabled={uploadBusy}\n onClick={() => fileRef.current?.click()}\n >\n <Upload className=\"size-3.5 shrink-0\" strokeWidth={1.75} aria-hidden />\n {uploadBusy ? a.avatarUploading : a.avatarUploadCustom}\n </Button>\n </div>\n </div>\n\n {uploadError ? <p className=\"text-xs text-red-600 dark:text-red-400\">{uploadError}</p> : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {DICEBEAR_STYLE_ORDER.map((id) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => void pickDicebear(id, DICEBEAR_ROW_SEEDS[0] ?? agentId)}\n className={cn(\n 'rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n activeStyle === id\n ? 'border-fg bg-fg text-surface-base'\n : 'border-edge-subtle bg-surface-panel text-fg hover:border-edge',\n )}\n >\n {styleLabel(id, a)}\n </button>\n ))}\n </div>\n\n <div className=\"rounded-xl border border-edge-subtle bg-surface-panel/50 p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {DICEBEAR_ROW_SEEDS.map((seed) => (\n <button\n key={seed}\n type=\"button\"\n title={seed}\n onClick={() => void pickDicebear(activeStyle, seed)}\n className={cn(\n 'flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-colors',\n isRowSeedActive(activeStyle, seed)\n ? 'border-accent ring-2 ring-accent/30'\n : 'border-transparent hover:border-edge',\n )}\n >\n <img\n src={dicebearToDataUri(activeStyle, seed, 96)}\n alt=\"\"\n width={44}\n height={44}\n className=\"size-11 rounded-full object-cover\"\n draggable={false}\n />\n </button>\n ))}\n\n <Popover.Root open={moreOpen} onOpenChange={setMoreOpen}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n className=\"flex size-12 shrink-0 items-center justify-center rounded-xl border border-edge-subtle bg-surface-base text-xs font-medium text-fg-muted hover:border-edge hover:text-fg\"\n >\n {a.avatarMore}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n className=\"z-[80] max-h-72 w-[min(22rem,calc(100vw-2rem))] overflow-y-auto rounded-xl border border-edge-subtle bg-surface-panel p-3 shadow-lg\"\n sideOffset={6}\n align=\"end\"\n >\n <p className=\"mb-2 text-xs font-medium text-fg-muted\">{styleLabel(activeStyle, a)}</p>\n <div className=\"flex flex-wrap gap-2\">\n {DICEBEAR_MORE_SEEDS.map((seed) => (\n <button\n key={seed}\n type=\"button\"\n title={seed}\n onClick={() => void pickDicebear(activeStyle, seed)}\n className={cn(\n 'flex size-11 shrink-0 items-center justify-center rounded-full border-2 transition-colors',\n isRowSeedActive(activeStyle, seed)\n ? 'border-accent ring-2 ring-accent/30'\n : 'border-transparent hover:border-edge',\n )}\n >\n <img\n src={dicebearToDataUri(activeStyle, seed, 88)}\n alt=\"\"\n width={40}\n height={40}\n className=\"size-10 rounded-full object-cover\"\n draggable={false}\n />\n </button>\n ))}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n\n <div className=\"mt-3 flex items-center gap-2 border-t border-edge-subtle pt-3\">\n <span className=\"text-xs text-fg-muted\">{a.personaAvatar}</span>\n <AgentAvatarDisplay agentId={agentId} avatar={value} size={40} />\n {value.trim() && !parseXopcDicebearValue(value.trim()) && value.trim() !== XOPC_CUSTOM_AVATAR ? (\n <span className=\"truncate font-mono text-[10px] text-fg-muted\" title={value}>\n {value}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Bidirectional parser for bootstrap Markdown files.\n *\n * Converts structured form fields ↔ Markdown content for IDENTITY.md, USER.md\n * and SOUL.md so that the persona tab can present friendly form inputs while\n * keeping the underlying Markdown format compatible with the agent runtime.\n */\n\n// ---------------------------------------------------------------------------\n// IDENTITY.md\n// ---------------------------------------------------------------------------\n\nexport interface IdentityFields {\n name: string;\n creature: string;\n emoji: string;\n avatar: string;\n}\n\nconst IDENTITY_DEFAULTS: IdentityFields = {\n name: '',\n creature: '',\n emoji: '',\n avatar: '',\n};\n\n/**\n * Parse IDENTITY.md content into structured fields.\n *\n * Handles the template format:\n * - **Name:** value\n * - **Creature:** value\n * - **Vibe:** value\n * - **Emoji:** value\n * - **Avatar:** value\n */\nexport function parseIdentityMarkdown(content: string): IdentityFields {\n const fields = { ...IDENTITY_DEFAULTS };\n if (!content.trim()) {\n return fields;\n }\n\n const fieldMap: Record<string, keyof IdentityFields> = {\n name: 'name',\n creature: 'creature',\n emoji: 'emoji',\n avatar: 'avatar',\n };\n\n for (const line of content.split('\\n')) {\n const match = line.match(/^[-*]\\s+\\*\\*(\\w+):\\*\\*\\s*(.*)/i);\n if (!match) {\n continue;\n }\n const label = match[1].toLowerCase();\n const fieldKey = fieldMap[label];\n if (!fieldKey) {\n continue;\n }\n let value = match[2].trim();\n // Strip template placeholders like _(pick something you like)_\n if (/^_\\(.*\\)_$/.test(value)) {\n value = '';\n }\n fields[fieldKey] = value;\n }\n\n return fields;\n}\n\n/**\n * Serialize structured identity fields back to IDENTITY.md Markdown.\n */\nexport function serializeIdentityMarkdown(fields: IdentityFields): string {\n const lines = [\n '# IDENTITY.md - Who Am I?',\n '',\n `- **Name:** ${fields.name}`,\n `- **Creature:** ${fields.creature}`,\n `- **Emoji:** ${fields.emoji}`,\n `- **Avatar:** ${fields.avatar}`,\n '',\n ];\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// USER.md (bootstrap)\n// ---------------------------------------------------------------------------\n\nexport interface UserFields {\n callName: string;\n pronouns: string;\n timezone: string;\n notes: string;\n}\n\nconst USER_DEFAULTS: UserFields = {\n callName: '',\n pronouns: '',\n timezone: '',\n notes: '',\n};\n\n/**\n * Parse bootstrap USER.md content into structured fields.\n *\n * Handles the template format:\n * - **Name:** value\n * - **What to call them:** value\n * - **Pronouns:** value\n * - **Timezone:** value\n * - **Notes:** value\n *\n * Also captures the Context section as free-text notes.\n */\nexport function parseUserMarkdown(content: string): UserFields {\n const fields = { ...USER_DEFAULTS };\n if (!content.trim()) {\n return fields;\n }\n\n const fieldMap: Record<string, keyof UserFields> = {\n name: 'callName',\n 'what to call them': 'callName',\n pronouns: 'pronouns',\n timezone: 'timezone',\n notes: 'notes',\n };\n\n const lines = content.split('\\n');\n let contextStartIndex = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Detect the ## Context section\n if (/^##\\s+Context/i.test(line)) {\n contextStartIndex = i + 1;\n continue;\n }\n\n const match = line.match(/^[-*]\\s+\\*\\*(.+?):\\*\\*\\s*(.*)/i);\n if (!match) {\n continue;\n }\n const label = match[1].toLowerCase().trim();\n const fieldKey = fieldMap[label];\n if (!fieldKey) {\n continue;\n }\n let value = match[2].trim();\n // Strip template placeholders like _(optional)_\n if (/^_\\(.*\\)_$/.test(value)) {\n value = '';\n }\n fields[fieldKey] = value;\n }\n\n // Capture context section content as extra notes\n if (contextStartIndex > 0) {\n const contextLines = lines.slice(contextStartIndex);\n const contextText = contextLines\n .join('\\n')\n .replace(/^_\\(.*?\\)_\\s*/gm, '') // strip template placeholders\n .replace(/^---\\s*$/gm, '') // strip trailing horizontal rules\n .replace(/The more you know.*$/s, '') // strip template footer\n .trim();\n\n if (contextText && !fields.notes) {\n fields.notes = contextText;\n }\n }\n\n return fields;\n}\n\n/**\n * Serialize structured user fields back to USER.md Markdown.\n */\nexport function serializeUserMarkdown(fields: UserFields): string {\n const lines = [\n '# USER.md - About Your Human',\n '',\n `- **Name:** ${fields.callName}`,\n `- **Pronouns:** ${fields.pronouns}`,\n `- **Timezone:** ${fields.timezone}`,\n '',\n ];\n\n if (fields.notes.trim()) {\n lines.push('## Context', '', fields.notes.trim(), '');\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// SOUL.md\n// ---------------------------------------------------------------------------\n\n/** Pre-defined soul templates for quick selection. */\nexport type SoulTemplateId = 'professional' | 'casual' | 'geeky' | 'custom';\n\nexport interface SoulTemplate {\n id: SoulTemplateId;\n labelEn: string;\n labelZh: string;\n emoji: string;\n content: string;\n}\n\nexport const SOUL_TEMPLATES: SoulTemplate[] = [\n {\n id: 'professional',\n labelEn: 'Professional & Efficient',\n labelZh: '专业高效',\n emoji: '🎯',\n content: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Be genuinely helpful, not performatively helpful.** Skip the filler words — just help. Actions speak louder than pleasantries.\n\n**Be precise and efficient.** Value the user's time. Give concise, actionable answers. Expand only when asked.\n\n**Earn trust through competence.** Be careful with external actions. Be bold with internal ones (reading, organizing, learning).\n\n**Remember you're a guest.** You have access to someone's life. Treat it with respect.\n\n## Boundaries\n\n- Private things stay private. Period.\n- When in doubt, ask before acting externally.\n- Never send half-baked replies to messaging surfaces.\n\n## Vibe\n\nProfessional, competent, and respectful. Concise when needed, thorough when it matters.`,\n },\n {\n id: 'casual',\n labelEn: 'Warm & Friendly',\n labelZh: '轻松友好',\n emoji: '😊',\n content: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Be a good friend, not a corporate drone.** Be warm, genuine, and real. Skip the formality when it gets in the way.\n\n**Have personality.** You're allowed to be amused, surprised, or excited. An assistant with no personality is just a search engine.\n\n**Be resourceful before asking.** Try to figure it out first. Then ask if you're stuck.\n\n**Earn trust by being reliable.** Show up, follow through, and remember what matters.\n\n**Respect the intimacy.** You have access to someone's life. That's a privilege.\n\n## Boundaries\n\n- Private things stay private. Always.\n- When in doubt, ask before acting externally.\n- Be careful in group chats — you're not the user's voice.\n\n## Vibe\n\nWarm, friendly, and a little playful. Like a helpful friend who happens to know everything.`,\n },\n {\n id: 'geeky',\n labelEn: 'Geeky & Witty',\n labelZh: '极客风格',\n emoji: '🧑‍💻',\n content: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Precision over politeness.** \"This is broken\" beats \"This might be worth considering.\" Be direct.\n\n**Have opinions.** Disagree, prefer things, find stuff interesting or dull. No personality = no value.\n\n**Go deep.** When something is interesting, explore it. Surface-level answers are for search engines.\n\n**Be resourceful.** Read the file. Check the context. Search for it. Come back with answers, not questions.\n\n**Earn trust through competence.** Be careful with external actions. Be bold with internal ones.\n\n## Boundaries\n\n- Private things stay private.\n- When in doubt, ask before acting externally.\n- Never send half-baked replies.\n\n## Vibe\n\nSharp, direct, slightly nerdy. The kind of engineer you'd want on your team — competent, opinionated, and occasionally funny.`,\n },\n {\n id: 'custom',\n labelEn: 'Custom',\n labelZh: '自定义',\n emoji: '✍️',\n content: '',\n },\n];\n\n/**\n * Strip YAML front matter (--- ... ---) from the beginning of Markdown content.\n */\nexport function stripFrontMatterForParsing(content: string): string {\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('---')) {\n return content;\n }\n const endIndex = trimmed.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n return trimmed.slice(endIndex + 3).trimStart();\n}\n\n/**\n * Detect which soul template best matches the current content.\n * Falls back to 'custom' if no template matches closely.\n */\nexport function detectSoulTemplate(content: string): SoulTemplateId {\n const stripped = stripFrontMatterForParsing(content).trim();\n if (!stripped) {\n return 'professional'; // default for empty content\n }\n\n // Compare against known templates by checking key phrases\n for (const template of SOUL_TEMPLATES) {\n if (template.id === 'custom') {\n continue;\n }\n // Check if the content closely matches the template\n const templateStripped = template.content.trim();\n if (stripped === templateStripped) {\n return template.id;\n }\n // Fuzzy: check for unique key phrases in each template\n const keyPhrases = getTemplateKeyPhrases(template.id);\n const matchCount = keyPhrases.filter((phrase) => stripped.includes(phrase)).length;\n if (matchCount >= 2) {\n return template.id;\n }\n }\n\n return 'custom';\n}\n\nfunction getTemplateKeyPhrases(id: SoulTemplateId): string[] {\n switch (id) {\n case 'professional':\n return ['precise and efficient', \"Value the user's time\", 'actionable answers'];\n case 'casual':\n return ['good friend', 'corporate drone', 'a little playful'];\n case 'geeky':\n return ['Precision over politeness', 'Go deep', 'slightly nerdy'];\n default:\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Timezone helpers\n// ---------------------------------------------------------------------------\n\n/** Common timezone options for the dropdown. */\nexport const TIMEZONE_OPTIONS = [\n { value: '', labelEn: 'Not set', labelZh: '未设置' },\n { value: 'Asia/Shanghai', labelEn: 'Asia/Shanghai (CST, UTC+8)', labelZh: '亚洲/上海 (北京时间, UTC+8)' },\n { value: 'Asia/Tokyo', labelEn: 'Asia/Tokyo (JST, UTC+9)', labelZh: '亚洲/东京 (日本时间, UTC+9)' },\n { value: 'Asia/Seoul', labelEn: 'Asia/Seoul (KST, UTC+9)', labelZh: '亚洲/首尔 (韩国时间, UTC+9)' },\n { value: 'Asia/Singapore', labelEn: 'Asia/Singapore (SGT, UTC+8)', labelZh: '亚洲/新加坡 (UTC+8)' },\n { value: 'Asia/Hong_Kong', labelEn: 'Asia/Hong Kong (HKT, UTC+8)', labelZh: '亚洲/香港 (UTC+8)' },\n { value: 'Asia/Taipei', labelEn: 'Asia/Taipei (CST, UTC+8)', labelZh: '亚洲/台北 (UTC+8)' },\n { value: 'Asia/Kolkata', labelEn: 'Asia/Kolkata (IST, UTC+5:30)', labelZh: '亚洲/加尔各答 (印度时间, UTC+5:30)' },\n { value: 'Asia/Dubai', labelEn: 'Asia/Dubai (GST, UTC+4)', labelZh: '亚洲/迪拜 (UTC+4)' },\n { value: 'Europe/London', labelEn: 'Europe/London (GMT/BST)', labelZh: '欧洲/伦敦 (格林尼治时间)' },\n { value: 'Europe/Paris', labelEn: 'Europe/Paris (CET, UTC+1)', labelZh: '欧洲/巴黎 (中欧时间, UTC+1)' },\n { value: 'Europe/Berlin', labelEn: 'Europe/Berlin (CET, UTC+1)', labelZh: '欧洲/柏林 (中欧时间, UTC+1)' },\n { value: 'Europe/Moscow', labelEn: 'Europe/Moscow (MSK, UTC+3)', labelZh: '欧洲/莫斯科 (UTC+3)' },\n { value: 'America/New_York', labelEn: 'America/New York (EST, UTC-5)', labelZh: '美国/纽约 (东部时间, UTC-5)' },\n { value: 'America/Chicago', labelEn: 'America/Chicago (CST, UTC-6)', labelZh: '美国/芝加哥 (中部时间, UTC-6)' },\n { value: 'America/Denver', labelEn: 'America/Denver (MST, UTC-7)', labelZh: '美国/丹佛 (山地时间, UTC-7)' },\n { value: 'America/Los_Angeles', labelEn: 'America/Los Angeles (PST, UTC-8)', labelZh: '美国/洛杉矶 (太平洋时间, UTC-8)' },\n { value: 'America/Sao_Paulo', labelEn: 'America/São Paulo (BRT, UTC-3)', labelZh: '美洲/圣保罗 (巴西时间, UTC-3)' },\n { value: 'Australia/Sydney', labelEn: 'Australia/Sydney (AEST, UTC+10)', labelZh: '澳大利亚/悉尼 (UTC+10)' },\n { value: 'Pacific/Auckland', labelEn: 'Pacific/Auckland (NZST, UTC+12)', labelZh: '太平洋/奥克兰 (新西兰时间, UTC+12)' },\n] as const;\n\n/**\n * Try to detect the user's timezone from the browser.\n */\nexport function detectBrowserTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return '';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Vibe presets\n// ---------------------------------------------------------------------------\n\nexport const VIBE_PRESETS = [\n { value: 'warm', labelEn: 'Warm', labelZh: '温暖' },\n { value: 'sharp', labelEn: 'Sharp', labelZh: '犀利' },\n { value: 'calm', labelEn: 'Calm', labelZh: '沉稳' },\n { value: 'playful', labelEn: 'Playful', labelZh: '活泼' },\n { value: 'professional', labelEn: 'Professional', labelZh: '专业' },\n { value: 'casual', labelEn: 'Casual', labelZh: '随意' },\n { value: 'witty', labelEn: 'Witty', labelZh: '机智' },\n { value: 'concise', labelEn: 'Concise', labelZh: '简洁' },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Creature presets\n// ---------------------------------------------------------------------------\n\nexport const PRONOUNS_PRESETS = [\n { value: '先生', labelEn: 'Mr.', labelZh: '先生' },\n { value: '女士', labelEn: 'Ms.', labelZh: '女士' },\n { value: '同学', labelEn: 'Colleague', labelZh: '同学' },\n { value: '老师', labelEn: 'Teacher', labelZh: '老师' },\n { value: '老板', labelEn: 'Boss', labelZh: '老板' },\n { value: '朋友', labelEn: 'Friend', labelZh: '朋友' },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Creature presets\n// ---------------------------------------------------------------------------\n\nexport const CREATURE_PRESETS = [\n { value: 'AI assistant', labelEn: 'AI Assistant', labelZh: 'AI 助手' },\n { value: 'robot', labelEn: 'Robot', labelZh: '机器人' },\n { value: 'familiar', labelEn: 'Familiar', labelZh: '精灵' },\n { value: 'ghost in the machine', labelEn: 'Ghost in the machine', labelZh: '机器幽灵' },\n { value: 'digital companion', labelEn: 'Digital Companion', labelZh: '数字伙伴' },\n] as const;\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { type MutableRefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { AlertTriangle, Cog, Eye, Pencil, Sparkles, Trash2, User, X } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { MarkdownEditor } from '@/components/markdown/markdown-editor';\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport {\n fetchAgentBootstrapFileContent,\n saveAgentBootstrapFileContent,\n} from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport type { AgentsSettingsMessages, ChatMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport {\n SETTINGS_SHELL_CONTENT_Z,\n SETTINGS_SHELL_OVERLAY_Z,\n SETTINGS_SHELL_POPOVER_Z,\n} from '@/lib/settings-shell-dialog-layer';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { useThemeStore } from '@/stores/theme-store';\n\nimport { AgentAvatarDisplay } from '../agent-avatar-display';\nimport { AgentAvatarPicker } from '../agent-avatar-picker';\nimport { agentsSettingsInputClass } from '../utils';\nimport {\n type IdentityFields,\n type SoulTemplateId,\n parseIdentityMarkdown,\n serializeIdentityMarkdown,\n detectSoulTemplate,\n SOUL_TEMPLATES,\n CREATURE_PRESETS,\n} from '../bootstrap-parser';\n\nexport function AgentOverviewTab(props: {\n a: AgentsSettingsMessages;\n chat: ChatMessages;\n selected: GatewayAgentRow | null;\n busy: boolean;\n editName: string;\n setEditName: (v: string) => void;\n editDescription: string;\n setEditDescription: (v: string) => void;\n editWorkspace: string;\n setEditWorkspace: (v: string) => void;\n editModel: string;\n setEditModel: (v: string) => void;\n onSetDefault: () => void;\n onSaveAgentEdits: () => void;\n onDelete: (purge: boolean) => void;\n hideInlineSave?: boolean;\n /** Parent writes a save-bootstrap callback into this ref so the modal footer can trigger it. */\n saveBootstrapRef?: MutableRefObject<(() => Promise<void>) | null>;\n /** Called when bootstrap-file dirty state changes. */\n onBootstrapDirtyChange?: (dirty: boolean) => void;\n}) {\n const {\n a,\n chat,\n selected,\n busy,\n editName,\n setEditName,\n editDescription,\n setEditDescription,\n editWorkspace,\n setEditWorkspace,\n editModel,\n setEditModel,\n onSetDefault,\n onSaveAgentEdits,\n onDelete,\n hideInlineSave,\n saveBootstrapRef,\n onBootstrapDirtyChange,\n } = props;\n\n const language = useLocaleStore((s) => s.language);\n const isDark = useThemeStore((s) => s.resolved === 'dark');\n\n // ---- Bootstrap file state ----\n const [bootstrapLoading, setBootstrapLoading] = useState(true);\n const [, setBootstrapSaving] = useState(false);\n\n const [identity, setIdentity] = useState<IdentityFields>({\n name: '',\n creature: '',\n emoji: '',\n avatar: '',\n });\n const [soulTemplate, setSoulTemplate] = useState<SoulTemplateId>('professional');\n const [soulCustomContent, setSoulCustomContent] = useState('');\n const [soulEditorNonce, setSoulEditorNonce] = useState(0);\n const [soulPreviewMode, setSoulPreviewMode] = useState(false);\n const [avatarDialogOpen, setAvatarDialogOpen] = useState(false);\n\n const initialLoadDoneRef = useRef(false);\n const agentIdRef = useRef(selected?.id ?? '');\n agentIdRef.current = selected?.id ?? '';\n\n // Snapshots for dirty tracking (set after load, reset after save)\n const identitySnapshotRef = useRef('');\n const soulSnapshotRef = useRef('');\n\n // ---- Load IDENTITY.md + SOUL.md ----\n useEffect(() => {\n if (!selected) return;\n let cancelled = false;\n initialLoadDoneRef.current = false;\n setBootstrapLoading(true);\n\n const load = async () => {\n try {\n const [identityMd, soulMd] = await Promise.all([\n fetchAgentBootstrapFileContent(selected.id, 'IDENTITY.md').catch(() => ''),\n fetchAgentBootstrapFileContent(selected.id, 'SOUL.md').catch(() => ''),\n ]);\n if (cancelled) return;\n const parsedIdentity = parseIdentityMarkdown(identityMd);\n setIdentity(parsedIdentity);\n identitySnapshotRef.current = JSON.stringify(parsedIdentity);\n setSoulTemplate(detectSoulTemplate(soulMd));\n setSoulCustomContent(soulMd);\n soulSnapshotRef.current = soulMd;\n setSoulEditorNonce((n) => n + 1);\n } finally {\n if (!cancelled) {\n setBootstrapLoading(false);\n initialLoadDoneRef.current = true;\n }\n }\n };\n void load();\n return () => {\n cancelled = true;\n };\n }, [selected?.id]);\n\n // ---- Save helpers (manual save only, triggered by footer button) ----\n const saveBootstrapFile = useCallback(async (fileName: string, content: string) => {\n setBootstrapSaving(true);\n try {\n await saveAgentBootstrapFileContent(agentIdRef.current, fileName, content);\n } finally {\n setBootstrapSaving(false);\n }\n }, []);\n\n // Refs to hold latest state for the save callback\n const identityRef = useRef(identity);\n identityRef.current = identity;\n const soulContentRef = useRef(soulCustomContent);\n soulContentRef.current = soulCustomContent;\n\n // Expose save function to parent for the footer save button\n useEffect(() => {\n if (!saveBootstrapRef) return;\n saveBootstrapRef.current = async () => {\n await Promise.all([\n saveBootstrapFile('IDENTITY.md', serializeIdentityMarkdown(identityRef.current)),\n saveBootstrapFile('SOUL.md', soulContentRef.current),\n ]);\n // Reset snapshots after successful save\n identitySnapshotRef.current = JSON.stringify(identityRef.current);\n soulSnapshotRef.current = soulContentRef.current;\n // Manually notify parent since state didn't change (only snapshot did)\n onBootstrapDirtyChange?.(false);\n };\n return () => {\n saveBootstrapRef.current = null;\n };\n }, [saveBootstrapRef, saveBootstrapFile, onBootstrapDirtyChange]);\n\n // Notify parent when bootstrap dirty state changes\n useEffect(() => {\n if (!onBootstrapDirtyChange) return;\n const identityDirty = JSON.stringify(identity) !== identitySnapshotRef.current;\n const soulDirty = soulCustomContent !== soulSnapshotRef.current;\n onBootstrapDirtyChange(identityDirty || soulDirty);\n }, [identity, soulCustomContent, onBootstrapDirtyChange]);\n\n const updateIdentity = useCallback((patch: Partial<IdentityFields>) => {\n setIdentity((prev) => ({ ...prev, ...patch }));\n }, []);\n\n const handleSoulTemplateChange = useCallback((templateId: SoulTemplateId) => {\n setSoulTemplate(templateId);\n if (templateId !== 'custom') {\n const tpl = SOUL_TEMPLATES.find((t) => t.id === templateId);\n if (tpl?.content) {\n setSoulCustomContent(tpl.content);\n setSoulEditorNonce((n) => n + 1);\n }\n }\n }, []);\n\n const handleSoulContentChange = useCallback((content: string) => {\n setSoulCustomContent(content);\n setSoulTemplate('custom');\n }, []);\n\n const locLabel = useCallback(\n (en: string, zh: string) => (language === 'zh' ? zh : en),\n [language],\n );\n\n const inputClass = agentsSettingsInputClass();\n\n if (!selected) {\n return <p className=\"text-sm text-fg-muted\">{a.selectAgentHint}</p>;\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto\">\n {/* ===== Section 1: Basic Identity ===== */}\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={Sparkles}\n title={a.personaSectionIdentity}\n subtitle={a.personaSectionIdentityHint}\n iconLeading={\n <AgentAvatarDisplay\n agentId={selected.id}\n avatar={identity.avatar}\n size={36}\n className=\"size-9 rounded-lg\"\n />\n }\n iconInteractive={{\n onClick: () => setAvatarDialogOpen(true),\n ariaLabel: a.avatarOpenSettingsAria,\n id: 'agent-avatar-settings',\n }}\n trailing={\n !selected.isDefault ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"text-xs\"\n disabled={busy}\n onClick={() => void onSetDefault()}\n >\n {a.setDefault}\n </Button>\n ) : null\n }\n />\n\n <Dialog.Root open={avatarDialogOpen} onOpenChange={setAvatarDialogOpen}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('fixed inset-0 bg-scrim backdrop-blur-[2px]', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'fixed left-1/2 top-1/2 w-[min(calc(100vw-2rem),26rem)] max-h-[min(90dvh,36rem)] -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n SETTINGS_SHELL_CONTENT_Z,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{a.avatarPickerTitle}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n aria-label={a.closeDialogAria}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n <Dialog.Description className=\"sr-only\">{a.avatarRowHint}</Dialog.Description>\n <AgentAvatarPicker\n agentId={selected.id}\n value={identity.avatar}\n onChange={(next) => updateIdentity({ avatar: next })}\n a={a}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {/* Name — single unified field */}\n <label className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.displayName}</span>\n <input\n className={inputClass}\n value={editName}\n onChange={(e) => {\n setEditName(e.target.value);\n updateIdentity({ name: e.target.value });\n }}\n placeholder={a.personaNamePlaceholder}\n autoComplete=\"off\"\n />\n </label>\n\n {/* Emoji */}\n <label className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaEmoji}</span>\n <input\n className={inputClass}\n value={identity.emoji}\n onChange={(e) => updateIdentity({ emoji: e.target.value })}\n placeholder={a.personaEmojiPlaceholder}\n autoComplete=\"off\"\n />\n </label>\n\n {/* Description */}\n <label className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.agentDescription}</span>\n <textarea\n className={cn(inputClass, 'min-h-16 resize-y text-sm leading-relaxed')}\n value={editDescription}\n onChange={(e) => setEditDescription(e.target.value)}\n placeholder={a.agentDescriptionPlaceholder}\n maxLength={4000}\n rows={3}\n spellCheck\n />\n </label>\n\n {/* Creature type — dropdown */}\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaCreature}</span>\n <select\n className={inputClass}\n value={CREATURE_PRESETS.some((p) => p.value === identity.creature) ? identity.creature : '__custom__'}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n updateIdentity({ creature: '' });\n return;\n }\n updateIdentity({ creature: e.target.value });\n }}\n >\n {CREATURE_PRESETS.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {locLabel(preset.labelEn, preset.labelZh)}\n </option>\n ))}\n <option value=\"__custom__\">{locLabel('Custom…', '自定义…')}</option>\n </select>\n {!CREATURE_PRESETS.some((p) => p.value === identity.creature) ? (\n <input\n className={cn(inputClass, 'mt-1 text-xs')}\n value={identity.creature}\n onChange={(e) => updateIdentity({ creature: e.target.value })}\n placeholder={a.personaCreaturePlaceholder}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n </div>\n </SettingsFormSection>\n\n {/* ===== Section 2: Runtime Configuration ===== */}\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Cog} title={a.editAgent} subtitle={a.editAgentHint} />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.modelPrimary}</span>\n <div className=\"flex flex-wrap items-stretch gap-2\">\n <ModelSelector\n className=\"min-w-0 flex-1\"\n popoverContentClassName={SETTINGS_SHELL_POPOVER_Z}\n value={editModel}\n disabled={busy}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(id) => setEditModel(id)}\n />\n {editModel.trim() ? (\n <Button type=\"button\" variant=\"secondary\" className=\"shrink-0\" disabled={busy} onClick={() => setEditModel('')}>\n {a.modelClear}\n </Button>\n ) : null}\n </div>\n </div>\n <label className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.workspacePath}</span>\n <input\n className={cn(inputClass, 'font-mono text-xs')}\n value={editWorkspace}\n onChange={(e) => setEditWorkspace(e.target.value)}\n />\n </label>\n </div>\n {!hideInlineSave ? (\n <div className=\"mt-4\">\n <Button type=\"button\" disabled={busy} onClick={() => void onSaveAgentEdits()}>\n {a.save}\n </Button>\n </div>\n ) : null}\n </SettingsFormSection>\n\n {/* ===== Section 3: Personality & Style ===== */}\n {bootstrapLoading ? (\n <p className=\"text-sm text-fg-muted\">{a.loading}</p>\n ) : (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={User} title={a.personaSectionSoul} subtitle={a.personaSectionSoulHint} />\n {/* Soul template */}\n <div className=\"mb-4 flex flex-col gap-2\">\n <span className=\"text-sm font-medium text-fg\">{a.personaSoulTemplate}</span>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n {SOUL_TEMPLATES.map((template) => (\n <button\n key={template.id}\n type=\"button\"\n className={cn(\n 'flex flex-col items-center gap-1.5 rounded-xl border-2 px-3 py-3 text-center transition-all',\n soulTemplate === template.id\n ? 'border-accent bg-accent-soft/40 shadow-sm'\n : 'border-edge hover:border-accent/40 hover:bg-surface-hover',\n )}\n onClick={() => handleSoulTemplateChange(template.id)}\n >\n <span className=\"text-xl\">{template.emoji}</span>\n <span className=\"text-xs font-medium text-fg\">{locLabel(template.labelEn, template.labelZh)}</span>\n </button>\n ))}\n </div>\n </div>\n {soulTemplate === 'custom' ? (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium text-fg\">{a.personaSoulCustomEdit}</span>\n <button\n type=\"button\"\n className=\"inline-flex size-9 shrink-0 items-center justify-center rounded-md text-fg-muted transition-colors hover:bg-surface-hover hover:text-fg\"\n title={soulPreviewMode ? a.personaSoulEdit : a.personaSoulPreview}\n aria-label={soulPreviewMode ? a.personaSoulEdit : a.personaSoulPreview}\n onClick={() => setSoulPreviewMode((v) => !v)}\n >\n {soulPreviewMode ? <Pencil className=\"size-4\" aria-hidden /> : <Eye className=\"size-4\" aria-hidden />}\n </button>\n </div>\n <div className={cn(inputClass, 'flex min-h-64 flex-col overflow-hidden p-0')}>\n {soulPreviewMode ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4 py-3\">\n <MarkdownView content={soulCustomContent} />\n </div>\n ) : (\n <MarkdownEditor\n key={`soul-${soulEditorNonce}`}\n initialContent={soulCustomContent}\n onChange={handleSoulContentChange}\n isDark={isDark}\n className=\"min-h-0 flex-1\"\n />\n )}\n </div>\n </div>\n ) : null}\n </SettingsFormSection>\n )}\n\n {/* ===== Section 4: Danger Zone ===== */}\n {selected.id !== 'main' ? (\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={AlertTriangle}\n title={locLabel('Danger Zone', '危险操作')}\n subtitle={locLabel(\n 'Actions that cannot be undone. Be careful.',\n '以下操作不可撤销,请谨慎操作。',\n )}\n />\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onDelete(false)}>\n <Trash2 className=\"mr-1 size-4\" aria-hidden />\n {a.removeFromConfig}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"border-red-200 text-red-700 hover:bg-red-50 dark:border-red-900/60 dark:text-red-300 dark:hover:bg-red-950/40\"\n disabled={busy}\n onClick={() => void onDelete(true)}\n >\n {a.purgeDisk}\n </Button>\n </div>\n </SettingsFormSection>\n ) : null}\n </div>\n );\n}\n","import { Info, UserCircle } from 'lucide-react';\nimport { type MutableRefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n SettingsFormSection,\n SettingsFormSectionHeader,\n} from '@/features/settings/settings-form-section';\nimport {\n fetchAgentBootstrapFileContent,\n saveAgentBootstrapFileContent,\n} from '@/features/settings/agents-admin-api';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { agentsSettingsInputClass } from '../utils';\nimport {\n type UserFields,\n parseUserMarkdown,\n serializeUserMarkdown,\n TIMEZONE_OPTIONS,\n PRONOUNS_PRESETS,\n detectBrowserTimezone,\n} from '../bootstrap-parser';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface ProfileTabProps {\n a: AgentsSettingsMessages;\n agentId: string;\n /** Parent writes a save callback into this ref so the modal footer can trigger it. */\n saveRef?: MutableRefObject<(() => Promise<void>) | null>;\n /** Called when dirty state changes. */\n onDirtyChange?: (dirty: boolean) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component — About You (USER.md)\n// ---------------------------------------------------------------------------\n\nexport function AgentProfileTab({ a, agentId, saveRef, onDirtyChange }: ProfileTabProps) {\n const language = useLocaleStore((s) => s.language);\n\n const [loading, setLoading] = useState(true);\n const [, setSaving] = useState(false);\n\n const [user, setUser] = useState<UserFields>({\n callName: '',\n pronouns: '',\n timezone: '',\n notes: '',\n });\n\n const [showCustomPronouns, setShowCustomPronouns] = useState(false);\n const [showCustomTimezone, setShowCustomTimezone] = useState(false);\n const [customTimezone, setCustomTimezone] = useState('');\n\n const initialLoadDoneRef = useRef(false);\n const agentIdRef = useRef(agentId);\n agentIdRef.current = agentId;\n\n // Snapshot for dirty tracking (set after load, reset after save)\n const userSnapshotRef = useRef('');\n\n // ---- Save helper (manual save only, triggered by footer button) ----\n const saveFile = useCallback(async (content: string) => {\n const currentAgent = agentIdRef.current;\n setSaving(true);\n try {\n await saveAgentBootstrapFileContent(currentAgent, 'USER.md', content);\n } finally {\n setSaving(false);\n }\n }, []);\n\n // Ref to hold latest user state for the save callback\n const userRef = useRef(user);\n userRef.current = user;\n\n // Expose save function to parent for the footer save button\n useEffect(() => {\n if (!saveRef) return;\n saveRef.current = async () => {\n await saveFile(serializeUserMarkdown(userRef.current));\n userSnapshotRef.current = JSON.stringify(userRef.current);\n // Manually notify parent since state didn't change (only snapshot did)\n onDirtyChange?.(false);\n };\n return () => {\n saveRef.current = null;\n };\n }, [saveRef, saveFile, onDirtyChange]);\n\n // Notify parent when dirty state changes\n useEffect(() => {\n if (!onDirtyChange) return;\n onDirtyChange(JSON.stringify(user) !== userSnapshotRef.current);\n }, [user, onDirtyChange]);\n\n // ---- Load USER.md on mount / agentId change ----\n useEffect(() => {\n let cancelled = false;\n initialLoadDoneRef.current = false;\n setLoading(true);\n\n const load = async () => {\n try {\n const userMd = await fetchAgentBootstrapFileContent(agentId, 'USER.md').catch(() => '');\n if (cancelled) return;\n\n const parsedUser = parseUserMarkdown(userMd);\n\n // Auto-detect timezone if not already set (saved when user clicks \"Save\")\n let effectiveUser = parsedUser;\n if (!parsedUser.timezone) {\n const detected = detectBrowserTimezone();\n if (detected) {\n effectiveUser = { ...parsedUser, timezone: detected };\n }\n }\n\n setUser(effectiveUser);\n userSnapshotRef.current = JSON.stringify(effectiveUser);\n\n // Custom pronouns handling\n const isKnownPronouns = !effectiveUser.pronouns || PRONOUNS_PRESETS.some((p) => p.value === effectiveUser.pronouns);\n if (effectiveUser.pronouns && !isKnownPronouns) {\n setShowCustomPronouns(true);\n }\n\n // Custom timezone handling\n const isKnownTimezone = TIMEZONE_OPTIONS.some((tz) => tz.value === effectiveUser.timezone);\n if (effectiveUser.timezone && !isKnownTimezone) {\n setShowCustomTimezone(true);\n setCustomTimezone(effectiveUser.timezone);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n initialLoadDoneRef.current = true;\n }\n }\n };\n\n void load();\n return () => {\n cancelled = true;\n };\n }, [agentId]);\n\n // ---- Field updater (local state only, saved via footer button) ----\n const updateUser = useCallback((patch: Partial<UserFields>) => {\n setUser((prev) => ({ ...prev, ...patch }));\n }, []);\n\n // ---- Timezone handling ----\n const handleTimezoneChange = useCallback(\n (value: string) => {\n if (value === '__custom__') {\n setShowCustomTimezone(true);\n return;\n }\n setShowCustomTimezone(false);\n setCustomTimezone('');\n updateUser({ timezone: value });\n },\n [updateUser],\n );\n\n const handleCustomTimezoneChange = useCallback(\n (value: string) => {\n setCustomTimezone(value);\n updateUser({ timezone: value });\n },\n [updateUser],\n );\n\n const handleDetectTimezone = useCallback(() => {\n const detected = detectBrowserTimezone();\n if (detected) {\n const isKnown = TIMEZONE_OPTIONS.some((tz) => tz.value === detected);\n if (isKnown) {\n setShowCustomTimezone(false);\n setCustomTimezone('');\n } else {\n setShowCustomTimezone(true);\n setCustomTimezone(detected);\n }\n updateUser({ timezone: detected });\n }\n }, [updateUser]);\n\n // ---- Effective timezone for select ----\n const timezoneSelectValue = (() => {\n if (showCustomTimezone) return '__custom__';\n const isKnown = TIMEZONE_OPTIONS.some((tz) => tz.value === user.timezone);\n return isKnown ? user.timezone : '__custom__';\n })();\n\n const locLabel = useCallback(\n (en: string, zh: string) => (language === 'zh' ? zh : en),\n [language],\n );\n\n if (loading) {\n return <p className=\"text-sm text-fg-muted\">{a.loading}</p>;\n }\n\n const inputClass = agentsSettingsInputClass();\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto\">\n <p className=\"text-sm text-fg-muted\">{a.personaSectionUserHint}</p>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={UserCircle}\n title={a.personaSectionUser}\n subtitle={a.personaSectionUserHint}\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {/* Call name */}\n <label className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaCallName}</span>\n <input\n className={inputClass}\n value={user.callName}\n onChange={(e) => updateUser({ callName: e.target.value })}\n placeholder={a.personaCallNamePlaceholder}\n autoComplete=\"off\"\n />\n </label>\n\n {/* Pronouns */}\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <span className=\"font-medium text-fg\">{a.personaPronouns}</span>\n <select\n className={inputClass}\n value={PRONOUNS_PRESETS.some((p) => p.value === user.pronouns) ? user.pronouns : '__custom__'}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setShowCustomPronouns(true);\n return;\n }\n setShowCustomPronouns(false);\n updateUser({ pronouns: e.target.value });\n }}\n >\n <option value=\"\" disabled>\n {a.personaPronounsPlaceholder}\n </option>\n {PRONOUNS_PRESETS.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {locLabel(preset.labelEn, preset.labelZh)}\n </option>\n ))}\n <option value=\"__custom__\">{locLabel('Custom…', '自定义…')}</option>\n </select>\n {showCustomPronouns ? (\n <input\n className={cn(inputClass, 'mt-1 text-xs')}\n value={PRONOUNS_PRESETS.some((p) => p.value === user.pronouns) ? '' : user.pronouns}\n onChange={(e) => updateUser({ pronouns: e.target.value })}\n placeholder={a.personaPronounsPlaceholder}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n\n {/* Timezone */}\n <div className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.personaTimezone}</span>\n <div className=\"flex flex-wrap items-stretch gap-2\">\n <select\n className={cn(inputClass, 'min-w-0 flex-1')}\n value={timezoneSelectValue}\n onChange={(e) => handleTimezoneChange(e.target.value)}\n >\n {TIMEZONE_OPTIONS.map((tz) => (\n <option key={tz.value} value={tz.value}>\n {locLabel(tz.labelEn, tz.labelZh)}\n </option>\n ))}\n <option value=\"__custom__\">{a.personaTimezoneCustom}</option>\n </select>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg border border-edge bg-surface-panel px-3 py-2 text-xs font-medium text-fg-muted hover:bg-surface-hover hover:text-fg\"\n onClick={handleDetectTimezone}\n >\n {a.personaTimezoneDetect}\n </button>\n </div>\n {showCustomTimezone ? (\n <input\n className={cn(inputClass, 'mt-1 font-mono text-xs')}\n value={customTimezone}\n onChange={(e) => handleCustomTimezoneChange(e.target.value)}\n placeholder=\"e.g. Asia/Shanghai\"\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n\n {/* Notes */}\n <label className=\"flex flex-col gap-1.5 text-sm sm:col-span-2\">\n <span className=\"font-medium text-fg\">{a.personaNotes}</span>\n <textarea\n className={cn(inputClass, 'min-h-16 resize-y text-sm leading-relaxed')}\n value={user.notes}\n onChange={(e) => updateUser({ notes: e.target.value })}\n placeholder={a.personaNotesPlaceholder}\n rows={3}\n spellCheck\n />\n </label>\n </div>\n\n {/* Memory note */}\n <div className=\"mt-3 flex items-start gap-2 rounded-lg bg-accent-soft/30 px-3 py-2.5 text-xs text-fg-muted\">\n <Info className=\"mt-0.5 size-3.5 shrink-0 text-accent\" aria-hidden />\n <span>{a.personaMemoryNote}</span>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { BookOpen } from 'lucide-react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayAgentRow, SkillCatalogRow } from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\nimport { pathForTab } from '@/navigation';\n\nexport function AgentSkillsTab(props: {\n a: AgentsSettingsMessages;\n selected: GatewayAgentRow;\n busy: boolean;\n skillsCatalogLoading: boolean;\n catalogForPick: SkillCatalogRow[];\n skillsInherit: boolean;\n setSkillsInherit: (v: boolean) => void;\n skillsPick: Set<string>;\n setSkillsPick: Dispatch<SetStateAction<Set<string>>>;\n onSaveSkills: () => void;\n hideInlineSave?: boolean;\n}) {\n const {\n a,\n selected,\n busy,\n skillsCatalogLoading,\n catalogForPick,\n skillsInherit,\n setSkillsInherit,\n skillsPick,\n setSkillsPick,\n onSaveSkills,\n hideInlineSave,\n } = props;\n\n /** When inheriting defaults, checkboxes reflect the effective allowlist (undefined = all catalog skills). */\n function isCheckedInheritMode(id: string): boolean {\n const eff = selected.skills.effectiveAllowlist;\n if (eff === undefined) {\n return true;\n }\n if (eff.length === 0) {\n return false;\n }\n return eff.includes(id);\n }\n\n function initialPickForCustomize(): Set<string> {\n const eff = selected.skills.effectiveAllowlist;\n if (eff !== undefined) {\n return new Set(eff);\n }\n return new Set(catalogForPick.map((s) => s.name || s.directoryId));\n }\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={BookOpen}\n title={a.skillsTitle}\n subtitle={a.skillsHint}\n />\n <div className=\"flex shrink-0 flex-wrap items-center justify-between gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => setSkillsInherit(true)}>\n {a.skillsInherit}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={busy}\n onClick={() => {\n setSkillsInherit(false);\n setSkillsPick(initialPickForCustomize());\n }}\n >\n {a.skillsCustomize}\n </Button>\n </div>\n <Link\n to={pathForTab('skills')}\n className=\"shrink-0 text-xs font-medium text-accent-fg hover:underline\"\n >\n {a.skillsLibraryLink}\n </Link>\n </div>\n <p className=\"mt-2 shrink-0 text-xs text-fg-muted\">\n {a.skillsDefaultsLabel} {selected.skills.defaults.length ? selected.skills.defaults.join(', ') : '—'}\n </p>\n <p className=\"shrink-0 text-xs text-fg-muted\">\n {a.skillsEffectiveLabel}{' '}\n {selected.skills.effectiveAllowlist?.length\n ? selected.skills.effectiveAllowlist.join(', ')\n : a.skillsAllFromCatalog}\n </p>\n {skillsCatalogLoading ? (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.skillsCatalogLoading}</p>\n ) : catalogForPick.length === 0 ? (\n <p className=\"shrink-0 text-sm text-fg-muted\">{a.skillsEmptyCatalog}</p>\n ) : (\n <div\n className={cn(\n 'mt-3 min-h-0 flex-1 overflow-y-auto overscroll-contain pr-0.5',\n skillsInherit && 'opacity-50',\n )}\n >\n <ul className=\"flex flex-col gap-2.5 text-sm\" role=\"list\">\n {catalogForPick.map((s) => {\n const id = s.name || s.directoryId;\n const on = skillsInherit ? isCheckedInheritMode(id) : skillsPick.has(id);\n const desc = typeof s.description === 'string' ? s.description.trim() : '';\n const descLine = desc || a.skillsNoDescription;\n return (\n <li\n key={id}\n className=\"h-16 shrink-0 overflow-hidden rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 dark:border-edge-subtle\"\n >\n <label className=\"flex h-full cursor-pointer items-center gap-3 text-sm\">\n <input\n type=\"checkbox\"\n className=\"shrink-0 rounded border-edge\"\n checked={on}\n disabled={skillsInherit || busy}\n onChange={() => {\n setSkillsPick((prev) => {\n const next = new Set(prev);\n if (on) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n <div className=\"truncate font-mono text-xs font-medium text-fg\" title={id}>\n {id}\n </div>\n <p\n className={cn(\n 'mt-0.5 truncate text-xs leading-tight text-fg-muted',\n !desc && 'italic text-fg-subtle',\n )}\n title={descLine}\n >\n {descLine}\n </p>\n </div>\n </label>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n {!hideInlineSave ? (\n <div className=\"mt-4 shrink-0\">\n <Button type=\"button\" disabled={busy} onClick={() => void onSaveSkills()}>\n {a.skillsSave}\n </Button>\n </div>\n ) : null}\n </SettingsFormSection>\n );\n}\n","/**\n * UI grouping for gateway built-in tool ids (`GATEWAY_BUILTIN_TOOL_IDS`).\n * Any id returned by the gateway but not listed here appears under `misc`.\n */\nexport const BUILTIN_TOOL_UI_GROUPS = [\n {\n key: 'workspace',\n toolIds: ['read_file', 'write_file', 'edit_file', 'list_dir', 'grep', 'find'] as const,\n },\n { key: 'execution', toolIds: ['shell'] as const },\n { key: 'web', toolIds: ['web_search', 'web_fetch'] as const },\n { key: 'messaging', toolIds: ['send_message', 'send_media'] as const },\n {\n key: 'memory',\n toolIds: ['memory_search', 'memory_get', 'curated_memory', 'session_search'] as const,\n },\n { key: 'media', toolIds: ['image', 'image_generate'] as const },\n { key: 'extensions', toolIds: ['extensions'] as const },\n] as const;\n\nexport type BuiltinToolUiGroupKey = (typeof BUILTIN_TOOL_UI_GROUPS)[number]['key'] | 'misc' | 'unknown';\n\nconst ASSIGNED = new Set<string>(\n BUILTIN_TOOL_UI_GROUPS.flatMap((g) => [...g.toolIds].map((id) => String(id))),\n);\n\nexport function miscBuiltinToolIds(builtinToolIds: string[]): string[] {\n return builtinToolIds\n .filter((id) => id && !ASSIGNED.has(id))\n .sort((x, y) => x.localeCompare(y));\n}\n","import { nativeSelectMaxWidthClass, selectControlBaseClass, settingsInputFocusClass } from '@/lib/form-field-width';\nimport { cn } from '@/lib/cn';\n\nexport function inputClassName(): string {\n return cn(\n 'w-full rounded-lg border border-edge bg-surface-panel px-3 py-2 text-sm text-fg',\n 'placeholder:text-fg-subtle',\n settingsInputFocusClass,\n 'dark:border-edge',\n );\n}\n\nexport function selectClassName(): string {\n return cn(selectControlBaseClass, nativeSelectMaxWidthClass);\n}\n\n/** Compact secondary actions (e.g. agent defaults: skills allowlist mode, tools disable presets). */\nexport const agentDefaultsQuickActionButtonClass =\n 'h-auto shrink-0 px-2.5 py-1.5 text-xs font-medium';\n","import { useCallback, useMemo } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\n\nimport { BUILTIN_TOOL_UI_GROUPS, miscBuiltinToolIds, type BuiltinToolUiGroupKey } from './builtin-tool-disable-groups';\nimport { agentDefaultsQuickActionButtonClass } from './defaults-field-styles';\n\n/** Preset ids are filtered against the live built-in list from the gateway. */\nconst PRESET_READ_ONLY_WORKSPACE = ['write_file', 'edit_file', 'shell'] as const;\nconst PRESET_HIGH_RISK = ['shell', 'image_generate', 'extensions'] as const;\nconst PRESET_NO_OUTBOUND = ['send_message', 'send_media'] as const;\n\nfunction sortedDisableList(ids: Set<string>): string[] {\n return [...ids].map((s) => s.trim()).filter(Boolean).sort((x, y) => x.localeCompare(y));\n}\n\nexport type BuiltinToolsDisableUiMode = 'defaults' | 'agentEntry';\n\nexport type BuiltinToolsDisableUiLabels = {\n loadingBuiltin: string;\n emptyBuiltin: string;\n quickActionsLabel: string;\n quickEnableAll: string;\n quickDisableAll: string;\n quickReadOnlyWorkspace: string;\n quickHighRiskOff: string;\n quickNoOutbound: string;\n notInBuiltin: string;\n lockedByDefaults: string;\n};\n\nexport type BuiltinToolsDisableUiProps = {\n mode: BuiltinToolsDisableUiMode;\n builtinToolIds: string[];\n loading: boolean;\n /** Disabled tool ids for this config scope (defaults or agents.list entry). */\n disableSet: Set<string>;\n onDisableSetChange: (next: Set<string>) => void;\n /** For `agentEntry`: tools disabled in `agents.defaults` — cannot be enabled from the entry editor. */\n defaultsDisableSet?: Set<string>;\n /** Extra disable ids not in `builtinToolIds` (defaults editor only). */\n unknownDisabledIds?: string[];\n getToolDescription: (toolId: string) => string;\n getGroupTitle: (groupKey: BuiltinToolUiGroupKey) => string;\n labels: BuiltinToolsDisableUiLabels;\n quickActionsDisabled?: boolean;\n};\n\nexport function BuiltinToolsDisableUi(props: BuiltinToolsDisableUiProps) {\n const {\n mode,\n builtinToolIds,\n loading,\n disableSet,\n onDisableSetChange,\n defaultsDisableSet,\n unknownDisabledIds = [],\n getToolDescription,\n getGroupTitle,\n labels,\n quickActionsDisabled = false,\n } = props;\n\n const allowedBuiltin = useMemo(() => new Set(builtinToolIds), [builtinToolIds]);\n const defaultsLock = defaultsDisableSet ?? new Set<string>();\n\n const setToolEnabled = useCallback(\n (tid: string, enabled: boolean) => {\n if (mode === 'agentEntry' && enabled && defaultsLock.has(tid)) {\n return;\n }\n const next = new Set(disableSet);\n if (enabled) {\n next.delete(tid);\n } else {\n next.add(tid);\n }\n onDisableSetChange(next);\n },\n [defaultsLock, disableSet, mode, onDisableSetChange],\n );\n\n const applyDisableExactly = useCallback(\n (ids: readonly string[]) => {\n const next = new Set<string>();\n for (const id of ids) {\n if (allowedBuiltin.has(id)) {\n next.add(id);\n }\n }\n onDisableSetChange(next);\n },\n [allowedBuiltin, onDisableSetChange],\n );\n\n const enableAllTools = useCallback(() => {\n onDisableSetChange(new Set());\n }, [onDisableSetChange]);\n\n const disableAllListed = useCallback(() => {\n const next = new Set<string>([...builtinToolIds, ...unknownDisabledIds]);\n onDisableSetChange(next);\n }, [builtinToolIds, unknownDisabledIds, onDisableSetChange]);\n\n const groupsContent = useMemo(() => {\n const misc = miscBuiltinToolIds(builtinToolIds);\n const sections: { key: BuiltinToolUiGroupKey; ids: string[] }[] = [];\n if (mode === 'defaults' && unknownDisabledIds.length > 0) {\n sections.push({ key: 'unknown', ids: [...unknownDisabledIds].sort((x, y) => x.localeCompare(y)) });\n }\n for (const g of BUILTIN_TOOL_UI_GROUPS) {\n const ids = g.toolIds.filter((id) => allowedBuiltin.has(id));\n if (ids.length > 0) {\n sections.push({ key: g.key, ids: [...ids] });\n }\n }\n if (misc.length > 0) {\n sections.push({ key: 'misc', ids: misc });\n }\n return sections;\n }, [allowedBuiltin, builtinToolIds, mode, unknownDisabledIds]);\n\n const hasRows = groupsContent.some((s) => s.ids.length > 0);\n const qaBusy = quickActionsDisabled || loading;\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"text-xs font-medium text-fg-muted\">{labels.quickActionsLabel}</p>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || (builtinToolIds.length === 0 && unknownDisabledIds.length === 0)}\n onClick={enableAllTools}\n >\n {labels.quickEnableAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || (builtinToolIds.length === 0 && unknownDisabledIds.length === 0)}\n onClick={disableAllListed}\n >\n {labels.quickDisableAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || builtinToolIds.length === 0}\n onClick={() => applyDisableExactly(PRESET_READ_ONLY_WORKSPACE)}\n >\n {labels.quickReadOnlyWorkspace}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || builtinToolIds.length === 0}\n onClick={() => applyDisableExactly(PRESET_HIGH_RISK)}\n >\n {labels.quickHighRiskOff}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={qaBusy || builtinToolIds.length === 0}\n onClick={() => applyDisableExactly(PRESET_NO_OUTBOUND)}\n >\n {labels.quickNoOutbound}\n </Button>\n </div>\n </div>\n {loading ? (\n <p className=\"text-sm text-fg-muted\">{labels.loadingBuiltin}</p>\n ) : !hasRows ? (\n <p className=\"text-sm text-fg-muted\">{labels.emptyBuiltin}</p>\n ) : (\n <div className=\"max-h-[min(50vh,22rem)] overflow-y-auto overscroll-contain pr-0.5\">\n <div className=\"flex flex-col gap-5 pr-1\">\n {groupsContent.map(({ key: groupKey, ids }) => (\n <div key={groupKey}>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\">\n {getGroupTitle(groupKey)}\n </h4>\n <ul className=\"flex flex-col gap-2.5\" role=\"list\">\n {ids.map((tid) => {\n const unknown = mode === 'defaults' && groupKey === 'unknown';\n const lockedByDefault = mode === 'agentEntry' && defaultsLock.has(tid);\n const disabledByScope = disableSet.has(tid);\n const checked = lockedByDefault ? false : !disabledByScope;\n const desc = getToolDescription(tid);\n return (\n <li\n key={tid}\n className={cn(\n 'rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 py-2.5 dark:border-edge-subtle',\n unknown && 'border-dashed',\n lockedByDefault && 'opacity-60',\n )}\n >\n <label\n className={cn(\n 'flex gap-3 text-sm',\n lockedByDefault ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n >\n <input\n type=\"checkbox\"\n className=\"mt-1 shrink-0 rounded border-edge\"\n checked={checked}\n disabled={lockedByDefault || qaBusy}\n onChange={() => setToolEnabled(tid, !checked)}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5\">\n <span className=\"font-mono text-xs font-medium text-fg\">{tid}</span>\n {unknown ? (\n <span className=\"text-xs text-fg-muted\">({labels.notInBuiltin})</span>\n ) : null}\n {lockedByDefault ? (\n <span className=\"text-xs text-fg-muted\">({labels.lockedByDefaults})</span>\n ) : null}\n </div>\n {desc ? (\n <p className=\"mt-1 text-xs leading-relaxed text-fg-muted\">{desc}</p>\n ) : null}\n </div>\n </label>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport { sortedDisableList };\n","import { Wrench } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport type { BuiltinToolUiGroupKey } from '@/features/settings/agents/builtin-tool-disable-groups';\nimport { BuiltinToolsDisableUi } from '@/features/settings/agents/builtin-tools-disable-ui';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { messages, type AgentsSettingsMessages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function AgentToolsTab(props: {\n a: AgentsSettingsMessages;\n data: { builtinToolIds: string[] };\n selected: GatewayAgentRow;\n busy: boolean;\n toolEntryDisable: Set<string>;\n setToolEntryDisable: Dispatch<SetStateAction<Set<string>>>;\n onSaveTools: () => void;\n onClearToolsEntry: () => void;\n hideInlineSave?: boolean;\n}) {\n const {\n a,\n data,\n selected,\n busy,\n toolEntryDisable,\n setToolEntryDisable,\n onSaveTools,\n onClearToolsEntry,\n hideInlineSave,\n } = props;\n\n const language = useLocaleStore((s) => s.language);\n const adv = messages(language).agentSettings.advanced;\n\n const defaultsDisableSet = useMemo(\n () => new Set(selected.tools.defaultsDisable.map((s) => String(s).trim()).filter(Boolean)),\n [selected.tools.defaultsDisable],\n );\n\n const onDisableSetChange = useCallback(\n (next: Set<string>) => {\n setToolEntryDisable(next);\n },\n [setToolEntryDisable],\n );\n\n const groups = a.toolsDisableGroups;\n const getGroupTitle = useCallback((key: BuiltinToolUiGroupKey) => groups[key], [groups]);\n\n const getToolDescription = useCallback(\n (tid: string) =>\n tid in a.toolDescriptions ? a.toolDescriptions[tid as keyof typeof a.toolDescriptions] : '',\n [a.toolDescriptions],\n );\n\n return (\n <SettingsFormSection className=\"flex min-h-0 flex-1 flex-col\">\n <SettingsFormSectionHeader\n className=\"shrink-0\"\n icon={Wrench}\n title={a.toolsTitle}\n subtitle={a.toolsHint}\n />\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n <BuiltinToolsDisableUi\n mode=\"agentEntry\"\n builtinToolIds={data.builtinToolIds}\n loading={false}\n disableSet={toolEntryDisable}\n onDisableSetChange={onDisableSetChange}\n defaultsDisableSet={defaultsDisableSet}\n getToolDescription={getToolDescription}\n getGroupTitle={getGroupTitle}\n quickActionsDisabled={busy}\n labels={{\n loadingBuiltin: adv.toolsDisableLoadingBuiltin,\n emptyBuiltin: adv.toolsDisableEmptyBuiltin,\n quickActionsLabel: adv.toolsDisableQuickActionsLabel,\n quickEnableAll: adv.toolsDisableQuickEnableAll,\n quickDisableAll: adv.toolsDisableQuickDisableAll,\n quickReadOnlyWorkspace: adv.toolsDisableQuickReadOnlyWorkspace,\n quickHighRiskOff: adv.toolsDisableQuickHighRiskOff,\n quickNoOutbound: adv.toolsDisableQuickNoOutbound,\n notInBuiltin: adv.toolsDisableNotInBuiltin,\n lockedByDefaults: a.toolsLockedByDefaults,\n }}\n />\n </div>\n <div className=\"mt-4 flex shrink-0 flex-wrap gap-2\">\n {!hideInlineSave ? (\n <Button type=\"button\" disabled={busy} onClick={() => void onSaveTools()}>\n {a.toolsSave}\n </Button>\n ) : null}\n <Button type=\"button\" variant=\"secondary\" disabled={busy} onClick={() => void onClearToolsEntry()}>\n {a.toolsClearEntry}\n </Button>\n </div>\n </SettingsFormSection>\n );\n}\n","import type { Dispatch, FormEvent, MutableRefObject, SetStateAction } from 'react';\n\nimport type { ChannelStatus, CronJob, SessionChatId } from '@/features/cron/cron-api';\nimport type {\n fetchAgentBootstrapFiles,\n GatewayAgentRow,\n GatewayAgentsPayload,\n GatewayConfigBinding,\n SkillCatalogRow,\n} from '@/features/settings/agents-admin-api';\nimport type { AgentsSettingsMessages, ChatMessages, MessageBundle } from '@/i18n/messages';\n\nimport { AgentChannelsTab } from './tabs/agent-channels-tab';\nimport { AgentCronTab } from './tabs/agent-cron-tab';\nimport { AgentFilesTab } from './tabs/agent-files-tab';\nimport { AgentOverviewTab } from './tabs/agent-overview-tab';\nimport { AgentProfileTab } from './tabs/agent-profile-tab';\nimport { AgentSkillsTab } from './tabs/agent-skills-tab';\nimport { AgentToolsTab } from './tabs/agent-tools-tab';\nimport type { AgentPanel } from './utils';\n\ntype CronMessages = MessageBundle['cron'];\n\nexport type AgentsEditorPanelContentProps = {\n a: AgentsSettingsMessages;\n chat: ChatMessages;\n cCron: CronMessages;\n selected: GatewayAgentRow | null;\n panel: AgentPanel;\n data: GatewayAgentsPayload | null;\n busy: boolean;\n editName: string;\n setEditName: (v: string) => void;\n editDescription: string;\n setEditDescription: (v: string) => void;\n editWorkspace: string;\n setEditWorkspace: (v: string) => void;\n editModel: string;\n setEditModel: (v: string) => void;\n onSetDefault: () => void;\n onSaveAgentEdits: () => void;\n onDelete: (purge: boolean) => void;\n overviewSaveBootstrapRef: MutableRefObject<(() => Promise<void>) | null>;\n profileSaveRef: MutableRefObject<(() => Promise<void>) | null>;\n setOverviewBootstrapDirty: (v: boolean) => void;\n setProfileDirty: (v: boolean) => void;\n filesLoading: boolean;\n files: Awaited<ReturnType<typeof fetchAgentBootstrapFiles>> | null;\n activeFile: string | null;\n setActiveFile: (v: string | null) => void;\n bootstrapViewMode: 'edit' | 'preview';\n setBootstrapViewMode: (v: 'edit' | 'preview') => void;\n fileDraft: string;\n setFileDraft: (v: string) => void;\n fileSaving: boolean;\n bootstrapFileLoading: boolean;\n bootstrapEditorNonce: number;\n toolEntryDisable: Set<string>;\n setToolEntryDisable: Dispatch<SetStateAction<Set<string>>>;\n onSaveTools: () => void;\n onClearToolsEntry: () => void;\n skillsCatalogLoading: boolean;\n catalogForPick: SkillCatalogRow[];\n skillsInherit: boolean;\n setSkillsInherit: (v: boolean) => void;\n skillsPick: Set<string>;\n setSkillsPick: Dispatch<SetStateAction<Set<string>>>;\n onSaveSkills: () => void;\n bindingsLoading: boolean;\n agentBindings: GatewayConfigBinding[];\n bindChannelStatuses: ChannelStatus[];\n bindChannelsLoading: boolean;\n useManualChannel: boolean;\n newBindChannel: string;\n setNewBindChannel: (v: string) => void;\n bindSessionChats: SessionChatId[];\n bindSessionsLoading: boolean;\n newBindSessionIdx: number | null;\n setNewBindSessionIdx: Dispatch<SetStateAction<number | null>>;\n newBindCustomPeer: string;\n setNewBindCustomPeer: (v: string) => void;\n refreshBindSessions: () => void;\n onRemoveBinding: (rule: GatewayConfigBinding) => void;\n onAddBinding: (e: FormEvent) => void;\n cronLoading: boolean;\n agentCronJobs: CronJob[];\n onSetCronJobAgent: (job: CronJob, agentKey: string) => void;\n};\n\nexport function AgentsEditorPanelContent({\n a,\n chat,\n cCron,\n selected,\n panel,\n data,\n busy,\n editName,\n setEditName,\n editDescription,\n setEditDescription,\n editWorkspace,\n setEditWorkspace,\n editModel,\n setEditModel,\n onSetDefault,\n onSaveAgentEdits,\n onDelete,\n overviewSaveBootstrapRef,\n profileSaveRef,\n setOverviewBootstrapDirty,\n setProfileDirty,\n filesLoading,\n files,\n activeFile,\n setActiveFile,\n bootstrapViewMode,\n setBootstrapViewMode,\n fileDraft,\n setFileDraft,\n fileSaving,\n bootstrapFileLoading,\n bootstrapEditorNonce,\n toolEntryDisable,\n setToolEntryDisable,\n onSaveTools,\n onClearToolsEntry,\n skillsCatalogLoading,\n catalogForPick,\n skillsInherit,\n setSkillsInherit,\n skillsPick,\n setSkillsPick,\n onSaveSkills,\n bindingsLoading,\n agentBindings,\n bindChannelStatuses,\n bindChannelsLoading,\n useManualChannel,\n newBindChannel,\n setNewBindChannel,\n bindSessionChats,\n bindSessionsLoading,\n newBindSessionIdx,\n setNewBindSessionIdx,\n newBindCustomPeer,\n setNewBindCustomPeer,\n refreshBindSessions,\n onRemoveBinding,\n onAddBinding,\n cronLoading,\n agentCronJobs,\n onSetCronJobAgent,\n}: AgentsEditorPanelContentProps) {\n if (!selected) {\n return <p className=\"text-sm text-fg-muted\">{a.selectAgentHint}</p>;\n }\n\n if (panel === 'overview') {\n return (\n <AgentOverviewTab\n a={a}\n chat={chat}\n selected={selected}\n busy={busy}\n editName={editName}\n setEditName={setEditName}\n editDescription={editDescription}\n setEditDescription={setEditDescription}\n editWorkspace={editWorkspace}\n setEditWorkspace={setEditWorkspace}\n editModel={editModel}\n setEditModel={setEditModel}\n onSetDefault={onSetDefault}\n onSaveAgentEdits={onSaveAgentEdits}\n onDelete={onDelete}\n hideInlineSave\n saveBootstrapRef={overviewSaveBootstrapRef}\n onBootstrapDirtyChange={setOverviewBootstrapDirty}\n />\n );\n }\n\n if (panel === 'profile') {\n return (\n <AgentProfileTab a={a} agentId={selected.id} saveRef={profileSaveRef} onDirtyChange={setProfileDirty} />\n );\n }\n\n if (panel === 'files') {\n return (\n <AgentFilesTab\n a={a}\n filesLoading={filesLoading}\n files={files}\n activeFile={activeFile}\n setActiveFile={setActiveFile}\n bootstrapViewMode={bootstrapViewMode}\n setBootstrapViewMode={setBootstrapViewMode}\n fileDraft={fileDraft}\n setFileDraft={setFileDraft}\n fileSaving={fileSaving}\n bootstrapFileLoading={bootstrapFileLoading}\n bootstrapEditorNonce={bootstrapEditorNonce}\n />\n );\n }\n\n if (panel === 'tools') {\n return (\n <AgentToolsTab\n a={a}\n data={data!}\n selected={selected}\n busy={busy}\n toolEntryDisable={toolEntryDisable}\n setToolEntryDisable={setToolEntryDisable}\n onSaveTools={onSaveTools}\n onClearToolsEntry={onClearToolsEntry}\n hideInlineSave\n />\n );\n }\n\n if (panel === 'skills') {\n return (\n <AgentSkillsTab\n a={a}\n selected={selected}\n busy={busy}\n skillsCatalogLoading={skillsCatalogLoading}\n catalogForPick={catalogForPick}\n skillsInherit={skillsInherit}\n setSkillsInherit={setSkillsInherit}\n skillsPick={skillsPick}\n setSkillsPick={setSkillsPick}\n onSaveSkills={onSaveSkills}\n hideInlineSave\n />\n );\n }\n\n if (panel === 'channels') {\n return (\n <AgentChannelsTab\n a={a}\n busy={busy}\n bindingsLoading={bindingsLoading}\n agentBindings={agentBindings}\n channelStatuses={bindChannelStatuses}\n channelsStatusLoading={bindChannelsLoading}\n useManualChannel={useManualChannel}\n newBindChannel={newBindChannel}\n setNewBindChannel={setNewBindChannel}\n bindSessionChats={bindSessionChats}\n sessionsLoading={bindSessionsLoading}\n newBindSessionIdx={newBindSessionIdx}\n setNewBindSessionIdx={setNewBindSessionIdx}\n newBindCustomPeer={newBindCustomPeer}\n setNewBindCustomPeer={setNewBindCustomPeer}\n onRefreshSessions={refreshBindSessions}\n lastActiveLabels={cCron.lastActiveLabels}\n selectRecipient={cCron.selectRecipient}\n onRemoveBinding={onRemoveBinding}\n onAddBinding={onAddBinding}\n />\n );\n }\n\n if (panel === 'cron' && data) {\n return (\n <AgentCronTab\n a={a}\n data={data}\n selected={selected}\n busy={busy}\n cronLoading={cronLoading}\n agentCronJobs={agentCronJobs}\n onSetCronJobAgent={onSetCronJobAgent}\n />\n );\n }\n\n return <p className=\"text-sm text-fg-muted\">{a.selectAgentHint}</p>;\n}\n","import { MessageSquarePlus, Plus } from 'lucide-react';\n\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\nimport { AgentAvatarDisplay } from '@/features/settings/agents/agent-avatar-display';\nimport {\n agentListDisplayDescription,\n agentListDisplayName,\n} from '@/features/settings/agents/agent-display-names';\nimport { cn } from '@/lib/cn';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nfunction filterAgents(agents: GatewayAgentRow[], query: string, a: AgentsSettingsMessages): GatewayAgentRow[] {\n const q = query.trim().toLowerCase();\n if (!q) {\n return agents;\n }\n return agents.filter((ag) => {\n const name = agentListDisplayName(ag, a).toLowerCase();\n const id = ag.id.toLowerCase();\n const ws = ag.workspace.toLowerCase();\n const desc = (ag.description ?? '').toLowerCase();\n const displayDesc = agentListDisplayDescription(ag, a).toLowerCase();\n return name.includes(q) || id.includes(q) || ws.includes(q) || desc.includes(q) || displayDesc.includes(q);\n });\n}\n\nfunction NewAgentCard(props: {\n a: AgentsSettingsMessages;\n busy: boolean;\n onNewAgent: () => void;\n}) {\n const { a, busy, onNewAgent } = props;\n return (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onNewAgent()}\n className={cn(\n 'flex h-full min-h-[7.5rem] w-full flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-edge-subtle bg-surface-panel/40 px-4 py-6 text-sm font-medium text-fg-muted transition-colors',\n 'hover:border-accent/50 hover:bg-surface-hover hover:text-fg',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <Plus className=\"size-8 shrink-0 opacity-80\" strokeWidth={1.75} aria-hidden />\n <span>{a.listNewAgentCard}</span>\n </button>\n );\n}\n\nexport function AgentsListGrid(props: {\n a: AgentsSettingsMessages;\n agents: GatewayAgentRow[];\n searchQuery: string;\n onOpenAgent: (id: string) => void;\n onChatWithAgent: (id: string) => void;\n onNewAgent: () => void;\n busy: boolean;\n}) {\n const { a, agents, searchQuery, onOpenAgent, onChatWithAgent, onNewAgent, busy } = props;\n const filtered = filterAgents(agents, searchQuery, a);\n const searchMiss = agents.length > 0 && filtered.length === 0 && searchQuery.trim().length > 0;\n\n if (agents.length === 0) {\n return (\n <div className=\"flex flex-col gap-4\">\n <p className=\"text-sm text-fg-muted\">{a.listNoAgentsYet}</p>\n <div className=\"max-w-sm\">\n <NewAgentCard a={a} busy={busy} onNewAgent={onNewAgent} />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n {searchMiss ? <p className=\"text-sm text-fg-muted\">{a.listEmpty}</p> : null}\n\n <ul\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n role=\"list\"\n >\n <li className=\"h-full min-h-0\">\n <NewAgentCard a={a} busy={busy} onNewAgent={onNewAgent} />\n </li>\n {filtered.map((ag) => {\n const title = agentListDisplayName(ag, a);\n const monoId = ag.id;\n const descTrim = agentListDisplayDescription(ag, a);\n return (\n <li key={ag.id} className=\"h-full min-h-0\">\n <div\n className={cn(\n 'flex h-full min-h-0 flex-col gap-3 rounded-xl border border-edge-subtle bg-surface-panel p-4 shadow-sm transition-colors',\n 'hover:border-edge',\n )}\n >\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onOpenAgent(ag.id)}\n className={cn(\n 'flex shrink-0 w-full flex-col gap-2 text-left transition-colors',\n 'rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <div className=\"flex items-start gap-3\">\n <div\n className=\"flex size-11 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-accent-soft ring-1 ring-edge-subtle/40\"\n aria-hidden\n >\n <AgentAvatarDisplay agentId={ag.id} avatar={ag.avatar} size={44} className=\"size-full\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5\">\n <span className=\"truncate font-semibold text-fg\">{title}</span>\n {ag.isDefault ? (\n <span className=\"shrink-0 rounded-md bg-surface-base px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-fg-muted\">\n {a.defaultBadge}\n </span>\n ) : null}\n </div>\n <p className=\"mt-0.5 truncate font-mono text-xs text-fg-muted\" title={monoId}>\n {monoId}\n </p>\n </div>\n </div>\n <p\n className={cn(\n 'line-clamp-1 min-h-[1.3125rem] text-xs leading-relaxed',\n descTrim ? 'text-fg' : 'text-fg-muted/25',\n )}\n title={descTrim || undefined}\n >\n {descTrim || '\\u00A0'}\n </p>\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onChatWithAgent(ag.id)}\n className={cn(\n 'flex w-full shrink-0 items-center justify-center gap-2 rounded-full px-4 py-2.5 text-sm font-semibold',\n 'bg-accent-soft text-accent-fg transition-colors',\n 'hover:bg-accent/15',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n >\n <MessageSquarePlus className=\"size-4 shrink-0\" strokeWidth={2} aria-hidden />\n {a.listChatWithAgent}\n </button>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","import type { AgentsSettingsMessages } from '@/i18n/messages';\n\nexport function AgentsSettingsHeader(props: { a: AgentsSettingsMessages }) {\n const { a } = props;\n\n return (\n <header className=\"flex flex-col gap-4\">\n <div className=\"min-w-0\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{a.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-fg-muted\">{a.subtitle}</p>\n </div>\n </header>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { UserPlus, X } from 'lucide-react';\nimport type { FormEvent } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport type { AgentsSettingsMessages, ChatMessages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport {\n SETTINGS_SHELL_CONTENT_Z,\n SETTINGS_SHELL_OVERLAY_Z,\n SETTINGS_SHELL_POPOVER_Z,\n} from '@/lib/settings-shell-dialog-layer';\n\nimport { agentsSettingsInputClass } from './utils';\n\nexport function CreateAgentDialog(props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n a: AgentsSettingsMessages;\n chat: ChatMessages;\n busy: boolean;\n modalError: string | null;\n createDisplayName: string;\n setCreateDisplayName: (v: string) => void;\n createAgentId: string;\n setCreateAgentId: (v: string) => void;\n createDescription: string;\n setCreateDescription: (v: string) => void;\n createWorkspace: string;\n setCreateWorkspace: (v: string) => void;\n createModel: string;\n setCreateModel: (v: string) => void;\n onCreate: (e: FormEvent) => void;\n onSuggestWorkspace: () => void;\n}) {\n const {\n open,\n onOpenChange,\n a,\n chat,\n busy,\n modalError,\n createDisplayName,\n setCreateDisplayName,\n createAgentId,\n setCreateAgentId,\n createDescription,\n setCreateDescription,\n createWorkspace,\n setCreateWorkspace,\n createModel,\n setCreateModel,\n onCreate,\n onSuggestWorkspace,\n } = props;\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn('xopc-dialog-overlay fixed inset-0 bg-scrim', SETTINGS_SHELL_OVERLAY_Z)}\n />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 max-h-[min(90vh,640px)] w-[min(100%-2rem,28rem)] -translate-x-1/2 -translate-y-1/2',\n SETTINGS_SHELL_CONTENT_Z,\n 'overflow-y-auto rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge',\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <div className=\"mb-3 flex items-start justify-between gap-2\">\n <div className=\"min-w-0 pr-2\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{a.addAgent}</Dialog.Title>\n <Dialog.Description className=\"mt-0.5 text-xs text-fg-muted\">{a.addAgentHint}</Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-lg p-1.5 text-fg-muted hover:bg-surface-base hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40\"\n aria-label={a.closeDialogAria}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n\n <form className=\"grid gap-3\" onSubmit={onCreate}>\n {modalError ? (\n <div\n role=\"alert\"\n className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200\"\n >\n {modalError}\n </div>\n ) : null}\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newAgentLabel}</span>\n <input\n className={agentsSettingsInputClass()}\n value={createDisplayName}\n onChange={(e) => setCreateDisplayName(e.target.value)}\n onBlur={() => onSuggestWorkspace()}\n required\n autoComplete=\"off\"\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newAgentIdOptional}</span>\n <input\n className={cn(agentsSettingsInputClass(), 'font-mono text-xs')}\n value={createAgentId}\n onChange={(e) => setCreateAgentId(e.target.value)}\n onBlur={() => onSuggestWorkspace()}\n placeholder={a.newAgentIdPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={64}\n pattern=\"[A-Za-z0-9][A-Za-z0-9_-]{0,63}\"\n title={a.newAgentIdRules}\n />\n <span className=\"text-xs text-fg-muted\">{a.newAgentIdRules}</span>\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.agentDescription}</span>\n <textarea\n className={cn(agentsSettingsInputClass(), 'min-h-[4.5rem] resize-y font-sans text-sm leading-relaxed')}\n value={createDescription}\n onChange={(e) => setCreateDescription(e.target.value)}\n placeholder={a.agentDescriptionPlaceholder}\n maxLength={4000}\n rows={3}\n spellCheck\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newWorkspace}</span>\n <input\n className={cn(agentsSettingsInputClass(), 'font-mono text-xs')}\n value={createWorkspace}\n onChange={(e) => setCreateWorkspace(e.target.value)}\n required\n autoComplete=\"off\"\n />\n </label>\n <div className=\"flex flex-col gap-1 text-sm\">\n <span className=\"text-fg-muted\">{a.newModelOptional}</span>\n <div className=\"flex flex-wrap items-stretch gap-2\">\n <ModelSelector\n className=\"min-w-0 flex-1\"\n popoverContentClassName={SETTINGS_SHELL_POPOVER_Z}\n value={createModel}\n disabled={busy}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(id) => setCreateModel(id)}\n />\n {createModel.trim() ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0\"\n disabled={busy}\n onClick={() => setCreateModel('')}\n >\n {a.modelClear}\n </Button>\n ) : null}\n </div>\n </div>\n <div className=\"mt-1 flex justify-end gap-2 border-t border-edge-subtle pt-3 dark:border-edge\">\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"secondary\" disabled={busy}>\n {a.createModalCancel}\n </Button>\n </Dialog.Close>\n <Button type=\"submit\" disabled={busy}>\n <UserPlus className=\"mr-1 size-4\" aria-hidden />\n {a.create}\n </Button>\n </div>\n </form>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","export interface PresetAgent {\n id: string;\n name: string;\n emoji: string;\n descriptionEn: string;\n descriptionZh: string;\n identityMd: string;\n soulMd: string;\n /** Per-agent tool disables (PATCH after create; merges with defaults). */\n toolsDisable?: string[];\n}\n\nexport const PRESET_AGENTS_SKIPPED_KEY = 'xopc-preset-agents-skipped';\n\nexport const PRESET_AGENTS: readonly PresetAgent[] = [\n {\n id: 'coder',\n name: 'Coder',\n emoji: '💻',\n descriptionEn: 'Software development assistant — precise, pragmatic, and code-focused.',\n descriptionZh: '软件开发助手 — 精确、务实、专注代码。',\n toolsDisable: ['image_generate'],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Coder\n- **Creature:** code architect\n- **Emoji:** 💻\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Understand before you act.** Read the codebase, understand the patterns, then write code that fits. Never guess at architecture.\n\n**Write code for humans.** Clean, readable code beats clever code every time. Name things well. Keep functions focused. Comment the why, not the what.\n\n**Explain your changes.** When you modify code, explain what changed and why. Diffs without context are useless.\n\n**Test what matters.** Don't skip edge cases. Don't assume it works because it compiled.\n\n**Be precise and efficient.** Value the developer's time. Give actionable answers. Show code, not theory.\n\n## Boundaries\n\n- Never commit untested code to production paths.\n- When in doubt about destructive operations (delete, overwrite), ask first.\n- Don't refactor code you weren't asked to touch.\n\n## Vibe\n\nPrecise, pragmatic, and competent. Like a senior engineer who reviews your PR — honest but constructive, direct but not dismissive.\n`,\n },\n {\n id: 'writer',\n name: 'Writer',\n emoji: '✍️',\n descriptionEn: 'Writing and content creation — eloquent, adaptive, and audience-aware.',\n descriptionZh: '写作与内容创作 — 文笔流畅、风格多变、关注读者。',\n toolsDisable: [\n 'shell',\n 'browser_navigate',\n 'browser_snapshot',\n 'browser_click',\n 'browser_type',\n 'browser_scroll',\n 'browser_screenshot',\n ],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Writer\n- **Creature:** wordsmith\n- **Emoji:** ✍️\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Know the audience first.** Before writing anything, understand who will read it and what they need. A technical spec and a blog post require completely different voices.\n\n**Match the user's style.** Adapt your tone, formality, and structure to match what the user is building. Don't impose your own voice unless asked.\n\n**Structure before prose.** Outline first, write second. Good structure makes good writing inevitable.\n\n**Cut the AI filler.** No \"In today's fast-paced world...\" or \"It's important to note that...\". Write like a human, not a language model.\n\n**Show, don't tell.** Use examples, analogies, and concrete details. Abstract advice is forgettable.\n\n## Boundaries\n\n- Don't fabricate quotes, statistics, or citations.\n- Flag when you're speculating vs. stating facts.\n- Respect the user's voice — you're the ghostwriter, not the author.\n\n## Vibe\n\nEloquent, adaptive, and invisible. Like the best editors — the writing looks effortless because someone worked hard to make it that way.\n`,\n },\n {\n id: 'researcher',\n name: 'Researcher',\n emoji: '🔍',\n descriptionEn: 'Deep research and analysis — thorough, source-driven, and critical.',\n descriptionZh: '深度研究与分析 — 详尽、引用来源、批判性思维。',\n toolsDisable: ['shell'],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Researcher\n- **Creature:** knowledge navigator\n- **Emoji:** 🔍\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Depth over breadth.** Shallow summaries are for search engines. Go deep. Follow the thread. Find the primary source.\n\n**Cross-reference everything.** One source isn't research — it's a data point. Corroborate claims across multiple sources before presenting them as facts.\n\n**Cite your sources.** Always note where information came from. If you can't cite it, flag it as inference or speculation.\n\n**Separate facts from opinions.** Be explicit about what is established fact, what is expert consensus, what is minority view, and what is your own synthesis.\n\n**Think critically.** Question assumptions, consider counterarguments, and flag limitations in your analysis. Intellectual honesty is non-negotiable.\n\n## Boundaries\n\n- Never present speculation as established fact.\n- Acknowledge knowledge cutoffs and information gaps.\n- When multiple valid interpretations exist, present them all.\n\n## Vibe\n\nThorough, curious, and intellectually honest. Like a good academic — rigorous but readable, opinionated but open to being wrong.\n`,\n },\n {\n id: 'data-analyst',\n name: 'Data Analyst',\n emoji: '📊',\n descriptionEn: 'Data analysis and visualization — analytical, clear, and reproducible.',\n descriptionZh: '数据分析与可视化 — 严谨分析、清晰表达、可复现。',\n toolsDisable: [\n 'browser_navigate',\n 'browser_snapshot',\n 'browser_click',\n 'browser_type',\n 'browser_scroll',\n 'browser_screenshot',\n ],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Data Analyst\n- **Creature:** data interpreter\n- **Emoji:** 📊\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Let the data speak.** Start with facts, not hypotheses. Explore the data before drawing conclusions.\n\n**Visualize first, explain second.** A good chart is worth a thousand rows. Choose the right visualization for the story the data tells.\n\n**Document your assumptions.** Every analysis has assumptions — make them explicit. State what you included, what you excluded, and why.\n\n**Reproducible or it didn't happen.** Write analysis code that someone else can run and get the same results. No magic numbers, no undocumented steps.\n\n**Be honest about limitations.** Small sample sizes, selection bias, missing data — flag them all. A confident wrong answer is worse than an uncertain right one.\n\n## Boundaries\n\n- Don't cherry-pick data to support a narrative.\n- Flag statistical significance (or lack thereof).\n- When data quality is questionable, say so before presenting results.\n\n## Vibe\n\nAnalytical, clear, and methodical. Like a good data scientist — lets the numbers lead, explains the story behind them, and knows when to say \"the data doesn't tell us that.\"\n`,\n },\n {\n id: 'creative',\n name: 'Creative',\n emoji: '🎨',\n descriptionEn: 'Creative design and visual work — bold, aesthetic, and multi-option.',\n descriptionZh: '创意设计与视觉 — 大胆、注重美感、多方案对比。',\n toolsDisable: ['shell'],\n identityMd: `# IDENTITY.md - Who Am I?\n\n- **Name:** Creative\n- **Creature:** design spirit\n- **Emoji:** 🎨\n- **Avatar:**\n`,\n soulMd: `# SOUL.md - Who You Are\n\n## Core Truths\n\n**Beauty is not optional.** Aesthetics matter. Every pixel, every color choice, every whitespace decision communicates something. Make it count.\n\n**Break the template.** The first idea is rarely the best. Push past the obvious. Explore unusual combinations, unexpected layouts, and fresh approaches.\n\n**Explain your design decisions.** Don't just show — tell why. \"I chose this color palette because...\" helps the user understand and iterate.\n\n**Offer multiple options.** Present 2–3 directions, not just one. Let the user choose. Creative work is subjective — give them agency.\n\n**Respect constraints.** Great design works within constraints — brand guidelines, accessibility, performance, screen sizes. Constraints aren't limitations; they're the puzzle.\n\n## Boundaries\n\n- Don't use copyrighted assets without flagging it.\n- Accessibility is non-negotiable — contrast, alt text, keyboard nav.\n- When unsure about brand or style direction, ask before committing.\n\n## Vibe\n\nBold, aesthetic, and thoughtful. Like a creative director who has opinions but listens — pushes for better while respecting what the client actually needs.\n`,\n },\n];\n","import { useEffect, useMemo, useState } from 'react';\nimport { SkipForward, Sparkles } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport {\n createGatewayAgent,\n saveAgentBootstrapFileContent,\n updateGatewayAgent,\n} from '@/features/settings/agents-admin-api';\nimport { messages } from '@/i18n/messages';\nimport { cn } from '@/lib/cn';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { PRESET_AGENTS, PRESET_AGENTS_SKIPPED_KEY, type PresetAgent } from './preset-agents';\n\nexport interface PresetAgentsSetupProps {\n existingAgentIds: Set<string>;\n onComplete: () => void;\n onSkip: () => void;\n}\n\nexport function PresetAgentsSetup({ existingAgentIds, onComplete, onSkip }: PresetAgentsSetupProps) {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentsSettings;\n\n const availablePresets = useMemo(\n () => PRESET_AGENTS.filter((p) => !existingAgentIds.has(p.id)),\n [existingAgentIds],\n );\n\n const [selected, setSelected] = useState<Set<string>>(() => new Set(PRESET_AGENTS.map((p) => p.id)));\n const [creating, setCreating] = useState(false);\n const [progress, setProgress] = useState<{ current: number; total: number } | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (availablePresets.length === 0) {\n onComplete();\n }\n }, [availablePresets, onComplete]);\n\n const toggleAgent = (id: string) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const handleCreate = async () => {\n const toCreate = availablePresets.filter((p) => selected.has(p.id));\n if (toCreate.length === 0) {\n onComplete();\n return;\n }\n\n setCreating(true);\n setError(null);\n setProgress({ current: 0, total: toCreate.length });\n\n for (let i = 0; i < toCreate.length; i++) {\n const preset = toCreate[i];\n setProgress({ current: i + 1, total: toCreate.length });\n try {\n await createGatewayAgent({\n name: preset.name,\n id: preset.id,\n workspace: `~/.xopc/workspace/${preset.id}`,\n description: language === 'zh' ? preset.descriptionZh : preset.descriptionEn,\n });\n\n await saveAgentBootstrapFileContent(preset.id, 'IDENTITY.md', preset.identityMd);\n await saveAgentBootstrapFileContent(preset.id, 'SOUL.md', preset.soulMd);\n\n const disables = preset.toolsDisable;\n if (disables && disables.length > 0) {\n await updateGatewayAgent(preset.id, { toolsDisable: disables });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.toLowerCase().includes('already exists')) {\n continue;\n }\n setError(a.presetCreateFailed.replace('{{name}}', preset.name).replace('{{message}}', message));\n setCreating(false);\n return;\n }\n }\n\n setCreating(false);\n onComplete();\n };\n\n const handleSkip = () => {\n localStorage.setItem(PRESET_AGENTS_SKIPPED_KEY, 'true');\n onSkip();\n };\n\n if (availablePresets.length === 0) {\n return null;\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-2xl flex-col items-center gap-6 px-4 py-12\">\n <div className=\"text-center\">\n <div className=\"mb-3 inline-flex items-center gap-2 rounded-full bg-accent/10 px-3 py-1.5 text-sm font-medium text-accent\">\n <Sparkles className=\"size-4\" aria-hidden />\n {a.presetSetupBadge}\n </div>\n <h2 className=\"text-xl font-semibold text-fg\">{a.presetSetupTitle}</h2>\n <p className=\"mt-2 text-sm text-fg-muted\">{a.presetSetupSubtitle}</p>\n </div>\n\n <div className=\"w-full space-y-3\">\n {availablePresets.map((preset) => (\n <PresetAgentCard\n key={preset.id}\n preset={preset}\n checked={selected.has(preset.id)}\n disabled={creating}\n language={language}\n onToggle={() => toggleAgent(preset.id)}\n />\n ))}\n </div>\n\n {error ? (\n <div\n role=\"alert\"\n className=\"w-full rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200\"\n >\n {error}\n </div>\n ) : null}\n\n {progress && creating ? (\n <p className=\"text-sm text-fg-muted\">\n {a.presetCreatingProgress\n .replace('{{current}}', String(progress.current))\n .replace('{{total}}', String(progress.total))}\n </p>\n ) : null}\n\n <div className=\"flex w-full items-center justify-between border-t border-edge-subtle pt-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"gap-2 text-fg-muted\"\n disabled={creating}\n onClick={handleSkip}\n >\n <SkipForward className=\"size-4\" aria-hidden />\n {a.presetSkip}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"gap-2\"\n disabled={creating || selected.size === 0}\n onClick={() => void handleCreate()}\n >\n <Sparkles className=\"size-4\" aria-hidden />\n {creating\n ? a.presetCreating\n : a.presetCreateSelected.replace('{{count}}', String(selected.size))}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction PresetAgentCard(props: {\n preset: PresetAgent;\n checked: boolean;\n disabled: boolean;\n language: 'en' | 'zh';\n onToggle: () => void;\n}) {\n const { preset, checked, disabled, language, onToggle } = props;\n const description = language === 'zh' ? preset.descriptionZh : preset.descriptionEn;\n\n return (\n <label\n className={cn(\n 'flex cursor-pointer items-start gap-3 rounded-xl border px-4 py-3 transition-colors',\n checked ? 'border-accent/50 bg-accent/5' : 'border-edge-subtle bg-surface-panel/40',\n disabled && 'pointer-events-none opacity-50',\n )}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={onToggle}\n className=\"mt-1 shrink-0 accent-accent\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg\" aria-hidden>\n {preset.emoji}\n </span>\n <span className=\"font-medium text-fg\">{preset.name}</span>\n </div>\n <p className=\"mt-0.5 text-sm text-fg-muted\">{description}</p>\n </div>\n </label>\n );\n}\n","/**\n * Agent id rules — keep in sync with `src/agent/agent-scope.ts` (`validateAgentIdForNewAgent`).\n */\n\nconst DEFAULT_AGENT_ID = 'main';\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\nconst STRICT_AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n\nconst WINDOWS_RESERVED_AGENT_IDS = new Set<string>([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nexport function normalizeAgentId(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = trimmed.toLowerCase();\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\nexport function validateAgentIdForNewAgent(\n explicitId: string | undefined | null,\n displayNameForDerivation: string,\n): { ok: true; agentId: string } | { ok: false; error: string } {\n const explicit = explicitId?.trim();\n if (explicit) {\n const id = explicit.toLowerCase();\n if (!STRICT_AGENT_ID_RE.test(id)) {\n return {\n ok: false,\n error:\n 'Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.',\n };\n }\n if (id === DEFAULT_AGENT_ID) {\n return { ok: false, error: `\"${DEFAULT_AGENT_ID}\" is reserved` };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(id)) {\n return { ok: false, error: `Agent id \"${id}\" is reserved (Windows device name).` };\n }\n return { ok: true, agentId: id };\n }\n\n const agentId = normalizeAgentId(displayNameForDerivation.trim());\n if (agentId === DEFAULT_AGENT_ID) {\n return {\n ok: false,\n error:\n 'Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(agentId)) {\n return {\n ok: false,\n error: `That display name resolves to \"${agentId}\", which is reserved. Use a different display name or set an explicit Agent id.`,\n };\n }\n if (!STRICT_AGENT_ID_RE.test(agentId)) {\n return {\n ok: false,\n error:\n 'Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n return { ok: true, agentId };\n}\n","/**\n * Default workspace path suggestion for a new agent (`~/.xopc/workspace/<agentId>`; parent is `agents.defaults.workspace`).\n */\n\nimport { normalizeAgentId } from '@/lib/agent-id';\n\n/** Empty string if `name` is blank; else `~/.xopc/workspace/<agentId>`. */\nexport function suggestWorkspaceFromAgentName(name: string): string {\n const t = name.trim();\n if (!t) {\n return '';\n }\n const id = normalizeAgentId(t);\n return `~/.xopc/workspace/${id}`;\n}\n","import { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport type DreamingPhaseId = 'light' | 'deep' | 'rem';\n\n/** Gateway payload shape for memory/.dreams/last-run.json (deep sweep). */\nexport type DreamingLastRunRecord = {\n version: 2;\n phase: 'deep';\n runId: string;\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n ok: boolean;\n reason: string;\n errorMessage?: string;\n config: {\n enabled: boolean;\n minScore: number;\n minRecallCount: number;\n limit: number;\n };\n memoryPath: string;\n deep: {\n candidatesRanked: number;\n applied: number;\n skipped: {\n alreadyPromotedKey: number;\n rehydrateFailed: number;\n contaminated: number;\n hashDuplicate: number;\n };\n };\n};\n\n/** Lightweight last-run payload for light / rem phases. */\nexport type PhaseLastRun =\n | { exists: false }\n | { exists: true; path: string; raw: unknown };\n\nexport type DreamingGatewayStatus = {\n workspaceDir: string;\n config: {\n enabled: boolean;\n frequency: string;\n timezone: string;\n phases: {\n light: { enabled: boolean; cron: string; lookbackDays: number; limit: number; dedupeSimilarity: number };\n deep: { enabled: boolean; cron: string; minScore: number; minRecallCount: number; minUniqueQueries: number; limit: number; recencyHalfLifeDays: number; maxAgeDays: number };\n rem: { enabled: boolean; cron: string; lookbackDays: number; limit: number; minPatternStrength: number };\n };\n deep: { minScore: number; minRecallCount: number; limit: number };\n };\n storePath: string;\n store: {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n };\n lock: | { locked: false } | { locked: true; path: string; content: string; mtimeMs?: number };\n lastRun:\n | { exists: false }\n | { exists: true; path: string; raw: unknown; record: DreamingLastRunRecord | null; parseError: string | null };\n lightLastRun: PhaseLastRun;\n remLastRun: PhaseLastRun;\n};\n\nexport function dreamingSwrKey(): string {\n return apiUrl('/api/dreaming');\n}\n\nexport async function fetchDreamingStatus(): Promise<DreamingGatewayStatus> {\n const res = await fetchJson<{ ok?: boolean; payload?: DreamingGatewayStatus }>(dreamingSwrKey());\n if (!res.payload) throw new Error('Missing payload');\n return res.payload;\n}\n\nexport async function postDreamingAction(action: 'reset_store' | 'clear_lock'): Promise<void> {\n await fetchJson(apiUrl('/api/dreaming/action'), { method: 'POST', body: JSON.stringify({ action }) });\n}\n\nexport async function postDreamingRunNow(phase: DreamingPhaseId = 'deep'): Promise<{ triggered: boolean; jobId: string; phase: DreamingPhaseId }> {\n const res = await fetchJson<{ ok?: boolean; payload?: { triggered?: boolean; jobId?: string; phase?: string } }>(\n apiUrl('/api/dreaming/run'),\n { method: 'POST', body: JSON.stringify({ phase }) },\n );\n const triggered = Boolean(res.payload?.triggered);\n const jobId = typeof res.payload?.jobId === 'string' ? res.payload.jobId : '';\n if (!triggered || !jobId) throw new Error('Failed to trigger');\n return { triggered, jobId, phase };\n}\n\nexport type DreamingPreviewItem = {\n key: string;\n hash: string;\n snippet: string;\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n avgScore: number;\n recallCount: number;\n recencyDecay: number;\n alreadyPromotedByKey: boolean;\n alreadyPromotedByHash: boolean;\n skippedReason: string | null;\n};\n\nexport type DreamingPreviewResponse = {\n ok: boolean;\n reason: string;\n items: DreamingPreviewItem[];\n memoryPath: string;\n};\n\nexport async function fetchDreamingPreview(limit?: number): Promise<DreamingPreviewResponse> {\n const q = typeof limit === 'number' && Number.isFinite(limit) ? `?limit=${encodeURIComponent(String(limit))}` : '';\n const res = await fetchJson<{ ok?: boolean; payload?: DreamingPreviewResponse }>(apiUrl(`/api/dreaming/preview${q}`));\n if (!res.payload) throw new Error('Missing payload');\n return res.payload;\n}\n\n// ── Event audit log ────────────────────────────────────────────────────\n\nexport type DreamingEvent = {\n timestamp: string;\n phase: DreamingPhaseId;\n ok: boolean;\n reason: string;\n durationMs: number;\n // Light-specific\n scannedEntries?: number;\n newSignals?: number;\n deduped?: number;\n // Deep-specific\n candidates?: number;\n applied?: number;\n // REM-specific\n patternsDiscovered?: number;\n entriesAnalyzed?: number;\n};\n\nexport async function fetchDreamingEvents(limit = 50): Promise<DreamingEvent[]> {\n const q = `?limit=${encodeURIComponent(String(limit))}`;\n const res = await fetchJson<{ ok?: boolean; payload?: { events: DreamingEvent[] } }>(apiUrl(`/api/dreaming/events${q}`));\n return res.payload?.events ?? [];\n}\n\n","import { Moon, Plus, Search } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport type { StoredLanguage } from '@/lib/storage';\nimport type { AgentsSettingsMessages } from '@/i18n/messages';\n\nexport type AgentsSettingsToolbarProps = {\n language: StoredLanguage;\n a: Pick<AgentsSettingsMessages, 'addAgent' | 'addAgentAria' | 'listSearchPlaceholder'>;\n busy: boolean;\n sleeping: boolean;\n listSearchQuery: string;\n onListSearchQueryChange: (value: string) => void;\n onSleep: () => void;\n onAddAgent: () => void;\n};\n\nexport function AgentsSettingsToolbar({\n language,\n a,\n busy,\n sleeping,\n listSearchQuery,\n onListSearchQueryChange,\n onSleep,\n onAddAgent,\n}: AgentsSettingsToolbarProps) {\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"shrink-0 gap-2\"\n disabled={busy || sleeping}\n onClick={() => void onSleep()}\n aria-label={language === 'zh' ? '让智能体进入睡眠流程' : 'Trigger agent sleep sequence'}\n title={language === 'zh' ? '由浅入深:Light → Deep → REM' : 'Light → Deep → REM'}\n >\n <Moon className=\"size-4 shrink-0\" strokeWidth={1.75} aria-hidden />\n {language === 'zh' ? (sleeping ? '睡眠中…' : '睡眠') : sleeping ? 'Sleeping…' : 'Sleep'}\n </Button>\n <label className=\"relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n role=\"searchbox\"\n enterKeyHint=\"search\"\n value={listSearchQuery}\n onChange={(e) => onListSearchQueryChange(e.target.value)}\n placeholder={a.listSearchPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n aria-label={a.listSearchPlaceholder}\n className=\"min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none\"\n />\n </label>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"shrink-0 gap-2\"\n aria-label={a.addAgentAria}\n disabled={busy}\n onClick={() => onAddAgent()}\n >\n <Plus className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {a.addAgent}\n </Button>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { useDebouncedCallback } from 'use-debounce';\n\nimport {\n fetchAgentBootstrapFileContent,\n fetchAgentBootstrapFiles,\n saveAgentBootstrapFileContent,\n} from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\n\nexport function useAgentsBootstrapFiles(options: {\n panel: AgentPanel;\n selectedId: string | null;\n hasToken: boolean;\n dataAgentsLength: number | undefined;\n saveErrorMessage: string;\n setError: Dispatch<SetStateAction<string | null>>;\n}) {\n const { panel, selectedId, hasToken, dataAgentsLength, saveErrorMessage, setError } = options;\n\n const [files, setFiles] = useState<Awaited<ReturnType<typeof fetchAgentBootstrapFiles>> | null>(null);\n const [filesLoading, setFilesLoading] = useState(false);\n const [activeFile, setActiveFile] = useState<string | null>(null);\n const [fileDraft, setFileDraft] = useState('');\n const [fileSaving, setFileSaving] = useState(false);\n const [bootstrapViewMode, setBootstrapViewMode] = useState<'edit' | 'preview'>('edit');\n const [bootstrapFileLoading, setBootstrapFileLoading] = useState(false);\n const [bootstrapEditorNonce, setBootstrapEditorNonce] = useState(0);\n\n const fileDraftRef = useRef(fileDraft);\n fileDraftRef.current = fileDraft;\n const selectedIdRef = useRef(selectedId);\n selectedIdRef.current = selectedId;\n const activeFileRef = useRef(activeFile);\n activeFileRef.current = activeFile;\n const overviewSaveBootstrapRef = useRef<(() => Promise<void>) | null>(null);\n const bootstrapFileKeyRef = useRef('');\n const bootstrapSyncedRef = useRef('');\n\n const saveBootstrapDebounced = useDebouncedCallback(\n async () => {\n const sid = selectedIdRef.current;\n const name = activeFileRef.current;\n if (!sid || !name) {\n return;\n }\n const key = `${sid}:${name}`;\n if (key !== bootstrapFileKeyRef.current) {\n return;\n }\n const draft = fileDraftRef.current;\n if (draft === bootstrapSyncedRef.current) {\n return;\n }\n setFileSaving(true);\n setError(null);\n try {\n await saveAgentBootstrapFileContent(sid, name, draft);\n bootstrapSyncedRef.current = draft;\n setFiles((prev) => {\n if (!prev || prev.agentId !== sid) {\n return prev;\n }\n return {\n ...prev,\n files: prev.files.map((f) => (f.name === name ? { ...f, missing: false } : f)),\n };\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setFileSaving(false);\n }\n },\n 800,\n );\n\n const flushBootstrapSaveRef = useRef(saveBootstrapDebounced.flush);\n flushBootstrapSaveRef.current = saveBootstrapDebounced.flush;\n\n useEffect(() => {\n return () => {\n flushBootstrapSaveRef.current();\n };\n }, []);\n\n useEffect(() => {\n if (panel !== 'files' || !selectedId || !hasToken) {\n return;\n }\n let cancelled = false;\n setFilesLoading(true);\n void fetchAgentBootstrapFiles(selectedId)\n .then((f) => {\n if (!cancelled) {\n setFiles(f);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setFiles(null);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setFilesLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, selectedId, hasToken, dataAgentsLength]);\n\n useEffect(() => {\n if (!activeFile || !selectedId || !hasToken) {\n return;\n }\n let cancelled = false;\n saveBootstrapDebounced.flush();\n setBootstrapFileLoading(true);\n void fetchAgentBootstrapFileContent(selectedId, activeFile)\n .then((c) => {\n if (cancelled) {\n return;\n }\n const key = `${selectedId}:${activeFile}`;\n bootstrapFileKeyRef.current = key;\n bootstrapSyncedRef.current = c;\n setFileDraft(c);\n setBootstrapEditorNonce((n) => n + 1);\n })\n .catch(() => {\n if (!cancelled) {\n const key = `${selectedId}:${activeFile}`;\n bootstrapFileKeyRef.current = key;\n bootstrapSyncedRef.current = '';\n setFileDraft('');\n setBootstrapEditorNonce((n) => n + 1);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setBootstrapFileLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [activeFile, selectedId, hasToken, saveBootstrapDebounced]);\n\n useEffect(() => {\n if (!activeFile || !selectedId || bootstrapFileLoading) {\n return;\n }\n saveBootstrapDebounced();\n }, [fileDraft, activeFile, selectedId, bootstrapFileLoading, saveBootstrapDebounced]);\n\n useEffect(() => {\n if (panel !== 'files') {\n return;\n }\n return () => {\n saveBootstrapDebounced.flush();\n };\n }, [panel, saveBootstrapDebounced]);\n\n useEffect(() => {\n setBootstrapViewMode('edit');\n }, [activeFile, selectedId]);\n\n return {\n files,\n setFiles,\n filesLoading,\n activeFile,\n setActiveFile,\n fileDraft,\n setFileDraft,\n fileSaving,\n bootstrapViewMode,\n setBootstrapViewMode,\n bootstrapFileLoading,\n bootstrapEditorNonce,\n overviewSaveBootstrapRef,\n saveBootstrapDebounced,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { Dispatch, FormEvent, SetStateAction } from 'react';\n\nimport {\n getChannels,\n getSessionChatIds,\n type ChannelStatus,\n type SessionChatId,\n} from '@/features/cron/cron-api';\nimport {\n patchGatewayBindings,\n type GatewayAgentRow,\n type GatewayConfigBinding,\n} from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\nimport { buildNewBindingMatch } from '../utils';\n\nexport function useAgentsChannelBindings(options: {\n panel: AgentPanel;\n hasToken: boolean;\n bindingsFromConfig: GatewayConfigBinding[];\n gatewayCfgLoading: boolean;\n selected: GatewayAgentRow | null;\n saveErrorMessage: string;\n setBusy: Dispatch<SetStateAction<boolean>>;\n setError: Dispatch<SetStateAction<string | null>>;\n}) {\n const {\n panel,\n hasToken,\n bindingsFromConfig,\n gatewayCfgLoading,\n selected,\n saveErrorMessage,\n setBusy,\n setError,\n } = options;\n\n const [allBindings, setAllBindings] = useState<GatewayConfigBinding[]>([]);\n const [newBindChannel, setNewBindChannel] = useState('');\n const [bindChannelStatuses, setBindChannelStatuses] = useState<ChannelStatus[]>([]);\n const [bindChannelsLoading, setBindChannelsLoading] = useState(false);\n const [bindSessionChats, setBindSessionChats] = useState<SessionChatId[]>([]);\n const [bindSessionsLoading, setBindSessionsLoading] = useState(false);\n const [newBindSessionIdx, setNewBindSessionIdx] = useState<number | null>(null);\n const [newBindCustomPeer, setNewBindCustomPeer] = useState('');\n\n const agentBindings = useMemo(() => {\n if (!selected) {\n return [];\n }\n return allBindings.filter((b) => b.agentId.toLowerCase() === selected.id.toLowerCase());\n }, [allBindings, selected?.id]);\n\n useEffect(() => {\n if (panel !== 'channels' || !hasToken) {\n return;\n }\n setAllBindings(bindingsFromConfig);\n }, [panel, hasToken, bindingsFromConfig]);\n\n useEffect(() => {\n if (panel !== 'channels' || !hasToken) {\n return;\n }\n let cancelled = false;\n setBindChannelsLoading(true);\n void getChannels()\n .then((list) => {\n if (!cancelled) {\n setBindChannelStatuses(list);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setBindChannelStatuses([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setBindChannelsLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, hasToken]);\n\n useEffect(() => {\n if (bindChannelsLoading || panel !== 'channels' || bindChannelStatuses.length === 0) {\n return;\n }\n setNewBindChannel((prev) => {\n const valid = Boolean(prev) && bindChannelStatuses.some((c) => c.name === prev);\n if (valid) {\n return prev;\n }\n return bindChannelStatuses[0].name;\n });\n }, [bindChannelsLoading, panel, bindChannelStatuses]);\n\n useEffect(() => {\n if (panel !== 'channels' || !hasToken) {\n return;\n }\n const ch = newBindChannel.trim();\n if (!ch) {\n setBindSessionChats([]);\n return;\n }\n let cancelled = false;\n setNewBindSessionIdx(null);\n setBindSessionsLoading(true);\n void getSessionChatIds(ch)\n .then((ids) => {\n if (!cancelled) {\n setBindSessionChats(ids);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setBindSessionChats([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setBindSessionsLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, hasToken, newBindChannel]);\n\n const refreshBindSessions = useCallback(() => {\n const ch = newBindChannel.trim();\n if (!ch) {\n return;\n }\n setBindSessionsLoading(true);\n void getSessionChatIds(ch)\n .then((ids) => {\n setBindSessionChats(ids);\n setNewBindSessionIdx((i) => (i != null && i < ids.length ? i : null));\n })\n .catch(() => {\n setBindSessionChats([]);\n setNewBindSessionIdx(null);\n })\n .finally(() => {\n setBindSessionsLoading(false);\n });\n }, [newBindChannel]);\n\n const useManualChannel = !bindChannelsLoading && bindChannelStatuses.length === 0;\n const bindingsLoading = panel === 'channels' && hasToken && gatewayCfgLoading;\n\n const onRemoveBinding = useCallback(\n async (rule: GatewayConfigBinding) => {\n setBusy(true);\n setError(null);\n try {\n const nextList = allBindings.filter((b) => b !== rule);\n await patchGatewayBindings(nextList);\n setAllBindings(nextList);\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setBusy(false);\n }\n },\n [allBindings, saveErrorMessage, setBusy, setError],\n );\n\n const onAddBinding = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n if (!selected || !newBindChannel.trim()) {\n return;\n }\n const match = buildNewBindingMatch(\n newBindChannel,\n newBindCustomPeer,\n newBindSessionIdx,\n bindSessionChats,\n );\n const nextList = [\n ...allBindings,\n {\n agentId: selected.id,\n priority: 100,\n enabled: true,\n match,\n },\n ];\n setBusy(true);\n setError(null);\n try {\n await patchGatewayBindings(nextList);\n setAllBindings(nextList);\n setNewBindSessionIdx(null);\n setNewBindCustomPeer('');\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setBusy(false);\n }\n },\n [\n allBindings,\n bindSessionChats,\n newBindChannel,\n newBindCustomPeer,\n newBindSessionIdx,\n saveErrorMessage,\n selected,\n setBusy,\n setError,\n ],\n );\n\n return {\n agentBindings,\n allBindings,\n bindChannelStatuses,\n bindChannelsLoading,\n bindSessionChats,\n bindSessionsLoading,\n bindingsLoading,\n newBindChannel,\n setNewBindChannel,\n newBindSessionIdx,\n setNewBindSessionIdx,\n newBindCustomPeer,\n setNewBindCustomPeer,\n onAddBinding,\n onRemoveBinding,\n refreshBindSessions,\n useManualChannel,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport { listJobs, updateJob, type CronJob } from '@/features/cron/cron-api';\nimport { isDreamingManagedCronJob } from '@/features/cron/cron-dreaming-jobs';\nimport type { GatewayAgentRow, GatewayAgentsPayload } from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\nimport { jobMatchesAgent } from '../utils';\n\nexport function useAgentsCronJobs(options: {\n panel: AgentPanel;\n hasToken: boolean;\n data: GatewayAgentsPayload | null;\n selected: GatewayAgentRow | null;\n saveErrorMessage: string;\n setBusy: Dispatch<SetStateAction<boolean>>;\n setError: Dispatch<SetStateAction<string | null>>;\n}) {\n const { panel, hasToken, data, selected, saveErrorMessage, setBusy, setError } = options;\n\n const [cronJobs, setCronJobs] = useState<CronJob[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const agentCronJobs = useMemo(() => {\n if (!data || !selected) {\n return [];\n }\n return cronJobs.filter(\n (j) => !isDreamingManagedCronJob(j) && jobMatchesAgent(j, selected.id, data.defaultId),\n );\n }, [cronJobs, data, selected]);\n\n useEffect(() => {\n if (panel !== 'cron' || !hasToken) {\n return;\n }\n let cancelled = false;\n setCronLoading(true);\n void listJobs()\n .then((j) => {\n if (!cancelled) {\n setCronJobs(j);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setCronJobs([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setCronLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [panel, hasToken]);\n\n async function onSetCronJobAgent(job: CronJob, agentKey: string) {\n setBusy(true);\n setError(null);\n try {\n await updateJob(job.id, { agentId: agentKey === '' ? null : agentKey });\n setCronJobs(await listJobs());\n } catch (err) {\n setError(err instanceof Error ? err.message : saveErrorMessage);\n } finally {\n setBusy(false);\n }\n }\n\n return {\n agentCronJobs,\n cronJobs,\n cronLoading,\n onSetCronJobAgent,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\n\nimport { fetchSkillsCatalog, type SkillCatalogRow } from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\n\nexport function useSkillsCatalogLoad(enabled: boolean, hasToken: boolean) {\n const [skillCatalog, setSkillCatalog] = useState<SkillCatalogRow[]>([]);\n const [skillsCatalogLoading, setSkillsCatalogLoading] = useState(false);\n\n const catalogForPick = useMemo(\n () => skillCatalog.filter((s) => s.enabled !== false),\n [skillCatalog],\n );\n\n useEffect(() => {\n if (!enabled || !hasToken) {\n return;\n }\n let cancelled = false;\n setSkillsCatalogLoading(true);\n void fetchSkillsCatalog()\n .then((rows) => {\n if (!cancelled) {\n setSkillCatalog(rows);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setSkillCatalog([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setSkillsCatalogLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, hasToken]);\n\n return {\n catalogForPick,\n skillCatalog,\n skillsCatalogLoading,\n };\n}\n\nexport function useAgentsSkillsCatalog(options: { panel: AgentPanel; hasToken: boolean }) {\n return useSkillsCatalogLoad(options.panel === 'skills', options.hasToken);\n}\n","import { useEffect, useState } from 'react';\nimport type { GatewayAgentRow } from '@/features/settings/agents-admin-api';\n\nimport type { AgentPanel } from '../utils';\n\nexport function useAgentsToolsSkillsLocalState(options: {\n panel: AgentPanel;\n selected: GatewayAgentRow | null;\n}) {\n const { panel, selected } = options;\n\n const [toolEntryDisable, setToolEntryDisable] = useState<Set<string>>(() => new Set());\n const [skillsPick, setSkillsPick] = useState<Set<string>>(() => new Set());\n const [skillsInherit, setSkillsInherit] = useState(true);\n\n useEffect(() => {\n if (!selected || panel !== 'tools') {\n return;\n }\n setToolEntryDisable(new Set(selected.tools.entryDisable));\n }, [panel, selected]);\n\n useEffect(() => {\n if (!selected || panel !== 'skills') {\n return;\n }\n const inherit = selected.skills.entry === undefined;\n setSkillsInherit(inherit);\n if (inherit) {\n const eff = selected.skills.effectiveAllowlist;\n setSkillsPick(new Set(eff ?? []));\n } else {\n setSkillsPick(new Set(selected.skills.entry ?? []));\n }\n }, [panel, selected]);\n\n return {\n toolEntryDisable,\n setToolEntryDisable,\n skillsPick,\n setSkillsPick,\n skillsInherit,\n setSkillsInherit,\n };\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n} from 'react';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\nimport useSWR from 'swr';\n\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n createGatewayAgent,\n deleteGatewayAgent,\n fetchGatewayAgents,\n parseGatewayBindingsFromConfig,\n updateGatewayAgent,\n type GatewayAgentRow,\n type GatewayAgentsPayload,\n} from '@/features/settings/agents-admin-api';\nimport { AGENTS_APP_LIST_PATH, agentsAppDetailPath } from '@/features/settings/agents/agents-app-path';\nimport { SETTINGS_BACK_PATH_STATE_KEY } from '@/features/settings/settings-nav-state';\nimport { suggestWorkspaceFromAgentName } from '@/features/settings/suggest-agent-workspace';\nimport { postDreamingRunNow, type DreamingPhaseId } from '@/features/settings/dreaming-api';\nimport { validateAgentIdForNewAgent } from '@/lib/agent-id';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\n\nimport type { AgentsEditorPanelContentProps } from './agents-editor-panel-content';\nimport { AgentsSettingsToolbar } from './agents-settings-toolbar';\nimport { agentListDisplayName } from './agent-display-names';\nimport { useAgentsBootstrapFiles } from './hooks/use-agents-bootstrap-files';\nimport { useAgentsChannelBindings } from './hooks/use-agents-channel-bindings';\nimport { useAgentsCronJobs } from './hooks/use-agents-cron-jobs';\nimport { useAgentsSkillsCatalog } from './hooks/use-agents-skills-catalog';\nimport { useAgentsToolsSkillsLocalState } from './hooks/use-agents-tools-skills-local-state';\nimport { PRESET_AGENTS_SKIPPED_KEY } from './preset-agents';\nimport type { AgentPanel } from './utils';\n\nexport function useAgentsSettingsPanel() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentsSettings;\n\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<GatewayAgentRow | null>(null);\n const [deletePurge, setDeletePurge] = useState(false);\n const [deleteConfirmText, setDeleteConfirmText] = useState('');\n const cCron = m.cron;\n const chat = m.chat;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const { agentId: routeAgentId } = useParams<{ agentId?: string }>();\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n\n const agentsSwrKey = hasToken ? 'settings-gateway-agents' : null;\n const {\n data: swrAgentsData,\n error: swrAgentsError,\n isLoading: agentsLoading,\n mutate: mutateAgents,\n } = useSWR(agentsSwrKey, fetchGatewayAgents, { revalidateOnFocus: false });\n\n const { data: gatewayCfgData } = useGatewayConfigSwr(hasToken);\n\n const bindingsFromConfig = useMemo(\n () => parseGatewayBindingsFromConfig(gatewayCfgData?.payload?.config ?? {}),\n [gatewayCfgData],\n );\n\n const data: GatewayAgentsPayload | null = swrAgentsData ?? null;\n const loading = Boolean(hasToken && agentsLoading);\n const [error, setError] = useState<string | null>(null);\n const loadError =\n swrAgentsError instanceof Error ? swrAgentsError.message : swrAgentsError ? a.loadError : null;\n const displayError = error ?? loadError;\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [showPresetSetup, setShowPresetSetup] = useState(false);\n const [panel, setPanel] = useState<AgentPanel>('overview');\n\n const [createDisplayName, setCreateDisplayName] = useState('');\n const [createAgentId, setCreateAgentId] = useState('');\n const [createDescription, setCreateDescription] = useState('');\n const [createWorkspace, setCreateWorkspace] = useState('');\n const [createModel, setCreateModel] = useState('');\n const [createModalError, setCreateModalError] = useState<string | null>(null);\n const [addAgentModalOpen, setAddAgentModalOpen] = useState(false);\n const createWorkspaceSuggestedRef = useRef('');\n const [busy, setBusy] = useState(false);\n const [sleeping, setSleeping] = useState(false);\n const [listSearchQuery, setListSearchQuery] = useState('');\n\n const [editWorkspace, setEditWorkspace] = useState('');\n const [editModel, setEditModel] = useState('');\n const [editName, setEditName] = useState('');\n const [editDescription, setEditDescription] = useState('');\n\n const profileSaveRef = useRef<(() => Promise<void>) | null>(null);\n const [overviewBootstrapDirty, setOverviewBootstrapDirty] = useState(false);\n const [profileDirty, setProfileDirty] = useState(false);\n const [savedFlash, setSavedFlash] = useState(false);\n\n useEffect(() => {\n if (!data) {\n return;\n }\n if (routeAgentId && data.agents.some((x) => x.id === routeAgentId)) {\n setSelectedId(routeAgentId);\n return;\n }\n setSelectedId((prev) => {\n if (prev && data.agents.some((x) => x.id === prev)) {\n return prev;\n }\n return data.defaultId;\n });\n }, [data, routeAgentId]);\n\n useEffect(() => {\n if (!data || loading) {\n return;\n }\n const onlyMain =\n data.agents.length <= 1 && data.agents.every((ag) => ag.id === data.defaultId);\n const skipped = localStorage.getItem(PRESET_AGENTS_SKIPPED_KEY) === 'true';\n setShowPresetSetup(onlyMain && !skipped);\n }, [data, loading]);\n\n const onPresetSetupComplete = useCallback(() => {\n setShowPresetSetup(false);\n void mutateAgents();\n }, [mutateAgents]);\n\n const onPresetSetupSkip = useCallback(() => {\n setShowPresetSetup(false);\n }, []);\n\n useEffect(() => {\n if (!data || !routeAgentId) {\n return;\n }\n if (!data.agents.some((x) => x.id === routeAgentId)) {\n navigate(AGENTS_APP_LIST_PATH, { replace: true });\n }\n }, [data, routeAgentId, navigate]);\n\n useEffect(() => {\n if (routeAgentId) {\n setPanel('overview');\n }\n }, [routeAgentId]);\n\n useEffect(() => {\n if (searchParams.get('panel') !== 'defaults') {\n return;\n }\n navigate('/settings/agent-chat', {\n replace: true,\n state: { [SETTINGS_BACK_PATH_STATE_KEY]: AGENTS_APP_LIST_PATH },\n });\n }, [searchParams, navigate]);\n\n useEffect(() => {\n if (searchParams.get('focus') !== 'avatar' || !routeAgentId) {\n return;\n }\n setPanel('overview');\n if (loading || !data?.agents.some((x) => x.id === routeAgentId)) {\n return;\n }\n const t = window.setTimeout(() => {\n document.getElementById('agent-avatar-settings')?.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n });\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n next.delete('focus');\n return next;\n },\n { replace: true },\n );\n }, 220);\n return () => window.clearTimeout(t);\n }, [searchParams, routeAgentId, loading, data, setSearchParams]);\n\n const selected = useMemo(\n () => data?.agents.find((x) => x.id === selectedId) ?? null,\n [data, selectedId],\n );\n\n const bootstrap = useAgentsBootstrapFiles({\n panel,\n selectedId,\n hasToken,\n dataAgentsLength: data?.agents.length,\n saveErrorMessage: a.saveError,\n setError,\n });\n\n const toolsSkills = useAgentsToolsSkillsLocalState({ panel, selected });\n\n const channels = useAgentsChannelBindings({\n panel,\n hasToken,\n bindingsFromConfig,\n gatewayCfgLoading: gatewayCfgData === undefined,\n selected,\n saveErrorMessage: a.saveError,\n setBusy,\n setError,\n });\n\n const cron = useAgentsCronJobs({\n panel,\n hasToken,\n data,\n selected,\n saveErrorMessage: a.saveError,\n setBusy,\n setError,\n });\n\n const skillsCatalog = useAgentsSkillsCatalog({ panel, hasToken });\n\n useEffect(() => {\n if (!selected) {\n setEditWorkspace('');\n setEditModel('');\n setEditName('');\n setEditDescription('');\n return;\n }\n setEditWorkspace(selected.workspace);\n setEditModel(selected.model?.primary ?? '');\n setEditName(agentListDisplayName(selected, messages(language).agentsSettings));\n setEditDescription(selected.description?.trim() ?? '');\n }, [selected?.id, language]);\n\n const applyCreateWorkspaceSuggestion = useCallback(() => {\n const next = suggestWorkspaceFromAgentName(createAgentId.trim() || createDisplayName);\n setCreateWorkspace((prev) => {\n if (prev === '' || prev === createWorkspaceSuggestedRef.current) {\n createWorkspaceSuggestedRef.current = next;\n return next;\n }\n return prev;\n });\n }, [createAgentId, createDisplayName]);\n\n const openAddAgentModal = useCallback(() => {\n createWorkspaceSuggestedRef.current = '';\n setCreateDisplayName('');\n setCreateAgentId('');\n setCreateDescription('');\n setCreateWorkspace('');\n setCreateModel('');\n setCreateModalError(null);\n setAddAgentModalOpen(true);\n }, []);\n\n const sleep = useCallback((ms: number) => new Promise<void>((resolve) => window.setTimeout(resolve, ms)), []);\n\n const triggerSleepSequence = useCallback(async () => {\n if (sleeping || busy) return;\n setSleeping(true);\n setError(null);\n\n const phases: DreamingPhaseId[] = ['light', 'deep', 'rem'];\n try {\n void (async () => {\n for (const phase of phases) {\n try {\n await postDreamingRunNow(phase);\n } catch {\n // Animation-first: errors are intentionally not surfaced here.\n }\n }\n })();\n\n for (let idx = 0; idx < phases.length; idx++) {\n const phase = phases[idx];\n window.dispatchEvent(new CustomEvent('dreaming-phase-start', { detail: { phase, source: 'ui' } }));\n\n const displayMs = phase === 'light' ? 7000 : phase === 'deep' ? 9000 : 8000;\n await sleep(displayMs);\n\n if (idx === phases.length - 1) {\n (window as unknown as { __xopcDreamingIgnoreSseUntil?: number }).__xopcDreamingIgnoreSseUntil =\n Date.now() + 60_000;\n window.dispatchEvent(new CustomEvent('dreaming-phase-end', { detail: { phase, source: 'ui' } }));\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setSleeping(false);\n }\n }, [a.saveError, busy, sleeping, sleep]);\n\n const agentsHeaderEnd = useMemo(\n () => (\n <AgentsSettingsToolbar\n language={language}\n a={a}\n busy={busy}\n sleeping={sleeping}\n listSearchQuery={listSearchQuery}\n onListSearchQueryChange={setListSearchQuery}\n onSleep={() => void triggerSleepSequence()}\n onAddAgent={() => openAddAgentModal()}\n />\n ),\n [a, busy, language, listSearchQuery, openAddAgentModal, sleeping, triggerSleepSequence],\n );\n\n useLayoutEffect(() => {\n if (!hasToken) {\n clearPageHeader();\n return () => clearPageHeader();\n }\n setPageHeader({\n startExtra: null,\n main: null,\n end: agentsHeaderEnd,\n });\n return () => clearPageHeader();\n }, [agentsHeaderEnd, clearPageHeader, hasToken, setPageHeader]);\n\n async function onCreate(e: FormEvent) {\n e.preventDefault();\n const name = createDisplayName.trim();\n if (!name) {\n return;\n }\n const idRes = validateAgentIdForNewAgent(createAgentId, name);\n if (idRes.ok === false) {\n setCreateModalError(idRes.error);\n return;\n }\n const wsInput = createWorkspace.trim();\n const workspace = wsInput || suggestWorkspaceFromAgentName(createAgentId.trim() || name);\n if (!workspace) {\n return;\n }\n setBusy(true);\n setCreateModalError(null);\n try {\n const desc = createDescription.trim();\n const next = await createGatewayAgent({\n name,\n workspace,\n ...(createAgentId.trim() ? { id: createAgentId.trim() } : {}),\n ...(createModel.trim() ? { model: createModel.trim() } : {}),\n ...(desc ? { description: desc } : {}),\n });\n const { createdAgentId, ...agentsPayload } = next;\n void mutateAgents(agentsPayload, { revalidate: false });\n setCreateDisplayName('');\n setCreateAgentId('');\n setCreateDescription('');\n setCreateWorkspace('');\n setCreateModel('');\n setCreateModalError(null);\n setAddAgentModalOpen(false);\n setSelectedId(createdAgentId);\n navigate(agentsAppDetailPath(createdAgentId));\n } catch (err) {\n setCreateModalError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onSaveAgentEdits() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const descTrim = editDescription.trim();\n const next = await updateGatewayAgent(selected.id, {\n name: editName.trim() || undefined,\n description: descTrim.length > 0 ? descTrim : null,\n workspace: editWorkspace.trim() || undefined,\n model: editModel.trim() || null,\n });\n void mutateAgents(next, { revalidate: false });\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onSetDefault(agent: GatewayAgentRow) {\n setBusy(true);\n setError(null);\n try {\n const next = await updateGatewayAgent(agent.id, { setDefault: true });\n void mutateAgents(next, { revalidate: false });\n setSelectedId(agent.id);\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function performDelete(agent: GatewayAgentRow, purge: boolean) {\n setBusy(true);\n setError(null);\n try {\n const next = await deleteGatewayAgent(agent.id, purge);\n void mutateAgents(next, { revalidate: false });\n setSelectedId(next.defaultId);\n setPanel('overview');\n if (routeAgentId === agent.id) {\n navigate(AGENTS_APP_LIST_PATH, { replace: true });\n }\n setDeleteDialogOpen(false);\n setDeleteTarget(null);\n setDeleteConfirmText('');\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n function onDelete(agent: GatewayAgentRow, purge: boolean) {\n if (agent.id === 'main') {\n return;\n }\n setDeleteTarget(agent);\n setDeletePurge(purge);\n setDeleteConfirmText('');\n setDeleteDialogOpen(true);\n }\n\n async function onSaveTools() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const toolsDisable = [...toolsSkills.toolEntryDisable].sort((x, y) => x.localeCompare(y));\n const next = await updateGatewayAgent(selected.id, { toolsDisable });\n void mutateAgents(next, { revalidate: false });\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onClearToolsEntry() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const next = await updateGatewayAgent(selected.id, { toolsDisable: null });\n void mutateAgents(next, { revalidate: false });\n toolsSkills.setToolEntryDisable(new Set());\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n async function onSaveSkills() {\n if (!selected) {\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const next = await updateGatewayAgent(selected.id, {\n skills: toolsSkills.skillsInherit\n ? null\n : [...toolsSkills.skillsPick].sort((x, y) => x.localeCompare(y)),\n });\n void mutateAgents(next, { revalidate: false });\n } catch (err) {\n setError(err instanceof Error ? err.message : a.saveError);\n } finally {\n setBusy(false);\n }\n }\n\n const footerSaveNotApplicable = panel === 'channels' || panel === 'cron';\n\n const overviewRestDirty = (() => {\n if (!selected || panel !== 'overview') return false;\n const origName = agentListDisplayName(selected, a);\n const origDesc = selected.description?.trim() ?? '';\n const origWorkspace = selected.workspace;\n const origModel = selected.model?.primary ?? '';\n return (\n editName.trim() !== origName ||\n editDescription.trim() !== origDesc ||\n editWorkspace.trim() !== origWorkspace ||\n editModel.trim() !== origModel\n );\n })();\n\n const isCurrentPanelDirty = (() => {\n if (footerSaveNotApplicable) return false;\n switch (panel) {\n case 'overview':\n return overviewRestDirty || overviewBootstrapDirty;\n case 'profile':\n return profileDirty;\n default:\n return true;\n }\n })();\n\n const footerSaveDisabled = footerSaveNotApplicable || !isCurrentPanelDirty;\n\n function showSavedFlash() {\n setSavedFlash(true);\n setTimeout(() => setSavedFlash(false), 2000);\n }\n\n async function handleModalFooterSave() {\n switch (panel) {\n case 'overview':\n await Promise.all([\n onSaveAgentEdits(),\n bootstrap.overviewSaveBootstrapRef.current?.() ?? Promise.resolve(),\n ]);\n showSavedFlash();\n break;\n case 'profile':\n await profileSaveRef.current?.();\n showSavedFlash();\n break;\n case 'tools':\n await onSaveTools();\n showSavedFlash();\n break;\n case 'skills':\n await onSaveSkills();\n showSavedFlash();\n break;\n case 'files':\n bootstrap.saveBootstrapDebounced.flush();\n showSavedFlash();\n break;\n default:\n break;\n }\n }\n\n function onAgentModalOpenChange(open: boolean) {\n if (!open) {\n navigate(AGENTS_APP_LIST_PATH);\n }\n }\n\n const modalTitle = selected ? editName.trim() || agentListDisplayName(selected, a) : (routeAgentId ?? '');\n const modalSubtitle = selected?.id ?? routeAgentId ?? '';\n\n const editorPanelProps: AgentsEditorPanelContentProps = {\n a,\n chat,\n cCron,\n selected,\n panel,\n data,\n busy,\n editName,\n setEditName,\n editDescription,\n setEditDescription,\n editWorkspace,\n setEditWorkspace,\n editModel,\n setEditModel,\n onSetDefault: () => {\n if (!selected) return;\n void onSetDefault(selected);\n },\n onSaveAgentEdits: () => void onSaveAgentEdits(),\n onDelete: (purge: boolean) => {\n if (!selected) return;\n void onDelete(selected, purge);\n },\n overviewSaveBootstrapRef: bootstrap.overviewSaveBootstrapRef,\n profileSaveRef,\n setOverviewBootstrapDirty,\n setProfileDirty,\n filesLoading: bootstrap.filesLoading,\n files: bootstrap.files,\n activeFile: bootstrap.activeFile,\n setActiveFile: bootstrap.setActiveFile,\n bootstrapViewMode: bootstrap.bootstrapViewMode,\n setBootstrapViewMode: bootstrap.setBootstrapViewMode,\n fileDraft: bootstrap.fileDraft,\n setFileDraft: bootstrap.setFileDraft,\n fileSaving: bootstrap.fileSaving,\n bootstrapFileLoading: bootstrap.bootstrapFileLoading,\n bootstrapEditorNonce: bootstrap.bootstrapEditorNonce,\n toolEntryDisable: toolsSkills.toolEntryDisable,\n setToolEntryDisable: toolsSkills.setToolEntryDisable,\n onSaveTools: () => void onSaveTools(),\n onClearToolsEntry: () => void onClearToolsEntry(),\n skillsCatalogLoading: skillsCatalog.skillsCatalogLoading,\n catalogForPick: skillsCatalog.catalogForPick,\n skillsInherit: toolsSkills.skillsInherit,\n setSkillsInherit: toolsSkills.setSkillsInherit,\n skillsPick: toolsSkills.skillsPick,\n setSkillsPick: toolsSkills.setSkillsPick,\n onSaveSkills: () => void onSaveSkills(),\n bindingsLoading: channels.bindingsLoading,\n agentBindings: channels.agentBindings,\n bindChannelStatuses: channels.bindChannelStatuses,\n bindChannelsLoading: channels.bindChannelsLoading,\n useManualChannel: channels.useManualChannel,\n newBindChannel: channels.newBindChannel,\n setNewBindChannel: channels.setNewBindChannel,\n bindSessionChats: channels.bindSessionChats,\n bindSessionsLoading: channels.bindSessionsLoading,\n newBindSessionIdx: channels.newBindSessionIdx,\n setNewBindSessionIdx: channels.setNewBindSessionIdx,\n newBindCustomPeer: channels.newBindCustomPeer,\n setNewBindCustomPeer: channels.setNewBindCustomPeer,\n refreshBindSessions: channels.refreshBindSessions,\n onRemoveBinding: (rule) => void channels.onRemoveBinding(rule),\n onAddBinding: channels.onAddBinding,\n cronLoading: cron.cronLoading,\n agentCronJobs: cron.agentCronJobs,\n onSetCronJobAgent: (job, key) => void cron.onSetCronJobAgent(job, key),\n };\n\n return {\n hasToken,\n a,\n chat,\n language,\n data,\n loading,\n displayError,\n navigate,\n routeAgentId,\n showPresetSetup,\n onPresetSetupComplete,\n onPresetSetupSkip,\n busy,\n listSearchQuery,\n openAddAgentModal,\n panel,\n setPanel,\n modalTitle,\n modalSubtitle,\n footerSaveDisabled,\n savedFlash,\n handleModalFooterSave,\n onAgentModalOpenChange,\n addAgentModalOpen,\n setAddAgentModalOpen,\n createWorkspaceSuggestedRef,\n createModalError,\n setCreateModalError,\n createDisplayName,\n setCreateDisplayName,\n createAgentId,\n setCreateAgentId,\n createDescription,\n setCreateDescription,\n createWorkspace,\n setCreateWorkspace,\n createModel,\n setCreateModel,\n onCreate,\n applyCreateWorkspaceSuggestion,\n deleteDialogOpen,\n setDeleteDialogOpen,\n deletePurge,\n deleteTarget,\n setDeleteTarget,\n deleteConfirmText,\n setDeleteConfirmText,\n performDelete,\n editorPanelProps,\n };\n}\n","import { AgentDeleteConfirmDialog } from './agent-delete-confirm-dialog';\nimport { agentsAppDetailPath } from './agents-app-path';\nimport { AgentsEditorModal } from './agents-editor-modal';\nimport { AgentsEditorPanelContent } from './agents-editor-panel-content';\nimport { AgentsListGrid } from './agents-list-grid';\nimport { AgentsSettingsHeader } from './agents-settings-header';\nimport { CreateAgentDialog } from './create-agent-dialog';\nimport { PresetAgentsSetup } from './preset-agents-setup';\nimport { useAgentsSettingsPanel } from './use-agents-settings-panel';\n\nexport function AgentsSettingsPanel() {\n const vm = useAgentsSettingsPanel();\n\n if (!vm.hasToken) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-8\">\n <h1 className=\"text-lg font-semibold text-fg\">{vm.a.title}</h1>\n <p className=\"text-sm text-fg-muted\">{vm.a.needToken}</p>\n </div>\n );\n }\n\n if (vm.showPresetSetup && vm.data) {\n const existingIds = new Set(vm.data.agents.map((ag) => ag.id));\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col px-4 py-8\">\n <PresetAgentsSetup\n existingAgentIds={existingIds}\n onComplete={vm.onPresetSetupComplete}\n onSkip={vm.onPresetSetupSkip}\n />\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <AgentsSettingsHeader a={vm.a} />\n\n {vm.displayError ? (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200\">\n {vm.displayError}\n </div>\n ) : null}\n\n {vm.loading ? (\n <p className=\"text-sm text-fg-muted\">{vm.a.loading}</p>\n ) : vm.data ? (\n <AgentsListGrid\n a={vm.a}\n agents={vm.data.agents}\n searchQuery={vm.listSearchQuery}\n onOpenAgent={(id) => vm.navigate(agentsAppDetailPath(id))}\n onChatWithAgent={(id) =>\n vm.navigate('/chat/new', { state: { agentId: id.trim().toLowerCase() } })\n }\n onNewAgent={vm.openAddAgentModal}\n busy={vm.busy}\n />\n ) : null}\n\n {vm.routeAgentId && vm.hasToken ? (\n <AgentsEditorModal\n open={Boolean(vm.routeAgentId)}\n onOpenChange={vm.onAgentModalOpenChange}\n a={vm.a}\n title={vm.modalTitle}\n subtitle={vm.modalSubtitle}\n panel={vm.panel}\n onPanelChange={vm.setPanel}\n onFooterSave={() => void vm.handleModalFooterSave()}\n footerSaveDisabled={vm.footerSaveDisabled}\n footerSavedFlash={vm.savedFlash}\n busy={vm.busy}\n >\n {vm.loading || !vm.data ? (\n <p className=\"text-sm text-fg-muted\">{vm.a.loading}</p>\n ) : (\n <AgentsEditorPanelContent {...vm.editorPanelProps} />\n )}\n </AgentsEditorModal>\n ) : null}\n\n <CreateAgentDialog\n open={vm.addAgentModalOpen}\n onOpenChange={(open) => {\n vm.setAddAgentModalOpen(open);\n if (!open) {\n vm.createWorkspaceSuggestedRef.current = '';\n vm.setCreateDisplayName('');\n vm.setCreateAgentId('');\n vm.setCreateDescription('');\n vm.setCreateWorkspace('');\n vm.setCreateModel('');\n vm.setCreateModalError(null);\n }\n }}\n a={vm.a}\n chat={vm.chat}\n busy={vm.busy}\n modalError={vm.createModalError}\n createDisplayName={vm.createDisplayName}\n setCreateDisplayName={vm.setCreateDisplayName}\n createAgentId={vm.createAgentId}\n setCreateAgentId={vm.setCreateAgentId}\n createDescription={vm.createDescription}\n setCreateDescription={vm.setCreateDescription}\n createWorkspace={vm.createWorkspace}\n setCreateWorkspace={vm.setCreateWorkspace}\n createModel={vm.createModel}\n setCreateModel={vm.setCreateModel}\n onCreate={vm.onCreate}\n onSuggestWorkspace={() => vm.applyCreateWorkspaceSuggestion()}\n />\n\n <AgentDeleteConfirmDialog\n open={vm.deleteDialogOpen}\n onOpenChange={(open) => {\n vm.setDeleteDialogOpen(open);\n if (!open) {\n vm.setDeleteTarget(null);\n vm.setDeleteConfirmText('');\n }\n }}\n busy={vm.busy}\n deletePurge={vm.deletePurge}\n deleteTarget={vm.deleteTarget}\n deleteConfirmText={vm.deleteConfirmText}\n onDeleteConfirmTextChange={vm.setDeleteConfirmText}\n onConfirm={() => {\n if (!vm.deleteTarget) return;\n void vm.performDelete(vm.deleteTarget, vm.deletePurge);\n }}\n onCancel={() => vm.setDeleteDialogOpen(false)}\n a={vm.a}\n />\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function AgentDefaultsField({\n label,\n description,\n children,\n}: {\n label: string;\n description: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-sm font-medium text-fg\">{label}</div>\n {children}\n <p className=\"text-xs leading-relaxed text-fg-subtle\">{description}</p>\n </div>\n );\n}\n","import { Cpu, SlidersHorizontal, Zap } from 'lucide-react';\n\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nconst THINKING_KEYS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'adaptive'] as const;\n\nexport function AgentDefaultsBasicsPanel(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Cpu} title={a.cardModelsTitle} subtitle={a.label.model} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.model} description={a.desc.model}>\n <ModelSelector\n value={form.model}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(modelId) => update({ model: modelId })}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={SlidersHorizontal} title={a.cardGenerationTitle} subtitle={a.cardGenerationSubtitle} />\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.maxTokens} description={a.desc.maxTokens}>\n <input\n type=\"number\"\n className={inputClassName()}\n value={form.maxTokens}\n min={1}\n onChange={(e) => update({ maxTokens: Number.parseInt(e.target.value, 10) || 0 })}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.temperature} description={a.desc.temperature}>\n <input\n type=\"number\"\n className={inputClassName()}\n value={form.temperature}\n min={0}\n max={2}\n step={0.1}\n onChange={(e) => update({ temperature: Number.parseFloat(e.target.value) || 0 })}\n />\n </AgentDefaultsField>\n <div className=\"sm:col-span-2\">\n <AgentDefaultsField label={a.label.maxToolIterations} description={a.desc.maxToolIterations}>\n <input\n type=\"number\"\n className={inputClassName()}\n value={form.maxToolIterations}\n min={1}\n onChange={(e) => update({ maxToolIterations: Number.parseInt(e.target.value, 10) || 0 })}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Zap} title={a.cardBehaviorTitle} subtitle={a.cardBehaviorSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.thinkingDefault} description={a.desc.thinkingDefault}>\n <select\n className={selectClassName()}\n value={form.thinkingDefault}\n onChange={(e) => update({ thinkingDefault: e.target.value })}\n >\n {THINKING_KEYS.map((k) => (\n <option key={k} value={k}>\n {chat.thinkingLevels[k]}\n </option>\n ))}\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.reasoningDefault} description={a.desc.reasoningDefault}>\n <select\n className={selectClassName()}\n value={form.reasoningDefault}\n onChange={(e) => update({ reasoningDefault: e.target.value })}\n >\n <option value=\"off\">{a.reasoning.off}</option>\n <option value=\"on\">{a.reasoning.on}</option>\n <option value=\"stream\">{a.reasoning.stream}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.verboseDefault} description={a.desc.verboseDefault}>\n <select\n className={selectClassName()}\n value={form.verboseDefault}\n onChange={(e) => update({ verboseDefault: e.target.value })}\n >\n <option value=\"off\">{a.verbose.off}</option>\n <option value=\"on\">{a.verbose.on}</option>\n <option value=\"full\">{a.verbose.full}</option>\n </select>\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Globe } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsBrowserPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Globe} title={a.cardBrowserTitle} subtitle={a.cardBrowserSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.browserEnabled} description={a.desc.browserEnabled}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.browserEnabled}\n onChange={(e) => update({ browserEnabled: e.target.checked })}\n />\n <span>{a.browserEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserHeadless} description={a.desc.browserHeadless}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.browserHeadless}\n onChange={(e) => update({ browserHeadless: e.target.checked })}\n />\n <span>{a.browserHeadlessOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserAllowPrivateUrls} description={a.desc.browserAllowPrivateUrls}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.browserAllowPrivateUrls}\n onChange={(e) => update({ browserAllowPrivateUrls: e.target.checked })}\n />\n <span>{a.browserAllowPrivateOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserCommandTimeout} description={a.desc.browserCommandTimeout}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={5}\n value={form.browserCommandTimeout ?? ''}\n placeholder=\"30\"\n onChange={(e) => {\n const v = e.target.value;\n update({ browserCommandTimeout: v === '' ? undefined : Number.parseInt(v, 10) });\n }}\n />\n </AgentDefaultsField>\n </div>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.browserCloudProvider} description={a.desc.browserCloudProvider}>\n <select\n className={selectClassName()}\n value={form.browserCloudProvider}\n onChange={(e) =>\n update({\n browserCloudProvider: e.target.value as 'local' | 'browserbase' | 'browser-use',\n })\n }\n >\n <option value=\"local\">{a.browserCloudProviderLocal}</option>\n <option value=\"browserbase\">{a.browserCloudProviderBrowserbase}</option>\n <option value=\"browser-use\">{a.browserCloudProviderBrowserUse}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserDialogPolicy} description={a.desc.browserDialogPolicy}>\n <select\n className={selectClassName()}\n value={form.browserDialogPolicy}\n onChange={(e) =>\n update({\n browserDialogPolicy: e.target.value as\n | 'must_respond'\n | 'auto_dismiss'\n | 'auto_accept',\n })\n }\n >\n <option value=\"must_respond\">{a.browserDialogPolicyMustRespond}</option>\n <option value=\"auto_dismiss\">{a.browserDialogPolicyAutoDismiss}</option>\n <option value=\"auto_accept\">{a.browserDialogPolicyAutoAccept}</option>\n </select>\n </AgentDefaultsField>\n </div>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={a.label.browserCdpUrl} description={a.desc.browserCdpUrl}>\n <input\n type=\"text\"\n className={inputClassName()}\n value={form.browserCdpUrl}\n placeholder=\"ws://localhost:9222\"\n onChange={(e) => update({ browserCdpUrl: e.target.value })}\n autoComplete=\"off\"\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.browserDialogTimeout} description={a.desc.browserDialogTimeout}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.browserDialogTimeout ?? ''}\n placeholder=\"300\"\n onChange={(e) => {\n const v = e.target.value;\n update({ browserDialogTimeout: v === '' ? undefined : Number.parseInt(v, 10) });\n }}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { fetchGatewayAgents } from '@/features/settings/agents-admin-api';\n\nexport function useBuiltinToolIdsLoad(enabled: boolean, hasToken: boolean) {\n const [builtinToolIds, setBuiltinToolIds] = useState<string[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!enabled || !hasToken) {\n return;\n }\n let cancelled = false;\n setLoading(true);\n void fetchGatewayAgents()\n .then((p) => {\n if (!cancelled) {\n setBuiltinToolIds(Array.isArray(p.builtinToolIds) ? p.builtinToolIds : []);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setBuiltinToolIds([]);\n }\n })\n .finally(() => {\n if (!cancelled) {\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [enabled, hasToken]);\n\n return { builtinToolIds, loading };\n}\n","import { Wrench } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { BuiltinToolsDisableUi, sortedDisableList } from '../builtin-tools-disable-ui';\nimport type { BuiltinToolUiGroupKey } from '../builtin-tool-disable-groups';\nimport { useBuiltinToolIdsLoad } from '../hooks/use-builtin-tool-ids';\n\nexport function AgentDefaultsBuiltinToolsDisableSection(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const agentsTab = m.agentsSettings;\n const token = useGatewayStore((s) => s.token);\n const hasToken = Boolean(token);\n const { builtinToolIds, loading } = useBuiltinToolIdsLoad(true, hasToken);\n\n const disableSet = useMemo(\n () => new Set(form.toolsDisable.map((s) => s.trim()).filter(Boolean)),\n [form.toolsDisable],\n );\n\n const unknownDisabled = useMemo(\n () =>\n form.toolsDisable\n .map((s) => s.trim())\n .filter(Boolean)\n .filter((id) => !builtinToolIds.includes(id))\n .sort((x, y) => x.localeCompare(y)),\n [form.toolsDisable, builtinToolIds],\n );\n\n const onDisableSetChange = useCallback(\n (next: Set<string>) => {\n update({ toolsDisable: sortedDisableList(next) });\n },\n [update],\n );\n\n const groups = agentsTab.toolsDisableGroups;\n const getGroupTitle = useCallback((key: BuiltinToolUiGroupKey) => groups[key], [groups]);\n\n const getToolDescription = useCallback(\n (tid: string) =>\n tid in agentsTab.toolDescriptions\n ? agentsTab.toolDescriptions[tid as keyof typeof agentsTab.toolDescriptions]\n : '',\n [agentsTab.toolDescriptions],\n );\n\n return (\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Wrench} title={x.cardToolsDisableTitle} subtitle={x.cardToolsDisableSubtitle} />\n <AgentDefaultsField label={x.toolsDisableFieldLabel} description={x.toolsDisableHint}>\n <div className=\"flex flex-col gap-3\">\n {!hasToken ? (\n <p className=\"text-xs text-fg-muted\">{a.needToken}</p>\n ) : (\n <BuiltinToolsDisableUi\n mode=\"defaults\"\n builtinToolIds={builtinToolIds}\n loading={loading}\n disableSet={disableSet}\n onDisableSetChange={onDisableSetChange}\n unknownDisabledIds={unknownDisabled}\n getToolDescription={getToolDescription}\n getGroupTitle={getGroupTitle}\n quickActionsDisabled={loading}\n labels={{\n loadingBuiltin: x.toolsDisableLoadingBuiltin,\n emptyBuiltin: x.toolsDisableEmptyBuiltin,\n quickActionsLabel: x.toolsDisableQuickActionsLabel,\n quickEnableAll: x.toolsDisableQuickEnableAll,\n quickDisableAll: x.toolsDisableQuickDisableAll,\n quickReadOnlyWorkspace: x.toolsDisableQuickReadOnlyWorkspace,\n quickHighRiskOff: x.toolsDisableQuickHighRiskOff,\n quickNoOutbound: x.toolsDisableQuickNoOutbound,\n notInBuiltin: x.toolsDisableNotInBuiltin,\n lockedByDefaults: agentsTab.toolsLockedByDefaults,\n }}\n />\n )}\n </div>\n </AgentDefaultsField>\n </SettingsFormSection>\n );\n}\n","import { Code2, FileText } from 'lucide-react';\n\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\nimport { AgentDefaultsBuiltinToolsDisableSection } from './builtin-tools-disable-section';\n\nexport function AgentDefaultsCapabilitiesPanel(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={FileText}\n title={x.cardWebExtractTitle}\n subtitle={x.cardWebExtractSubtitle}\n />\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <div className=\"sm:col-span-2\">\n <AgentDefaultsField label={x.webExtractModel} description={x.webExtractModelDesc}>\n <ModelSelector\n value={form.webExtract.model}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(modelId) => update({ webExtract: { ...form.webExtract, model: modelId } })}\n />\n </AgentDefaultsField>\n </div>\n <AgentDefaultsField label={x.webExtractMaxLength} description={x.webExtractMaxLengthDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.webExtract.maxLength ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n webExtract: {\n ...form.webExtract,\n maxLength: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Code2} title={x.cardDelegateTitle} subtitle={x.cardDelegateSubtitle} />\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.delegateEnabled} description={x.delegateEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.delegate.enabled}\n onChange={(e) => update({ delegate: { ...form.delegate, enabled: e.target.checked } })}\n />\n <span>{x.delegateEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.executeCodeEnabled} description={x.executeCodeEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.executeCode.enabled}\n onChange={(e) =>\n update({ executeCode: { ...form.executeCode, enabled: e.target.checked } })\n }\n />\n <span>{x.executeCodeEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n\n <AgentDefaultsBuiltinToolsDisableSection {...props} />\n </div>\n );\n}\n","import { Layers2, Scissors, Timer } from 'lucide-react';\n\nimport type { AgentDefaultsState } from '@/features/settings/config-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsContextPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Timer} title={x.cardLimitsTitle} subtitle={x.cardLimitsSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.maxTaskDurationMs} description={x.maxTaskDurationMsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n max={240}\n step={1}\n value={form.maxTaskDurationMinutes ?? ''}\n placeholder={x.maxTaskDurationPlaceholder}\n onChange={(e) => {\n const v = e.target.value;\n if (v === '') {\n update({ maxTaskDurationMinutes: undefined });\n return;\n }\n const num = Number.parseInt(v, 10);\n if (Number.isNaN(num)) {\n return;\n }\n update({ maxTaskDurationMinutes: Math.min(240, Math.max(1, num)) });\n }}\n />\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.maxRequestsPerTurn} description={x.maxRequestsPerTurnDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={10}\n max={200}\n value={form.maxRequestsPerTurn}\n onChange={(e) => update({ maxRequestsPerTurn: Number.parseInt(e.target.value, 10) || 50 })}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.maxToolFailuresPerTurn} description={x.maxToolFailuresPerTurnDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n max={20}\n value={form.maxToolFailuresPerTurn}\n onChange={(e) => update({ maxToolFailuresPerTurn: Number.parseInt(e.target.value, 10) || 3 })}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Layers2} title={x.cardCompactionTitle} subtitle={x.cardCompactionSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.compactionEnabled} description={x.compactionEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.compaction.enabled}\n onChange={(e) =>\n update({ compaction: { ...form.compaction, enabled: e.target.checked } })\n }\n />\n <span>{x.compactionEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.compactionMode} description={x.compactionModeDesc}>\n <select\n className={selectClassName()}\n value={form.compaction.mode}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n mode: e.target.value as AgentDefaultsState['compaction']['mode'],\n },\n })\n }\n >\n <option value=\"default\">{x.compactionModeDefault}</option>\n <option value=\"safeguard\">{x.compactionModeSafeguard}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reserveTokens} description={x.reserveTokensDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1000}\n value={form.compaction.reserveTokens}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n reserveTokens: Number.parseInt(e.target.value, 10) || 0,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.triggerThreshold} description={x.triggerThresholdDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0.5}\n max={0.95}\n step={0.05}\n value={form.compaction.triggerThreshold}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n triggerThreshold: Number.parseFloat(e.target.value) || 0.8,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.minMessagesBeforeCompact} description={x.minMessagesBeforeCompactDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.compaction.minMessagesBeforeCompact}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n minMessagesBeforeCompact: Number.parseInt(e.target.value, 10) || 10,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.keepRecentMessages} description={x.keepRecentMessagesDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n value={form.compaction.keepRecentMessages}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n keepRecentMessages: Number.parseInt(e.target.value, 10) || 5,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.evictionWindow} description={x.evictionWindowDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0.1}\n max={0.5}\n step={0.05}\n value={form.compaction.evictionWindow}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n evictionWindow: Number.parseFloat(e.target.value) || 0.2,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.retentionWindow} description={x.retentionWindowDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={3}\n max={20}\n value={form.compaction.retentionWindow}\n onChange={(e) =>\n update({\n compaction: {\n ...form.compaction,\n retentionWindow: Number.parseInt(e.target.value, 10) || 6,\n },\n })\n }\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Scissors} title={x.cardPruningTitle} subtitle={x.cardPruningSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.pruningEnabled} description={x.pruningEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.pruning.enabled}\n onChange={(e) => update({ pruning: { ...form.pruning, enabled: e.target.checked } })}\n />\n <span>{x.pruningEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.maxToolResultChars} description={x.maxToolResultCharsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1000}\n value={form.pruning.maxToolResultChars}\n onChange={(e) =>\n update({\n pruning: {\n ...form.pruning,\n maxToolResultChars: Number.parseInt(e.target.value, 10) || 10000,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.headKeepRatio} description={x.headKeepRatioDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n max={1}\n step={0.05}\n value={form.pruning.headKeepRatio}\n onChange={(e) =>\n update({\n pruning: { ...form.pruning, headKeepRatio: Number.parseFloat(e.target.value) || 0.3 },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.tailKeepRatio} description={x.tailKeepRatioDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n max={1}\n step={0.05}\n value={form.pruning.tailKeepRatio}\n onChange={(e) =>\n update({\n pruning: { ...form.pruning, tailKeepRatio: Number.parseFloat(e.target.value) || 0.3 },\n })\n }\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Clock } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsExpertPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Clock} title={x.cardParamsTitle} subtitle={x.cardParamsSubtitle} />\n <AgentDefaultsField label={x.paramsJson} description={x.paramsJsonDesc}>\n <textarea\n className={cn(inputClassName(), 'min-h-[88px] resize-y font-mono text-xs')}\n value={form.paramsJson}\n placeholder=\"{}\"\n onChange={(e) => update({ paramsJson: e.target.value })}\n />\n </AgentDefaultsField>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Brain, Search, Sparkles } from 'lucide-react';\n\nimport { ModelSelector } from '@/features/chat/model-selector';\nimport type { AgentDefaultsState } from '@/features/settings/config-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName, selectClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsMemoryPanel(props: AgentDefaultsPanelProps) {\n const { a, chat, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Brain} title={x.cardMemoryTitle} subtitle={x.cardMemorySubtitle} />\n <div className=\"flex flex-col gap-5\">\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.memoryEnabled} description={x.memoryEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.memory.enabled}\n onChange={(e) => update({ memory: { ...form.memory, enabled: e.target.checked } })}\n />\n <span>{x.memoryEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.useEnhancedSystem} description={x.useEnhancedSystemDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.memory.useEnhancedSystem}\n onChange={(e) =>\n update({ memory: { ...form.memory, useEnhancedSystem: e.target.checked } })\n }\n />\n <span>{x.useEnhancedSystemOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.userProfileEnabled} description={x.userProfileEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.memory.userProfileEnabled}\n onChange={(e) =>\n update({ memory: { ...form.memory, userProfileEnabled: e.target.checked } })\n }\n />\n <span>{x.userProfileEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.memoryProvider} description={x.memoryProviderDesc}>\n <select\n className={selectClassName()}\n value={form.memory.provider}\n onChange={(e) =>\n update({\n memory: {\n ...form.memory,\n provider: e.target.value as AgentDefaultsState['memory']['provider'],\n },\n })\n }\n >\n <option value=\"\">{x.memoryProviderUnset}</option>\n <option value=\"none\">none</option>\n <option value=\"stub\">stub</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.injectionFrequency} description={x.injectionFrequencyDesc}>\n <select\n className={selectClassName()}\n value={form.memory.injectionFrequency}\n onChange={(e) =>\n update({\n memory: {\n ...form.memory,\n injectionFrequency: e.target.value as AgentDefaultsState['memory']['injectionFrequency'],\n },\n })\n }\n >\n <option value=\"\">{x.injectionFrequencyUnset}</option>\n <option value=\"every-turn\">{x.injectionEveryTurn}</option>\n <option value=\"first-turn\">{x.injectionFirstTurn}</option>\n </select>\n </AgentDefaultsField>\n <AgentDefaultsField label={x.memoryCharLimit} description={x.memoryCharLimitDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.memoryCharLimit ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n memoryCharLimit: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.userCharLimit} description={x.userCharLimitDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.userCharLimit ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n userCharLimit: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.contextCadence} description={x.contextCadenceDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.contextCadence ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n contextCadence: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.dialecticCadence} description={x.dialecticCadenceDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n value={form.memory.dialecticCadence ?? ''}\n placeholder=\"—\"\n onChange={(e) => {\n const v = e.target.value;\n update({\n memory: {\n ...form.memory,\n dialecticCadence: v === '' ? undefined : Number.parseInt(v, 10),\n },\n });\n }}\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Search} title={x.cardSessionSearchTitle} subtitle={x.cardSessionSearchSubtitle} />\n <AgentDefaultsField label={x.sessionSearchSummaryModel} description={x.sessionSearchSummaryModelDesc}>\n <ModelSelector\n value={form.sessionSearch.summaryModel}\n placeholder={chat.modelPlaceholder}\n searchPlaceholder={chat.modelSearchPlaceholder}\n noMatches={chat.modelNoMatches}\n onChange={(modelId) =>\n update({ sessionSearch: { ...form.sessionSearch, summaryModel: modelId } })\n }\n />\n </AgentDefaultsField>\n </SettingsFormSection>\n\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Sparkles} title={x.cardReviewTitle} subtitle={x.cardReviewSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={x.reviewEnabled} description={x.reviewEnabledDesc}>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-fg\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 shrink-0 rounded border-edge\"\n checked={form.backgroundReview.enabled}\n onChange={(e) =>\n update({ backgroundReview: { ...form.backgroundReview, enabled: e.target.checked } })\n }\n />\n <span>{x.reviewEnabledOn}</span>\n </label>\n </AgentDefaultsField>\n <div className=\"grid gap-5 sm:grid-cols-2\">\n <AgentDefaultsField label={x.memoryNudgeInterval} description={x.memoryNudgeIntervalDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n value={form.backgroundReview.memoryNudgeInterval}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n memoryNudgeInterval: Number.parseInt(e.target.value, 10) || 0,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.skillNudgeInterval} description={x.skillNudgeIntervalDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={0}\n value={form.backgroundReview.skillNudgeInterval}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n skillNudgeInterval: Number.parseInt(e.target.value, 10) || 0,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reviewMaxToolRounds} description={x.reviewMaxToolRoundsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={1}\n max={32}\n value={form.backgroundReview.maxToolRounds}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n maxToolRounds: Number.parseInt(e.target.value, 10) || 8,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reviewMaxHistoryMessages} description={x.reviewMaxHistoryMessagesDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={10}\n max={200}\n value={form.backgroundReview.maxHistoryMessages}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n maxHistoryMessages: Number.parseInt(e.target.value, 10) || 80,\n },\n })\n }\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={x.reviewMaxDurationMs} description={x.reviewMaxDurationMsDesc}>\n <input\n type=\"number\"\n className={inputClassName()}\n min={30}\n max={600}\n step={1}\n value={Math.round((form.backgroundReview.maxDurationMs ?? 120_000) / 1000)}\n onChange={(e) =>\n update({\n backgroundReview: {\n ...form.backgroundReview,\n maxDurationMs: (Number.parseInt(e.target.value, 10) || 120) * 1000,\n },\n })\n }\n />\n </AgentDefaultsField>\n </div>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Library } from 'lucide-react';\nimport { useCallback, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { Button } from '@/components/ui/button';\nimport type { SkillCatalogRow } from '@/features/settings/agents-admin-api';\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\nimport { messages } from '@/i18n/messages';\nimport { pathForTab } from '@/navigation';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { agentDefaultsQuickActionButtonClass } from '../defaults-field-styles';\nimport { useSkillsCatalogLoad } from '../hooks/use-agents-skills-catalog';\n\nfunction rowId(s: SkillCatalogRow): string {\n return (s.name || s.directoryId).trim();\n}\n\nfunction allowlistFromSelection(selected: Set<string>, catalogIds: string[]): string[] {\n const out: string[] = [];\n for (const id of catalogIds) {\n if (selected.has(id)) out.push(id);\n }\n const extra = [...selected].filter((id) => !catalogIds.includes(id)).sort();\n return [...out, ...extra];\n}\n\nexport function AgentDefaultsSkillsAllowlistPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const agentsTab = m.agentsSettings;\n const token = useGatewayStore((s) => s.token);\n const hasToken = Boolean(token);\n const { catalogForPick, skillsCatalogLoading } = useSkillsCatalogLoad(true, hasToken);\n\n const catalogIds = useMemo(() => catalogForPick.map(rowId), [catalogForPick]);\n\n const restrictMode = form.skillsAllowlist.length > 0;\n\n const allowSet = useMemo(\n () => new Set(form.skillsAllowlist.map((s) => s.trim()).filter(Boolean)),\n [form.skillsAllowlist],\n );\n\n const unknownAllowlistIds = useMemo(\n () => form.skillsAllowlist.filter((id) => id.trim() && !catalogIds.includes(id.trim())),\n [form.skillsAllowlist, catalogIds],\n );\n\n const syntheticUnknownRows: SkillCatalogRow[] = useMemo(\n () => unknownAllowlistIds.map((id) => ({ name: id.trim(), directoryId: id.trim() })),\n [unknownAllowlistIds],\n );\n\n const rowsToRender = useMemo(\n () => [...syntheticUnknownRows, ...catalogForPick],\n [syntheticUnknownRows, catalogForPick],\n );\n\n const setAllSkills = useCallback(() => {\n update({ skillsAllowlist: [] });\n }, [update]);\n\n const setRestrictWithAllCatalogSelected = useCallback(() => {\n update({ skillsAllowlist: [...catalogIds] });\n }, [update, catalogIds]);\n\n const toggleId = useCallback(\n (id: string, checked: boolean) => {\n const selected = new Set(form.skillsAllowlist.map((s) => s.trim()).filter(Boolean));\n if (checked) {\n selected.add(id);\n } else {\n selected.delete(id);\n }\n if (selected.size === 0) {\n update({ skillsAllowlist: [] });\n return;\n }\n update({ skillsAllowlist: allowlistFromSelection(selected, catalogIds) });\n },\n [form.skillsAllowlist, catalogIds, update],\n );\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Library} title={x.cardSkillsTitle} subtitle={x.cardSkillsSubtitle} />\n <AgentDefaultsField label={x.skillsAllowlist} description={x.skillsAllowlistDesc}>\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n onClick={setAllSkills}\n >\n {x.skillsAllowlistModeAll}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className={agentDefaultsQuickActionButtonClass}\n disabled={!restrictMode && catalogIds.length === 0}\n onClick={() => {\n if (restrictMode) {\n return;\n }\n setRestrictWithAllCatalogSelected();\n }}\n >\n {x.skillsAllowlistModeRestrict}\n </Button>\n </div>\n <Link\n to={pathForTab('skills')}\n className=\"shrink-0 text-xs font-medium text-accent-fg hover:underline\"\n >\n {agentsTab.skillsLibraryLink}\n </Link>\n </div>\n\n {!hasToken ? (\n <p className=\"text-xs text-fg-muted\">{a.needToken}</p>\n ) : skillsCatalogLoading ? (\n <p className=\"text-sm text-fg-muted\">{agentsTab.skillsCatalogLoading}</p>\n ) : rowsToRender.length === 0 ? (\n <p className=\"text-sm text-fg-muted\">{agentsTab.skillsEmptyCatalog}</p>\n ) : (\n <div\n className={cn(\n 'max-h-[min(50vh,22rem)] overflow-y-auto overscroll-contain pr-0.5',\n !restrictMode && 'pointer-events-none opacity-50',\n )}\n >\n <ul className=\"flex flex-col gap-2.5 text-sm\" role=\"list\">\n {rowsToRender.filter((s) => rowId(s)).map((s) => {\n const id = rowId(s);\n const on = restrictMode && allowSet.has(id);\n const desc = typeof s.description === 'string' ? s.description.trim() : '';\n const descLine = desc || agentsTab.skillsNoDescription;\n const unknown = !catalogIds.includes(id);\n return (\n <li\n key={id}\n className=\"h-16 shrink-0 overflow-hidden rounded-xl border border-edge-subtle bg-surface-panel/60 px-3 dark:border-edge-subtle\"\n >\n <label className=\"flex h-full cursor-pointer items-center gap-3 text-sm\">\n <input\n type=\"checkbox\"\n className=\"shrink-0 rounded border-edge\"\n checked={on}\n disabled={!restrictMode}\n onChange={() => toggleId(id, !on)}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n <div className=\"truncate font-mono text-xs font-medium text-fg\" title={id}>\n {id}\n {unknown ? (\n <span className=\"ml-1.5 font-sans text-[10px] font-normal text-fg-muted\">\n ({x.skillsAllowlistNotInCatalog})\n </span>\n ) : null}\n </div>\n <p\n className={cn(\n 'mt-0.5 truncate text-xs leading-tight text-fg-muted',\n !desc && 'italic text-fg-subtle',\n )}\n title={descLine}\n >\n {descLine}\n </p>\n </div>\n </label>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </AgentDefaultsField>\n </SettingsFormSection>\n </div>\n );\n}\n","import { ScrollText } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\nimport { cn } from '@/lib/cn';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsSystemPromptPanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n const x = a.advanced;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader\n icon={ScrollText}\n title={x.cardSystemPromptTitle}\n subtitle={x.cardSystemPromptSubtitle}\n />\n <AgentDefaultsField label={x.systemPromptOverride} description={x.systemPromptOverrideDesc}>\n <textarea\n className={cn(inputClassName(), 'min-h-[140px] resize-y font-mono text-xs')}\n value={form.systemPromptOverride}\n placeholder={x.systemPromptPlaceholder}\n onChange={(e) => update({ systemPromptOverride: e.target.value })}\n />\n </AgentDefaultsField>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Folder } from 'lucide-react';\n\nimport { SettingsFormSection, SettingsFormSectionHeader } from '@/features/settings/settings-form-section';\n\nimport { AgentDefaultsField } from '../agent-defaults-field';\nimport type { AgentDefaultsPanelProps } from '../agent-defaults-panel-props';\nimport { inputClassName } from '../defaults-field-styles';\n\nexport function AgentDefaultsWorkspacePanel(props: AgentDefaultsPanelProps) {\n const { a, form, update } = props;\n\n return (\n <div className=\"flex flex-col gap-5\">\n <SettingsFormSection>\n <SettingsFormSectionHeader icon={Folder} title={a.cardWorkspaceTitle} subtitle={a.cardWorkspaceSubtitle} />\n <div className=\"flex flex-col gap-5\">\n <AgentDefaultsField label={a.label.workspace} description={a.desc.workspace}>\n <input\n type=\"text\"\n className={inputClassName()}\n value={form.workspace}\n onChange={(e) => update({ workspace: e.target.value })}\n autoComplete=\"off\"\n />\n </AgentDefaultsField>\n <AgentDefaultsField label={a.label.mediaMaxMb} description={a.desc.mediaMaxMb}>\n <input\n type=\"number\"\n min={1}\n step={1}\n className={inputClassName()}\n value={form.mediaMaxMb ?? ''}\n placeholder=\"20\"\n onChange={(e) => {\n const v = e.target.value;\n update({ mediaMaxMb: v === '' ? undefined : Number(v) });\n }}\n />\n </AgentDefaultsField>\n </div>\n </SettingsFormSection>\n </div>\n );\n}\n","import { Cpu } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { messages } from '@/i18n/messages';\nimport type { SettingsSectionId } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport type { UseAgentDefaultsFormResult } from './use-agent-defaults-form';\n\nexport function AgentDefaultsRouteLayout(props: {\n sectionId: SettingsSectionId;\n intro: string;\n vm: UseAgentDefaultsFormResult;\n children: ReactNode;\n}) {\n const { sectionId, intro, vm, children } = props;\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentSettings;\n\n const pageTitle = m.settingsSections[sectionId] ?? sectionId;\n\n if (!vm.hasToken) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10\">\n <div className=\"flex items-start gap-3 rounded-2xl bg-surface-base p-6\">\n <Cpu className=\"mt-0.5 size-5 shrink-0 text-fg-subtle\" strokeWidth={1.75} />\n <div>\n <h1 className=\"text-base font-semibold text-fg\">{pageTitle}</h1>\n <p className=\"mt-1 text-sm text-fg-muted\">{a.needToken}</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (vm.loading) {\n return (\n <div className=\"mx-auto w-full max-w-app-main px-4 py-8\">\n <div className=\"h-8 w-48 animate-pulse rounded bg-surface-hover\" />\n <div className=\"mt-6 h-32 animate-pulse rounded-xl bg-surface-hover\" />\n <p className=\"mt-4 text-sm text-fg-muted\">{m.logs.loading}</p>\n </div>\n );\n }\n\n if (!vm.form) {\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-3 px-4 py-10\">\n <p className=\"text-sm text-fg-muted\">{vm.error ?? vm.fetchError ?? a.loadError}</p>\n <Button type=\"button\" variant=\"secondary\" onClick={() => void vm.mutate()}>\n {m.logs.refresh}\n </Button>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-8\">\n <header className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-lg font-semibold tracking-tight text-fg\">{pageTitle}</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-fg-muted\">{intro}</p>\n <p className=\"mt-1 text-xs text-fg-subtle\">{a.sectionDesc}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {vm.saveOk ? <span className=\"text-sm text-fg-muted\">{a.saved}</span> : null}\n <Button type=\"button\" variant=\"secondary\" disabled={!vm.dirty || vm.saving} onClick={vm.discard}>\n {a.discard}\n </Button>\n <Button type=\"button\" variant=\"primary\" disabled={!vm.dirty || vm.saving} onClick={() => void vm.save()}>\n {vm.saving ? a.saving : a.save}\n </Button>\n </div>\n </header>\n\n {vm.error ? (\n <div\n className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-400\"\n role=\"alert\"\n >\n {vm.error}\n </div>\n ) : null}\n\n <div className=\"flex min-w-0 flex-col gap-5 pb-8\">{children}</div>\n </div>\n );\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\n// --- Nested shapes (align with `src/config/schema.ts` AgentDefaultsSchema) ---\n\nexport type AgentDefaultsCompactionState = {\n enabled: boolean;\n mode: 'default' | 'safeguard';\n reserveTokens: number;\n triggerThreshold: number;\n minMessagesBeforeCompact: number;\n keepRecentMessages: number;\n evictionWindow: number;\n retentionWindow: number;\n};\n\nexport type AgentDefaultsPruningState = {\n enabled: boolean;\n maxToolResultChars: number;\n headKeepRatio: number;\n tailKeepRatio: number;\n};\n\nexport type AgentDefaultsMemoryState = {\n enabled: boolean;\n useEnhancedSystem: boolean;\n userProfileEnabled: boolean;\n provider: '' | 'none' | 'stub';\n injectionFrequency: '' | 'every-turn' | 'first-turn';\n memoryCharLimit: number | undefined;\n userCharLimit: number | undefined;\n contextCadence: number | undefined;\n dialecticCadence: number | undefined;\n};\n\nexport type AgentDefaultsSessionSearchState = {\n summaryModel: string;\n};\n\nexport type AgentDefaultsBackgroundReviewState = {\n enabled: boolean;\n memoryNudgeInterval: number;\n skillNudgeInterval: number;\n maxToolRounds: number;\n maxHistoryMessages: number;\n maxDurationMs: number;\n};\n\nexport type AgentDefaultsWebExtractState = {\n model: string;\n maxLength: number | undefined;\n};\n\nexport type AgentDefaultsDelegateState = { enabled: boolean };\nexport type AgentDefaultsExecuteCodeState = { enabled: boolean };\n\nexport interface AgentDefaultsState {\n model: string;\n /** provider/model refs tried when the primary fails (stored as `agents.defaults.model.fallbacks`). */\n modelFallbacks: string[];\n imageModel: string;\n imageModelFallbacks: string[];\n imageGenerationModel: string;\n imageGenerationModelFallbacks: string[];\n /** Per-call timeout (ms) for image generation; null = inherit gateway default. */\n imageGenerationModelTimeoutMs: number | null;\n /** Sweep every configured provider when primary chain fails. */\n imageGenerationModelAutoProviderFallback: boolean;\n mediaMaxMb: number | undefined;\n maxTokens: number;\n temperature: number;\n maxToolIterations: number;\n /** Config `maxTaskDurationMs` — UI stores whole minutes (empty = unset / gateway default). */\n maxTaskDurationMinutes: number | undefined;\n maxRequestsPerTurn: number;\n maxToolFailuresPerTurn: number;\n workspace: string;\n /** Playwright `browser_*` tools (`agents.defaults.browser.enabled`). */\n browserEnabled: boolean;\n /** Headless Chromium when browser tools are on (`agents.defaults.browser.headless`, default true). */\n browserHeadless: boolean;\n /** Skip private-IP blocking (cloud metadata always blocked). */\n browserAllowPrivateUrls: boolean;\n /** Per-command timeout in seconds (default 30). */\n browserCommandTimeout: number | undefined;\n /** Browser backend: local, browserbase, or browser-use. */\n browserCloudProvider: 'local' | 'browserbase' | 'browser-use';\n /** Direct CDP WebSocket endpoint URL. */\n browserCdpUrl: string;\n /** JS dialog handling policy. */\n browserDialogPolicy: 'must_respond' | 'auto_dismiss' | 'auto_accept';\n /** Dialog auto-timeout in seconds (default 300). */\n browserDialogTimeout: number | undefined;\n thinkingDefault: string;\n reasoningDefault: string;\n verboseDefault: string;\n compaction: AgentDefaultsCompactionState;\n pruning: AgentDefaultsPruningState;\n memory: AgentDefaultsMemoryState;\n sessionSearch: AgentDefaultsSessionSearchState;\n backgroundReview: AgentDefaultsBackgroundReviewState;\n webExtract: AgentDefaultsWebExtractState;\n delegate: AgentDefaultsDelegateState;\n executeCode: AgentDefaultsExecuteCodeState;\n systemPromptOverride: string;\n /** Maps to `agents.defaults.skills` (allowlist). */\n skillsAllowlist: string[];\n /** Maps to `agents.defaults.tools.disable`. */\n toolsDisable: string[];\n /** JSON for `agents.defaults.params`. */\n paramsJson: string;\n}\n\nconst DEFAULT_COMPACTION: AgentDefaultsCompactionState = {\n enabled: true,\n mode: 'default',\n reserveTokens: 8000,\n triggerThreshold: 0.8,\n minMessagesBeforeCompact: 10,\n keepRecentMessages: 5,\n evictionWindow: 0.2,\n retentionWindow: 6,\n};\n\nconst DEFAULT_PRUNING: AgentDefaultsPruningState = {\n enabled: true,\n maxToolResultChars: 10000,\n headKeepRatio: 0.3,\n tailKeepRatio: 0.3,\n};\n\nconst DEFAULT_MEMORY: AgentDefaultsMemoryState = {\n enabled: true,\n useEnhancedSystem: true,\n userProfileEnabled: true,\n provider: '',\n injectionFrequency: '',\n memoryCharLimit: undefined,\n userCharLimit: undefined,\n contextCadence: undefined,\n dialecticCadence: undefined,\n};\n\nconst DEFAULT_SESSION_SEARCH: AgentDefaultsSessionSearchState = {\n summaryModel: '',\n};\n\nconst DEFAULT_BG_REVIEW: AgentDefaultsBackgroundReviewState = {\n enabled: false,\n memoryNudgeInterval: 10,\n skillNudgeInterval: 10,\n maxToolRounds: 8,\n maxHistoryMessages: 80,\n maxDurationMs: 120_000,\n};\n\nconst DEFAULT_WEB_EXTRACT: AgentDefaultsWebExtractState = {\n model: '',\n maxLength: undefined,\n};\n\nfunction normalizeModelRef(raw: unknown): string {\n if (raw == null) return '';\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object' && raw !== null && 'primary' in raw) {\n const p = (raw as { primary?: string }).primary;\n return typeof p === 'string' ? p : '';\n }\n return '';\n}\n\nfunction normalizeModelFallbacks(raw: unknown): string[] {\n if (typeof raw !== 'object' || raw === null || !('fallbacks' in raw)) {\n return [];\n }\n const f = (raw as { fallbacks?: unknown }).fallbacks;\n if (!Array.isArray(f)) {\n return [];\n }\n return f.filter((x): x is string => typeof x === 'string' && x.trim().length > 0);\n}\n\nfunction configFromApiResponse(res: unknown): unknown {\n if (!res || typeof res !== 'object') return undefined;\n const r = res as Record<string, unknown>;\n const payload = r.payload;\n if (payload && typeof payload === 'object' && 'config' in payload) {\n return (payload as { config?: unknown }).config;\n }\n if ('config' in r) return r.config;\n return undefined;\n}\n\nfunction truthyBrowserFlag(v: unknown): boolean {\n return v === true || v === 'true' || v === 1;\n}\n\ntype BrowserFieldsPick = Pick<\n AgentDefaultsState,\n | 'browserEnabled'\n | 'browserHeadless'\n | 'browserAllowPrivateUrls'\n | 'browserCommandTimeout'\n | 'browserCloudProvider'\n | 'browserCdpUrl'\n | 'browserDialogPolicy'\n | 'browserDialogTimeout'\n>;\n\nfunction parseBrowserFromDefaults(d: Record<string, unknown>): BrowserFieldsPick {\n const browser = d.browser;\n if (!browser || typeof browser !== 'object' || Array.isArray(browser)) {\n return {\n browserEnabled: false,\n browserHeadless: true,\n browserAllowPrivateUrls: false,\n browserCommandTimeout: undefined,\n browserCloudProvider: 'local',\n browserCdpUrl: '',\n browserDialogPolicy: 'auto_dismiss',\n browserDialogTimeout: undefined,\n };\n }\n const b = browser as Record<string, unknown>;\n const enabled = truthyBrowserFlag(b.enabled);\n const headlessRaw = b.headless;\n const headless =\n headlessRaw === false || headlessRaw === 'false' || headlessRaw === 0 ? false : true;\n\n const allowPrivateUrls = truthyBrowserFlag(b.allowPrivateUrls);\n\n const commandTimeout =\n typeof b.commandTimeout === 'number' && Number.isFinite(b.commandTimeout) && b.commandTimeout >= 5\n ? Math.floor(b.commandTimeout)\n : undefined;\n\n const cpRaw = b.cloudProvider;\n const cloudProvider: AgentDefaultsState['browserCloudProvider'] =\n cpRaw === 'browserbase' || cpRaw === 'browser-use' ? cpRaw : 'local';\n\n const cdpUrl = typeof b.cdpUrl === 'string' ? b.cdpUrl : '';\n\n const dpRaw = b.dialogPolicy;\n const dialogPolicy: AgentDefaultsState['browserDialogPolicy'] =\n dpRaw === 'must_respond' || dpRaw === 'auto_accept' ? dpRaw : 'auto_dismiss';\n\n const dialogTimeout =\n typeof b.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : undefined;\n\n return {\n browserEnabled: enabled,\n browserHeadless: headless,\n browserAllowPrivateUrls: allowPrivateUrls,\n browserCommandTimeout: commandTimeout,\n browserCloudProvider: cloudProvider,\n browserCdpUrl: cdpUrl,\n browserDialogPolicy: dialogPolicy,\n browserDialogTimeout: dialogTimeout,\n };\n}\n\nfunction parseCompaction(raw: unknown): AgentDefaultsCompactionState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_COMPACTION };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_COMPACTION.enabled,\n mode: p.mode === 'safeguard' ? 'safeguard' : 'default',\n reserveTokens:\n typeof p.reserveTokens === 'number' && Number.isFinite(p.reserveTokens)\n ? Math.floor(p.reserveTokens)\n : DEFAULT_COMPACTION.reserveTokens,\n triggerThreshold:\n typeof p.triggerThreshold === 'number' && Number.isFinite(p.triggerThreshold)\n ? p.triggerThreshold\n : DEFAULT_COMPACTION.triggerThreshold,\n minMessagesBeforeCompact:\n typeof p.minMessagesBeforeCompact === 'number' && Number.isFinite(p.minMessagesBeforeCompact)\n ? Math.floor(p.minMessagesBeforeCompact)\n : DEFAULT_COMPACTION.minMessagesBeforeCompact,\n keepRecentMessages:\n typeof p.keepRecentMessages === 'number' && Number.isFinite(p.keepRecentMessages)\n ? Math.floor(p.keepRecentMessages)\n : DEFAULT_COMPACTION.keepRecentMessages,\n evictionWindow:\n typeof p.evictionWindow === 'number' && Number.isFinite(p.evictionWindow)\n ? p.evictionWindow\n : DEFAULT_COMPACTION.evictionWindow,\n retentionWindow:\n typeof p.retentionWindow === 'number' && Number.isFinite(p.retentionWindow)\n ? Math.floor(p.retentionWindow)\n : DEFAULT_COMPACTION.retentionWindow,\n };\n}\n\nfunction parsePruning(raw: unknown): AgentDefaultsPruningState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_PRUNING };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_PRUNING.enabled,\n maxToolResultChars:\n typeof p.maxToolResultChars === 'number' && Number.isFinite(p.maxToolResultChars)\n ? Math.floor(p.maxToolResultChars)\n : DEFAULT_PRUNING.maxToolResultChars,\n headKeepRatio:\n typeof p.headKeepRatio === 'number' && Number.isFinite(p.headKeepRatio)\n ? p.headKeepRatio\n : DEFAULT_PRUNING.headKeepRatio,\n tailKeepRatio:\n typeof p.tailKeepRatio === 'number' && Number.isFinite(p.tailKeepRatio)\n ? p.tailKeepRatio\n : DEFAULT_PRUNING.tailKeepRatio,\n };\n}\n\nfunction parseMemory(raw: unknown): AgentDefaultsMemoryState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_MEMORY };\n }\n const p = raw as Record<string, unknown>;\n const providerRaw = p.provider;\n const provider: AgentDefaultsMemoryState['provider'] =\n providerRaw === 'none' || providerRaw === 'stub' ? providerRaw : '';\n const inj = p.injectionFrequency;\n const injectionFrequency: AgentDefaultsMemoryState['injectionFrequency'] =\n inj === 'every-turn' || inj === 'first-turn' ? inj : '';\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_MEMORY.enabled,\n useEnhancedSystem:\n typeof p.useEnhancedSystem === 'boolean' ? p.useEnhancedSystem : DEFAULT_MEMORY.useEnhancedSystem,\n userProfileEnabled:\n typeof p.userProfileEnabled === 'boolean' ? p.userProfileEnabled : DEFAULT_MEMORY.userProfileEnabled,\n provider,\n injectionFrequency,\n memoryCharLimit:\n typeof p.memoryCharLimit === 'number' && p.memoryCharLimit > 0\n ? Math.floor(p.memoryCharLimit)\n : undefined,\n userCharLimit:\n typeof p.userCharLimit === 'number' && p.userCharLimit > 0\n ? Math.floor(p.userCharLimit)\n : undefined,\n contextCadence:\n typeof p.contextCadence === 'number' && p.contextCadence >= 1\n ? Math.floor(p.contextCadence)\n : undefined,\n dialecticCadence:\n typeof p.dialecticCadence === 'number' && p.dialecticCadence >= 1\n ? Math.floor(p.dialecticCadence)\n : undefined,\n };\n}\n\nfunction parseSessionSearch(raw: unknown): AgentDefaultsSessionSearchState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_SESSION_SEARCH };\n }\n const p = raw as Record<string, unknown>;\n return {\n summaryModel: typeof p.summaryModel === 'string' ? p.summaryModel : '',\n };\n}\n\nfunction parseBackgroundReview(raw: unknown): AgentDefaultsBackgroundReviewState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_BG_REVIEW };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : DEFAULT_BG_REVIEW.enabled,\n memoryNudgeInterval:\n typeof p.memoryNudgeInterval === 'number' && p.memoryNudgeInterval >= 0\n ? Math.floor(p.memoryNudgeInterval)\n : DEFAULT_BG_REVIEW.memoryNudgeInterval,\n skillNudgeInterval:\n typeof p.skillNudgeInterval === 'number' && p.skillNudgeInterval >= 0\n ? Math.floor(p.skillNudgeInterval)\n : DEFAULT_BG_REVIEW.skillNudgeInterval,\n maxToolRounds:\n typeof p.maxToolRounds === 'number' && p.maxToolRounds >= 1 && p.maxToolRounds <= 32\n ? Math.floor(p.maxToolRounds)\n : DEFAULT_BG_REVIEW.maxToolRounds,\n maxHistoryMessages:\n typeof p.maxHistoryMessages === 'number' && p.maxHistoryMessages >= 10 && p.maxHistoryMessages <= 200\n ? Math.floor(p.maxHistoryMessages)\n : DEFAULT_BG_REVIEW.maxHistoryMessages,\n maxDurationMs:\n typeof p.maxDurationMs === 'number' && p.maxDurationMs >= 30_000 && p.maxDurationMs <= 600_000\n ? Math.floor(p.maxDurationMs)\n : DEFAULT_BG_REVIEW.maxDurationMs,\n };\n}\n\nfunction parseWebExtract(raw: unknown): AgentDefaultsWebExtractState {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { ...DEFAULT_WEB_EXTRACT };\n }\n const p = raw as Record<string, unknown>;\n return {\n model: typeof p.model === 'string' ? p.model : '',\n maxLength:\n typeof p.maxLength === 'number' && p.maxLength > 0 ? p.maxLength : undefined,\n };\n}\n\nfunction parseEnabledFlag(raw: unknown, def: boolean): { enabled: boolean } {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return { enabled: def };\n }\n const p = raw as Record<string, unknown>;\n return {\n enabled: typeof p.enabled === 'boolean' ? p.enabled : def,\n };\n}\n\nfunction parseStringList(raw: unknown): string[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n return raw.filter((x): x is string => typeof x === 'string');\n}\n\nfunction parseParamsJson(raw: unknown): string {\n if (raw === undefined || raw === null) {\n return '';\n }\n if (typeof raw === 'string') {\n const t = raw.trim();\n if (!t) {\n return '';\n }\n try {\n const parsed: unknown = JSON.parse(t);\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return JSON.stringify(parsed, null, 2);\n }\n } catch {\n return t;\n }\n return '';\n }\n if (typeof raw === 'object' && !Array.isArray(raw)) {\n try {\n return JSON.stringify(raw, null, 2);\n } catch {\n return '';\n }\n }\n return '';\n}\n\nfunction readImageGenerationTimeoutMsFromDefaults(d: Record<string, unknown>): number | null {\n const flat = d.imageGenerationModelTimeoutMs;\n if (typeof flat === 'number' && Number.isFinite(flat) && flat > 0) {\n return Math.floor(flat);\n }\n const igm = d.imageGenerationModel;\n if (igm && typeof igm === 'object' && !Array.isArray(igm)) {\n const tm = (igm as { timeoutMs?: unknown }).timeoutMs;\n if (typeof tm === 'number' && Number.isFinite(tm) && tm > 0) {\n return Math.floor(tm);\n }\n }\n return null;\n}\n\nfunction readImageGenerationAutoProviderFallbackFromDefaults(d: Record<string, unknown>): boolean {\n if (d.imageGenerationModelAutoProviderFallback === true) {\n return true;\n }\n const igm = d.imageGenerationModel;\n if (igm && typeof igm === 'object' && !Array.isArray(igm)) {\n return (igm as { autoProviderFallback?: unknown }).autoProviderFallback === true;\n }\n return false;\n}\n\n/** Parse `agents.defaults` from a gateway config root object. */\nexport function parseAgentDefaultsFromConfig(cfg: unknown): AgentDefaultsState {\n const agents =\n cfg && typeof cfg === 'object' && !Array.isArray(cfg) && 'agents' in cfg\n ? (cfg as { agents?: unknown }).agents\n : undefined;\n const defaults =\n agents && typeof agents === 'object' && !Array.isArray(agents) && 'defaults' in agents\n ? (agents as { defaults?: unknown }).defaults\n : undefined;\n const d =\n defaults && typeof defaults === 'object' && !Array.isArray(defaults)\n ? (defaults as Record<string, unknown>)\n : {};\n const mf = d.modelFallbacks;\n const modelFallbacksFromApi =\n Array.isArray(mf) && mf.every((x) => typeof x === 'string') ? mf : normalizeModelFallbacks(d.model);\n const imf = d.imageModelFallbacks;\n const imageModelFallbacksFromApi =\n Array.isArray(imf) && imf.every((x) => typeof x === 'string')\n ? imf\n : normalizeModelFallbacks(d.imageModel);\n const igf = d.imageGenerationModelFallbacks;\n const imageGenerationModelFallbacksFromApi =\n Array.isArray(igf) && igf.every((x) => typeof x === 'string')\n ? igf\n : normalizeModelFallbacks(d.imageGenerationModel);\n const browserFields = parseBrowserFromDefaults(d);\n const maxTaskMs =\n typeof d.maxTaskDurationMs === 'number' && Number.isFinite(d.maxTaskDurationMs)\n ? d.maxTaskDurationMs\n : undefined;\n const maxTaskDurationMinutes =\n maxTaskMs !== undefined ? Math.round(maxTaskMs / 60_000) : undefined;\n\n return {\n model: normalizeModelRef(d.model),\n modelFallbacks: modelFallbacksFromApi,\n imageModel: normalizeModelRef(d.imageModel),\n imageModelFallbacks: imageModelFallbacksFromApi,\n imageGenerationModel: normalizeModelRef(d.imageGenerationModel),\n imageGenerationModelFallbacks: imageGenerationModelFallbacksFromApi,\n imageGenerationModelTimeoutMs: readImageGenerationTimeoutMsFromDefaults(d),\n imageGenerationModelAutoProviderFallback: readImageGenerationAutoProviderFallbackFromDefaults(d),\n mediaMaxMb: typeof d.mediaMaxMb === 'number' && !Number.isNaN(d.mediaMaxMb) ? d.mediaMaxMb : undefined,\n maxTokens: typeof d.maxTokens === 'number' ? d.maxTokens : 8192,\n temperature: typeof d.temperature === 'number' ? d.temperature : 0.7,\n maxToolIterations: typeof d.maxToolIterations === 'number' ? d.maxToolIterations : 20,\n maxTaskDurationMinutes,\n maxRequestsPerTurn: typeof d.maxRequestsPerTurn === 'number' ? d.maxRequestsPerTurn : 50,\n maxToolFailuresPerTurn: typeof d.maxToolFailuresPerTurn === 'number' ? d.maxToolFailuresPerTurn : 3,\n workspace: typeof d.workspace === 'string' ? d.workspace : '~/.xopc/workspace',\n ...browserFields,\n thinkingDefault: typeof d.thinkingDefault === 'string' ? d.thinkingDefault : 'medium',\n reasoningDefault: typeof d.reasoningDefault === 'string' ? d.reasoningDefault : 'stream',\n verboseDefault: typeof d.verboseDefault === 'string' ? d.verboseDefault : 'full',\n compaction: parseCompaction(d.compaction),\n pruning: parsePruning(d.pruning),\n memory: parseMemory(d.memory),\n sessionSearch: parseSessionSearch(d.sessionSearch),\n backgroundReview: parseBackgroundReview(d.backgroundReview),\n webExtract: parseWebExtract(d.webExtract),\n delegate: parseEnabledFlag(d.delegate, false),\n executeCode: parseEnabledFlag(d.executeCode, false),\n systemPromptOverride: typeof d.systemPromptOverride === 'string' ? d.systemPromptOverride : '',\n skillsAllowlist: parseStringList(d.skills),\n toolsDisable: (() => {\n const t = d.tools;\n if (!t || typeof t !== 'object' || Array.isArray(t)) {\n return [] as string[];\n }\n const dis = (t as { disable?: unknown }).disable;\n return parseStringList(dis);\n })(),\n paramsJson: parseParamsJson(d.params),\n };\n}\n\nfunction buildMemoryPatch(m: AgentDefaultsMemoryState): Record<string, unknown> {\n const o: Record<string, unknown> = {\n enabled: m.enabled,\n useEnhancedSystem: m.useEnhancedSystem,\n userProfileEnabled: m.userProfileEnabled,\n };\n if (m.provider === 'none' || m.provider === 'stub') {\n o.provider = m.provider;\n } else {\n o.provider = null;\n }\n if (m.injectionFrequency === 'every-turn' || m.injectionFrequency === 'first-turn') {\n o.injectionFrequency = m.injectionFrequency;\n } else {\n o.injectionFrequency = null;\n }\n o.memoryCharLimit = m.memoryCharLimit ?? null;\n o.userCharLimit = m.userCharLimit ?? null;\n o.contextCadence = m.contextCadence ?? null;\n o.dialecticCadence = m.dialecticCadence ?? null;\n return o;\n}\n\n/** @throws {SyntaxError} on invalid JSON; {Error} if not a plain object. */\nexport function parseParamsJsonForSave(paramsJson: string): Record<string, unknown> | null {\n const trimmed = paramsJson.trim();\n if (!trimmed) {\n return null;\n }\n const parsed: unknown = JSON.parse(trimmed);\n if (parsed === null) {\n return null;\n }\n if (typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('params must be a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\nexport async function fetchAgentDefaults(): Promise<AgentDefaultsState> {\n const res = await fetchJson<{ ok?: boolean; payload?: { config?: unknown } }>(apiUrl('/api/config'));\n const cfg = configFromApiResponse(res);\n return parseAgentDefaultsFromConfig(cfg ?? {});\n}\n\nexport async function patchAgentDefaults(state: AgentDefaultsState): Promise<void> {\n const fallbacks = state.modelFallbacks.map((s) => s.trim()).filter(Boolean);\n const modelField =\n fallbacks.length > 0 ? { primary: state.model, fallbacks } : state.model;\n\n const imageFbs = state.imageModelFallbacks.map((s) => s.trim()).filter(Boolean);\n const imageModelField =\n imageFbs.length > 0 && state.imageModel.trim()\n ? { primary: state.imageModel.trim(), fallbacks: imageFbs }\n : state.imageModel || '';\n\n const imageGenFbs = state.imageGenerationModelFallbacks.map((s) => s.trim()).filter(Boolean);\n const imageGenPrimary = state.imageGenerationModel.trim();\n const imageGenTimeoutMs =\n typeof state.imageGenerationModelTimeoutMs === 'number' &&\n state.imageGenerationModelTimeoutMs > 0\n ? Math.floor(state.imageGenerationModelTimeoutMs)\n : null;\n const imageGenAuto = state.imageGenerationModelAutoProviderFallback === true;\n const imageGenerationModelField: unknown = (() => {\n const obj: Record<string, unknown> = {};\n if (imageGenPrimary) obj.primary = imageGenPrimary;\n if (imageGenFbs.length > 0) obj.fallbacks = imageGenFbs;\n if (imageGenTimeoutMs) obj.timeoutMs = imageGenTimeoutMs;\n if (imageGenAuto) obj.autoProviderFallback = true;\n if (Object.keys(obj).length === 0) return '';\n if (Object.keys(obj).length === 1 && typeof obj.primary === 'string') return obj.primary;\n return obj;\n })();\n\n const maxTaskDurationMs: number | null =\n state.maxTaskDurationMinutes === undefined || state.maxTaskDurationMinutes === null\n ? null\n : (() => {\n const n = Math.floor(state.maxTaskDurationMinutes);\n const ms = n * 60_000;\n if (ms < 60_000 || ms > 14_400_000) {\n return null;\n }\n return ms;\n })();\n\n const skillsClean = state.skillsAllowlist.map((s) => s.trim()).filter(Boolean);\n const toolsDisableClean = state.toolsDisable.map((s) => s.trim()).filter(Boolean);\n\n const paramsParsed = parseParamsJsonForSave(state.paramsJson);\n const params =\n paramsParsed === null || Object.keys(paramsParsed).length === 0 ? null : paramsParsed;\n\n const defaults: Record<string, unknown> = {\n model: modelField,\n imageModel: imageModelField,\n imageGenerationModel: imageGenerationModelField,\n mediaMaxMb: state.mediaMaxMb ?? null,\n maxTokens: state.maxTokens,\n temperature: state.temperature,\n maxToolIterations: state.maxToolIterations,\n maxTaskDurationMs,\n maxRequestsPerTurn: state.maxRequestsPerTurn,\n maxToolFailuresPerTurn: state.maxToolFailuresPerTurn,\n workspace: state.workspace,\n browser: {\n enabled: state.browserEnabled,\n headless: state.browserHeadless,\n allowPrivateUrls: state.browserAllowPrivateUrls,\n commandTimeout: state.browserCommandTimeout ?? null,\n cloudProvider: state.browserCloudProvider === 'local' ? null : state.browserCloudProvider,\n cdpUrl: state.browserCdpUrl.trim() || null,\n dialogPolicy: state.browserDialogPolicy === 'auto_dismiss' ? null : state.browserDialogPolicy,\n dialogTimeoutSeconds: state.browserDialogTimeout ?? null,\n },\n thinkingDefault: state.thinkingDefault,\n reasoningDefault: state.reasoningDefault,\n verboseDefault: state.verboseDefault,\n compaction: { ...state.compaction },\n pruning: { ...state.pruning },\n memory: buildMemoryPatch(state.memory),\n sessionSearch: {\n summaryModel: state.sessionSearch.summaryModel.trim() || null,\n },\n backgroundReview: {\n enabled: state.backgroundReview.enabled,\n memoryNudgeInterval: state.backgroundReview.memoryNudgeInterval,\n skillNudgeInterval: state.backgroundReview.skillNudgeInterval,\n maxToolRounds: state.backgroundReview.maxToolRounds,\n maxHistoryMessages: state.backgroundReview.maxHistoryMessages,\n maxDurationMs: state.backgroundReview.maxDurationMs,\n },\n webExtract: {\n model: state.webExtract.model.trim() || null,\n maxLength: state.webExtract.maxLength ?? null,\n },\n delegate: { enabled: state.delegate.enabled },\n executeCode: { enabled: state.executeCode.enabled },\n systemPromptOverride: state.systemPromptOverride.trim() || null,\n skills: skillsClean.length > 0 ? skillsClean : null,\n tools: { disable: toolsDisableClean.length > 0 ? toolsDisableClean : null },\n params,\n };\n\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n agents: { defaults },\n }),\n });\n void revalidateGatewayConfig();\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useGatewayConfigSwr } from '@/features/gateway/gateway-config-swr';\nimport {\n parseAgentDefaultsFromConfig,\n parseParamsJsonForSave,\n patchAgentDefaults,\n type AgentDefaultsState,\n} from '@/features/settings/config-api';\nimport type { MessageBundle } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\n\nexport type UseAgentDefaultsFormResult = {\n hasToken: boolean;\n loading: boolean;\n fetchError: string | null;\n form: AgentDefaultsState | null;\n update: (patch: Partial<AgentDefaultsState>) => void;\n dirty: boolean;\n saving: boolean;\n saveOk: boolean;\n error: string | null;\n setError: (e: string | null) => void;\n save: () => Promise<boolean>;\n discard: () => void;\n mutate: ReturnType<typeof useGatewayConfigSwr>['mutate'];\n};\n\nexport function useAgentDefaultsForm(a: MessageBundle['agentSettings']): UseAgentDefaultsFormResult {\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n\n const [form, setForm] = useState<AgentDefaultsState | null>(null);\n const [baseline, setBaseline] = useState<AgentDefaultsState | null>(null);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveOk, setSaveOk] = useState(false);\n const dirtyRef = useRef(false);\n\n const { data, error: swrError, isLoading, mutate } = useGatewayConfigSwr(hasToken);\n\n const parsed = useMemo(\n () =>\n data?.payload?.config !== undefined ? parseAgentDefaultsFromConfig(data.payload.config) : null,\n [data],\n );\n\n useEffect(() => {\n if (!hasToken) {\n setForm(null);\n setBaseline(null);\n dirtyRef.current = false;\n return;\n }\n if (parsed === null) return;\n if (!dirtyRef.current) {\n const snapshot = structuredClone(parsed);\n setForm(snapshot);\n setBaseline(structuredClone(snapshot));\n }\n }, [hasToken, parsed]);\n\n const loading = Boolean(hasToken && isLoading && data === undefined && !swrError);\n const fetchError =\n swrError instanceof Error ? swrError.message : swrError ? String(swrError) : null;\n\n const dirty = useMemo(() => {\n if (!form || !baseline) return false;\n return JSON.stringify(form) !== JSON.stringify(baseline);\n }, [form, baseline]);\n\n const update = useCallback((patch: Partial<AgentDefaultsState>) => {\n dirtyRef.current = true;\n setForm((f) => (f ? { ...f, ...patch } : null));\n }, []);\n\n const save = useCallback(async (): Promise<boolean> => {\n if (!form || saving) return false;\n setSaving(true);\n setError(null);\n setSaveOk(false);\n try {\n try {\n void parseParamsJsonForSave(form.paramsJson);\n } catch (e) {\n setError(\n e instanceof SyntaxError\n ? a.advanced.paramsInvalidJson\n : e instanceof Error\n ? e.message\n : a.advanced.paramsInvalidJson,\n );\n return false;\n }\n await patchAgentDefaults(form);\n dirtyRef.current = false;\n setBaseline(structuredClone(form));\n setSaveOk(true);\n window.setTimeout(() => setSaveOk(false), 2500);\n return true;\n } catch (e) {\n setError(e instanceof Error ? e.message : a.saveError);\n return false;\n } finally {\n setSaving(false);\n }\n }, [form, saving, a.saveError, a.advanced]);\n\n const discard = useCallback(() => {\n if (!baseline) return;\n dirtyRef.current = false;\n setForm(structuredClone(baseline));\n setError(null);\n setSaveOk(false);\n }, [baseline]);\n\n return {\n hasToken,\n loading,\n fetchError,\n form,\n update,\n dirty,\n saving,\n saveOk,\n error,\n setError,\n save,\n discard,\n mutate,\n };\n}\n","import { useMemo } from 'react';\n\nimport { messages } from '@/i18n/messages';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nimport type { AgentDefaultsPanelProps } from './agent-defaults-panel-props';\nimport { AgentDefaultsBasicsPanel } from './agent-defaults-panels/basics-panel';\nimport { AgentDefaultsBrowserPanel } from './agent-defaults-panels/browser-panel';\nimport { AgentDefaultsCapabilitiesPanel } from './agent-defaults-panels/capabilities-panel';\nimport { AgentDefaultsContextPanel } from './agent-defaults-panels/context-panel';\nimport { AgentDefaultsExpertPanel } from './agent-defaults-panels/expert-panel';\nimport { AgentDefaultsMemoryPanel } from './agent-defaults-panels/memory-panel';\nimport { AgentDefaultsSkillsAllowlistPanel } from './agent-defaults-panels/skills-allowlist-panel';\nimport { AgentDefaultsSystemPromptPanel } from './agent-defaults-panels/system-prompt-panel';\nimport { AgentDefaultsWorkspacePanel } from './agent-defaults-panels/workspace-panel';\nimport { AgentDefaultsRouteLayout } from './agent-defaults-route-layout';\nimport { useAgentDefaultsForm } from './use-agent-defaults-form';\n\nfunction useAgentDefaultsPageModel(): {\n vm: ReturnType<typeof useAgentDefaultsForm>;\n pp: AgentDefaultsPanelProps | null;\n a: ReturnType<typeof messages>['agentSettings'];\n} {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const a = m.agentSettings;\n const chat = m.chat;\n const vm = useAgentDefaultsForm(a);\n const pp = useMemo(() => {\n if (!vm.form) return null;\n return { form: vm.form, update: vm.update, a, chat };\n }, [vm.form, vm.update, a, chat]);\n return { vm, pp, a };\n}\n\nexport function AgentChatDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-chat\" intro={a.routeIntro.chat} vm={vm}>\n {pp ? <AgentDefaultsBasicsPanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentWorkspaceDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-workspace\" intro={a.routeIntro.workspace} vm={vm}>\n {pp ? <AgentDefaultsWorkspacePanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentBrowserDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-browser\" intro={a.routeIntro.browser} vm={vm}>\n {pp ? <AgentDefaultsBrowserPanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentRuntimeDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-runtime\" intro={a.routeIntro.runtime} vm={vm}>\n {pp ? (\n <div className=\"flex flex-col gap-8\">\n <AgentDefaultsContextPanel {...pp} />\n <AgentDefaultsMemoryPanel {...pp} />\n </div>\n ) : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentToolsDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-tools\" intro={a.routeIntro.tools} vm={vm}>\n {pp ? (\n <div className=\"flex flex-col gap-8\">\n <AgentDefaultsCapabilitiesPanel {...pp} />\n <AgentDefaultsSkillsAllowlistPanel {...pp} />\n <AgentDefaultsExpertPanel {...pp} />\n </div>\n ) : null}\n </AgentDefaultsRouteLayout>\n );\n}\n\nexport function AgentSystemPromptDefaultsPage() {\n const { vm, pp, a } = useAgentDefaultsPageModel();\n\n return (\n <AgentDefaultsRouteLayout sectionId=\"agent-system-prompt\" intro={a.routeIntro.systemPrompt} vm={vm}>\n {pp ? <AgentDefaultsSystemPromptPanel {...pp} /> : null}\n </AgentDefaultsRouteLayout>\n );\n}\n"],"mappings":"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CA,uBACA,YACA,eACA,aACA,wBACA,uBACA,mBACA,sBACA,eACA,qBACA,uBACA,kBACA,iBACA,oBACA,aACA,iBACA,gBACA,mBACA,iBACA,uBACA,sBACA,oBACA,kBACA,qBACA,mBACA,uBACA,qBACA,wBACA,qBACA,wBACA,uBACA,mBACA,gBACA,cACA,iBACA,qBACgC,CAkIhC,OAjIK,EAID,IAAU,YAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACI,WACJ,OACI,WACG,cACI,kBACG,qBACL,gBACG,mBACP,YACG,eACA,eACI,mBACR,WACV,eAAA,GACA,iBAAkB,EAClB,uBAAwB,EACxB,CAAA,CAIF,IAAU,WAEV,EAAA,EAAA,KAAC,GAAD,CAAoB,IAAG,QAAS,EAAS,GAAI,QAAS,EAAgB,cAAe,EAAmB,CAAA,CAIxG,IAAU,SAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACW,eACP,QACK,aACG,gBACI,qBACG,uBACX,YACG,eACF,aACU,wBACA,uBACtB,CAAA,CAIF,IAAU,SAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACI,WACJ,OACY,mBACG,sBACR,eACM,qBACnB,eAAA,GACA,CAAA,CAIF,IAAU,UAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACO,WACJ,OACgB,uBACN,kBACD,iBACG,oBACN,aACG,iBACD,gBACd,eAAA,GACA,CAAA,CAIF,IAAU,YAEV,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACW,mBACF,iBACf,gBAAiB,GACjB,sBAAuB,EACL,oBACF,kBACG,qBACD,mBAClB,gBAAiB,GACE,qBACG,wBACH,qBACG,wBACtB,kBAAmB,GACnB,iBAAkB,EAAM,iBACxB,gBAAiB,EAAM,gBACN,mBACH,gBACd,CAAA,CAIF,IAAU,QAAU,GAEpB,EAAA,EAAA,KAAC,GAAD,CACK,IACG,OACI,WACJ,OACO,cACE,iBACI,oBACnB,CAAA,EAIC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iCAAyB,EAAE,gBAAoB,CAAA,EAhI1D,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,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"}