stefanfeng
f4389612d1
revert: restore authorization management behavior
2026-09-15 15:43:23 +08:00
stefanfeng
9ba89ef2d1
fix: align authorization page with frontend api types
2026-09-15 14:42:20 +08:00
stefanfeng
2f287ef538
feat: refine embedded avatar authorization controls
2026-09-15 14:27:22 +08:00
stefanfeng
5fc56143ee
fix(avatar): restore app shell session before loading h5
2026-09-11 15:46:31 +08:00
stefanfeng
35e47bf0a1
fix(avatar): mark native shell before bridge readiness
2026-09-11 13:39:41 +08:00
stefanfeng
1ab56ad0b1
fix(avatar): 仅在 uniapp 容器展示充值入口
2026-09-11 11:56:48 +08:00
stefanfeng
857d6f2562
fix(avatar): enforce each turn response language
2026-09-09 13:33:45 +08:00
stefanfeng
5ce12771b9
fix(avatar): persist SQLite WAL across releases
2026-09-09 11:06:03 +08:00
stefanfeng
4c152230aa
build(avatar): preserve backend dependency cache
2026-09-09 10:58:09 +08:00
stefanfeng
9ce46cd883
fix(avatar): support legacy deployment Python
2026-09-09 10:56:43 +08:00
stefanfeng
140ac20281
fix(avatar): prevent stale deployment images
2026-09-09 10:47:18 +08:00
stefanfeng
8585d101d5
feat: add avatar payments and finance management
2026-09-08 18:47:29 +08:00
stefanfeng
848657219e
fix(avatar): OCR image-only knowledge PDFs
2026-09-08 16:44:18 +08:00
stefanfeng
434caac056
feat(avatar): honor square interaction authorization
2026-09-08 13:19:50 +08:00
stefanfeng
28fcd5373b
fix(avatar): follow language changes each turn
2026-09-08 10:23:34 +08:00
stefanfeng
2ce1079bb6
fix(avatar): repair knowledge reindex action
2026-09-08 09:06:33 +08:00
stefanfeng
e71267cf86
fix(avatar): upload knowledge files in chunks
2026-09-07 17:45:22 +08:00
stefanfeng
3edf92c7cc
feat(avatar): show multi-file knowledge upload progress
2026-09-04 16:40:16 +08:00
stefanfeng
08c58fe0e6
fix(avatar): cap knowledge files at 50MB
2026-09-04 15:18:39 +08:00
stefanfeng
6b7201e890
fix(avatar): align knowledge upload limit with production
2026-09-04 13:56:29 +08:00
stefanfeng
28553aba15
fix(avatar): allow knowledge uploads up to 20MB
2026-09-04 13:47:46 +08:00
stefanfeng
b98a2b9507
fix(avatar): index knowledge documents asynchronously
2026-09-04 11:53:56 +08:00
stefanfeng
6a4b35c49a
fix(avatar): ground replies in recognized images
2026-09-02 14:47:27 +08:00
stefanfeng
7cac96356d
fix(avatar): recover BOXIM image replies
2026-09-02 14:12:04 +08:00
stefanfeng
0fc43908ae
feat(avatar): understand BOXIM image messages
2026-09-01 15:35:41 +08:00
stefanfeng
540edb58c4
fix(avatar): prevent BOXIM polling starvation
2026-09-01 14:03:35 +08:00
stefanfeng
016bc22c05
feat(avatar): add private vision chat support
2026-08-31 15:10:50 +08:00
stefanfeng
6794e88d53
fix(avatar): normalize embedding API endpoint
2026-08-28 16:59:22 +08:00
stefanfeng
46d42b7d98
fix(avatar): prevent takeover loops and isolate settings
2026-08-27 11:30:12 +08:00
stefanfeng
ef58c5f2d2
feat(avatar): optimize embedded H5 management flow
2026-08-27 09:28:05 +08:00
stefanfeng
c37294be17
feat(avatar): integrate Huihui payments
2026-08-26 14:41:21 +08:00
stefanfeng
5360cac8ad
fix(avatar): normalize legacy plan copy
2026-08-26 14:02:38 +08:00
stefanfeng
ea932f27fb
feat(avatar): rename Token display to points
2026-08-26 14:01:12 +08:00
stefanfeng
0c6419f37e
fix(avatar): restore BOXIM takeover after restart
2026-08-26 13:25:16 +08:00
stefanfeng
f768e7648f
fix(avatar): prevent inferred reply scenarios
2026-08-26 11:56:54 +08:00
stefanfeng
e30ab2b889
feat(avatar): follow user language in replies
2026-08-26 11:52:32 +08:00
stefanfeng
ef2b1c6dd6
chore(avatar): add WeChat verification file
2026-08-26 09:51:13 +08:00
stefanfeng
c693899b12
docs(avatar): set production H5 domain
2026-08-26 09:44:22 +08:00
stefanfeng
5d19992f00
fix(avatar): remove SSO token from router state
2026-08-26 09:25:07 +08:00
stefanfeng
81aec1c63a
feat(avatar): support production H5 token SSO
2026-08-26 09:17:41 +08:00
stefanfeng
4029c31ed7
fix(avatar): bundle uni bridge and add favicon
2026-08-25 17:19:30 +08:00
stefanfeng
e24e89d326
fix(deploy): serialize model migration and pin nginx
2026-08-25 16:59:15 +08:00
stefanfeng
dc34a03357
feat(ai): add dedicated digital avatar model config
2026-08-25 16:50:33 +08:00
stefanfeng
3f7ff9329a
fix(avatar): align QA cards to the left
2026-08-25 15:36:49 +08:00
stefanfeng
699bbbde57
feat(avatar): add user token accounting
2026-08-25 13:24:02 +08:00
stefanfeng
7a0199e685
feat(avatar): improve multi-avatar management
2026-08-25 11:44:27 +08:00
stefanfeng
672019830d
fix(avatar): prevent takeover replies blocking across chats
2026-08-21 16:21:00 +08:00
stefanfeng
e720baa21e
fix(avatar): batch knowledge embedding requests
2026-08-21 13:21:05 +08:00
stefanfeng
e2b928273c
fix(avatar): acknowledge BOXIM messages as read
2026-08-20 17:10:54 +08:00
stefanfeng
64b7680ec4
fix(avatar): keep BOXIM status ready during long polls
2026-08-20 15:58:07 +08:00
stefanfeng
89f52963b7
fix(avatar): persist takeover toggle immediately
2026-08-20 15:55:12 +08:00
stefanfeng
76bd22c24b
fix(avatar): preserve ownership across Huihui environments
2026-08-20 15:27:29 +08:00
stefanfeng
51a317ccd9
fix(avatar): fail closed on BOXIM connection errors
2026-08-20 14:47:13 +08:00
stefanfeng
08590bf9ea
fix(avatar): refresh BOXIM takeover status
2026-08-19 18:03:59 +08:00
stefanfeng
25fb8fbee5
feat(avatar): add BOXIM chat takeover
2026-08-19 17:56:57 +08:00
stefanfeng
cfcfe7146e
feat(avatar): align authorization page with design
2026-08-19 17:05:22 +08:00
stefanfeng
2e2adeb9e2
feat(avatar): complete authorization management
2026-08-19 16:21:19 +08:00
stefanfeng
25d2494616
fix: surface missing knowledge files
2026-08-19 15:13:22 +08:00
stefanfeng
bd5f64d000
fix: align avatar route titles
2026-08-19 15:09:38 +08:00
stefanfeng
350df1d119
build: pin secure frontend transitive dependencies
2026-08-19 15:01:39 +08:00
stefanfeng
64462fac92
build: enforce locked frontend type checks
2026-08-19 14:57:40 +08:00
stefanfeng
6bf446f889
fix: restore reproducible frontend builds
2026-08-19 14:56:39 +08:00
stefanfeng
68ea87e1b2
fix: persist avatar data and uploads
2026-08-19 14:44:58 +08:00
stefanfeng
c5bfa47a23
fix: await takeover polling jobs
2026-08-19 14:32:10 +08:00
stefanfeng
4ab7732da9
fix: preserve takeover and share token integrity
2026-08-19 14:23:43 +08:00
stefanfeng
4a2d788e85
feat: complete grounded digital avatar chat experience
2026-08-19 14:21:56 +08:00
stefanfeng
07d4a21379
fix: sync Huihui app user homepage profile
2026-08-18 08:48:20 +08:00
stefanfeng
efc419e301
fix: sync virtual user profiles to Huihui public pages
2026-08-18 08:48:20 +08:00
stefanfeng
c748950402
fix: accept camelCase authorizationId from frontend
2026-08-07 17:18:34 +08:00
stefanfeng
f13d488f82
feat: add takeover config API endpoint
...
PUT /api/avatar/{avatar_id}/authorizations/takeover to update authorization
takeover settings (enabled, mode, delay_seconds) with validation.
2026-08-07 17:15:12 +08:00
stefanfeng
43f2ad9edb
feat: add takeover config UI to authorization management page
...
- Added updateTakeoverConfig API function (PUT /api/avatar/{id}/authorizations/takeover)
- Added expandable takeover config section per auth card with toggle switch, mode selector (immediate/delayed), and delay seconds input
- Added takeover summary badge showing current config when not editing
- Styles follow existing light theme with indigo (#6366F1) accent
2026-08-07 17:07:21 +08:00
stefanfeng
8e365e63e1
feat: add scheduled message polling for avatar takeover
...
Add APScheduler BackgroundScheduler to on_startup that polls
takeover_service.poll_and_process_messages every 10 seconds. Added
redis and apscheduler dependencies. Added poll_and_process_messages,
fetch_unread_messages, and process_message methods to TakeoverService.
Scheduler initialization is graceful — Redis/Box IM failures do not
prevent app startup.
2026-08-07 17:01:04 +08:00
stefanfeng
dbd668e451
fix: resolve owner through Avatar model in takeover service
...
- Fix C1: check_takeover_enabled now uses owner_huihui_id to query Avatar first
- Fix C2: execute_takeover resolves owner_id via Avatar model (Authorization has no owner_id)
- Fix I1: add test for None case (no Avatar found)
- Fix I2: add test verifying filter arguments
- Fix I3: implement process_delayed_queue to scan and dispatch expired messages
2026-08-07 16:55:25 +08:00
stefanfeng
190ec48d9c
feat: add takeover service core logic
...
Implement TakeoverService for avatar takeover chat feature:
- check_takeover_enabled: query Authorization for enabled takeover
- generate_reply: call local chat API via httpx to generate responses
- execute_takeover: get owner IM credentials, generate reply, send via BoxIM
- enqueue_delayed_message: Redis delayed queue with graceful degradation
- process_delayed_queue: placeholder for scheduled worker
Service degrades gracefully when Redis is unavailable.
2026-08-07 16:46:57 +08:00
stefanfeng
0cc43a0d8c
fix: exclude signature from signing string in BoxIMClient
...
Prevents stale signature values from leaking into the MD5 signing
calculation, matching the news_service.py pattern. Adds a test that
passes a stale signature in extra params and verifies the returned
signature is freshly computed.
2026-08-07 16:42:00 +08:00
stefanfeng
43bb57eacf
feat: add Box IM client for Netease Yunxin integration
...
Add BoxIMClient with get_credentials and send_p2p_message methods,
using Huihui platform MD5 signing mechanism (sorted keys, 24h timestamp,
12-char alphanumeric nonce). Includes full test coverage.
2026-08-07 16:36:50 +08:00
stefanfeng
7327939b4d
feat: add takeover fields to Authorization model
...
Add takeover_enabled, takeover_mode, and takeover_delay_seconds columns
to the Authorization model with a SQLite migration, and include them
in to_dict(). Test: test_takeover_model.py.
2026-08-07 16:30:29 +08:00
stefanfeng
76f0730b57
docs: add avatar takeover chat implementation plan
2026-08-07 16:22:58 +08:00
stefanfeng
6f6655e791
docs: add avatar takeover chat design spec
2026-08-07 16:12:49 +08:00
stefanfeng
e3cce871b0
fix: add avatar photo upload endpoint to digital-avatar-app backend
...
- Add POST /api/avatar/{id}/photo endpoint
- Save uploaded photos to UPLOAD_DIR/{avatar_id}/
- Update avatar.photo_url in database
- Import UPLOAD_DIR from knowledge router
2026-08-07 15:10:59 +08:00
stefanfeng
b7f8ac203b
feat: add avatar photo upload via Huihui filecenter
...
- Add POST /avatars/{id}/upload-photo endpoint
- Use Huihui platform's filecenter API for image upload (same signing mechanism as news_service)
- Add upload button in avatar list table
- Frontend: handleUploadPhoto function with el-upload component
- Updates avatar photo_url in SQLite after successful upload
2026-08-07 14:28:22 +08:00
stefanfeng
a5f7c86a4b
fix: avatar list table full-width and image fallback
...
- Changed fixed width columns to min-width for elastic layout
- Add @error handler on el-avatar to hide broken images and show emoji
- Detail dialog avatar also handles image load errors
2026-08-07 14:04:45 +08:00
stefanfeng
6026b1279e
fix: avatar list fixes — full-width table, absolute photo URLs, global token balance
...
- Table width set to 100%
- Photo URLs resolved to absolute paths using AVATAR_BACKEND_URL
- Token balance now reads from global token_account table
- Config: added AVATAR_BACKEND_URL setting
2026-08-07 13:53:02 +08:00
stefanfeng
57af1c7db1
fix: gracefully handle missing avatar SQLite database
...
- Return empty list instead of crashing when avatar.db doesn't exist
- Add is_available() check before each endpoint
- 503 status when trying to access unavailable database
2026-08-06 17:52:01 +08:00
stefanfeng
bbbc97eb4a
feat: add digital avatar management to admin dashboard
...
- Add avatars list page with pagination, search, status filter
- Add avatar detail dialog showing full info and config params
- Add on/off switch (active/inactive status toggle)
- Backend: avatar_service.py connects to digital avatar SQLite
- Backend: /api/avatars endpoints for list, detail, status update
- Sidebar menu item added below dashboard
- docker-compose: mount SQLite db and set AVATAR_DB_PATH env var
2026-08-06 17:43:50 +08:00
stefanfeng
1da5f7f10d
fix: open logged-in users on avatar management
2026-07-24 17:54:02 +08:00
stefanfeng
cc939b6298
fix: guard avatar entry and hide chat navigation
2026-07-24 17:50:19 +08:00
stefanfeng
e3bda469bb
feat: complete huihui square avatar workflows
2026-07-24 14:04:21 +08:00
stefanfeng
2ef58a44b8
chore: normalize avatar app whitespace
2026-07-23 17:29:29 +08:00
stefanfeng
2d9f26a6f0
feat: add avatar chat and knowledge workflow
2026-07-23 17:21:49 +08:00
stefanfeng
501f548bcc
docs: add avatar chat implementation plan
2026-07-23 16:27:02 +08:00
stefanfeng
cc8af846d5
docs: design avatar chat knowledge flow
2026-07-23 16:06:30 +08:00
stefanfeng
79d57da769
fix: 今日文章不足时混入历史文章,避免所有用户扎堆同一篇
...
问题:今日只有1篇文章时,所有虚拟用户都只互动这同一篇
原因:Phase 1 找到今日文章后直接返回,不管数量多少
修复逻辑:
- 今日有效文章 → 每用户最多取 1 篇(count//3,最少1篇)
- 剩余名额(count - today_quota)从历史文章补充
- 历史文章:按当前小时对应页拉取(与Phase 2相同),随机打散
- 历史文章排除今日文章ID和当天发布的文章,保证内容不重复
- 最终返回:今日N篇 + 历史M篇,总量接近 count
效果:今日1篇文章时 → 用户取1篇今日 + 4篇历史,互动多样性恢复
2026-04-08 11:49:57 +08:00
stefanfeng
c944fbb0ea
fix: 今日文章配额控制,避免全部虚拟用户集中互动同一篇
...
问题:今日只有1篇文章时,所有虚拟用户全部互动该文章,历史文章无人问津
修复方案(配额制):
- 新增 count_today_articles():轻量统计今日广场文章数
- 配额规则:每篇今日文章最多吸引3个虚拟用户(可调)
- 今日1篇 → 最多3人互动今日,其余全走历史
- 今日5篇 → 最多15人互动今日,其余走历史
- 今日10篇以上 → 批次内所有人均可互动今日文章
- get_news_list() 新增 force_history 参数,强制走 Phase 2
- 调度器在分发任务前计算配额,超出配额的用户透传 force_history=True
效果:新文章获得合理曝光,历史文章持续被互动,分布更自然
2026-04-08 11:47:36 +08:00
stefanfeng
b43ee777fc
feat: 互动记录/数据看板自动刷新 + 日志时间格式修复
...
1. Interactions.vue: 每30秒自动刷新互动记录列表
2. Dashboard.vue: 每30秒自动刷新数据看板
3. Logs.vue: 时间格式修复(T→空格,去掉时区标识)
4. logs.py: created_at 改用 strftime 输出 +08:00 格式(而非 isoformat 的 +00:00)
页面保持浏览时自动获取最新数据,离开页面时自动清除定时器
2026-04-07 14:51:59 +08:00
stefanfeng
7d9f5a358b
fix: 使用正确的广场接口 /business/square/list
...
问题根因:
- 一直用 /business/member/square/list(成员广场接口)
- 该接口加了 isPlatformShow=true 和 isAdmin=false 过滤
- 导致大量文章(包括今日最新文章)被过滤掉,只剩124篇
- 正确接口 /business/square/list?type=1 有2504篇文章,今日文章可见
修改内容:
1. 接口地址改为 /business/square/list(4处)
2. 去掉 isPlatformShow 和 isAdmin 参数,只保留 type=1
3. _is_today 时间字段优先用 publishTime(新接口主要返回此字段)
4. 排序和热度权重计算也统一用 publishTime 优先
2026-04-07 14:32:35 +08:00
stefanfeng
b6e094c9c0
fix: 过滤 recordId/title 为 null 的异常广场条目(type!=1)
2026-04-07 14:14:57 +08:00
stefanfeng
d6ad1db535
fix: Phase2始终从第1页(最新)开始,按小时递进页码
...
问题:
- 原实现用 hour % total_pages 决定起始页
- 13点时 13%3=1,start_page=2,直接跳过第1页(最新文章)
- 导致虚拟用户永远不互动最新发布的文章
修复:
- 第1页(最新文章)始终在获取总页数时一并拉取,零额外开销
- hour_page = (hour % max_pages) + 1,每小时推进一页(1→2→3...循环)
- 0点=第1页最新,1点=第2页,依此类推,形成完整的新→旧覆盖
- 若当前时段页为空则顺序回退,最终兜底第1页
Phase 1(今日新文章)逻辑不变
2026-04-07 13:52:59 +08:00
stefanfeng
169e798718
fix: 历史文章改为从新到旧顺序翻页,而非随机
...
修复原因:
- 需求要求从最新文章开始往旧的方向依次互动
- 原实现随机选页,导致每次跳到不同页,无法体现「从新到旧」
- 列表API返回的文章已按 createTime 降序排列(第1页最新)
新Phase 2逻辑:
- 计算总页数(最多10页)
- 用当前小时 % 总页数 决定起始页(同小时内分散到不同页)
- 若起始页为空,顺序往后再折回,直到找到有文章的页
- 在同一页内随机打散,保证同一时段不同用户不总是抢相同文章
- validate_article 校验,不够则从剩余补充
Phase 1(今日新文章)逻辑不变:
- 仍从第1页抓取当天文章,按 createTime 降序(新→旧)排列后校验返回
2026-04-07 13:24:42 +08:00
stefanfeng
053d22965c
feat: 调度优先今日新文章,无新文章时随机历史翻页
...
新调度规则:
Phase 1 — 今日新文章优先(从新到旧轮询):
- 从第1页开始拉取(接口返回最新优先)
- 只保留今日发布的文章,按 createTime 降序排列(新→旧)
- 最多扫描3页,发现非今日文章立即停止
- 对今日文章逐篇 validate_article 校验后返回
Phase 2 — 历史兜底(仅今日无新文章时触发):
- 随机翻 1~10 页历史
- 热度+新鲜度加权采样(commentNum×3 + praiseNum×2 + readNum)
- validate_article 校验后返回
两阶段均包含:
- 本人发布文章过滤
- 静态+运行时无效ID过滤
- 文章有效性校验(不可开/正文<100字自动加入缓存黑名单)
2026-04-03 11:33:31 +08:00