Commit graph

106 commits

Author SHA1 Message Date
Luis Novo
8ee18d1fb7 docs: add security guidelines for contributors
Add security.md covering database query safety, template rendering,
file handling, secrets management, and a code review checklist.
Informed by CERT-EU coordinated vulnerability disclosures.
2026-04-09 12:16:09 -03:00
Luis Novo
70a466a640 fix: prevent RCE via SSTI, path traversal file write, and LFI file read
- Bump ai-prompter to >=0.4.0 which uses Jinja2 SandboxedEnvironment,
  preventing arbitrary code execution via user-provided transformation prompts
- Sanitize uploaded filenames with os.path.basename() and validate resolved
  path stays within upload directory to prevent path traversal
- Validate file_path in source creation is within UPLOADS_FOLDER to prevent
  arbitrary file read via Local File Inclusion
2026-04-09 11:58:16 -03:00
Luis Novo
3d560b4248 chore: bump version to 1.8.3 and update changelog
Add 1.8.2 and 1.8.3 entries to CHANGELOG.md.
1.8.3 documents the SurrealDB injection security fix.
2026-04-07 07:59:16 -03:00
Luis Novo
adc03e56bb feat: add DashScope (Qwen) and MiniMax provider support
- Bump esperanto dependency to >=2.20.0 for new provider profiles
- Register both providers in credentials, key provider, connection tester, model discovery, and models router
- Add frontend provider entries (display names, modalities, docs links)
- Add documentation sections for both providers in ai-providers.md, environment-reference.md, and provider comparison
2026-04-06 10:54:37 -03:00
Luis Novo
c36782e5c5
Merge pull request #671 from lfnovo/dependabot/uv/orjson-3.11.6
chore(deps): bump orjson from 3.11.5 to 3.11.6
2026-04-06 07:37:28 -03:00
Luis Novo
859b1e23ac
Merge pull request #678 from lfnovo/dependabot/uv/authlib-1.6.9
chore(deps): bump authlib from 1.6.7 to 1.6.9
2026-04-06 07:37:04 -03:00
Luis Novo
55a54710c6
Merge pull request #672 from lfnovo/dependabot/uv/pyjwt-2.12.0
chore(deps): bump pyjwt from 2.10.1 to 2.12.0
2026-04-06 07:36:48 -03:00
Luis Novo
2644c89ce0
Merge pull request #679 from lfnovo/dependabot/uv/pyasn1-0.6.3
chore(deps): bump pyasn1 from 0.6.2 to 0.6.3
2026-04-06 07:36:14 -03:00
Luis Novo
1b14b90ec8
Merge pull request #702 from lfnovo/dependabot/uv/cryptography-46.0.6
chore(deps): bump cryptography from 46.0.5 to 46.0.6
2026-04-06 07:36:02 -03:00
dependabot[bot]
e2120338a0
chore(deps): bump pyasn1 from 0.6.2 to 0.6.3
Bumps [pyasn1](https://github.com/pyasn1/pyasn1) from 0.6.2 to 0.6.3.
- [Release notes](https://github.com/pyasn1/pyasn1/releases)
- [Changelog](https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst)
- [Commits](https://github.com/pyasn1/pyasn1/compare/v0.6.2...v0.6.3)

---
updated-dependencies:
- dependency-name: pyasn1
  dependency-version: 0.6.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 10:35:52 +00:00
Luis Novo
5e73124709
Merge pull request #697 from lfnovo/dependabot/uv/requests-2.33.0
chore(deps): bump requests from 2.32.5 to 2.33.0
2026-04-06 07:35:46 -03:00
dependabot[bot]
8eddc611ea
chore(deps): bump authlib from 1.6.7 to 1.6.9
Bumps [authlib](https://github.com/authlib/authlib) from 1.6.7 to 1.6.9.
- [Release notes](https://github.com/authlib/authlib/releases)
- [Changelog](https://github.com/authlib/authlib/blob/main/docs/changelog.rst)
- [Commits](https://github.com/authlib/authlib/compare/v1.6.7...v1.6.9)

---
updated-dependencies:
- dependency-name: authlib
  dependency-version: 1.6.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 10:35:31 +00:00
dependabot[bot]
020fb46a8f
chore(deps): bump orjson from 3.11.5 to 3.11.6
Bumps [orjson](https://github.com/ijl/orjson) from 3.11.5 to 3.11.6.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.11.5...3.11.6)

---
updated-dependencies:
- dependency-name: orjson
  dependency-version: 3.11.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 10:35:25 +00:00
Luis Novo
12368067e3
Merge pull request #701 from lfnovo/dependabot/uv/langchain-core-1.2.22
chore(deps): bump langchain-core from 1.2.11 to 1.2.22
2026-04-06 07:35:00 -03:00
Luis Novo
8240d469ed
Merge pull request #707 from lfnovo/dependabot/uv/pygments-2.20.0
chore(deps): bump pygments from 2.19.2 to 2.20.0
2026-04-06 07:34:42 -03:00
Luis Novo
abfa52c191
Merge pull request #709 from lfnovo/dependabot/uv/fastmcp-3.2.0
chore(deps): bump fastmcp from 2.14.3 to 3.2.0
2026-04-06 07:34:25 -03:00
dependabot[bot]
4a0fe7f6a1
chore(deps): bump aiohttp from 3.13.3 to 3.13.4
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.13.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-01 22:23:29 +00:00
dependabot[bot]
295c906d97
chore(deps): bump fastmcp from 2.14.3 to 3.2.0
Bumps [fastmcp](https://github.com/PrefectHQ/fastmcp) from 2.14.3 to 3.2.0.
- [Release notes](https://github.com/PrefectHQ/fastmcp/releases)
- [Changelog](https://github.com/PrefectHQ/fastmcp/blob/main/docs/changelog.mdx)
- [Commits](https://github.com/PrefectHQ/fastmcp/compare/v2.14.3...v3.2.0)

---
updated-dependencies:
- dependency-name: fastmcp
  dependency-version: 3.2.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-31 22:28:50 +00:00
dependabot[bot]
4943d27dec
chore(deps): bump pygments from 2.19.2 to 2.20.0
Bumps [pygments](https://github.com/pygments/pygments) from 2.19.2 to 2.20.0.
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.19.2...2.20.0)

---
updated-dependencies:
- dependency-name: pygments
  dependency-version: 2.20.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 19:50:20 +00:00
dependabot[bot]
5f2e105b40
chore(deps): bump cryptography from 46.0.5 to 46.0.6
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.5 to 46.0.6.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.5...46.0.6)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-29 04:14:00 +00:00
dependabot[bot]
f142d98c15
chore(deps): bump langchain-core from 1.2.11 to 1.2.22
Bumps [langchain-core](https://github.com/langchain-ai/langchain) from 1.2.11 to 1.2.22.
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/langchain-core==1.2.11...langchain-core==1.2.22)

---
updated-dependencies:
- dependency-name: langchain-core
  dependency-version: 1.2.22
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-28 01:32:47 +00:00
dependabot[bot]
845118e250
chore(deps): bump requests from 2.32.5 to 2.33.0
Bumps [requests](https://github.com/psf/requests) from 2.32.5 to 2.33.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.5...v2.33.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.33.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 15:07:47 +00:00
dependabot[bot]
9b74c8f406
chore(deps): bump pyjwt from 2.10.1 to 2.12.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.1 to 2.12.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.1...2.12.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-version: 2.12.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 00:42:38 +00:00
Luis Novo
b7bba2461c fix: bump esperanto to 2.19.7 to fix base_url/api_key config in multiple embedding providers
Fixes the same kwargs vs self.* issue found in Azure, OpenAI, Voyage,
Google, and Jina embedding providers.
2026-03-11 15:51:52 -05:00
Luis Novo
06f8be8409 fix: bump esperanto to 2.19.6 to fix Ollama embedding base_url
The OllamaEmbeddingModel was ignoring the base_url from credentials/config,
always falling back to env vars or localhost. This caused embedding failures
for users with custom Ollama endpoints.

Fixes #655
2026-03-11 14:46:16 -05:00
dependabot[bot]
ec1cc216a9
chore(deps): bump langgraph from 1.0.6 to 1.0.10rc1 (#658)
Bumps [langgraph](https://github.com/langchain-ai/langgraph) from 1.0.6 to 1.0.10rc1.
- [Release notes](https://github.com/langchain-ai/langgraph/releases)
- [Commits](https://github.com/langchain-ai/langgraph/compare/1.0.6...1.0.10rc1)

---
updated-dependencies:
- dependency-name: langgraph
  dependency-version: 1.0.10rc1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:36:33 -03:00
dependabot[bot]
1ed371c205
chore(deps): bump authlib from 1.6.6 to 1.6.7 (#649)
Bumps [authlib](https://github.com/authlib/authlib) from 1.6.6 to 1.6.7.
- [Release notes](https://github.com/authlib/authlib/releases)
- [Changelog](https://github.com/authlib/authlib/blob/main/docs/changelog.rst)
- [Commits](https://github.com/authlib/authlib/compare/v1.6.6...v1.6.7)

---
updated-dependencies:
- dependency-name: authlib
  dependency-version: 1.6.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:35:30 -03:00
dependabot[bot]
0ee5b8c9d8
chore(deps): bump lxml-html-clean from 0.4.3 to 0.4.4 (#646)
Bumps [lxml-html-clean](https://github.com/fedora-python/lxml_html_clean) from 0.4.3 to 0.4.4.
- [Changelog](https://github.com/fedora-python/lxml_html_clean/blob/main/CHANGES.rst)
- [Commits](https://github.com/fedora-python/lxml_html_clean/compare/0.4.3...0.4.4)

---
updated-dependencies:
- dependency-name: lxml-html-clean
  dependency-version: 0.4.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 21:35:20 -03:00
Luis Novo
d6b76f63a8
fix(deps): bump esperanto to 2.19.5 (#657) 2026-03-10 18:35:09 -03:00
Luis Novo
7910f683f6
fix(podcasts): enable language support by bumping podcast-creator to 0.12.0 (#645)
The language field on EpisodeProfile was being saved to the database but
had no effect during generation because podcast-creator 0.11.x didn't
support the language parameter. Version 0.12.0 adds language support to
the generation pipeline (outline + transcript templates), and since
open-notebook already passes the full episode profile config to
podcast-creator, the language field is picked up automatically.

Closes #640
2026-03-03 11:50:16 -03:00
Luis Novo
eac837d555
feat(podcasts): model registry integration, credential passthrough & new features (#632)
* feat(podcasts): integrate model registry for profiles and credential passthrough

Replace loose provider/model string fields with record<model> references
in podcast profiles, enabling credential passthrough to podcast-creator.

Backend:
- EpisodeProfile: outline_llm, transcript_llm (record<model>) replace
  outline_provider/outline_model strings. New language field (BCP 47).
- SpeakerProfile: voice_model (record<model>) replaces tts_provider/
  tts_model strings. Per-speaker voice_model override support.
- Migration 14: schema changes making legacy fields optional, adding new
  record<model> fields.
- Data migration (migration.py): auto-converts legacy profiles to model
  registry references on startup. Idempotent.
- podcast_commands.py: resolves credentials for ALL profiles before
  calling podcast-creator.
- New /api/languages endpoint (pycountry + babel) with BCP 47 locale
  codes (pt-BR, en-US, etc.).

Frontend:
- Episode/speaker profile forms use ModelSelector instead of manual
  provider/model dropdowns.
- Language dropdown with BCP 47 codes in episode profile form.
- Per-speaker TTS voice model override in speaker profile form.
- "Templates" tab renamed to "Profiles".
- Setup required badge on unconfigured profiles.
- i18n updated across all 8 locales.

Closes #486, closes #552

* fix(i18n): remove unused legacy podcast provider/model keys

Remove 10 orphaned i18n keys across all 8 locales that were left behind
after replacing manual provider/model dropdowns with ModelSelector.

* fix: address review violations in podcast model registry

- P1: Remove profiles with failed model resolution from dicts to prevent
  podcast-creator validation errors on unrelated profiles
- P2: Use centralized QUERY_KEYS.languages instead of inline key
- P3: Fix ISO 639-1 → BCP 47 in model field description and CLAUDE.md
- P3: Update "templates" → "profiles" in locale string values (all 8)

* chore: bump version to 1.8.0
2026-02-27 11:06:47 -03:00
Luis Novo
5d84ab0768 fix: embedding batch sizing and 413 error classification (1.7.4)
- Add batching to generate_embeddings() (50 texts per batch with per-batch retry)
  to prevent 413 Payload Too Large errors on large documents
- Add 413 error classification rule for user-friendly error messages
- Fix misleading "Created 0 embedded chunks" log in process_source_command
  by removing premature get_embedded_chunks() call (embedding is fire-and-forget)

Closes #594
2026-02-18 11:39:47 -03:00
Luis Novo
924cd88494
docs: update documentation for error handling and podcast retry (#599)
* docs: update CLAUDE.md and user docs for error handling and podcast retry

Add missing documentation for features introduced in v1.7.2 (#590) and
v1.7.3 (#595): error classification system, global exception handlers,
ConfigurationError, podcast failure recovery, and retry endpoint.

* chore: update uv.lock
2026-02-18 09:56:04 -03:00
Luis Novo
c666966b8c
fix: podcast failure recovery and retry (1.7.3) (#595)
* fix: surface podcast errors and enable retry for failed episodes

Fixes #335, #300

Re-raise exceptions in podcast command so surreal-commands marks jobs as
failed instead of completed. Surface error_message in API responses and
add a retry endpoint that deletes the failed episode and re-submits the
generation job. Frontend shows error details on failed episodes with a
retry button. Translations added for all 8 locales.

* fix: bump podcast-creator to >= 0.10

Fixes #302

* chore: release 1.7.3 - podcast failure recovery and retry

Bump podcast-creator to >= 0.11.2, disable automatic retries for
podcast generation to prevent duplicate episodes, and bump version
to 1.7.3.

Fixes #211, #218, #185, #355, #300, #302

* fix: resolve TypeScript error in handleRetry return type
2026-02-17 21:24:57 -03:00
Luis Novo
189a30c570 fix: bump podcast-creator to >= 0.9.4
Fixes #211
2026-02-17 17:32:34 -03:00
Luis Novo
cb5ec9d65c fix: restore graceful fallback in get_default_model and truncate error messages
- Catch ConfigurationError alongside ValueError in get_default_model()
  to preserve graceful fallback after ValueError→ConfigurationError migration
- Add _truncate() helper to error_classifier to cap pass-through and
  default error messages at 200 chars, avoiding verbose internal details
2026-02-16 16:25:31 -03:00
Luis Novo
115e1cc3e8 chore: bump podcast-creator to 0.9.1 2026-02-16 15:27:29 -03:00
Luis Novo
e66111b0de fix: bump esperanto to 2.19.3 to fix openai_compatible provider name
Esperanto 2.19.3 normalizes provider names by converting underscores
to hyphens, fixing the ValueError when using openai_compatible.

Closes #570
2026-02-15 08:32:22 -03:00
Luis Novo
78ae2096e6 chore: bump version to 1.7.1 2026-02-14 21:06:00 -03:00
Luis Novo
9b507f111c
fix: update esperanto to fix ElevenLabs TTS credential passthrough (#578)
Esperanto's AIFactory.create_text_to_speech() did not accept a config
dict like the other factory methods, so credentials configured via the
UI were not passed through. Fixed upstream in esperanto 2.9.2.

Refs #571
2026-02-14 19:12:49 -03:00
dependabot[bot]
db094da10a
chore(deps): bump langchain-core from 1.2.7 to 1.2.11 (#564)
Bumps [langchain-core](https://github.com/langchain-ai/langchain) from 1.2.7 to 1.2.11.
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/langchain-core==1.2.7...langchain-core==1.2.11)

---
updated-dependencies:
- dependency-name: langchain-core
  dependency-version: 1.2.11
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-14 18:10:43 -03:00
dependabot[bot]
1049b39449
chore(deps): bump cryptography from 46.0.3 to 46.0.5 (#563)
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.3 to 46.0.5.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.3...46.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-14 18:10:27 -03:00
Luis Novo
877c303b02
fix: update esperanto dep and increase transformation max_tokens (#568)
* fix: increase transformation max_tokens from 5055 to 8192

Closes #565

* chore: update esperanto dep to fix api keys passing via config - fixes: #567
2026-02-12 07:33:27 -03:00
dependabot[bot]
827cf55d25
chore(deps): bump pip from 25.3 to 26.0 (#532)
Bumps [pip](https://github.com/pypa/pip) from 25.3 to 26.0.
- [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/pip/compare/25.3...26.0)

---
updated-dependencies:
- dependency-name: pip
  dependency-version: '26.0'
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-10 08:34:37 -03:00
Luis Novo
3f352cfcce
feat: credential-based API key management (#477) (#540)
* feat: replace provider config with credential-based system (#477)

Introduce a new credential management system replacing the old
ProviderConfig singleton and standalone Models page. Each credential
stores encrypted API keys and provider-specific configuration with
full CRUD support via a unified settings UI.

Backend:
- Add Credential domain model with encrypted API key storage
- Add credentials API router (CRUD, discovery, registration, testing)
- Add encryption utilities for secure key storage
- Add key_provider for DB-first env-var fallback provisioning
- Add connection tester and model discovery services
- Integrate ModelManager with credential-based config
- Add provider name normalization for Esperanto compatibility
- Add database migrations 11-12 for credential schema

Frontend:
- Rewrite settings/api-keys page with credential management UI
- Add model discovery dialog with search and custom model support
- Add compact default model assignments (primary/advanced layout)
- Add inline model testing and credential connection testing
- Add env-var migration banner
- Update navigation to unified settings page
- Remove standalone models page and old settings components

i18n:
- Update all 7 locale files with credential and model management keys

Closes #477

Co-Authored-By: JFMD <git@jfmd.us>
Co-Authored-By: OraCatQAQ <570768706@qq.com>

* fix: address PR #540 review comments

- Fix docs referencing removed Models page
- Fix error-handler returning raw messages instead of i18n keys
- Fix auth.py misleading docstring and missing no-password guard
- Fix connection_tester using wrong env var for openai_compatible
- Add provision_provider_keys before model discovery/sync
- Update CLAUDE.md to reflect credential-based system
- Fix missing closing brace in api-keys page useEffect

* fix: add logging to credential migration and surface errors in UI

- Add comprehensive logging to migrate-from-env and
  migrate-from-provider-config endpoints (start, per-provider
  progress, success/failure with stack traces, final summary)
- Fix frontend migration hooks ignoring errors array from response
- Show error toast when migration fails instead of "nothing to migrate"
- Invalidate status/envStatus queries after migration so banner updates

* docs: update CLAUDE.md files for credential system

Replace stale ProviderConfig and /api-keys/ references across 8 CLAUDE.md
files to reflect the new Credential-based system from PR #540.

* docs: update user documentation for credential-based system

Replace env var API key instructions with Settings UI credential
workflow across all user-facing documentation. The new flow is:
set OPEN_NOTEBOOK_ENCRYPTION_KEY → start services → add credential
in Settings UI → test → discover models → register.

- Rewrite ai-providers.md, api-configuration.md, environment-reference.md
- Update all quick-start guides and installation docs
- Update ollama.md, openai-compatible.md, local-tts/stt networking sections
- Update reverse-proxy.md, development-setup.md, security.md
- Fix broken links to non-existent docs/deployment/ paths
- Add credentials endpoints to api-reference.md
- Move all API key env vars to deprecated/legacy sections

* chore: bump version to 1.7.0-rc1

Release candidate for credential-based provider management system.

* fix: initialize provider before try block in test_credential

Prevents UnboundLocalError when Credential.get() throws (e.g.,
invalid credential_id) before provider is assigned.

* fix: reorder down migration to drop index before table

Removes duplicate REMOVE FIELD statement and reorders so the index
is dropped before the table, preventing rollback failures.

* refactor: simplify encryption key to always derive via SHA-256

Remove the dual code path in _ensure_fernet_key() that detected native
Fernet keys. Since the credential system is new, always deriving via
SHA-256 removes unnecessary complexity. Also removes the generate_key()
function and Fernet.generate_key() references from docs.

* fix: correct mock patch targets in embedding tests and URL validation

Fix embedding tests patching wrong module path for model_manager
(was targeting open_notebook.utils.embedding.model_manager but it's
imported locally from open_notebook.ai.models). Also fix URL validation
to allow unresolvable hostnames since they may be valid in the
deployment environment (e.g., Azure endpoints, internal DNS).

* feat: add global setup banner for encryption and migration status

Show a persistent banner in AppShell when encryption key is missing
(red) or env var API keys can be migrated (amber), so users see
these prompts on every page instead of only on Settings > API Keys.

Includes a docs link for the encryption banner and i18n support
across all 7 locales.

* docs: several improvements to docker-compose e env examples

* Update README.md

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* docs: fix env var format in README and update model setup instructions

Align the encryption key snippet in README Step 2 with the list
format used in the compose file. Replace deprecated "Settings →
Models" instructions with credential-based Discover Models flow.

* fix: address credential system review issues

- Fix SSRF bypass via IPv4-mapped IPv6 addresses (::ffff:169.254.x.x)
- Fix TTS connection test missing config parameter
- Add Azure-specific model discovery using api-key auth header
- Add Vertex static model list for credential-based discovery
- Fix PROVIDER_DISCOVERY_FUNCTIONS incorrect azure/vertex mapping
- Extract business logic to api/credentials_service.py (service layer)
- Move credential Pydantic schemas to api/models.py
- Update tests to use new service imports and ValueError assertions

* fix: sanitize error responses and migrate key_provider to Credential

- Replace raw exception messages in all credential router 500 responses
  with generic error strings (internal details logged server-side only)
- Refactor key_provider.py to use Credential.get_by_provider() instead
  of deprecated ProviderConfig.get_instance()
- Remove unused functions (get_provider_configs, get_default_api_key,
  get_provider_config) that were dead code

---------

Co-authored-by: JFMD <git@jfmd.us>
Co-authored-by: OraCatQAQ <570768706@qq.com>
2026-02-10 08:30:22 -03:00
Luis Novo
c4ed1b18ec
chore: bump surreal-commands to 1.3.1 (#517)
* chore: bump surreal-commands to 1.3.1

Required for improved retry logging with command_id in error messages.

Ref #513

* chore: update uv.lock for surreal-commands 1.3.1
2026-01-31 19:00:15 -03:00
Luis Novo
03f9edfec2
feat: use standard HTTP_PROXY/HTTPS_PROXY environment variables (#499)
Update proxy configuration to use industry-standard environment variables
(HTTP_PROXY, HTTPS_PROXY, NO_PROXY) instead of custom variables.

The underlying libraries (esperanto, content-core, podcast-creator)
now automatically detect proxy settings from these standard variables.

- Bump content-core>=1.14.1 (fixes #494)
- Bump esperanto>=2.18
- Bump podcast-creator>=0.9
- Update documentation with new proxy configuration
2026-01-29 23:31:02 -03:00
dependabot[bot]
bddc82ac66
chore(deps): bump python-multipart from 0.0.21 to 0.0.22 (#479)
Bumps [python-multipart](https://github.com/Kludex/python-multipart) from 0.0.21 to 0.0.22.
- [Release notes](https://github.com/Kludex/python-multipart/releases)
- [Changelog](https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.21...0.0.22)

---
updated-dependencies:
- dependency-name: python-multipart
  dependency-version: 0.0.22
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-29 22:44:32 -03:00
Luis Novo
6dc9a3db50
feat: detect HTML content in clipboard for text sources (#475)
* chore: bump content-core to support html to markdown

* feat: detect HTML content in clipboard for text sources

- Add paste handler to detect text/html format in clipboard
- Use HTML content instead of plain text when available
- Display info message when HTML is detected
- Add translations for all supported languages (en-US, pt-BR, ja-JP, zh-CN, zh-TW)

* fix: reset HTML detection banner on plain text paste

Clear the hasHtmlContent flag when pasting plain text (no HTML in
clipboard) so the banner doesn't persist incorrectly after replacing
HTML content with plain text.
2026-01-25 21:36:58 -03:00
Luis Novo
28936d3944
fix: connection error with llama.cpp and OpenAI-compatible providers (#466)
* docs: update CHANGELOG for v1.6.0 release

* fix: connection error with llama.cpp and OpenAI-compatible providers

Bump Esperanto to 2.17.2 which fixes LangChain connection errors
caused by garbage collection closing shared HTTP clients.

Closes #465
2026-01-24 09:39:38 -03:00