docsmind 0.2.0__tar.gz → 0.4.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 (504) hide show
  1. {docsmind-0.2.0 → docsmind-0.4.0}/CHANGELOG.md +48 -3
  2. {docsmind-0.2.0 → docsmind-0.4.0}/PKG-INFO +112 -22
  3. {docsmind-0.2.0 → docsmind-0.4.0}/README.md +108 -21
  4. {docsmind-0.2.0 → docsmind-0.4.0}/pyproject.toml +13 -3
  5. docsmind-0.4.0/src/docsmind/adapters/llm/__init__.py +31 -0
  6. docsmind-0.4.0/src/docsmind/adapters/llm/anthropic_llm.py +152 -0
  7. docsmind-0.4.0/src/docsmind/adapters/llm/openai_llm.py +182 -0
  8. docsmind-0.4.0/src/docsmind/adapters/storage/memory.py +83 -0
  9. docsmind-0.4.0/src/docsmind/adapters/storage/postgres/agent_store.py +190 -0
  10. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/storage/postgres/repository.py +242 -1
  11. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/storage/postgres/tables.py +54 -0
  12. docsmind-0.4.0/src/docsmind/agent/agent.py +432 -0
  13. docsmind-0.4.0/src/docsmind/agent/catalog.py +85 -0
  14. docsmind-0.4.0/src/docsmind/agent/harness/__init__.py +2 -0
  15. docsmind-0.4.0/src/docsmind/agent/harness/context.py +154 -0
  16. docsmind-0.4.0/src/docsmind/agent/harness/memory.py +119 -0
  17. docsmind-0.4.0/src/docsmind/agent/harness/summarizer.py +67 -0
  18. docsmind-0.4.0/src/docsmind/agent/harness/tokens.py +36 -0
  19. docsmind-0.4.0/src/docsmind/agent/loop.py +131 -0
  20. docsmind-0.4.0/src/docsmind/agent/orchestrator.py +41 -0
  21. docsmind-0.4.0/src/docsmind/agent/planner.py +38 -0
  22. docsmind-0.4.0/src/docsmind/agent/prompts.py +93 -0
  23. docsmind-0.4.0/src/docsmind/agent/sources.py +95 -0
  24. docsmind-0.4.0/src/docsmind/agent/subagents/specs.py +44 -0
  25. docsmind-0.4.0/src/docsmind/agent/tools/__init__.py +25 -0
  26. docsmind-0.4.0/src/docsmind/agent/tools/base.py +130 -0
  27. docsmind-0.4.0/src/docsmind/agent/tools/delegate.py +48 -0
  28. docsmind-0.4.0/src/docsmind/agent/tools/documents.py +109 -0
  29. docsmind-0.4.0/src/docsmind/agent/tools/search.py +126 -0
  30. docsmind-0.4.0/src/docsmind/agent/util.py +53 -0
  31. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/cli/app.py +3 -0
  32. docsmind-0.4.0/src/docsmind/cli/chat.py +44 -0
  33. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/cli/ingest.py +6 -1
  34. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/cli/inspect.py +37 -0
  35. docsmind-0.4.0/src/docsmind/cli/serve.py +29 -0
  36. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/client.py +44 -5
  37. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/config.py +20 -0
  38. docsmind-0.4.0/src/docsmind/domain/agent.py +147 -0
  39. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/domain/citations.py +5 -0
  40. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/domain/documents.py +36 -7
  41. docsmind-0.4.0/src/docsmind/domain/errors.py +51 -0
  42. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/domain/ports.py +63 -6
  43. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/ingestion/chunking/page.py +53 -0
  44. docsmind-0.4.0/src/docsmind/ingestion/parsers/pdf.py +590 -0
  45. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/ingestion/pipeline.py +31 -1
  46. docsmind-0.4.0/src/docsmind/retrieval/keyword.py +48 -0
  47. docsmind-0.4.0/src/docsmind/server/app.py +89 -0
  48. docsmind-0.4.0/src/docsmind/server/routes/chat.py +161 -0
  49. docsmind-0.4.0/src/docsmind/server/routes/documents.py +196 -0
  50. docsmind-0.4.0/src/docsmind/server/ui/assets/index-DvL2_fGF.js +5423 -0
  51. docsmind-0.4.0/src/docsmind/server/ui/assets/index-ae6vf384.css +1 -0
  52. docsmind-0.4.0/src/docsmind/server/ui/favicon.svg +1 -0
  53. docsmind-0.4.0/src/docsmind/server/ui/index.html +14 -0
  54. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/LICENSE +177 -0
  55. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
  56. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
  57. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-H.bcmap +0 -0
  58. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
  59. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
  60. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-V.bcmap +0 -0
  61. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
  62. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
  63. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
  64. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
  65. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
  66. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
  67. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
  68. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
  69. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
  70. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-H.bcmap +0 -0
  71. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
  72. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
  73. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-V.bcmap +0 -0
  74. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
  75. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
  76. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
  77. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
  78. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
  79. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
  80. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
  81. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  82. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
  83. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
  84. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
  85. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
  86. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
  87. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
  88. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  89. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
  90. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
  91. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
  92. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
  93. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
  94. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
  95. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
  96. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  97. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
  98. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
  99. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
  100. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  101. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5-H.bcmap +0 -0
  102. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5-V.bcmap +0 -0
  103. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
  104. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
  105. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
  106. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
  107. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
  108. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
  109. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
  110. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-V.bcmap +3 -0
  111. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
  112. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
  113. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
  114. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
  115. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-H.bcmap +3 -0
  116. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
  117. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
  118. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
  119. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
  120. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
  121. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
  122. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
  123. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
  124. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
  125. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-H.bcmap +4 -0
  126. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-V.bcmap +0 -0
  127. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
  128. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
  129. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
  130. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
  131. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
  132. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
  133. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
  134. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
  135. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
  136. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
  137. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
  138. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
  139. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
  140. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
  141. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/H.bcmap +0 -0
  142. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
  143. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
  144. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
  145. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
  146. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
  147. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
  148. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
  149. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
  150. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
  151. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
  152. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
  153. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
  154. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
  155. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
  156. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
  157. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
  158. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
  159. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
  160. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
  161. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
  162. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
  163. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  164. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  165. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
  166. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
  167. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
  168. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Katakana.bcmap +0 -0
  169. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/LICENSE +36 -0
  170. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
  171. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
  172. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
  173. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
  174. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/Roman.bcmap +0 -0
  175. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  176. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  177. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  178. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  179. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  180. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  181. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  182. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  183. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
  184. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
  185. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
  186. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
  187. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
  188. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
  189. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
  190. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
  191. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  192. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  193. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  194. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  195. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  196. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  197. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  198. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  199. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  200. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  201. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  202. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  203. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  204. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  205. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  206. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  207. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  208. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  209. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  210. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  211. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  212. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  213. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  214. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
  215. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
  216. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
  217. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
  218. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
  219. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
  220. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
  221. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
  222. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/V.bcmap +0 -0
  223. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
  224. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc +0 -0
  225. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/iccs/LICENSE +116 -0
  226. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/altText_add.svg +3 -0
  227. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/altText_disclaimer.svg +3 -0
  228. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/altText_done.svg +3 -0
  229. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/altText_spinner.svg +30 -0
  230. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/altText_warning.svg +3 -0
  231. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-check.svg +11 -0
  232. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-comment.svg +16 -0
  233. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-help.svg +26 -0
  234. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-insert.svg +10 -0
  235. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-key.svg +11 -0
  236. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-newparagraph.svg +11 -0
  237. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-noicon.svg +7 -0
  238. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-note.svg +42 -0
  239. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-paperclip.svg +6 -0
  240. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-paragraph.svg +16 -0
  241. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/annotation-pushpin.svg +7 -0
  242. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/checkmark.svg +5 -0
  243. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/comment-actionsButton.svg +3 -0
  244. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/comment-closeButton.svg +3 -0
  245. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/comment-editButton.svg +8 -0
  246. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/comment-popup-editButton.svg +5 -0
  247. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeHighlight.svg +6 -0
  248. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeText.svg +3 -0
  249. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorInk.svg +4 -0
  250. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorTextHighlight.svg +8 -0
  251. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-delete.svg +5 -0
  252. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-edit.svg +3 -0
  253. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/findbarButton-next.svg +3 -0
  254. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/findbarButton-previous.svg +3 -0
  255. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/gv-toolbarButton-download.svg +3 -0
  256. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/loading-icon.gif +0 -0
  257. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/loading.svg +1 -0
  258. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/messageBar_closingButton.svg +3 -0
  259. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/messageBar_info.svg +3 -0
  260. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/messageBar_warning.svg +3 -0
  261. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/pages_closeButton.svg +3 -0
  262. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/pages_selected.svg +7 -0
  263. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/pages_viewArrow.svg +3 -0
  264. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/pages_viewButton.svg +3 -0
  265. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +3 -0
  266. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +3 -0
  267. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-handTool.svg +3 -0
  268. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +3 -0
  269. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +3 -0
  270. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +3 -0
  271. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +3 -0
  272. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +3 -0
  273. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +3 -0
  274. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +3 -0
  275. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +3 -0
  276. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +3 -0
  277. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +3 -0
  278. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +3 -0
  279. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/signature-properties-row-check.svg +4 -0
  280. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-bookmark.svg +3 -0
  281. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +3 -0
  282. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-download.svg +4 -0
  283. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorFreeText.svg +5 -0
  284. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorHighlight.svg +6 -0
  285. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorInk.svg +4 -0
  286. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorSignature.svg +6 -0
  287. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorStamp.svg +8 -0
  288. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrow.svg +3 -0
  289. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrowNova.svg +3 -0
  290. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-openFile.svg +3 -0
  291. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageDown.svg +3 -0
  292. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageUp.svg +3 -0
  293. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-presentationMode.svg +3 -0
  294. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-print.svg +3 -0
  295. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-search.svg +3 -0
  296. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +3 -0
  297. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesError.svg +7 -0
  298. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesVerified.svg +7 -0
  299. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewAttachments.svg +3 -0
  300. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewLayers.svg +3 -0
  301. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewOutline.svg +3 -0
  302. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewThumbnail.svg +3 -0
  303. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg +3 -0
  304. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomIn.svg +3 -0
  305. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomOut.svg +3 -0
  306. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/treeitem-collapsed.svg +1 -0
  307. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/images/treeitem-expanded.svg +1 -0
  308. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ach/viewer.ftl +184 -0
  309. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/af/viewer.ftl +163 -0
  310. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/an/viewer.ftl +207 -0
  311. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ar/viewer.ftl +807 -0
  312. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ast/viewer.ftl +156 -0
  313. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/az/viewer.ftl +207 -0
  314. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/be/viewer.ftl +822 -0
  315. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/bg/viewer.ftl +392 -0
  316. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/bn/viewer.ftl +202 -0
  317. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/bo/viewer.ftl +206 -0
  318. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/bqi/viewer.ftl +307 -0
  319. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/br/viewer.ftl +299 -0
  320. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/brx/viewer.ftl +175 -0
  321. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/bs/viewer.ftl +560 -0
  322. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ca/viewer.ftl +563 -0
  323. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/cak/viewer.ftl +243 -0
  324. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ckb/viewer.ftl +198 -0
  325. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/cs/viewer.ftl +836 -0
  326. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/cy/viewer.ftl +864 -0
  327. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/da/viewer.ftl +711 -0
  328. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/de/viewer.ftl +808 -0
  329. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/dsb/viewer.ftl +836 -0
  330. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/el/viewer.ftl +808 -0
  331. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/en-CA/viewer.ftl +808 -0
  332. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/en-GB/viewer.ftl +808 -0
  333. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/en-US/viewer.ftl +873 -0
  334. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/eo/viewer.ftl +808 -0
  335. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/es-AR/viewer.ftl +808 -0
  336. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/es-CL/viewer.ftl +808 -0
  337. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/es-ES/viewer.ftl +783 -0
  338. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/es-MX/viewer.ftl +720 -0
  339. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/et/viewer.ftl +221 -0
  340. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/eu/viewer.ftl +812 -0
  341. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/fa/viewer.ftl +808 -0
  342. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ff/viewer.ftl +206 -0
  343. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/fi/viewer.ftl +808 -0
  344. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/fr/viewer.ftl +804 -0
  345. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/fur/viewer.ftl +620 -0
  346. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/fy-NL/viewer.ftl +808 -0
  347. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ga-IE/viewer.ftl +164 -0
  348. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/gd/viewer.ftl +245 -0
  349. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/gl/viewer.ftl +563 -0
  350. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/gn/viewer.ftl +788 -0
  351. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/gu-IN/viewer.ftl +206 -0
  352. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/he/viewer.ftl +808 -0
  353. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/hi-IN/viewer.ftl +205 -0
  354. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/hr/viewer.ftl +695 -0
  355. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/hsb/viewer.ftl +836 -0
  356. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/hu/viewer.ftl +808 -0
  357. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/hy-AM/viewer.ftl +618 -0
  358. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/hye/viewer.ftl +221 -0
  359. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ia/viewer.ftl +808 -0
  360. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/id/viewer.ftl +561 -0
  361. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/is/viewer.ftl +544 -0
  362. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/it/viewer.ftl +808 -0
  363. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ja/viewer.ftl +752 -0
  364. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ka/viewer.ftl +808 -0
  365. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/kab/viewer.ftl +599 -0
  366. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/kk/viewer.ftl +808 -0
  367. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/km/viewer.ftl +222 -0
  368. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/kn/viewer.ftl +166 -0
  369. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ko/viewer.ftl +752 -0
  370. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/lij/viewer.ftl +206 -0
  371. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/lo/viewer.ftl +245 -0
  372. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/locale.json +1 -0
  373. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/lt/viewer.ftl +221 -0
  374. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ltg/viewer.ftl +205 -0
  375. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/lv/viewer.ftl +269 -0
  376. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/meh/viewer.ftl +48 -0
  377. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/mk/viewer.ftl +719 -0
  378. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ml/viewer.ftl +489 -0
  379. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/mr/viewer.ftl +194 -0
  380. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ms/viewer.ftl +206 -0
  381. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/my/viewer.ftl +157 -0
  382. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/nb-NO/viewer.ftl +808 -0
  383. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ne-NP/viewer.ftl +185 -0
  384. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/nl/viewer.ftl +808 -0
  385. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/nn-NO/viewer.ftl +808 -0
  386. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/oc/viewer.ftl +372 -0
  387. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/pa-IN/viewer.ftl +808 -0
  388. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/pl/viewer.ftl +821 -0
  389. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/pt-BR/viewer.ftl +808 -0
  390. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/pt-PT/viewer.ftl +808 -0
  391. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/rm/viewer.ftl +611 -0
  392. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ro/viewer.ftl +822 -0
  393. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ru/viewer.ftl +822 -0
  394. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sat/viewer.ftl +257 -0
  395. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sc/viewer.ftl +442 -0
  396. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/scn/viewer.ftl +32 -0
  397. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sco/viewer.ftl +217 -0
  398. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/si/viewer.ftl +214 -0
  399. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sk/viewer.ftl +836 -0
  400. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/skr/viewer.ftl +437 -0
  401. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sl/viewer.ftl +836 -0
  402. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/son/viewer.ftl +157 -0
  403. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sq/viewer.ftl +707 -0
  404. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sr/viewer.ftl +822 -0
  405. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/sv-SE/viewer.ftl +808 -0
  406. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/szl/viewer.ftl +207 -0
  407. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ta/viewer.ftl +182 -0
  408. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/te/viewer.ftl +196 -0
  409. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/tg/viewer.ftl +713 -0
  410. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/th/viewer.ftl +687 -0
  411. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/tl/viewer.ftl +207 -0
  412. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/tr/viewer.ftl +808 -0
  413. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/trs/viewer.ftl +160 -0
  414. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/uk/viewer.ftl +699 -0
  415. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/ur/viewer.ftl +206 -0
  416. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/uz/viewer.ftl +140 -0
  417. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/vi/viewer.ftl +752 -0
  418. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/wo/viewer.ftl +93 -0
  419. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/xh/viewer.ftl +163 -0
  420. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/zh-CN/viewer.ftl +733 -0
  421. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/locale/zh-TW/viewer.ftl +752 -0
  422. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
  423. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
  424. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
  425. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  426. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
  427. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
  428. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
  429. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  430. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
  431. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
  432. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_FOXIT +27 -0
  433. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_LIBERATION +363 -0
  434. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
  435. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  436. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
  437. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
  438. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/viewer.css +8265 -0
  439. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/viewer.html +1236 -0
  440. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/viewer.mjs +26437 -0
  441. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_JBIG2 +196 -0
  442. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_OPENJPEG +39 -0
  443. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  444. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  445. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_QCMS +19 -0
  446. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_QCMS +21 -0
  447. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/jbig2.wasm +0 -0
  448. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/jbig2_nowasm_fallback.js +15 -0
  449. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg.wasm +0 -0
  450. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +17 -0
  451. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/qcms_bg.wasm +0 -0
  452. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.js +16 -0
  453. docsmind-0.4.0/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.wasm +0 -0
  454. docsmind-0.2.0/.env.example +0 -29
  455. docsmind-0.2.0/.github/workflows/publish.yml +0 -49
  456. docsmind-0.2.0/.github/workflows/test.yml +0 -59
  457. docsmind-0.2.0/.python-version +0 -1
  458. docsmind-0.2.0/alembic/env.py +0 -83
  459. docsmind-0.2.0/alembic/script.py.mako +0 -26
  460. docsmind-0.2.0/alembic/versions/0001_initial_schema.py +0 -173
  461. docsmind-0.2.0/alembic/versions/0002_full_text_and_stats.py +0 -36
  462. docsmind-0.2.0/alembic.ini +0 -43
  463. docsmind-0.2.0/docker-compose.yml +0 -20
  464. docsmind-0.2.0/examples/NIST.SP.800-171r2.pdf +0 -0
  465. docsmind-0.2.0/examples/NIST.SP.800-171r3.pdf +0 -0
  466. docsmind-0.2.0/examples/parse_pdf_demo.py +0 -77
  467. docsmind-0.2.0/examples/sample.pdf +0 -0
  468. docsmind-0.2.0/scripts/make_test_pdf.py +0 -118
  469. docsmind-0.2.0/src/docsmind/cli/chat.py +0 -26
  470. docsmind-0.2.0/src/docsmind/ingestion/parsers/pdf.py +0 -255
  471. docsmind-0.2.0/src/docsmind/server/__init__.py +0 -0
  472. docsmind-0.2.0/src/docsmind/server/routes/__init__.py +0 -0
  473. docsmind-0.2.0/tests/unit/test_pdf_parser.py +0 -292
  474. docsmind-0.2.0/uv.lock +0 -5722
  475. {docsmind-0.2.0 → docsmind-0.4.0}/.gitignore +0 -0
  476. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/__init__.py +0 -0
  477. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/__init__.py +0 -0
  478. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/blobs/__init__.py +0 -0
  479. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/blobs/filesystem.py +0 -0
  480. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/embeddings/__init__.py +0 -0
  481. {docsmind-0.2.0/src/docsmind/adapters/llm → docsmind-0.4.0/src/docsmind/adapters/storage}/__init__.py +0 -0
  482. {docsmind-0.2.0/src/docsmind/adapters/storage → docsmind-0.4.0/src/docsmind/adapters/storage/postgres}/__init__.py +0 -0
  483. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/adapters/storage/postgres/engine.py +0 -0
  484. {docsmind-0.2.0/src/docsmind/adapters/storage/postgres → docsmind-0.4.0/src/docsmind/adapters/tracing}/__init__.py +0 -0
  485. {docsmind-0.2.0/src/docsmind/adapters/tracing → docsmind-0.4.0/src/docsmind/adapters/vision}/__init__.py +0 -0
  486. {docsmind-0.2.0/src/docsmind/adapters/vision → docsmind-0.4.0/src/docsmind/agent}/__init__.py +0 -0
  487. {docsmind-0.2.0/src/docsmind/agent → docsmind-0.4.0/src/docsmind/agent/subagents}/__init__.py +0 -0
  488. {docsmind-0.2.0/src/docsmind/agent/subagents → docsmind-0.4.0/src/docsmind/agent/subagents/change_analysis}/__init__.py +0 -0
  489. {docsmind-0.2.0/src/docsmind/agent/subagents/change_analysis → docsmind-0.4.0/src/docsmind/cli}/__init__.py +0 -0
  490. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/cli/db.py +0 -0
  491. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/cli/diff.py +0 -0
  492. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/cli/doctor.py +0 -0
  493. {docsmind-0.2.0/src/docsmind/agent/tools → docsmind-0.4.0/src/docsmind/domain}/__init__.py +0 -0
  494. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/domain/changes.py +0 -0
  495. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/domain/tables.py +0 -0
  496. {docsmind-0.2.0/src/docsmind/cli → docsmind-0.4.0/src/docsmind/ingestion}/__init__.py +0 -0
  497. {docsmind-0.2.0/src/docsmind/domain → docsmind-0.4.0/src/docsmind/ingestion/chunking}/__init__.py +0 -0
  498. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/ingestion/chunking/structural.py +0 -0
  499. {docsmind-0.2.0/src/docsmind/ingestion → docsmind-0.4.0/src/docsmind/ingestion/enrichment}/__init__.py +0 -0
  500. {docsmind-0.2.0/src/docsmind/ingestion/chunking → docsmind-0.4.0/src/docsmind/ingestion/parsers}/__init__.py +0 -0
  501. {docsmind-0.2.0 → docsmind-0.4.0}/src/docsmind/py.typed +0 -0
  502. {docsmind-0.2.0/src/docsmind/ingestion/enrichment → docsmind-0.4.0/src/docsmind/retrieval}/__init__.py +0 -0
  503. {docsmind-0.2.0/src/docsmind/ingestion/parsers → docsmind-0.4.0/src/docsmind/server}/__init__.py +0 -0
  504. {docsmind-0.2.0/src/docsmind/retrieval → docsmind-0.4.0/src/docsmind/server/routes}/__init__.py +0 -0
