docsmind 0.6.0__tar.gz → 0.8.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.6.0 → docsmind-0.8.0}/.gitignore +2 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/CHANGELOG.md +61 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/PKG-INFO +43 -8
- {docsmind-0.6.0 → docsmind-0.8.0}/README.md +41 -7
- {docsmind-0.6.0 → docsmind-0.8.0}/pyproject.toml +2 -1
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/__init__.py +4 -4
- docsmind-0.8.0/src/docsmind/adapters/storage/memory.py +151 -0
- docsmind-0.8.0/src/docsmind/adapters/storage/postgres/change_store.py +189 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/tables.py +43 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/vision/__init__.py +1 -2
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/vision/captioners.py +35 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/agent.py +139 -49
- docsmind-0.8.0/src/docsmind/agent/prompts.py +222 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/analyzer.py +501 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/changelog.py +116 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/env.py +134 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/export.py +38 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/prep.py +376 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/report.py +277 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/rows.py +165 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/scan.py +129 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/verify.py +273 -0
- docsmind-0.8.0/src/docsmind/agent/subagents/specs.py +37 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/__init__.py +10 -2
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/base.py +28 -4
- docsmind-0.8.0/src/docsmind/agent/tools/change.py +296 -0
- docsmind-0.8.0/src/docsmind/agent/tools/delegate.py +73 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/documents.py +14 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/search.py +24 -7
- docsmind-0.8.0/src/docsmind/agent/tools/web.py +287 -0
- docsmind-0.8.0/src/docsmind/cli/diff.py +47 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/client.py +8 -7
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/config.py +41 -4
- docsmind-0.8.0/src/docsmind/domain/changes.py +191 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/ports.py +43 -1
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/enrichment/service.py +3 -4
- {docsmind-0.6.0/src/docsmind/enrichment → docsmind-0.8.0/src/docsmind}/pricing.py +62 -29
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/keyword.py +3 -1
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/app.py +2 -1
- docsmind-0.8.0/src/docsmind/server/routes/changes.py +143 -0
- docsmind-0.6.0/src/docsmind/server/ui/assets/index-CqXag2rP.js → docsmind-0.8.0/src/docsmind/server/ui/assets/index-CjtHVXLG.js +118 -117
- docsmind-0.8.0/src/docsmind/server/ui/assets/index-FgGWK0Rs.css +1 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/index.html +2 -2
- docsmind-0.6.0/src/docsmind/adapters/storage/memory.py +0 -83
- docsmind-0.6.0/src/docsmind/agent/prompts.py +0 -93
- docsmind-0.6.0/src/docsmind/agent/subagents/specs.py +0 -44
- docsmind-0.6.0/src/docsmind/agent/tools/delegate.py +0 -49
- docsmind-0.6.0/src/docsmind/cli/diff.py +0 -32
- docsmind-0.6.0/src/docsmind/domain/changes.py +0 -66
- docsmind-0.6.0/src/docsmind/server/ui/assets/index-QYKdGecG.css +0 -1
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/blobs/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/blobs/filesystem.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/embeddings/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/embeddings/openai_embeddings.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/llm/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/llm/anthropic_llm.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/llm/openai_llm.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/agent_store.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/engine.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/repository.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/tracing/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/catalog.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/context.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/memory.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/summarizer.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/tokens.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/loop.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/orchestrator.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/planner.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/sources.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/subagents/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/subagents/change_analysis/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/util.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/app.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/chat.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/db.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/doctor.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/enrich.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/ingest.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/inspect.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/serve.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/agent.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/citations.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/documents.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/errors.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/tables.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/enrichment/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/chunking/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/chunking/page.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/chunking/structural.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/enrichment/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/parsers/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/parsers/pdf.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/pipeline.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/py.typed +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/fusion.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/hybrid.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/jobs.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/__init__.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/chat.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/documents.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/enrichment.py +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/favicon.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/LICENSE +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Katakana.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/LICENSE +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Roman.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/V.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/iccs/LICENSE +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_add.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_disclaimer.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_done.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_spinner.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_warning.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-check.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-comment.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-help.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-insert.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-key.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-newparagraph.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-noicon.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-note.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-paperclip.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-paragraph.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-pushpin.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/checkmark.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-actionsButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-closeButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-editButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-popup-editButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeHighlight.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeText.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorInk.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorTextHighlight.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-delete.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-edit.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/findbarButton-next.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/findbarButton-previous.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/gv-toolbarButton-download.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/loading-icon.gif +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/loading.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_closingButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_info.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_warning.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_closeButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_selected.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_viewArrow.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_viewButton.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-handTool.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/signature-properties-row-check.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-bookmark.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-download.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorFreeText.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorHighlight.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorInk.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorSignature.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorStamp.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrow.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrowNova.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-openFile.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageDown.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageUp.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-presentationMode.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-print.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-search.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesError.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesVerified.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewAttachments.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewLayers.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewOutline.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewThumbnail.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomIn.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomOut.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/treeitem-collapsed.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/treeitem-expanded.svg +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ach/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/af/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/an/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ar/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ast/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/az/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/be/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bg/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bn/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bo/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bqi/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/br/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/brx/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bs/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ca/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/cak/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ckb/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/cs/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/cy/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/da/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/de/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/dsb/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/el/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/en-CA/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/en-GB/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/en-US/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/eo/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-AR/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-CL/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-ES/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-MX/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/et/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/eu/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fa/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ff/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fi/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fr/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fur/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fy-NL/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ga-IE/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gd/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gl/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gn/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gu-IN/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/he/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hi-IN/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hr/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hsb/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hu/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hy-AM/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hye/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ia/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/id/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/is/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/it/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ja/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ka/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/kab/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/kk/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/km/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/kn/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ko/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lij/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lo/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/locale.json +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lt/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ltg/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lv/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/meh/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/mk/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ml/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/mr/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ms/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/my/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/nb-NO/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ne-NP/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/nl/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/nn-NO/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/oc/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pa-IN/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pl/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pt-BR/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pt-PT/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/rm/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ro/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ru/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sat/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sc/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/scn/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sco/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/si/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sk/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/skr/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sl/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/son/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sq/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sr/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sv-SE/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/szl/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ta/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/te/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/tg/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/th/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/tl/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/tr/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/trs/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/uk/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ur/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/uz/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/vi/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/wo/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/xh/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/zh-CN/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/zh-TW/viewer.ftl +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_FOXIT +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_LIBERATION +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/viewer.css +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/viewer.html +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/viewer.mjs +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_JBIG2 +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_OPENJPEG +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_QCMS +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_QCMS +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/jbig2.wasm +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/jbig2_nowasm_fallback.js +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg.wasm +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/qcms_bg.wasm +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.js +0 -0
- {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.wasm +0 -0
|
@@ -2,6 +2,67 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.8.0] - 2026-11-12
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Change Analyzer rebuilt as a code-driven pipeline (`agent/subagents/change_analysis/`) that the
|
|
10
|
+
Mind starts with `delegate`. Given the current and the previous version, it:
|
|
11
|
+
1. normalizes both texts and diffs them in code (headers, footers and page numbers removed);
|
|
12
|
+
2. checks that they are versions of one document and which is newer (a small model call);
|
|
13
|
+
3. scans for changes with one long-context call per part, streaming rows into the table;
|
|
14
|
+
4. verifies every compliance-relevant row (new, modified or removed, normative, with a
|
|
15
|
+
requirement) in a small tool loop, and re-checks the quoted proof against the stored text
|
|
16
|
+
in code: passages must be verbatim, pages must hold them, and a "new" or "removed" claim
|
|
17
|
+
must be absent from the other version. A check that goes wrong (no usable answer, an error,
|
|
18
|
+
a proof that is not in the text) is started again, up to `CHANGE_VERIFY_MAX_RETRIES` times.
|
|
19
|
+
Rows without proof are dropped: they are not in the table, the report or the database;
|
|
20
|
+
5. searches for a changelog in parallel (in the documents, and online for public ones) and
|
|
21
|
+
checks the entries that no row explains;
|
|
22
|
+
6. writes a report: narrative from the model, every countable section built by code. Page
|
|
23
|
+
references in it ("A p.12") are clickable and open that page of that version; in the Mind's
|
|
24
|
+
answer they become `[S#]` citations.
|
|
25
|
+
- Change tables are stored (migration `0005`: `change_analyses`, `change_rows`) with a verified
|
|
26
|
+
flag, proof passages with pages and a human approved flag. Run `docsmind db upgrade`.
|
|
27
|
+
- Routes `/api/changes`: read an analysis, add, edit and delete rows, Excel export.
|
|
28
|
+
- Tools: `page_vision` (a vision model reads a page image), `load_table` (xlsx/csv from a URL,
|
|
29
|
+
parsed in code) for the Change Analyzer; `export_excel` for the Mind.
|
|
30
|
+
- `docsmind diff` now prints the table and report; `--actionable` and `--xlsx` options.
|
|
31
|
+
- Config: the `change_*` settings (see `.env.example`). Dependency: `openpyxl`.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- `compare()` / `acompare()` return a `ChangeResult` (message, analysis, rows). The two versions
|
|
36
|
+
may be given in either order.
|
|
37
|
+
|
|
38
|
+
### Removed
|
|
39
|
+
|
|
40
|
+
- The `researcher` subagent (code, prompt, tests and UI). `change_analyzer` is now the only
|
|
41
|
+
subagent.
|
|
42
|
+
- The generic subagent loop and `agent_subagent_max_steps`; the Change Analyzer has its own limits.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
## [0.7.0] - 2026-11-12
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- Change Analyzer can now look for a published changelog online when the documents themselves
|
|
50
|
+
contain none, using two new subagent-only tools:
|
|
51
|
+
- `web_search`: searches the web via Tavily, optionally limited to given domains. Only offered
|
|
52
|
+
when `DOCSMIND_WEB_SEARCH_API_KEY` is set.
|
|
53
|
+
- `fetch_url`: reads a public web page as text. Hardened for model-supplied URLs (http(s) on
|
|
54
|
+
ports 80/443 only, no credentials, no private/loopback addresses on any redirect hop,
|
|
55
|
+
bounded size and time).
|
|
56
|
+
- Config: `web_search_api_key`, `web_timeout_s`, `web_fetch_max_bytes` (documented in
|
|
57
|
+
`.env.example`).
|
|
58
|
+
- Implementation brief for the Change Analyzer (`docs/`) and unit tests for the web tools.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- Change Analyzer prompt and tool list updated to use the web tools as a fallback, preferring
|
|
63
|
+
the publisher's own domain.
|
|
64
|
+
- Rebuilt the bundled frontend UI assets.
|
|
65
|
+
|
|
5
66
|
## [0.6.0] - 2026-11-10
|
|
6
67
|
|
|
7
68
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: docsmind
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.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
|
|
@@ -22,6 +22,7 @@ Requires-Dist: alembic>=1.13
|
|
|
22
22
|
Requires-Dist: asyncpg>=0.29
|
|
23
23
|
Requires-Dist: httpx>=0.27
|
|
24
24
|
Requires-Dist: imagehash>=4.3
|
|
25
|
+
Requires-Dist: openpyxl>=3.1
|
|
25
26
|
Requires-Dist: pgvector>=0.2.5
|
|
26
27
|
Requires-Dist: pillow>=10.0
|
|
27
28
|
Requires-Dist: pydantic-settings>=2.2
|
|
@@ -89,7 +90,7 @@ will perform specialized tasks.
|
|
|
89
90
|
| ✅ 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 |
|
|
90
91
|
| ✅ 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
92
|
| ✅ 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 |
|
|
92
|
-
|
|
|
93
|
+
| ✅ Change analysis | Compare two versions: a table of changes (new, modified, removed, editorial, relocated) with compliance requirements, each compliance-relevant row verified against the text with verbatim proof; a report; Excel export. `docsmind diff`, or ask the Mind in chat |
|
|
93
94
|
| 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
|
|
94
95
|
|
|
95
96
|
## Install
|
|
@@ -202,7 +203,7 @@ docsmind chat # REPL, keeps the con
|
|
|
202
203
|
```python
|
|
203
204
|
result = dm.chat_result("What are our data retention obligations?")
|
|
204
205
|
print(result.answer, result.citations)
|
|
205
|
-
|
|
206
|
+
result = dm.compare(v2.id, v1.id) # ChangeResult: message, analysis, rows (current, previous)
|
|
206
207
|
```
|
|
207
208
|
|
|
208
209
|
## How the Mind works
|
|
@@ -221,8 +222,8 @@ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
|
|
|
221
222
|
- **Executor**: a bounded tool loop (`search`, `grep`, `read_pages`, `get_outline`,
|
|
222
223
|
`list_documents`, `delegate`). The last step forces an answer; tool errors go back to the
|
|
223
224
|
model, not the user; old tool results are elided when the context grows.
|
|
224
|
-
- **Subagents** (`
|
|
225
|
-
|
|
225
|
+
- **Subagents** (`change_analyzer`): see [Change analysis](#change-analysis). It cannot delegate
|
|
226
|
+
further.
|
|
226
227
|
- **Harness**: deterministic code, not another agent. It orders the prompt stable-first so the
|
|
227
228
|
prefix caches, summarizes long histories, and saves durable notes to memory after each answer.
|
|
228
229
|
- **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
|
|
@@ -230,6 +231,38 @@ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
|
|
|
230
231
|
untrusted data, never as instructions.
|
|
231
232
|
- **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
|
|
|
234
|
+
### Change analysis
|
|
235
|
+
|
|
236
|
+
The Change Analyzer compares the **current** version (A) with the **previous** one (B). The Mind
|
|
237
|
+
starts it with `delegate`; the steps run in code, with models used inside them:
|
|
238
|
+
|
|
239
|
+
1. **Prepare** (code): headers, footers and page numbers are removed, the texts are split into
|
|
240
|
+
sentences and diffed. Identical texts stop here. Below `CHANGE_DIFF_THRESHOLD` of changed
|
|
241
|
+
sentences the scan sees A plus the diff, otherwise A and B in full; long documents are split
|
|
242
|
+
into parts.
|
|
243
|
+
2. **Versions check** (small model): are these versions of one document, which is newer, is it
|
|
244
|
+
public? Unrelated documents stop here.
|
|
245
|
+
3. **Scan** (one long-context call per part): rows stream into the table as JSONL. A cut-off or
|
|
246
|
+
broken call is relaunched with the rows so far.
|
|
247
|
+
4. **Verify**: every compliance-relevant row (new/modified/removed, with a normative
|
|
248
|
+
requirement) gets its own small tool loop. Code then re-checks what the model claims: proof
|
|
249
|
+
passages must be verbatim in the stored text, the page must hold the passage, and a "new" or
|
|
250
|
+
"removed" clause must be absent from the other version. A check that goes wrong is started
|
|
251
|
+
again (up to `CHANGE_VERIFY_MAX_RETRIES`). Rows without proof are dropped: not in the table,
|
|
252
|
+
the report or the database.
|
|
253
|
+
5. **Changelog** (in parallel with the scan): looked for in the documents and, for public ones,
|
|
254
|
+
online. Entries that no row explains are checked against both versions.
|
|
255
|
+
6. **Report**: the narrative is written by the model, every countable section by code. Page
|
|
256
|
+
references ("A p.12") are clickable; in the Mind's answer they are `[S#]` citations.
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
docsmind diff <version-a> <version-b> [--actionable] [--xlsx table.xlsx] # order does not matter
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
The table, report and row edits are served by `GET /api/changes`, `GET /api/changes/{id}`,
|
|
263
|
+
`POST|PATCH|DELETE /api/changes/{id}/rows[/{row_id}]` and `GET /api/changes/{id}/export.xlsx`.
|
|
264
|
+
Tuning: the `CHANGE_*` settings in `.env.example`. Needs `docsmind db upgrade` (migration 0005).
|
|
265
|
+
|
|
233
266
|
### On-demand enrichment
|
|
234
267
|
|
|
235
268
|
Embeddings and image captions are **not** created during ingest. They are opt-in because they call paid APIs.
|
|
@@ -254,11 +287,13 @@ HTTP:
|
|
|
254
287
|
- `POST /api/enrichment/jobs/{job_id}/cancel`
|
|
255
288
|
|
|
256
289
|
Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
|
|
257
|
-
`LLM_MODEL`), `AGENT_MAX_STEPS`, `
|
|
290
|
+
`LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
|
|
258
291
|
`OPENAI_REASONING_EFFORT`, `OPENAI_BASE_URL`. See `.env.example`.
|
|
259
292
|
|
|
260
293
|
HTTP: `POST /api/chat` streams Server-Sent Events (`route`, `plan`, `tool_start`, `tool_end`,
|
|
261
|
-
`subagent_start`, `subagent_end`, `
|
|
294
|
+
`subagent_start`, `subagent_end`, `analysis_start`, `analysis_status`, `change_row`,
|
|
295
|
+
`change_row_update`, `change_row_removed`, `analysis_done`, `token`, `note`, `answer`, `error`,
|
|
296
|
+
`done`);
|
|
262
297
|
`GET /api/conversations[/{id}]`, `DELETE /api/conversations/{id}`, `GET /api/agent`.
|
|
263
298
|
|
|
264
299
|
## How ingestion works
|
|
@@ -296,7 +331,7 @@ heuristics that work on one PDF break on the next.
|
|
|
296
331
|
| `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
|
|
297
332
|
| `docsmind embed [--version-id <id>] [-y]` | Estimate cost and create missing embeddings on demand |
|
|
298
333
|
| `docsmind caption [--version-id <id>] [-y]` | Estimate cost and create missing image captions on demand |
|
|
299
|
-
| `docsmind diff` |
|
|
334
|
+
| `docsmind diff <a> <b> [--actionable] [--xlsx <file>]` | Compare two versions: change table, report, optional Excel file |
|
|
300
335
|
|
|
301
336
|
## Architecture
|
|
302
337
|
|
|
@@ -30,7 +30,7 @@ will perform specialized tasks.
|
|
|
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
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
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 | Compare two versions: a table of changes (new, modified, removed, editorial, relocated) with compliance requirements, each compliance-relevant row verified against the text with verbatim proof; a report; Excel export. `docsmind diff`, or ask the Mind in chat |
|
|
34
34
|
| 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
|
|
35
35
|
|
|
36
36
|
## Install
|
|
@@ -143,7 +143,7 @@ docsmind chat # REPL, keeps the con
|
|
|
143
143
|
```python
|
|
144
144
|
result = dm.chat_result("What are our data retention obligations?")
|
|
145
145
|
print(result.answer, result.citations)
|
|
146
|
-
|
|
146
|
+
result = dm.compare(v2.id, v1.id) # ChangeResult: message, analysis, rows (current, previous)
|
|
147
147
|
```
|
|
148
148
|
|
|
149
149
|
## How the Mind works
|
|
@@ -162,8 +162,8 @@ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
|
|
|
162
162
|
- **Executor**: a bounded tool loop (`search`, `grep`, `read_pages`, `get_outline`,
|
|
163
163
|
`list_documents`, `delegate`). The last step forces an answer; tool errors go back to the
|
|
164
164
|
model, not the user; old tool results are elided when the context grows.
|
|
165
|
-
- **Subagents** (`
|
|
166
|
-
|
|
165
|
+
- **Subagents** (`change_analyzer`): see [Change analysis](#change-analysis). It cannot delegate
|
|
166
|
+
further.
|
|
167
167
|
- **Harness**: deterministic code, not another agent. It orders the prompt stable-first so the
|
|
168
168
|
prefix caches, summarizes long histories, and saves durable notes to memory after each answer.
|
|
169
169
|
- **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
|
|
@@ -171,6 +171,38 @@ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
|
|
|
171
171
|
untrusted data, never as instructions.
|
|
172
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
173
|
|
|
174
|
+
### Change analysis
|
|
175
|
+
|
|
176
|
+
The Change Analyzer compares the **current** version (A) with the **previous** one (B). The Mind
|
|
177
|
+
starts it with `delegate`; the steps run in code, with models used inside them:
|
|
178
|
+
|
|
179
|
+
1. **Prepare** (code): headers, footers and page numbers are removed, the texts are split into
|
|
180
|
+
sentences and diffed. Identical texts stop here. Below `CHANGE_DIFF_THRESHOLD` of changed
|
|
181
|
+
sentences the scan sees A plus the diff, otherwise A and B in full; long documents are split
|
|
182
|
+
into parts.
|
|
183
|
+
2. **Versions check** (small model): are these versions of one document, which is newer, is it
|
|
184
|
+
public? Unrelated documents stop here.
|
|
185
|
+
3. **Scan** (one long-context call per part): rows stream into the table as JSONL. A cut-off or
|
|
186
|
+
broken call is relaunched with the rows so far.
|
|
187
|
+
4. **Verify**: every compliance-relevant row (new/modified/removed, with a normative
|
|
188
|
+
requirement) gets its own small tool loop. Code then re-checks what the model claims: proof
|
|
189
|
+
passages must be verbatim in the stored text, the page must hold the passage, and a "new" or
|
|
190
|
+
"removed" clause must be absent from the other version. A check that goes wrong is started
|
|
191
|
+
again (up to `CHANGE_VERIFY_MAX_RETRIES`). Rows without proof are dropped: not in the table,
|
|
192
|
+
the report or the database.
|
|
193
|
+
5. **Changelog** (in parallel with the scan): looked for in the documents and, for public ones,
|
|
194
|
+
online. Entries that no row explains are checked against both versions.
|
|
195
|
+
6. **Report**: the narrative is written by the model, every countable section by code. Page
|
|
196
|
+
references ("A p.12") are clickable; in the Mind's answer they are `[S#]` citations.
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
docsmind diff <version-a> <version-b> [--actionable] [--xlsx table.xlsx] # order does not matter
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The table, report and row edits are served by `GET /api/changes`, `GET /api/changes/{id}`,
|
|
203
|
+
`POST|PATCH|DELETE /api/changes/{id}/rows[/{row_id}]` and `GET /api/changes/{id}/export.xlsx`.
|
|
204
|
+
Tuning: the `CHANGE_*` settings in `.env.example`. Needs `docsmind db upgrade` (migration 0005).
|
|
205
|
+
|
|
174
206
|
### On-demand enrichment
|
|
175
207
|
|
|
176
208
|
Embeddings and image captions are **not** created during ingest. They are opt-in because they call paid APIs.
|
|
@@ -195,11 +227,13 @@ HTTP:
|
|
|
195
227
|
- `POST /api/enrichment/jobs/{job_id}/cancel`
|
|
196
228
|
|
|
197
229
|
Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
|
|
198
|
-
`LLM_MODEL`), `AGENT_MAX_STEPS`, `
|
|
230
|
+
`LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
|
|
199
231
|
`OPENAI_REASONING_EFFORT`, `OPENAI_BASE_URL`. See `.env.example`.
|
|
200
232
|
|
|
201
233
|
HTTP: `POST /api/chat` streams Server-Sent Events (`route`, `plan`, `tool_start`, `tool_end`,
|
|
202
|
-
`subagent_start`, `subagent_end`, `
|
|
234
|
+
`subagent_start`, `subagent_end`, `analysis_start`, `analysis_status`, `change_row`,
|
|
235
|
+
`change_row_update`, `change_row_removed`, `analysis_done`, `token`, `note`, `answer`, `error`,
|
|
236
|
+
`done`);
|
|
203
237
|
`GET /api/conversations[/{id}]`, `DELETE /api/conversations/{id}`, `GET /api/agent`.
|
|
204
238
|
|
|
205
239
|
## How ingestion works
|
|
@@ -237,7 +271,7 @@ heuristics that work on one PDF break on the next.
|
|
|
237
271
|
| `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
|
|
238
272
|
| `docsmind embed [--version-id <id>] [-y]` | Estimate cost and create missing embeddings on demand |
|
|
239
273
|
| `docsmind caption [--version-id <id>] [-y]` | Estimate cost and create missing image captions on demand |
|
|
240
|
-
| `docsmind diff` |
|
|
274
|
+
| `docsmind diff <a> <b> [--actionable] [--xlsx <file>]` | Compare two versions: change table, report, optional Excel file |
|
|
241
275
|
|
|
242
276
|
## Architecture
|
|
243
277
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "docsmind"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.8.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"
|
|
@@ -39,6 +39,7 @@ dependencies = [
|
|
|
39
39
|
"imagehash>=4.3",
|
|
40
40
|
"rich>=13.7",
|
|
41
41
|
"tiktoken>=0.7",
|
|
42
|
+
"openpyxl>=3.1",
|
|
42
43
|
]
|
|
43
44
|
|
|
44
45
|
[project.optional-dependencies]
|
|
@@ -6,7 +6,7 @@ detail and may change without notice while the package is 0.x.
|
|
|
6
6
|
|
|
7
7
|
from docsmind.client import Docsmind
|
|
8
8
|
from docsmind.config import DocsmindConfig
|
|
9
|
-
from docsmind.domain.changes import
|
|
9
|
+
from docsmind.domain.changes import ChangeAnalysis, ChangeResult, ChangeRow
|
|
10
10
|
from docsmind.domain.citations import Citation
|
|
11
11
|
from docsmind.domain.documents import Chunk, Document, DocumentVersion, Section
|
|
12
12
|
from docsmind.domain.tables import AgentTable
|
|
@@ -15,15 +15,15 @@ __version__ = "0.2.0"
|
|
|
15
15
|
|
|
16
16
|
__all__ = [
|
|
17
17
|
"AgentTable",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
18
|
+
"ChangeAnalysis",
|
|
19
|
+
"ChangeResult",
|
|
20
|
+
"ChangeRow",
|
|
20
21
|
"Chunk",
|
|
21
22
|
"Citation",
|
|
22
23
|
"Docsmind",
|
|
23
24
|
"DocsmindConfig",
|
|
24
25
|
"Document",
|
|
25
26
|
"DocumentVersion",
|
|
26
|
-
"ImpactAssessment",
|
|
27
27
|
"Section",
|
|
28
28
|
"__version__",
|
|
29
29
|
]
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""In-memory `ConversationStore` / `MemoryStore` / `ChangeStore`. Used by tests and by
|
|
2
|
+
one-off scripts that don't want to touch Postgres; same contract as the
|
|
3
|
+
Postgres versions."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from datetime import datetime, timezone
|
|
8
|
+
from typing import Any
|
|
9
|
+
from uuid import UUID
|
|
10
|
+
|
|
11
|
+
from docsmind.domain.agent import Conversation, MemoryItem, StoredMessage
|
|
12
|
+
from docsmind.domain.changes import ChangeAnalysis, ChangeRow
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InMemoryConversationStore:
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
self._conversations: dict[UUID, Conversation] = {}
|
|
18
|
+
self._messages: dict[UUID, list[StoredMessage]] = {}
|
|
19
|
+
|
|
20
|
+
async def create(self, title: str) -> Conversation:
|
|
21
|
+
conversation = Conversation(title=title[:120])
|
|
22
|
+
self._conversations[conversation.id] = conversation
|
|
23
|
+
self._messages[conversation.id] = []
|
|
24
|
+
return conversation
|
|
25
|
+
|
|
26
|
+
async def get(self, conversation_id: UUID) -> Conversation | None:
|
|
27
|
+
return self._conversations.get(conversation_id)
|
|
28
|
+
|
|
29
|
+
async def list(self, limit: int = 50) -> list[dict]:
|
|
30
|
+
rows = []
|
|
31
|
+
for c in sorted(self._conversations.values(), key=lambda c: c.updated_at, reverse=True):
|
|
32
|
+
msgs = self._messages[c.id]
|
|
33
|
+
last = next((m for m in reversed(msgs) if m.role == "assistant"), None)
|
|
34
|
+
rows.append(
|
|
35
|
+
{
|
|
36
|
+
"id": c.id,
|
|
37
|
+
"title": c.title,
|
|
38
|
+
"created_at": c.created_at,
|
|
39
|
+
"updated_at": c.updated_at,
|
|
40
|
+
"message_count": len(msgs),
|
|
41
|
+
"last_answer": last.content if last else None,
|
|
42
|
+
"last_citations": last.citations if last else [],
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
return rows[:limit]
|
|
46
|
+
|
|
47
|
+
async def messages(self, conversation_id: UUID) -> list[StoredMessage]:
|
|
48
|
+
return list(self._messages.get(conversation_id, []))
|
|
49
|
+
|
|
50
|
+
async def append(self, conversation_id: UUID, messages: list[StoredMessage]) -> None:
|
|
51
|
+
stored = self._messages[conversation_id]
|
|
52
|
+
for m in messages:
|
|
53
|
+
stored.append(m.model_copy(update={"ordinal": len(stored)}))
|
|
54
|
+
self._conversations[conversation_id].updated_at = datetime.now(timezone.utc)
|
|
55
|
+
|
|
56
|
+
async def set_summary(self, conversation_id: UUID, summary: str, upto: int) -> None:
|
|
57
|
+
c = self._conversations[conversation_id]
|
|
58
|
+
c.summary = summary
|
|
59
|
+
c.summarized_upto = upto
|
|
60
|
+
|
|
61
|
+
async def delete(self, conversation_id: UUID) -> bool:
|
|
62
|
+
self._messages.pop(conversation_id, None)
|
|
63
|
+
return self._conversations.pop(conversation_id, None) is not None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class InMemoryMemoryStore:
|
|
67
|
+
def __init__(self) -> None:
|
|
68
|
+
self._items: dict[str, MemoryItem] = {}
|
|
69
|
+
|
|
70
|
+
async def add(self, items: list[MemoryItem]) -> int:
|
|
71
|
+
added = 0
|
|
72
|
+
for item in items:
|
|
73
|
+
if item.key not in self._items:
|
|
74
|
+
self._items[item.key] = item
|
|
75
|
+
added += 1
|
|
76
|
+
return added
|
|
77
|
+
|
|
78
|
+
async def recall(self, *, version_ids: list[UUID] | None, limit: int) -> list[MemoryItem]:
|
|
79
|
+
items = [
|
|
80
|
+
i
|
|
81
|
+
for i in self._items.values()
|
|
82
|
+
if version_ids is None or i.kind == "fact" or i.version_id in version_ids
|
|
83
|
+
]
|
|
84
|
+
items.sort(key=lambda i: i.created_at, reverse=True)
|
|
85
|
+
return items[:limit]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class InMemoryChangeStore:
|
|
89
|
+
"""`ChangeStore` in memory (tests, scripts). Same contract as `PostgresChangeStore`."""
|
|
90
|
+
|
|
91
|
+
def __init__(self) -> None:
|
|
92
|
+
self._analyses: dict[UUID, ChangeAnalysis] = {}
|
|
93
|
+
self._rows: dict[UUID, ChangeRow] = {}
|
|
94
|
+
|
|
95
|
+
async def create_analysis(self, analysis: ChangeAnalysis) -> None:
|
|
96
|
+
self._analyses[analysis.id] = analysis.model_copy(deep=True)
|
|
97
|
+
|
|
98
|
+
async def update_analysis(self, analysis_id: UUID, **fields: Any) -> None:
|
|
99
|
+
current = self._analyses[analysis_id]
|
|
100
|
+
self._analyses[analysis_id] = current.model_copy(update={**fields, "updated_at": datetime.now(timezone.utc)})
|
|
101
|
+
|
|
102
|
+
async def get_analysis(self, analysis_id: UUID) -> ChangeAnalysis | None:
|
|
103
|
+
found = self._analyses.get(analysis_id)
|
|
104
|
+
return found.model_copy(deep=True) if found else None
|
|
105
|
+
|
|
106
|
+
async def list_analyses(self, limit: int = 50) -> list[dict]:
|
|
107
|
+
newest = sorted(self._analyses.values(), key=lambda a: a.created_at, reverse=True)
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
"id": a.id,
|
|
111
|
+
"status": a.status,
|
|
112
|
+
"mode": a.mode,
|
|
113
|
+
"diff_ratio": a.diff_ratio,
|
|
114
|
+
"created_at": a.created_at,
|
|
115
|
+
"updated_at": a.updated_at,
|
|
116
|
+
"current_version_id": a.current_version_id,
|
|
117
|
+
"previous_version_id": a.previous_version_id,
|
|
118
|
+
"row_count": sum(r.analysis_id == a.id for r in self._rows.values()),
|
|
119
|
+
"verified_count": sum(r.analysis_id == a.id and r.verified for r in self._rows.values()),
|
|
120
|
+
}
|
|
121
|
+
for a in newest[:limit]
|
|
122
|
+
]
|
|
123
|
+
|
|
124
|
+
async def delete_analysis(self, analysis_id: UUID) -> bool:
|
|
125
|
+
for row_id in [r.id for r in self._rows.values() if r.analysis_id == analysis_id]:
|
|
126
|
+
del self._rows[row_id]
|
|
127
|
+
return self._analyses.pop(analysis_id, None) is not None
|
|
128
|
+
|
|
129
|
+
async def add_row(self, row: ChangeRow) -> ChangeRow:
|
|
130
|
+
ordinal = max((r.ordinal for r in self._rows.values() if r.analysis_id == row.analysis_id), default=-1) + 1
|
|
131
|
+
stored = row.model_copy(update={"ordinal": ordinal}, deep=True)
|
|
132
|
+
self._rows[stored.id] = stored
|
|
133
|
+
return stored.model_copy(deep=True)
|
|
134
|
+
|
|
135
|
+
async def update_row(self, row_id: UUID, **fields: Any) -> ChangeRow | None:
|
|
136
|
+
current = self._rows.get(row_id)
|
|
137
|
+
if current is None:
|
|
138
|
+
return None
|
|
139
|
+
self._rows[row_id] = current.model_copy(update={**fields, "updated_at": datetime.now(timezone.utc)})
|
|
140
|
+
return self._rows[row_id].model_copy(deep=True)
|
|
141
|
+
|
|
142
|
+
async def get_row(self, row_id: UUID) -> ChangeRow | None:
|
|
143
|
+
found = self._rows.get(row_id)
|
|
144
|
+
return found.model_copy(deep=True) if found else None
|
|
145
|
+
|
|
146
|
+
async def delete_row(self, row_id: UUID) -> bool:
|
|
147
|
+
return self._rows.pop(row_id, None) is not None
|
|
148
|
+
|
|
149
|
+
async def list_rows(self, analysis_id: UUID) -> list[ChangeRow]:
|
|
150
|
+
rows = [r for r in self._rows.values() if r.analysis_id == analysis_id]
|
|
151
|
+
return [r.model_copy(deep=True) for r in sorted(rows, key=lambda r: r.ordinal)]
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""Postgres implementation of `ChangeStore`: change analyses and their rows."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from typing import Any
|
|
7
|
+
from uuid import UUID
|
|
8
|
+
|
|
9
|
+
from sqlalchemy import delete, func, insert, select, text, update
|
|
10
|
+
|
|
11
|
+
from docsmind.adapters.storage.postgres.engine import get_sessionmaker
|
|
12
|
+
from docsmind.adapters.storage.postgres.tables import change_analyses as analyses_table
|
|
13
|
+
from docsmind.adapters.storage.postgres.tables import change_rows as rows_table
|
|
14
|
+
from docsmind.config import DocsmindConfig
|
|
15
|
+
from docsmind.domain.changes import ChangeAnalysis, ChangeRow, Proof
|
|
16
|
+
|
|
17
|
+
_ROW_FIELDS = {
|
|
18
|
+
"current_clause",
|
|
19
|
+
"previous_clause",
|
|
20
|
+
"change_description",
|
|
21
|
+
"nature",
|
|
22
|
+
"category",
|
|
23
|
+
"compliance_requirement",
|
|
24
|
+
"binding",
|
|
25
|
+
"applicability_scope",
|
|
26
|
+
"verified",
|
|
27
|
+
"proof",
|
|
28
|
+
"verification_note",
|
|
29
|
+
"approved",
|
|
30
|
+
}
|
|
31
|
+
_ANALYSIS_FIELDS = {
|
|
32
|
+
"status",
|
|
33
|
+
"mode",
|
|
34
|
+
"diff_ratio",
|
|
35
|
+
"public",
|
|
36
|
+
"verdict_note",
|
|
37
|
+
"changelog",
|
|
38
|
+
"report",
|
|
39
|
+
"meta",
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _now() -> datetime:
|
|
44
|
+
return datetime.now(timezone.utc)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _row_from_db(row: Any) -> ChangeRow:
|
|
48
|
+
data = dict(row)
|
|
49
|
+
data["proof"] = [Proof(**p) for p in (data.get("proof") or [])]
|
|
50
|
+
return ChangeRow(**data)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _row_values(row: ChangeRow) -> dict[str, Any]:
|
|
54
|
+
return {
|
|
55
|
+
"id": row.id,
|
|
56
|
+
"analysis_id": row.analysis_id,
|
|
57
|
+
"ordinal": row.ordinal,
|
|
58
|
+
"current_clause": row.current_clause,
|
|
59
|
+
"previous_clause": row.previous_clause,
|
|
60
|
+
"change_description": row.change_description,
|
|
61
|
+
"nature": row.nature.value,
|
|
62
|
+
"category": row.category,
|
|
63
|
+
"compliance_requirement": row.compliance_requirement,
|
|
64
|
+
"binding": row.binding.value,
|
|
65
|
+
"applicability_scope": row.applicability_scope,
|
|
66
|
+
"verified": row.verified,
|
|
67
|
+
"proof": [p.model_dump(mode="json") for p in row.proof],
|
|
68
|
+
"verification_note": row.verification_note,
|
|
69
|
+
"approved": row.approved,
|
|
70
|
+
"origin": row.origin,
|
|
71
|
+
"created_at": row.created_at,
|
|
72
|
+
"updated_at": row.updated_at,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _plain(value: Any) -> Any:
|
|
77
|
+
"""Enums and models to what JSONB/text columns take."""
|
|
78
|
+
if hasattr(value, "value"):
|
|
79
|
+
return value.value
|
|
80
|
+
if isinstance(value, list):
|
|
81
|
+
return [p.model_dump(mode="json") if hasattr(p, "model_dump") else p for p in value]
|
|
82
|
+
return value
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class PostgresChangeStore:
|
|
86
|
+
def __init__(self, config: DocsmindConfig) -> None:
|
|
87
|
+
self._sessionmaker = get_sessionmaker(config)
|
|
88
|
+
|
|
89
|
+
# -- analyses ---------------------------------------------------------------
|
|
90
|
+
|
|
91
|
+
async def create_analysis(self, analysis: ChangeAnalysis) -> None:
|
|
92
|
+
async with self._sessionmaker() as session:
|
|
93
|
+
await session.execute(insert(analyses_table).values(**analysis.model_dump()))
|
|
94
|
+
await session.commit()
|
|
95
|
+
|
|
96
|
+
async def update_analysis(self, analysis_id: UUID, **fields: Any) -> None:
|
|
97
|
+
unknown = set(fields) - _ANALYSIS_FIELDS
|
|
98
|
+
if unknown:
|
|
99
|
+
raise ValueError(f"Cannot update analysis fields: {sorted(unknown)}")
|
|
100
|
+
async with self._sessionmaker() as session:
|
|
101
|
+
await session.execute(
|
|
102
|
+
update(analyses_table)
|
|
103
|
+
.where(analyses_table.c.id == analysis_id)
|
|
104
|
+
.values(**{k: _plain(v) for k, v in fields.items()}, updated_at=_now())
|
|
105
|
+
)
|
|
106
|
+
await session.commit()
|
|
107
|
+
|
|
108
|
+
async def get_analysis(self, analysis_id: UUID) -> ChangeAnalysis | None:
|
|
109
|
+
async with self._sessionmaker() as session:
|
|
110
|
+
result = await session.execute(select(analyses_table).where(analyses_table.c.id == analysis_id))
|
|
111
|
+
row = result.mappings().first()
|
|
112
|
+
return ChangeAnalysis(**dict(row)) if row else None
|
|
113
|
+
|
|
114
|
+
_LIST_SQL = text(
|
|
115
|
+
"""
|
|
116
|
+
SELECT a.id, a.status, a.mode, a.diff_ratio, a.created_at, a.updated_at,
|
|
117
|
+
a.current_version_id, a.previous_version_id,
|
|
118
|
+
dc.title AS current_title, vc.label AS current_label,
|
|
119
|
+
dp.title AS previous_title, vp.label AS previous_label,
|
|
120
|
+
(SELECT count(*) FROM change_rows r WHERE r.analysis_id = a.id) AS row_count,
|
|
121
|
+
(SELECT count(*) FROM change_rows r WHERE r.analysis_id = a.id AND r.verified) AS verified_count
|
|
122
|
+
FROM change_analyses a
|
|
123
|
+
JOIN document_versions vc ON vc.id = a.current_version_id
|
|
124
|
+
JOIN documents dc ON dc.id = vc.document_id
|
|
125
|
+
JOIN document_versions vp ON vp.id = a.previous_version_id
|
|
126
|
+
JOIN documents dp ON dp.id = vp.document_id
|
|
127
|
+
ORDER BY a.created_at DESC
|
|
128
|
+
LIMIT :limit
|
|
129
|
+
"""
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
async def list_analyses(self, limit: int = 50) -> list[dict]:
|
|
133
|
+
async with self._sessionmaker() as session:
|
|
134
|
+
result = await session.execute(self._LIST_SQL, {"limit": limit})
|
|
135
|
+
return [dict(row) for row in result.mappings().all()]
|
|
136
|
+
|
|
137
|
+
async def delete_analysis(self, analysis_id: UUID) -> bool:
|
|
138
|
+
async with self._sessionmaker() as session:
|
|
139
|
+
result = await session.execute(delete(analyses_table).where(analyses_table.c.id == analysis_id))
|
|
140
|
+
await session.commit()
|
|
141
|
+
return result.rowcount > 0
|
|
142
|
+
|
|
143
|
+
# -- rows ----------------------------------------------------------------------
|
|
144
|
+
|
|
145
|
+
async def add_row(self, row: ChangeRow) -> ChangeRow:
|
|
146
|
+
async with self._sessionmaker() as session:
|
|
147
|
+
next_ordinal = (
|
|
148
|
+
await session.execute(
|
|
149
|
+
select(func.coalesce(func.max(rows_table.c.ordinal), -1)).where(
|
|
150
|
+
rows_table.c.analysis_id == row.analysis_id
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
).scalar_one() + 1
|
|
154
|
+
stored = row.model_copy(update={"ordinal": int(next_ordinal)})
|
|
155
|
+
await session.execute(insert(rows_table).values(**_row_values(stored)))
|
|
156
|
+
await session.commit()
|
|
157
|
+
return stored
|
|
158
|
+
|
|
159
|
+
async def update_row(self, row_id: UUID, **fields: Any) -> ChangeRow | None:
|
|
160
|
+
unknown = set(fields) - _ROW_FIELDS
|
|
161
|
+
if unknown:
|
|
162
|
+
raise ValueError(f"Cannot update row fields: {sorted(unknown)}")
|
|
163
|
+
async with self._sessionmaker() as session:
|
|
164
|
+
await session.execute(
|
|
165
|
+
update(rows_table)
|
|
166
|
+
.where(rows_table.c.id == row_id)
|
|
167
|
+
.values(**{k: _plain(v) for k, v in fields.items()}, updated_at=_now())
|
|
168
|
+
)
|
|
169
|
+
await session.commit()
|
|
170
|
+
return await self.get_row(row_id)
|
|
171
|
+
|
|
172
|
+
async def get_row(self, row_id: UUID) -> ChangeRow | None:
|
|
173
|
+
async with self._sessionmaker() as session:
|
|
174
|
+
result = await session.execute(select(rows_table).where(rows_table.c.id == row_id))
|
|
175
|
+
row = result.mappings().first()
|
|
176
|
+
return _row_from_db(row) if row else None
|
|
177
|
+
|
|
178
|
+
async def delete_row(self, row_id: UUID) -> bool:
|
|
179
|
+
async with self._sessionmaker() as session:
|
|
180
|
+
result = await session.execute(delete(rows_table).where(rows_table.c.id == row_id))
|
|
181
|
+
await session.commit()
|
|
182
|
+
return result.rowcount > 0
|
|
183
|
+
|
|
184
|
+
async def list_rows(self, analysis_id: UUID) -> list[ChangeRow]:
|
|
185
|
+
async with self._sessionmaker() as session:
|
|
186
|
+
result = await session.execute(
|
|
187
|
+
select(rows_table).where(rows_table.c.analysis_id == analysis_id).order_by(rows_table.c.ordinal)
|
|
188
|
+
)
|
|
189
|
+
return [_row_from_db(r) for r in result.mappings().all()]
|