From 81155f2f78d7b460782be694d47eca740c5d5009 Mon Sep 17 00:00:00 2001 From: Acbox Date: Fri, 6 Feb 2026 00:29:29 +0800 Subject: [PATCH 1/3] chore: add cli build task --- mise.toml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mise.toml b/mise.toml index 3bec6710..0e62bb1c 100644 --- a/mise.toml +++ b/mise.toml @@ -65,6 +65,15 @@ description = "Install CLI" depends = ["//:pnpm-install"] run = "cd packages/cli && npm install -g" +[tasks.build-cli] +description = "Build Go CLI binary and install to local bin" +run = """ +mkdir -p ~/.local/bin +go build -trimpath -ldflags "-s -w" -o ~/.local/bin/container-cli ./cmd/cli +chmod +x ~/.local/bin/container-cli +echo "✓ CLI binary installed to ~/.local/bin/container-cli" +""" + [tasks.mcp-image-up] description = "Build MCP container image" run = "scripts/mcp-image-up.sh" From 7d43c064c0c2ecef3a780f402276487c721c77d3 Mon Sep 17 00:00:00 2001 From: Acbox Date: Fri, 6 Feb 2026 00:32:28 +0800 Subject: [PATCH 2/3] feat(agent): add trigger-schedule api --- agent/src/agent.ts | 8 +++++++- agent/src/modules/chat.ts | 21 +++++++++++++++++++-- agent/src/types/agent.ts | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/agent/src/agent.ts b/agent/src/agent.ts index 9f1082f4..a6d875d9 100644 --- a/agent/src/agent.ts +++ b/agent/src/agent.ts @@ -12,7 +12,13 @@ export const createAgent = ({ brave, language = 'Same as the user input', allowedActions = allActions, - identity, + identity = { + botId: '', + sessionId: '', + containerId: '', + contactId: '', + contactName: '', + }, platforms = [], currentPlatform = 'Unknown Platform', }: AgentParams, fetch: AuthFetcher) => { diff --git a/agent/src/modules/chat.ts b/agent/src/modules/chat.ts index bba620d2..d807c925 100644 --- a/agent/src/modules/chat.ts +++ b/agent/src/modules/chat.ts @@ -4,7 +4,7 @@ import { createAgent } from '../agent' import { createAuthFetcher } from '../index' import { ModelConfig } from '../types' import { bearerMiddleware } from '../middlewares/bearer' -import { AllowedActionModel, IdentityContextModel, ModelConfigModel } from '../models' +import { AllowedActionModel, IdentityContextModel, ModelConfigModel, ScheduleModel } from '../models' import { allActions } from '../types' const AgentModel = z.object({ @@ -61,4 +61,21 @@ export const chatModule = new Elysia({ prefix: '/chat' }) }, { body: AgentModel, }) - \ No newline at end of file + .post('/trigger-schedule', async ({ body, bearer }) => { + const authFetcher = createAuthFetcher(bearer) + const { triggerSchedule } = createAgent({ + model: body.model as ModelConfig, + activeContextTime: body.activeContextTime, + platforms: body.platforms, + currentPlatform: body.currentPlatform, + allowedActions: body.allowedActions, + }, authFetcher) + return triggerSchedule({ + schedule: body.schedule, + messages: body.messages, + }) + }, { + body: AgentModel.extend({ + schedule: ScheduleModel, + }), + }) \ No newline at end of file diff --git a/agent/src/types/agent.ts b/agent/src/types/agent.ts index fd7def9b..20b69541 100644 --- a/agent/src/types/agent.ts +++ b/agent/src/types/agent.ts @@ -40,7 +40,7 @@ export interface AgentParams { activeContextTime?: number allowedActions?: AgentAction[] brave?: BraveConfig - identity: IdentityContext + identity?: IdentityContext platforms?: string[] currentPlatform?: string } From 85976afad7bb09cabd1576254666cf35fdbf66a5 Mon Sep 17 00:00:00 2001 From: Quincy <69751197+dqygit@users.noreply.github.com> Date: Fri, 6 Feb 2026 23:37:57 +0800 Subject: [PATCH 3/3] feat(web): redesign settings page (#26) * perf: change model ui * feat: edit provider * feat: layout update * fix: scroll bug * feat: model and provider * feat: Setting * perf: chat page --- config.toml.example | 2 +- db/migrations/0001_init.up.sql | 7 +- internal/db/sqlc/models.go | 2 +- .../TextGenerateEffect.vue | 57 +++ .../components/text-generate-effect/index.ts | 1 + packages/ui/src/index.ts | 1 + packages/web/src/App.vue | 41 +- packages/web/src/components/Sidebar/index.vue | 36 +- packages/web/src/pages/chat/index.vue | 23 +- packages/web/src/pages/login/index.vue | 59 +-- packages/web/src/pages/models/index.vue | 7 +- .../web/src/pages/models/modelSetting.vue | 12 +- packages/web/src/pages/settings/index.vue | 440 +++++++++--------- packages/web/src/style.css | 89 ++-- 14 files changed, 397 insertions(+), 380 deletions(-) create mode 100644 packages/ui/src/components/text-generate-effect/TextGenerateEffect.vue create mode 100644 packages/ui/src/components/text-generate-effect/index.ts diff --git a/config.toml.example b/config.toml.example index 3f1c5d4a..7f8458b1 100644 --- a/config.toml.example +++ b/config.toml.example @@ -35,7 +35,7 @@ host = "localhost" port = 5432 user = "postgres" password = "1234" -database = "postgres" +database = "demo" sslmode = "disable" diff --git a/db/migrations/0001_init.up.sql b/db/migrations/0001_init.up.sql index 6efab809..fc4b662e 100644 --- a/db/migrations/0001_init.up.sql +++ b/db/migrations/0001_init.up.sql @@ -325,6 +325,9 @@ CREATE INDEX IF NOT EXISTS idx_subagents_deleted ON subagents(deleted); CREATE TABLE IF NOT EXISTS user_settings ( user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, + chat_model_id TEXT, + memory_model_id TEXT, + embedding_model_id TEXT, max_context_load_time INTEGER NOT NULL DEFAULT 1440, - language TEXT NOT NULL DEFAULT 'Same as user input' -); + language TEXT NOT NULL +); \ No newline at end of file diff --git a/internal/db/sqlc/models.go b/internal/db/sqlc/models.go index cc53d80a..65a40ef2 100644 --- a/internal/db/sqlc/models.go +++ b/internal/db/sqlc/models.go @@ -61,10 +61,10 @@ type ChannelSession struct { BotID pgtype.UUID `json:"bot_id"` ChannelConfigID pgtype.UUID `json:"channel_config_id"` UserID pgtype.UUID `json:"user_id"` + ContactID pgtype.UUID `json:"contact_id"` Platform string `json:"platform"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` - ContactID pgtype.UUID `json:"contact_id"` } type Contact struct { diff --git a/packages/ui/src/components/text-generate-effect/TextGenerateEffect.vue b/packages/ui/src/components/text-generate-effect/TextGenerateEffect.vue new file mode 100644 index 00000000..83d23e93 --- /dev/null +++ b/packages/ui/src/components/text-generate-effect/TextGenerateEffect.vue @@ -0,0 +1,57 @@ + + + diff --git a/packages/ui/src/components/text-generate-effect/index.ts b/packages/ui/src/components/text-generate-effect/index.ts new file mode 100644 index 00000000..ec07e3f0 --- /dev/null +++ b/packages/ui/src/components/text-generate-effect/index.ts @@ -0,0 +1 @@ +export { default as TextGenerateEffect } from "./TextGenerateEffect.vue"; diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index cb74b21f..36042902 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -35,6 +35,7 @@ export * from './components/switch/index' export * from './components/table/index' export * from './components/tabs/index' export * from './components/tags-input/index' +export * from './components/text-generate-effect/index' export * from './components/textarea/index' export * from './components/toggle/index' export * from './components/tooltip/index' \ No newline at end of file diff --git a/packages/web/src/App.vue b/packages/web/src/App.vue index 3bc339e5..f1f29d4c 100644 --- a/packages/web/src/App.vue +++ b/packages/web/src/App.vue @@ -6,57 +6,18 @@ import { DropdownMenuItem, DropdownMenuTrigger, Toaster, - Separator } from '@memoh/ui' import SvgIcon from '@jamescoyle/vue-icon' import { mdiTranslate, mdiBrightness6 } from '@mdi/js' -import { useColorMode } from '@vueuse/core' + // @ts-ignore import 'vue-sonner/style.css' -const mode = useColorMode() -const modeToggleMap: Record<'dark' | 'light', 'dark' | 'light'> = { - dark: 'light', - light: 'dark' -} -const toggleMode = () => { - if (mode.value !== 'auto') { - mode.value = modeToggleMap[mode.value] - } -} @@ -79,26 +61,25 @@ import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, - SidebarRail, - CollapsibleTrigger, - Collapsible, - Button, + Toggle } from '@memoh/ui' import { computed } from 'vue' import SvgIcon from '@jamescoyle/vue-icon' import { mdiRobot, mdiChatOutline, mdiCogBox } from '@mdi/js' -import { useRouter } from 'vue-router' +import { useRouter,useRoute } from 'vue-router' import { useUserStore } from '@/store/User.ts' import i18n from '@/i18n' import { ref } from 'vue' + const router = useRouter() +const route=useRoute() const { t } = i18n.global -const curSlider = ref('chat') +const curSlider = ref() const curSelectSlide = (cur: string) => computed(() => { - return curSlider.value === cur + return curSlider.value === cur||new RegExp(`^/main/${cur}$`).test(route.path) }) const sidebarInfo = computed(() => [ { @@ -131,9 +112,4 @@ const sidebarInfo = computed(() => [ // } ]) -const { exitLogin } = useUserStore() -const exit = () => { - exitLogin() - router.replace({ name: 'Login' }) -} \ No newline at end of file diff --git a/packages/web/src/pages/chat/index.vue b/packages/web/src/pages/chat/index.vue index bbcbf53f..817312c3 100644 --- a/packages/web/src/pages/chat/index.vue +++ b/packages/web/src/pages/chat/index.vue @@ -8,16 +8,15 @@ -
-
- logo.png +
+

-

- Memoh +

@@ -54,15 +53,15 @@ import { ScrollArea, Textarea, - Button + Button, + TextGenerateEffect } from '@memoh/ui' import SvgIcon from '@jamescoyle/vue-icon' import { mdiSendOutline } from '@mdi/js' import ChatList from '@/components/ChatList/index.vue' import { provide, ref } from 'vue' import { useChatList } from '@/store/ChatList' -import {storeToRefs} from 'pinia' - +import { storeToRefs } from 'pinia' const chatSay = ref('') const curInputSay = ref('') diff --git a/packages/web/src/pages/login/index.vue b/packages/web/src/pages/login/index.vue index 30d5c40e..af4f0071 100644 --- a/packages/web/src/pages/login/index.vue +++ b/packages/web/src/pages/login/index.vue @@ -2,38 +2,38 @@
- logo.png -

- Memoh + 欢迎使用

-
+ - + - + + -
- -
- + - + + -
- -
@@ -66,6 +67,7 @@
+