@@ -2,6 +2,53 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.4.0] - 2026-10-31
6
+
7
+ ### Added
8
+
9
+ - The Mind: a chat agent (orchestrator, planner, tool-using executor, parallel subagents)
10
+ with a deterministic harness (context builder with prompt-cache breakpoint, summarizer,
11
+ memory writer). Answers carry verified `[S#]` citations.
12
+ - Provider-neutral LLM layer with OpenAI and Anthropic streaming adapters.
13
+ - Tools: `search`, `grep`, `read_pages`, `get_outline`, `list_documents`, `delegate`;
14
+ subagents: `researcher`, `change_analyzer`.
15
+ - Migration `0004`: `conversations`, `messages`, `agent_memory` tables (run `docsmind db upgrade`).
16
+ - HTTP: `POST /api/chat` (SSE), `GET/DELETE /api/conversations`, `GET /api/agent`.
17
+ - UI: streaming chat in Workspace with live agent activity, markdown answers, citation chips
18
+ and source cards that open the PDF at the cited page; Activity lists saved conversations;
19
+ Agents reads the real registry. New frontend deps: `react-markdown`, `remark-gfm`.
20
+ - `Docsmind.chat_result()`; `chat`/`achat` accept `conversation_id`; `docsmind chat` REPL keeps
21
+ the conversation.
22
+ - Config: `agent_*` settings, `openai_base_url`, `openai_reasoning_effort`.
23
+
24
+ ## [0.3.0] - 2026-10-03
25
+
26
+ ### Added
27
+
28
+ - Bundled frontend UI in the Python package: release UI assets are copied into
29
+ `src/docsmind/server/ui` and served by `docsmind serve` at `/`.
30
+ - `scripts/bundle_frontend.py` helper to copy `../frontend/dist` into the package
31
+ before publishing.
32
+ - `docsmind delete <version-id> [-y]` command to remove one ingested version and
33
+ its derived sections/chunks/images/tables.
34
+ - HTTP `DELETE /api/documents/{version_id}` endpoint.
35
+
36
+ ### Changed
37
+
38
+ - `docsmind serve` now serves the bundled SPA (when present), in addition to
39
+ `/api/*` and `/blobs/*`.
40
+ - Ingestion now checks `content_hash` before parsing and raises a friendly
41
+ "already ingested" error instead of surfacing a raw Postgres unique-constraint
42
+ failure.
43
+
44
+ ### Fixed
45
+
46
+ - Image extraction de-duplicates repeated embedded images (e.g. page logo reused
47
+ across many pages) using perceptual hash, preventing inflated image counts.
48
+ - API duplicate-ingest responses now return HTTP 409 with structured details.
49
+
50
+
51
+
5
52
  ## [0.2.0] - 2026-09-27
