From f820945d9fd574ce868fdfd70e49e06762a3d574 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Wed, 8 Apr 2026 14:01:38 +0100 Subject: [PATCH] refactor: decompose AgentSettingsBehaviorPageView + remove kyleosophy (#24141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove Kyleosophy alternative completion chimes (keeps original chime intact) - Extract 5 sub-components from the 717-line god component: - `PersonalInstructionsSettings` — user prompt textarea form - `SystemInstructionsSettings` — admin system prompt + TextPreviewDialog - `VirtualDesktopSettings` — admin desktop toggle - `WorkspaceAutostopSettings` — admin autostop toggle + duration form - `RetentionPeriodSettings` — admin retention toggle + number input - Parent is now a ~160-line layout shell - `isAnyPromptSaving` coupling preserved via prop - Add `docs/plans/` to `.gitignore` > 🤖 Written by a Coder Agent. Reviewed by a human. --- .gitignore | 3 + .../AgentSettingsBehaviorPageView.stories.tsx | 30 - .../AgentSettingsBehaviorPageView.tsx | 629 ++---------------- .../PersonalInstructionsSettings.tsx | 109 +++ .../components/RetentionPeriodSettings.tsx | 164 +++++ .../components/SystemInstructionsSettings.tsx | 164 +++++ .../components/VirtualDesktopSettings.tsx | 74 +++ .../components/WorkspaceAutostopSettings.tsx | 167 +++++ site/src/pages/AgentsPage/utils/chime.test.ts | 113 ---- site/src/pages/AgentsPage/utils/chime.ts | 84 +-- site/static/chime_1.mp3 | Bin 23867 -> 0 bytes site/static/chime_2.mp3 | Bin 6731 -> 0 bytes site/static/chime_3.mp3 | Bin 4223 -> 0 bytes site/static/chime_4.mp3 | Bin 10911 -> 0 bytes site/static/chime_5.mp3 | Bin 7149 -> 0 bytes site/static/chime_6.mp3 | Bin 25121 -> 0 bytes site/static/chime_7.mp3 | Bin 7985 -> 0 bytes site/static/chime_8.mp3 | Bin 4641 -> 0 bytes 18 files changed, 743 insertions(+), 794 deletions(-) create mode 100644 site/src/pages/AgentsPage/components/PersonalInstructionsSettings.tsx create mode 100644 site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx create mode 100644 site/src/pages/AgentsPage/components/SystemInstructionsSettings.tsx create mode 100644 site/src/pages/AgentsPage/components/VirtualDesktopSettings.tsx create mode 100644 site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx delete mode 100644 site/static/chime_1.mp3 delete mode 100644 site/static/chime_2.mp3 delete mode 100644 site/static/chime_3.mp3 delete mode 100644 site/static/chime_4.mp3 delete mode 100644 site/static/chime_5.mp3 delete mode 100644 site/static/chime_6.mp3 delete mode 100644 site/static/chime_7.mp3 delete mode 100644 site/static/chime_8.mp3 diff --git a/.gitignore b/.gitignore index ce82d56ca3..0732c41daa 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,6 @@ PLAN.md # Ignore any dev licenses license.txt +-e +# Agent planning documents (local working files). +docs/plans/ diff --git a/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.stories.tsx b/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.stories.tsx index e2520a40ba..c6ebfdf913 100644 --- a/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.stories.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.stories.tsx @@ -460,33 +460,3 @@ export const NoWarningForCleanPrompt: Story = { expect(canvas.queryByText(/invisible Unicode/)).toBeNull(); }, }; - -// ── Kyleosophy ───────────────────────────────────────────────── - -export const KylesophyToggle: Story = { - play: async ({ canvasElement }) => { - localStorage.removeItem("agents.kyleosophy"); - const canvas = within(canvasElement); - await canvas.findByText("Kyleosophy"); - await canvas.findByText(/Replace the standard completion chime/i); - const toggle = await canvas.findByRole("switch", { - name: "Enable Kyleosophy", - }); - expect(toggle).not.toBeChecked(); - }, -}; - -export const TogglesKyleosophy: Story = { - play: async ({ canvasElement }) => { - localStorage.removeItem("agents.kyleosophy"); - const canvas = within(canvasElement); - const toggle = await canvas.findByRole("switch", { - name: "Enable Kyleosophy", - }); - - await userEvent.click(toggle); - await waitFor(() => { - expect(localStorage.getItem("agents.kyleosophy")).toBe("true"); - }); - }, -}; diff --git a/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.tsx b/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.tsx index 2999f56113..9528f89225 100644 --- a/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsBehaviorPageView.tsx @@ -1,28 +1,12 @@ -import type { FC, FormEvent } from "react"; -import { useMemo, useState } from "react"; -import TextareaAutosize from "react-textarea-autosize"; +import type { FC } from "react"; import type * as TypesGen from "#/api/typesGenerated"; -import { Alert, AlertDescription } from "#/components/Alert/Alert"; -import { Button } from "#/components/Button/Button"; -import { Link } from "#/components/Link/Link"; -import { Switch } from "#/components/Switch/Switch"; -import { cn } from "#/utils/cn"; -import { countInvisibleCharacters } from "#/utils/invisibleUnicode"; -import { AdminBadge } from "./components/AdminBadge"; -import { DurationField } from "./components/DurationField/DurationField"; +import { PersonalInstructionsSettings } from "./components/PersonalInstructionsSettings"; +import { RetentionPeriodSettings } from "./components/RetentionPeriodSettings"; import { SectionHeader } from "./components/SectionHeader"; -import { TextPreviewDialog } from "./components/TextPreviewDialog"; +import { SystemInstructionsSettings } from "./components/SystemInstructionsSettings"; import { UserCompactionThresholdSettings } from "./components/UserCompactionThresholdSettings"; -import { - getKylesophyEnabled, - isKylesophyForced, - setKylesophyEnabled, -} from "./utils/chime"; - -const textareaMaxHeight = 240; -const textareaBaseClassName = - "max-h-[240px] w-full resize-none rounded-lg border border-border bg-surface-primary px-4 py-3 font-sans text-[13px] leading-relaxed text-content-primary placeholder:text-content-secondary focus:outline-none focus:ring-2 focus:ring-content-link/30"; -const textareaOverflowClassName = "overflow-y-auto [scrollbar-width:thin]"; +import { VirtualDesktopSettings } from "./components/VirtualDesktopSettings"; +import { WorkspaceAutostopSettings } from "./components/WorkspaceAutostopSettings"; interface MutationCallbacks { onSuccess?: () => void; @@ -130,193 +114,7 @@ export const AgentSettingsBehaviorPageView: FC< isSavingRetentionDays, isSaveRetentionDaysError, }) => { - // ── Local form state ── - const [localEdit, setLocalEdit] = useState(null); - const [localIncludeDefault, setLocalIncludeDefault] = useState< - boolean | null - >(null); - const [showDefaultPromptPreview, setShowDefaultPromptPreview] = - useState(false); - const [localUserEdit, setLocalUserEdit] = useState(null); - const [localTTLMs, setLocalTTLMs] = useState(null); - const [autostopToggled, setAutostopToggled] = useState(null); - const [localRetentionDays, setLocalRetentionDays] = useState( - null, - ); - const [retentionToggled, setRetentionToggled] = useState( - null, - ); - - // Overflow states are pure UI — managed locally in the view. - const [isUserPromptOverflowing, setIsUserPromptOverflowing] = useState(false); - const [isSystemPromptOverflowing, setIsSystemPromptOverflowing] = - useState(false); - const kylesophyForced = isKylesophyForced(); - const [kylesophyEnabled, setLocalKylesophy] = useState(getKylesophyEnabled); - - // ── Derived state ── - const hasLoadedSystemPrompt = systemPromptData !== undefined; - const serverPrompt = systemPromptData?.system_prompt ?? ""; - const serverIncludeDefault = systemPromptData?.include_default_system_prompt; - const defaultSystemPrompt = systemPromptData?.default_system_prompt ?? ""; - const systemPromptDraft = localEdit ?? serverPrompt; - const includeDefaultDraft = - localIncludeDefault ?? serverIncludeDefault ?? false; - - const serverUserPrompt = userPromptData?.custom_prompt ?? ""; - const userPromptDraft = localUserEdit ?? serverUserPrompt; - - const systemInvisibleCharCount = useMemo( - () => countInvisibleCharacters(systemPromptDraft), - [systemPromptDraft], - ); - const userInvisibleCharCount = useMemo( - () => countInvisibleCharacters(userPromptDraft), - [userPromptDraft], - ); - - const isPromptSaving = isSavingSystemPrompt || isSavingUserPrompt; - const isSystemPromptDirty = - hasLoadedSystemPrompt && - ((localEdit !== null && localEdit !== serverPrompt) || - (localIncludeDefault !== null && - localIncludeDefault !== serverIncludeDefault)); - const isSystemPromptDisabled = isPromptSaving || !hasLoadedSystemPrompt; - const isUserPromptDirty = - localUserEdit !== null && localUserEdit !== serverUserPrompt; - const desktopEnabled = desktopEnabledData?.enable_desktop ?? false; - const serverTTLMs = workspaceTTLData?.workspace_ttl_ms ?? 0; - const ttlMs = localTTLMs ?? serverTTLMs; - const isAutostopEnabled = autostopToggled ?? serverTTLMs > 0; - const isTTLDirty = localTTLMs !== null && localTTLMs !== serverTTLMs; - const maxTTLMs = 30 * 24 * 60 * 60_000; // 30 days - const isTTLOverMax = ttlMs > maxTTLMs; - const isTTLZero = isAutostopEnabled && ttlMs === 0; - - // ── Retention days derived state ── - const serverRetentionDays = retentionDaysData?.retention_days ?? 30; - const retentionDays = localRetentionDays ?? serverRetentionDays; - const isRetentionEnabled = retentionToggled ?? serverRetentionDays > 0; - const isRetentionDaysDirty = - localRetentionDays !== null && localRetentionDays !== serverRetentionDays; - const isRetentionDaysNegative = isRetentionEnabled && retentionDays < 0; - // Keep in sync with retentionDaysMaximum in coderd/exp_chats.go. - const retentionDaysMaximum = 3650; - const isRetentionDaysOverMax = retentionDays > retentionDaysMaximum; - const isRetentionDaysZero = isRetentionEnabled && retentionDays === 0; - - // ── Event handlers ── - const handleSaveSystemPrompt = (event: FormEvent) => { - event.preventDefault(); - if (!hasLoadedSystemPrompt || !isSystemPromptDirty) return; - onSaveSystemPrompt( - { - system_prompt: systemPromptDraft, - include_default_system_prompt: includeDefaultDraft, - }, - { - onSuccess: () => { - setLocalEdit(null); - setLocalIncludeDefault(null); - }, - }, - ); - }; - - const handleSaveUserPrompt = (event: FormEvent) => { - event.preventDefault(); - if (!isUserPromptDirty) return; - onSaveUserPrompt( - { custom_prompt: userPromptDraft }, - { onSuccess: () => setLocalUserEdit(null) }, - ); - }; - - const resetAutostopState = () => { - setLocalTTLMs(null); - setAutostopToggled(null); - }; - - const handleToggleAutostop = (checked: boolean) => { - if (checked) { - // Defensive: restore server value if query cache is - // stale; otherwise default to 1 hour. - const defaultTTL = serverTTLMs > 0 ? serverTTLMs : 3_600_000; - setAutostopToggled(true); - setLocalTTLMs(defaultTTL); - onSaveWorkspaceTTL( - { workspace_ttl_ms: defaultTTL }, - { onSuccess: resetAutostopState, onError: resetAutostopState }, - ); - } else { - setAutostopToggled(false); - setLocalTTLMs(0); - onSaveWorkspaceTTL( - { workspace_ttl_ms: 0 }, - { onSuccess: resetAutostopState, onError: resetAutostopState }, - ); - } - }; - - const handleSaveChatWorkspaceTTL = (event: FormEvent) => { - event.preventDefault(); - if (!isTTLDirty || isSavingWorkspaceTTL) return; - onSaveWorkspaceTTL( - { workspace_ttl_ms: localTTLMs ?? 0 }, - { - onSuccess: resetAutostopState, - onError: () => setAutostopToggled(null), - }, - ); - }; - - const handleTTLChange = (value: number) => { - setLocalTTLMs(value); - // Latch the toggle open while the user is editing - // so a background refetch cannot unmount the field. - if (autostopToggled === null) { - setAutostopToggled(true); - } - }; - - const resetRetentionState = () => { - setLocalRetentionDays(null); - setRetentionToggled(null); - }; - - const handleToggleRetention = (checked: boolean) => { - if (checked) { - setRetentionToggled(true); - setLocalRetentionDays(serverRetentionDays > 0 ? serverRetentionDays : 30); - onSaveRetentionDays( - { retention_days: serverRetentionDays > 0 ? serverRetentionDays : 30 }, - { onSuccess: resetRetentionState, onError: resetRetentionState }, - ); - } else { - setRetentionToggled(false); - setLocalRetentionDays(0); - onSaveRetentionDays( - { retention_days: 0 }, - { onSuccess: resetRetentionState, onError: resetRetentionState }, - ); - } - }; - - const handleRetentionDaysChange = (value: number) => { - setLocalRetentionDays(value); - if (retentionToggled === null) { - setRetentionToggled(true); - } - }; - - const handleSaveRetentionDays = (event: FormEvent) => { - event.preventDefault(); - if (!isRetentionDaysDirty || isSavingRetentionDays) return; - onSaveRetentionDays( - { retention_days: localRetentionDays ?? 30 }, - { onSuccess: resetRetentionState }, - ); - }; + const isAnyPromptSaving = isSavingSystemPrompt || isSavingUserPrompt; return ( <> @@ -324,64 +122,14 @@ export const AgentSettingsBehaviorPageView: FC< label="Behavior" description="Custom instructions that shape how the agent responds in your conversations." /> - {/* ── Personal prompt (always visible) ── */} -
void handleSaveUserPrompt(event)} - > -

