Commit Graph
93 Commits
Author SHA1 Message Date
admin 1fc99293f6 feat(mobile): render evidence levels and route actions in ask page
- normalize evidenceLevel/uncoveredPoints/nextActions from agent response
- GUIDANCE banner (reference experience, non-formal), PARTIAL uncovered
  points list, ROUTE compact action buttons (human help / direct channel /
  web research); legacy responses render unchanged
- one-tap human help on ROUTE: auto-submit down feedback (NO_ANSWER,
  fragment-less allowed by backend) then existing confirm + idempotent
  publish chain
- direct channel page supports ?channel= preselection
2026-08-05 00:53:00 +08:00
key 12fc9fdddc feat: add query observability and collation safeguards 2026-08-04 02:15:03 +08:00
key 721839c847 feat(aihr): harden finance RAG retrieval and evidence gates 2026-08-03 22:34:18 +08:00
key a07bbcca07 fix: support authenticated video citation playback 2026-08-02 22:04:09 +08:00
key 6ad8a017a4 feat(aihr): close functional checklist gaps 2026-08-02 12:15:45 +08:00
key 699cc08050 feat: govern knowledge assets and source citations 2026-08-02 01:43:43 +08:00
key c16a3e83d7 feat(release): close handler and microphone gaps 2026-07-30 12:01:45 +08:00
key 380d8e6e32 fix(mobile): converge work report confirmation 2026-07-30 00:14:42 +08:00
key 5027bef32d fix(mobile): support Android system file picker 2026-07-29 23:52:44 +08:00
key 70e5516ff3 fix(release): close fixed-code mobile auth gaps 2026-07-29 11:59:30 +08:00
key cb928edafd fix(mobile): handle file picker cancellation 2026-07-29 02:01:45 +08:00
key 9ea5d79a62 release: prepare August 1 Android RC 2026-07-29 00:35:15 +08:00
admin f57e0a53c6 feat(mobile): expand TTS voices and align App SDK 2026-07-26 17:05:43 +08:00
admin 94ee29f59c fix(speech): write native TTS temp file as binary and clean it up
App-Plus 的 plus.io FileWriter 只接受字符串:write 写文本,writeAsBinary 收
base64。原先传 Blob 会被原生桥接序列化成空内容,落地 0 字节且照样回调
onwriteend,InnerAudioContext 静默播完、不报错,表现为"界面正常但没有声音"。
改用 writeAsBinary 并在 onwriteend 里复核 size > 0,让写盘失败能被暴露。

清理侧同一处存在文件泄漏:播放要 convertLocalFileSystemURL 转出的 file://
绝对路径,而 resolveLocalFileSystemURL 删除只认 `_doc/xxx.mp3` 相对路径。
原先只回传前者,拿它去 resolve 解析不到,remove() 从不执行,且 catch 静默,
临时 mp3 逐句堆积。改为返回 { playbackUrl, plusPath } 两个路径,清理失败加告警。

真机验证(Android 10 / io.dcloud.HBuilder):落盘 80251 字节,ID3+LAME 头,
MPEG layer III 160 kbps 24 kHz 单声道,播完文件自动删除。

顺带把测试里 MP3 头字面量的真实 NUL 字节改为 \x00 转义(运行时字节不变),
此前 git 将该测试文件判为二进制,diff 无法审阅。
2026-07-26 12:10:50 +08:00
adminandClaude Opus 5 5cf7ce5847 feat(practice): run realtime practice on App-Plus through renderjs
App-Plus has no WebRTC or getUserMedia in the logic layer, so realtime
practice was H5-only and the native entry had to advertise a record-then-
transcribe downgrade.

Move the media/WebRTC engine into `realtime-browser-engine.js` and drive it
from `RealtimePracticeAppBridge.vue`, whose renderjs script runs inside the
system WebView where those APIs do exist. The logic layer keeps the
authenticated calls: SDP exchange and `search_knowledge` tool invocation stay
server-proxied, so the access token is never handed to the view layer. Both
sides talk over the renderjs bridge only in session payloads the server
already assembled.

Verified against a real App build (`app-renderjs.js` holds RTCPeerConnection
and getUserMedia; `app-service.js` holds the SDP endpoint, renderjs side has
zero hits). Microphone permission, live transcription, remote playback,
foreground/background switching and disconnect fallback still require Android
and iOS device verification.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 23:58:10 +08:00
adminandClaude Opus 5 3055d2bec9 fix(mobile): replace App-Plus unsupported date and query APIs
`URLSearchParams` is absent from the App-Plus JS core, and
`toLocaleDateString('sv-SE', { timeZone: 'Asia/Shanghai' })` depends on full
ICU data that the App runtime does not ship, so the work-result pages built
either a broken query string or the device-local date.

