Commit graph

312 commits

Author SHA1 Message Date
Pier-Jean Malandrino
2477a2af4b
Merge pull request #181 from scub-france/feature/feature-flag-ingestion
feat(#180): feature-flag ingestion pipeline and brainless one-liner Quick Start
2026-04-14 16:30:36 +02:00
Pier-Jean Malandrino
845425af62 chore: add Coming soon to batch chunking notice, set BATCH_PAGE_SIZE default to 10 2026-04-13 13:23:27 +02:00
Pier-Jean Malandrino
5f8b3559e3 chore: gitignore profiles/ (internal audit tooling) 2026-04-13 11:36:20 +02:00
Pier-Jean Malandrino
9602ae6d94 refactor: move BATCH_PAGE_SIZE default from Dockerfile to settings.py
Default value of 5 is now in the application code (settings.py) instead
of only in the Docker image ENV. Consistent across all deployment modes
(dev local, Docker, tests). Aligned docker-compose files and docs.
2026-04-13 11:32:33 +02:00
Pier-Jean Malandrino
ba54427445 feat(#180): feature-flag ingestion pipeline and add brainless one-liner Quick Start
- Conditionally mount ingestion router only when OpenSearch + embedding are configured
- Add `ingestionAvailable` field to /api/health response
- Add `ingestion` feature flag to frontend (hides Search nav, Ingest button,
  OpenSearch badge, indexed badges/filters when disabled)
- Skip ingestion polling when flag is off
- Make OpenSearch + embedding optional in docker-compose via profiles
- Add docker-compose.ingestion.yml override for full-stack ingestion
- Set BATCH_PAGE_SIZE=5 default in Docker local image
- Lead Quick Start with one-liner docker run command
- Document ingestion as opt-in with dedicated section
- Add BATCH_PAGE_SIZE, MAX_FILE_SIZE_MB, MAX_PAGE_COUNT, RATE_LIMIT_RPM to config tables
- Update test counts (380 backend, 159 frontend)
- Date CHANGELOG 0.4.0, bump frontend version to 0.4.0
- Sync CONTRIBUTING.md with E2E Karate test sections

Closes #180
2026-04-13 11:18:56 +02:00
Pier-Jean Malandrino
c7f9468991
Merge pull request #179 from scub-france/fix/e2e-toggle-selector-remaining
fix(e2e): use word-match selector for remaining toggle-btn references
2026-04-12 20:36:13 +02:00
Pier-Jean Malandrino
39091358ae fix(e2e): use word-match selector for remaining toggle-btn references
analysis.feature and full-ui-path.feature still used exact-match
[data-e2e=toggle-btn] which broke after #178 changed the attribute to
compound values. Switch to [data-e2e~=configure-btn].
2026-04-12 20:35:28 +02:00
Pier-Jean Malandrino
6f008ec262
Merge pull request #178 from scub-france/fix/e2e-rechunk-feature-flag
fix(e2e): replace fragile index-based toggle selection with dedicated selectors
2026-04-12 10:16:46 +02:00
Pier-Jean Malandrino
1292b7c441 fix(e2e): replace fragile index-based toggle selection with dedicated selectors
Add dedicated data-e2e selectors (configure-btn, verify-btn, prepare-btn)
to StudioPage toggle buttons and update E2E tests to use waitFor + click
on these selectors instead of locateAll index tricks. Fixes timeout in
rechunk.feature caused by race with async feature flag loading.

Closes #176
2026-04-12 10:03:06 +02:00
Pier-Jean Malandrino
eb8b3d24a5
Merge pull request #162 from scub-france/feature/ingestion-pipeline
feat: Search tab + Ingest mode in Studio pipeline
2026-04-11 11:01:30 +02:00
Pier-Jean Malandrino
2823a3eb5b fix(#159): display raw relevance score instead of percentage
OpenSearch BM25 scores are not normalized to 0-1, so multiplying
by 100 produced misleading values like 300%.
2026-04-11 10:35:20 +02:00
Pier-Jean Malandrino
9961d1e080 feat(#160): promote Ingest to 4th Studio mode after Prepare
Add Ingest as a dedicated mode tab in the Studio pipeline
(Configure → Verify → Prepare → Ingest). Create IngestPanel
component in features/ingestion/ui/ with summary, stepper,
and action button. Remove orphan Ingest button and inline
stepper from StudioPage. Remove auto-ingest on analysis complete.

Closes #160
2026-04-11 10:17:12 +02:00
Pier-Jean Malandrino
bae00e4025 feat(#159): extract search into dedicated sidebar tab
Move chunk search from DocumentsPage into a new Search bounded context
(features/search/) with its own store, API layer, page and route.
Clean search state out of the ingestion module.

Closes #159
2026-04-11 10:14:02 +02:00
Pier-Jean Malandrino
07f9568e14
Merge pull request #158 from scub-france/feature/ingestion-pipeline
feat: ingestion pipeline #77-#81 — progress, search, delete, status, auto-ingest
2026-04-11 09:37:23 +02:00
Pier-Jean Malandrino
378a6caa78 Merge remote-tracking branch 'origin/release/0.4.0' into feature/ingestion-pipeline 2026-04-10 22:52:13 +02:00
Pier-Jean Malandrino
daaea86173 feat(#80): OpenSearch connection status indicator in sidebar
Green/red dot in the sidebar footer showing OpenSearch connectivity.
Tooltip: 'OpenSearch connected' / 'OpenSearch unreachable'.
Polls every 30s via ingestionStore.startPolling(). GET /api/ingestion/status
now returns opensearchConnected boolean from a live ping.
2026-04-10 22:49:40 +02:00
Pier-Jean Malandrino
830184b12e feat(#78): full-text search in indexed chunks
Backend: GET /api/ingestion/search?q=…&doc_id=… endpoint with
SearchResponse schema. Frontend: search bar in Documents page, results
with filename, page, chunk index, relevance score. 3 new API tests.
2026-04-10 22:49:27 +02:00
Pier-Jean Malandrino
efabe84d66 feat(#77): multi-step ingestion progress stepper
Visual stepper in Studio topbar: Embedding → Indexing → Done.
Each step shows pending/active/done with animated dot. Store tracks
currentStep through the pipeline. Auto-resets after 2s.
2026-04-10 22:49:20 +02:00
Pier-Jean Malandrino
b32781a055
Merge pull request #156 from scub-france/feature/ingestion-pipeline
feat: ingestion pipeline, My Documents, and ingest button (#72-#76)
2026-04-10 22:39:52 +02:00
Pier-Jean Malandrino
73e9c66ea6 fix(ci): install curl in embedding-service image for healthcheck
python:3.12-slim does not include curl — every healthcheck attempt failed
silently, causing the container to be declared unhealthy after all retries.
2026-04-10 22:22:50 +02:00
Pier-Jean Malandrino
8e7589df8c fix(ci): embedding healthcheck too aggressive for CI cold start
Add start_period: 120s and increase retries to 20 with 15s interval.
The model download + load needs time on first build in CI runners.
2026-04-10 21:58:20 +02:00
Pier-Jean Malandrino
bd232bdef3 feat(frontend): ingestion button in Studio for one-click indexing
Closes #76
2026-04-10 21:21:32 +02:00
Pier-Jean Malandrino
5ba953fc58 feat(frontend): My Documents screen with ingestion status, search, filter, sort
Closes #75
2026-04-10 21:19:09 +02:00
Pier-Jean Malandrino
ae37e8e96b test: e2e and unit tests for ingestion pipeline
Closes #74
2026-04-10 21:14:14 +02:00
Pier-Jean Malandrino
2c655f5f83 feat: add OpenSearch and embedding to production docker-compose
Closes #73
2026-04-10 21:12:50 +02:00
Pier-Jean Malandrino
995e891d9b feat: orchestrated ingestion pipeline Docling → embedding → OpenSearch
Closes #72
2026-04-10 21:12:11 +02:00
Pier-Jean Malandrino
c49708990c
Merge pull request #155 from scub-france/feature/embedding-service
feat: embedding microservice (sentence-transformers)
2026-04-10 21:03:14 +02:00
Pier-Jean Malandrino
c3154cd12f
Merge pull request #154 from scub-france/feature/opensearch-adapter
feat(infra): OpenSearch adapter for VectorStore
2026-04-10 21:03:05 +02:00
Pier-Jean Malandrino
ffa0934dd6
Merge pull request #153 from scub-france/feature/vector-store-port
feat(domain): add VectorStore port
2026-04-10 21:02:56 +02:00
Pier-Jean Malandrino
31a20377f8
Merge pull request #152 from scub-france/feature/metadata-schema
feat(architecture): define vector index metadata schema
2026-04-10 21:02:46 +02:00
Pier-Jean Malandrino
a21daa24da feat: add embedding microservice and EmbeddingService port
Closes #71
2026-04-10 20:53:24 +02:00
Pier-Jean Malandrino
9cffb2a9a7 feat(infra): add OpenSearch adapter implementing VectorStore port
Closes #70
2026-04-10 20:48:50 +02:00
Pier-Jean Malandrino
a111a5009f feat(domain): add VectorStore port and SearchResult value object
Closes #69
2026-04-10 20:40:17 +02:00
Pier-Jean Malandrino
b968ea230e feat(architecture): define vector index metadata schema
Closes #68
2026-04-10 20:35:03 +02:00
Pier-Jean Malandrino
da6ebec6dd
Merge pull request #151 from scub-france/feature/delete-chunk
feat(chunking): soft-delete chunk with confirmation dialog
2026-04-10 20:30:45 +02:00
Pier-Jean Malandrino
80b0c44e8c feat(chunking): soft-delete chunk with confirmation dialog
Closes #90
2026-04-10 20:28:24 +02:00
Pier-Jean Malandrino
7864a2c9e0
Merge pull request #150 from scub-france/feature/edit-chunk-text
feat(chunking): inline chunk text editing
2026-04-10 20:26:54 +02:00
Pier-Jean Malandrino
d1054813ad
Merge branch 'release/0.4.0' into feature/edit-chunk-text 2026-04-10 20:26:46 +02:00
Pier-Jean Malandrino
c74a3277b8 feat(chunking): inline chunk text editing
Closes #89
2026-04-10 19:37:29 +02:00
Pier-Jean Malandrino
d742596c5d
Merge pull request #149 from scub-france/feature/dev-docker-compose
feat(infra): Docker Compose dev stack with OpenSearch
2026-04-10 19:28:36 +02:00
Pier-Jean Malandrino
8ab908d229 feat(infra): add Docker Compose dev stack with OpenSearch
Closes #148
2026-04-10 19:26:37 +02:00
Pier-Jean Malandrino
50e958de7a
Merge pull request #147 from scub-france/pjmalandrino-patch-1
Update README.md
2026-04-10 18:29:10 +02:00
Pier-Jean Malandrino
95baed784f
Update README.md 2026-04-10 18:28:44 +02:00
Pier-Jean Malandrino
e311454e86
Merge pull request #146 from scub-france/fix/mkdocs-strict-warnings
Some checks failed
Release Docker Images / Build & push — local (push) Has been cancelled
Release Docker Images / Build & push — remote (push) Has been cancelled
fix(docs): resolve mkdocs strict mode build failure
2026-04-10 15:19:55 +02:00
Pier-Jean Malandrino
f6030bb2f1 fix(docs): resolve mkdocs strict mode build failure (#145)
- Add all process docs to mkdocs.yml nav (15 missing pages)
- Replace relative links to files outside docs/ with absolute GitHub URLs
- Add docs/audit/ directory (templates + reports)
- Add validation config to allow unlisted audit reports as info-level
2026-04-10 15:11:29 +02:00
Pier-Jean Malandrino
dda2bbda12
Merge pull request #59 from scub-france/release/0.3.1
Release/0.3.1
2026-04-10 15:04:06 +02:00
Pier-Jean Malandrino
d8937ad916 fix: remove dead store and no-effect await flagged by CodeQL
- local_converter.py: remove redundant `_default_converter = None` in
  except block of `_ensure_default_converter` (variable was already None,
  re-raised immediately — dead store)
- test_analysis_service.py: replace bare `await task` with
  `await asyncio.gather(task)` to satisfy static analysis
2026-04-10 14:37:51 +02:00
Pier-Jean Malandrino
6d0c4dd192
Merge pull request #144 from scub-france/fix/decoupling-audit
fix(decoupling): eliminate cross-feature imports & typed health endpoint
2026-04-10 14:04:33 +02:00
Pier-Jean Malandrino
6e2b031bbe
Merge pull request #139 from scub-france/fix/clean-code-audit
fix(clean-code): English mode strings, SRP & getter rename
2026-04-10 13:56:51 +02:00
Pier-Jean Malandrino
3d199cb783 fix(clean-code): English mode strings, SRP extraction, rename getter
- Replace French mode strings (configurer/verifier/preparer) with English
  equivalents (configure/verify/prepare) in StudioPage.vue and tests
- Extract _build_conversion_options, _run_conversion, _finalize_analysis
  from _run_analysis_inner to respect Single Responsibility Principle
- Rename _get_default_converter to _ensure_default_converter to reflect
  its lazy-init side effect

Closes #136, closes #137, closes #138
2026-04-10 13:45:13 +02:00