27 Commits
Author SHA1 Message Date
Haozhe Wu 6a9b489ffc fix(ci): keep Windows installer builds in Windows PowerShell 2026-10-13 19:08:40 +08:00
Haozhe Wu 1387fc1d0e Merge PR #1616: share manual Pixel Office tasks across Web, CLI and agent 2026-10-13 13:24:30 +08:00
zeus229 79f2ceb1a5 feat(email): protect scheduled PDF reports with password
Signed-off-by: zeus229 <69399886+zeus229@users.noreply.github.com>
2026-10-06 04:47:18 +00:00
Haozhe Wu 2ce2165160 fix(pdf): render shaped Arabic reports without clipping across pages
Signed-off-by: Haozhe Wu <haozhe_wu@connect.hku.hk>
2026-10-04 03:09:56 +08:00
Haozhe Wu 65a758f7c1 Merge PR #1680: HTML and PDF scheduled email reports 2026-10-04 02:33:04 +08:00
Yufeng He 705f1a0e27 fix(shadow): keep the reportlab fallback on the probed font family
On a host with no usable CJK TTF the first probe correctly rendered
with Helvetica, but it also marked the font probe as done, so every
later render in the same process asked platypus for the unregistered
VibeShadowCJK family and reportlab refused the paragraph. The report
then silently degraded to HTML-only from the second render on, which
is exactly what CI showed on the second reportlab test in a process.

Cache the resolved family instead of a bare probed flag, and add a
regression test that renders twice on a fontless host.

Also add reportlab to the desktop embedded-runtime lock; the wheel
metadata check failed packaging because the new dependency was not
installed there.

Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
2026-10-03 13:31:08 +08:00
zeus229 b3b1da052f feat(email): add rich scheduled report delivery
Signed-off-by: zeus229 <69399886+zeus229@users.noreply.github.com>
2026-10-02 14:53:45 +00:00
Copilot App f1795e8a1c Prefer packaging Python runtime for desktop builds
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-09-22 20:23:24 +02:00
Copilot App eff4bfc37e Fix Windows installer runtime packaging flow
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-09-22 14:18:23 +02:00
Haozhe Wu 051aeb5509 refactor(providers): remove the Requesty built-in provider
Requesty (added in #474) is an OpenAI-compatible gateway whose capabilities
were a copy of OpenRouter's: same provider/model naming, same
extra_body.reasoning opt-in, no adapter code of its own. Built-in slots are
kept for providers with their own behaviour; a gateway that speaks an
existing wire format is configured through that provider, and #1532 (API
Route) is being closed on the same grounds.

Migration, identical request shape: LANGCHAIN_PROVIDER=openrouter,
OPENROUTER_BASE_URL=https://router.requesty.ai/v1, OPENROUTER_API_KEY=<the
Requesty key>. Past news and contributor credits in the READMEs are left
as history; the supported-provider lists drop it.
2026-09-21 20:35:37 +08:00
Haozhe Wu b6ef866247 chore(deps): bump weasyprint to 70.0 and js-yaml to 4.3.2 in the lock files
Dependabot #37 (js-yaml, high) and #38/#39 (weasyprint SSRF, medium).
weasyprint 70.0 declares exactly the same requirements as 69.0, so both
hash locks change by the pin and its two hashes only. Every js-yaml
dependent in the desktop lock asks for ^4.1.0, so 4.3.2 satisfies them
without touching package.json.
2026-09-11 21:18:25 +08:00
Haozhe Wu 1fc13af8d5 build(deps): patch the seven open npm advisories in the two lock files
All seven Dependabot alerts on this repo, all transitive, all development scope:

  frontend/package-lock.json
    browserslist              4.28.6 -> 4.28.8   (patched 4.28.7, HIGH)
      crash / prototype write via untrusted browserslist-stats.json
    postcss-selector-parser    6.1.2 -> 6.1.4    (patched 6.1.3, LOW)
      denial of service through uncontrolled AST recursion
      two nested copies, under postcss-nested and tailwindcss

  desktop/electron/package-lock.json
    fast-uri                   3.1.5 -> 3.1.7    (patched 3.1.6, HIGH x4)
      host confusion via percent-encoded scheme normalization; SSRF via
      malformed IPv6 normalization; SSRF via repeated hostname percent-decoding;
      host confusion via skipped IDN canonicalization
    @xmldom/xmldom            0.8.13 -> 0.8.15   (patched 0.8.15, MEDIUM)
      XML fragment injection via invalid EntityReference.nodeName

