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.
Files changed (513) hide show
  1. {docsmind-0.6.0 → docsmind-0.8.0}/.gitignore +2 -0
  2. {docsmind-0.6.0 → docsmind-0.8.0}/CHANGELOG.md +61 -0
  3. {docsmind-0.6.0 → docsmind-0.8.0}/PKG-INFO +43 -8
  4. {docsmind-0.6.0 → docsmind-0.8.0}/README.md +41 -7
  5. {docsmind-0.6.0 → docsmind-0.8.0}/pyproject.toml +2 -1
  6. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/__init__.py +4 -4
  7. docsmind-0.8.0/src/docsmind/adapters/storage/memory.py +151 -0
  8. docsmind-0.8.0/src/docsmind/adapters/storage/postgres/change_store.py +189 -0
  9. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/tables.py +43 -0
  10. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/vision/__init__.py +1 -2
  11. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/vision/captioners.py +35 -0
  12. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/agent.py +139 -49
  13. docsmind-0.8.0/src/docsmind/agent/prompts.py +222 -0
  14. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/analyzer.py +501 -0
  15. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/changelog.py +116 -0
  16. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/env.py +134 -0
  17. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/export.py +38 -0
  18. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/prep.py +376 -0
  19. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/report.py +277 -0
  20. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/rows.py +165 -0
  21. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/scan.py +129 -0
  22. docsmind-0.8.0/src/docsmind/agent/subagents/change_analysis/verify.py +273 -0
  23. docsmind-0.8.0/src/docsmind/agent/subagents/specs.py +37 -0
  24. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/__init__.py +10 -2
  25. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/base.py +28 -4
  26. docsmind-0.8.0/src/docsmind/agent/tools/change.py +296 -0
  27. docsmind-0.8.0/src/docsmind/agent/tools/delegate.py +73 -0
  28. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/documents.py +14 -0
  29. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/tools/search.py +24 -7
  30. docsmind-0.8.0/src/docsmind/agent/tools/web.py +287 -0
  31. docsmind-0.8.0/src/docsmind/cli/diff.py +47 -0
  32. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/client.py +8 -7
  33. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/config.py +41 -4
  34. docsmind-0.8.0/src/docsmind/domain/changes.py +191 -0
  35. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/ports.py +43 -1
  36. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/enrichment/service.py +3 -4
  37. {docsmind-0.6.0/src/docsmind/enrichment → docsmind-0.8.0/src/docsmind}/pricing.py +62 -29
  38. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/keyword.py +3 -1
  39. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/app.py +2 -1
  40. docsmind-0.8.0/src/docsmind/server/routes/changes.py +143 -0
  41. 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
  42. docsmind-0.8.0/src/docsmind/server/ui/assets/index-FgGWK0Rs.css +1 -0
  43. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/index.html +2 -2
  44. docsmind-0.6.0/src/docsmind/adapters/storage/memory.py +0 -83
  45. docsmind-0.6.0/src/docsmind/agent/prompts.py +0 -93
  46. docsmind-0.6.0/src/docsmind/agent/subagents/specs.py +0 -44
  47. docsmind-0.6.0/src/docsmind/agent/tools/delegate.py +0 -49
  48. docsmind-0.6.0/src/docsmind/cli/diff.py +0 -32
  49. docsmind-0.6.0/src/docsmind/domain/changes.py +0 -66
  50. docsmind-0.6.0/src/docsmind/server/ui/assets/index-QYKdGecG.css +0 -1
  51. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/__init__.py +0 -0
  52. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/blobs/__init__.py +0 -0
  53. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/blobs/filesystem.py +0 -0
  54. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/embeddings/__init__.py +0 -0
  55. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/embeddings/openai_embeddings.py +0 -0
  56. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/llm/__init__.py +0 -0
  57. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/llm/anthropic_llm.py +0 -0
  58. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/llm/openai_llm.py +0 -0
  59. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/__init__.py +0 -0
  60. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/__init__.py +0 -0
  61. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/agent_store.py +0 -0
  62. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/engine.py +0 -0
  63. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/storage/postgres/repository.py +0 -0
  64. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/adapters/tracing/__init__.py +0 -0
  65. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/__init__.py +0 -0
  66. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/catalog.py +0 -0
  67. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/__init__.py +0 -0
  68. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/context.py +0 -0
  69. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/memory.py +0 -0
  70. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/summarizer.py +0 -0
  71. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/harness/tokens.py +0 -0
  72. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/loop.py +0 -0
  73. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/orchestrator.py +0 -0
  74. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/planner.py +0 -0
  75. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/sources.py +0 -0
  76. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/subagents/__init__.py +0 -0
  77. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/subagents/change_analysis/__init__.py +0 -0
  78. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/agent/util.py +0 -0
  79. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/__init__.py +0 -0
  80. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/app.py +0 -0
  81. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/chat.py +0 -0
  82. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/db.py +0 -0
  83. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/doctor.py +0 -0
  84. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/enrich.py +0 -0
  85. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/ingest.py +0 -0
  86. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/inspect.py +0 -0
  87. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/cli/serve.py +0 -0
  88. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/__init__.py +0 -0
  89. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/agent.py +0 -0
  90. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/citations.py +0 -0
  91. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/documents.py +0 -0
  92. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/errors.py +0 -0
  93. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/domain/tables.py +0 -0
  94. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/enrichment/__init__.py +0 -0
  95. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/__init__.py +0 -0
  96. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/chunking/__init__.py +0 -0
  97. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/chunking/page.py +0 -0
  98. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/chunking/structural.py +0 -0
  99. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/enrichment/__init__.py +0 -0
  100. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/parsers/__init__.py +0 -0
  101. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/parsers/pdf.py +0 -0
  102. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/ingestion/pipeline.py +0 -0
  103. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/py.typed +0 -0
  104. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/__init__.py +0 -0
  105. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/fusion.py +0 -0
  106. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/retrieval/hybrid.py +0 -0
  107. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/__init__.py +0 -0
  108. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/jobs.py +0 -0
  109. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/__init__.py +0 -0
  110. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/chat.py +0 -0
  111. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/documents.py +0 -0
  112. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/routes/enrichment.py +0 -0
  113. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/favicon.svg +0 -0
  114. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/LICENSE +0 -0
  115. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
  116. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
  117. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-H.bcmap +0 -0
  118. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
  119. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
  120. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78-V.bcmap +0 -0
  121. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
  122. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
  123. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
  124. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
  125. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
  126. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
  127. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
  128. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
  129. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
  130. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-H.bcmap +0 -0
  131. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
  132. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
  133. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Add-V.bcmap +0 -0
  134. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
  135. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
  136. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
  137. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
  138. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
  139. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
  140. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
  141. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  142. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
  143. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
  144. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
  145. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
  146. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
  147. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
  148. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  149. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
  150. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
  151. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
  152. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
  153. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
  154. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
  155. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
  156. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  157. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
  158. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
  159. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
  160. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  161. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5-H.bcmap +0 -0
  162. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5-V.bcmap +0 -0
  163. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
  164. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
  165. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
  166. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
  167. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
  168. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
  169. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
  170. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-V.bcmap +0 -0
  171. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
  172. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
  173. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
  174. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
  175. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-H.bcmap +0 -0
  176. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
  177. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
  178. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
  179. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
  180. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
  181. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
  182. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
  183. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
  184. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
  185. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-H.bcmap +0 -0
  186. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GB-V.bcmap +0 -0
  187. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
  188. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
  189. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
  190. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
  191. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
  192. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
  193. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
  194. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
  195. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
  196. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
  197. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
  198. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
  199. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
  200. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
  201. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/H.bcmap +0 -0
  202. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
  203. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
  204. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
  205. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
  206. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
  207. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
  208. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
  209. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
  210. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
  211. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
  212. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
  213. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
  214. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
  215. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
  216. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
  217. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
  218. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
  219. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
  220. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
  221. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
  222. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
  223. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  224. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  225. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
  226. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
  227. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
  228. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Katakana.bcmap +0 -0
  229. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/LICENSE +0 -0
  230. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
  231. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
  232. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
  233. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
  234. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/Roman.bcmap +0 -0
  235. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  236. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  237. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  238. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  239. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  240. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  241. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  242. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  243. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
  244. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
  245. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
  246. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
  247. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
  248. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
  249. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
  250. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
  251. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  252. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  253. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  254. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  255. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  256. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  257. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  258. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  259. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  260. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  261. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  262. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  263. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  264. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  265. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  266. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  267. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  268. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  269. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  270. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  271. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  272. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  273. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  274. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
  275. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
  276. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
  277. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
  278. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
  279. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
  280. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
  281. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
  282. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/V.bcmap +0 -0
  283. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
  284. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc +0 -0
  285. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/iccs/LICENSE +0 -0
  286. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_add.svg +0 -0
  287. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_disclaimer.svg +0 -0
  288. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_done.svg +0 -0
  289. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_spinner.svg +0 -0
  290. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/altText_warning.svg +0 -0
  291. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-check.svg +0 -0
  292. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-comment.svg +0 -0
  293. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-help.svg +0 -0
  294. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-insert.svg +0 -0
  295. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-key.svg +0 -0
  296. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-newparagraph.svg +0 -0
  297. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-noicon.svg +0 -0
  298. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-note.svg +0 -0
  299. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-paperclip.svg +0 -0
  300. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-paragraph.svg +0 -0
  301. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/annotation-pushpin.svg +0 -0
  302. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/checkmark.svg +0 -0
  303. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-actionsButton.svg +0 -0
  304. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-closeButton.svg +0 -0
  305. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-editButton.svg +0 -0
  306. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/comment-popup-editButton.svg +0 -0
  307. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeHighlight.svg +0 -0
  308. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeText.svg +0 -0
  309. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorInk.svg +0 -0
  310. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/cursor-editorTextHighlight.svg +0 -0
  311. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-delete.svg +0 -0
  312. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-edit.svg +0 -0
  313. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/findbarButton-next.svg +0 -0
  314. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/findbarButton-previous.svg +0 -0
  315. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/gv-toolbarButton-download.svg +0 -0
  316. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/loading-icon.gif +0 -0
  317. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/loading.svg +0 -0
  318. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_closingButton.svg +0 -0
  319. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_info.svg +0 -0
  320. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/messageBar_warning.svg +0 -0
  321. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_closeButton.svg +0 -0
  322. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_selected.svg +0 -0
  323. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_viewArrow.svg +0 -0
  324. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/pages_viewButton.svg +0 -0
  325. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +0 -0
  326. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +0 -0
  327. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-handTool.svg +0 -0
  328. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +0 -0
  329. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +0 -0
  330. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +0 -0
  331. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +0 -0
  332. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +0 -0
  333. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +0 -0
  334. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +0 -0
  335. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +0 -0
  336. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +0 -0
  337. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +0 -0
  338. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +0 -0
  339. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/signature-properties-row-check.svg +0 -0
  340. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-bookmark.svg +0 -0
  341. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +0 -0
  342. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-download.svg +0 -0
  343. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorFreeText.svg +0 -0
  344. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorHighlight.svg +0 -0
  345. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorInk.svg +0 -0
  346. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorSignature.svg +0 -0
  347. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorStamp.svg +0 -0
  348. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrow.svg +0 -0
  349. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrowNova.svg +0 -0
  350. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-openFile.svg +0 -0
  351. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageDown.svg +0 -0
  352. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageUp.svg +0 -0
  353. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-presentationMode.svg +0 -0
  354. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-print.svg +0 -0
  355. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-search.svg +0 -0
  356. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +0 -0
  357. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesError.svg +0 -0
  358. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesVerified.svg +0 -0
  359. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewAttachments.svg +0 -0
  360. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewLayers.svg +0 -0
  361. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewOutline.svg +0 -0
  362. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewThumbnail.svg +0 -0
  363. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg +0 -0
  364. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomIn.svg +0 -0
  365. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomOut.svg +0 -0
  366. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/treeitem-collapsed.svg +0 -0
  367. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/images/treeitem-expanded.svg +0 -0
  368. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ach/viewer.ftl +0 -0
  369. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/af/viewer.ftl +0 -0
  370. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/an/viewer.ftl +0 -0
  371. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ar/viewer.ftl +0 -0
  372. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ast/viewer.ftl +0 -0
  373. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/az/viewer.ftl +0 -0
  374. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/be/viewer.ftl +0 -0
  375. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bg/viewer.ftl +0 -0
  376. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bn/viewer.ftl +0 -0
  377. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bo/viewer.ftl +0 -0
  378. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bqi/viewer.ftl +0 -0
  379. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/br/viewer.ftl +0 -0
  380. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/brx/viewer.ftl +0 -0
  381. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/bs/viewer.ftl +0 -0
  382. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ca/viewer.ftl +0 -0
  383. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/cak/viewer.ftl +0 -0
  384. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ckb/viewer.ftl +0 -0
  385. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/cs/viewer.ftl +0 -0
  386. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/cy/viewer.ftl +0 -0
  387. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/da/viewer.ftl +0 -0
  388. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/de/viewer.ftl +0 -0
  389. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/dsb/viewer.ftl +0 -0
  390. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/el/viewer.ftl +0 -0
  391. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/en-CA/viewer.ftl +0 -0
  392. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/en-GB/viewer.ftl +0 -0
  393. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/en-US/viewer.ftl +0 -0
  394. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/eo/viewer.ftl +0 -0
  395. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-AR/viewer.ftl +0 -0
  396. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-CL/viewer.ftl +0 -0
  397. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-ES/viewer.ftl +0 -0
  398. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/es-MX/viewer.ftl +0 -0
  399. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/et/viewer.ftl +0 -0
  400. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/eu/viewer.ftl +0 -0
  401. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fa/viewer.ftl +0 -0
  402. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ff/viewer.ftl +0 -0
  403. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fi/viewer.ftl +0 -0
  404. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fr/viewer.ftl +0 -0
  405. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fur/viewer.ftl +0 -0
  406. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/fy-NL/viewer.ftl +0 -0
  407. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ga-IE/viewer.ftl +0 -0
  408. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gd/viewer.ftl +0 -0
  409. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gl/viewer.ftl +0 -0
  410. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gn/viewer.ftl +0 -0
  411. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/gu-IN/viewer.ftl +0 -0
  412. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/he/viewer.ftl +0 -0
  413. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hi-IN/viewer.ftl +0 -0
  414. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hr/viewer.ftl +0 -0
  415. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hsb/viewer.ftl +0 -0
  416. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hu/viewer.ftl +0 -0
  417. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hy-AM/viewer.ftl +0 -0
  418. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/hye/viewer.ftl +0 -0
  419. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ia/viewer.ftl +0 -0
  420. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/id/viewer.ftl +0 -0
  421. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/is/viewer.ftl +0 -0
  422. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/it/viewer.ftl +0 -0
  423. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ja/viewer.ftl +0 -0
  424. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ka/viewer.ftl +0 -0
  425. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/kab/viewer.ftl +0 -0
  426. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/kk/viewer.ftl +0 -0
  427. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/km/viewer.ftl +0 -0
  428. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/kn/viewer.ftl +0 -0
  429. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ko/viewer.ftl +0 -0
  430. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lij/viewer.ftl +0 -0
  431. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lo/viewer.ftl +0 -0
  432. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/locale.json +0 -0
  433. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lt/viewer.ftl +0 -0
  434. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ltg/viewer.ftl +0 -0
  435. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/lv/viewer.ftl +0 -0
  436. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/meh/viewer.ftl +0 -0
  437. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/mk/viewer.ftl +0 -0
  438. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ml/viewer.ftl +0 -0
  439. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/mr/viewer.ftl +0 -0
  440. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ms/viewer.ftl +0 -0
  441. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/my/viewer.ftl +0 -0
  442. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/nb-NO/viewer.ftl +0 -0
  443. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ne-NP/viewer.ftl +0 -0
  444. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/nl/viewer.ftl +0 -0
  445. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/nn-NO/viewer.ftl +0 -0
  446. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/oc/viewer.ftl +0 -0
  447. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pa-IN/viewer.ftl +0 -0
  448. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pl/viewer.ftl +0 -0
  449. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pt-BR/viewer.ftl +0 -0
  450. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/pt-PT/viewer.ftl +0 -0
  451. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/rm/viewer.ftl +0 -0
  452. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ro/viewer.ftl +0 -0
  453. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ru/viewer.ftl +0 -0
  454. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sat/viewer.ftl +0 -0
  455. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sc/viewer.ftl +0 -0
  456. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/scn/viewer.ftl +0 -0
  457. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sco/viewer.ftl +0 -0
  458. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/si/viewer.ftl +0 -0
  459. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sk/viewer.ftl +0 -0
  460. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/skr/viewer.ftl +0 -0
  461. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sl/viewer.ftl +0 -0
  462. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/son/viewer.ftl +0 -0
  463. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sq/viewer.ftl +0 -0
  464. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sr/viewer.ftl +0 -0
  465. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/sv-SE/viewer.ftl +0 -0
  466. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/szl/viewer.ftl +0 -0
  467. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ta/viewer.ftl +0 -0
  468. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/te/viewer.ftl +0 -0
  469. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/tg/viewer.ftl +0 -0
  470. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/th/viewer.ftl +0 -0
  471. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/tl/viewer.ftl +0 -0
  472. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/tr/viewer.ftl +0 -0
  473. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/trs/viewer.ftl +0 -0
  474. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/uk/viewer.ftl +0 -0
  475. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/ur/viewer.ftl +0 -0
  476. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/uz/viewer.ftl +0 -0
  477. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/vi/viewer.ftl +0 -0
  478. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/wo/viewer.ftl +0 -0
  479. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/xh/viewer.ftl +0 -0
  480. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/zh-CN/viewer.ftl +0 -0
  481. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/locale/zh-TW/viewer.ftl +0 -0
  482. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
  483. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
  484. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
  485. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  486. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
  487. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
  488. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
  489. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  490. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
  491. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
  492. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_FOXIT +0 -0
  493. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_LIBERATION +0 -0
  494. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
  495. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  496. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
  497. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
  498. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/viewer.css +0 -0
  499. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/viewer.html +0 -0
  500. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/viewer.mjs +0 -0
  501. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_JBIG2 +0 -0
  502. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_OPENJPEG +0 -0
  503. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +0 -0
  504. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG +0 -0
  505. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_QCMS +0 -0
  506. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_QCMS +0 -0
  507. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/jbig2.wasm +0 -0
  508. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/jbig2_nowasm_fallback.js +0 -0
  509. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg.wasm +0 -0
  510. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +0 -0
  511. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/qcms_bg.wasm +0 -0
  512. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.js +0 -0
  513. {docsmind-0.6.0 → docsmind-0.8.0}/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.wasm +0 -0
@@ -1,3 +1,5 @@
1
+ data/
2
+
1
3
  # --- Python ---
2
4
  __pycache__/
3
5
  *.py[cod]
@@ -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.6.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
- | 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
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
- change_set = dm.compare(v1.id, v2.id) # planned (diffra)
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** (`researcher`, `change_analyzer`): fresh context, a subset of the tools, run in
225
- parallel, cannot delegate further.
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`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
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`, `token`, `note`, `answer`, `error`, `done`);
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` | Planned |
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
- | 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
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
- change_set = dm.compare(v1.id, v2.id) # planned (diffra)
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** (`researcher`, `change_analyzer`): fresh context, a subset of the tools, run in
166
- parallel, cannot delegate further.
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`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
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`, `token`, `note`, `answer`, `error`, `done`);
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` | Planned |
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.6.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 Change, ChangeSet, ImpactAssessment
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
- "Change",
19
- "ChangeSet",
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()]