Build query strings with `encodeURIComponent`, and centralise the business day
in `currentShanghaiDate()`, which shifts the epoch by a fixed UTC+8 offset
before slicing the ISO date. Asia/Shanghai has no DST, so the fixed offset is
exact rather than an approximation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 23:57:06 +08:00
adminandClaude Opus 5 27f4cdac70 fix(mobile): abort uni.request when the platform timeout does not fire
Some uni-app platforms ignore the `timeout` option, leaving the returned
promise pending forever and hanging the calling page with no error path.

Drive the deadline locally: keep a single-shot `finish` guard so success,
failure and timeout can only settle once, and on timeout call `task.abort()`
before rejecting so the in-flight request is released instead of leaking.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 23:56:56 +08:00
admin ab3af277c1 fix(speech): convert base64 TTS data URI before playback per platform
后端 TTS 以 data: URI 返回 base64 mp3(生产实证为合法 LAME mp3),但
App-Plus 的 InnerAudioContext 不支持 data: URI,iOS Safari/微信 webview
也常静默失败,统一报"语音播放失败"。播放前按平台转换:H5 转 Blob URL,
App 端经 plus.io 落 _doc/ 临时文件后播放 file:// 路径,播完清理;Blob 不可
用时退回原始 data: URI。竞态守卫与缓存语义保持不变,158 单测全绿。
2026-07-25 20:37:30 +08:00
admin acd5fd3a6d fix(practice): generate replies from coach hints 2026-07-25 15:44:45 +08:00
admin 230dfb4dfc feat(broadcast): finish multi-role insight experience 2026-07-25 15:18:58 +08:00
admin 35b37b07f7 feat(practice): server-owned realtime personas with knowledge tool calling
- AihrRealtimePersonaRegistry whitelist: owner-calm (default), owner-impatient,
  digital-mentor (search_knowledge); persona binds default voice
- /realtime/session assembles session.update server-side (instructions/tools);
  browser forwards payload verbatim; Redis session record 30min with sliding renewal
- /realtime/tools/invoke validates login identity + Redis session ownership +
  persona tool whitelist, then read-only searchAuthorized; per-account rate limits
- source=realtime skips sop review and knowledge-gap persistence (Beta no-persist)
- frontend: persona cards replace 56-voice picker; serialized tool-call chain with
  soft-landing fallback
