Fix Deep Research cancellation race where partial results could return nil error if workers finished as request canceled. Now waits for workers first, then checks context error. Deterministic propagation.
### Summary
Fix `DataSet.list_documents(ids=[...])` by passing the ID list through
the request parameter mapping, which serializes it as repeated `ids`
query parameters.
This preserves existing behavior for `ids=[]` as an unfiltered request
and for combining `id` with non-empty `ids`, which raises `ValueError`.
Add regression coverage for all three cases.
Co-authored-by: root <kinsonnee@gmail.com>
Fix canvas autosave wiping pipelines (#18771). Previously saved empty graph on any change/remount. Now only autosaves when canvas has nodes/edges, agent is loaded, and chat drawer closed. Fetch no longer clears loaded canvas on empty DSL. Tests added.
Fixes#18771
### Summary
Add Xquik as a new data source for X (Twitter) post ingestion. Supports Latest/Top queries, cursor pagination, incremental sync, and maps engagement/media to RAGFlow documents. Stops duplicate requests on repeated cursors. Tests and docs included.
---------
Co-authored-by: kriptoburak <kriptoburak@users.noreply.github.com>
## Summary
Fix entrypoint.sh restart loops where non-zero exits would terminate the subshell instead of retrying (root cause of #18542). Now wraps each binary with set +e / set -e to capture exit status and log it before restarting. Applied to 6 loops. Complementary to #17196.
Co-authored-by: skbs-eng <skbs-eng@users.noreply.github.com>
### Summary
Provider settings were saved correctly, but reopening them requested the
instance by ID while the running backend could only find it by name.
The fix makes provider instance reads honor the saved ID, so
configurations load correctly after reopening.
Fix OpenSearch update missing kb_id scope. Unlike Elasticsearch, OSConnection.update dropped the knowledgebaseId argument, causing updates (like clearing pagerank) to apply to all datasets in a tenant. Now adds kb_id to the query condition.
### Summary
In agent **Explore**, asking a model and switching to another session
(chat box) while the answer was still streaming caused the streaming
answer to be rendered inside the session the user had just switched to.
**Root cause.** The Explore page mounts `SessionChat` once per canvas;
`useSendAgentMessage` therefore keeps one SSE `answerList` and one
`derivedMessages` list shared by every session. The effect that folds
streamed frames into the message list
(`web/src/pages/agent/chat/use-send-agent-message.ts`) appended
unconditionally, so after a session switch the in-flight frames of
session A were written into the message list of the currently displayed
session B. The global `sendLoading` also made the last assistant message
of session B show a streaming indicator.
**Fix.** Every agent SSE frame already carries the `session_id` it
belongs to (see the frame contract in
`internal/agent/canvas/runner.go`), so ownership is known on the client:
- `useSendAgentMessage` accepts an optional `activeSessionId` (the
session the page is currently displaying) and skips the streamed-answer
append when the stream's `session_id` differs from it. It also exposes
`streamSessionId` so callers can scope streaming UI.
- The Explore hook (`use-send-session-message.ts`) passes the URL
session id as `activeSessionId`.
- `session-chat.tsx` shows the per-message streaming loading state only
when the in-flight stream belongs to the displayed session.
Behavior after the fix: switching sessions mid-answer keeps each
session's message list clean; switching back to the streaming session
resumes rendering the answer there; the answer is still persisted to its
own session by the backend. Canvas debug chat and shared-agent chat are
unchanged (they pass no `activeSessionId`, so the gate is inactive).
**Verification.** Reproduced in the browser (dev services): asked for a
long essay in session A, switched to session B mid-stream — pre-fix,
session B showed session A's growing essay (~27k chars); post-fix,
session B shows only its own history while the stream keeps running
(confirmed by switching back and watching it continue in A). `jest
src/pages/agent` passes (12 suites / 79 tests); `tsc --noEmit` shows no
new errors in the touched files (remaining errors are pre-existing on
main).
---------
Co-authored-by: euvre <euvre@users.noreply.github.com>
Fix Artifacts Tree tab to show error message on navigation API failure instead of misleading "No navigation nodes". Added error handling in frontend, i18n strings, and backend unit tests. 6 tests pass.
Fix sandbox teardown (make clean / stop.sh) to remove actual containers by pattern instead of relying on POOL_SIZE range. Old logic left containers behind when .env changed or was missing. Now uses docker ps -a | grep with anchored pattern. Cleanup works without .env; Docker errors are properly reported.
Fix sandbox spec documentation mismatch. pool_size is a deployment-scoped env var (read-only), not a writable runtime setting. Removed from writable examples, updated spec to match actual provider schema, and fixed stale test assertions.
Adds Azure DevOps as a new data source, syncing repository files and pull requests. Supports both hosted and self-hosted. Excludes wikis, work items, and binaries. Includes checkpoint/resume, change detection via commit IDs, and handles Azure's quirky 203 auth response. Tests passed against real deployment.