- Send X-DF-Exchange-Secret from PLG_SUPERSET_EXCHANGE_SECRET in both
token exchange paths (SupersetAuthBridge and TokenStore), so a shared
secret configured on Superset no longer causes silent 403s
- Log SSO exchange failures at warning level with the underlying error
instead of swallowing them at debug level
- Lift the SSO reconnect block when a user explicitly connects a
connector, so reconnecting works without logging out of SSO
- Clarify CORS guidance in the Superset example config
Tests: tests/backend/auth/test_token_store.py,
tests/backend/data/test_data_connector_framework.py (83 passed)
Single-user localhost mode was decided at import from HOST (default
127.0.0.1), before the CLI parsed --host, so a server started with
--host 0.0.0.0 (as the Docker image is) treated every network client as
the machine owner (MSRC 168681, 156375).
- The CLI re-decides the mode once --host is known; under a WSGI server
the address is unknown, so HOST must name a loopback address.
- DF_SINGLE_USER=1 keeps single-user mode where access is restricted
another way; docker-compose sets it and publishes the port on 127.0.0.1.
- Data-loader plugins load only in single-user mode or with
DF_ALLOW_PLUGINS=1, after the mode is final (MSRC 116889). Previously
the gate read WORKSPACE_BACKEND, which DISABLE_DATABASE does not set.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The demo preset keeps no credentials, so it no longer creates a vault key and
database on disk. CREDENTIAL_VAULT=local keeps the vault for configured
connections that store secrets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Each isolated worker is a separate ~200 MB interpreter. On multi-user servers
with many gunicorn processes, idle workers now expire (DF_SANDBOX_IDLE_SECONDS,
default 120 s; 600 s in local mode) and each process keeps at most two used
workers idle; prewarmed workers are not counted.
The startup sandbox isolation line uses the data_formulator.sandbox logger so
it is emitted when gunicorn loads the module as top-level 'app'.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
App Service builds with Oryx run the app from an extracted copy under /tmp/<id>,
so a DF_SANDBOX_BWRAP pointing at /home/site/wwwroot no longer exists. Expand
$VARS in the setting and fall through to PATH and the bundled binary when the
configured path is missing.
Workers now start with -s -P instead of -I and receive the server's import
directories as PYTHONPATH (allowlisted environment), which the audit hook also
treats as library roots, so PYTHONPATH-based virtualenvs keep working.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The migration list in 8-path-safety.md still names
cached_azure_blob_workspace.py and its _cache_path method. Neither
exists in the tree: only azure_blob_workspace.py and
azure_blob_workspace_manager.py are present, and nothing defines
_cache_path.
Replace direct crypto.randomUUID() calls in the conversation-root and workflow reply/send paths with the existing generateUUID() helper, and guard navigator.clipboard with optional chaining. Both APIs are unavailable in non-secure contexts (HTTP + IP), where they throw and abort message sending before the request is issued.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Merge dev (the test conflict was a neighbouring test dev removed). Instead
of repeating the lazy `_jail` guard in ls and get_metadata, every method now
gets the jail from `_root_jail()`, which builds it on first use; this also
replaces the four copies of the guard dev already had.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolve the ja conflicts (keep the PR's wording, take dev's added and removed
keys), translate the 38 keys dev added since this branch for de/fr/ko, drop
the keys dev removed, update deviceCodeInstructions to dev's new text, and add
the two new htmlApp keys to ja/zh/hi/id so every locale matches en.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The annotations feature was removed (data_connector.py: "User annotations
were removed in favor of source-system metadata only"), but the dev guide
still documented its files, endpoints, error codes and storage format.
Prune the annotation/merge material and keep the sync, cache and table_key
content, which is still accurate.
Fixes#480
The guide still described the removed experiences feature: ExperienceDistillAgent, /distill-experience, SaveExperienceButton and knowledge/experiences/. Point it at WorkflowDistillAgent, /distill-workflow, the session-scoped SessionDistill flow and knowledge/workflows/.
agent_data_loading_chat.py and tests/backend/agents/test_tool_path_safety.py
no longer exist, so the six ConfinedDir migration rows and the reference
test bullet in 8-path-safety.md pointed at nothing.
Checkpoints and the message inbox are written as UTF-8, but several readers used the locale encoding, so non-ASCII text raised UnicodeDecodeError or came back as mojibake on Windows.
open() without an encoding uses the locale codec, so on a cp1252 machine a connectors.yaml with non-ASCII names was mis-decoded or, for bytes cp1252 leaves undefined, failed to parse and the whole file was dropped.
Add three new frontend locale bundles (de, fr, ko), each with all 10 domains at full 2217-key parity with en. Register them in locales/index.ts and i18n/index.ts and cover key parity with unit tests. Also refine existing Japanese translations, including restoring the dropped {{name}} placeholder in setupForm.sessionName.
Add an html_app analyst skill whose write_html_app action saves an
agent-managed .html workspace file with a manifest of the tables it may
read. Revisions go through edit_file.
The canvas renders .html files in a double iframe: a same-origin
container with frame-src 'none' (blocks navigation exfiltration) holding
an opaque-origin sandbox="allow-scripts" app frame with a CSP that
blocks network access. An inlined DF runtime provides DF.query/DF.table
(validated bridge to sample-table, manifest tables only), DF.chart
(Vega-Lite), and theme variables.
Remove the unused Chartifact dialog and its i18n keys.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>