Commit graph

505 commits

Author SHA1 Message Date
nanshaws
9c61ffef9a
docs: add conda installation instructions to README (#446)
* docs: add conda installation instructions to README

docs: add conda installation instructions to README

* docs: add conda environment setup as an alternative to uv

docs: add conda environment setup as an alternative to uv
2026-01-18 16:50:19 -03:00
Luis Novo
809a1d0741
fix(api): correct embedded flag check in source listing (#439)
Change embedded check from `!= NONE` to `!= []` because SurrealDB's
SELECT VALUE returns an empty array [] when no results found, not NONE.
The comparison `[] != NONE` evaluates to true, causing all sources to
incorrectly show as embedded.

Fixes #397
2026-01-16 09:33:01 -03:00
Luis Novo
da8c98b178
chore: bump version to 1.5.2 and update CHANGELOG (#437) 2026-01-15 22:35:29 -03:00
Luis Novo
4dc1539838
perf: improve source listing speed by 20-30x (#436)
* fix(i18n): resolve podcast dialog translation infinite loop and profile issues

- Remove incorrect translation keys for user-defined episode profiles
- Cache translation strings in ContentSelectionPanel to avoid repeated
  Proxy accesses that triggered infinite loop detection
- Stabilize useEffect dependencies with dataKey pattern to prevent
  re-initialization on every keystroke
- Replace unstable sourcesQueries prop with stable fetchingNotebookIds set
- Clean up unused getSourceModes function and TranslationKeys import

* chore: bump lock

* chore: bump version to 1.5.1 and update CHANGELOG

* fix: guard .join() call in dataKey when query data is undefined

* fix(api): use FETCH command instead of async status lookups for sources list

Replace N async calls to surreal-commands with SurrealDB FETCH clause
to resolve command status in a single query. This eliminates the
command status cascade bottleneck.

* perf(db): add indexes on source field for insights and embeddings

Add migration #10 that creates indexes on the `source` field of
`source_insight` and `source_embedding` tables. These indexes
dramatically improve the performance of source listing queries
that use subqueries to count insights and check embedding existence.

Performance improvement: ~8.5s -> ~0.3s for 30 sources (28x faster)

* perf(db): make index concurrent

* fix: add IF NOT EXISTS to index definitions for idempotency

* fix: address code review feedback

- Add IF EXISTS to rollback migration for safer rollbacks
- Add fallback for unresolved command references (status = "unknown")
2026-01-15 22:29:20 -03:00
Luis Novo
c6ec1fcddf
fix(i18n): resolve podcast dialog translation infinite loop and profile issues (#435)
* fix(i18n): resolve podcast dialog translation infinite loop and profile issues

- Remove incorrect translation keys for user-defined episode profiles
- Cache translation strings in ContentSelectionPanel to avoid repeated
  Proxy accesses that triggered infinite loop detection
- Stabilize useEffect dependencies with dataKey pattern to prevent
  re-initialization on every keystroke
- Replace unstable sourcesQueries prop with stable fetchingNotebookIds set
- Clean up unused getSourceModes function and TranslationKeys import

* chore: bump lock

* chore: bump version to 1.5.1 and update CHANGELOG

* fix: guard .join() call in dataKey when query data is undefined
2026-01-15 21:50:27 -03:00
Luis Novo
de0d3977b7
feat(i18n): add Brazilian Portuguese (pt-BR) translation (#434)
- Add complete pt-BR locale with 750+ translated strings
- Register pt-BR in locale registry and language selector
- Add date-fns ptBR locale for date formatting
- Update README and CLAUDE.md documentation
2026-01-15 18:55:55 -03:00
Luis Novo
b7ff0ccfe9
chore: post-i18n cleanup and version bump to 1.5.0 (#433)
* chore: post-i18n cleanup and version bump to 1.5.0

- Restore missing .dockerignore entries (notebook_data, surreal_data, docs, etc.)
- Fix lint command for Next.js 16 (use eslint directly instead of next lint)
- Remove aria-describedby={undefined} causing Radix UI warnings
- Bump version to 1.5.0
- Update CHANGELOG with i18n features
- Add multi-language UI mention to README
- Add i18n contribution guide to README.dev
- Document i18n system in CLAUDE.md files

Closes #344, #349, #360

* docs: fix provider order in CLAUDE.md to match layout.tsx
2026-01-15 14:20:13 -03:00
MisonL
67dd85c928
Feat/localization tests docker (#371)
* feat(i18n): complete 100% internationalization and fix Next.js 15 compatibility

* feat(i18n): complete 100% internationalization coverage

* chore(test): finalize component tests and project cleanup

* test(logic): add unit tests for useModalManager hook

* fix(test): resolve timeout in AppSidebar tests by mocking TooltipProvider

* feat(i18n): comprehensive i18n audit, fixes for hardcoded strings, and complete zh-TW support

* fix(i18n): resolve TypeScript warnings and improve translation hook stability

- Remove unused useTranslation import from ConnectionGuard
- Add ref-based checking state to prevent dependency cycles
- Fix useTranslation hook to return empty string for undefined translations
- Add comment for backward compatibility on ExtractedReference interface
- Ensure .replace() string methods work safely with nested translation keys

* feat(i18n): complete internationalization implementation with Docker deployment

- Add LanguageLoadingOverlay component for smooth language transitions
- Update all translation files (en-US, zh-CN, zh-TW) with improved terminology
- Optimize Docker configuration for better performance
- Update version check and config handling for i18n support
- Fix route handling for language-specific content
- Add comprehensive task documentation

* fix(i18n): resolve localization errors, duplicates, and type issues

* chore(i18n): finalize 100% internationalization coverage

* chore(test): supplement i18n test cases and cleanup redundant files

* fix(test): resolve lint type errors and finalize delivery documents

* feat(i18n): finalize full internationalization and zh-TW localization

* fix(frontend): add missing devDependency and fix build tsconfig

* feat(ui): enhance sidebar hover effects with better visual feedback

* fix(frontend): resolve accessibility, i18n, and lint issues

- fix: add missing id, name, autocomplete attributes to dialog inputs
- fix: add aria labels and DialogDescription for accessibility
- fix: resolve uncontrolled component warning in SettingsForm
- fix: correct duplicate 'Traditional Chinese' label in zh-TW locale
- feat: add i18n support for podcast template names
- chore: fix lint errors in Dialogs

* fix: address all 21 PR feedback items from cubic-dev-ai bot

Configuration:
- Remove ignoreDuringBuilds flags from next.config.ts

Testing:
- Fix AppSidebar.test.tsx regex pattern and add missing assertion

Logic:
- Fix ConnectionGuard.tsx re-entry prevention logic

Internationalization (I18n) - Translations:
- Add missing keys: notebooks.archived, common.note/insight, accessibility keys
- Add specific keys: sources.allSourcesDescShort, transformations.selectModel
- Add singular/plural keys: podcasts.usedByCount_one/other, common.note/notes
- Add common.created/updated with {time} placeholder

Internationalization (I18n) - Usage:
- SourcesPage: use allSourcesDescShort instead of string splitting
- TransformationPlayground: use navigation.transformation and selectModel
- CommandPalette: use dedicated keys instead of string concatenation
- GeneratePodcastDialog: fix zh-TW date locale handling
- NotebookHeader: correctly interpolate {time} placeholder
- TransformationCard: use common.description instead of undefined key
- ChatPanel/SpeakerProfilesPanel: implement proper pluralization
- SystemInfo: correctly interpolate {version} placeholder
- LanguageLoadingOverlay: use t.common.loading instead of hardcoded string
- MessageActions: use specific error key cannotSaveNoteNoNotebook

Other:
- Fix SessionManager.tsx exhaustive-deps warning

* fix: remove duplicate locale keys and add missing zh-CN translations

- en-US: remove duplicate loading key (line 59) and addNew key (sources)
- zh-CN: remove duplicate common keys (loading, note, insight, newSource, newNotebook, newPodcast)
- zh-CN: remove duplicate accessibility.searchNotebooks key
- zh-CN: remove duplicate sources.addNew key
- zh-CN: remove duplicate navigation.transformation key
- zh-CN: add missing usedByCount_one and usedByCount_other keys in podcasts
- zh-TW: remove duplicate common keys (loading, note, insight, newSource, newNotebook, newPodcast)
- zh-TW: remove duplicate accessibility.searchNotebooks key
- zh-TW: remove duplicate sources.addNew key

* docs: remove info.md

* fix: remove duplicate notebook keys and unused ts-expect-error

- zh-CN: remove duplicate notebooks keys (archived, archive, unarchive, deleteNotebook, deleteNotebookDesc)
- zh-TW: remove duplicate notebooks keys (archived, archive, unarchive, deleteNotebook, deleteNotebookDesc)
- GeneratePodcastDialog: remove unused @ts-expect-error directive

* fix(a11y): fix unassociated labels in search page

- Replace <Label> with role='group' + aria-labelledby for search type section
- Replace <Label> with role='group' + aria-labelledby for search in section
- Follows WAI-ARIA best practices for labeling form field groups

* fix(a11y): fix unassociated labels across multiple components

- search/page.tsx: use role='group' + aria-labelledby for search type and search in sections
- RebuildEmbeddings.tsx: use role='group' + aria-labelledby for include checkboxes
- TransformationPlayground.tsx: replace Label with span for non-form output label

* chore: revert to npm stack and ensure i18n compatibility

* chore: polish zh-TW translations for better idiomatic usage

* fix: resolve linter errors (ruff import sort, mypy config duplicate)

* style: apply ruff formatting

* fix: finalize upstream compliance (Dockerfile.single, i18n hooks, docker-compose)

* style: polish strings, fix timeout cleanup, and improve test mocks

* fix: use relative imports in test setup to resolve IDE path errors

* perf(docker): optimize build speed by removing apt-get upgrade and build tools

- Remove apt-get upgrade from both builder and runtime stages (saves 10-15 min each)
- Remove gcc/g++/make/git from builder (uv downloads pre-built wheels)
- Add --no-install-recommends to minimize package footprint
- Keep npm mirror (npmmirror.com) for faster frontend deps
- Add npm registry config for reliable China network access

Also includes:
- fix(a11y): add missing labels and aria attributes to form fields
- fix(i18n): add 2s safety timeout to LanguageLoadingOverlay
- fix(i18n): add robustness checks to use-translation proxy

Build time reduced from 2+ hours to ~34 minutes (~70% improvement)

* fix(a11y): resolve 16 form field accessibility warnings in notebook and podcast pages

* fix(a11y): resolve 4 button and 1 select field accessibility warnings in models page

* fix(a11y): resolve redundant attributes and residual warnings in transformations and podcast forms

* fix(i18n): deep fix for language switch hang using proxy protection and safer access

* fix(a11y): add name attributes to ModelSelector, TransformationPlayground, and SourceDetailContent

* fix: add missing Label import to SourceDetailContent

* fix(i18n): use native react-i18next in LanguageLoadingOverlay to prevent hang during language switch

* fix(i18n): rewrite use-translation Proxy with strict depth limit and expanded blocked props to prevent language switch hang

* fix: add type assertion to fix TypeScript comparison error

* fix(i18n): disable useSuspense to prevent thread hang during language resource loading

* fix(i18n): add infinite loop detection circuit breaker to useTranslation hook

* fix(i18n): update traditional chinese label to native script in en-US

* feat: add new localization strings for notebook and note management.

* fix: resolve config priority, docker build deps, and ui glitches

* refactor: improve ui details and test coverage based on feedback

* refactor: improve ui details (version check/lang toggle) and test coverage

* fix: polish language matching and test cleanup

* fix(test): update mocks to resolve timeouts and proxy errors

* fix(frontend): restore tsconfig.json structure and enable IDE support for tests

* fix: address PR review findings and resolve CI OIDC failure

* fix: merge exception headers in custom handler

* fix: comprehensive PR review remediations and async performance fixes

* refactor: address all PR #371 review feedback

- Docker: consolidate SURREAL_URL to docker.env, add single-container override
- Security: restore apt-get upgrade in Dockerfile and Dockerfile.single
- Create centralized getDateLocale helper (lib/utils/date-locale.ts)
- Refactor 7 files to use getDateLocale helper
- Revert config/route.ts to origin/main version
- Move test files to co-located pattern (3 files)
- Remove local useTranslation mock from ConfirmDialog.test.tsx
- Simplify use-version-check to single useEffect pattern
- Fix test import paths after moving to co-located pattern

* fix: add jest-dom types for test files

* fix: address remaining review issues

- Add apt-get upgrade -y to Dockerfile.single backend-builder stage
- Refactor ChatColumn.test.tsx: use 'as unknown as ReturnType<typeof hook>' instead of 'as any'
- Use toBeInTheDocument() assertions instead of toBeDefined()
2026-01-15 13:51:05 -03:00
Luis Novo
940c56ddaf
Merge pull request #428 from lfnovo/fix/nextjs-standalone-server
fix: use standalone server for Next.js in Docker
2026-01-14 23:04:40 -03:00
LUIS NOVO
5caf62946e fix: use Node.js wrapper for cross-platform PORT fallback
Replace cross-env with a simple Node.js wrapper script that:
- Respects externally supplied PORT environment variable
- Falls back to 8502 if PORT is not set
- Works cross-platform without extra dependencies
- No runtime dependencies beyond Node.js itself

Changes:
- Add start-server.js wrapper script
- Update package.json to use wrapper
- Remove cross-env dependency
- Copy start-server.js in Dockerfile

This fixes both issues:
1. Preserves PORT fallback behavior (PORT can be overridden)
2. No extra runtime dependencies needed
2026-01-14 22:51:39 -03:00
LUIS NOVO
948ab04896 fix: use cross-env for cross-platform PORT default
Replace POSIX-only PORT=${PORT:-8502} syntax with cross-env
to ensure npm run start works on Windows and other platforms.

- Install cross-env as dev dependency
- Update start script to use cross-env PORT=8502
2026-01-14 22:37:02 -03:00
LUIS NOVO
cd55592b39 fix: preserve port 8502 default in standalone server script
Add PORT environment variable with 8502 fallback to ensure
npm run start defaults to expected port even when run outside
of Docker/supervisord context.
2026-01-14 22:13:06 -03:00
LUIS NOVO
3e03c48f04 chore: changelog 2026-01-14 22:11:10 -03:00
LUIS NOVO
50157c3c79 fix: use standalone server for Next.js in Docker
Replace 'next start' with 'node server.js' to properly utilize
Next.js standalone output mode in Docker deployments.

Changes:
- Update supervisord.conf to run standalone server
- Update supervisord.single.conf to run standalone server
- Update package.json start script for consistency

This eliminates the startup warning and follows Next.js best
practices for optimized Docker deployments.
2026-01-14 22:03:15 -03:00
Luis Novo
f92c42a5a4
Merge pull request #423 from lfnovo/feature/nextjs-16-upgrade
feat: upgrade Next.js 15 → 16 to fix large file uploads
2026-01-14 13:08:51 -03:00
LUIS NOVO
e7c3ef0520 chore: bump to 1.4 2026-01-14 13:08:06 -03:00
LUIS NOVO
4fe36be43c docs: update CLAUDE.md files for Next.js 16 upgrade
- Update root CLAUDE.md: Next.js 15 → 16
- Update frontend/src/CLAUDE.md: middleware.ts → proxy.ts
2026-01-14 13:02:33 -03:00
LUIS NOVO
136698864e feat: upgrade Next.js 15 → 16 to fix large file uploads
- Upgrade Next.js from 15.4.10 to 16.1.1
- Upgrade React from 19.1.0 to 19.2.3
- Rename middleware.ts → proxy.ts (Next.js 16 requirement)
- Update function name: middleware → proxy
- Enable proxyClientMaxBodySize configuration (now supported in Next.js 16)
- Update documentation to reference Next.js 16 requirement
- Fix upload size limit issue for files >10MB

This upgrade fixes GitHub issue #361 where users cannot upload files
larger than 10MB. The proxyClientMaxBodySize configuration option was
introduced in Next.js 16.1+ and allows configuring the proxy body size
limit to 100MB.

Fixes #361
Related to PR #405
2026-01-14 10:33:19 -03:00
Luis Novo
e364b48134
Merge pull request #421 from lfnovo/fix/cleanup-files-on-source-delete
fix: delete uploaded files when sources are removed
2026-01-14 08:41:44 -03:00
LUIS NOVO
fad4446f36 fix: delete uploaded files when sources are removed
Previously, uploaded files remained on disk after source deletion,
causing disk space accumulation and potential privacy concerns.
The Source.delete() method now removes associated files before
database cleanup, with graceful error handling to prevent
database inconsistency if file deletion fails.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 08:11:17 -03:00
Luis Novo
cb66d6e2b3
Merge pull request #419 from lfnovo/fix/broken-docs-links
fix: update broken documentation links to ai-providers.md
2026-01-13 20:41:02 -03:00
LUIS NOVO
304cc30f1b chore: remove outdated setup_guide directory
The setup_guide directory contained only redirect files pointing to the
new docs location and outdated example files that are already available
in the root directory.

- Removed setup_guide/README.md (redirect only)
- Removed setup_guide/DOCKER_SETUP_ADVANCED.md (redirect only)
- Removed setup_guide/docker-compose.yml (outdated)
- Removed setup_guide/docker.env (outdated)
- Updated .gitignore to remove setup_guide reference
2026-01-13 20:37:55 -03:00
LUIS NOVO
7717e0f9f6 fix: update broken documentation links to ai-providers.md
Updated all references from non-existent docs/features/ai-models.md
to the correct path docs/5-CONFIGURATION/ai-providers.md

Fixes #412
2026-01-13 20:34:04 -03:00
Luis Novo
dd4e47a127
Merge pull request #418 from lfnovo/fix/remove-zip-support-indication
fix: remove zip support indication
2026-01-13 20:01:58 -03:00
LUIS NOVO
3d696b0ab0 fix: remove zip support indication fixes #415 2026-01-13 19:56:09 -03:00
Luis Novo
9ab8100b09
Merge pull request #408 from fauziralpiandi/feat/add-cta-button-to-empty-state-list
feat: add CTA button to empty state list
2026-01-13 19:49:00 -03:00
Luis Novo
aef8a0850e
Merge pull request #414 from Nayrode/main
feat: improve dockerfile to support offline deployments
2026-01-13 19:38:45 -03:00
Luis Novo
f47b139328
Merge pull request #417 from lfnovo/fix/claude-workflow-conditional-runs
fix: prevent duplicate Claude Code workflow runs
2026-01-13 19:38:29 -03:00
LUIS NOVO
03eb9b3555 fix: prevent duplicate workflow runs for PRs
Add conditional logic to ensure only one workflow runs per PR:
- pull_request_target: Only for fork PRs (external contributors)
- pull_request: Only for same-repo PRs (internal branches)

This prevents both triggers from firing simultaneously and causing
conflicts or duplicate reviews.
2026-01-13 19:05:16 -03:00
Luis Novo
dfc7235064
Merge pull request #416 from lfnovo/fix/claude-workflow-fork-prs
fix: allow claude code review workflow to run on PRs from forks
2026-01-13 18:48:56 -03:00
LUIS NOVO
21b6809277 security: add persist-credentials false to checkout step
Prevent GITHUB_TOKEN from being stored in .git/config when
checking out PR code in pull_request_target workflows. This
is a security best practice to prevent untrusted code from
potentially accessing stored credentials.

While the Claude Code action doesn't execute arbitrary PR code,
this follows defense-in-depth security principles to minimize
attack surface when handling untrusted code from forks.
2026-01-13 18:47:36 -03:00
LUIS NOVO
faa652dce7 fix: add pull_request trigger alongside pull_request_target
Add both pull_request and pull_request_target triggers to support:
- pull_request: Same-repo PRs (works immediately with changed workflow)
- pull_request_target: Fork PRs (provides OIDC tokens)

This resolves the chicken-and-egg problem where pull_request_target
uses the base branch's workflow file, preventing the workflow from
running when the workflow file itself is changed in the PR.
2026-01-13 18:44:23 -03:00
LUIS NOVO
9ce3cf55fc fix: allow claude code review workflow to run on PRs from forks
Switch from pull_request to pull_request_target event to enable
OIDC token access for external contributor PRs. This allows the
Claude Code action to authenticate properly when reviewing PRs
from forks.

Also added explicit PR head SHA ref to checkout to ensure we
review the correct code.

Fixes workflow failure: Unable to get ACTIONS_ID_TOKEN_REQUEST_URL
2026-01-13 18:40:18 -03:00
Dorian TETU
dcf7f4f2cf feat: improve dockerfile to support offline deployments 2026-01-13 08:55:01 +01:00
Fauzira Alpiandi
a1fb7a750f feat: add CTA button to empty state list 2026-01-10 04:08:42 +00:00
Luis Novo
959eef5e91
Merge pull request #407 from lfnovo/ci/remove-single-build-from-dev
ci: remove single-container build from dev workflow
2026-01-09 20:54:19 -03:00
LUIS NOVO
fc872ff6e3 ci: remove single-container build from dev workflow
Reduces CI time by only building the multi-container Dockerfile
during pull requests. The single-container build is still available
in the production build-and-release workflow.
2026-01-09 20:53:32 -03:00
Luis Novo
478ca299d1
Merge pull request #406 from lfnovo/fix/next-config-typescript-types
fix: add type assertion for experimental proxyClientMaxBodySize config
2026-01-09 20:50:56 -03:00
LUIS NOVO
cb525148e3 fix: add type assertion for experimental proxyClientMaxBodySize config
Next.js 15 accepts proxyClientMaxBodySize at runtime but TypeScript types
for ExperimentalConfig don't include it yet, causing build failures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 20:44:43 -03:00
Luis Novo
8d6d615f2f
Merge pull request #405 from lfnovo/fix/nextjs-proxy-body-size-limit
fix: increase Next.js proxy body size limit for file uploads
2026-01-09 20:24:46 -03:00
LUIS NOVO
6593ab561a fix: increase Next.js proxy body size limit for file uploads
Increase the proxyClientMaxBodySize from 10MB (default) to 100MB to allow
larger files to be uploaded through the /api/* rewrite proxy to FastAPI.

Fixes #361
2026-01-09 20:18:06 -03:00
Luis Novo
24730cf757
Merge pull request #403 from lfnovo/add-claude-github-actions-1767999881072
Add Claude Code GitHub Workflow
2026-01-09 20:09:32 -03:00
Luis Novo
bdfdc9eecd
Merge pull request #404 from lfnovo/fix/cors-headers-on-error-responses
fix: add CORS headers to error responses and document file upload limits
2026-01-09 20:09:04 -03:00
LUIS NOVO
52177f7546 fix: add CORS headers to error responses and document file upload limits
- Added custom exception handler to ensure CORS headers are included in
  all HTTP error responses from the API
- Added documentation for 413 (Payload Too Large) errors when behind
  reverse proxies (nginx, traefik, kubernetes ingress)
- Added client_max_body_size to nginx configuration examples
- Documented how to configure CORS headers for proxy-level error responses

Fixes #401
2026-01-09 20:08:13 -03:00
Luis Novo
b045694992
Merge pull request #400 from lfnovo/fix/surrealdb-persistent-storage
fix: use persistent rocksdb storage instead of memory in docker-compose docs
2026-01-09 20:06:16 -03:00
Luis Novo
62730a9486
Merge pull request #402 from lfnovo/fix/model-duplicate-check-include-type
fix: include type in model duplicate check
2026-01-09 20:05:12 -03:00
Luis Novo
c22ef5a6e1 "Update Claude Code Review workflow" 2026-01-09 20:04:43 -03:00
Luis Novo
f8fcffa4b6 "Update Claude PR Assistant workflow" 2026-01-09 20:04:42 -03:00
LUIS NOVO
3c053c6eed fix: include type in model duplicate check
The model uniqueness constraint now considers (provider, name, type)
instead of just (provider, name). This allows users to add the same
model name for different purposes (e.g., language vs embedding).

Fixes #391
2026-01-09 20:00:20 -03:00
LUIS NOVO
fd03122aa3 fix: use persistent rocksdb storage instead of memory in docker-compose docs
Changed SurrealDB configuration from in-memory storage to RocksDB with
bind mounts for data persistence. Users' data will now survive container
restarts.

Fixes #398
2026-01-09 19:47:47 -03:00