From 1b7bea00a45fcba48962ccf59944504d5ebd3e92 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 31 Jul 2026 21:15:11 -0400 Subject: [PATCH 1/5] refac --- cptr/frontend/src/lib/apis/memory.ts | 1 + .../src/lib/components/Admin/Chat.svelte | 192 +++++++++++++++++ .../src/lib/components/Admin/Git.svelte | 77 +++++++ .../src/lib/components/Admin/Models.svelte | 62 ++---- .../src/lib/components/Admin/Skills.svelte | 26 +++ .../frontend/src/lib/components/GitBar.svelte | 7 +- .../src/lib/components/Settings/Memory.svelte | 22 ++ .../src/lib/components/SettingsModal.svelte | 12 ++ .../components/common/ModelSelector.svelte | 44 ++-- cptr/frontend/src/lib/i18n/locales/en.json | 20 ++ cptr/routers/chat.py | 16 +- cptr/routers/git.py | 43 ++-- cptr/utils/ai.py | 150 ++++++++++++-- cptr/utils/chat_task.py | 105 +++++++--- cptr/utils/memory.py | 195 +++++++++++++----- cptr/utils/skills.py | 52 ++--- cptr/utils/summarize.py | 30 ++- 17 files changed, 816 insertions(+), 238 deletions(-) create mode 100644 cptr/frontend/src/lib/components/Admin/Chat.svelte create mode 100644 cptr/frontend/src/lib/components/Admin/Git.svelte diff --git a/cptr/frontend/src/lib/apis/memory.ts b/cptr/frontend/src/lib/apis/memory.ts index fb9bbcd8..a660aac6 100644 --- a/cptr/frontend/src/lib/apis/memory.ts +++ b/cptr/frontend/src/lib/apis/memory.ts @@ -18,6 +18,7 @@ export type MemorySettings = { enabled: boolean; tool_enabled: boolean; background_review_enabled: boolean; + 'background_review.model'?: string | null; review_interval_turns: number; user_char_limit: number; workspace_char_limit: number; diff --git a/cptr/frontend/src/lib/components/Admin/Chat.svelte b/cptr/frontend/src/lib/components/Admin/Chat.svelte new file mode 100644 index 00000000..9594eea9 --- /dev/null +++ b/cptr/frontend/src/lib/components/Admin/Chat.svelte @@ -0,0 +1,192 @@ + + +
+ {#if loading} +
+ {:else} +
+

{$t('admin.chat')}

+ +

+ {$t('admin.chatTitles')} +

+
+ + + {#if titleGenerationEnabled} +
+
+
+ {$t('admin.chatTitleModel')} +
+
+ {$t('admin.chatTitleModelHint')} +
+
+
+ +
+
+ {/if} +
+ +

+ {$t('admin.contextCompaction')} +

+
+
+
+
+ {$t('admin.contextSummaryModel')} +
+
+ {$t('admin.contextSummaryModelHint')} +
+
+
+ +
+
+
+ +
+ + + {$t('admin.compactTokenThresholdUnit')} + +
+

+ {$t('admin.compactTokenThresholdHint')} +

+
+
+ +

+ {$t('admin.toolApproval')} +

+
+
+
+ {$t('admin.toolApprovalReviewModel')} +
+
+ {$t('admin.toolApprovalReviewModelHint')} +
+
+
+ +
+
+
+ +
+ +
+ {/if} +
diff --git a/cptr/frontend/src/lib/components/Admin/Git.svelte b/cptr/frontend/src/lib/components/Admin/Git.svelte new file mode 100644 index 00000000..8fee0e3b --- /dev/null +++ b/cptr/frontend/src/lib/components/Admin/Git.svelte @@ -0,0 +1,77 @@ + + +
+ {#if loading} +
+ {:else} +
+

{$t('admin.git')}

+ +
+
+
+ {$t('admin.gitCommitMessageModel')} +
+
+ {$t('admin.gitCommitMessageModelHint')} +
+
+
+ +
+
+
+ +
+ +
+ {/if} +
diff --git a/cptr/frontend/src/lib/components/Admin/Models.svelte b/cptr/frontend/src/lib/components/Admin/Models.svelte index 45cba5b1..cb17a526 100644 --- a/cptr/frontend/src/lib/components/Admin/Models.svelte +++ b/cptr/frontend/src/lib/components/Admin/Models.svelte @@ -48,10 +48,6 @@ // Default model let defaultModelId = $state(''); - // Context compaction - let compactTokenThreshold = $state(80000); - let compactDirty = $state(false); - const TEMPLATE_VARIABLES = [ { name: 'CPTR_CONTEXT', desc: 'Runtime, machine, workspace, and tool context' }, { name: 'RUNTIME_ENV', desc: 'Runtime environment (host or container)' }, @@ -117,7 +113,7 @@ Workspace: {{WORKSPACE_NAME}} Files: {{FILE_TREE}}`; - let hasDirty = $derived(globalDirty || compactDirty || models.some((m) => m.dirty)); + let hasDirty = $derived(globalDirty || models.some((m) => m.dirty)); function parseRows(config: ModelConfigEntry | undefined): ParamRow[] { const rp = config?.params?.request_params; @@ -256,10 +252,9 @@ Files: onMount(async () => { await loadModelConfig(); - // Load admin config (default model, context compaction) + // Load default model try { const adminCfg = await getAdminConfig(); - compactTokenThreshold = Number(adminCfg['chat.compact_token_threshold']) || 80000; defaultModelId = typeof adminCfg['chat.default_model'] === 'string' ? adminCfg['chat.default_model'] : ''; } catch {} @@ -349,12 +344,7 @@ Files: globalDirty = false; models.forEach((m) => (m.dirty = false)); - // Save default model - await updateConfig({ - 'chat.compact_token_threshold': compactTokenThreshold, - 'chat.default_model': defaultModelId - }); - compactDirty = false; + await updateConfig({ 'chat.default_model': defaultModelId }); toast.success($t('settings.saved')); } catch { @@ -552,43 +542,17 @@ Files: - -

- {$t('models.defaultModel')} -

-
- -
-

- {$t('models.defaultModelHint')} -

- - -

{$t('admin.contextCompaction')}

- -
-
- -
- (compactDirty = true)} - min="10000" - max="1000000" - step="10000" - class="w-24 h-7 px-2 rounded-lg text-xs bg-gray-100 dark:bg-white/6 text-gray-700 dark:text-gray-300 border border-gray-200 dark:border-white/8 outline-none focus:border-blue-400 dark:focus:border-blue-500 transition-colors" - /> - {$t('admin.compactTokenThresholdUnit')} +
+
+

+ {$t('models.defaultModel')} +

+
+ {$t('models.defaultModelHint')}
-

- {$t('admin.compactTokenThresholdHint')} -

+
+
+
diff --git a/cptr/frontend/src/lib/components/Admin/Skills.svelte b/cptr/frontend/src/lib/components/Admin/Skills.svelte index f6d9600a..d6ec4376 100644 --- a/cptr/frontend/src/lib/components/Admin/Skills.svelte +++ b/cptr/frontend/src/lib/components/Admin/Skills.svelte @@ -5,12 +5,14 @@ import { t } from '$lib/i18n'; import ToggleSwitch from '$lib/components/common/ToggleSwitch.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; + import ModelSelector from '$lib/components/common/ModelSelector.svelte'; let loading = $state(true); let saving = $state(false); let enabled = $state(true); let toolEnabled = $state(true); let backgroundReview = $state(true); + let backgroundReviewModel = $state(null); let reviewInterval = $state(10); onMount(async () => { @@ -22,6 +24,10 @@ backgroundReview = config['skills.background_review_enabled'] !== false && config['skills.background_review_enabled'] !== 'false'; + backgroundReviewModel = + typeof config['skills.background_review.model'] === 'string' + ? config['skills.background_review.model'] + : null; reviewInterval = Number(config['skills.review_interval_turns']) || 10; } catch { toast.error($t('admin.failedToLoadConfig')); @@ -36,6 +42,7 @@ 'skills.enabled': enabled, 'skills.tool_enabled': toolEnabled, 'skills.background_review_enabled': backgroundReview, + 'skills.background_review.model': backgroundReviewModel, 'skills.review_interval_turns': Math.max(1, Number(reviewInterval) || 10) }); toast.success($t('settings.saved')); @@ -94,6 +101,25 @@ }} /> + +
+
+
+ {$t('admin.skillsBackgroundReviewModel')} +
+
+ {$t('admin.skillsBackgroundReviewModelHint')} +
+
+
+ +
+
{/if}
diff --git a/cptr/frontend/src/lib/components/GitBar.svelte b/cptr/frontend/src/lib/components/GitBar.svelte index 16c58721..d4fe2c8e 100644 --- a/cptr/frontend/src/lib/components/GitBar.svelte +++ b/cptr/frontend/src/lib/components/GitBar.svelte @@ -1,7 +1,6 @@