import { useEffect, useRef, useState } from 'react' import { createPortal } from 'react-dom' import { createRoot } from 'react-dom/client' import { InlineHelp } from '../../src/renderer/src/InlineHelp' import { PageHeader } from '../../src/renderer/src/WorkspacePrimitives' import { SettingsSectionHeader } from '../../src/renderer/src/SettingsPrimitives' import { activateModalFocus, trapTabFocus } from '../../src/renderer/src/dialog-focus' import { ApplicationCenter } from '../../src/renderer/src/ApplicationCenter' import { SettingsPanel } from '../../src/renderer/src/SettingsPanel' import { KnowledgeRetrievalWorkbench } from '../../src/renderer/src/KnowledgeRetrievalWorkbench' import { ActivityPanel } from '../../src/renderer/src/ActivityPanel' import { UiLocaleProvider } from '../../src/renderer/src/i18n/UiLocaleProvider' import { defaultRuntimeSettings } from '../../src/shared/contracts' import { applicationSettingsSchema, defaultLocalToolEnvironmentSettings } from '../../src/shared/application-settings-contracts' import { defaultKnowledgeRetrievalSettings } from '../../src/shared/knowledge-contracts' import '../../src/renderer/src/styles.css' const actions: string[] = [] const record = (action: string): void => { actions.push(action) document.documentElement.dataset.fixtureActions = JSON.stringify(actions) } const applicationSettings = applicationSettingsSchema.parse({ checkUpdatesOnStartup: false, updateSource: 'github', modelDownloadSource: 'modelscope', localToolEnvironment: defaultLocalToolEnvironmentSettings, conversationHtmlRenderingEnabled: true, remoteProjectsEnabled: false, magicNoteCanvasPageCount: 3, }) const profileId = '00000000-0000-4000-8000-000000000001' Object.defineProperty(window, 'goodbuddy', { value: { settings: { getRuntime: async () => ({ ...defaultRuntimeSettings, modelProfiles: [{ id: profileId, name: 'Help regression model', modelName: 'fixture-model', baseUrl: 'https://example.invalid', protocol: 'anthropic-messages', authentication: 'none', imageGenerationQuality: 'auto', apiKeyConfigured: false, credentialSource: 'none', contextWindowTokens: 128000, maximumOutputTokens: 16000, requestHeaders: { 'x-fixture': 'preserve-me' }, requestBody: { temperature: 0.4 }, }], defaultModelProfileId: profileId, embeddingConnections: [], opencodeModelSource: { kind: 'platform' }, continueModelSource: { kind: 'platform' }, deepseekHarnessModelSource: { kind: 'platform' } }), detectAgentRuntimes: async () => ({}), updateRuntime: async () => { record('runtime-save'); throw new Error('Unexpected save') }, testModelConnection: async () => { record('model-call'); throw new Error('Model calls forbidden in help regression') }, }, } }) function Modal({ close }: { close: () => void }): React.JSX.Element { const first = useRef(null) useEffect(() => activateModalFocus(() => first.current), []) useEffect(() => { const escape = (event: KeyboardEvent): void => { if (event.key === 'Escape') close() } document.addEventListener('keydown', escape, true) return () => document.removeEventListener('keydown', escape, true) }, [close]) return createPortal(
trapTabFocus(event, event.currentTarget)}>
{'Long unbroken text: ' + 'abcdefghij'.repeat(150)}
, document.body) } function Fixture(): React.JSX.Element { const [view, setView] = useState('') const [settings, setSettings] = useState(applicationSettings) return
{view === 'isolated' && setView('')} />} {view === 'applications' && setView('')} onOpen={() => record('application-open')} onRetry={() => record('application-retry')} onUpdate={async patch => { record('application-update'); setSettings(current => ({ ...current, ...patch })); return true }} />} {view === 'settings' && setView('')} onSaved={() => record('settings-saved')} onClearLocalData={async () => record('clear-data')} onUpdateProject={async () => { throw new Error('Unexpected project update') }} />} {view === 'retrieval' && setView('')} onTest={() => record('retrieval-test')} onSaveDefaults={() => record('retrieval-save')} onOpenSource={() => record('source-open')} onViewContext={() => record('context-open')} />} {view === 'activity' &&
record('activity-clear')} onOpenConversation={() => record('conversation-open')} />
}
} createRoot(document.getElementById('root')!).render()