- Personal Instructions -

-

- Applied to all your conversations. Only visible to you. -

- setLocalUserEdit(event.target.value)} - onHeightChange={(height) => - setIsUserPromptOverflowing(height >= textareaMaxHeight) - } - disabled={isPromptSaving} - minRows={1} - /> - {userInvisibleCharCount > 0 && ( - - - This text contains {userInvisibleCharCount} invisible Unicode{" "} - {userInvisibleCharCount !== 1 ? "characters" : "character"} that - could hide content. These will be stripped on save. - - - )} -
- - -
- {isSaveUserPromptError && ( -

- Failed to save personal instructions. -

- )} - + +
- {/* ── Admin system prompt (admin only) ── */} + + {/* ── Admin-only settings ── */} {canSetSystemPrompt && ( <>
-
void handleSaveSystemPrompt(event)} - > -
-

- System Instructions -

- -
-
-
- Include Coder Agents default system prompt - -
- -
-

- {includeDefaultDraft - ? "The built-in Coder Agents prompt is prepended. Additional instructions below are appended." - : "Only the additional instructions below are used. When empty, no deployment-wide system prompt is sent."} -

- setLocalEdit(event.target.value)} - onHeightChange={(height) => - setIsSystemPromptOverflowing(height >= textareaMaxHeight) - } - disabled={isSystemPromptDisabled} - minRows={1} - /> - {systemInvisibleCharCount > 0 && ( - - - This text contains {systemInvisibleCharCount} invisible - Unicode{" "} - {systemInvisibleCharCount !== 1 ? "characters" : "character"}{" "} - that could hide content. These will be stripped on save. - - - )} -
- - {" "} -
- {isSaveSystemPromptError && ( -

- Failed to save system prompt. -

- )} - -
-
-
-

