## Summary - show the DeepSeek thinking-mode control for configured provider instances whose id is generated - compare provider configs after filling omitted schema defaults so new defaults like `thinkingMode: auto` do not mark old empty DeepSeek configs as configured ## Tests - `pnpm -rF @proj-airi/stage-ui run test:run src/stores/providers/config-defaults.test.ts src/libs/providers/providers/deepseek/index.test.ts` - `pnpm exec moeru-lint packages/stage-ui/src/stores/providers/config-defaults.ts packages/stage-ui/src/stores/providers/config-defaults.test.ts packages/stage-ui/src/stores/providers/provider.ts packages/stage-pages/src/pages/settings/providers/chat/[providerId].vue` - `git diff --check` Co-authored-by: 冼健聪 <mark.xian@evenrealities.com>
Stage UI
Shared core for stage
Button analytics
Register the shared plugin once in each Vue application:
import { trackButtonPlugin } from '@proj-airi/stage-ui/directives/track-button'
createApp(App)
.use(trackButtonPlugin)
.mount('#app')
Buttons that represent a product-analysis click intent can then declare a typed event without wrapping their business handler:
<Button
v-track-button="{ name: 'update_check_clicked', channel: selectedChannel }"
@click="checkForUpdates()"
/>
Keep async outcomes, confirmed state changes, impressions, and lifecycle events in their owning business flows instead of attaching them to the initial click.
Histoire (UI storyboard)
pnpm -F @proj-airi/stage-ui run story:dev
Project structure
- If a story is bound to a specific component, it can be placed beside the component in the
srcfolder. e.g.,MyComponent.story.vue - If a story is not bound to a specific component, then it should be placed in the
storiesfolder. e.g.,MyStory.story.vue