Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
4dfe8df
feat(desktop): state what the vision declaration resolves to
Astro-Han Sep 12, 2026
1ffd5fb
fix(desktop): clarify per-model parameter settings
Astro-Han Sep 12, 2026
930761f
refactor(models): unify connection-scoped model declarations
Astro-Han Sep 12, 2026
0d3a4ed
fix(models): reject stale parameter drafts
Astro-Han Sep 12, 2026
f1e05ef
test(models): distinguish picker capacity from compaction
Astro-Han Sep 12, 2026
b94f13c
fix(desktop): simplify model forms and refresh story catalogs
Astro-Han Sep 12, 2026
e99e044
fix(desktop): unify model editing in compact dialogs
Astro-Han Sep 12, 2026
c07f66a
test(models): declare hosted compaction on the connection
Astro-Han Sep 12, 2026
8fbf1aa
fix(desktop): use model slugs in relay examples
Astro-Han Sep 12, 2026
a968155
fix(desktop): explain model options in user-facing terms
Astro-Han Sep 12, 2026
b91530a
fix(desktop): shorten Chinese model settings labels
Astro-Han Sep 12, 2026
8b0edd3
fix(runtime): honor connection model output budgets on every adapter
Astro-Han Sep 12, 2026
dbd97b3
fix(desktop): retain ESM extension for model editor import
Astro-Han Sep 12, 2026
3578120
test(desktop): match vision support option exactly
Astro-Han Sep 12, 2026
11037c8
test(desktop): remove Electron-only overhead from model settings cove…
Astro-Han Sep 12, 2026
588fa0d
fix(models): resolve and edit capacity limits independently
Astro-Han Sep 12, 2026
81113cb
test(settings): preserve model-save contracts below Electron
Astro-Han Sep 12, 2026
6645997
test(settings): align new main fixture with the resolved catalog
Astro-Han Sep 12, 2026
41f1e0f
test(runtime-host): declare input capacity in compaction fixture
Astro-Han Sep 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
- Moved Read image snapshots into the durable context-offload store with Runtime-owned
lifecycle identity, exact branch and revision copying, recovery-safe cleanup, and bounded
physical garbage collection after Session retirement.
- Unified manual model registration and parameter overrides in the connection catalog, isolated by connection and saved atomically. Model capacity and automatic compaction now use separate fields. Redesigned the shared add/edit form, kept disabled models configurable, and removed bulk thinking edits and client catalog rebuilding. Legacy declarations migrate on the next save; Clients and Hosts must update together.

## 0.1.11 - 2026-08-18