- Virtual Desktop -

- -
-
-
-

- Allow agents to use a virtual, graphical desktop within - workspaces. Requires the{" "} - - portabledesktop module - {" "} - to be installed in the workspace and the Anthropic provider to - be configured. -

-

- Warning: This is a work-in-progress feature, and you're likely - to encounter bugs if you enable it. -

-
- - onSaveDesktopEnabled({ enable_desktop: checked }) - } - aria-label="Enable" - disabled={isSavingDesktopEnabled} - /> -
- {isSaveDesktopEnabledError && ( -

- Failed to save desktop setting. -

- )} -
-
-
void handleSaveChatWorkspaceTTL(event)} - > -
-

- Workspace Autostop Fallback -

- -
-
-

- Set a default autostop for agent-created workspaces that don't - have one defined in their template. Template-defined autostop - rules always take precedence. Active conversations will extend - the stop time. -

- {" "} -
- {isAutostopEnabled && ( - - )} - {isAutostopEnabled && ( -
- -
- )} - {isSaveWorkspaceTTLError && ( -

- Failed to save autostop setting. -

- )} - {isWorkspaceTTLLoadError && ( -

- Failed to load autostop setting. -

- )} - -
-
void handleSaveRetentionDays(event)} - > -
-

- Conversation Retention Period -