6
53
 
7
54
  First functional release: documents can now be ingested from PDF into
@@ -70,9 +117,7 @@ implemented" below).
70
117
  - Embeddings and hybrid vector/keyword search. Chunks are stored without
71
118
  embeddings, and `hybrid_search` raises `NotImplementedError`.
72
119
  - Image captioning with a vision model.
73
- - The chat agent behind `docsmind chat` and the change-analysis subagent
74
- behind `docsmind diff`. Both commands exist but have no implementation
75
- behind them yet.
120
+ - The chat agent behind `docsmind chat`.
76
121
  - DOCX and plain-text parsers, S3/Supabase blob storage, and the server/UI.
77
122
  - Multi-column reading order: PDFs with genuine multi-column layouts may have
78
123
  their text interleaved in the saved full text.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: docsmind
3
- Version: 0.2.0
3
+ Version: 0.4.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
@@ -29,11 +29,13 @@ Requires-Dist: pydantic>=2.6
29
29
  Requires-Dist: pymupdf>=1.24
30
30
  Requires-Dist: rich>=13.7
31
31
  Requires-Dist: sqlalchemy[asyncio]>=2.0
32
+ Requires-Dist: tiktoken>=0.7
32
33
  Requires-Dist: typer>=0.12
33
34
  Provides-Extra: all