Expand Down
4 changes: 0 additions & 4 deletions apps/desktop/e2e-budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@
"tests": 1,
"electron": "the folder reference has to survive a renderer reload and still agree with the Host's session record"
},
"context-window-save.spec.ts": {
"tests": 1,
"electron": "the saved window is read back from the Host's connection snapshot, not from renderer state"
},
"new-task-reload.spec.ts": {
"tests": 2,
"electron": "renderer reload must preserve an explicit new task and rebuild archived-only Host history as an empty, usable new-task surface"
Expand Down
113 changes: 0 additions & 113 deletions apps/desktop/e2e/context-window-save.spec.ts

This file was deleted.

14 changes: 0 additions & 14 deletions apps/desktop/e2e/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -532,7 +532,6 @@ type E2eTestFixtures = {
railRenderWindow: Page;
promptRailWindow: Page;
partialHistoryWindow: Page;
requestHeaderRowWindow: Page;
newTaskTargetWindow: Page;
directoryReferenceWindow: { page: Page; folder: string };
accessibilityNarrativeWindow: Page;
Expand Down Expand Up @@ -677,19 +676,6 @@ export const test = base.extend<E2eTestFixtures>({
showWindow: true,
}, use);
},
// Settings → 模型, where `no-models` is the seeded openai-compatible relay —
// the connection type whose detail page owns the custom request headers
// editor. Shown, because what this window is for is a rendered box
// measurement and a throttled compositor is not a layout the user has.
requestHeaderRowWindow: async ({}, use) => {
await withE2eWindow({
seed: false,
readinessSelector: '.settingsSurface',
e2eFixtureScenario: 'settings-models',
locale: 'zh-CN',
showWindow: true,
}, use);
},
// A data-backed conversation with settled tool evidence and the workbar open
// beside it. Shown because the accessibility journey follows real native
// focus order through the transcript into the composer controls.
Expand Down
55 changes: 4 additions & 51 deletions apps/desktop/renderer-architecture.json
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@
"src/renderer/settings/personalization-settings-section.tsx",
"src/renderer/settings/projects-settings-page.tsx",
"src/renderer/settings/provider-add-form.tsx",
"src/renderer/settings/provider-add-model-dialog.tsx",
"src/renderer/settings/provider-add-submission.ts",
"src/renderer/settings/provider-brand-marks.tsx",
"src/renderer/settings/provider-catalog-page.tsx",
Expand All @@ -165,8 +164,6 @@
"src/renderer/settings/provider-endpoint-presentation.ts",
"src/renderer/settings/provider-oauth-section.tsx",
"src/renderer/settings/providers-panel.tsx",
"src/renderer/settings/relay-profile-draft.ts",
"src/renderer/settings/relay-thinking-bulk.ts",
"src/renderer/settings/request-customization-editor.tsx",
"src/renderer/settings/runtime-host-interaction-boundary.tsx",
"src/renderer/settings/runtime-host-management-dialog.tsx",
Expand Down Expand Up @@ -2951,25 +2948,6 @@
"react": 1
}
},
"src/renderer/settings/provider-add-model-dialog.tsx": {
"bridgePaths": {},
"environmentCapabilities": {},
"hookCalls": {
"useState": 4,
"useUiLocale": 1
},
"lifecycleMethods": {},
"unresolvedDependencies": 0,
"actionFactories": [],
"dependencyPaths": {
"../features/connection-settings": 1,
"@astryxdesign/core/Dialog": 1,
"@astryxdesign/core/FormLayout": 1,
"@astryxdesign/core/Layout": 1,
"@maka/ui": 1,
"react": 1
}
},
"src/renderer/settings/provider-add-submission.ts": {
"bridgePaths": {},
"environmentCapabilities": {},
Expand Down Expand Up @@ -3056,12 +3034,10 @@
"unresolvedDependencies": 0,
"actionFactories": [],
"dependencyPaths": {
"../features/connection-settings": 1,
"../features/connection-settings": 2,
"./password-input": 1,
"./provider-add-model-dialog": 1,
"./provider-display": 1,
"./provider-endpoint-presentation": 1,
"./relay-thinking-bulk": 1,
"./request-customization-editor": 1,
"./runtime-host-settings-target.js": 1,
"./settings-expandable-row": 1,
Expand Down Expand Up @@ -3179,26 +3155,6 @@
"react": 1
}
},
"src/renderer/settings/relay-profile-draft.ts": {
"bridgePaths": {},
"environmentCapabilities": {},
"hookCalls": {},
"lifecycleMethods": {},
"unresolvedDependencies": 0,
"actionFactories": [],
"dependencyPaths": {
"@maka/core/model-thinking": 1
}
},
"src/renderer/settings/relay-thinking-bulk.ts": {
"bridgePaths": {},
"environmentCapabilities": {},
"hookCalls": {},
"lifecycleMethods": {},
"unresolvedDependencies": 0,
"actionFactories": [],
"dependencyPaths": {}
},
"src/renderer/settings/request-customization-editor.tsx": {
"bridgePaths": {},
"environmentCapabilities": {},
Expand Down Expand Up @@ -3762,12 +3718,12 @@
"bridgePaths": {},
"environmentCapabilities": {},
"hookCalls": {
"useEffect": 6,
"useEffect": 5,
"useKeyedActionGuard": 1,
"useMountedRef": 1,
"useRef": 4,
"useRef": 3,
"useRuntimeHostSettingsErrorReporter": 1,
"useState": 14,
"useState": 11,
"useToast": 1,
"useUiLocale": 1
},
Expand All @@ -3778,12 +3734,9 @@
"../features/connection-settings": 1,
"./connection-name-draft.js": 1,
"./provider-connection-status": 1,
"./relay-profile-draft": 1,
"./relay-thinking-bulk": 1,
"./runtime-host-settings-target.js": 1,
"./use-action-guard": 1,
"@maka/core/llm-connections": 2,
"@maka/core/model-catalog": 1,
"@maka/core/model-thinking": 1,
"@maka/core/provider-registry": 1,
"@maka/ui": 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,6 @@ function relayConnection(): ProjectedLlmConnection {
isDefault: true,
supportsVision: false,
thinkingLevels: [],
describedByMetadata: false,
}],
};
}
Expand Down
48 changes: 0 additions & 48 deletions apps/desktop/src/main/__tests__/model-catalog-choices.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import type {
} from '@maka/core/llm-connections';
import {
resolveConnectionModelCatalog,
resolveDraftConnectionModelCatalog,
type ModelCatalogEntry,
} from '@maka/core/model-catalog';
import { buildChatModelChoices } from '@maka/core/chat-model-choice';
Expand Down Expand Up @@ -122,53 +121,6 @@ describe('model catalog picker helpers', () => {
assert.ok(choices.every((choice) => !(choice.connectionName ?? '').includes('@')));
});

it('renders the Host entry, not a local rebuild, while the editor is unedited', () => {
// A Host that knows this model and a Desktop that does not: the entry says
// the model cannot serve as a chat default and carries a name this build
// has never heard. An unedited editor must show what the Host decided —
// rebuilding locally is exactly the version disagreement the projection
// ends, and here it would also offer a model the Host ruled out.
const stored = {
connectionId: 'connection-relay',
slug: 'relay',
name: 'Relay',
providerType: 'openai-compatible' as const,
defaultModel: 'host-only-model',
enabled: true,
enabledModelIds: ['host-only-model'],
models: [{ id: 'host-only-model' }],
modelSource: 'fetched' as const,
createdAt: 1,
updatedAt: 1,
};
const hostEntry: ModelCatalogEntry = {
...resolveConnectionModelCatalog(stored)[0],
displayName: 'Host-only image model',
canUseAsChatDefault: false,
};
const connection: ProjectedLlmConnection = { ...stored, catalogEntries: [hostEntry] };
const draft = {
models: stored.models,
modelSource: stored.modelSource,
enabledModelIds: stored.enabledModelIds,
};

const unedited = resolveDraftConnectionModelCatalog(connection, draft);
assert.deepEqual(unedited, [hostEntry]);

// And the exception still applies: a draft the Host has not seen is the
// one thing the client resolves for itself.
const edited = resolveDraftConnectionModelCatalog(connection, {
...draft,
models: [...stored.models, { id: 'just-fetched' }],
});
assert.deepEqual(
edited.map((entry) => entry.id).sort(),
['host-only-model', 'just-fetched'],
);
assert.notEqual(edited[0]?.displayName, 'Host-only image model');
});

it('does not offer Daily Review a Codex model the subscription cannot serve', () => {
// A connection saved while `gpt-5-codex` was still picker-visible keeps it
// in `enabledModelIds`. The inventory filter alone left it there, and the
Expand Down
Loading