- -
-
-

- Archived conversations and orphaned files older than this are - automatically deleted. -

- -
- {isRetentionEnabled && ( - <> - - handleRetentionDaysChange( - Number.parseInt(event.target.value, 10) || 0, - ) - } - disabled={isSavingRetentionDays || isRetentionDaysLoading} - className="w-full rounded-lg border border-border bg-surface-primary px-4 py-2 text-[13px] text-content-primary placeholder:text-content-secondary focus:outline-none focus:ring-2 focus:ring-content-link/30" - /> - {isRetentionDaysZero && ( -

- Retention period must be at least 1 day. -

- )} - {isRetentionDaysNegative && ( -

- Retention days cannot be negative. -

- )} - {isRetentionDaysOverMax && ( -

- Must not exceed {retentionDaysMaximum} days (~10 years). -

- )} -
- -
- - )} - {isSaveRetentionDaysError && ( -

- Failed to save retention setting. -

- )} - {isRetentionDaysLoadError && ( -

- Failed to load retention setting. -

- )} -
- - )} -
- {/* ── Kyleosophy toggle (always visible) ── */} -
-

- Kyleosophy -

-
-

- Replace the standard completion chime. IYKYK. - {kylesophyForced && ( - - Kyleosophy is mandatory on dev.coder.com. - - )} -

- { - setKylesophyEnabled(checked); - setLocalKylesophy(checked); - }} - aria-label="Enable Kyleosophy" - disabled={kylesophyForced} + -
-
- {showDefaultPromptPreview && ( - setShowDefaultPromptPreview(false)} - /> +
+ + +
+ + +
+ + )} ); diff --git a/site/src/pages/AgentsPage/components/PersonalInstructionsSettings.tsx b/site/src/pages/AgentsPage/components/PersonalInstructionsSettings.tsx new file mode 100644 index 0000000000..870a1c7970 --- /dev/null +++ b/site/src/pages/AgentsPage/components/PersonalInstructionsSettings.tsx @@ -0,0 +1,109 @@ +import { useFormik } from "formik"; +import type { FC } from "react"; +import { useState } from "react"; +import TextareaAutosize from "react-textarea-autosize"; +import type * as TypesGen from "#/api/typesGenerated"; +import { Alert, AlertDescription } from "#/components/Alert/Alert"; +import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; +import { countInvisibleCharacters } from "#/utils/invisibleUnicode"; + +interface MutationCallbacks { + onSuccess?: () => void; + onError?: () => void; +} + +interface PersonalInstructionsSettingsProps { + userPromptData: TypesGen.UserChatCustomPrompt | undefined; + onSaveUserPrompt: ( + req: TypesGen.UserChatCustomPrompt, + options?: MutationCallbacks, + ) => void; + isSavingUserPrompt: boolean; + isSaveUserPromptError: boolean; + isAnyPromptSaving: boolean; +} + +export const PersonalInstructionsSettings: FC< + PersonalInstructionsSettingsProps +> = ({ + userPromptData, + onSaveUserPrompt, + isSaveUserPromptError, + isAnyPromptSaving, +}) => { + const [isUserPromptOverflowing, setIsUserPromptOverflowing] = useState(false); + + const form = useFormik({ + initialValues: { + custom_prompt: userPromptData?.custom_prompt ?? "", + }, + enableReinitialize: true, + onSubmit: (values, helpers) => { + onSaveUserPrompt( + { custom_prompt: values.custom_prompt }, + { onSuccess: () => helpers.resetForm() }, + ); + }, + }); + + const userInvisibleCharCount = countInvisibleCharacters( + form.values.custom_prompt, + ); + + return ( +
+

+ Personal Instructions +

+

+ Applied to all your conversations. Only visible to you. +

+ setIsUserPromptOverflowing(height >= 240)} + disabled={isAnyPromptSaving} + minRows={1} + /> + {userInvisibleCharCount > 0 && ( + + + This text contains {userInvisibleCharCount} invisible Unicode{" "} + {userInvisibleCharCount !== 1 ? "characters" : "character"} that + could hide content. These will be stripped on save. + + + )} +
+ + +
+ {isSaveUserPromptError && ( +

+ Failed to save personal instructions. +

+ )} + + ); +}; diff --git a/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx b/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx new file mode 100644 index 0000000000..89acb39217 --- /dev/null +++ b/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx @@ -0,0 +1,164 @@ +import { useFormik } from "formik"; +import type { FC } from "react"; +import { useState } from "react"; +import * as Yup from "yup"; +import type * as TypesGen from "#/api/typesGenerated"; +import { Button } from "#/components/Button/Button"; +import { Switch } from "#/components/Switch/Switch"; +import { AdminBadge } from "./AdminBadge"; + +interface MutationCallbacks { + onSuccess?: () => void; + onError?: () => void; +} + +interface RetentionPeriodSettingsProps { + retentionDaysData: TypesGen.ChatRetentionDaysResponse | undefined; + isRetentionDaysLoading: boolean; + isRetentionDaysLoadError: boolean; + onSaveRetentionDays: ( + req: TypesGen.UpdateChatRetentionDaysRequest, + options?: MutationCallbacks, + ) => void; + isSavingRetentionDays: boolean; + isSaveRetentionDaysError: boolean; +} + +// Keep in sync with retentionDaysMaximum in coderd/exp_chats.go. +const validationSchema = Yup.object({ + retention_days: Yup.number() + .integer("Retention days must be a whole number.") + .min(1, "Retention period must be at least 1 day.") + .max(3650, "Must not exceed 3650 days (~10 years).") + .required("Retention days is required."), +}); + +export const RetentionPeriodSettings: FC = ({ + retentionDaysData, + isRetentionDaysLoading, + isRetentionDaysLoadError, + onSaveRetentionDays, + isSavingRetentionDays, + isSaveRetentionDaysError, +}) => { + const [retentionToggled, setRetentionToggled] = useState( + null, + ); + + const serverRetentionDays = retentionDaysData?.retention_days ?? 30; + const isRetentionEnabled = retentionToggled ?? serverRetentionDays > 0; + + const form = useFormik({ + initialValues: { retention_days: serverRetentionDays }, + enableReinitialize: true, + validationSchema, + onSubmit: (values, helpers) => { + onSaveRetentionDays( + { retention_days: values.retention_days }, + { + onSuccess: () => { + setRetentionToggled(null); + helpers.resetForm(); + }, + }, + ); + }, + }); + + const resetRetentionState = () => { + setRetentionToggled(null); + form.resetForm(); + }; + + const handleToggleRetention = (checked: boolean) => { + if (checked) { + const days = serverRetentionDays > 0 ? serverRetentionDays : 30; + setRetentionToggled(true); + void form.setFieldValue("retention_days", days); + onSaveRetentionDays( + { retention_days: days }, + { + onSuccess: resetRetentionState, + onError: resetRetentionState, + }, + ); + } else { + setRetentionToggled(false); + void form.setFieldValue("retention_days", 0); + onSaveRetentionDays( + { retention_days: 0 }, + { + onSuccess: resetRetentionState, + onError: resetRetentionState, + }, + ); + } + }; + + return ( +
+
+