Every parent range already admitted the patched version (autoprefixer wants
browserslist ^4.28.6, postcss-nested/tailwindcss want ^6.1.1 and ^6.1.2, ajv
wants fast-uri ^3.0.1, plist wants @xmldom/xmldom ^0.8.8), so `npm update` on
the named packages was enough and no package.json or override was needed. Both
lock files carry only these bumps plus the transitive tail browserslist pulls
with it (caniuse-lite, electron-to-chromium, node-releases, baseline-browser-
mapping, update-browserslist-db).

The third root copy of postcss-selector-parser stays at 6.0.10: @tailwindcss/
typography pins that exact version, and 6.0.10 sits outside the advisory's
>= 6.1.0, < 6.1.3 range, so it is not affected.

Verified after installing both locks: frontend `npm run build` clean and 617
vitest tests pass; desktop `npm run build`, test-locales (parity verified),
test-backend-resolution, and test-packaging-preparation all pass.
2026-09-04 15:00:31 +08:00
lorenzozanee 75bdf0c390 fix(desktop): correctly handle EPERM in updater shutdown checks
isProcessAlive treated every kill error as not alive, so EPERM
(process exists but no permission) was misclassified as exited.
This made shutdown evidence report backendExited and watchdogExited
true while the PID was still alive, allowing stopForUpdate to
succeed prematurely and risk installer launch while the backend
still held the loopback listener.

Distinguish EPERM (alive) from ESRCH (not alive) in both
backend-manager.ts and backend-watchdog.ts, matching Node.js
process.kill semantics.

Signed-off-by: lorenzozanee <wyz0707@proton.me>
2026-08-31 11:05:28 +08:00
Haozhe Wu 8a0e90b840 fix(desktop): preserve Windows process exit evidence
Signed-off-by: Haozhe Wu <haozhe_wu@connect.hku.hk>
2026-08-15 04:52:36 +08:00
Haozhe Wu bc846ebaef fix(desktop): stabilize Windows packaging inputs
Signed-off-by: Haozhe Wu <haozhe_wu@connect.hku.hk>
2026-08-15 04:42:05 +08:00
Haozhe Wu 3012fe98b2 fix(desktop): harden dormant update safety boundary
Signed-off-by: Haozhe Wu <haozhe_wu@connect.hku.hk>
2026-08-15 03:34:54 +08:00
QCYTSN d8723223e9 feat(desktop): add dormant update safety boundary
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-14 22:45:18 +08:00
Haozhe Wu 281c87755f build(deps): patch Electron transitive vulnerabilities
Signed-off-by: Haozhe Wu <haozhe_wu@connect.hku.hk>
2026-08-09 22:56:37 +08:00
Haozhe Wu ef70301e67 fix(desktop): sync Windows dependency lock 2026-08-09 18:05:33 +08:00
Haozhe Wu 033b6536af fix(desktop): allow ModelScope credentials 2026-08-09 16:24:58 +08:00
QCYTSN adc3dc8101 fix(desktop): use a working Authenticode host
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 19:55:12 +08:00
QCYTSN c3544dda5e fix(desktop): satisfy packaging CI gates
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 19:55:12 +08:00
QCYTSN 32d312566c fix(desktop): validate packaged Windows lifecycle
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 19:55:12 +08:00
QCYTSN 13b8e5993a fix(desktop): enforce packaging security gates
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 19:55:12 +08:00
QCYTSN f5cb88cf49 feat(desktop): add Windows runtime and NSIS packaging
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 19:55:12 +08:00
QCYTSN 2b1b499b42 feat(desktop): protect packaged credentials with safeStorage
Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 19:55:11 +08:00
Gao Fengkai 832b2c9efd feat(desktop): add Electron shell lifecycle (#923)
* feat(desktop): add Electron shell lifecycle

Signed-off-by: QCYTSN <2558348385@qq.com>

* docs(desktop): document shell security boundary

Signed-off-by: QCYTSN <2558348385@qq.com>

* fix(desktop): address shell lifecycle review

Signed-off-by: QCYTSN <2558348385@qq.com>

* fix(desktop): constrain backend executable resolution

Signed-off-by: QCYTSN <2558348385@qq.com>

---------

Signed-off-by: QCYTSN <2558348385@qq.com>
2026-08-08 16:23:26 +08:00