refactor(core): codebase quality cleanup

- Remove user-level model settings (chat_model_id, memory_model_id,
  embedding_model_id, max_context_load_time, language) from users table
- Merge migration 0002 into 0001, remove compatibility migrations
- Delete dead conversation/resolver.go (1177 lines, only flow/resolver.go used)
- Remove type aliases (Chat=Conversation, types_alias.go)
- Fix SQL: remove AND false stub, fix UpdateChatTitle model_id,
  reset model IDs in DeleteSettings, add preauth expiry filter,
  add ListMessages limit, remove 10 dead queries
- Extract shared handler helpers (RequireChannelIdentityID, AuthorizeBotAccess)
- Rename internal/router to internal/channel/inbound
- Fix identity confusion: remove UserID->ChannelIdentityID fallbacks
- Fix all _ = var patterns with proper error logging
- Fix error propagation: storeMessages, rescheduleJob, botContainerID
- Fix naming: ModelId->ModelID, active->is_active, Duration semantic fix
- Remove dead code: mcpService, ReplyTarget, callMCPServer, sshShellQuote,
  buildSessionMetadata, ChatRequest.Language, TriggerPayload.ChatID
- Fix code quality: errors.Is(), remove goto, CreateHuman deprecated
- Remove Enable model endpoint and user-level settings CLI commands
- Regenerate sqlc, swagger, SDK
This commit is contained in:
BBQ
2026-02-12 23:43:29 +08:00
parent 57dd75ff52
commit 85251a2905
87 changed files with 509 additions and 2994 deletions
+1 -5
View File
@@ -19,11 +19,6 @@ CREATE TABLE IF NOT EXISTS users (
avatar_url TEXT,
data_root TEXT,
last_login_at TIMESTAMPTZ,
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 'auto',
is_active BOOLEAN NOT NULL DEFAULT true,
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
@@ -39,6 +34,7 @@ CREATE TABLE IF NOT EXISTS channel_identities (
channel_type TEXT NOT NULL,
channel_subject_id TEXT NOT NULL,
display_name TEXT,
avatar_url TEXT,
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
@@ -1,2 +0,0 @@
-- 0002_channel_identity_avatar (down)
ALTER TABLE channel_identities DROP COLUMN IF EXISTS avatar_url;
@@ -1,3 +0,0 @@
-- 0002_channel_identity_avatar
-- Add avatar_url column to channel_identities for sender profile display.
ALTER TABLE channel_identities ADD COLUMN IF NOT EXISTS avatar_url TEXT;
-5
View File
@@ -43,8 +43,3 @@ SET user_id = $2, updated_at = now()
WHERE id = $1
RETURNING id, user_id, channel_type, channel_subject_id, display_name, avatar_url, metadata, created_at, updated_at;
-- name: ClearChannelIdentityLinkedUser :one
UPDATE channel_identities
SET user_id = NULL, updated_at = now()
WHERE id = $1
RETURNING id, user_id, channel_type, channel_subject_id, display_name, avatar_url, metadata, created_at, updated_at;
-3
View File
@@ -29,9 +29,6 @@ ON CONFLICT (container_id) DO UPDATE SET
last_stopped_at = EXCLUDED.last_stopped_at,
updated_at = now();
-- name: GetContainerByContainerID :one
SELECT * FROM containers WHERE container_id = sqlc.arg(container_id);
-- name: GetContainerByBotID :one
SELECT * FROM containers WHERE bot_id = sqlc.arg(bot_id) ORDER BY updated_at DESC LIMIT 1;
+21 -15
View File
@@ -59,6 +59,7 @@ SELECT
b.display_name AS title,
b.owner_user_id AS created_by_user_id,
b.metadata AS metadata,
chat_models.model_id AS model_id,
b.created_at,
b.updated_at,
'participant'::text AS access_mode,
@@ -69,6 +70,7 @@ SELECT
NULL::timestamptz AS last_observed_at
FROM bots b
LEFT JOIN bot_members bm ON bm.bot_id = b.id AND bm.user_id = sqlc.arg(user_id)
LEFT JOIN models chat_models ON chat_models.id = b.chat_model_id
WHERE b.id = sqlc.arg(bot_id)
AND (b.owner_user_id = sqlc.arg(user_id) OR bm.user_id IS NOT NULL)
ORDER BY b.updated_at DESC;
@@ -102,25 +104,29 @@ SELECT
FROM bots b
LEFT JOIN models chat_models ON chat_models.id = b.chat_model_id
WHERE b.id = $1
AND false
ORDER BY b.created_at DESC;
-- name: UpdateChatTitle :one
UPDATE bots
SET display_name = sqlc.arg(title),
updated_at = now()
WHERE id = sqlc.arg(id)
RETURNING
id,
id AS bot_id,
CASE WHEN type = 'public' THEN 'group' ELSE 'direct' END AS kind,
WITH updated AS (
UPDATE bots
SET display_name = sqlc.arg(title),
updated_at = now()
WHERE bots.id = sqlc.arg(bot_id)
RETURNING *
)
SELECT
updated.id AS id,
updated.id AS bot_id,
CASE WHEN updated.type = 'public' THEN 'group' ELSE 'direct' END AS kind,
NULL::uuid AS parent_chat_id,
display_name AS title,
owner_user_id AS created_by_user_id,
metadata,
NULL::text AS model_id,
created_at,
updated_at;
updated.display_name AS title,
updated.owner_user_id AS created_by_user_id,
updated.metadata,
chat_models.model_id AS model_id,
updated.created_at,
updated.updated_at
FROM updated
LEFT JOIN models chat_models ON chat_models.id = updated.chat_model_id;
-- name: TouchChat :exec
UPDATE bots
-3
View File
@@ -6,6 +6,3 @@ VALUES (
sqlc.arg(event_type),
sqlc.arg(payload)
);
-- name: ListLifecycleEventsByContainerID :many
SELECT * FROM lifecycle_events WHERE container_id = sqlc.arg(container_id) ORDER BY created_at ASC;
+2 -1
View File
@@ -56,7 +56,8 @@ SELECT
FROM bot_history_messages m
LEFT JOIN channel_identities ci ON ci.id = m.sender_channel_identity_id
WHERE m.bot_id = sqlc.arg(bot_id)
ORDER BY m.created_at ASC;
ORDER BY m.created_at ASC
LIMIT 10000;
-- name: ListMessagesSince :many
SELECT
-20
View File
@@ -136,29 +136,9 @@ VALUES (
)
RETURNING *;
-- name: GetModelVariantByID :one
SELECT * FROM model_variants WHERE id = sqlc.arg(id);
-- name: ListModelVariantsByModelUUID :many
SELECT * FROM model_variants
WHERE model_uuid = sqlc.arg(model_uuid)
ORDER BY weight DESC, created_at DESC;
-- name: ListModelVariantsByVariantID :many
SELECT * FROM model_variants
WHERE variant_id = sqlc.arg(variant_id)
ORDER BY created_at DESC;
-- name: UpdateModelVariant :one
UPDATE model_variants
SET
variant_id = sqlc.arg(variant_id),
weight = sqlc.arg(weight),
metadata = sqlc.arg(metadata),
updated_at = now()
WHERE id = sqlc.arg(id)
RETURNING *;
-- name: DeleteModelVariant :exec
DELETE FROM model_variants WHERE id = sqlc.arg(id);
+2
View File
@@ -7,6 +7,8 @@ RETURNING id, bot_id, token, issued_by_user_id, expires_at, used_at, created_at;
SELECT id, bot_id, token, issued_by_user_id, expires_at, used_at, created_at
FROM bot_preauth_keys
WHERE token = $1
AND used_at IS NULL
AND (expires_at IS NULL OR expires_at > now())
LIMIT 1;
-- name: MarkBotPreauthKeyUsed :one
+3 -16
View File
@@ -1,19 +1,3 @@
-- name: GetSettingsByUserID :one
SELECT id AS user_id, chat_model_id, memory_model_id, embedding_model_id, max_context_load_time, language
FROM users
WHERE id = $1;
-- name: UpsertUserSettings :one
UPDATE users
SET chat_model_id = $2,
memory_model_id = $3,
embedding_model_id = $4,
max_context_load_time = $5,
language = $6,
updated_at = now()
WHERE id = $1
RETURNING id AS user_id, chat_model_id, memory_model_id, embedding_model_id, max_context_load_time, language;
-- name: GetSettingsByBotID :one
SELECT
bots.id AS bot_id,
@@ -60,5 +44,8 @@ UPDATE bots
SET max_context_load_time = 1440,
language = 'auto',
allow_guest = false,
chat_model_id = NULL,
memory_model_id = NULL,
embedding_model_id = NULL,
updated_at = now()
WHERE id = $1;
-3
View File
@@ -8,6 +8,3 @@ VALUES (
sqlc.arg(digest)
)
ON CONFLICT (id) DO NOTHING;
-- name: ListSnapshotsByContainerID :many
SELECT * FROM snapshots WHERE container_id = sqlc.arg(container_id) ORDER BY created_at ASC;
-10
View File
@@ -8,13 +8,6 @@ SELECT *
FROM users
WHERE id = $1;
-- name: UpdateUserStatus :one
UPDATE users
SET is_active = $2,
updated_at = now()
WHERE id = $1
RETURNING *;
-- name: CreateAccount :one
UPDATE users
SET username = sqlc.arg(username),
@@ -54,9 +47,6 @@ ON CONFLICT (username) DO UPDATE SET
updated_at = now()
RETURNING *;
-- name: GetAccountByUsername :one
SELECT * FROM users WHERE username = sqlc.arg(username);
-- name: GetAccountByIdentity :one
SELECT * FROM users WHERE username = sqlc.arg(identity) OR email = sqlc.arg(identity);