contextweave 0.2.2__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {contextweave-0.2.2 → contextweave-0.3.0}/PKG-INFO +9 -2
- {contextweave-0.2.2 → contextweave-0.3.0}/README.md +7 -1
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/app_setup.py +6 -3
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/common.py +1 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/runtime.py +3 -2
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/cli/config_file.py +2 -2
- contextweave-0.3.0/context_aware_translation/cli/galgame_skill.py +106 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/cli/main.py +131 -0
- contextweave-0.3.0/context_aware_translation/core/galgame_document_handler.py +101 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/base.py +2 -1
- contextweave-0.3.0/context_aware_translation/documents/galgame.py +2143 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/app_setup_view.py +4 -4
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/bootstrap.py +12 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/export_ops.py +2 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/pyproject.toml +3 -1
- {contextweave-0.2.2 → contextweave-0.3.0}/scripts/generate_readme_screenshots.py +1 -1
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_composition.py +2 -2
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_contracts.py +8 -1
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/cli/test_cli.py +73 -0
- contextweave-0.3.0/tests/core/test_galgame_document_handler.py +98 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_base.py +18 -2
- contextweave-0.3.0/tests/documents/test_galgame.py +696 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_setup_view.py +1 -1
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_import_export.py +59 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/uv.lock +24 -1
- contextweave-0.2.2/data/cat-library/registry.db +0 -0
- contextweave-0.2.2/data/cat-library/task_store.db +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/.github/workflows/release.yml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/.gitignore +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/LICENSE +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/Makefile +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/README_ZH.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/cat-ui.spec +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/files/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/files/glossary_io.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/application_event_bridge.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/task_engine.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/base_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/batch_task_overlap_guard.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/batch_translation_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/chunk_retranslation_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/export_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/glossary_export_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/glossary_extraction_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/glossary_review_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/glossary_translation_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/image_reembedding_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/import_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/ocr_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/operation_tracker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/translate_and_export_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/translation_manga_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/adapters/qt/workers/translation_text_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/app_identity.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/composition.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/document.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/project_setup.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/projects.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/queue.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/terms.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/contracts/work.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/errors.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/events.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/_export_support.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/app_setup.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/document.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/project_setup.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/projects.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/queue.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/terms.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/application/services/work.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/cli/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/cli/output.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/cli/runtime.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/cli/wait.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/config.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/cancellation.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/context_extractor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/context_manager.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/manga_document_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/models.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/progress.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/term_memory.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/term_memory_builder.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/core/translation_strategies.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/content/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/content/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/content/ocr_content.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/content/ocr_items.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_container.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/container_model.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/container_patch.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/container_reader.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/container_shared.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/container_writer.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/inline_markers.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/nav_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/slot_lines.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_support/xml_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/epub_xhtml_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/manga.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/manga_alignment.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/manga_reembed_planner.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/pdf.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/scanned_book.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/subtitle.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/documents/text.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/batch_jobs/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/batch_jobs/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/batch_jobs/base.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/batch_jobs/gemini_gateway.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/client.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/epub_ocr.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/extractor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/glossary_translator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_backend_base.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_backends/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_backends/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_backends/gemini_backend.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_backends/openai_backend.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_backends/qwen_backend.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/image_generator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/language_detector.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/manga_ocr.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/manga_translator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/ocr.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/reviewer.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/session_trace.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/summarizor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/token_tracker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/translation_strategies.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/llm/translator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/hk2s.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/jp2s.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/s2hk.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/s2t.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/s2tw.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/s2twp.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/t2hk.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/t2s.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/t2tw.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/tw2s.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/config/tw2sp.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/HKVariants.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/HKVariantsPhrases.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/HKVariantsRev.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/HKVariantsRevPhrases.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/JPVariants.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/JPVariantsRev.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/STCharacters.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/STPhrases.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TSCharacters.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TSPhrases.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TWPhrases.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TWPhrasesRev.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TWVariants.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TWVariantsRev.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/opencc/dictionary/TWVariantsRevPhrases.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/tokenizers/deepseek-v3/special_tokens_map.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/tokenizers/deepseek-v3/tokenizer.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/resources/tokenizers/deepseek-v3/tokenizer_config.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/library/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/library/book_manager.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/models/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/models/book.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/models/config_profile.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/models/endpoint_profile.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/repositories/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/repositories/document_repository.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/repositories/llm_batch_store.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/repositories/task_store.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/repositories/term_repository.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/repositories/translation_batch_task_store.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/schema/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/schema/book_db.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/schema/registry_db.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/storage/sqlite_locking.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/chrome_sizing.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/constants.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/app_settings_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/document_images_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/document_ocr_tab.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/document_translation_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/document_workspace_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/library_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/project_settings_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/queue_drawer_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/terms_table_widget.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/terms_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/work_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/features/workflow_profile_editor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/i18n.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/json_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/main.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/main_window.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/BootstrapProbe.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/app/AppShellChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/dialogs/app_settings/AppSettingsDialogChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/dialogs/app_settings/AppSettingsPane.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/dialogs/project_settings/ProjectSettingsDialogChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/dialogs/project_settings/ProjectSettingsPane.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/document/DocumentShellChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/document/export/DocumentExportPaneChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/document/images/DocumentImagesPaneChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/document/ocr/DocumentOCRPaneChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/document/translation/DocumentTranslationPaneChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/project/ProjectShellChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/project/terms/TermsPaneChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/project/work_home/WorkHomeChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml/queue/QueueShellChrome.qml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/qml_resources.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/resources/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/resources/styles.qss +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/app_settings_dialog_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/app_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/document_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/hybrid.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/project_settings_dialog_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/project_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/shell_hosts/queue_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/sleep_inhibitor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/startup.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/tips.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/translations/zh_CN.qm +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/translations/zh_CN.ts +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/app_settings_dialog.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/app_settings_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/app_shell.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/base.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/document_export_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/document_images_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/document_ocr_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/document_shell.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/document_translation_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/project_settings_dialog.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/project_settings_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/project_shell.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/queue_shell.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/router.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/terms_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/viewmodels/work_home.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/widgets/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/widgets/hybrid_controls.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/widgets/image_viewer.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/widgets/progress_widget.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/widgets/table_support.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/ui/window_controllers.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/chunking.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/cjk_normalize.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/compression_marker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/file_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/hard_wrap.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/hashing.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/image_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/llm_json_cleaner.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/markdown_escape.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/pandoc_export.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/semantic_chunker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/string_similarity.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/utils/symbol_check.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/image_fetcher.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/bootstrap_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/glossary_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/import_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/import_support.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/ocr_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/ops/translation_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/runtime.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/session.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/task_runtime.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/claims.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/engine_core.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/exceptions.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/execution/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/execution/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/execution/batch_translation_executor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/execution/batch_translation_ops.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/glossary_preflight.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/base.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/batch_translation.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/chunk_retranslation.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/glossary_export.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/glossary_extraction.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/glossary_review.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/glossary_translation.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/image_reembedding.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/ocr.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/translate_and_export.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/translation_manga.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/handlers/translation_text.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/models.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/translate_and_export_support.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/context_aware_translation/workflow/tasks/worker_deps.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/demo/The Count of Monte Cristo.epub +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/demo//345/237/272/347/235/243/345/261/261/344/274/257/347/210/265.epub" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/.nojekyll +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/examples/contextweave-cli.yaml +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/index.html +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/project-terms-manual-entry-ux.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/API/351/205/215/347/275/256.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/latest_new_project_dialog.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/latest_project_work_overview.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/latest_projects_overview.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/latest_setup_wizard_provider_selection.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/latest_setup_wizard_workflow_profile_review.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN/latest_terms_overview.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//345/257/274/345/205/245.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//345/257/274/345/207/272.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//346/226/260/351/241/271/347/233/256.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//346/234/257/350/257/255.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//347/277/273/350/257/221.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//350/256/276/347/275/256.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//350/256/276/347/275/256/345/220/221/345/257/274.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/CN//350/256/276/347/275/256/347/273/223/346/235/237.png" +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/APISetup.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/Export.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/Import.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/InitialSetup.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/Language.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/NewProject.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/Terms.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/Translate.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/TranslateAndExport.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/Wizard.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/latest_new_project_dialog.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/latest_project_work_overview.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/latest_projects_overview.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/latest_setup_wizard_provider_selection.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/latest_setup_wizard_workflow_profile_review.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/screenshots/EN/latest_terms_overview.png +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/docs/styles.css +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/installer/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/installer/macos/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/installer/macos/entitlements.plist +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/installer/windows/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/scripts/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/scripts/build_ui.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/scripts/run_ui_tests.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/adapters/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/adapters/files/test_glossary_io.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/fakes.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_document_service.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_document_translation_service.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_events.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_export_services.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_queue_service.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_terms_service.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/application/test_ui_harness_pattern.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/architecture/test_migrated_ui_boundaries.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/architecture/test_packaging_hidden_imports.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/architecture/test_qml_ui_boundaries.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/config/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/config/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/config/test_endpoint_profiles.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/conftest.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/expected_batching_output.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test-terms.json +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_context_extractor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_context_manager.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_manga_document_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_models.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_noise_filtering_pipeline.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_term_memory_builder.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/core/test_translation_context_manager_strategy_api.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/data/test_chunk.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/data/test_chunk2.txt +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/content/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/content/test_ocr_content.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/content/test_ocr_items.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_epub.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_epub_container.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_epub_inline_markers.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_epub_xhtml_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_manga.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_manga_alignment.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_ocr_image_embedded_text.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_pdf.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_scanned_book.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_subtitle.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/documents/test_text.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/integration/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/integration/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/integration/test_business_logic.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_extractor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_extractor_unit.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_gemini_backend.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_gemini_batch_gateway.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_glossary_translator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_image_generator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_image_token_usage.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_language_detector.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_llm_client.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_manga_translator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_ocr.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_reviewer.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_session_trace.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_summarizor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_token_tracker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_token_usage_extraction.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/llm/test_translator.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_book_db.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_book_manager.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_document_repository.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_document_tables.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_llm_batch_store.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_task_store.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_term_repository.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_token_tracking.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/storage/test_translation_batch_task_store.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/test_logging_handlers.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/conftest.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/tasks/test_task_engine.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_settings_dialog_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_settings_dialog_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_settings_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_settings_pane_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_app_shell_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_export_pane_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_images_pane_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_images_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_ocr_tab.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_shell_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_translation_pane_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_translation_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_document_workspace_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_i18n_progress_messages.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_image_viewer.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_library_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_main.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_main_window_shell.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_progress_widget.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_project_settings_dialog_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_project_settings_dialog_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_project_settings_pane.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_project_settings_pane_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_project_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_project_shell_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_qml_bootstrap.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_qml_viewmodel_harness.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_queue_drawer_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_queue_shell_host.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_queue_shell_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_shell_host_infrastructure.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_sleep_inhibitor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_terms_pane_viewmodel.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_terms_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_ui_clickthrough_smoke.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_viewmodel_base.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_work_view.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_worker_cancellation_reporting.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/test_workflow_profile_editor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_batch_task_overlap_guard.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_chunk_retranslation_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_config_snapshot_workers.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_glossary_export_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_glossary_review_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_ocr_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_operation_tracker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_translate_and_export_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_translation_manga_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/ui/workers/test_translation_text_task_worker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_chunking.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_cjk_normalize.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_file_utils.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_hard_wrap.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_hashing.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_llm_json_cleaner.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_markdown_escape.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_semantic_chunker.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_string_similarity.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/utils/test_symbol_check.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/execution/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/execution/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/execution/test_batch_translation_executor.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/AGENTS.md +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/__init__.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_batch_translation_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_chunk_retranslation_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_glossary_export_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_glossary_extraction_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_glossary_review_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_glossary_translation_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_image_reembedding_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_ocr_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_translate_and_export_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_translation_manga_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/handlers/test_translation_text_handler.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/test_claims.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/tasks/test_engine_core.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_glossary_ops_scoping.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_multi_document.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_ocr_required_for_translation.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_run_ocr.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_service_bootstrap_lock.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_service_cancellation_semantics.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_session.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_translator_image_fetcher.py +0 -0
- {contextweave-0.2.2 → contextweave-0.3.0}/tests/workflow/test_translator_import_path.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: contextweave
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: ContextWeave: context-aware document translation with glossary management
|
|
5
5
|
Project-URL: Homepage, https://github.com/bot-32142/ContextWeave
|
|
6
6
|
Project-URL: Documentation, https://bot-32142.github.io/ContextWeave/
|
|
@@ -28,6 +28,7 @@ Requires-Dist: jellyfish>=1.0.0
|
|
|
28
28
|
Requires-Dist: numpy<2.0.0,>=1.26.4
|
|
29
29
|
Requires-Dist: openai>=1.0.0
|
|
30
30
|
Requires-Dist: opencc-python-reimplemented>=0.1.7
|
|
31
|
+
Requires-Dist: openpyxl>=3.1.5
|
|
31
32
|
Requires-Dist: pikepdf>=9.0.0
|
|
32
33
|
Requires-Dist: pillow>=10.0.0
|
|
33
34
|
Requires-Dist: platformdirs>=4.5.1
|
|
@@ -155,13 +156,18 @@ contextweave-cli config validate
|
|
|
155
156
|
contextweave-cli run ./book.epub --output ./translated/book.epub
|
|
156
157
|
contextweave-cli run ./chapter.txt --output ./translated/chapter.txt --json
|
|
157
158
|
contextweave-cli run ./episode.srt --output ./translated/episode.srt --no-polish
|
|
159
|
+
contextweave-cli galgame inspect ./extracted-game --json
|
|
160
|
+
contextweave-cli galgame skill --output ./contextweave-galgame-translation
|
|
161
|
+
contextweave-cli run ./extracted-game --type galgame --output ./translated-patch --preserve-structure --json
|
|
158
162
|
|
|
159
163
|
contextweave-cli books list
|
|
160
164
|
contextweave-cli books show BOOK_ID
|
|
161
165
|
contextweave-cli books delete BOOK_ID --yes
|
|
162
166
|
```
|
|
163
167
|
|
|
164
|
-
The CLI resolves config from `--config`, then `CONTEXTWEAVE_CONFIG`, then the nearest `contextweave.yaml`/`.contextweave.yaml` walking upward, then the platform default shown by `contextweave-cli config path`. The config mirrors the setup UI: `connections` define provider endpoints and `workflow_profiles` route each translation step. Prefer `api_key_env` so API keys stay in environment variables instead of config files or task snapshots. Use `--no-polish` when a one-shot run should skip the polish pass, which can be useful for timing-sensitive subtitle output.
|
|
168
|
+
The CLI resolves config from `--config`, then `CONTEXTWEAVE_CONFIG`, then the nearest `contextweave.yaml`/`.contextweave.yaml` walking upward, then the platform default shown by `contextweave-cli config path`. The config mirrors the setup UI: `connections` define provider endpoints and `workflow_profiles` route each translation step. Prefer `api_key_env` so API keys stay in environment variables instead of config files or task snapshots. Use `--no-polish` when a one-shot run should skip the polish pass, which can be useful for timing-sensitive subtitle output. Use `--preserve-structure` for patchable galgame/script exports.
|
|
169
|
+
|
|
170
|
+
For unsupported game engines, convert extracted script text into a supported intermediate format such as ParaTranz JSON or Translator++ `.trans`, then import that file or folder as `--type galgame`. `contextweave-cli galgame skill` writes a Codex/OpenAI-style skill file with this workflow for external extractor agents.
|
|
165
171
|
|
|
166
172
|
A commented starting point is available at [docs/examples/contextweave-cli.yaml](https://github.com/bot-32142/ContextWeave/blob/master/docs/examples/contextweave-cli.yaml).
|
|
167
173
|
|
|
@@ -183,3 +189,4 @@ A commented starting point is available at [docs/examples/contextweave-cli.yaml]
|
|
|
183
189
|
| Manga | `.cbz`, image folders | `cbz` | Yes |
|
|
184
190
|
| EPUB | `.epub` | `epub`, `md`, `docx`, `html` | No, but image OCR is supported |
|
|
185
191
|
| Subtitle | `.srt`, `.vtt`, `.ass`, `.ssa` | `srt`, `vtt`, `ass`, `ssa` | No |
|
|
192
|
+
| Galgame | `.rpy`, `.ks`, RPG Maker MV/MZ JSON, MTool JSON, Translator++ `.trans`, VNText JSON, ParaTranz JSON, TPP/Translator++ `.xlsx`, Wolf RPG `.xlsx` | `txt`, preserve-structure folder | No |
|
|
@@ -106,13 +106,18 @@ contextweave-cli config validate
|
|
|
106
106
|
contextweave-cli run ./book.epub --output ./translated/book.epub
|
|
107
107
|
contextweave-cli run ./chapter.txt --output ./translated/chapter.txt --json
|
|
108
108
|
contextweave-cli run ./episode.srt --output ./translated/episode.srt --no-polish
|
|
109
|
+
contextweave-cli galgame inspect ./extracted-game --json
|
|
110
|
+
contextweave-cli galgame skill --output ./contextweave-galgame-translation
|
|
111
|
+
contextweave-cli run ./extracted-game --type galgame --output ./translated-patch --preserve-structure --json
|
|
109
112
|
|
|
110
113
|
contextweave-cli books list
|
|
111
114
|
contextweave-cli books show BOOK_ID
|
|
112
115
|
contextweave-cli books delete BOOK_ID --yes
|
|
113
116
|
```
|
|
114
117
|
|
|
115
|
-
The CLI resolves config from `--config`, then `CONTEXTWEAVE_CONFIG`, then the nearest `contextweave.yaml`/`.contextweave.yaml` walking upward, then the platform default shown by `contextweave-cli config path`. The config mirrors the setup UI: `connections` define provider endpoints and `workflow_profiles` route each translation step. Prefer `api_key_env` so API keys stay in environment variables instead of config files or task snapshots. Use `--no-polish` when a one-shot run should skip the polish pass, which can be useful for timing-sensitive subtitle output.
|
|
118
|
+
The CLI resolves config from `--config`, then `CONTEXTWEAVE_CONFIG`, then the nearest `contextweave.yaml`/`.contextweave.yaml` walking upward, then the platform default shown by `contextweave-cli config path`. The config mirrors the setup UI: `connections` define provider endpoints and `workflow_profiles` route each translation step. Prefer `api_key_env` so API keys stay in environment variables instead of config files or task snapshots. Use `--no-polish` when a one-shot run should skip the polish pass, which can be useful for timing-sensitive subtitle output. Use `--preserve-structure` for patchable galgame/script exports.
|
|
119
|
+
|
|
120
|
+
For unsupported game engines, convert extracted script text into a supported intermediate format such as ParaTranz JSON or Translator++ `.trans`, then import that file or folder as `--type galgame`. `contextweave-cli galgame skill` writes a Codex/OpenAI-style skill file with this workflow for external extractor agents.
|
|
116
121
|
|
|
117
122
|
A commented starting point is available at [docs/examples/contextweave-cli.yaml](https://github.com/bot-32142/ContextWeave/blob/master/docs/examples/contextweave-cli.yaml).
|
|
118
123
|
|
|
@@ -134,3 +139,4 @@ A commented starting point is available at [docs/examples/contextweave-cli.yaml]
|
|
|
134
139
|
| Manga | `.cbz`, image folders | `cbz` | Yes |
|
|
135
140
|
| EPUB | `.epub` | `epub`, `md`, `docx`, `html` | No, but image OCR is supported |
|
|
136
141
|
| Subtitle | `.srt`, `.vtt`, `.ass`, `.ssa` | `srt`, `vtt`, `ass`, `ssa` | No |
|
|
142
|
+
| Galgame | `.rpy`, `.ks`, RPG Maker MV/MZ JSON, MTool JSON, Translator++ `.trans`, VNText JSON, ParaTranz JSON, TPP/Translator++ `.xlsx`, Wolf RPG `.xlsx` | `txt`, preserve-structure folder | No |
|
|
@@ -45,11 +45,14 @@ class WorkflowStepId(StrEnum):
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
_DEFAULT_CONNECTION_CONCURRENCY = 5
|
|
48
|
-
_DEEPSEEK_DEFAULT_CONNECTION_CONCURRENCY =
|
|
48
|
+
_DEEPSEEK_DEFAULT_CONNECTION_CONCURRENCY = 500
|
|
49
|
+
_DEEPSEEK_FLASH_DEFAULT_CONNECTION_CONCURRENCY = 2500
|
|
49
50
|
|
|
50
51
|
|
|
51
|
-
def default_connection_concurrency(provider: ProviderKind | None) -> int:
|
|
52
|
+
def default_connection_concurrency(provider: ProviderKind | None, model: str | None = None) -> int:
|
|
52
53
|
if provider is ProviderKind.DEEPSEEK:
|
|
54
|
+
if (model or "").strip().lower() == "deepseek-v4-flash":
|
|
55
|
+
return _DEEPSEEK_FLASH_DEFAULT_CONNECTION_CONCURRENCY
|
|
53
56
|
return _DEEPSEEK_DEFAULT_CONNECTION_CONCURRENCY
|
|
54
57
|
return _DEFAULT_CONNECTION_CONCURRENCY
|
|
55
58
|
|
|
@@ -122,7 +125,7 @@ class ConnectionDraft(ContractModel):
|
|
|
122
125
|
return data
|
|
123
126
|
|
|
124
127
|
payload = dict(data)
|
|
125
|
-
payload["concurrency"] = default_connection_concurrency(provider)
|
|
128
|
+
payload["concurrency"] = default_connection_concurrency(provider, data.get("default_model"))
|
|
126
129
|
return payload
|
|
127
130
|
|
|
128
131
|
|
|
@@ -264,7 +264,7 @@ _WIZARD_MODEL_CATALOG: dict[ProviderKind, tuple[WizardModelTemplate, ...]] = {
|
|
|
264
264
|
"DeepSeek V4 Flash",
|
|
265
265
|
"deepseek-v4-flash",
|
|
266
266
|
"https://api.deepseek.com",
|
|
267
|
-
concurrency=default_connection_concurrency(ProviderKind.DEEPSEEK),
|
|
267
|
+
concurrency=default_connection_concurrency(ProviderKind.DEEPSEEK, "deepseek-v4-flash"),
|
|
268
268
|
),
|
|
269
269
|
WizardModelTemplate(
|
|
270
270
|
ProviderKind.DEEPSEEK,
|
|
@@ -272,7 +272,7 @@ _WIZARD_MODEL_CATALOG: dict[ProviderKind, tuple[WizardModelTemplate, ...]] = {
|
|
|
272
272
|
"deepseek-v4-pro",
|
|
273
273
|
"https://api.deepseek.com",
|
|
274
274
|
timeout=300,
|
|
275
|
-
concurrency=default_connection_concurrency(ProviderKind.DEEPSEEK),
|
|
275
|
+
concurrency=default_connection_concurrency(ProviderKind.DEEPSEEK, "deepseek-v4-pro"),
|
|
276
276
|
),
|
|
277
277
|
),
|
|
278
278
|
ProviderKind.ANTHROPIC: (
|
|
@@ -1123,6 +1123,7 @@ def map_document_type_code(document_type: str | None) -> DocumentTypeCode:
|
|
|
1123
1123
|
"subtitle": DocumentTypeCode.SUBTITLE,
|
|
1124
1124
|
"scanned_book": DocumentTypeCode.SCANNED_BOOK,
|
|
1125
1125
|
"manga": DocumentTypeCode.MANGA,
|
|
1126
|
+
"galgame": DocumentTypeCode.GALGAME,
|
|
1126
1127
|
}
|
|
1127
1128
|
return mapping.get(str(document_type or ""), DocumentTypeCode.OTHER)
|
|
1128
1129
|
|
|
@@ -43,7 +43,7 @@ connections:
|
|
|
43
43
|
temperature: 0
|
|
44
44
|
timeout: 180
|
|
45
45
|
max_retries: 3
|
|
46
|
-
concurrency:
|
|
46
|
+
concurrency: 2500
|
|
47
47
|
|
|
48
48
|
deepseek_pro:
|
|
49
49
|
display_name: DeepSeek V4 Pro
|
|
@@ -54,7 +54,7 @@ connections:
|
|
|
54
54
|
temperature: 0
|
|
55
55
|
timeout: 300
|
|
56
56
|
max_retries: 3
|
|
57
|
-
concurrency:
|
|
57
|
+
concurrency: 500
|
|
58
58
|
|
|
59
59
|
workflow_profiles:
|
|
60
60
|
balanced_deepseek:
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
GALGAME_CODEX_SKILL_TEXT = """---
|
|
2
|
+
name: contextweave-galgame-translation
|
|
3
|
+
description: Use ContextWeave CLI to translate extracted galgame scripts and intermediate files while preserving patchable structure.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ContextWeave Galgame Translation
|
|
7
|
+
|
|
8
|
+
Use this skill when the user wants to translate a visual novel / galgame with ContextWeave from extracted scripts or tool exports.
|
|
9
|
+
|
|
10
|
+
## Ground Rules
|
|
11
|
+
|
|
12
|
+
- Work on a copy of the game or extracted files, never the original install folder.
|
|
13
|
+
- Do not import `.exe`, `.dll`, save data, images, audio, video, or opaque archives directly.
|
|
14
|
+
- Prefer stable intermediate formats over raw text dumps.
|
|
15
|
+
- Preserve placeholders/control codes exactly, including Ren'Py `{...}`, RPG Maker `\\N[1]`, and KAG/Tyrano `[l]` tags.
|
|
16
|
+
- If a game is packed, use external extractors only when the user explicitly asks and the tool is installed.
|
|
17
|
+
- ContextWeave translates supported extracted files; external tools are still responsible for unpacking/repacking proprietary archives.
|
|
18
|
+
|
|
19
|
+
## Supported Direct Inputs
|
|
20
|
+
|
|
21
|
+
- Ren'Py `.rpy`
|
|
22
|
+
- TyranoScript / KAG / extracted KiriKiri `.ks`
|
|
23
|
+
- RPG Maker MV/MZ `data/*.json` or `www/data/*.json`
|
|
24
|
+
- MTool JSON dictionaries
|
|
25
|
+
- Translator++ `.trans`
|
|
26
|
+
- VNText JSON
|
|
27
|
+
- ParaTranz JSON
|
|
28
|
+
- TPP / Translator++ `.xlsx`
|
|
29
|
+
- Wolf RPG extracted `.xlsx`
|
|
30
|
+
|
|
31
|
+
## Preferred Unsupported-Engine Bridge
|
|
32
|
+
|
|
33
|
+
When a game engine or extractor output is not directly supported by ContextWeave, ask the extractor/converter agent to normalize the extracted script text into ParaTranz-style JSON:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
[
|
|
37
|
+
{
|
|
38
|
+
"key": "script001:000001",
|
|
39
|
+
"original": "こんにちは",
|
|
40
|
+
"translation": "",
|
|
41
|
+
"speaker": "Alice",
|
|
42
|
+
"context": "script001 line 1"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Rules for the converter:
|
|
48
|
+
|
|
49
|
+
- Output UTF-8 JSON.
|
|
50
|
+
- Use one object per translatable game entry.
|
|
51
|
+
- Keep `translation` empty before ContextWeave translation.
|
|
52
|
+
- Make `key` stable and unique from source file plus entry index.
|
|
53
|
+
- Preserve control codes/placeholders exactly in `original`.
|
|
54
|
+
- Do not merge entries.
|
|
55
|
+
- Generate a separate injector that writes translated JSON back to the original extracted script format by `key` or original order.
|
|
56
|
+
|
|
57
|
+
## CLI Workflow
|
|
58
|
+
|
|
59
|
+
1. Validate config:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
contextweave-cli --config ./contextweave.yaml config validate
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
2. Inspect source support:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
contextweave-cli --json galgame inspect ./extracted_or_exported_source
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
3. If the source is unsupported, inspect possible external helper hints:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
contextweave-cli --json galgame helpers ./game_copy
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
4. Translate and preserve structure:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
contextweave-cli \
|
|
81
|
+
--config ./contextweave.yaml \
|
|
82
|
+
--library-root ./contextweave-library \
|
|
83
|
+
--json \
|
|
84
|
+
run ./extracted_or_exported_source \
|
|
85
|
+
--type galgame \
|
|
86
|
+
--output ./translated_patch \
|
|
87
|
+
--preserve-structure
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
5. Use the corresponding injector/repacker to apply `./translated_patch` back to the copied game or extracted script tree.
|
|
91
|
+
|
|
92
|
+
## Useful Inspection Commands
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
contextweave-cli galgame inspect ./source
|
|
96
|
+
contextweave-cli galgame glossary-seeds ./source
|
|
97
|
+
contextweave-cli galgame helpers ./source
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Failure Handling
|
|
101
|
+
|
|
102
|
+
- If import is ambiguous, rerun `run` with `--type galgame`.
|
|
103
|
+
- If placeholder validation fails, repair the translated entry so all source control codes are present exactly once.
|
|
104
|
+
- If an extracted dump is raw plain text, convert it to ParaTranz JSON before using ContextWeave.
|
|
105
|
+
- If only opaque binary chunks remain after extraction, stop and ask for a game-specific adapter/extractor instead of guessing.
|
|
106
|
+
"""
|
|
@@ -8,10 +8,16 @@ from context_aware_translation.application.contracts.common import ContractModel
|
|
|
8
8
|
from context_aware_translation.application.contracts.document import RunTranslateAndExportRequest
|
|
9
9
|
from context_aware_translation.application.contracts.work import ImportDocumentsRequest, InspectImportPathsRequest
|
|
10
10
|
from context_aware_translation.application.errors import ApplicationError
|
|
11
|
+
from context_aware_translation.documents.galgame import (
|
|
12
|
+
inspect_galgame_external_helpers,
|
|
13
|
+
inspect_galgame_glossary_seeds,
|
|
14
|
+
inspect_galgame_import,
|
|
15
|
+
)
|
|
11
16
|
from context_aware_translation.storage.models.book import BookStatus
|
|
12
17
|
from context_aware_translation.workflow.tasks.models import STATUS_COMPLETED
|
|
13
18
|
|
|
14
19
|
from .config_file import load_cli_config, resolve_config_path, write_starter_config
|
|
20
|
+
from .galgame_skill import GALGAME_CODEX_SKILL_TEXT
|
|
15
21
|
from .output import (
|
|
16
22
|
EXIT_BLOCKED,
|
|
17
23
|
EXIT_TASK_FAILED,
|
|
@@ -89,8 +95,25 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
89
95
|
run_parser.add_argument("--book-name")
|
|
90
96
|
run_parser.add_argument("--type", dest="document_type")
|
|
91
97
|
run_parser.add_argument("--format", dest="format_id")
|
|
98
|
+
run_parser.add_argument("--preserve-structure", action="store_true")
|
|
99
|
+
run_parser.add_argument("--allow-original-fallback", action="store_true")
|
|
92
100
|
run_parser.add_argument("--no-polish", action="store_true")
|
|
93
101
|
|
|
102
|
+
galgame_parser = subparsers.add_parser("galgame", parents=[common])
|
|
103
|
+
galgame_subparsers = galgame_parser.add_subparsers(dest="galgame_command", required=True)
|
|
104
|
+
galgame_inspect_parser = galgame_subparsers.add_parser("inspect", parents=[common])
|
|
105
|
+
galgame_inspect_parser.add_argument("input")
|
|
106
|
+
galgame_inspect_parser.add_argument("--adapter")
|
|
107
|
+
galgame_helpers_parser = galgame_subparsers.add_parser("helpers", parents=[common])
|
|
108
|
+
galgame_helpers_parser.add_argument("input")
|
|
109
|
+
galgame_helpers_parser.add_argument("--output-folder")
|
|
110
|
+
galgame_helpers_parser.add_argument("--tool", action="append", dest="tools")
|
|
111
|
+
galgame_glossary_parser = galgame_subparsers.add_parser("glossary-seeds", parents=[common])
|
|
112
|
+
galgame_glossary_parser.add_argument("input")
|
|
113
|
+
galgame_glossary_parser.add_argument("--adapter")
|
|
114
|
+
galgame_skill_parser = galgame_subparsers.add_parser("skill", parents=[common])
|
|
115
|
+
galgame_skill_parser.add_argument("--output")
|
|
116
|
+
|
|
94
117
|
books_parser = subparsers.add_parser("books", parents=[common])
|
|
95
118
|
books_subparsers = books_parser.add_subparsers(dest="books_command", required=True)
|
|
96
119
|
books_subparsers.add_parser("list", parents=[common])
|
|
@@ -109,6 +132,8 @@ def command_name(args: argparse.Namespace) -> str:
|
|
|
109
132
|
return f"config.{getattr(args, 'config_command', '')}"
|
|
110
133
|
if command == "books":
|
|
111
134
|
return f"books.{getattr(args, 'books_command', '')}"
|
|
135
|
+
if command == "galgame":
|
|
136
|
+
return f"galgame.{getattr(args, 'galgame_command', '')}"
|
|
112
137
|
return command
|
|
113
138
|
|
|
114
139
|
|
|
@@ -118,6 +143,8 @@ def dispatch(args: argparse.Namespace) -> dict[str, Any]:
|
|
|
118
143
|
return dispatch_config(args)
|
|
119
144
|
if command == "books":
|
|
120
145
|
return dispatch_books(args)
|
|
146
|
+
if command == "galgame":
|
|
147
|
+
return dispatch_galgame(args)
|
|
121
148
|
if command == "run":
|
|
122
149
|
return run_one_shot(args)
|
|
123
150
|
raise CliError("usage", f"Unsupported command: {command}", exit_code=EXIT_USAGE)
|
|
@@ -158,6 +185,77 @@ def dispatch_books(args: argparse.Namespace) -> dict[str, Any]:
|
|
|
158
185
|
raise CliError("usage", f"Unsupported books command: {books_command}", exit_code=EXIT_USAGE)
|
|
159
186
|
|
|
160
187
|
|
|
188
|
+
def dispatch_galgame(args: argparse.Namespace) -> dict[str, Any]:
|
|
189
|
+
galgame_command = str(args.galgame_command)
|
|
190
|
+
if galgame_command == "inspect":
|
|
191
|
+
path = Path(str(args.input)).expanduser().resolve()
|
|
192
|
+
import_summary = inspect_galgame_import(path, adapter_name=getattr(args, "adapter", None))
|
|
193
|
+
return {
|
|
194
|
+
"path": str(path),
|
|
195
|
+
"imported": import_summary.imported,
|
|
196
|
+
"skipped": import_summary.skipped,
|
|
197
|
+
"total_units": import_summary.total_units,
|
|
198
|
+
"adapters": list(import_summary.adapters),
|
|
199
|
+
"files": [
|
|
200
|
+
{
|
|
201
|
+
"relative_path": source.relative_path,
|
|
202
|
+
"adapter_name": source.adapter_name,
|
|
203
|
+
"unit_count": source.unit_count,
|
|
204
|
+
"confidence": source.confidence,
|
|
205
|
+
}
|
|
206
|
+
for source in import_summary.files
|
|
207
|
+
],
|
|
208
|
+
}
|
|
209
|
+
if galgame_command == "helpers":
|
|
210
|
+
path = Path(str(args.input)).expanduser().resolve()
|
|
211
|
+
output_folder = _optional_path(getattr(args, "output_folder", None))
|
|
212
|
+
helper_summary = inspect_galgame_external_helpers(
|
|
213
|
+
path,
|
|
214
|
+
output_folder=output_folder,
|
|
215
|
+
tool_names=getattr(args, "tools", None),
|
|
216
|
+
)
|
|
217
|
+
return {
|
|
218
|
+
"path": str(path),
|
|
219
|
+
"usable": helper_summary.usable,
|
|
220
|
+
"commands": [
|
|
221
|
+
{
|
|
222
|
+
"source_path": command.source_path,
|
|
223
|
+
"output_folder": command.output_folder,
|
|
224
|
+
"tool_name": command.tool_name,
|
|
225
|
+
"executable": command.executable,
|
|
226
|
+
"argv": list(command.argv),
|
|
227
|
+
"note": command.note,
|
|
228
|
+
}
|
|
229
|
+
for command in helper_summary.commands
|
|
230
|
+
],
|
|
231
|
+
"issues": [
|
|
232
|
+
{
|
|
233
|
+
"source_path": issue.source_path,
|
|
234
|
+
"source_extension": issue.source_extension,
|
|
235
|
+
"message": issue.message,
|
|
236
|
+
}
|
|
237
|
+
for issue in helper_summary.issues
|
|
238
|
+
],
|
|
239
|
+
}
|
|
240
|
+
if galgame_command == "glossary-seeds":
|
|
241
|
+
path = Path(str(args.input)).expanduser().resolve()
|
|
242
|
+
seeds = inspect_galgame_glossary_seeds(path, adapter_name=getattr(args, "adapter", None))
|
|
243
|
+
return {
|
|
244
|
+
"path": str(path),
|
|
245
|
+
"seeds": [
|
|
246
|
+
{"term": seed.term, "category": seed.category, "source": seed.source, "context": seed.context}
|
|
247
|
+
for seed in seeds
|
|
248
|
+
],
|
|
249
|
+
}
|
|
250
|
+
if galgame_command == "skill":
|
|
251
|
+
output = getattr(args, "output", None)
|
|
252
|
+
if output is None:
|
|
253
|
+
return {"skill": GALGAME_CODEX_SKILL_TEXT, "written": False, "path": None}
|
|
254
|
+
output_path = _write_galgame_skill(Path(str(output)).expanduser())
|
|
255
|
+
return {"skill": GALGAME_CODEX_SKILL_TEXT, "written": True, "path": str(output_path)}
|
|
256
|
+
raise CliError("usage", f"Unsupported galgame command: {galgame_command}", exit_code=EXIT_USAGE)
|
|
257
|
+
|
|
258
|
+
|
|
161
259
|
def run_one_shot(args: argparse.Namespace) -> dict[str, Any]:
|
|
162
260
|
library_root = _optional_path(getattr(args, "library_root", None))
|
|
163
261
|
input_path = Path(str(args.input)).expanduser().resolve()
|
|
@@ -208,6 +306,10 @@ def run_one_shot(args: argparse.Namespace) -> dict[str, Any]:
|
|
|
208
306
|
use_batch=False,
|
|
209
307
|
use_reembedding=False,
|
|
210
308
|
enable_polish=not bool(getattr(args, "no_polish", False)),
|
|
309
|
+
options={
|
|
310
|
+
"preserve_structure": bool(getattr(args, "preserve_structure", False)),
|
|
311
|
+
"allow_original_fallback": bool(getattr(args, "allow_original_fallback", False)),
|
|
312
|
+
},
|
|
211
313
|
)
|
|
212
314
|
)
|
|
213
315
|
task_id = accepted.queue_item_id or accepted.command_id
|
|
@@ -222,6 +324,7 @@ def run_one_shot(args: argparse.Namespace) -> dict[str, Any]:
|
|
|
222
324
|
"status": record.status,
|
|
223
325
|
"phase": record.phase,
|
|
224
326
|
"output_path": str(output_path),
|
|
327
|
+
"preserve_structure": bool(getattr(args, "preserve_structure", False)),
|
|
225
328
|
}
|
|
226
329
|
if record.status != STATUS_COMPLETED:
|
|
227
330
|
raise CliError(
|
|
@@ -326,6 +429,27 @@ def print_human_success(command: str, data: dict[str, Any]) -> None:
|
|
|
326
429
|
print(f"Task: {data['task_id']}")
|
|
327
430
|
print(f"Done: {data['output_path']}")
|
|
328
431
|
return
|
|
432
|
+
if command == "galgame.inspect":
|
|
433
|
+
print(f"Importable files: {data['imported']} ({data['total_units']} units)")
|
|
434
|
+
for item in data.get("files", []):
|
|
435
|
+
print(f"{item['relative_path']}\t{item['adapter_name']}\t{item['unit_count']}\t{item['confidence']}")
|
|
436
|
+
return
|
|
437
|
+
if command == "galgame.helpers":
|
|
438
|
+
for command_item in data.get("commands", []):
|
|
439
|
+
print(" ".join(command_item["argv"]))
|
|
440
|
+
for issue in data.get("issues", []):
|
|
441
|
+
print(f"{issue['source_path']}: {issue['message']}")
|
|
442
|
+
return
|
|
443
|
+
if command == "galgame.glossary-seeds":
|
|
444
|
+
for seed in data.get("seeds", []):
|
|
445
|
+
print(f"{seed['term']}\t{seed['category']}\t{seed['source']}")
|
|
446
|
+
return
|
|
447
|
+
if command == "galgame.skill":
|
|
448
|
+
if data.get("written"):
|
|
449
|
+
print(f"Wrote skill: {data['path']}")
|
|
450
|
+
else:
|
|
451
|
+
print(data["skill"])
|
|
452
|
+
return
|
|
329
453
|
print(data)
|
|
330
454
|
|
|
331
455
|
|
|
@@ -350,6 +474,13 @@ def _optional_path(value: str | None) -> Path | None:
|
|
|
350
474
|
return Path(value).expanduser().resolve()
|
|
351
475
|
|
|
352
476
|
|
|
477
|
+
def _write_galgame_skill(output_path: Path) -> Path:
|
|
478
|
+
skill_path = output_path / "SKILL.md" if output_path.suffix == "" else output_path
|
|
479
|
+
skill_path.parent.mkdir(parents=True, exist_ok=True)
|
|
480
|
+
skill_path.write_text(GALGAME_CODEX_SKILL_TEXT, encoding="utf-8")
|
|
481
|
+
return skill_path.resolve()
|
|
482
|
+
|
|
483
|
+
|
|
353
484
|
def _payload(value: Any) -> Any:
|
|
354
485
|
if isinstance(value, ContractModel):
|
|
355
486
|
return value.to_payload()
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from context_aware_translation.core.cancellation import raise_if_cancelled
|
|
7
|
+
from context_aware_translation.documents.galgame import deserialize_translation_unit_stream
|
|
8
|
+
from context_aware_translation.storage.schema.book_db import ChunkRecord
|
|
9
|
+
from context_aware_translation.utils.hashing import compute_chunk_hash
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from context_aware_translation.core.context_manager import TranslationContextManager
|
|
13
|
+
from context_aware_translation.core.progress import ProgressCallback
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class GalgameDocumentHandler:
|
|
17
|
+
"""DocumentTypeHandler for unit-preserving galgame translation."""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
*,
|
|
22
|
+
concurrency: int = 5,
|
|
23
|
+
batch_size: int = 0,
|
|
24
|
+
max_tokens_per_batch: int = 2000,
|
|
25
|
+
) -> None:
|
|
26
|
+
self._concurrency = max(1, concurrency)
|
|
27
|
+
self._batch_size = batch_size
|
|
28
|
+
self._max_tokens_per_batch = max(1, max_tokens_per_batch)
|
|
29
|
+
|
|
30
|
+
def add_text(
|
|
31
|
+
self,
|
|
32
|
+
text: str,
|
|
33
|
+
max_token_size_per_chunk: int, # noqa: ARG002
|
|
34
|
+
document_id: int,
|
|
35
|
+
manager: TranslationContextManager,
|
|
36
|
+
) -> int:
|
|
37
|
+
"""Store one chunk per translation unit without deduping repeated dialogue text."""
|
|
38
|
+
units = deserialize_translation_unit_stream(text)
|
|
39
|
+
chunk_records: list[ChunkRecord] = []
|
|
40
|
+
chunk_id = manager.term_repo.get_next_chunk_id()
|
|
41
|
+
for unit in units:
|
|
42
|
+
if not unit.text.strip():
|
|
43
|
+
continue
|
|
44
|
+
identity_text = f"{unit.relative_path}\0{unit.unit_id}\0{unit.text}"
|
|
45
|
+
chunk_records.append(
|
|
46
|
+
ChunkRecord(
|
|
47
|
+
chunk_id=chunk_id,
|
|
48
|
+
hash=compute_chunk_hash(identity_text, document_id=document_id),
|
|
49
|
+
text=unit.text,
|
|
50
|
+
document_id=document_id,
|
|
51
|
+
is_extracted=False,
|
|
52
|
+
is_summarized=False,
|
|
53
|
+
)
|
|
54
|
+
)
|
|
55
|
+
chunk_id += 1
|
|
56
|
+
|
|
57
|
+
new_chunk_records = [
|
|
58
|
+
chunk_record for chunk_record in chunk_records if not manager.term_repo.chunk_exists_by_hash(chunk_record.hash)
|
|
59
|
+
]
|
|
60
|
+
if new_chunk_records:
|
|
61
|
+
manager._state_update([], new_chunk_records)
|
|
62
|
+
return chunk_id - 1
|
|
63
|
+
|
|
64
|
+
async def translate_chunks(
|
|
65
|
+
self,
|
|
66
|
+
document_ids: list[int],
|
|
67
|
+
manager: TranslationContextManager,
|
|
68
|
+
force: bool = False,
|
|
69
|
+
source_ids: list[int] | None = None,
|
|
70
|
+
cancel_check: Callable[[], bool] | None = None,
|
|
71
|
+
progress_callback: ProgressCallback | None = None,
|
|
72
|
+
) -> None:
|
|
73
|
+
"""Delegate to the generic text translator while preserving one chunk per unit."""
|
|
74
|
+
_ = source_ids
|
|
75
|
+
raise_if_cancelled(cancel_check)
|
|
76
|
+
await manager.translate_chunks(
|
|
77
|
+
concurrency=self._concurrency,
|
|
78
|
+
batch_size=self._batch_size,
|
|
79
|
+
max_tokens_per_batch=self._max_tokens_per_batch,
|
|
80
|
+
document_ids=document_ids,
|
|
81
|
+
force=force,
|
|
82
|
+
cancel_check=cancel_check,
|
|
83
|
+
progress_callback=progress_callback,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def get_translated_lines(
|
|
87
|
+
self,
|
|
88
|
+
document_id: int,
|
|
89
|
+
manager: TranslationContextManager,
|
|
90
|
+
) -> list[str]:
|
|
91
|
+
"""Return one translated entry per galgame translation unit."""
|
|
92
|
+
chunks = manager.term_repo.list_chunks(document_id=document_id)
|
|
93
|
+
if not chunks:
|
|
94
|
+
raise ValueError("No chunks found in the database")
|
|
95
|
+
|
|
96
|
+
sorted_chunks = sorted(chunks, key=lambda chunk: chunk.chunk_id)
|
|
97
|
+
untranslated = [chunk for chunk in sorted_chunks if not chunk.is_translated or chunk.translation is None]
|
|
98
|
+
if untranslated:
|
|
99
|
+
untranslated_ids = [chunk.chunk_id for chunk in untranslated]
|
|
100
|
+
raise ValueError(f"Cannot export: chunks {untranslated_ids} are not translated yet")
|
|
101
|
+
return [chunk.translation for chunk in sorted_chunks if chunk.translation is not None]
|
|
@@ -266,13 +266,14 @@ def get_document_classes() -> list[type[Document]]:
|
|
|
266
266
|
Uses late imports to avoid circular dependencies.
|
|
267
267
|
"""
|
|
268
268
|
from context_aware_translation.documents.epub import EPUBDocument
|
|
269
|
+
from context_aware_translation.documents.galgame import GalgameDocument
|
|
269
270
|
from context_aware_translation.documents.manga import MangaDocument
|
|
270
271
|
from context_aware_translation.documents.pdf import PDFDocument
|
|
271
272
|
from context_aware_translation.documents.scanned_book import ScannedBookDocument
|
|
272
273
|
from context_aware_translation.documents.subtitle import SubtitleDocument
|
|
273
274
|
from context_aware_translation.documents.text import TextDocument
|
|
274
275
|
|
|
275
|
-
return [TextDocument, SubtitleDocument, PDFDocument, ScannedBookDocument, MangaDocument, EPUBDocument]
|
|
276
|
+
return [TextDocument, SubtitleDocument, GalgameDocument, PDFDocument, ScannedBookDocument, MangaDocument, EPUBDocument]
|
|
276
277
|
|
|
277
278
|
|
|
278
279
|
def is_ocr_required_for_type(document_type: str) -> bool:
|