Commit Graph
971 Commits
Author SHA1 Message Date
彼方 38ec3cc9be Merge pull request #2759 from langbot-app/feat/onebot-image-url-refresh
feat(onebot): refresh expired image URLs in history and model requests
2026-10-23 15:22:32 +08:00
RockChinQ 07466c9d99 copy: call every plan 计划 instead of 套餐 (#2763)
The Chinese copy used 套餐 (package) for the subscription plan in the cloud
banner, the model errors and the multi-tenant docs. Name the same concept 计划
everywhere; Traditional Chinese keeps 計劃.
2026-10-23 12:54:53 +08:00
RockChinQandmultica-agent b8f7b295ba fix(deps): patch Dependabot vulnerability alerts (Python + web) (#2762)
Python (pyproject.toml + uv.lock):
- Pillow >=13.0.0 (52 alerts closed, including 4 critical, 33 high, 15 medium)
- pyjwt >=2.15.0 (15 alerts closed, including 1 critical, 8 high, 6 medium)
- aiohttp >=3.14.4 (11 alerts closed)
- virtualenv -> 21.14.13 (12 alerts closed)
- mcp >=1.30.0,<2.0.0 (4 alerts closed)
- soupsieve -> 3.0.4 (4 alerts closed)
- urllib3 >=2.8.0 (3 alerts closed)
- transformers -> 5.20.2 (3 alerts closed)
- anyio -> 4.14.2 (2 alerts closed, including 1 critical)
- oauthlib -> 4.0.0 (2 alerts closed)
- certifi >=2026.10.19 (1 critical alert closed)
- uv >=0.13.4 (1 critical alert closed)
- sentence-transformers -> 6.2.0 (1 critical alert closed)
- cryptography >=50.0.0, fsspec -> 2026.9.0, h2 -> 4.4.1, hpack -> 4.2.0
- langgraph-sdk -> 0.4.8, litellm >=1.88.6, Mako >=1.4.2, multidict -> 7.1.0
- opentelemetry-api -> 1.45.1, pip >=26.2.0, setuptools -> 84.2.1, torch -> 2.14.1, werkzeug -> 3.1.9
- PyPDF2: replaced with pypdf>=6.0.0 (deprecated PyPDF2 had no upstream fix; closes 1 medium alert)

Web (web/package.json + dual lockfiles npm + pnpm in sync):
- axios 1.17.0 -> 1.20.0 (22 alerts closed)
- vite 8.0.16 -> 8.3.4 (5 alerts closed)
- react-router / react-router-dom 7.17.0 -> 7.18.4 (5 alerts closed)
- brace-expansion -> 1.1.21 & 5.0.12 (4 alerts closed)
- js-yaml -> 4.3.2 (3 alerts closed)
- follow-redirects -> 1.16.1 (2 alerts closed)
- nanoid -> 3.3.18 / 3.3.20 (2 alerts closed)
- postcss -> 8.5.31 (2 alerts closed)
- @humanfs/node -> 0.16.8 (1 alert closed)
- source-map-js -> 1.2.2 (1 alert closed)

Unfixable upstream (pending ChromaDB release):
- chromadb (4 open alerts: GHSA-36p7-vc44-83pf, GHSA-2wm9-hf6c-p5cr, GHSA-xph7-9rjv-w5fr, GHSA-f4j7-r4q5-qw2c; vulnerable range <=1.5.9, latest published version is 1.5.9 with no patched release).

Verified: uv sync + core imports, pytest test suites, pnpm build, pnpm lint.

Co-authored-by: multica-agent <[email protected]>
2026-10-23 12:23:50 +08:00
RockChinQ 39645cdd84 fix(web): keep the dedicated-environment link on a custom Cloud banner (#2760)
* fix(web): keep the dedicated-environment link on a custom Cloud banner

The Cloud banner can carry per-language copy, but the custom-copy branch
rendered that text alone: everything else in the banner swaps the built-in
message for an override so the operator can say what is actually happening,
and doing so silently dropped the link to the dedicated environment -- the only
destination that turns a warning into an upgrade.

Render the dedicated link after the override when show_links is on, using new
cta_dedicated copy in every locale so the second half of the sentence reads as
a call to action rather than repeating the environment name.

* test(web): expect the new banner CTA copy in every locale
2026-10-23 11:43:15 +08:00
BiFangKNT baddaa2b74 feat(onebot): refresh expired image URLs in history and model requests
- Cache NapCat rkeys by type and refresh only when their TTL expires
- Renew image URLs through get_msg for other OneBot v11 implementations
- Refresh session views, Runner history, and each model request attempt
- Isolate caches by connection without downloading images or rewriting history
2026-10-23 08:41:50 +08:00
RockChinQandmultica-agent a8dd85063f LANG-145: hide passkey UI unless the core reports it is supported (#2754)
* fix(adapters): stop SSRF and arbitrary local file reads in media handling

The platform adapters fetch URLs and open paths that come from inbound
messages, so both are attacker-influenced.

New guard module pkg/utils/outbound_url.py:

- assert_safe_outbound_url: checks the scheme, rejects literal private /
  loopback / link-local / reserved / multicast addresses, and resolves the
  hostname so a public-looking name pointing at an internal address is refused
  too. Optional allowed_domains confines a fetch to a known prefix.
- assert_safe_local_media_path: resolves a caller-supplied path and requires it
  to stay inside the media roots (data dir + temp dir), so symlinks and .. cannot
  escape. Directories are refused.

Wired in:

- DingTalk send_message: session_webhook is taken from the inbound event and was
  POSTed verbatim, so a forged event could redirect reply content (including LLM
  output) to any host. Now restricted to dingtalk.com.
- DingTalk send_attachment: component.url was fetched with no destination check;
  now goes through the SSRF guard, which also covers cloud metadata.
- DingTalk upload_image_media: caller-supplied file_path was opened directly; now
  confined to the media roots.
- Slack attachment_bytes: component.path was opened directly and uploaded to the
  channel (arbitrary file exfiltration); now confined to the media roots.
- Slack download_media: redirects were followed with no destination check. Every
  hop is now validated, the hop count is bounded, and a redirect off the Slack
  domain drops the bearer token.

Tests: 25 new cases for the guard (internal address forms, scheme rejection,
suffix impostor, traversal, symlink escape, directory). The Slack credential test
now stubs DNS because the guard resolves before fetching, and asserts
allow_redirects is False for every case since redirects are handled manually.

Co-authored-by: multica-agent <[email protected]>

* fix(web): hide passkey UI unless the core reports it is supported

The core refuses every passkey route on a cloud deployment (403
edition_unsupported) and reports passkey_login_enabled/passkey_supported as
false. The WebUI still rendered the controls:

- Login page read 'passkey_login_enabled !== false || passkey_supported', so an
  absent flag counted as enabled. It now requires an explicit true.
- The account settings panel always rendered the passkey section and called
  GET /passkeys on open, which 403s on cloud. It now reads the capabilities
  first, skips the list call when unsupported, and does not render the section.

Also drop the client-supplied origin from both passkey options requests. The
server resolves the WebAuthn RP ID and expected origin from api.webui_url /
api.webhook_prefix, so sending window.location.origin was dead weight that would
invite a future handler to trust it again.

Verified: tsc --noEmit clean, eslint clean (only two pre-existing hook-dep
warnings), pnpm build succeeds.

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-22 21:26:33 +08:00
RockChinQandmultica-agent d45b0a3957 feat(cloud): add configurable Cloud-only WebUI notice banner
Cloud deployments need a way to tell readers what is happening to the
instance they are using (maintenance windows, service notices) without
shipping a release per notice.

Add a cloud.banner config block (switch, tone, dismissal, link targets and
per-language copy) and expose the resolved banner on the unauthenticated
/api/v1/system/info payload so the WebUI can render it before login. The
banner resolves to null on OSS deployments, so a self-hosted copy of
config.yaml never shows managed-service copy. Copy is plain text; only
absolute http(s) link targets are rendered.

The WebUI renders it once from the root layout, offsets the fixed app shell
and the wizard through --cloud-banner-height, and keeps a dismissal bound to
the notice it dismissed so new copy reappears.

Co-authored-by: multica-agent <[email protected]>
2026-10-21 16:26:43 +00:00
Chin Rockandmultica-agent 6bea0f15e1 fix(web): outline the plan upgrade control and call the grant 模型积分
Co-authored-by: multica-agent <[email protected]>
2026-10-21 10:32:21 +00:00
Chin Rockandmultica-agent 61c59687c2 fix(web): satisfy prettier and align the switcher layout spec after the upgrade control
Co-authored-by: multica-agent <[email protected]>
2026-10-21 08:06:42 +00:00
fa2913a986 feat(web): rename credits label to model credits, shorten workspace switcher, add upgrade button
- creditsLabel: 每月赠送积分 → 模型积分 (zh), Monthly credits → Model credits (en), 毎月のクレジット → モデルクレジット (ja)
- creditsHelp: append note that own model providers remain usable after credits run out, all locales
- WorkspaceSwitcher trigger: cap workspace name to 6rem, remove justify-start
- HomeSidebar: add ArrowUp upgrade icon button next to workspace switcher (cloud_projection only), opens CloudPlansDialog lazy-loaded

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-21 07:45:56 +00:00
BiFangKNT 726ad5530f fix(web): omit referrer when loading message images
Set no-referrer on message thumbnails and previews to prevent
QQ image requests from returning 400 and triggering ORB.

Add browser coverage for image loading and request headers.
2026-10-21 12:03:00 +08:00
RockChinQandmultica-agent d13ae56ea5 fix: bot routing setup and busy-session response checks (#2728)
Apply group response rules before busy-session steering. Initialize usable private-message and group-mention routes for new bots, including Wizard-created pipelines, and preserve member-configured rules across saves and retries.

Fix empty pipeline configuration, refresh the processor sidebar after automatic creation, and show creation feedback. Align routing regressions and use Node 24 for the browser CI job.

Correct the task's erroneous agent attribution while preserving every code tree and the original human contribution.

Co-authored-by: multica-agent <[email protected]>
2026-10-20 21:22:53 +08:00
Chin Rockandmultica-agent c28ae761ac fix(web): format migration diagnostics and tolerate wrapped translations
Co-authored-by: multica-agent <[email protected]>
2026-10-20 09:09:41 +00:00
Chin Rock 40d40204cf fix(install-diagnostics): Sanitize plugin installation network diagnostics (LANG-132) 2026-10-20 07:53:56 +00:00
RockChinQandmultica-agent a10a6eb780 fix(ci): provision real-stack browser dependencies and disambiguate runtime assertion (#2724)
Co-authored-by: multica-agent <[email protected]>
2026-10-20 00:08:14 +08:00
RockChinQandmultica-agent d9e4e7d9df fix(pipeline): decouple Runner from extension permissions (LANG-54) (#2723)
* fix(pipeline): decouple runner from extension allowlist

Co-authored-by: multica-agent <[email protected]>

* fix(pipeline): complete runner diagnostics and real runtime coverage

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-19 23:07:11 +08:00
Zhang Bowen 9ac9958391 fix(web): hide revoked API keys in integration settings (#2714) 2026-10-18 17:26:39 +08:00
BiFangKNT 57077740bd chore(merge): sync master and preserve monitoring test coverage 2026-10-18 12:43:44 +08:00
BiFangKNT b9acf7d9b0 fix(ui): prevent closing selects from stealing focus
Preserve focus when another control becomes active during the close animation.
Add regression tests for filter persistence, Escape, and custom range dialog focus.
2026-10-18 10:21:48 +08:00
BiFangKNT f12490bc73 perf(monitoring): load execution details on demand
- Load overview first and fetch secondary sections when expanded
- Add a covering index and select conversation IDs before loading page payloads
- Preserve full-detail API compatibility and add pagination and lazy-loading tests
2026-10-17 21:10:55 +08:00
huanghuoguoguo 3a026cc7dc Merge pull request #2699 from langbot-app/test/quality-account-ui-oracles-20261017
test(web): replace account and privacy source checks with browser behavior
2026-10-17 20:35:41 +08:00
huanghuoguoguo c3792e7a21 test(web): merge master into account UI contracts 2026-10-17 20:18:13 +08:00
huanghuoguoguo 8dfdb4fc45 test: preserve session and quota contracts when merging master 2026-10-17 20:14:10 +08:00
huanghuoguoguo bfe9b859ac Merge pull request #2702 from langbot-app/fix/provider-card-narrow-title-20261017
fix(web): keep provider names visible on narrow cards
2026-10-17 20:13:24 +08:00
huanghuoguoguo 142720660a Merge pull request #2701 from langbot-app/test/quality-combined-frontend-fixes-20261017
test(web): resolve clipboard fixture dependencies through Vite
2026-10-17 20:13:18 +08:00
huanghuoguoguo 9eba8cc4fd Merge pull request #2700 from langbot-app/test/quality-workspace-ui-oracles-20261017
test(web): replace Workspace source checks with runtime assertions
2026-10-17 20:13:11 +08:00
huanghuoguoguo fe80c05c6a Merge pull request #2697 from langbot-app/test/quality-web-debug-socket-race-20261017
test(web): verify cancelled native handshakes cannot alter replacement sessions
2026-10-17 20:12:57 +08:00
huanghuoguoguo a9957afc13 Merge pull request #2670 from langbot-app/test/workspace-quota-boundaries
test(web): verify workspace switching and quota failure boundaries
2026-10-17 20:12:51 +08:00
huanghuoguoguo d2c2a9dc65 Merge pull request #2668 from langbot-app/test/quality-frontend-behavior
test(web): replace source guards with browser behavior checks
2026-10-17 20:12:46 +08:00
huanghuoguoguo 8834a04045 Merge pull request #2696 from langbot-app/test/quality-web-marketplace-wizard-20261017
test(web): exercise marketplace installs and wizard behavior
2026-10-17 20:12:40 +08:00
huanghuoguoguo c49f7c7c07 Merge pull request #2686 from langbot-app/test/quality-web-resource-contracts-20261017
test(web): assert resource persistence and recovery behavior
2026-10-17 20:11:36 +08:00
huanghuoguoguo 794b018281 fix(web): keep provider names visible on narrow cards 2026-10-17 17:02:23 +08:00
huanghuoguoguo 8d4117aae0 test(web): resolve clipboard fixture dependencies through Vite 2026-10-17 16:54:46 +08:00
huanghuoguoguo ecd454ab82 test(web): wait for filter popups to restore focus 2026-10-17 16:44:48 +08:00
huanghuoguoguo c14bc0a45a test(web): replace Workspace source checks with runtime assertions 2026-10-17 16:38:21 +08:00
huanghuoguoguo 61758c8727 test(web): replace account source checks with browser assertions 2026-10-17 16:31:51 +08:00
huanghuoguoguo 837fa1d4fc test(web): verify session pagination and workspace quota contracts 2026-10-17 16:31:20 +08:00
huanghuoguoguo 0f230148e3 test(web): cover delayed native debug socket cancellation 2026-10-17 16:19:25 +08:00
huanghuoguoguo 30f9111e3f test(web): wait for filter popups to restore focus 2026-10-17 16:09:31 +08:00
huanghuoguoguo 8e447dae09 test(web): exercise marketplace installs and wizard contracts 2026-10-17 16:09:23 +08:00
huanghuoguoguo 753e3cf070 test(web): wait for filter popups to restore focus 2026-10-17 15:58:12 +08:00
huanghuoguoguo f7c4194b3d test(web): verify resource writes and recovery through behavior 2026-10-17 15:42:39 +08:00
huanghuoguoguo 20daecc9cf test(web): replace self-confirming progress checks and remove duplicates 2026-10-17 15:00:41 +08:00
huanghuoguoguo b5ea5f88c3 test(web): verify workspace switching and quota failure boundaries 2026-10-17 05:06:33 +00:00
huanghuoguoguo 342d843622 test(web): replace source guards with browser behavior checks 2026-10-17 04:08:51 +00:00
huanghuoguoguo d54e533985 fix(skill): pin revisions per run and preserve shared Box state 2026-10-17 09:32:41 +08:00
RockChinQandClaude Opus 5.5 30357c6fa2 style(web): format revision preview fixtures
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 01:54:18 +08:00
RockChinQandClaude Opus 5.5 624d8efd97 test(web): align frontend checks with the plan comparison dialog
- Use LangBot Account wording in the Japanese checkout handoff copy.
- Assert the Workspace Settings plan entry opens CloudPlansDialog.
- Format revision tests with Prettier.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 01:54:05 +08:00
RockChinQandClaude Opus 5.5 16cfb6f8bd feat(cloud): show purchased plan revision alongside the latest revision
- Expose the workspace's purchased plan revision from the entitlement
  snapshot.
- Stack the purchased revision card in front of the latest revision in
  the plan comparison dialog; both cards share the same layout, and the
  purchased card's copy and prices come from the Space revision endpoint
  while benefits stay on the entitlement snapshot.
- Add a cancel-first tooltip for subscribing to the newer revision.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 00:25:41 +08:00
RockChinQ ececcb8749 feat(cloud): display unavailable plans without checkout actions 2026-10-16 17:11:00 +08:00