2026-07-25 11:13:04 +08:00
admin f545983de8 fix(knowledge): bind summary cards to cited evidence 2026-07-25 01:45:41 +08:00
admin 4d2b3828c0 feat(brand): rename product to 帮道 2026-07-25 01:09:49 +08:00
admin c9d2012ec1 feat(aihr): finalize practice growth and access boundaries 2026-07-25 00:42:19 +08:00
admin 09278d40c6 merge: integrate broadcast question correction
# Conflicts:
#	docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md
2026-07-25 00:13:49 +08:00
admin 5f8d8f96f0 fix(agent): preserve broadcast consultation context 2026-07-25 00:12:53 +08:00
admin 342f84a9de feat(aihr): complete company message R1-R3 2026-07-24 23:25:15 +08:00
admin 5b7c5613f5 feat(agent): move mobile ask to unified agent 2026-07-24 22:36:14 +08:00
admin 442ba66848 fix(knowledge): make protected file downloads WebView-safe 2026-07-24 13:31:30 +08:00
admin 474d46e728 feat(speech): add qwen tts voice preferences 2026-07-24 01:54:37 +08:00
admin 067cc30d80 feat(aihr): complete M3 protected practice replay 2026-07-23 22:21:43 +08:00
admin 927458b9e0 feat(aihr): harden M0-M2 mobile training flows 2026-07-23 21:18:13 +08:00
admin 0f5c2e8667 feat(mobile-app): prepare native app packaging 2026-07-23 14:40:23 +08:00
admin f6609808df feat(aihr): add M1 broadcast targeting and mandatory reads 2026-07-23 12:11:41 +08:00
admin 4b31848e3d fix(aihr): harden broadcast and mobile assistant flows 2026-07-23 03:35:36 +08:00
admin b4ae0e6da0 feat(mobile-uni): 彻底完成登录页、首页、学习中心与问答页UI/UX极简重构及单条消息追问功能 2026-07-23 02:16:57 +08:00
admin 455267cf6f feat: add realtime practice voice selector 2026-07-22 12:24:46 +08:00
admin 87772cc64c feat: add qwen realtime practice beta 2026-07-22 09:29:39 +08:00
admin 2488febf19 Merge branch 'codex/personal-assistant-phase2' into codex/multi-tenant-knowledge-platform
# Conflicts:
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/domain/AihrSopDto.java
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrModelSeedService.java
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSopSeedService.java
#	backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrModelSeedServiceTest.java
#	backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrSopSeedServiceTest.java
#	docs/API_INTEGRATION.md
#	docs/个人AI助理阶段二专项TechSpec.md
#	docs/个人AI助理阶段二开发推进计划.md
#	frontend/src/views/knowledge/processing.vue
#	mobile-uni/src/pages/user/sop/index.vue
#	mobile-uni/src/services/api.ts
#	mobile-uni/src/services/personal-assistant.ts
#	mobile-uni/tests/personal-assistant.test.mjs
#	scripts/demo-check.sh
#	scripts/personal-assistant-smoke.sh
2026-07-22 08:54:04 +08:00
admin c38a723ae4 Merge branch 'codex/brd-release-20260715' into codex/multi-tenant-knowledge-platform
# Conflicts:
#	AGENTS.md
#	README.md
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/domain/AihrPracticeDto.java
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrOrgSyncService.java
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java
#	backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrUploadQueueService.java
#	backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrOrgSyncServiceTest.java
#	backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java
#	backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrUploadQueueServiceTest.java
#	docs/20260708/uni-app用户侧前端重建计划.md
#	docs/API_INTEGRATION.md
#	docs/BRD_IMPLEMENTATION_AUDIT.md
#	docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md
#	docs/DEMO_ACCEPTANCE.md
#	docs/DEV_SETUP.md
#	docs/FIGMA_IMPLEMENTATION_MATRIX.md
#	docs/README.md
#	frontend/src/views/knowledge/processing.vue
#	mobile-uni/src/pages/supervisor/assign/index.vue
#	mobile-uni/src/pages/supervisor/index/index.vue
#	mobile-uni/src/pages/supervisor/profile/index.vue
#	mobile-uni/src/pages/supervisor/review/index.vue
#	mobile-uni/src/pages/supervisor/reviews/index.vue
#	mobile-uni/src/pages/supervisor/team/index.vue
#	mobile-uni/src/pages/user/cases/index.vue
#	mobile-uni/src/pages/user/practice/index.vue
#	mobile-uni/src/pages/user/profile/index.vue
#	mobile-uni/src/pages/user/sop/index.vue
#	mobile-uni/src/pages/user/today/index.vue
#	mobile-uni/src/types/api.ts
#	scripts/tests/aihr-schema-migrations.test.sh
2026-07-22 08:41:49 +08:00
admin 4536d607e3 feat: add project-scoped work assistant results 2026-07-21 04:44:15 +08:00
admin 7716f0040d feat(mobile): AI question generation panel in supervisor exam editor
Hints input + preset chips + count picker; generated questions land in
the existing editor blocks for the supervisor to review before publish.
2026-07-20 10:16:40 +08:00
admin 0a5fc9a463 feat(assistant): unify confirmed memory capture 2026-07-20 02:30:06 +08:00
admin 61bc7191d1 feat(web-ai): support qwen image search safely 2026-07-19 22:58:20 +08:00
admin 925b48e436 feat(work-report): add voice-first reporting flow 2026-07-19 12:17:11 +08:00
admin 24da833fa6 feat(personal-assistant): add confirmed project memory 2026-07-19 08:19:24 +08:00
admin 9210b7dde6 feat(speech): switch mentor voice to anna and slow warm speed to 0.88
diana auditioned too bright for the mentor persona; anna measures
steadier (median F0 220Hz, lowest variance) in production auditions.
2026-07-19 03:01:48 +08:00
admin 4c2b5deb00 feat(mobile): redesign today home and switch mentor persona to female
- today: immersive community hero + hold-to-talk voice card, numbered
  schedule rows, common-functions grid (learning/report/question-board)
- login: female mentor bust; sop: female mentor chat avatars
- speech: raise browser-fallback mentor pitch to match female voice
2026-07-19 02:38:18 +08:00
admin 064816a784 feat(knowledge): add short-term ask memory 2026-07-18 21:22:49 +08:00
admin 68d5600534 feat(speech): add role-aware emotional TTS profiles 2026-07-18 18:27:14 +08:00