Hyu
5084f2391d
fix(auth): support dynamic OSS callbacks and LangBot Account copy ( #2428 )
...
* fix(auth): support dynamic OSS callbacks and LangBot Account copy
* style(web): format LangBot Account copy
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-13 23:18:01 +08:00
Chan
f7914a8900
test: remove obsolete private deploy workflow assertion
2026-08-13 09:31:45 +00:00
Hyu
c67a503532
feat(health): expose plugin runtime readiness ( #2420 )
...
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-12 19:49:56 +08:00
Hyu
8b14d2ab8e
fix(runtime): allow shared plugin reconcile to finish ( #2419 )
...
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-12 19:31:23 +08:00
Hyu
97428310b9
fix(runtime): require Cloud control secrets ( #2418 )
...
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-12 18:42:23 +08:00
Hyu
338ee733cb
fix(deploy): preserve recovered Cloud adapter pin ( #2417 )
...
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-12 18:06:34 +08:00
RockChinQ
bbc912d0ef
fix(runtime): restore standalone runtime compatibility
2026-08-11 21:35:03 +08:00
Dongchuan Fu
e37987215e
feat(provider): add pipeline reasoning controls ( #2373 )
...
* feat(provider): add pipeline reasoning controls
* fix(provider): preserve local agent model compatibility
* refactor(web): use shadcn reasoning slider
* fix(runtime): stabilize reasoning chat delivery
* fix(provider): route reasoning controls by model family
* fix(provider): handle hosted Kimi reasoning protocols
* fix(provider): map qwen reasoning levels to budgets
* fix(provider): preserve think tags in streamed reasoning
* fix(provider): preserve reasoning tool metadata
* style(provider): satisfy ruff checks after merge
* fix(persistence): preserve reasoning migration compatibility
2026-08-09 17:38:01 +08:00
leonoxo
22c389edc1
fix(pipeline): ground local-agent system prompt with current date ( #2399 )
...
The local-agent runner's system prompt is a static string with no
template-variable support, so the model had no anchor for "today" and
resolved relative time references (e.g. "this quarter", "latest")
against whichever period was best represented in training data instead
of the real date, sometimes confidently answering with stale
information for time-sensitive questions.
PreProcessor now appends a short, deterministically-computed
"Current date: ..." note to the system prompt on every request for
local-agent pipelines, alongside guidance to verify time-sensitive
facts with a search tool rather than answering from memory. The
existing skill-awareness prompt injection is refactored to share the
same append-to-system-prompt helper.
2026-08-08 22:29:54 +08:00
Hyu
78068db9c8
fix(cloud): preserve tenant scope for extension tasks ( #2408 )
...
* fix(cloud): preserve tenant scope for extension tasks
* ci: retrigger extension scope checks
---------
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-07 11:32:38 +08:00
Hyu
7dc9dafb7c
fix(plugin): validate runtime timeout before startup ( #2407 )
...
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-07 11:26:42 +08:00
Hyu
4bd899e77b
fix(cloud): track workspace membership provenance ( #2406 )
...
* fix(cloud): converge legacy revision-zero members
* fix(cloud): track workspace membership provenance
* test(persistence): track current migration head
---------
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-07 11:26:06 +08:00
Hyu
ddb6dbf593
fix(cloud): tolerate slow plugin runtime reconciliation ( #2405 )
...
Co-authored-by: Chan <dadachann@users.noreply.github.com >
2026-08-06 20:39:20 +08:00
Hyu
f59343fd5b
fix: provision Cloud models after Workspace activation ( #2403 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-05 23:26:23 +08:00
Hyu
211710e24c
fix: allow trusted halfvec tenant search casts ( #2402 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-05 22:09:01 +08:00
Hyu
cdd5c6589c
fix: support 3072-dimensional knowledge embeddings ( #2401 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-05 21:19:57 +08:00
Hyu
d78546967c
feat: expose Workspace-scoped rotating plugin debug keys ( #2395 )
...
* feat: add Workspace-scoped rotating plugin debug tokens
* chore: pin formatted Workspace debug runtime
* chore: pin merged Workspace debug runtime
* chore: pin tenant-safe debug runtime
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-04 19:20:06 +08:00
Hyu
c08bfc8ced
feat: report independent instance and workspace identities ( #2394 )
...
* feat: report independent instance and workspace identities
* test: include workspace in OAuth callback fixture
* ci: pin production cloud adapter to Space release
* fix: preserve authenticated Workspace telemetry attribution
* ci: pin production cloud adapter to final Space release
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-04 17:27:23 +08:00
Hyu
7820949d3a
fix(workspace): show member emails ( #2393 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-04 11:48:43 +08:00
Hyu
1e6e4c0ca7
fix(cloud): show owner model balance and enforce single owner ( #2384 ) ( #2385 )
...
* fix(cloud): show owner model balance and enforce single owner
* fix(migrations): create owner index idempotently
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-03 02:14:43 +08:00
dadachann
a7a7218afe
fix(cloud): accept invitations with current account
2026-08-02 09:08:49 +00:00
Hyu
a67728c163
fix cloud monitoring and invitation sign-in ( #2381 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-02 16:39:14 +08:00
Hyu
e9c9e896c6
fix(cloud): preserve pipeline routing in debug chat ( #2380 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-02 01:49:17 +08:00
Hyu
e2331c4967
fix(cloud): restore plugins and pipeline execution ( #2379 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-02 01:34:11 +08:00
Hyu
c5aada494d
fix(cloud): treat workspace owners as Space-bound ( #2378 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-02 00:33:46 +08:00
Hyu
e36e3aaea8
fix(cloud): accept null model abilities ( #2377 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-01 18:50:47 +08:00
Hyu
d64278ab3f
feat(cloud): provision workspace model catalog ( #2376 )
...
* feat(cloud): provision workspace model catalog
* ci(cloud): pin model catalog adapter source
* fix: make cloud model catalog sync recoverable
* ci: pin cloud adapter source for release
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-01 18:16:02 +08:00
dadachann
c7d14676fc
fix(cloud): restore disabled Box production mode
2026-08-01 04:11:17 +00:00
dadachann
2456bf1350
fix(migrations): preserve published Cloud revision head
2026-07-31 18:35:21 +00:00
Hyu
d8ab0ba567
feat(telemetry): report workspace execution generation ( #2374 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-08-01 02:10:59 +08:00
Hyu
5d9fd15671
feat: use workspace identity for telemetry ( #2371 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-07-31 23:35:14 +08:00
Hyu
404e3466d9
feat(cloud): add scoped support admin sessions ( #2369 )
...
* feat(cloud): add scoped support admin sessions
* style(web): format support admin session changes
* fix(cloud): isolate support adapter sessions
* fix(cloud): authenticate plugin assets and report workspace resources
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-07-31 17:41:55 +08:00
Constantine
9df021eb8f
fix(telegram): stop leaking bot token via Image.url ( #2366 )
...
Telegram file.file_path is a full URL of the form
https://api.telegram.org/file/bot <TOKEN>/<path> that embeds the bot
token. Since #2362 this URL was copied into Image.url, so the token was
serialized into the message chain and thereby persisted to the
monitoring database, shown in the dashboard, and forwarded to every
installed plugin via event dispatch. Anyone with dashboard or plugin
access could recover the token and take full control of the bot.
Unlike the public CDN URLs used by the other adapters changed in #2362 ,
Telegram file URLs are only usable with the embedded token, so there is
no safe URL to expose. Store base64 only (as before #2362 ); the vision
path already relies solely on base64, so nothing downstream changes.
Add a regression test asserting the token never appears in the
converted Image or the serialized message chain.
Co-authored-by: Constantine1916 <Constantine1916@users.noreply.github.com >
2026-07-31 17:25:19 +08:00
Hyu
5ec2371879
fix(config): preserve typed list environment overrides ( #2367 )
...
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-07-31 16:06:09 +08:00
RockChinQ
e1ac5e0fc8
feat(tenancy): add Workspace multi-tenant foundation ( #2353 )
...
* Document multi-tenant workspace architecture
* Add OSS and commercial workspace boundaries
* docs: redesign multi-tenant workspace architecture
* feat(tenancy): implement workspace isolation
* docs(tenancy): record verification evidence
* docs(tenancy): revise single-instance SaaS topology
* docs(tenancy): refine architecture options
* docs: finalize cloud v2 multi-tenant decisions
* feat(tenancy): establish cloud isolation foundations
* feat(tenancy): harden shared cloud runtime boundaries
* docs(tenancy): record final isolation verification
* fix(tenancy): close isolation and permission gaps
* docs(tenancy): record final isolation verification
* feat(tenancy): connect cloud workspace control plane
* fix(build): install git for pinned SDK
* docs(cloud): update control plane verification
* chore: update multi-tenant SDK pin
* fix(cloud): skip legacy model sync during startup
* test(cloud): preserve minimal model manager fixtures
* fix(cloud): preserve authenticated account context
* fix(cloud): reuse authenticated account for user info
* feat(cloud): complete Workspace settings navigation
* test(web): cover Workspace dropdown menu
* feat(web): place workspace controls in sidebar
* refactor(web): streamline workspace controls
* style(web): format workspace layout test
* fix(cloud): surface runtime and workspace plan status
* fix(plugin): keep runtime identity stable across restarts
* fix(ui): widen and center workspace switcher
* fix(ui): hide roles from workspace switcher
* fix(ui): align workspace switcher with sidebar entries
* feat(workspace): add in-product collaboration and direct Cloud launch
* style: format collaboration changes
* fix(workspace): bind collaboration APIs to tenant UoW
* fix(cloud): preserve Core-owned collaboration state
* test(cloud): require Space identity for invite registration
* feat(cloud): complete secure invitation experience
* style(web): format invitation flows
* fix(cloud): recover box runtime without unscoped skill reload
* feat(oss): enforce invitation account and owner billing flows
* style: format OSS account service
* test(oss): cover invitation logout handoff
* fix(oss): resolve workspace owner in scoped session
* feat(cloud): harden multi-tenant runtime resources
* fix(cloud): bound runtime restart storms
* fix(cloud): eliminate periodic runtime CPU spikes
* fix(cloud): enforce instance capacity ceilings
* fix(cloud): scope public login capability discovery
* fix(cloud): bound tenant maintenance and monitoring work
* fix(runtime): bound tenant resource amplification
* fix(deps): pin green multi-tenant plugin SDK
* fix(cloud): handle unavailable skill capability
* fix(security): require authentication for image file endpoint (H-2)
- Changed /api/v1/files/image from AuthType.NONE to USER_TOKEN_OR_API_KEY
- Added Permission.RESOURCE_VIEW requirement
- Prevents unauthenticated cross-tenant file access via leaked keys
- Fixes HIGH severity finding from multi-tenant security review
docs: add comprehensive database migration guide
- Complete migration steps for OSS → multi-tenant
- Backup, execution, verification procedures
- Rollback scenarios and recovery plans
- Performance tuning recommendations
* test: add comprehensive cross-tenant isolation tests
Added 7 critical test scenarios for multi-tenant boundaries:
- Cross-tenant bot access prevention
- Viewer role read-only enforcement
- Removed member immediate access revocation
- Model provider credential isolation
- WebSocket message isolation
- Invitation token workspace scoping
- Multi-workspace context validation
These tests address P0-2 coverage gaps for:
- workspaces.py (membership & invitation flows)
- user.py (authentication & authorization)
- websocket_chat.py (real-time isolation)
- plugins.py (resource access control)
docs: finalize database migration guide
* fix(security): resolve M-1, M-2, M-3 security findings
M-1: WebSocket authorization TOCTOU race (FIXED)
- Changed _revalidate_websocket_authorization to return RequestContext
- Ensures validated context is used immediately without race window
- Prevents removed members from sending messages during revalidation gap
M-2: Model Manager cache workspace isolation (VERIFIED)
- Confirmed _CacheKey already uses 4-tuple: (instance, workspace, generation, resource)
- Cache is properly scoped per workspace, no cross-tenant leakage possible
- No code change needed, documented as working correctly
M-3: Invitation lock workspace scoping (FIXED)
- Changed lock key from token_digest to workspace_uuid:token_digest
- Prevents DoS where attacker locks token in Workspace A to block Workspace B
- Locks now isolated per workspace
All MEDIUM severity findings from security review now resolved.
* fix(cloud): unblock tenant CI and enforce knowledge quotas
* fix(tenancy): scope rerank model sync
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-07-30 21:43:35 +08:00
Hyu
3ca724d18e
fix: use per-bot admins for command events ( #2359 )
...
* fix: use per-bot admins for command events
* style: format rerank provider changes
---------
Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com >
2026-07-26 17:02:51 +08:00
Hyu
dd8d1007a1
feat: support Space rerank models ( #2358 )
...
Co-authored-by: chan <dadachann@users.noreply.github.com >
2026-07-26 16:37:34 +08:00
Junyan Qin
283c6949f4
fix(mcp): validate tool call timeout config
2026-07-23 18:26:41 +08:00
Junyan Qin
0dfae76e39
fix(mcp): make tool call timeout configurable
2026-07-23 18:26:37 +08:00
Junyan Qin
73e47ea2d4
fix(mcp): keep waiting for box recovery
2026-07-23 17:41:27 +08:00
Junyan Qin
06e03af994
fix(runtime): complete reconnect recovery paths
2026-07-23 17:28:31 +08:00
Junyan Qin
8511178666
fix(runtime): harden connector lifecycle
2026-07-23 16:03:26 +08:00
Junyan Qin
998b76d53a
fix(runtime): make plugin and box connectors resilient
2026-07-21 18:43:24 +08:00
Junyan Qin
1765c43262
Revert "fix(runtime): make plugin and box connectors resilient"
...
This reverts commit 0b461e5830 .
2026-07-21 18:43:01 +08:00
Junyan Qin
0b461e5830
fix(runtime): make plugin and box connectors resilient
2026-07-21 18:41:22 +08:00
DongXiaoming
76c5003c21
fix(localagent): stop re-seeding stream accumulator with previous round content ( #2329 )
...
When the LLM (e.g. MiniMax-M3) returns multiple rounds after tool calls, the _StreamAccumulator was initialized with initial_content=first_content, causing every subsequent round to repeat the entire first message. Remove the re-seeding so each round starts with a clean accumulator.
Add regression test verifying multi-round tool call content is not duplicated.
2026-07-20 16:38:11 +08:00
Hyu
48952206db
fix(lark): keep connection lookup off event loop
...
Move the Lark SDK synchronous connection URL lookup off the main asyncio loop, serialize reconnects, and cover the incident with a non-blocking regression test.
2026-07-15 19:53:48 +08:00
DongXiaoming
c53b800267
fix(provider): strip think tags for MiniMax-M3 and other OpenAI-compatible models ( #2330 )
...
* fix(provider): strip think tags for MiniMax-M3 and other OpenAI-compatible models
MiniMax-M3 (and other OpenAI-compatible providers) emit chain-of-thought
reasoning directly in the content field wrapped in tags, instead
of using a separate reasoning_content field or the legacy CRETIRE_REASONING
markers. The existing remove_think logic only handled CRETIRE_* tags, so
think blocks leaked into user-visible output even when remove_think was enabled.
- Add _ThinkStripState: a stateful filter that correctly handles tags
split across streaming chunk boundaries.
- Add _strip_think classmethod with regex patterns for both and
CRETIRE_* tags.
- Wire think_state into invoke_llm_stream so deltas are filtered before
reaching the accumulator.
- Add remove_think safety net in _StreamAccumulator so the final message
from tool-call rounds also gets stripped.
- Fix remove_think resolution to use defensive nested .get() so
pipelines missing output.misc don't raise AttributeError.
* fix(litellmchat): add missing _CLOSE_TAG class attribute on _ThinkStripState
* fix(provider): handle think stripping across LiteLLM paths
---------
Co-authored-by: WangCham <651122857@qq.com >
2026-07-15 10:54:41 +08:00
RockChinQ
bd35b793e1
fix(embed): isolate browser chat sessions ( #2335 )
...
* fix(embed): isolate browser chat sessions
* fix(embed): harden reset and reconnect recovery
2026-07-13 15:08:45 +08:00
Stevenqin
2c3e52c16c
fix(aiocqhttp): correct listener lifecycle handling ( #2336 )
...
* fix(aiocqhttp): correct listener lifecycle handling
* docs(aiocqhttp): add listener lifecycle evidence
2026-07-13 13:50:08 +08:00