34
35
  Requires-Dist: anthropic>=0.34; extra == 'all'
35
36
  Requires-Dist: fastapi>=0.111; extra == 'all'
36
37
  Requires-Dist: openai>=1.30; extra == 'all'
38
+ Requires-Dist: python-multipart>=0.0.9; extra == 'all'
37
39
  Requires-Dist: uvicorn[standard]>=0.30; extra == 'all'
38
40
  Provides-Extra: anthropic
39
41
  Requires-Dist: anthropic>=0.34; extra == 'anthropic'
@@ -49,6 +51,7 @@ Provides-Extra: openai
49
51
  Requires-Dist: openai>=1.30; extra == 'openai'
50
52
  Provides-Extra: server
51
53
  Requires-Dist: fastapi>=0.111; extra == 'server'
54
+ Requires-Dist: python-multipart>=0.0.9; extra == 'server'
52
55
  Requires-Dist: uvicorn[standard]>=0.30; extra == 'server'
53
56
  Description-Content-Type: text/markdown
54
57
 
@@ -58,8 +61,6 @@ Description-Content-Type: text/markdown
58
61
  [![Python versions](https://img.shields.io/pypi/pyversions/docsmind.svg)](https://pypi.org/project/docsmind/)
59
62
  [![Downloads](https://static.pepy.tech/badge/docsmind)](https://pepy.tech/project/docsmind)
60
63
  [![Downloads / month](https://static.pepy.tech/badge/docsmind/month)](https://pepy.tech/project/docsmind)
61
- [![Tests](https://github.com/yauheniya-ai/docsmind/actions/workflows/test.yml/badge.svg)](https://github.com/yauheniya-ai/docsmind/actions/workflows/test.yml)
62
- [![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/yauheniya-ai/<GIST_ID>/raw/docsmind-coverage.json)](https://github.com/yauheniya-ai/docsmind/actions/workflows/test.yml)
63
64
  [![License: MIT](https://img.shields.io/pypi/l/docsmind.svg)](https://github.com/yauheniya-ai/docsmind/blob/main/LICENSE)
64
65
  [![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
65
66
  [![Status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)](#status)
@@ -67,9 +68,8 @@ Description-Content-Type: text/markdown
67
68
  Chat with your documents. Track what changed between versions, and why it matters.
68
69
 
69
70
  `docsmind` ingests PDFs (and soon DOCX/text) into a version-aware Postgres/pgvector
70
- store, and gives you an agent, **the Mind**, to chat with them. A built-in subagent,
71
- **diffra**, will do change analysis between document versions: what changed, where, and
72
- its compliance implications, with citations back to exact pages.
71
+ store, and gives you an agent, **the Mind**, to analyze them. Built-in subagents
72
+ will perform specialized tasks.
73
73
 
74
74
  > **Alpha.** Ingestion and inspection work today. Embeddings, chat and change analysis
75
75
  > are designed and scaffolded but not implemented yet; see [What works today](#what-works-today).
@@ -82,11 +82,13 @@ its compliance implications, with citations back to exact pages.
82
82
  | ✅ Postgres + pgvector storage | Local Docker, or any Postgres with pgvector (Neon, Supabase) |
83
83
  | ✅ Inspection CLI | `versions`, `fulltext`, `outline`, `chunks` read back exactly what was saved |
84
84
  | ✅ `docsmind doctor` | Checks database, blob storage and API keys, and tells you what to fix |
85
- | 🚧 Embeddings + hybrid search | Chunks are stored without embeddings for now |
85
+ | ✅ Table extraction | Extract and store tables skipping repeating ones (e.g. headers or footers) |
86
+ | ✅ server + UI | FastAPI backend (`docsmind serve`) + React UI (`frontend/`): add documents, browse indexed content, image and table galleries |
87
+ | ✅ 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 |
86
88
  | 🚧 Image captioning | Images are extracted and stored; vision captioning is next |
87
- | 🚧 Chat agent (the Mind) | `docsmind chat` exists as a command, without an agent behind it yet |
89
+ | 🚧 Embeddings + hybrid search | Chunks are stored without embeddings for now |
88
90
  | 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
89
- | 🚧 DOCX/text parsers, S3/Supabase blob storage, server + UI | Planned |
91
+ | 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
90
92
 
91
93
  ## Install
92
94
 
@@ -96,7 +98,7 @@ pip install docsmind
96
98
  pip install "docsmind[all]"
97
99
  ```
98
100
 
99
- Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, planned UI),
101
+ Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, serves the bundled UI),
100
102
  `docsmind[mlflow]` (tracing/eval export). Requires Python 3.10+.
101
103
 
102
104
  ## Quickstart
@@ -127,8 +129,9 @@ docsmind doctor
127
129
  ```
128
130
 
129
131
  Configuration is environment-driven (`DOCSMIND_*`, or a `.env` file). Copy
130
- `.env.example` to `.env` to see every option. Model API keys aren't needed yet;
131
- they'll be required once embeddings and chat land.
132
+ `.env.example` to `.env` to see every option. Chat needs an LLM key
133
+ (`DOCSMIND_LLM_PROVIDER` plus `DOCSMIND_ANTHROPIC_API_KEY` or `DOCSMIND_OPENAI_API_KEY`);
134
+ ingestion and browsing don't.
132
135
 
133
136
  ### 2. Ingest a PDF
134
137
 
@@ -158,13 +161,81 @@ docsmind chunks <version-id> --page 12 # the chunk(s) saved for one page
158
161
 
159
162
  You can also inspect the tables directly with `docsmind db psql`.
160
163
 
161
- ### 4. Coming next
164
+ ### 4. Browse it in the UI
165
+
166
+ ```bash
167
+ pip install "docsmind[server]"
168
+ docsmind serve # FastAPI backend on http://127.0.0.1:8000
169
+ ```
170
+
171
+ Open `http://127.0.0.1:8000`.
172
+
173
+ The React UI is bundled into the Python package and served directly by `docsmind serve`
174
+ from `docsmind/src/docsmind/server/ui`.
175
+
176
+ Clicking **+ Add Document** in the UI runs the same `docsmind ingest` pipeline on the
177
+ uploaded PDF. Selecting a document shows its saved full text/outline (**Content**), and
178
+ galleries of everything extracted from it (**Images**, **Tables**).
179
+
180
+ For contributors refreshing bundled UI assets before a release:
181
+
182
+ ```bash
183
+ cd ../frontend
184
+ npm install
185
+ npm run build
186
+ cd ../docsmind
187
+ python scripts/bundle_frontend.py
188
+ ```
189
+
190
+ ### 5. Ask the Mind
191
+
192
+ In the UI, open **Workspace** and ask a question (needs `docsmind[openai]` or `docsmind[anthropic]`
193
+ plus an API key). From the terminal or Python:
194
+
195
+ ```bash
196
+ docsmind chat "What are our data retention obligations?" # one-shot
197
+ docsmind chat # REPL, keeps the conversation
198
+ ```
162
199
 
163
200
  ```python
164
- print(dm.chat("What are our data retention obligations?")) # planned
165
- change_set = dm.compare(v1.id, v2.id) # planned (diffra)
201
+ result = dm.chat_result("What are our data retention obligations?")
202
+ print(result.answer, result.citations)
203
+ change_set = dm.compare(v1.id, v2.id) # planned (diffra)
204
+ ```
205
+
206
+ ## How the Mind works
207
+
208
+ ```
209
+ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
210
+ | ^
211
+ +--complex--> Planner --+ Harness feeds every role:
212
+ context builder, prompt cache,
213
+ summarizer, memory
166
214
  ```
167
215
 
216
+ - **Orchestrator**: one cheap call that routes the question (`simple` or `complex`) and rewrites
217
+ it as a standalone question using the conversation so far.
218
+ - **Planner** (complex only): a short list of steps the executor follows.
219
+ - **Executor**: a bounded tool loop (`search`, `grep`, `read_pages`, `get_outline`,
220
+ `list_documents`, `delegate`). The last step forces an answer; tool errors go back to the
221
+ model, not the user; old tool results are elided when the context grows.
222
+ - **Subagents** (`researcher`, `change_analyzer`): fresh context, a subset of the tools, run in
223
+ parallel, cannot delegate further.
224
+ - **Harness**: deterministic code, not another agent. It orders the prompt stable-first so the
225
+ prefix caches, summarizes long histories, and saves durable notes to memory after each answer.
226
+ - **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
227
+ handles are dropped and the rest renumbered by first appearance. Document text is treated as
228
+ untrusted data, never as instructions.
229
+ - **Search** is Postgres full-text (ranked) plus exact-text grep until embeddings land.
230
+
231
+ Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
232
+ `LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
233
+ `OPENAI_REASONING_EFFORT`, `OPENAI_BASE_URL`. See `.env.example`.
234
+
235
+ HTTP: `POST /api/chat` streams Server-Sent Events (`route`, `plan`, `tool_start`, `tool_end`,
236
+ `subagent_start`, `subagent_end`, `token`, `note`, `answer`, `error`, `done`);
237
+ `GET /api/conversations[/{id}]`, `DELETE /api/conversations/{id}`, `GET /api/agent`.
238
+
168
239
  ## How ingestion works
169
240
 
170
241
  Ingestion is deliberately simple and predictable. There's no layout guessing, because
@@ -180,6 +251,9 @@ heuristics that work on one PDF break on the next.
180
251
  reconstruct structure.
181
252
  - **Images** are extracted with their page and position, skipping tiny icons, and saved
182
253
  under a readable path: `images/<collection>/<title>/<version>-<id>/`.
254
+ Visually repeated images (e.g. logo on every page) are de-duplicated by perceptual hash.
255
+ - **Tables** are detected with PyMuPDF and rendered as PNG snippets, saved under
256
+ `tables/<collection>/<title>/<version>-<id>/`.
183
257
 
184
258
  ## CLI reference
185
259
 
@@ -190,9 +264,12 @@ heuristics that work on one PDF break on the next.
190
264
  | `docsmind fulltext <id> [--full]` | Print the saved full text |
191
265
  | `docsmind outline <id>` | Print the saved outline |
192
266
  | `docsmind chunks <id> [--page N] [--full]` | Print saved chunks |
267
+ | `docsmind delete <id> [-y]` | Delete one version and its derived chunks/images/tables |
193
268
  | `docsmind db up` / `upgrade` / `psql` | Start local Postgres, apply migrations, open psql |
194
269
  | `docsmind doctor` | Check your setup |
195
- | `docsmind chat`, `docsmind diff` | Planned |
270
+ | `docsmind serve [--host] [--port] [--reload]` | Run the FastAPI backend for the `frontend/` UI |
271
+ | `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
272
+ | `docsmind diff` | Planned |
196
273
 
197
274
  ## Architecture
198
275
 
@@ -204,7 +281,7 @@ src/docsmind/
204
281
  │
205
282
  ├── domain/ # pure data + interfaces, no I/O
206
283
  │ ├── documents.py # Document, DocumentVersion, Section, Chunk, Image, ParsedDocument
207
- │ ├── changes.py # Change, ChangeSet, ImpactAssessment (diffra)
284
+ │ ├── changes.py # Change, ChangeSet, ImpactAssessment
208
285
  │ ├── citations.py # Citation
209
286
  │ ├── tables.py # AgentTable, TableRevision
210
287
  │ └── ports.py # LLM, Embedder, VisionCaptioner, VectorStore, BlobStore, Parser
@@ -221,13 +298,24 @@ src/docsmind/
221
298
  │ ├── llm/ embeddings/ vision/ tracing/ # planned
222
299
  │
223
300
  ├── cli/ # Typer app: ingest, versions, fulltext, outline, chunks, db, doctor
224
- ├── retrieval/ # hybrid vector + keyword search (planned)
225
- ├── agent/ # the Mind + diffra subagent (planned)
226
- └── server/ # FastAPI + UI (planned)
301
+ ├── retrieval/ # keyword (full-text) search helpers; vector search planned
302
+ ├── agent/ # the Mind: orchestrator, planner, tool loop, tools, subagents, harness
303
+ └── server/ # FastAPI app + routes backing frontend/ (documents, chat SSE, conversations)
227
304
 
228
- alembic/ tests/ examples/ docs/ ui/
305
+ alembic/ tests/ examples/ docs/
229
306
  ```
230
307
 
308
+ The UI source lives one level up as a sibling project: `frontend/` (React + TypeScript +
309
+ TailwindCSS, see the repo-root `CLAUDE.md`). Release builds are bundled into
310
+ `src/docsmind/server/ui` and served by `server/app.py` at `/`. The UI talks to `server/`
311
+ over `/api/*`, and loads extracted images/tables straight from disk via `/blobs/*`.
312
+
313
+ ## Artwork attribution
314
+
315
+ - Workspace 3D graph artwork inspiration: Angela Galliat,
316
+ "Neural nervous system of a brain" (CodePen):
317
+ https://codepen.io/agalliat/pen/vYGXJxQ
318
+
231
319
  ### Design notes
232
320
 
233
321
  - **Ports and adapters, once.** `domain/ports.py` defines every external dependency as a
@@ -242,7 +330,9 @@ alembic/ tests/ examples/ docs/ ui/
242
330
  Outline paths (e.g. `03.13.11`) give version comparison something stable to align on
243
331
  where a document has a table of contents.
244
332
  - **Tables are shared state, not a UI feature.** `AgentTable` is a domain object that
245
- both the agent and the user write to (append-only revisions).
333
+ both the agent and the user write to (append-only revisions). This is distinct from
334
+ the `tables` storage table (extracted PDF table *regions*, rendered as images
335
+ alongside `images` — browsable read-only in the UI's **Tables** gallery).
246
336
 
247
337
  ## Development
248
338
 
@@ -4,8 +4,6 @@
4
4
  [![Python versions](https://img.shields.io/pypi/pyversions/docsmind.svg)](https://pypi.org/project/docsmind/)
5
5
  [![Downloads](https://static.pepy.tech/badge/docsmind)](https://pepy.tech/project/docsmind)
6
6
  [![Downloads / month](https://static.pepy.tech/badge/docsmind/month)](https://pepy.tech/project/docsmind)
7
- [![Tests](https://github.com/yauheniya-ai/docsmind/actions/workflows/test.yml/badge.svg)](https://github.com/yauheniya-ai/docsmind/actions/workflows/test.yml)
8
- [![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/yauheniya-ai/<GIST_ID>/raw/docsmind-coverage.json)](https://github.com/yauheniya-ai/docsmind/actions/workflows/test.yml)
9
7
  [![License: MIT](https://img.shields.io/pypi/l/docsmind.svg)](https://github.com/yauheniya-ai/docsmind/blob/main/LICENSE)
10
8
  [![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
11
9
  [![Status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)](#status)
@@ -13,9 +11,8 @@
13
11
  Chat with your documents. Track what changed between versions, and why it matters.
14
12
 
15
13
  `docsmind` ingests PDFs (and soon DOCX/text) into a version-aware Postgres/pgvector
16
- store, and gives you an agent, **the Mind**, to chat with them. A built-in subagent,
17
- **diffra**, will do change analysis between document versions: what changed, where, and
18
- its compliance implications, with citations back to exact pages.
14
+ store, and gives you an agent, **the Mind**, to analyze them. Built-in subagents
15
+ will perform specialized tasks.
19
16
 
20
17
  > **Alpha.** Ingestion and inspection work today. Embeddings, chat and change analysis
21
18
  > are designed and scaffolded but not implemented yet; see [What works today](#what-works-today).
@@ -28,11 +25,13 @@ its compliance implications, with citations back to exact pages.
28
25
  | ✅ Postgres + pgvector storage | Local Docker, or any Postgres with pgvector (Neon, Supabase) |
29
26
  | ✅ Inspection CLI | `versions`, `fulltext`, `outline`, `chunks` read back exactly what was saved |
30
27
  | ✅ `docsmind doctor` | Checks database, blob storage and API keys, and tells you what to fix |
31
- | 🚧 Embeddings + hybrid search | Chunks are stored without embeddings for now |
28
+ | ✅ Table extraction | Extract and store tables skipping repeating ones (e.g. headers or footers) |
29
+ | ✅ server + UI | FastAPI backend (`docsmind serve`) + React UI (`frontend/`): add documents, browse indexed content, image and table galleries |
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 |
32
31
  | 🚧 Image captioning | Images are extracted and stored; vision captioning is next |
33
- | 🚧 Chat agent (the Mind) | `docsmind chat` exists as a command, without an agent behind it yet |
32
+ | 🚧 Embeddings + hybrid search | Chunks are stored without embeddings for now |
34
33
  | 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
35
- | 🚧 DOCX/text parsers, S3/Supabase blob storage, server + UI | Planned |
34
+ | 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
36
35
 
37
36
  ## Install
38
37
 
@@ -42,7 +41,7 @@ pip install docsmind
42
41
  pip install "docsmind[all]"
43
42
  ```
44
43
 
45
- Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, planned UI),
44
+ Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, serves the bundled UI),
46
45
  `docsmind[mlflow]` (tracing/eval export). Requires Python 3.10+.
47
46
 
48
47
  ## Quickstart
@@ -73,8 +72,9 @@ docsmind doctor
73
72
  ```
74
73
 
75
74
  Configuration is environment-driven (`DOCSMIND_*`, or a `.env` file). Copy
76
- `.env.example` to `.env` to see every option. Model API keys aren't needed yet;
77
- they'll be required once embeddings and chat land.
75
+ `.env.example` to `.env` to see every option. Chat needs an LLM key
76
+ (`DOCSMIND_LLM_PROVIDER` plus `DOCSMIND_ANTHROPIC_API_KEY` or `DOCSMIND_OPENAI_API_KEY`);
77
+ ingestion and browsing don't.
78
78
 
79
79
  ### 2. Ingest a PDF
80
80
 
@@ -104,13 +104,81 @@ docsmind chunks <version-id> --page 12 # the chunk(s) saved for one page
104
104
 
105
105
  You can also inspect the tables directly with `docsmind db psql`.
106
106
 
107
- ### 4. Coming next
107
+ ### 4. Browse it in the UI
108
+
109
+ ```bash
110
+ pip install "docsmind[server]"
111
+ docsmind serve # FastAPI backend on http://127.0.0.1:8000
112
+ ```
113
+
114
+ Open `http://127.0.0.1:8000`.
115
+
116
+ The React UI is bundled into the Python package and served directly by `docsmind serve`
117
+ from `docsmind/src/docsmind/server/ui`.
118
+
119
+ Clicking **+ Add Document** in the UI runs the same `docsmind ingest` pipeline on the
120
+ uploaded PDF. Selecting a document shows its saved full text/outline (**Content**), and
121
+ galleries of everything extracted from it (**Images**, **Tables**).
122
+
123
+ For contributors refreshing bundled UI assets before a release:
124
+
125
+ ```bash
126
+ cd ../frontend
127
+ npm install
128
+ npm run build
129
+ cd ../docsmind
130
+ python scripts/bundle_frontend.py
131
+ ```
132
+
133
+ ### 5. Ask the Mind
134
+
135
+ In the UI, open **Workspace** and ask a question (needs `docsmind[openai]` or `docsmind[anthropic]`
136
+ plus an API key). From the terminal or Python:
137
+
138
+ ```bash
139
+ docsmind chat "What are our data retention obligations?" # one-shot
140
+ docsmind chat # REPL, keeps the conversation
141
+ ```
108
142
 
109
143
  ```python
110
- print(dm.chat("What are our data retention obligations?")) # planned
111
- change_set = dm.compare(v1.id, v2.id) # planned (diffra)
144
+ result = dm.chat_result("What are our data retention obligations?")
145
+ print(result.answer, result.citations)
146
+ change_set = dm.compare(v1.id, v2.id) # planned (diffra)
147
+ ```
148
+
149
+ ## How the Mind works
150
+
151
+ ```
152
+ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
153
+ | ^
154
+ +--complex--> Planner --+ Harness feeds every role:
155
+ context builder, prompt cache,
156
+ summarizer, memory
112
157
  ```
113
158
 
159
+ - **Orchestrator**: one cheap call that routes the question (`simple` or `complex`) and rewrites
160
+ it as a standalone question using the conversation so far.
161
+ - **Planner** (complex only): a short list of steps the executor follows.
162
+ - **Executor**: a bounded tool loop (`search`, `grep`, `read_pages`, `get_outline`,
163
+ `list_documents`, `delegate`). The last step forces an answer; tool errors go back to the
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.
167
+ - **Harness**: deterministic code, not another agent. It orders the prompt stable-first so the
168
+ prefix caches, summarizes long histories, and saves durable notes to memory after each answer.
169
+ - **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
170
+ handles are dropped and the rest renumbered by first appearance. Document text is treated as
171
+ untrusted data, never as instructions.
172
+ - **Search** is Postgres full-text (ranked) plus exact-text grep until embeddings land.
173
+
174
+ Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
175
+ `LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
176
+ `OPENAI_REASONING_EFFORT`, `OPENAI_BASE_URL`. See `.env.example`.
177
+
178
+ HTTP: `POST /api/chat` streams Server-Sent Events (`route`, `plan`, `tool_start`, `tool_end`,
179
+ `subagent_start`, `subagent_end`, `token`, `note`, `answer`, `error`, `done`);
180
+ `GET /api/conversations[/{id}]`, `DELETE /api/conversations/{id}`, `GET /api/agent`.
181
+
114
182
  ## How ingestion works
115
183
 
116
184
  Ingestion is deliberately simple and predictable. There's no layout guessing, because
@@ -126,6 +194,9 @@ heuristics that work on one PDF break on the next.
126
194
  reconstruct structure.
127
195
  - **Images** are extracted with their page and position, skipping tiny icons, and saved
128
196
  under a readable path: `images/<collection>/<title>/<version>-<id>/`.
197
+ Visually repeated images (e.g. logo on every page) are de-duplicated by perceptual hash.
198
+ - **Tables** are detected with PyMuPDF and rendered as PNG snippets, saved under
199
+ `tables/<collection>/<title>/<version>-<id>/`.
129
200
 
130
201
  ## CLI reference
131
202
 
@@ -136,9 +207,12 @@ heuristics that work on one PDF break on the next.
136
207
  | `docsmind fulltext <id> [--full]` | Print the saved full text |
137
208
  | `docsmind outline <id>` | Print the saved outline |
138
209
  | `docsmind chunks <id> [--page N] [--full]` | Print saved chunks |
210
+ | `docsmind delete <id> [-y]` | Delete one version and its derived chunks/images/tables |
139
211
  | `docsmind db up` / `upgrade` / `psql` | Start local Postgres, apply migrations, open psql |
140
212
  | `docsmind doctor` | Check your setup |
141
- | `docsmind chat`, `docsmind diff` | Planned |
213
+ | `docsmind serve [--host] [--port] [--reload]` | Run the FastAPI backend for the `frontend/` UI |
214
+ | `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
215
+ | `docsmind diff` | Planned |
142
216
 
143
217
  ## Architecture
144
218
 
@@ -150,7 +224,7 @@ src/docsmind/
150
224
  │
151
225
  ├── domain/ # pure data + interfaces, no I/O
152
226
  │ ├── documents.py # Document, DocumentVersion, Section, Chunk, Image, ParsedDocument
153
- │ ├── changes.py # Change, ChangeSet, ImpactAssessment (diffra)
227
+ │ ├── changes.py # Change, ChangeSet, ImpactAssessment
154
228
  │ ├── citations.py # Citation
155
229
  │ ├── tables.py # AgentTable, TableRevision
156
230
  │ └── ports.py # LLM, Embedder, VisionCaptioner, VectorStore, BlobStore, Parser
@@ -167,13 +241,24 @@ src/docsmind/
167
241
  │ ├── llm/ embeddings/ vision/ tracing/ # planned
168
242
  │
169
243
  ├── cli/ # Typer app: ingest, versions, fulltext, outline, chunks, db, doctor
170
- ├── retrieval/ # hybrid vector + keyword search (planned)
171
- ├── agent/ # the Mind + diffra subagent (planned)
172
- └── server/ # FastAPI + UI (planned)
244
+ ├── retrieval/ # keyword (full-text) search helpers; vector search planned
245
+ ├── agent/ # the Mind: orchestrator, planner, tool loop, tools, subagents, harness
246
+ └── server/ # FastAPI app + routes backing frontend/ (documents, chat SSE, conversations)
173
247
 
174
- alembic/ tests/ examples/ docs/ ui/
248
+ alembic/ tests/ examples/ docs/
175
249
  ```
176
250
 
251
+ The UI source lives one level up as a sibling project: `frontend/` (React + TypeScript +
252
+ TailwindCSS, see the repo-root `CLAUDE.md`). Release builds are bundled into
253
+ `src/docsmind/server/ui` and served by `server/app.py` at `/`. The UI talks to `server/`
254
+ over `/api/*`, and loads extracted images/tables straight from disk via `/blobs/*`.
255
+
256
+ ## Artwork attribution
257
+
258
+ - Workspace 3D graph artwork inspiration: Angela Galliat,
259
+ "Neural nervous system of a brain" (CodePen):
260
+ https://codepen.io/agalliat/pen/vYGXJxQ
261
+
177
262
  ### Design notes
178
263
 
179
264
  - **Ports and adapters, once.** `domain/ports.py` defines every external dependency as a
@@ -188,7 +273,9 @@ alembic/ tests/ examples/ docs/ ui/
188
273
  Outline paths (e.g. `03.13.11`) give version comparison something stable to align on
189
274
  where a document has a table of contents.
190
275
  - **Tables are shared state, not a UI feature.** `AgentTable` is a domain object that
191
- both the agent and the user write to (append-only revisions).
276
+ both the agent and the user write to (append-only revisions). This is distinct from
277
+ the `tables` storage table (extracted PDF table *regions*, rendered as images
278
+ alongside `images` — browsable read-only in the UI's **Tables** gallery).
192
279
 
193
280
  ## Development
194
281
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "docsmind"
7
- version = "0.2.0"
7
+ version = "0.4.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"
@@ -38,12 +38,13 @@ dependencies = [
38
38
  "pillow>=10.0",
39
39
  "imagehash>=4.3",
40
40
  "rich>=13.7",
41
+ "tiktoken>=0.7",
41
42
  ]
42
43
 
43
44
  [project.optional-dependencies]
44
45
  openai = ["openai>=1.30"]
45
46
  anthropic = ["anthropic>=0.34"]
46
- server = ["fastapi>=0.111", "uvicorn[standard]>=0.30"]
47
+ server = ["fastapi>=0.111", "uvicorn[standard]>=0.30", "python-multipart>=0.0.9"]
47
48
  mlflow = ["mlflow>=2.14"]
48
49
  dev = ["pytest>=8.0", "pytest-asyncio>=0.23", "testcontainers[postgres]>=4.4", "ruff>=0.5", "mypy>=1.10"]
49
50
  all = ["docsmind[openai,anthropic,server]"]
@@ -61,6 +62,15 @@ Issues = "https://github.com/yauheniya-ai/docsmind/issues"
61
62
 
62
63
  [tool.hatch.build.targets.wheel]
63
64
  packages = ["src/docsmind"]
65
+ include = ["src/docsmind/server/ui/**"]
66
+
67
+ [tool.hatch.build.targets.sdist]
68
+ include = [
69
+ "src/docsmind/**",
70
+ "README.md",
71
+ "CHANGELOG.md",
72
+ "scripts/bundle_frontend.py",
73
+ ]
64
74
 
65
75
  [tool.pytest.ini_options]
66
76
  asyncio_mode = "auto"
@@ -79,4 +89,4 @@ target-version = "py310"
79
89
  # image is corrupt" — and a single malformed image in an otherwise-fine PDF
80
90
  # shouldn't abort the whole ingest, so we deliberately catch broadly here and
81
91
  # skip the one image rather than propagate.
82
- "src/docsmind/ingestion/parsers/pdf.py" = ["BLE001"]
92
+ "src/docsmind/ingestion/parsers/pdf.py" = ["BLE001"]
@@ -0,0 +1,31 @@
1
+ """LLM adapter registry. SDKs are imported lazily inside each adapter, so a
2
+ bare `pip install docsmind` never needs openai/anthropic installed."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from docsmind.config import DocsmindConfig
7
+ from docsmind.domain.errors import LLMConfigurationError
8
+ from docsmind.domain.ports import LLM
9
+
10
+
11
+ def create_llm(config: DocsmindConfig, *, model: str | None = None) -> LLM:
12
+ """Build the configured LLM. `model` overrides `config.llm_model` (used
13
+ for the fast model that routes, summarizes and writes memory)."""
14
+ provider = config.llm_provider.lower()
15
+ model = model or config.llm_model
16
+ if provider == "openai":
17
+ from docsmind.adapters.llm.openai_llm import OpenAILLM
18
+
19
+ return OpenAILLM(
20
+ api_key=config.openai_api_key,
21
+ model=model,
22
+ base_url=config.openai_base_url,
23
+ reasoning_effort=config.openai_reasoning_effort,
24
+ )
25
+ if provider == "anthropic":
26
+ from docsmind.adapters.llm.anthropic_llm import AnthropicLLM
27
+
28
+ return AnthropicLLM(api_key=config.anthropic_api_key, model=model)
29
+ raise LLMConfigurationError(
30
+ f"Unknown DOCSMIND_LLM_PROVIDER '{config.llm_provider}'. Use 'anthropic' or 'openai'."
31
+ )