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
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.
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.
### Summary
Fix IME input breaking in EditTag component. Enter key during Chinese/Japanese/Korean composition would incorrectly commit an incomplete tag. Added e.nativeEvent.isComposing guard so Enter only adds a tag after composition ends. Tests added.
### Summary
Fix history.location.state always returning undefined in simple-history-util.ts. The getter incorrectly referenced the module instance (history.state) instead of the browser API (window.history.state). Now reads from window.history.state. Unit tests added.
### Summary
Fix formatSecondsToHumanReadable trailing space bug. Durations like 60s returned "1m " instead of "1m". Changed to build parts without trailing spaces and join with a single space. Unit tests added. Affects dataset overview, document list, and dataflow views.
### Summary
@JinHai-CN — the agent tool you asked for in #18478, as its own PR.
Adds `YouComSearch` to the agent tool set, modeled on the Keenable tool
(#16233) rather than Querit's: You.com exposes a small parameter
surface, so this needs a two-field form rather than a bespoke form
suite. **+594 lines**, close to Keenable's +392 and well under Querit's
+3527.
Independent of #18478. That PR wires You.com into chat retrieval; this
one is the agent canvas node. Neither depends on the other and they
share no lines.
---------
Co-authored-by: Brian Sparker <brainsparker@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Summary
Closes#18683.
The Wiki artifact view previously enabled **Generate** whenever a
dataset had parsed chunks. Built-in datasets can have chunks without an
ingestion pipeline, so the backend finds no wiki-eligible documents and
exits without generating pages.
This PR adds a focused frontend eligibility check so Wiki generation is
offered only when the dataset has parsed chunks and is associated with
an ingestion pipeline.
### Summary
Closes#17848.
This replaces #17958 with a smaller implementation focused on the
original requirement. The previous PR gradually expanded beyond the
necessary scope; the optional custom endpoint extension is intentionally
excluded from this version.
- Add request-scoped Bedrock API key authentication to the Python
Bedrock adapters and Go chat runtime.
- Discover and persist models available to API key instances, so users
do not need to manually enter the model type, model name, or maximum
token count.
- Add API Key mode to the existing Bedrock settings UI and refresh the
model and default-model lists after instance changes.
- Preserve selected models during credential-only updates while keeping
the existing SigV4 authentication modes unchanged.
- Return a clear error for unsupported API-key reranking.
- Document instance-scoped authentication and short-term API key
guidance.
Two fixes not yet on main:
Pass picker-selected models into Verify – useVerifyProvider now includes modelInfoRef in the verify payload so the backend can verify the user's actual selection.
Guard model construction – Wrap EmbeddingModel/ChatModel init in try/except so failures are recorded as per-model FAIL instead of aborting the whole verify call.
Also: later failures now overwrite previous successes per review feedback.
Preserve completed component progress when an ingestion task resumes from a checkpoint. Checkpointed operators are skipped and do not emit lifecycle events again, which previously caused the document progress to
remain below 100%.
### Summary
The Keenable tool icon added in #18341 was a placeholder I drew: a
generic blue rounded square with a magnifying glass, not the Keenable
brandmark. Swapped for the mark from our brand guidelines.
Same shape as the neighbouring tool logos: one `<svg>` with a `viewBox`
and no fixed width/height, so it is sized by the CSS around it, and
transparent, so it reads on the light and the dark theme alike.
Frontend-only, one file.