* fix(knowledge): tell the user a restart is what the install needs
When the local embedding packages land in pip's user site, CPython only puts that
directory on sys.path if it existed at interpreter startup, so a long-running
server can never import them. ensure_local_embedding_deps() already raises with
'Restart the server and try again', but _map_knowledge_error() matched the text on
'embedding'/'component' and replaced it with the generic prerequisites error, so
the user retried a download that could not succeed. Map that case to its own code
and message.
* test(i18n): register the new code in the dashboard locales too
tests/unit/i18n/test_errors.py asserts the dashboard apiErrors keys equal the
backend ErrorCode set, so the new restart-required code has to be listed there
as well.
Apply the remaining working-tree changes: connectors empty-state layout,
plus the knowledge, HITL, captcha, workspace, user-cache, and SSRF
adjustments with matching tests.
Co-authored-by: Cursor <cursoragent@cursor.com>
`_map_knowledge_error` matched the literal "at most 100" to classify the
document-cap error, but `KnowledgeRepo.create_document` interpolates the
per-base `max_documents`, which has been user-configurable since 90b8ca25.
Any cap other than the default 100 therefore fell through to the base-cap
branch (the repo message also contains "knowledge bases") and the user was
told they had created too many knowledge bases.
Classify both caps by the stable wording of their own messages instead of
a magic number, and drive the mapping from the real repo in a regression
test so the wording coupling cannot silently rot again.
Co-authored-by: sxh <sunxianhong@ncti-gba.cn>
Co-authored-by: sxh313 <sxh313@users.noreply.github.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
- Add max_documents to 010_thread_message_projection.pg.sql via ADD COLUMN IF NOT EXISTS
- Invoke _ensure_knowledge_bases_schema across dialects at the end of run_migrations
- Distinguish prerequisites errors in _map_knowledge_error instead of masking unclassified errors as 409
- Add PostgreSQL integration test for knowledge_bases max_documents column and CRUD
- Add unit tests verifying _map_knowledge_error behavior on unclassified errors
Parse more text and spreadsheet types, add optional local/remote OCR for images and scanned PDFs, and surface upload progress so indexing no longer appears stuck.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: inject Admin env into running agents and sum turn token usage
Running shells and Docker sandboxes now pick up ~/.octop/env (and workspace .env) without a full reload; MCP stdio no longer inherits the entire host environment. Usage accounting adds every model call in the turn, and workspace I/O survives the harness rebuild window.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: schema v7 identity, expert profiles, chat artifacts, and KB citations (#346)
* feat: schema v7 identity, expert profiles, chat artifacts, and KB citations
Fold integer PKs plus public string ids, document folders, agent profile columns, and thread artifacts into v7 SQL (not only Python helpers). Experts get workspace avatars and a single welcome_message; chat keeps file changes across sessions, shows knowledge citations, and can drag workspace files.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore: drop cron JobDrawer UX from the schema v7 PR
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: prefer tool-arg paths when recording chat artifacts
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Register routers/repos/migrations, OpenAPI tags, i18n/error codes, sidebar routes, and docs for the new platform capabilities.
Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce document indexing, embedding (ONNX/remote), and chat/IM injection with default-open selection in the dashboard composer.
Co-authored-by: Cursor <cursoragent@cursor.com>