+ Conversation Retention Period +

+ +
+
+

+ Archived conversations and orphaned files older than this are + automatically deleted. +

+ +
+ {isRetentionEnabled && ( + <> + + {form.errors.retention_days && form.touched.retention_days && ( +

+ {form.errors.retention_days} +

+ )} +
+ +
+ + )} + {isSaveRetentionDaysError && ( +

+ Failed to save retention setting. +

+ )} + {isRetentionDaysLoadError && ( +

+ Failed to load retention setting. +

+ )} +
+ ); +}; diff --git a/site/src/pages/AgentsPage/components/SystemInstructionsSettings.tsx b/site/src/pages/AgentsPage/components/SystemInstructionsSettings.tsx new file mode 100644 index 0000000000..397fafe31d --- /dev/null +++ b/site/src/pages/AgentsPage/components/SystemInstructionsSettings.tsx @@ -0,0 +1,164 @@ +import { useFormik } from "formik"; +import type { FC } from "react"; +import { useState } from "react"; +import TextareaAutosize from "react-textarea-autosize"; +import type * as TypesGen from "#/api/typesGenerated"; +import { Alert, AlertDescription } from "#/components/Alert/Alert"; +import { Button } from "#/components/Button/Button"; +import { Switch } from "#/components/Switch/Switch"; +import { cn } from "#/utils/cn"; +import { countInvisibleCharacters } from "#/utils/invisibleUnicode"; +import { AdminBadge } from "./AdminBadge"; +import { TextPreviewDialog } from "./TextPreviewDialog"; + +interface MutationCallbacks { + onSuccess?: () => void; + onError?: () => void; +} + +interface SystemInstructionsSettingsProps { + systemPromptData: TypesGen.ChatSystemPromptResponse | undefined; + onSaveSystemPrompt: ( + req: TypesGen.UpdateChatSystemPromptRequest, + options?: MutationCallbacks, + ) => void; + isSaveSystemPromptError: boolean; + isAnyPromptSaving: boolean; +} + +export const SystemInstructionsSettings: FC< + SystemInstructionsSettingsProps +> = ({ + systemPromptData, + onSaveSystemPrompt, + isSaveSystemPromptError, + isAnyPromptSaving, +}) => { + const [showDefaultPromptPreview, setShowDefaultPromptPreview] = + useState(false); + const [isSystemPromptOverflowing, setIsSystemPromptOverflowing] = + useState(false); + + const hasLoadedSystemPrompt = systemPromptData !== undefined; + const defaultSystemPrompt = systemPromptData?.default_system_prompt ?? ""; + + const form = useFormik({ + enableReinitialize: true, + initialValues: { + system_prompt: systemPromptData?.system_prompt ?? "", + include_default_system_prompt: + systemPromptData?.include_default_system_prompt ?? false, + }, + onSubmit: (values, { resetForm }) => { + onSaveSystemPrompt(values, { + onSuccess: () => { + resetForm(); + }, + }); + }, + }); + + const systemInvisibleCharCount = countInvisibleCharacters( + form.values.system_prompt, + ); + const isSystemPromptDisabled = isAnyPromptSaving || !hasLoadedSystemPrompt; + + return ( + <> +
+
+

+ System Instructions +

+ +
+
+
+ Include Coder Agents default system prompt + +
+ + form.setFieldValue("include_default_system_prompt", checked) + } + aria-label="Include Coder Agents default system prompt" + disabled={isSystemPromptDisabled} + /> +
+

+ {form.values.include_default_system_prompt + ? "The built-in Coder Agents prompt is prepended. Additional instructions below are appended." + : "Only the additional instructions below are used. When empty, no deployment-wide system prompt is sent."} +

+ + setIsSystemPromptOverflowing(height >= 240) + } + disabled={isSystemPromptDisabled} + minRows={1} + /> + {systemInvisibleCharCount > 0 && ( + + + This text contains {systemInvisibleCharCount} invisible Unicode{" "} + {systemInvisibleCharCount !== 1 ? "characters" : "character"} that + could hide content. These will be stripped on save. + + + )} +
+ + +
+ {isSaveSystemPromptError && ( +

+ Failed to save system prompt. +

+ )} + + + {showDefaultPromptPreview && ( + setShowDefaultPromptPreview(false)} + /> + )} + + ); +}; diff --git a/site/src/pages/AgentsPage/components/VirtualDesktopSettings.tsx b/site/src/pages/AgentsPage/components/VirtualDesktopSettings.tsx new file mode 100644 index 0000000000..a2260da34c --- /dev/null +++ b/site/src/pages/AgentsPage/components/VirtualDesktopSettings.tsx @@ -0,0 +1,74 @@ +import type { FC } from "react"; +import type * as TypesGen from "#/api/typesGenerated"; +import { Link } from "#/components/Link/Link"; +import { Switch } from "#/components/Switch/Switch"; +import { AdminBadge } from "./AdminBadge"; + +interface MutationCallbacks { + onSuccess?: () => void; + onError?: () => void; +} + +interface VirtualDesktopSettingsProps { + desktopEnabledData: TypesGen.ChatDesktopEnabledResponse | undefined; + onSaveDesktopEnabled: ( + req: TypesGen.UpdateChatDesktopEnabledRequest, + options?: MutationCallbacks, + ) => void; + isSavingDesktopEnabled: boolean; + isSaveDesktopEnabledError: boolean; +} + +export const VirtualDesktopSettings: FC = ({ + desktopEnabledData, + onSaveDesktopEnabled, + isSavingDesktopEnabled, + isSaveDesktopEnabledError, +}) => { + const desktopEnabled = desktopEnabledData?.enable_desktop ?? false; + + return ( +
+
+

+ Virtual Desktop +

+ +
+
+
+

+ Allow agents to use a virtual, graphical desktop within workspaces. + Requires the{" "} + + portabledesktop module + {" "} + to be installed in the workspace and the Anthropic provider to be + configured. +

+

+ Warning: This is a work-in-progress feature, and you're likely to + encounter bugs if you enable it. +

+
+ + onSaveDesktopEnabled({ enable_desktop: checked }) + } + aria-label="Enable" + disabled={isSavingDesktopEnabled} + /> +
+ {isSaveDesktopEnabledError && ( +

+ Failed to save desktop setting. +

+ )} +
+ ); +}; diff --git a/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx b/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx new file mode 100644 index 0000000000..bcb7db094f --- /dev/null +++ b/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx @@ -0,0 +1,167 @@ +import { useFormik } from "formik"; +import type { FC } from "react"; +import { useState } from "react"; +import * as Yup from "yup"; +import type * as TypesGen from "#/api/typesGenerated"; +import { Button } from "#/components/Button/Button"; +import { Switch } from "#/components/Switch/Switch"; +import { AdminBadge } from "./AdminBadge"; +import { DurationField } from "./DurationField/DurationField"; + +interface MutationCallbacks { + onSuccess?: () => void; + onError?: () => void; +} + +interface WorkspaceAutostopSettingsProps { + workspaceTTLData: TypesGen.ChatWorkspaceTTLResponse | undefined; + isWorkspaceTTLLoading: boolean; + isWorkspaceTTLLoadError: boolean; + onSaveWorkspaceTTL: ( + req: TypesGen.UpdateChatWorkspaceTTLRequest, + options?: MutationCallbacks, + ) => void; + isSavingWorkspaceTTL: boolean; + isSaveWorkspaceTTLError: boolean; +} + +const maxTTLMs = 30 * 24 * 60 * 60_000; // 30 days + +export const WorkspaceAutostopSettings: FC = ({ + workspaceTTLData, + isWorkspaceTTLLoading, + isWorkspaceTTLLoadError, + onSaveWorkspaceTTL, + isSavingWorkspaceTTL, + isSaveWorkspaceTTLError, +}) => { + // ── Toggle state (fires immediate mutations, not a form submit) ── + const [autostopToggled, setAutostopToggled] = useState(null); + + // ── Derived state ── + const serverTTLMs = workspaceTTLData?.workspace_ttl_ms ?? 0; + const isAutostopEnabled = autostopToggled ?? serverTTLMs > 0; + + // ── Form (for editing the TTL value) ── + const validationSchema = Yup.object({ + workspace_ttl_ms: Yup.number() + .required() + .when([], { + is: () => isAutostopEnabled, + then: (schema) => + schema.moreThan(0, "Duration must be greater than zero."), + }) + .max(maxTTLMs, "Must not exceed 30 days (720 hours)."), + }); + + const form = useFormik({ + initialValues: { workspace_ttl_ms: serverTTLMs }, + enableReinitialize: true, + validationSchema, + onSubmit: (values, helpers) => { + onSaveWorkspaceTTL( + { workspace_ttl_ms: values.workspace_ttl_ms }, + { + onSuccess: () => { + setAutostopToggled(null); + helpers.resetForm(); + }, + onError: () => setAutostopToggled(null), + }, + ); + }, + }); + + // ── Handlers ── + const resetAutostopState = () => { + setAutostopToggled(null); + form.resetForm(); + }; + + const handleToggleAutostop = (checked: boolean) => { + if (checked) { + // Defensive: restore server value if query cache is + // stale; otherwise default to 1 hour. + const defaultTTL = serverTTLMs > 0 ? serverTTLMs : 3_600_000; + setAutostopToggled(true); + void form.setFieldValue("workspace_ttl_ms", defaultTTL); + onSaveWorkspaceTTL( + { workspace_ttl_ms: defaultTTL }, + { onSuccess: resetAutostopState, onError: resetAutostopState }, + ); + } else { + setAutostopToggled(false); + void form.setFieldValue("workspace_ttl_ms", 0); + onSaveWorkspaceTTL( + { workspace_ttl_ms: 0 }, + { onSuccess: resetAutostopState, onError: resetAutostopState }, + ); + } + }; + + const handleTTLChange = (value: number) => { + void form.setFieldValue("workspace_ttl_ms", value); + // Latch the toggle open while the user is editing + // so a background refetch cannot unmount the field. + if (autostopToggled === null) { + setAutostopToggled(true); + } + }; + + const fieldError = form.errors.workspace_ttl_ms; + + return ( +
+
+

