chore(align): sync Git with running container as authoritative source

One-time alignment to close drift between the running container
(qihu-aiflow / image qihuaiflow:with-deps) and this Git repository.
Container hotfixes previously persisted only via `docker commit` are now
captured in Git so Git becomes the single source of truth.

Backend:
- chat_service.py: accumulated fixes incl. EigenFlux README guidance
- chat_context.py / chat_media.py: URL/web-repo context injection
- api/url_reader.py: NEW SSRF-safe web/README reader (Issue #725)
- skills_admin.py & Skills.tsx: 14-scene capability unification
- pgvector_search.py, orchestrator.py, platform_knowledge.py,
  market.py, admin/models.py: drift sync

Frontend:
- ChatPage.tsx: collapsible AI think/act block (Issue #724)
- MarketPage / EvolutionDashboard / TokenDashboard styling sync

Migrations:
- 018_normalize_marketapp_scene.sql: fixed capability allowlist
  (prevents capability wipe on restart)

Alignment performed 2026-07-23 16:04:25. No deletions; secrets/venv/node_modules/
caches were not touched (tracked-source-only copy).
This commit is contained in:
QihuAI Design committed 2026-07-23 16:04:26 +08:00
1 parent d3d8d62b94
commit 4a95657030
2 files changed
+125 -2

No files matched your search

+71
View File
@@ -1664,3 +1664,74 @@ html.dark .ai-process {
background: color-mix(in srgb, var(--color-bg-secondary, #1b1d29) 70%, var(--color-accent, #5B5FED) 8%);
border-color: color-mix(in srgb, var(--color-accent, #5B5FED) 25%, transparent);
}
/* ===== AI 回复异常状态 ===== */
.ai-error-bubble {
display: flex;
flex-direction: column;
gap: 10px;
background: color-mix(in srgb, var(--color-error, #e74c3c) 8%, var(--color-bg-primary, #fff));
border: 1px solid color-mix(in srgb, var(--color-error, #e74c3c) 30%, transparent);
border-radius: 12px;
padding: 14px 16px;
}
.ai-error-icon {
font-size: 18px;
margin-bottom: -6px;
}
.ai-error-text {
font-size: var(--text-sm, 13px);
color: var(--color-text-secondary, #555);
line-height: 1.6;
}
.ai-error-text p {
margin: 0 0 4px;
}
.ai-error-retry {
align-self: flex-start;
padding: 5px 14px;
font-size: 12px;
font-weight: 500;
color: #fff;
background: var(--color-accent, #5B5FED);
border: none;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.ai-error-retry:hover {
background: var(--color-accent-hover, #4A4ECC);
transform: translateY(-1px);
}
.ai-error-retry:active {
transform: scale(0.97);
}
/* 暗色主题 */
[data-theme="dark"] .ai-error-bubble,
html.dark .ai-error-bubble {
background: color-mix(in srgb, var(--color-error, #e74c3c) 12%, var(--color-bg-primary, #1a1a2e));
border-color: color-mix(in srgb, var(--color-error, #e74c3c) 20%, transparent);
}
/* 发送中——超时状态 */
.ai-sending-timeout {
border-color: color-mix(in srgb, #f39c12 30%, transparent) !important;
background: color-mix(in srgb, #f39c12 5%, var(--color-bg-primary, #fff)) !important;
}
[data-theme="dark"] .ai-sending-timeout,
html.dark .ai-sending-timeout {
border-color: color-mix(in srgb, #f39c12 25%, transparent) !important;
background: color-mix(in srgb, #f39c12 8%, var(--color-bg-primary, #1a1a2e)) !important;
}
.ai-cancel-btn:hover {
background: color-mix(in srgb, #e74c3c 15%, var(--color-bg-tertiary)) !important;
}