28 Commits

Author SHA1 Message Date
zhulinsen
e45d5ce202 fix: 修复 Linux 分享图中文缺失 (#2270)
* fix: render CJK text in Linux share images

* fix(review-feedback-2270): 补到 PR 附件或评论里,和本次渲染修复说明保持一致

* fix: preserve report language contract in share images
2026-08-24 23:20:56 +08:00
zhulinsen
bcb7ae4e13 feat: 将参考 AlphaSift 的选股实现纳入主项目 (#2136)
* feat: integrate built-in stock screening engine

* test: verify screening routes via public contract

* refactor: make screening integration fully native

* fix(review-feedback-2136): [Verification blocker] 当前 Head 的阻断型 CI 已最终失败:backend-gate。请在本地运行对应

* feat: persist screening runs and reuse DSA analysis

* fix(review-feedback-2136): 对选股重排应用统一的模型参数兼容逻辑

* fix(review-feedback-2136): 将字段缺失计入数据源失败

* fix(review-feedback-2136): 评审结论 - 代码检查 :当前整个 PR 仍有 3 个未关闭的高置信度代码 blocker。最新复核摘要:当前整个 PR 仍有 3

* fix(review-feedback-2136): 延迟写入候选直到覆盖率通过校验 and 将 DSA 日线成功结果写入 last-good 缓存

* fix(review-feedback-2136): 将直连日线源纳入统一调用超时 and 将新增的选股缓存目录加入桌面更新备份

* fix(review-feedback-2136): 保留完整热点缓存而非请求切片 and 遵守 DSA 上下文声明的候选上限

* fix(review-feedback-2136): 补一条端到端回归:把真实 ScreenResult 经 ScreeningService.screen 落到 /history 和

* fix(review-feedback-2136): 补一个 refresh=true 且 live fetch 失败时返回 stale cache 的回归测试,避免当前只更新 stale
2026-08-01 14:13:23 +08:00
zhulinsen
e1e042096d fix: 修复 WebUI 版本与静态资源识别 (#2099)
* fix: make WebUI build identity reliable

* fix: address WebUI build metadata review

* fix: track WebUI dependency content state
2026-07-25 22:26:39 +08:00
JaxonHu
d13721e817 feat: 新增富途Futu真实持仓导入支持 (#2042)
* feat: add Futu portfolio import support

* docs: condense Futu changelog entry

* fix: tighten Futu portfolio import contracts
2026-07-20 22:45:45 +08:00
zhulinsen
d0ab0663b8 ci: speed up Docker build checks (#1820)
* ci: speed up docker build checks

* test: align Dockerfile cache assertion
2026-06-27 22:35:44 +08:00
mumu
cca629ff24 fix(issue-1771): chore(docker):-raise-default-compose-mem (#1774) 2026-06-24 20:17:20 +08:00
LunarFeller
e4c7ccec40 fix(docker): grant efinance cache dir to non-root user (#1749)
efinance writes its search cache (search-cache.json) into its own
package directory (site-packages/efinance/data), which is root-owned
in the image. Since the container runs as the non-root dsa user
(uid 1000), every A-share fetch failed with PermissionError, forcing
EfinanceFetcher (the default priority-0 source) to fail and fall back.

Pre-create and chown the efinance data dir to dsa at build time. The
path is resolved dynamically to avoid hardcoding the Python version.
This is image-internal static content, so the fix belongs at build
time rather than the runtime mount-repair in the entrypoint (#1263),
which only covers user-mounted volumes.

Fixes #1748

Co-authored-by: gang.wu@ximalaya.com <gang.wu@ximalaya.com>
Co-authored-by: mumu <42829555+ZhuLinsen@users.noreply.github.com>
2026-06-22 21:05:49 +08:00
mumu
0ca4e07b0e feat: integrate AlphaSift with DSA runtime enrichment (#1577)
* feat: integrate AlphaSift with DSA runtime enrichment

* feat: pin AlphaSift DSA provider context

* fix: clean up AlphaSift warning display

* fix(review-feedback-1577): pass the headers through a path AlphaSift actually uses, such as a

* fix(review-feedback-1577): 补齐 LLM 运行时桥接兼容性的关键证据

* fix: keep AlphaSift screening lightweight

* fix(review-feedback-1577): Populate DSA news when reusing context

* fix(review-feedback-1577): 补齐外部 LLM/LiteLLM 兼容依据,并修正 docs/CHANGELOG.md 的格式/重复条目问题

* fix(review-feedback-1577): 补齐外部模型/API 兼容依据或在 PR 正文中明确指向已更新文档中的官方来源与迁移/回退边界

* fix(review-feedback-1577): scripts/build-backend.ps1 已随本 PR 调整 AlphaSift 打包/收集逻辑,但完整改动文件列表未包含

* fix(review-feedback-1577): 处理 AlphaSift LLM bridge 对全局 LiteLLM 状态的并发污染风险

* fix: reuse DSA daily history for AlphaSift

* fix(review-feedback-1577): 补齐 --collect-all alphasift 或等价 hidden imports,并增加打包产物级导入验证

* fix(review-feedback-1577): fix the macOS AlphaSift package verifier

* fix(review-feedback-1577): scripts/build-backend-macos.sh 和 scripts/build-backend.ps1

* fix(review-feedback-1577): 处理运行时阻塞风险、CHANGELOG 删除既有条目,以及补齐外部模型/API 兼容证据

* fix(review-feedback-1577): scripts/build-backend-macos.sh:当前“Verifying packaged AlphaSift

* fix(review-feedback-1577): 收敛下面的可用性判断和外部 API/模型兼容证据缺口

* fix(review-feedback-1577): src/config.py、src/core/config registry.py、src/services/alphasift

* fix(review-feedback-1577): scripts/build-backend-macos.sh:新增的 packaged AlphaSift importability

* fix(review-feedback-1577): make the archive fallback require a dsa adapter entry or exercise the

* fix(review-feedback-1577): 处理无关测试改动,并补齐桌面打包文档/验证边界
2026-06-05 08:53:55 +08:00
mumu
72213437f2 feat: add lightweight AlphaSift screening integration (#1443)
* feat: add lightweight AlphaSift screening integration

* fix(review-feedback-1443): 解决冲突后重新确认受影响文件和 CI 结果 and Restrict install spec before executing pip

* fix(review-feedback-1443): add a feature/auth gate before invoking installation side effects

* fix: repair AlphaSift enable flow

* fix(review-feedback-1443): Enable config before calling AlphaSift install

* fix(review-feedback-1443): re-fetch status in the error path to avoid this UI/backend state

* fix(review-feedback-1443): 补充对应回归测试

* fix(review-feedback-1443): 补充对应测试

* fix(review-feedback-1443): api/v1/endpoints/alphasift.py 的状态接口会返回 ALPHASIFT INSTALL SPEC,而项目默认

* fix(review-feedback-1443): 补一个前端用例覆盖

* fix(review-feedback-1443): 解决冲突后再合入

* fix(review-feedback-1443): 解决后再重新确认 diff 与 CI 结果

* fix(review-feedback-1443): 解决冲突并确认解决后的 diff 未引入新风险

* fix(review-feedback-1443): Read picks from AlphaSift ScreenResult and Use AlphaSift's actual

* fix(review-feedback-1443): 修正

* fix(review-feedback-1443): 解决冲突并重新确认 CI/Web gate 结果

* fix(review-feedback-1443): 解决冲突并重新确认 CI/Web gate,另外需要澄清本次 diff 中 LLM 配置相关改动是否属于本 PR 范围及其兼容性影响

* fix(review-feedback-1443): 解决冲突,并补齐受影响前端构建/测试验证后再合入

* fix(review-feedback-1443): 解决冲突,并补齐受影响前端 Web gate 或等价 CI 证据后再合入

* fix(review-feedback-1443): 解决冲突,并补齐受影响 Web gate 与兼容性验证说明后再合入

* fix(review-feedback-1443): mark this field sensitive and/or display only a masked/sanitized source

* fix(review-feedback-1443): 解决冲突,并补齐受影响前端验证与外部兼容性说明后再合入

* fix(review-feedback-1443): 解决冲突,并补齐冲突解决后的验证结果后再合入

* fix(review-feedback-1443): 解决冲突,并补齐受影响后端/Web 验证证据后再合入

* fix(review-feedback-1443): 解决冲突后基于最终 head 重新给出验证结论,否则无法确认最终合入内容与当前审查内容一致

* fix(review-feedback-1443): 解决冲突并补齐冲突后的验证结论

* fix(review-feedback-1443): Clear stale candidates when strategy changes

* fix(review-feedback-1443): preserve TestClient cookies across requests

* fix(review-feedback-1443): 解决冲突并基于冲突后的最终 head 重新确认受影响验证,当前不能直接合入

* fix(review-feedback-1443): 补回归测试

* fix(review-feedback-1443): 补后端回归测试

* fix(review-feedback-1443): 解决冲突,并在解决后重新给出基于最终 head 的验证结果

* fix(review-feedback-1443): 解决冲突并基于最终 diff 重新确认验证结果

* fix(review-feedback-1443): 解决冲突,并在冲突解决后的最终 head 上重新给出后端与 Web 相关验证结论

* fix(review-feedback-1443): 解决冲突,并在最终 head 上重新确认后端、Web 和文档改动仍一致

* fix(review-feedback-1443): 当前 PR 存在合并冲突,虽然 CI 摘要为 success,但冲突解决后的最终代码和验证结果尚未形成,当前不能直接合入

* fix(review-feedback-1443): 解决冲突并补齐验证

* fix(review-feedback-1443): 解决冲突

* fix(review-feedback-1443): 修正测试客户端生命周期问题,并补齐前端 lint/build 验证

* fix(review-feedback-1443): 解决冲突

* feat: refine AlphaSift adapter integration

* fix: restore settings help metadata for CI

* fix(review-feedback-1443): Do not run lifespan for non-context TestClient requests

* fix(review-feedback-1443): Pin AlphaSift install source to an immutable ref

* fix(review-feedback-1443): 补齐后再合入

* fix: harden alphasift review feedback

* fix(review-feedback-1443): api/v1/endpoints/alphasift.py:自动安装路径在 adapter 可导入但 get status 返回

* fix: package alphasift endpoint in desktop build

* fix: bundle alphasift in desktop builds

* fix(review-feedback-1443): docs/alphasift-integration.md 中 AlphaSift adapter contract /

* fix: honor empty alphasift install spec

* fix: bundle alphasift in docker image
2026-05-31 23:12:23 +08:00
mumu
647b9d24e5 fix: support Longbridge OAuth token cache (#1490)
* fix: support Longbridge OAuth token cache

* fix(review-feedback-1490): bump the runtime dependency minimum or fail with a clear upgrade

* fix(review-feedback-1490): 补充对应回归测试

* fix(review-feedback-1490): Point OAuth cache at the dsa home in Docker

* fix(review-feedback-1490): 修复或给出明确的 CI 重跑通过证据

* fix(review-feedback-1490): 处理 Docker/Actions 持久化 token cache 已损坏时无法被新的 LONGBRIDGE OAUTH TOKEN

* fix: tighten Longbridge OAuth compatibility

* fix: refresh stale Longbridge OAuth cache

* fix: guard Longbridge OAuth SDK availability
2026-05-29 23:08:16 +08:00
mumu
e8305ba738 fix(issue-1399): [bug]-docker-挂载-.env-文件时-os.replace()-更新 (#1401) 2026-05-22 22:45:44 +08:00
mumu
8a0b093d24 fix: auto repair Docker mount permissions (#1263) 2026-05-11 23:13:37 +08:00
mumu
595908c81a chore: reorganize root files (#1257)
* chore: reorganize root files

* fix: mark moved docs assets as binary
2026-05-10 19:50:22 +08:00
Rin
34cdf5b0c7 chore: implement non-root execution for Docker (#1214) 2026-05-07 19:17:38 +08:00
Mark
9249de1e53 fix: add explicit project name to docker-compose to avoid cross-project conflicts (#448)
When multiple projects have their compose files under a docker/ directory,
Docker Compose defaults to the same project name "docker", causing orphan
container warnings across projects.

Co-authored-by: ma_k <ma_k@ctrip.com>
2026-02-27 19:30:38 +08:00
Mark
75896f6d05 fix(agent): include framework category in skill rendering + Docker strategies missing (#406)
* fix(agent): include framework category in skill instructions rendering

`get_skill_instructions()` only iterated over ["trend", "pattern",
"reversal"] categories, silently dropping all strategies with
`category: framework` (box_oscillation, chan_theory, wave_theory,
emotion_cycle). Add "framework" to the category map and use a
dynamic fallback so future custom categories are never lost.

Also:
- Document `AGENT_SKILLS=all` shorthand in .env.example
- Add `AGENT_SKILLS` config to README
- Add CHANGELOG entry
- Update strategies/README.md and Skill docstring with framework category

Fixes #403

* fix(docker): include strategies directory in Docker image and compose

Dockerfile was missing `COPY strategies/ ./strategies/`, and
docker-compose.yml did not mount the strategies directory, causing
all 11 built-in strategies to fail loading in containerized deployments.

---------

Co-authored-by: ma_k <ma_k@ctrip.com>
2026-02-26 20:44:24 +08:00
Alfred
292c638f3a fix: Docker DNS resolution and host mode port documentation (Fixes #372) (#374)
- docker-compose.yml: add comment on --port vs ports when using network_mode: host
- docs/FAQ.md: add Q14.1 Docker DNS resolution troubleshooting
- docs/CHANGELOG.md: record this fix
2026-02-24 19:47:52 +08:00
mumu
2692b20c2d feat: add schedule immediate run config and fix docker build (#333) fixes #332
* feat: add schedule immediate run config and fix docker build

1. Fix Docker build failure by adding missing `patch/` directory copy.
2. Add comprehensive module import smoke tests in CI to prevent future regressions.
3. Add `SCHEDULE_RUN_IMMEDIATELY` config and `--no-run-immediately` arg to control whether scheduled tasks run on startup.
4. Update documentation for scheduled task configuration.

* fix import error
2026-02-15 14:57:27 +08:00
Alfred
5883dc41bd feat: add Markdown-to-image for notification channels (Fixes #289) (#315)
* feat: add Markdown-to-image for notification channels (Fixes #289)

- Add MARKDOWN_TO_IMAGE_CHANNELS config for telegram, wechat, custom, email
- New src/md2img.py: markdown_to_image() via imgkit/wkhtmltoimage
- Extract markdown_to_html_document to src/formatters.py for reuse
- Implement image sending: Telegram sendPhoto, WeChat base64+md5,
  Discord webhook multipart, email inline attachment
- Add imgkit to requirements, wkhtmltopdf to Dockerfile
- Graceful fallback to text when imgkit/wkhtmltopdf unavailable

* fix(docker): pin to bookworm for wkhtmltopdf, add runtime deps

wkhtmltopdf was removed from Debian testing (2025). Pin base image to
python:3.11-slim-bookworm. Add fontconfig, libjpeg62-turbo, libxrender1,
libxext6 for headless wkhtmltopdf.

* docs(md2img): add security note on command injection and XSS

* refactor(md2img): extract _should_use_image_for_channel, document Fallback rules

* docs: add Markdown-to-image dependency install guide (imgkit, wkhtmltopdf)
2026-02-13 21:16:22 +08:00
mumu
4c791a2818 Fix/improve docker consistency and resolve critical batch/notification bugs(#303)
- Fix #297: Replace non-existent 'webui' service with 'server' in documentation.
- Fix #281, #298: Generate unique query_id per stock in batch mode to prevent dashboard content mismatch.
- Fix #287: Add exponential backoff retry and rate-limit handling for Telegram notifications.
- Sync Dockerfile and docker-compose.yml environment variables to WEBUI_HOST (PR #291 follow-up).
2026-02-11 21:43:11 +08:00
lralin
aafbb5f2ba Change API_HOST to WEBUI_HOST in docker-compose (#291) 2026-02-11 21:15:53 +08:00
mumu
52917baa02 feat!: replace legacy WebUI with unified FastAPI architecture #major (#267)
* feat!: replace legacy WebUI with unified FastAPI architecture #major

- Remove legacy WebUI (web/ package based on ThreadingHTTPServer)
- Unify CLI commands: --webui now seamlessly launches the new FastAPI service
- Migrate task service from web/services.py to src/services/task_service.py
- Update documentation to reflect the new simplified usage

* refactor(service): support parameterized query source in TaskService
2026-02-06 22:06:01 +08:00
Krane
9847157980 Feature/React web support 新的WebUI (#256)
* feat(web): add FastAPI & React web connect

* feat: add FastAPI package

* feat: system base struct

* feat: frontend base struct

* feat: 基础分析接口,历史记录接口

* fix: 使用正确的 FastAPI 方法定义,避免线程阻塞

* fix: 对接历史报告页、详情页

* fix: 修复接口问题

* fix: 网络配置 允许公网访问 跨域配置

* fix: 页面打包 & 提供 Server 静态访问

* fix: 优化dock栏样式

* fix: 优化图标样式

* fix: 修改部分配色

* fix: 删除垃圾文档

* fix: 删除垃圾代码

* fix: 驼峰转换工具

* fix: 历史记录列表滚动加载(分页)

* feat: 显示分析中任务

* fix: 调整布局

* fix: 优化 Market Sentiment 组件动效

* fix: 历史列表组件bug

* fix: FastAPI 日志配置

* feat: 新闻历史接口

* feat: 资讯列表

* feat: 优化布局

* fix: 修复页面元素变宽问题

* fix: 中文标题

* fix: 任务列表状态显示问题

* fix: 抽取日志配置

* fix: 优化报告价格显示

* fix: 修复编译错误

* fix: FastAPI 启动提取到 main.py

* fix: 补充新web-ui启动文档

* fix: 默认发送通知

* fix: FastAPI 模式适配 docker

* fix: FastAPI 模式文档

* Update api/v1/endpoints/stocks.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: package-lock.json

* fix: 修改错别字

* fix: 更新文档说明

* fix: 更新文档说明

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-05 20:56:38 +08:00
mumu
2ca8d10ab1 fix(docker): respect WEBUI_PORT from .env file (fixes #221)
- Remove hardcoded WEBUI_PORT=8000 from docker-compose.yml environment
- Use variable substitution in port mapping with default fallback
- WEBUI_PORT is now properly read from .env file
2026-02-02 20:51:04 +08:00
zhulinsen
d44fab23b2 fix: correct docker-compose paths and documentation commands 2026-01-26 18:02:08 +08:00
Krane
24693d5ec4 fix: #145 修改文档命令路径 2026-01-26 12:48:00 +08:00
Krane
afcdaad08b fix: #145 dockerfile 缺少 copy src 文件夹 2026-01-26 12:12:57 +08:00
zhulinsen
9f0871a774 refactor: project structure optimization and network stability (v1.7.0)
- 📦 Structure: Move core modules to src/, docs to docs/, docker configs to docker/
- 🔧 Config: Fix .env loading path and remove hardcoded proxy settings
- 🌐 Network: Implement smart proxy routing (auto NO_PROXY for domestic apis)
- 🛡️ Stability: Enhance EfinanceFetcher with robust retry logic for ProtocolErrors
- 📝 Docs: Update relative links in READMEs and update CHANGELOG to v1.7.0
2026-01-25 16:35:32 +08:00