+ Workspace Autostop Fallback +

+ +
+
+

+ Set a default autostop for agent-created workspaces that don't have + one defined in their template. Template-defined autostop rules always + take precedence. Active conversations will extend the stop time. +

+ +
+ {isAutostopEnabled && ( + + )} + {isAutostopEnabled && ( +
+ +
+ )} + {isSaveWorkspaceTTLError && ( +

+ Failed to save autostop setting. +

+ )} + {isWorkspaceTTLLoadError && ( +

+ Failed to load autostop setting. +

+ )} + + ); +}; diff --git a/site/src/pages/AgentsPage/utils/chime.test.ts b/site/src/pages/AgentsPage/utils/chime.test.ts index fd81c58dcb..35ac4fec64 100644 --- a/site/src/pages/AgentsPage/utils/chime.test.ts +++ b/site/src/pages/AgentsPage/utils/chime.test.ts @@ -2,13 +2,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { _resetForTesting, getChimeEnabled, - getKylesophyEnabled, - isKylesophyForced, - KYLEOSOPHY_SOUNDS, LOCK_HOLD_MS, maybePlayChime, setChimeEnabled, - setKylesophyEnabled, } from "./chime"; // --------------------------------------------------------------------------- @@ -74,40 +70,6 @@ describe("getChimeEnabled / setChimeEnabled", () => { }); }); -// --------------------------------------------------------------------------- -// Kyleosophy preference helpers -// --------------------------------------------------------------------------- - -describe("getKylesophyEnabled / setKylesophyEnabled", () => { - beforeEach(() => { - localStorage.clear(); - }); - - it("defaults to false when nothing is stored", () => { - expect(getKylesophyEnabled()).toBe(false); - }); - - it("returns true when stored as 'true'", () => { - localStorage.setItem("agents.kyleosophy", "true"); - expect(getKylesophyEnabled()).toBe(true); - }); - - it("returns false when stored as 'false'", () => { - localStorage.setItem("agents.kyleosophy", "false"); - expect(getKylesophyEnabled()).toBe(false); - }); - - it("setKylesophyEnabled persists the value", () => { - setKylesophyEnabled(false); - expect(localStorage.getItem("agents.kyleosophy")).toBe("false"); - expect(getKylesophyEnabled()).toBe(false); - - setKylesophyEnabled(true); - expect(localStorage.getItem("agents.kyleosophy")).toBe("true"); - expect(getKylesophyEnabled()).toBe(true); - }); -}); - // --------------------------------------------------------------------------- // maybePlayChime // --------------------------------------------------------------------------- @@ -275,79 +237,4 @@ describe("maybePlayChime", () => { // Should play immediately without needing to advance timers. expect(playSpy).toHaveBeenCalledTimes(1); }); - - // -- Kyleosophy sound selection -- - - it("uses a kyleosophy sound when kyleosophy is enabled", async () => { - setKylesophyEnabled(true); - vi.spyOn(document, "hidden", "get").mockReturnValue(true); - // Pin the random selection so the test is deterministic. - vi.spyOn(Math, "random").mockReturnValue(0.5); - - const audioSpy = vi.spyOn(globalThis, "Audio" as never); - - await triggerAndSettle("running", "waiting", "chat-1", "chat-2"); - expect(playSpy).toHaveBeenCalledTimes(1); - expect(audioSpy).toHaveBeenCalledTimes(1); - - const url = (audioSpy as unknown as ReturnType).mock - .calls[0][0] as string; - // Math.floor(0.5 * 8) = 4 → "/chime_5.mp3" - expect(url).toBe("/chime_5.mp3"); - expect(KYLEOSOPHY_SOUNDS).toContain(url); - }); - - it("uses default chime.mp3 when kyleosophy is disabled", async () => { - setKylesophyEnabled(false); - vi.spyOn(document, "hidden", "get").mockReturnValue(true); - - const audioSpy = vi.spyOn(globalThis, "Audio" as never); - - await triggerAndSettle("running", "waiting", "chat-1", "chat-2"); - expect(playSpy).toHaveBeenCalledTimes(1); - expect(audioSpy).toHaveBeenCalledTimes(1); - - const url = (audioSpy as unknown as ReturnType).mock - .calls[0][0] as string; - expect(url).toBe("/chime.mp3"); - }); -}); - -// --------------------------------------------------------------------------- -// isKylesophyForced -// --------------------------------------------------------------------------- - -describe("isKylesophyForced", () => { - const originalLocationDescriptor = Object.getOwnPropertyDescriptor( - globalThis, - "location", - ); - - afterEach(() => { - if (originalLocationDescriptor) { - Object.defineProperty(globalThis, "location", originalLocationDescriptor); - } else { - // If location did not originally exist, remove the stub. - delete (globalThis as Record).location; - } - }); - - it("returns true on dev.coder.com", () => { - Object.defineProperty(globalThis, "location", { - value: { hostname: "dev.coder.com" }, - writable: true, - configurable: true, - }); - expect(isKylesophyForced()).toBe(true); - expect(getKylesophyEnabled()).toBe(true); - }); - - it("returns false on other hosts", () => { - Object.defineProperty(globalThis, "location", { - value: { hostname: "coder.example.com" }, - writable: true, - configurable: true, - }); - expect(isKylesophyForced()).toBe(false); - }); }); diff --git a/site/src/pages/AgentsPage/utils/chime.ts b/site/src/pages/AgentsPage/utils/chime.ts index 1e1de17d7c..63b94df13b 100644 --- a/site/src/pages/AgentsPage/utils/chime.ts +++ b/site/src/pages/AgentsPage/utils/chime.ts @@ -1,5 +1,4 @@ const CHIME_PREFERENCE_KEY = "agents.chime-on-completion"; -const KYLEOSOPHY_PREFERENCE_KEY = "agents.kyleosophy"; export function getChimeEnabled(): boolean { try { @@ -21,79 +20,24 @@ export function setChimeEnabled(enabled: boolean): void { } /** - * Whether Kyleosophy mode is active. Force-enabled on - * dev.coder.com because the people deserve Kyle. - */ -export function getKylesophyEnabled(): boolean { - if (isKylesophyForced()) { - return true; - } - try { - const stored = localStorage.getItem(KYLEOSOPHY_PREFERENCE_KEY); - return stored === null ? false : stored === "true"; - } catch { - return false; - } -} - -/** - * Whether the current deployment force-enables Kyleosophy, - * bypassing the user preference. - */ -export function isKylesophyForced(): boolean { - try { - return globalThis.location?.hostname === "dev.coder.com"; - } catch { - return false; - } -} - -export function setKylesophyEnabled(enabled: boolean): void { - try { - localStorage.setItem(KYLEOSOPHY_PREFERENCE_KEY, String(enabled)); - } catch { - // Silently ignore storage errors (e.g. private browsing - // quota exceeded). - } -} - -/** - * Alternative completion sounds for Kyleosophy mode. All are - * shipped as static assets alongside chime.mp3. - */ -export const KYLEOSOPHY_SOUNDS: readonly string[] = [ - "/chime_1.mp3", // absolutely massive - "/chime_2.mp3", // dope - "/chime_3.mp3", // great - "/chime_4.mp3", // oh god - "/chime_5.mp3", // okay - "/chime_6.mp3", // open up a pr - "/chime_7.mp3", // sweet - "/chime_8.mp3", // yep -]; - -/** - * Play a completion sound. When Kyleosophy is enabled a random - * voice clip is selected; otherwise the default bell chime is - * used. The Audio element is cached and reused when the sound - * URL hasn't changed between calls. + * Play the completion chime audio file. The file is a short, + * warm two-tone bell sound shipped as a static asset. + * + * A single Audio element is reused across calls so the browser + * only fetches the file once. */ let chimeAudio: HTMLAudioElement | null = null; -let lastSoundUrl: string | null = null; /** @internal Reset cached Audio state between tests. */ export function _resetForTesting(): void { chimeAudio = null; - lastSoundUrl = null; } -function playChimeAudio(soundUrl = "/chime.mp3"): void { +function playChimeAudio(): void { try { - if (!chimeAudio || soundUrl !== lastSoundUrl) { - chimeAudio?.pause(); - chimeAudio = new Audio(soundUrl); + if (!chimeAudio) { + chimeAudio = new Audio("/chime.mp3"); chimeAudio.volume = 0.5; - lastSoundUrl = soundUrl; } // Reset to the start in case a previous play hasn't // finished yet. @@ -136,9 +80,9 @@ export const LOCK_HOLD_MS = 2000; * Falls back to playing immediately when the Web Locks API is * not available (preserving the original single-tab behavior). */ -function playChime(chatID: string, soundUrl?: string): void { +function playChime(chatID: string): void { if (typeof navigator === "undefined" || !navigator.locks) { - playChimeAudio(soundUrl); + playChimeAudio(); return; } @@ -154,7 +98,7 @@ function playChime(chatID: string, soundUrl?: string): void { return; } - playChimeAudio(soundUrl); + playChimeAudio(); // Hold the lock briefly so that tabs receiving the // WebSocket event a bit later will see the lock as @@ -212,9 +156,5 @@ export function maybePlayChime( return; } - const soundUrl = getKylesophyEnabled() - ? KYLEOSOPHY_SOUNDS[Math.floor(Math.random() * KYLEOSOPHY_SOUNDS.length)] - : undefined; - - playChime(chatID, soundUrl); + playChime(chatID); } diff --git a/site/static/chime_1.mp3 b/site/static/chime_1.mp3 deleted file mode 100644 index 67a11ec2ae77aece47fd83b471deebbc426fd3db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23867 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 J{{L|T{{bVgG)Mpd diff --git a/site/static/chime_4.mp3 b/site/static/chime_4.mp3 deleted file mode 100644 index 455f668e677a9bb7dd82e68561b54ccad9df55cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10911 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%0A?yNgL>U7^ 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 diff --git a/site/static/chime_8.mp3 b/site/static/chime_8.mp3 deleted file mode 100644 index a32a482013ebabf92e48735e4c0a331f2b073b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4641 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