docsmind 0.4.0__tar.gz → 0.6.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.
- {docsmind-0.4.0 → docsmind-0.6.0}/CHANGELOG.md +57 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/PKG-INFO +33 -6
- {docsmind-0.4.0 → docsmind-0.6.0}/README.md +30 -5
- {docsmind-0.4.0 → docsmind-0.6.0}/pyproject.toml +2 -1
- docsmind-0.6.0/src/docsmind/adapters/embeddings/__init__.py +22 -0
- docsmind-0.6.0/src/docsmind/adapters/embeddings/openai_embeddings.py +79 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/repository.py +244 -16
- docsmind-0.6.0/src/docsmind/adapters/vision/__init__.py +29 -0
- docsmind-0.6.0/src/docsmind/adapters/vision/captioners.py +114 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/agent.py +87 -2
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/tools/base.py +21 -1
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/tools/delegate.py +1 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/tools/documents.py +3 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/tools/search.py +20 -6
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/app.py +3 -0
- docsmind-0.6.0/src/docsmind/cli/enrich.py +95 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/config.py +15 -2
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/errors.py +9 -0
- docsmind-0.6.0/src/docsmind/enrichment/__init__.py +9 -0
- docsmind-0.6.0/src/docsmind/enrichment/pricing.py +192 -0
- docsmind-0.6.0/src/docsmind/enrichment/service.py +331 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/ingestion/parsers/pdf.py +3 -0
- docsmind-0.6.0/src/docsmind/retrieval/fusion.py +31 -0
- docsmind-0.6.0/src/docsmind/retrieval/hybrid.py +45 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/app.py +3 -2
- docsmind-0.6.0/src/docsmind/server/jobs.py +119 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/routes/documents.py +11 -1
- docsmind-0.6.0/src/docsmind/server/routes/enrichment.py +94 -0
- docsmind-0.4.0/src/docsmind/server/ui/assets/index-DvL2_fGF.js → docsmind-0.6.0/src/docsmind/server/ui/assets/index-CqXag2rP.js +123 -121
- docsmind-0.6.0/src/docsmind/server/ui/assets/index-QYKdGecG.css +1 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/index.html +2 -2
- docsmind-0.4.0/src/docsmind/server/__init__.py +0 -0
- docsmind-0.4.0/src/docsmind/server/routes/__init__.py +0 -0
- docsmind-0.4.0/src/docsmind/server/ui/assets/index-ae6vf384.css +0 -1
- {docsmind-0.4.0 → docsmind-0.6.0}/.gitignore +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/blobs/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/blobs/filesystem.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/llm/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/llm/anthropic_llm.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/llm/openai_llm.py +0 -0
- {docsmind-0.4.0/src/docsmind/adapters/embeddings → docsmind-0.6.0/src/docsmind/adapters/storage}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/memory.py +0 -0
- {docsmind-0.4.0/src/docsmind/adapters/storage → docsmind-0.6.0/src/docsmind/adapters/storage/postgres}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/agent_store.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/engine.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/tables.py +0 -0
- {docsmind-0.4.0/src/docsmind/adapters/storage/postgres → docsmind-0.6.0/src/docsmind/adapters/tracing}/__init__.py +0 -0
- {docsmind-0.4.0/src/docsmind/adapters/tracing → docsmind-0.6.0/src/docsmind/agent}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/catalog.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/harness/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/harness/context.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/harness/memory.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/harness/summarizer.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/harness/tokens.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/loop.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/orchestrator.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/planner.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/prompts.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/sources.py +0 -0
- {docsmind-0.4.0/src/docsmind/adapters/vision → docsmind-0.6.0/src/docsmind/agent/subagents}/__init__.py +0 -0
- {docsmind-0.4.0/src/docsmind/agent → docsmind-0.6.0/src/docsmind/agent/subagents/change_analysis}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/subagents/specs.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/tools/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/agent/util.py +0 -0
- {docsmind-0.4.0/src/docsmind/agent/subagents → docsmind-0.6.0/src/docsmind/cli}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/chat.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/db.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/diff.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/doctor.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/ingest.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/inspect.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/cli/serve.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/client.py +0 -0
- {docsmind-0.4.0/src/docsmind/agent/subagents/change_analysis → docsmind-0.6.0/src/docsmind/domain}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/agent.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/changes.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/citations.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/documents.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/ports.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/domain/tables.py +0 -0
- {docsmind-0.4.0/src/docsmind/cli → docsmind-0.6.0/src/docsmind/ingestion}/__init__.py +0 -0
- {docsmind-0.4.0/src/docsmind/domain → docsmind-0.6.0/src/docsmind/ingestion/chunking}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/ingestion/chunking/page.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/ingestion/chunking/structural.py +0 -0
- {docsmind-0.4.0/src/docsmind/ingestion → docsmind-0.6.0/src/docsmind/ingestion/enrichment}/__init__.py +0 -0
- {docsmind-0.4.0/src/docsmind/ingestion/chunking → docsmind-0.6.0/src/docsmind/ingestion/parsers}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/ingestion/pipeline.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/py.typed +0 -0
- {docsmind-0.4.0/src/docsmind/ingestion/enrichment → docsmind-0.6.0/src/docsmind/retrieval}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/retrieval/keyword.py +0 -0
- {docsmind-0.4.0/src/docsmind/ingestion/parsers → docsmind-0.6.0/src/docsmind/server}/__init__.py +0 -0
- {docsmind-0.4.0/src/docsmind/retrieval → docsmind-0.6.0/src/docsmind/server/routes}/__init__.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/routes/chat.py +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/favicon.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/LICENSE +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Katakana.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/LICENSE +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Roman.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/V.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/iccs/LICENSE +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/altText_add.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/altText_disclaimer.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/altText_done.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/altText_spinner.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/altText_warning.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-check.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-comment.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-help.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-insert.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-key.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-newparagraph.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-noicon.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-note.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-paperclip.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-paragraph.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-pushpin.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/checkmark.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/comment-actionsButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/comment-closeButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/comment-editButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/comment-popup-editButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeHighlight.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeText.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorInk.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorTextHighlight.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-delete.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-edit.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/findbarButton-next.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/findbarButton-previous.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/gv-toolbarButton-download.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/loading-icon.gif +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/loading.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_closingButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_info.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_warning.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/pages_closeButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/pages_selected.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/pages_viewArrow.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/pages_viewButton.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-handTool.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/signature-properties-row-check.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-bookmark.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-download.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorFreeText.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorHighlight.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorInk.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorSignature.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorStamp.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrow.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrowNova.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-openFile.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageDown.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageUp.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-presentationMode.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-print.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-search.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesError.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesVerified.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewAttachments.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewLayers.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewOutline.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewThumbnail.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomIn.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomOut.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/treeitem-collapsed.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/images/treeitem-expanded.svg +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ach/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/af/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/an/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ar/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ast/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/az/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/be/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/bg/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/bn/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/bo/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/bqi/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/br/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/brx/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/bs/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ca/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/cak/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ckb/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/cs/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/cy/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/da/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/de/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/dsb/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/el/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/en-CA/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/en-GB/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/en-US/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/eo/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/es-AR/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/es-CL/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/es-ES/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/es-MX/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/et/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/eu/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/fa/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ff/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/fi/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/fr/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/fur/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/fy-NL/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ga-IE/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/gd/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/gl/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/gn/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/gu-IN/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/he/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/hi-IN/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/hr/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/hsb/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/hu/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/hy-AM/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/hye/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ia/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/id/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/is/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/it/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ja/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ka/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/kab/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/kk/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/km/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/kn/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ko/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/lij/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/lo/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/locale.json +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/lt/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ltg/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/lv/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/meh/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/mk/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ml/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/mr/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ms/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/my/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/nb-NO/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ne-NP/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/nl/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/nn-NO/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/oc/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/pa-IN/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/pl/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/pt-BR/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/pt-PT/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/rm/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ro/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ru/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sat/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sc/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/scn/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sco/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/si/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sk/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/skr/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sl/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/son/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sq/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sr/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/sv-SE/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/szl/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ta/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/te/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/tg/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/th/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/tl/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/tr/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/trs/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/uk/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/ur/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/uz/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/vi/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/wo/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/xh/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/zh-CN/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/locale/zh-TW/viewer.ftl +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_FOXIT +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_LIBERATION +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/viewer.css +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/viewer.html +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/viewer.mjs +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_JBIG2 +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_OPENJPEG +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_QCMS +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_QCMS +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/jbig2.wasm +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/jbig2_nowasm_fallback.js +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg.wasm +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/qcms_bg.wasm +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.js +0 -0
- {docsmind-0.4.0 → docsmind-0.6.0}/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.wasm +0 -0
|
@@ -2,6 +2,63 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.6.0] - 2026-11-10
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Workspace: clicking a source card or citation chip opens the cited PDF page in a side panel
|
|
10
|
+
next to the chat.
|
|
11
|
+
- Images/Tables galleries: full-view lightbox (blurred backdrop, arrow-key navigation) with
|
|
12
|
+
the full image caption beneath.
|
|
13
|
+
- Chunk preview shows the embedding vector on one truncated line, expandable to the full
|
|
14
|
+
vector (`GET /api/documents/{version_id}/chunks/{chunk_id}/embedding`; chunk list now
|
|
15
|
+
includes `embedding_model`, `embedding_dims`, `embedding_preview`).
|
|
16
|
+
- Agents: clicking a node opens a details panel next to the graph, like the source panel in the
|
|
17
|
+
Workspace. For an agent (the Mind, subagents, router and planner) it shows the description,
|
|
18
|
+
model, step budget, tools, the full system prompt (formatted or raw, with copy), the context
|
|
19
|
+
blocks the harness adds and a description of the user prompt. For a tool it shows the
|
|
20
|
+
description the model reads, which agents can use it and its arguments (type, required,
|
|
21
|
+
default, constraints) with the JSON Schema. Tool chips and "Available to" chips navigate
|
|
22
|
+
between panels; Escape or clicking the empty graph closes it.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- `GET /api/agent`: every agent and stage now includes `system_prompt`, `context` (blocks with
|
|
27
|
+
`label`, `text`, `cached`) and `user_prompt`; every tool now includes `instructions` (the
|
|
28
|
+
description sent to the model) and `parameters` (its JSON Schema), in addition to `name` and
|
|
29
|
+
`description`.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- Image captions are now shown in the gallery and refresh when a captioning job finishes.
|
|
34
|
+
- Captioning prompt no longer marks logos and banners as "decorative".
|
|
35
|
+
|
|
36
|
+
## [0.5.0] - 2026-11-02
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- Agents view is now an interactive graph: the Mind in the centre, its tools around it, and the
|
|
41
|
+
subagents with their own tools beyond. Hover (or tap) a node for its description. Names are
|
|
42
|
+
shown as "Change Analyzer", not `change_analyzer`; the router and planner appear as dashed
|
|
43
|
+
stages of the Mind (one model call, no tools), not as subagents.
|
|
44
|
+
- `GET /api/agent`: `tools` are now `{name, description}` objects (plain-language summaries),
|
|
45
|
+
and a new `stages` list describes the router and planner.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- On-demand enrichment for both pending roadmap items:
|
|
50
|
+
- Embeddings: estimate by token count, confirmation step, resumable run (`docsmind embed`,
|
|
51
|
+
`POST /api/enrichment/embeddings/{estimate,run}`).
|
|
52
|
+
- Image captioning: estimate by image count/resolution + output-token range, confirmation step,
|
|
53
|
+
resumable run (`docsmind caption`, `POST /api/enrichment/captions/{estimate,run}`).
|
|
54
|
+
- Enrichment status + background jobs API:
|
|
55
|
+
`GET /api/enrichment/status`, `GET /api/enrichment/jobs/{job_id}`,
|
|
56
|
+
`POST /api/enrichment/jobs/{job_id}/cancel`.
|
|
57
|
+
- Frontend Document details now shows "not embedded yet" / "not captioned yet" alerts with
|
|
58
|
+
estimate-and-proceed dialogs and job progress/cancel controls.
|
|
59
|
+
- Hybrid retrieval path: keyword search fused with vector similarity when embeddings are present,
|
|
60
|
+
with automatic fallback to keyword-only when embeddings or API access are unavailable.
|
|
61
|
+
|
|
5
62
|
## [0.4.0] - 2026-10-31
|
|
6
63
|
|
|
7
64
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: docsmind
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Chat with your documents. Version-aware retrieval, change analysis, and an editable table workspace, backed by Postgres/pgvector.
|
|
5
5
|
Project-URL: Homepage, https://github.com/yauheniya-ai/docsmind
|
|
6
6
|
Project-URL: Repository, https://github.com/yauheniya-ai/docsmind
|
|
@@ -45,6 +45,8 @@ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
|
45
45
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
46
46
|
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
47
47
|
Requires-Dist: testcontainers[postgres]>=4.4; extra == 'dev'
|
|
48
|
+
Provides-Extra: langfuse
|
|
49
|
+
Requires-Dist: langfuse>=2.0; extra == 'langfuse'
|
|
48
50
|
Provides-Extra: mlflow
|
|
49
51
|
Requires-Dist: mlflow>=2.14; extra == 'mlflow'
|
|
50
52
|
Provides-Extra: openai
|
|
@@ -85,8 +87,8 @@ will perform specialized tasks.
|
|
|
85
87
|
| ✅ Table extraction | Extract and store tables skipping repeating ones (e.g. headers or footers) |
|
|
86
88
|
| ✅ server + UI | FastAPI backend (`docsmind serve`) + React UI (`frontend/`): add documents, browse indexed content, image and table galleries |
|
|
87
89
|
| ✅ Chat agent (the Mind) | Routes each question, plans complex ones, searches/reads your documents with tools, delegates to subagents, and answers with verified `[S#]` citations. Streams to the UI over SSE; conversations are saved |
|
|
88
|
-
|
|
|
89
|
-
|
|
|
90
|
+
| ✅ Image captioning (on demand) | The UI/CLI shows what's uncaptioned, estimates cost from image count/resolution, asks for confirmation, then captions only what's missing |
|
|
91
|
+
| ✅ Embeddings + hybrid search (on demand) | The UI/CLI shows what's unembedded, estimates cost from token counts, asks for confirmation, then embeds only what's missing; search uses keyword+semantic fusion when available |
|
|
90
92
|
| 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
|
|
91
93
|
| 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
|
|
92
94
|
|
|
@@ -99,7 +101,7 @@ pip install "docsmind[all]"
|
|
|
99
101
|
```
|
|
100
102
|
|
|
101
103
|
Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, serves the bundled UI),
|
|
102
|
-
`docsmind[mlflow]` (tracing/eval export). Requires Python 3.10+.
|
|
104
|
+
`docsmind[mlflow]` / `docsmind[langfuse]` (tracing/eval export, planned). Requires Python 3.10+.
|
|
103
105
|
|
|
104
106
|
## Quickstart
|
|
105
107
|
|
|
@@ -226,7 +228,30 @@ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
|
|
|
226
228
|
- **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
|
|
227
229
|
handles are dropped and the rest renumbered by first appearance. Document text is treated as
|
|
228
230
|
untrusted data, never as instructions.
|
|
229
|
-
- **Search** is Postgres full-text (ranked) plus exact-text grep
|
|
231
|
+
- **Search** is Postgres full-text (ranked) plus exact-text grep; when embeddings exist, semantic vector matches are fused in via reciprocal rank fusion.
|
|
232
|
+
|
|
233
|
+
### On-demand enrichment
|
|
234
|
+
|
|
235
|
+
Embeddings and image captions are **not** created during ingest. They are opt-in because they call paid APIs.
|
|
236
|
+
|
|
237
|
+
- In the **Document details** page, warning cards show what's missing ("not embedded yet" / "not captioned yet").
|
|
238
|
+
- Clicking **Estimate & run** opens a confirmation dialog with model, token/image counts, and estimated USD cost.
|
|
239
|
+
- Running is idempotent and resumable: it only processes missing rows; cancel/retry is safe.
|
|
240
|
+
|
|
241
|
+
From CLI:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
docsmind embed [--version-id <id>] [-y]
|
|
245
|
+
docsmind caption [--version-id <id>] [-y]
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
HTTP:
|
|
249
|
+
|
|
250
|
+
- `GET /api/enrichment/status`
|
|
251
|
+
- `POST /api/enrichment/{embeddings|captions}/estimate`
|
|
252
|
+
- `POST /api/enrichment/{embeddings|captions}/run`
|
|
253
|
+
- `GET /api/enrichment/jobs/{job_id}`
|
|
254
|
+
- `POST /api/enrichment/jobs/{job_id}/cancel`
|
|
230
255
|
|
|
231
256
|
Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
|
|
232
257
|
`LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
|
|
@@ -269,6 +294,8 @@ heuristics that work on one PDF break on the next.
|
|
|
269
294
|
| `docsmind doctor` | Check your setup |
|
|
270
295
|
| `docsmind serve [--host] [--port] [--reload]` | Run the FastAPI backend for the `frontend/` UI |
|
|
271
296
|
| `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
|
|
297
|
+
| `docsmind embed [--version-id <id>] [-y]` | Estimate cost and create missing embeddings on demand |
|
|
298
|
+
| `docsmind caption [--version-id <id>] [-y]` | Estimate cost and create missing image captions on demand |
|
|
272
299
|
| `docsmind diff` | Planned |
|
|
273
300
|
|
|
274
301
|
## Architecture
|
|
@@ -319,7 +346,7 @@ over `/api/*`, and loads extracted images/tables straight from disk via `/blobs/
|
|
|
319
346
|
### Design notes
|
|
320
347
|
|
|
321
348
|
- **Ports and adapters, once.** `domain/ports.py` defines every external dependency as a
|
|
322
|
-
`Protocol`. The core never imports `openai`, `anthropic` or `
|
|
349
|
+
`Protocol`. The core never imports `openai`, `anthropic`, `mlflow` or `langfuse` directly. Only
|
|
323
350
|
adapters do, and lazily, so a bare `pip install docsmind` doesn't pull in SDKs you're
|
|
324
351
|
not using.
|
|
325
352
|
- **Text and images share one retrieval path.** An image becomes a chunk
|
|
@@ -28,8 +28,8 @@ will perform specialized tasks.
|
|
|
28
28
|
| ✅ Table extraction | Extract and store tables skipping repeating ones (e.g. headers or footers) |
|
|
29
29
|
| ✅ server + UI | FastAPI backend (`docsmind serve`) + React UI (`frontend/`): add documents, browse indexed content, image and table galleries |
|
|
30
30
|
| ✅ Chat agent (the Mind) | Routes each question, plans complex ones, searches/reads your documents with tools, delegates to subagents, and answers with verified `[S#]` citations. Streams to the UI over SSE; conversations are saved |
|
|
31
|
-
|
|
|
32
|
-
|
|
|
31
|
+
| ✅ Image captioning (on demand) | The UI/CLI shows what's uncaptioned, estimates cost from image count/resolution, asks for confirmation, then captions only what's missing |
|
|
32
|
+
| ✅ Embeddings + hybrid search (on demand) | The UI/CLI shows what's unembedded, estimates cost from token counts, asks for confirmation, then embeds only what's missing; search uses keyword+semantic fusion when available |
|
|
33
33
|
| 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
|
|
34
34
|
| 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
|
|
35
35
|
|
|
@@ -42,7 +42,7 @@ pip install "docsmind[all]"
|
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, serves the bundled UI),
|
|
45
|
-
`docsmind[mlflow]` (tracing/eval export). Requires Python 3.10+.
|
|
45
|
+
`docsmind[mlflow]` / `docsmind[langfuse]` (tracing/eval export, planned). Requires Python 3.10+.
|
|
46
46
|
|
|
47
47
|
## Quickstart
|
|
48
48
|
|
|
@@ -169,7 +169,30 @@ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
|
|
|
169
169
|
- **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
|
|
170
170
|
handles are dropped and the rest renumbered by first appearance. Document text is treated as
|
|
171
171
|
untrusted data, never as instructions.
|
|
172
|
-
- **Search** is Postgres full-text (ranked) plus exact-text grep
|
|
172
|
+
- **Search** is Postgres full-text (ranked) plus exact-text grep; when embeddings exist, semantic vector matches are fused in via reciprocal rank fusion.
|
|
173
|
+
|
|
174
|
+
### On-demand enrichment
|
|
175
|
+
|
|
176
|
+
Embeddings and image captions are **not** created during ingest. They are opt-in because they call paid APIs.
|
|
177
|
+
|
|
178
|
+
- In the **Document details** page, warning cards show what's missing ("not embedded yet" / "not captioned yet").
|
|
179
|
+
- Clicking **Estimate & run** opens a confirmation dialog with model, token/image counts, and estimated USD cost.
|
|
180
|
+
- Running is idempotent and resumable: it only processes missing rows; cancel/retry is safe.
|
|
181
|
+
|
|
182
|
+
From CLI:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
docsmind embed [--version-id <id>] [-y]
|
|
186
|
+
docsmind caption [--version-id <id>] [-y]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
HTTP:
|
|
190
|
+
|
|
191
|
+
- `GET /api/enrichment/status`
|
|
192
|
+
- `POST /api/enrichment/{embeddings|captions}/estimate`
|
|
193
|
+
- `POST /api/enrichment/{embeddings|captions}/run`
|
|
194
|
+
- `GET /api/enrichment/jobs/{job_id}`
|
|
195
|
+
- `POST /api/enrichment/jobs/{job_id}/cancel`
|
|
173
196
|
|
|
174
197
|
Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
|
|
175
198
|
`LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
|
|
@@ -212,6 +235,8 @@ heuristics that work on one PDF break on the next.
|
|
|
212
235
|
| `docsmind doctor` | Check your setup |
|
|
213
236
|
| `docsmind serve [--host] [--port] [--reload]` | Run the FastAPI backend for the `frontend/` UI |
|
|
214
237
|
| `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
|
|
238
|
+
| `docsmind embed [--version-id <id>] [-y]` | Estimate cost and create missing embeddings on demand |
|
|
239
|
+
| `docsmind caption [--version-id <id>] [-y]` | Estimate cost and create missing image captions on demand |
|
|
215
240
|
| `docsmind diff` | Planned |
|
|
216
241
|
|
|
217
242
|
## Architecture
|
|
@@ -262,7 +287,7 @@ over `/api/*`, and loads extracted images/tables straight from disk via `/blobs/
|
|
|
262
287
|
### Design notes
|
|
263
288
|
|
|
264
289
|
- **Ports and adapters, once.** `domain/ports.py` defines every external dependency as a
|
|
265
|
-
`Protocol`. The core never imports `openai`, `anthropic` or `
|
|
290
|
+
`Protocol`. The core never imports `openai`, `anthropic`, `mlflow` or `langfuse` directly. Only
|
|
266
291
|
adapters do, and lazily, so a bare `pip install docsmind` doesn't pull in SDKs you're
|
|
267
292
|
not using.
|
|
268
293
|
- **Text and images share one retrieval path.** An image becomes a chunk
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "docsmind"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.6.0"
|
|
8
8
|
description = "Chat with your documents. Version-aware retrieval, change analysis, and an editable table workspace, backed by Postgres/pgvector."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -46,6 +46,7 @@ openai = ["openai>=1.30"]
|
|
|
46
46
|
anthropic = ["anthropic>=0.34"]
|
|
47
47
|
server = ["fastapi>=0.111", "uvicorn[standard]>=0.30", "python-multipart>=0.0.9"]
|
|
48
48
|
mlflow = ["mlflow>=2.14"]
|
|
49
|
+
langfuse = ["langfuse>=2.0"]
|
|
49
50
|
dev = ["pytest>=8.0", "pytest-asyncio>=0.23", "testcontainers[postgres]>=4.4", "ruff>=0.5", "mypy>=1.10"]
|
|
50
51
|
all = ["docsmind[openai,anthropic,server]"]
|
|
51
52
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Embedding providers. Today: OpenAI (and OpenAI-compatible gateways)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from docsmind.config import DocsmindConfig
|
|
6
|
+
from docsmind.domain.errors import EnrichmentConfigurationError
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_embedder(config: DocsmindConfig):
|
|
10
|
+
if config.embedding_provider == "openai":
|
|
11
|
+
from docsmind.adapters.embeddings.openai_embeddings import OpenAIEmbedder
|
|
12
|
+
|
|
13
|
+
return OpenAIEmbedder(
|
|
14
|
+
api_key=config.openai_api_key,
|
|
15
|
+
model=config.embedding_model,
|
|
16
|
+
dimensions=config.embedding_dimensions,
|
|
17
|
+
base_url=config.openai_base_url,
|
|
18
|
+
batch_size=config.embedding_batch_size,
|
|
19
|
+
)
|
|
20
|
+
raise EnrichmentConfigurationError(
|
|
21
|
+
f"Unknown embedding_provider {config.embedding_provider!r}. Supported: openai."
|
|
22
|
+
)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""OpenAI (and OpenAI-compatible) embeddings adapter. Satisfies `domain.ports.Embedder`."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from docsmind.domain.errors import EnrichmentConfigurationError
|
|
6
|
+
|
|
7
|
+
# The API rejects inputs over 8191 tokens; page chunks are far smaller, but a
|
|
8
|
+
# dense page of tiny text can get there. Truncate rather than fail the batch.
|
|
9
|
+
MAX_INPUT_TOKENS = 8000
|
|
10
|
+
_MAX_REQUEST_TOKENS = 250_000 # API limit is 300k tokens per request
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class OpenAIEmbedder:
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
*,
|
|
17
|
+
api_key: str | None,
|
|
18
|
+
model: str,
|
|
19
|
+
dimensions: int,
|
|
20
|
+
base_url: str | None = None,
|
|
21
|
+
batch_size: int = 64,
|
|
22
|
+
timeout: float = 120.0,
|
|
23
|
+
) -> None:
|
|
24
|
+
if not api_key:
|
|
25
|
+
raise EnrichmentConfigurationError(
|
|
26
|
+
"OpenAI API key is not set. Add DOCSMIND_OPENAI_API_KEY to your .env to create embeddings."
|
|
27
|
+
)
|
|
28
|
+
try:
|
|
29
|
+
from openai import AsyncOpenAI
|
|
30
|
+
except ImportError as exc: # pragma: no cover - import guard
|
|
31
|
+
raise EnrichmentConfigurationError(
|
|
32
|
+
'The openai package is not installed. Run `pip install "docsmind[openai]"`.'
|
|
33
|
+
) from exc
|
|
34
|
+
self.model_name = model
|
|
35
|
+
self.dimensions = dimensions
|
|
36
|
+
self._batch_size = max(1, batch_size)
|
|
37
|
+
self._client = AsyncOpenAI(api_key=api_key, base_url=base_url, max_retries=4, timeout=timeout)
|
|
38
|
+
|
|
39
|
+
async def embed(self, texts: list[str]) -> list[list[float]]:
|
|
40
|
+
vectors: list[list[float]] = []
|
|
41
|
+
for batch in self._batches([_truncate(t) for t in texts]):
|
|
42
|
+
kwargs: dict = {"model": self.model_name, "input": batch}
|
|
43
|
+
# Only the v3 models accept (and need) a `dimensions` argument.
|
|
44
|
+
if "text-embedding-3" in self.model_name:
|
|
45
|
+
kwargs["dimensions"] = self.dimensions
|
|
46
|
+
response = await self._client.embeddings.create(**kwargs)
|
|
47
|
+
ordered = sorted(response.data, key=lambda d: d.index)
|
|
48
|
+
vectors.extend([list(d.embedding) for d in ordered])
|
|
49
|
+
if len(vectors) != len(texts):
|
|
50
|
+
raise RuntimeError(f"Embeddings API returned {len(vectors)} vectors for {len(texts)} inputs.")
|
|
51
|
+
return vectors
|
|
52
|
+
|
|
53
|
+
def _batches(self, texts: list[str]):
|
|
54
|
+
batch: list[str] = []
|
|
55
|
+
tokens = 0
|
|
56
|
+
for text in texts:
|
|
57
|
+
estimate = max(1, len(text) // 3) # conservative: ~3 chars/token
|
|
58
|
+
if batch and (len(batch) >= self._batch_size or tokens + estimate > _MAX_REQUEST_TOKENS):
|
|
59
|
+
yield batch
|
|
60
|
+
batch, tokens = [], 0
|
|
61
|
+
batch.append(text)
|
|
62
|
+
tokens += estimate
|
|
63
|
+
if batch:
|
|
64
|
+
yield batch
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _truncate(text: str) -> str:
|
|
68
|
+
# The API also rejects empty strings; a single space embeds harmlessly.
|
|
69
|
+
text = text if text.strip() else " "
|
|
70
|
+
try:
|
|
71
|
+
import tiktoken
|
|
72
|
+
|
|
73
|
+
encoding = tiktoken.get_encoding("cl100k_base")
|
|
74
|
+
tokens = encoding.encode(text, disallowed_special=())
|
|
75
|
+
if len(tokens) > MAX_INPUT_TOKENS:
|
|
76
|
+
return encoding.decode(tokens[:MAX_INPUT_TOKENS])
|
|
77
|
+
return text
|
|
78
|
+
except Exception: # noqa: BLE001 - fall back to a character cap
|
|
79
|
+
return text[: MAX_INPUT_TOKENS * 3]
|
|
@@ -12,9 +12,10 @@ part of what it does, not the whole of it.
|
|
|
12
12
|
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
15
|
+
import json
|
|
15
16
|
from uuid import UUID
|
|
16
17
|
|
|
17
|
-
from sqlalchemy import bindparam, delete, func, insert, select, text
|
|
18
|
+
from sqlalchemy import Text, bindparam, cast, delete, func, insert, select, text
|
|
18
19
|
from sqlalchemy.dialects.postgresql import ARRAY
|
|
19
20
|
from sqlalchemy.dialects.postgresql import UUID as PGUUID
|
|
20
21
|
|
|
@@ -46,6 +47,9 @@ from docsmind.domain.documents import (
|
|
|
46
47
|
ParsedDocument,
|
|
47
48
|
)
|
|
48
49
|
|
|
50
|
+
# How many leading vector components `get_chunks` returns as a preview.
|
|
51
|
+
_EMBEDDING_PREVIEW_DIMS = 16
|
|
52
|
+
|
|
49
53
|
|
|
50
54
|
class PostgresRepository:
|
|
51
55
|
def __init__(self, config: DocsmindConfig) -> None:
|
|
@@ -205,21 +209,38 @@ class PostgresRepository:
|
|
|
205
209
|
chunk_types: list[str] | None = None,
|
|
206
210
|
limit: int = 10,
|
|
207
211
|
) -> list[Chunk]:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
212
|
+
"""Keyword (full-text) and vector (cosine) results fused with
|
|
213
|
+
reciprocal rank fusion. Falls back to whichever leg has results."""
|
|
214
|
+
from docsmind.domain.documents import ChunkType
|
|
215
|
+
from docsmind.retrieval.fusion import reciprocal_rank_fusion
|
|
216
|
+
from docsmind.retrieval.keyword import build_tsquery
|
|
217
|
+
|
|
218
|
+
pool = max(limit * 3, 20)
|
|
219
|
+
tsquery = build_tsquery(query)
|
|
220
|
+
keyword = (
|
|
221
|
+
await self.keyword_search(tsquery, version_ids=version_ids, limit=pool) if tsquery else []
|
|
216
222
|
)
|
|
223
|
+
vector = await self.vector_search(query_embedding, version_ids=version_ids, limit=pool)
|
|
224
|
+
fused = reciprocal_rank_fusion([keyword, vector], limit=limit * 3 if chunk_types else limit)
|
|
225
|
+
if chunk_types:
|
|
226
|
+
fused = [r for r in fused if r.get("chunk_type", "text") in chunk_types][:limit]
|
|
227
|
+
return [
|
|
228
|
+
Chunk(
|
|
229
|
+
id=r["chunk_id"],
|
|
230
|
+
version_id=r["version_id"],
|
|
231
|
+
chunk_type=ChunkType(r.get("chunk_type", "text")),
|
|
232
|
+
content=r["content"],
|
|
233
|
+
page_start=r["page_start"],
|
|
234
|
+
page_end=r["page_end"],
|
|
235
|
+
)
|
|
236
|
+
for r in fused
|
|
237
|
+
]
|
|
217
238
|
|
|
218
239
|
# -- agent retrieval ------------------------------------------------------
|
|
219
|
-
# Read-only queries the Mind's tools run
|
|
220
|
-
#
|
|
221
|
-
#
|
|
222
|
-
#
|
|
240
|
+
# Read-only queries the Mind's tools run: keyword (Postgres full-text) and,
|
|
241
|
+
# once chunks have embeddings (see `enrichment/`), vector search. Fusion of
|
|
242
|
+
# the two lives in `retrieval/fusion.py`; the tools call these methods,
|
|
243
|
+
# not SQL.
|
|
223
244
|
|
|
224
245
|
async def list_catalog(self, version_ids: list[UUID] | None = None) -> list[dict]:
|
|
225
246
|
"""One row per version (optionally restricted), with the page count
|
|
@@ -260,7 +281,7 @@ class PostgresRepository:
|
|
|
260
281
|
|
|
261
282
|
_SEARCH_SQL = text(
|
|
262
283
|
"""
|
|
263
|
-
SELECT c.id AS chunk_id, c.version_id, c.page_start, c.page_end, c.content,
|
|
284
|
+
SELECT c.id AS chunk_id, c.version_id, c.page_start, c.page_end, c.content, c.chunk_type,
|
|
264
285
|
ts_rank_cd(c.tsv, q.query, 32) AS rank
|
|
265
286
|
FROM chunks c, to_tsquery('english', :query) AS q(query)
|
|
266
287
|
WHERE c.tsv @@ q.query
|
|
@@ -330,6 +351,185 @@ class PostgresRepository:
|
|
|
330
351
|
result = await session.execute(stmt)
|
|
331
352
|
return [dict(row) for row in result.mappings().all()]
|
|
332
353
|
|
|
354
|
+
# -- vector search + on-demand enrichment ---------------------------------
|
|
355
|
+
# Embeddings and image captions are created on demand (`enrichment/`), so
|
|
356
|
+
# every read here has to cope with "nothing embedded yet".
|
|
357
|
+
|
|
358
|
+
_STATUS_SQL = text(
|
|
359
|
+
"""
|
|
360
|
+
SELECT v.id AS version_id,
|
|
361
|
+
(SELECT count(*) FROM chunks c
|
|
362
|
+
WHERE c.version_id = v.id AND c.content <> '') AS chunks_total,
|
|
363
|
+
(SELECT count(*) FROM chunks c
|
|
364
|
+
WHERE c.version_id = v.id AND c.content <> ''
|
|
365
|
+
AND c.embedding IS NOT NULL AND c.embedding_model = :model) AS chunks_embedded,
|
|
366
|
+
(SELECT count(*) FROM images i WHERE i.version_id = v.id) AS images_total,
|
|
367
|
+
(SELECT count(*) FROM images i
|
|
368
|
+
WHERE i.version_id = v.id AND i.caption IS NOT NULL) AS images_captioned
|
|
369
|
+
FROM document_versions v
|
|
370
|
+
WHERE CAST(:filter_versions AS boolean) IS FALSE OR v.id = ANY(:version_ids)
|
|
371
|
+
"""
|
|
372
|
+
).bindparams(bindparam("version_ids", type_=ARRAY(PGUUID(as_uuid=True))))
|
|
373
|
+
|
|
374
|
+
async def enrichment_status(self, model: str, version_ids: list[UUID] | None = None) -> list[dict]:
|
|
375
|
+
"""Per-version counts: embeddable chunks (non-empty text) and how many
|
|
376
|
+
already carry an embedding from `model`; images and how many have a
|
|
377
|
+
caption (an empty caption means "looked at, nothing worth saying")."""
|
|
378
|
+
async with self._sessionmaker() as session:
|
|
379
|
+
result = await session.execute(
|
|
380
|
+
self._STATUS_SQL,
|
|
381
|
+
{"model": model, "filter_versions": version_ids is not None, "version_ids": version_ids or []},
|
|
382
|
+
)
|
|
383
|
+
return [dict(row) for row in result.mappings().all()]
|
|
384
|
+
|
|
385
|
+
_TO_EMBED_SQL = text(
|
|
386
|
+
"""
|
|
387
|
+
SELECT c.id, c.content
|
|
388
|
+
FROM chunks c
|
|
389
|
+
WHERE c.content <> ''
|
|
390
|
+
AND (c.embedding IS NULL OR c.embedding_model IS DISTINCT FROM :model)
|
|
391
|
+
AND (CAST(:filter_versions AS boolean) IS FALSE OR c.version_id = ANY(:version_ids))
|
|
392
|
+
AND (CAST(:after AS uuid) IS NULL OR c.id > CAST(:after AS uuid))
|
|
393
|
+
ORDER BY c.id
|
|
394
|
+
LIMIT :limit
|
|
395
|
+
"""
|
|
396
|
+
).bindparams(
|
|
397
|
+
bindparam("version_ids", type_=ARRAY(PGUUID(as_uuid=True))),
|
|
398
|
+
bindparam("after", type_=PGUUID(as_uuid=True)),
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
async def fetch_chunks_to_embed(
|
|
402
|
+
self,
|
|
403
|
+
model: str,
|
|
404
|
+
*,
|
|
405
|
+
version_ids: list[UUID] | None = None,
|
|
406
|
+
after_id: UUID | None = None,
|
|
407
|
+
limit: int = 200,
|
|
408
|
+
) -> list[dict]:
|
|
409
|
+
"""Chunks that still need an embedding from `model`, ordered by id.
|
|
410
|
+
Pass the last id as `after_id` to page through without writing; when
|
|
411
|
+
writing as you go, just ask for the first page again each time."""
|
|
412
|
+
async with self._sessionmaker() as session:
|
|
413
|
+
result = await session.execute(
|
|
414
|
+
self._TO_EMBED_SQL,
|
|
415
|
+
{
|
|
416
|
+
"model": model,
|
|
417
|
+
"filter_versions": version_ids is not None,
|
|
418
|
+
"version_ids": version_ids or [],
|
|
419
|
+
"after": after_id,
|
|
420
|
+
"limit": limit,
|
|
421
|
+
},
|
|
422
|
+
)
|
|
423
|
+
return [dict(row) for row in result.mappings().all()]
|
|
424
|
+
|
|
425
|
+
async def save_embeddings(self, items: list[tuple[UUID, list[float]]], model: str) -> None:
|
|
426
|
+
if not items:
|
|
427
|
+
return
|
|
428
|
+
stmt = (
|
|
429
|
+
chunks_table.update()
|
|
430
|
+
.where(chunks_table.c.id == bindparam("b_id"))
|
|
431
|
+
.values(embedding=bindparam("b_embedding"), embedding_model=bindparam("b_model"))
|
|
432
|
+
)
|
|
433
|
+
async with self._sessionmaker() as session:
|
|
434
|
+
await session.execute(
|
|
435
|
+
stmt, [{"b_id": cid, "b_embedding": vec, "b_model": model} for cid, vec in items]
|
|
436
|
+
)
|
|
437
|
+
await session.commit()
|
|
438
|
+
|
|
439
|
+
async def count_embedded(self, model: str, version_ids: list[UUID] | None = None) -> int:
|
|
440
|
+
stmt = select(func.count()).select_from(chunks_table).where(
|
|
441
|
+
chunks_table.c.embedding.is_not(None), chunks_table.c.embedding_model == model
|
|
442
|
+
)
|
|
443
|
+
if version_ids is not None:
|
|
444
|
+
stmt = stmt.where(chunks_table.c.version_id.in_(version_ids))
|
|
445
|
+
async with self._sessionmaker() as session:
|
|
446
|
+
return int((await session.execute(stmt)).scalar_one())
|
|
447
|
+
|
|
448
|
+
async def vector_search(
|
|
449
|
+
self,
|
|
450
|
+
embedding: list[float],
|
|
451
|
+
*,
|
|
452
|
+
model: str | None = None,
|
|
453
|
+
version_ids: list[UUID] | None = None,
|
|
454
|
+
limit: int = 10,
|
|
455
|
+
) -> list[dict]:
|
|
456
|
+
"""Nearest chunks by cosine distance, same row shape as `keyword_search`.
|
|
457
|
+
|
|
458
|
+
Queries `embedding::halfvec(N)` because that is what the HNSW index is
|
|
459
|
+
built on (migration 0001) — pgvector indexes cap at 2000 dimensions
|
|
460
|
+
for `vector` but 4000 for `halfvec`.
|
|
461
|
+
"""
|
|
462
|
+
dims = int(self.config.embedding_dimensions)
|
|
463
|
+
literal = "[" + ",".join(f"{x:.7g}" for x in embedding) + "]"
|
|
464
|
+
sql = text(
|
|
465
|
+
f"""
|
|
466
|
+
SELECT c.id AS chunk_id, c.version_id, c.page_start, c.page_end, c.content, c.chunk_type,
|
|
467
|
+
(c.embedding::halfvec({dims}) <=> CAST(:q AS halfvec({dims}))) AS distance
|
|
468
|
+
FROM chunks c
|
|
469
|
+
WHERE c.embedding IS NOT NULL
|
|
470
|
+
AND (CAST(:model AS text) IS NULL OR c.embedding_model = CAST(:model AS text))
|
|
471
|
+
AND (CAST(:filter_versions AS boolean) IS FALSE OR c.version_id = ANY(:version_ids))
|
|
472
|
+
ORDER BY c.embedding::halfvec({dims}) <=> CAST(:q AS halfvec({dims}))
|
|
473
|
+
LIMIT :limit
|
|
474
|
+
"""
|
|
475
|
+
).bindparams(bindparam("version_ids", type_=ARRAY(PGUUID(as_uuid=True))))
|
|
476
|
+
async with self._sessionmaker() as session:
|
|
477
|
+
result = await session.execute(
|
|
478
|
+
sql,
|
|
479
|
+
{
|
|
480
|
+
"q": literal,
|
|
481
|
+
"model": model,
|
|
482
|
+
"filter_versions": version_ids is not None,
|
|
483
|
+
"version_ids": version_ids or [],
|
|
484
|
+
"limit": limit,
|
|
485
|
+
},
|
|
486
|
+
)
|
|
487
|
+
return [dict(row) for row in result.mappings().all()]
|
|
488
|
+
|
|
489
|
+
async def fetch_images_to_caption(
|
|
490
|
+
self, *, version_ids: list[UUID] | None = None, after_id: UUID | None = None, limit: int = 200
|
|
491
|
+
) -> list[dict]:
|
|
492
|
+
stmt = (
|
|
493
|
+
select(
|
|
494
|
+
images_table.c.id,
|
|
495
|
+
images_table.c.version_id,
|
|
496
|
+
images_table.c.page_number,
|
|
497
|
+
images_table.c.uri,
|
|
498
|
+
images_table.c.width,
|
|
499
|
+
images_table.c.height,
|
|
500
|
+
images_table.c.format,
|
|
501
|
+
)
|
|
502
|
+
.where(images_table.c.caption.is_(None))
|
|
503
|
+
.order_by(images_table.c.id)
|
|
504
|
+
.limit(limit)
|
|
505
|
+
)
|
|
506
|
+
if version_ids is not None:
|
|
507
|
+
stmt = stmt.where(images_table.c.version_id.in_(version_ids))
|
|
508
|
+
if after_id is not None:
|
|
509
|
+
stmt = stmt.where(images_table.c.id > after_id)
|
|
510
|
+
async with self._sessionmaker() as session:
|
|
511
|
+
result = await session.execute(stmt)
|
|
512
|
+
return [dict(row) for row in result.mappings().all()]
|
|
513
|
+
|
|
514
|
+
async def save_caption(self, image_id: UUID, caption: str, model: str) -> None:
|
|
515
|
+
"""Record a caption and make it searchable: the image's chunk gets the
|
|
516
|
+
caption as its content (the generated `tsv` follows) and loses any old
|
|
517
|
+
embedding so the next embed run picks it up. An empty caption just
|
|
518
|
+
marks the image as handled (too small, or decorative)."""
|
|
519
|
+
async with self._sessionmaker() as session:
|
|
520
|
+
await session.execute(
|
|
521
|
+
images_table.update()
|
|
522
|
+
.where(images_table.c.id == image_id)
|
|
523
|
+
.values(caption=caption, caption_model=model, captioned_at=func.now())
|
|
524
|
+
)
|
|
525
|
+
if caption:
|
|
526
|
+
await session.execute(
|
|
527
|
+
chunks_table.update()
|
|
528
|
+
.where(chunks_table.c.image_id == image_id, chunks_table.c.chunk_type == "image")
|
|
529
|
+
.values(content=caption, embedding=None, embedding_model=None)
|
|
530
|
+
)
|
|
531
|
+
await session.commit()
|
|
532
|
+
|
|
333
533
|
# -- read helpers, mainly for sanity-checking what actually landed -------
|
|
334
534
|
|
|
335
535
|
async def count_chunks(self, version_id: UUID) -> int:
|
|
@@ -465,7 +665,11 @@ class PostgresRepository:
|
|
|
465
665
|
async def get_chunks(self, version_id: UUID, *, page: int | None = None) -> list[dict]:
|
|
466
666
|
"""Chunks for one version, in page order. Pass `page` to see only
|
|
467
667
|
one page's chunk(s) — most pages are exactly one chunk; a dense page
|
|
468
|
-
may be several.
|
|
668
|
+
may be several.
|
|
669
|
+
|
|
670
|
+
Embedded chunks also carry `embedding_model`, `embedding_dims` and a
|
|
671
|
+
short `embedding_preview` (the first few components); the full vector
|
|
672
|
+
is served by `get_chunk_embedding`, so listing stays small."""
|
|
469
673
|
async with self._sessionmaker() as session:
|
|
470
674
|
stmt = (
|
|
471
675
|
select(
|
|
@@ -475,6 +679,9 @@ class PostgresRepository:
|
|
|
475
679
|
chunks_table.c.image_id,
|
|
476
680
|
chunks_table.c.page_start,
|
|
477
681
|
chunks_table.c.page_end,
|
|
682
|
+
chunks_table.c.embedding_model,
|
|
683
|
+
# pgvector's text form ("[0.1,0.2,...]") is valid JSON.
|
|
684
|
+
cast(chunks_table.c.embedding, Text).label("embedding_text"),
|
|
478
685
|
)
|
|
479
686
|
.where(chunks_table.c.version_id == version_id)
|
|
480
687
|
.order_by(chunks_table.c.page_start)
|
|
@@ -482,7 +689,28 @@ class PostgresRepository:
|
|
|
482
689
|
if page is not None:
|
|
483
690
|
stmt = stmt.where(chunks_table.c.page_start == page)
|
|
484
691
|
result = await session.execute(stmt)
|
|
485
|
-
|
|
692
|
+
rows = []
|
|
693
|
+
for row in result.mappings().all():
|
|
694
|
+
item = dict(row)
|
|
695
|
+
raw = item.pop("embedding_text")
|
|
696
|
+
if raw is None:
|
|
697
|
+
item["embedding_dims"] = None
|
|
698
|
+
item["embedding_preview"] = None
|
|
699
|
+
else:
|
|
700
|
+
vector = json.loads(raw)
|
|
701
|
+
item["embedding_dims"] = len(vector)
|
|
702
|
+
item["embedding_preview"] = vector[:_EMBEDDING_PREVIEW_DIMS]
|
|
703
|
+
rows.append(item)
|
|
704
|
+
return rows
|
|
705
|
+
|
|
706
|
+
async def get_chunk_embedding(self, version_id: UUID, chunk_id: UUID) -> list[float] | None:
|
|
707
|
+
"""The full embedding vector of one chunk, or None if it has none."""
|
|
708
|
+
async with self._sessionmaker() as session:
|
|
709
|
+
stmt = select(cast(chunks_table.c.embedding, Text)).where(
|
|
710
|
+
chunks_table.c.version_id == version_id, chunks_table.c.id == chunk_id
|
|
711
|
+
)
|
|
712
|
+
raw = (await session.execute(stmt)).scalar_one_or_none()
|
|
713
|
+
return None if raw is None else json.loads(raw)
|
|
486
714
|
|
|
487
715
|
async def get_images(self, version_id: UUID) -> list[dict]:
|
|
488
716
|
"""Saved images for one version, in page order — `uri` is a
|