groundworkers 0.3.3__tar.gz → 0.5.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 (313) hide show
  1. groundworkers-0.5.0/.githooks/pre-commit +36 -0
  2. groundworkers-0.5.0/.github/CONTRIBUTING.md +27 -0
  3. groundworkers-0.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +66 -0
  4. groundworkers-0.5.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. groundworkers-0.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +32 -0
  6. groundworkers-0.5.0/.github/ISSUE_TEMPLATE/not_working.yml +65 -0
  7. groundworkers-0.5.0/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  8. groundworkers-0.5.0/.github/release-drafter.yml +31 -0
  9. groundworkers-0.5.0/.github/workflows/ci.yml +52 -0
  10. groundworkers-0.5.0/.github/workflows/docs.yml +10 -0
  11. groundworkers-0.5.0/.github/workflows/merge.yml +13 -0
  12. groundworkers-0.5.0/.github/workflows/publish.yml +21 -0
  13. groundworkers-0.5.0/.gitignore +22 -0
  14. groundworkers-0.5.0/.python-version +1 -0
  15. groundworkers-0.5.0/CHANGELOG.md +58 -0
  16. groundworkers-0.5.0/Makefile +23 -0
  17. groundworkers-0.5.0/PKG-INFO +133 -0
  18. groundworkers-0.5.0/README.md +75 -0
  19. groundworkers-0.5.0/config/docker-compose.yaml +40 -0
  20. groundworkers-0.5.0/config/groundworkers.example.toml +141 -0
  21. groundworkers-0.5.0/config/groundworkers_db.env +5 -0
  22. groundworkers-0.5.0/docs/adapters/cdm.md +53 -0
  23. groundworkers-0.5.0/docs/adapters/omop_emb.md +70 -0
  24. groundworkers-0.5.0/docs/adapters/omop_graph.md +67 -0
  25. groundworkers-0.5.0/docs/architecture.md +181 -0
  26. groundworkers-0.5.0/docs/concepts.md +98 -0
  27. groundworkers-0.5.0/docs/development/extending.md +121 -0
  28. groundworkers-0.5.0/docs/development/integration.md +132 -0
  29. groundworkers-0.5.0/docs/development/plugins.md +195 -0
  30. groundworkers-0.5.0/docs/from-scratch.md +134 -0
  31. groundworkers-0.5.0/docs/index.md +76 -0
  32. groundworkers-0.5.0/docs/js/mermaid-init.js +6 -0
  33. groundworkers-0.5.0/docs/reference/ref_adapters.md +17 -0
  34. groundworkers-0.5.0/docs/reference/ref_base.md +13 -0
  35. groundworkers-0.5.0/docs/reference/ref_config.md +3 -0
  36. groundworkers-0.5.0/docs/reference/ref_services.md +61 -0
  37. groundworkers-0.5.0/docs/reference/ref_tools.md +41 -0
  38. groundworkers-0.5.0/docs/services/domain.md +106 -0
  39. groundworkers-0.5.0/docs/services/graph.md +57 -0
  40. groundworkers-0.5.0/docs/services/grounding.md +51 -0
  41. groundworkers-0.5.0/docs/services/mapping.md +106 -0
  42. groundworkers-0.5.0/docs/services/semantic_projection.md +153 -0
  43. groundworkers-0.5.0/docs/services/source_planning.md +39 -0
  44. groundworkers-0.5.0/docs/services/text.md +165 -0
  45. groundworkers-0.5.0/docs/services/vocab.md +168 -0
  46. groundworkers-0.5.0/docs/static/01_create_config.png +0 -0
  47. groundworkers-0.5.0/docs/static/02_empty_config.png +0 -0
  48. groundworkers-0.5.0/docs/static/03_config_wizard.png +0 -0
  49. groundworkers-0.5.0/docs/static/04_test_cnx.png +0 -0
  50. groundworkers-0.5.0/docs/static/04_warnings.png +0 -0
  51. groundworkers-0.5.0/docs/static/05_graph_setup.png +0 -0
  52. groundworkers-0.5.0/docs/static/06_load_predicates.png +0 -0
  53. groundworkers-0.5.0/docs/static/07_vector_store.png +0 -0
  54. groundworkers-0.5.0/docs/static/08_register_embedding.png +0 -0
  55. groundworkers-0.5.0/docs/static/10_setup_complete.png +0 -0
  56. groundworkers-0.5.0/docs/tools/concept.md +318 -0
  57. groundworkers-0.5.0/docs/tools/domain.md +81 -0
  58. groundworkers-0.5.0/docs/tools/embedding.md +113 -0
  59. groundworkers-0.5.0/docs/tools/knowledge.md +46 -0
  60. groundworkers-0.5.0/docs/tools/mapping.md +220 -0
  61. groundworkers-0.5.0/docs/tools/overview.md +54 -0
  62. groundworkers-0.5.0/docs/tools/resolver.md +73 -0
  63. groundworkers-0.5.0/docs/tools/search.md +156 -0
  64. groundworkers-0.5.0/docs/tools/semantic_projection.md +127 -0
  65. groundworkers-0.5.0/docs/tools/source_planning.md +48 -0
  66. groundworkers-0.5.0/docs/tools/system.md +68 -0
  67. groundworkers-0.5.0/docs/tools/text.md +104 -0
  68. groundworkers-0.5.0/docs/usage/configuration.md +345 -0
  69. groundworkers-0.5.0/docs/usage/installation.md +119 -0
  70. groundworkers-0.5.0/docs/usage/integrations.md +138 -0
  71. groundworkers-0.5.0/docs/usage/setup_journey.md +17 -0
  72. groundworkers-0.5.0/docs/usage/testing.md +34 -0
  73. groundworkers-0.5.0/mkdocs.yaml +103 -0
  74. {groundworkers-0.3.3 → groundworkers-0.5.0}/pyproject.toml +45 -20
  75. groundworkers-0.5.0/src/groundworkers/__init__.py +10 -0
  76. groundworkers-0.5.0/src/groundworkers/_env.py +108 -0
  77. groundworkers-0.5.0/src/groundworkers/adapters/llm.py +298 -0
  78. groundworkers-0.5.0/src/groundworkers/adapters/omop_emb.py +563 -0
  79. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/adapters/omop_graph.py +283 -96
  80. groundworkers-0.5.0/src/groundworkers/app.py +355 -0
  81. groundworkers-0.5.0/src/groundworkers/application/__init__.py +1 -0
  82. groundworkers-0.5.0/src/groundworkers/application/setup/__init__.py +6 -0
  83. groundworkers-0.5.0/src/groundworkers/application/setup/configuration.py +229 -0
  84. groundworkers-0.5.0/src/groundworkers/application/setup/configuration_provider.py +2045 -0
  85. groundworkers-0.5.0/src/groundworkers/application/setup/databases.py +940 -0
  86. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_artifacts.py +145 -0
  87. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_capability.py +125 -0
  88. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_coverage.py +118 -0
  89. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_population.py +291 -0
  90. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_reconciliation.py +101 -0
  91. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_registry.py +91 -0
  92. groundworkers-0.5.0/src/groundworkers/application/setup/embedding_setup.py +522 -0
  93. groundworkers-0.5.0/src/groundworkers/application/setup/graph_maintenance.py +215 -0
  94. groundworkers-0.5.0/src/groundworkers/application/setup/integration.py +44 -0
  95. groundworkers-0.5.0/src/groundworkers/application/setup/maintenance_runs.py +926 -0
  96. groundworkers-0.5.0/src/groundworkers/application/setup/model_inventory.py +83 -0
  97. groundworkers-0.5.0/src/groundworkers/application/setup/models.py +460 -0
  98. groundworkers-0.5.0/src/groundworkers/application/setup/performance_maintenance.py +151 -0
  99. groundworkers-0.5.0/src/groundworkers/application/setup/plugin_configuration.py +861 -0
  100. groundworkers-0.5.0/src/groundworkers/application/setup/runtime_setup.py +501 -0
  101. groundworkers-0.5.0/src/groundworkers/base/__init__.py +25 -0
  102. groundworkers-0.5.0/src/groundworkers/base/concept_payload.py +160 -0
  103. groundworkers-0.5.0/src/groundworkers/base/domain_names.py +78 -0
  104. groundworkers-0.5.0/src/groundworkers/base/errors.py +86 -0
  105. groundworkers-0.5.0/src/groundworkers/base/results.py +64 -0
  106. groundworkers-0.5.0/src/groundworkers/base/server.py +336 -0
  107. groundworkers-0.5.0/src/groundworkers/base/sql.py +30 -0
  108. groundworkers-0.5.0/src/groundworkers/bootstrap.py +97 -0
  109. groundworkers-0.5.0/src/groundworkers/config/README +6 -0
  110. groundworkers-0.5.0/src/groundworkers/config/predicate_classification.csv +26 -0
  111. groundworkers-0.5.0/src/groundworkers/config/predicate_mapping.csv +735 -0
  112. groundworkers-0.5.0/src/groundworkers/config.py +316 -0
  113. groundworkers-0.5.0/src/groundworkers/plugins.py +336 -0
  114. groundworkers-0.5.0/src/groundworkers/server.py +325 -0
  115. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/domain.py +37 -8
  116. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/graph.py +170 -51
  117. groundworkers-0.5.0/src/groundworkers/services/grounding.py +250 -0
  118. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/knowledge/catalogue.py +2 -1
  119. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/knowledge/models.py +0 -1
  120. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/mapping.py +156 -18
  121. groundworkers-0.5.0/src/groundworkers/services/semantic_projection/__init__.py +25 -0
  122. groundworkers-0.5.0/src/groundworkers/services/semantic_projection/definitions.py +319 -0
  123. groundworkers-0.5.0/src/groundworkers/services/semantic_projection/models.py +80 -0
  124. groundworkers-0.5.0/src/groundworkers/services/semantic_projection/service.py +147 -0
  125. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/__init__.py +18 -15
  126. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/assisted.py +30 -4
  127. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/classifier.py +11 -8
  128. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/csv_.py +4 -2
  129. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/docx_.py +5 -2
  130. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/models.py +13 -3
  131. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/normalisation.py +4 -3
  132. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/service.py +55 -4
  133. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/__init__.py +10 -4
  134. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/redcap.py +3 -1
  135. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/registry.py +6 -2
  136. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/prompts.py +0 -1
  137. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/service.py +83 -1
  138. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/vocab.py +250 -134
  139. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/concept_tools.py +8 -30
  140. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/domain_tools.py +7 -6
  141. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/embedding_tools.py +46 -15
  142. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/knowledge_tools.py +8 -8
  143. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/mapping_tools.py +8 -24
  144. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/resolver_tools.py +34 -19
  145. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/search_tools.py +3 -9
  146. groundworkers-0.5.0/src/groundworkers/tools/semantic_projection_tools.py +78 -0
  147. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/source_planning_tools.py +5 -10
  148. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/system_tools.py +114 -19
  149. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/text_tools.py +30 -26
  150. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/rest/api.py +28 -4
  151. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/rest/models.py +2 -2
  152. groundworkers-0.5.0/src/groundworkers/tui/__init__.py +5 -0
  153. groundworkers-0.5.0/src/groundworkers/tui/app.py +208 -0
  154. groundworkers-0.5.0/src/groundworkers/tui/pages/__init__.py +7 -0
  155. groundworkers-0.5.0/src/groundworkers/tui/pages/base.py +52 -0
  156. groundworkers-0.5.0/src/groundworkers/tui/pages/plugin_config.py +211 -0
  157. groundworkers-0.5.0/src/groundworkers/tui/pages/plugin_setup.py +34 -0
  158. groundworkers-0.5.0/src/groundworkers/tui/pages/setup.py +1030 -0
  159. groundworkers-0.5.0/src/groundworkers/tui/presenters/__init__.py +1 -0
  160. groundworkers-0.5.0/src/groundworkers/tui/presenters/base.py +59 -0
  161. groundworkers-0.5.0/src/groundworkers/tui/presenters/chat.py +45 -0
  162. groundworkers-0.5.0/src/groundworkers/tui/presenters/configuration.py +57 -0
  163. groundworkers-0.5.0/src/groundworkers/tui/presenters/database.py +284 -0
  164. groundworkers-0.5.0/src/groundworkers/tui/presenters/embeddings.py +606 -0
  165. groundworkers-0.5.0/src/groundworkers/tui/presenters/graph.py +116 -0
  166. groundworkers-0.5.0/src/groundworkers/tui/presenters/llm_provider.py +298 -0
  167. groundworkers-0.5.0/src/groundworkers/tui/presenters/overview.py +131 -0
  168. groundworkers-0.5.0/src/groundworkers/tui/presenters/performance.py +173 -0
  169. groundworkers-0.5.0/src/groundworkers/tui/presenters/runs.py +107 -0
  170. groundworkers-0.5.0/src/groundworkers/tui/routes.py +9 -0
  171. groundworkers-0.5.0/src/groundworkers/tui/state.py +80 -0
  172. groundworkers-0.5.0/src/groundworkers/tui/wizards/__init__.py +1 -0
  173. groundworkers-0.5.0/src/groundworkers/tui/wizards/config_location.py +235 -0
  174. groundworkers-0.5.0/src/groundworkers/tui/wizards/embedding_store.py +96 -0
  175. groundworkers-0.5.0/src/groundworkers/tui/wizards/embeddings.py +502 -0
  176. groundworkers-0.5.0/src/groundworkers/tui/wizards/graph_maintenance.py +396 -0
  177. groundworkers-0.5.0/src/groundworkers/tui/wizards/performance_maintenance.py +221 -0
  178. groundworkers-0.5.0/src/groundworkers/tui/wizards/plugin_setup.py +164 -0
  179. groundworkers-0.5.0/tests/__init__.py +0 -0
  180. groundworkers-0.5.0/tests/conftest.py +33 -0
  181. groundworkers-0.5.0/tests/integration/__init__.py +0 -0
  182. groundworkers-0.5.0/tests/integration/test_omop_emb_adapter.py +105 -0
  183. groundworkers-0.5.0/tests/integration/test_omop_graph_adapter.py +435 -0
  184. groundworkers-0.5.0/tests/support/__init__.py +13 -0
  185. groundworkers-0.5.0/tests/support/postgres_ci_config.toml +5 -0
  186. groundworkers-0.5.0/tests/support/seed_postgres_fixture.py +339 -0
  187. groundworkers-0.5.0/tests/support/stack_config.py +170 -0
  188. groundworkers-0.5.0/tests/test_bootstrap_config.py +276 -0
  189. {groundworkers-0.3.3 → groundworkers-0.5.0}/tests/test_rest_api.py +56 -13
  190. groundworkers-0.5.0/tests/test_server_registry.py +563 -0
  191. groundworkers-0.5.0/tests/unit/__init__.py +0 -0
  192. groundworkers-0.5.0/tests/unit/test_concept_payload.py +162 -0
  193. groundworkers-0.5.0/tests/unit/test_concept_tools.py +748 -0
  194. groundworkers-0.5.0/tests/unit/test_config_location_wizard.py +344 -0
  195. groundworkers-0.5.0/tests/unit/test_configuration_provider.py +617 -0
  196. groundworkers-0.5.0/tests/unit/test_domain_names.py +102 -0
  197. groundworkers-0.5.0/tests/unit/test_domain_tools.py +118 -0
  198. groundworkers-0.5.0/tests/unit/test_embedding_population_scope.py +211 -0
  199. groundworkers-0.5.0/tests/unit/test_embedding_reconciliation.py +307 -0
  200. groundworkers-0.5.0/tests/unit/test_embedding_registry_step.py +159 -0
  201. groundworkers-0.5.0/tests/unit/test_embedding_tools.py +291 -0
  202. groundworkers-0.5.0/tests/unit/test_env_bootstrap.py +180 -0
  203. groundworkers-0.5.0/tests/unit/test_error_boundary.py +50 -0
  204. groundworkers-0.5.0/tests/unit/test_graph_maintenance.py +194 -0
  205. groundworkers-0.5.0/tests/unit/test_graph_maintenance_wizard.py +282 -0
  206. groundworkers-0.5.0/tests/unit/test_graph_service.py +59 -0
  207. groundworkers-0.5.0/tests/unit/test_graph_status.py +118 -0
  208. groundworkers-0.5.0/tests/unit/test_grounding_constraints.py +515 -0
  209. groundworkers-0.5.0/tests/unit/test_grounding_service.py +198 -0
  210. groundworkers-0.5.0/tests/unit/test_knowledge_catalogue.py +219 -0
  211. groundworkers-0.5.0/tests/unit/test_llm_adapter.py +263 -0
  212. groundworkers-0.5.0/tests/unit/test_maintenance_runs_phase2.py +347 -0
  213. groundworkers-0.5.0/tests/unit/test_mapping_service.py +726 -0
  214. groundworkers-0.5.0/tests/unit/test_mapping_tools.py +142 -0
  215. groundworkers-0.5.0/tests/unit/test_migration_boundaries.py +155 -0
  216. groundworkers-0.5.0/tests/unit/test_omop_emb_adapter.py +446 -0
  217. groundworkers-0.5.0/tests/unit/test_omop_emb_setup_config.py +163 -0
  218. groundworkers-0.5.0/tests/unit/test_omop_graph_adapter.py +236 -0
  219. groundworkers-0.5.0/tests/unit/test_performance.py +65 -0
  220. groundworkers-0.5.0/tests/unit/test_phase3_overview.py +66 -0
  221. groundworkers-0.5.0/tests/unit/test_plugin_configuration.py +206 -0
  222. groundworkers-0.5.0/tests/unit/test_plugins.py +238 -0
  223. groundworkers-0.5.0/tests/unit/test_provider_fields.py +66 -0
  224. groundworkers-0.5.0/tests/unit/test_schema_resolution.py +251 -0
  225. groundworkers-0.5.0/tests/unit/test_semantic_projection_service.py +333 -0
  226. groundworkers-0.5.0/tests/unit/test_semantic_projection_tools.py +119 -0
  227. groundworkers-0.5.0/tests/unit/test_setup_artifacts_and_coverage.py +134 -0
  228. groundworkers-0.5.0/tests/unit/test_setup_configuration.py +175 -0
  229. groundworkers-0.5.0/tests/unit/test_setup_configuration_section.py +68 -0
  230. groundworkers-0.5.0/tests/unit/test_setup_databases.py +471 -0
  231. groundworkers-0.5.0/tests/unit/test_setup_embeddings.py +545 -0
  232. groundworkers-0.5.0/tests/unit/test_setup_provider_conformance.py +197 -0
  233. groundworkers-0.5.0/tests/unit/test_setup_runtime.py +399 -0
  234. groundworkers-0.5.0/tests/unit/test_setup_truth.py +185 -0
  235. groundworkers-0.5.0/tests/unit/test_setup_write_flows.py +498 -0
  236. groundworkers-0.5.0/tests/unit/test_source_planning_classifier.py +205 -0
  237. groundworkers-0.5.0/tests/unit/test_source_planning_decomposer.py +134 -0
  238. groundworkers-0.5.0/tests/unit/test_source_planning_detector.py +46 -0
  239. groundworkers-0.5.0/tests/unit/test_source_planning_models.py +141 -0
  240. groundworkers-0.5.0/tests/unit/test_source_planning_normalisation.py +128 -0
  241. groundworkers-0.5.0/tests/unit/test_source_planning_router.py +277 -0
  242. groundworkers-0.5.0/tests/unit/test_source_planning_service.py +403 -0
  243. groundworkers-0.5.0/tests/unit/test_source_planning_tools.py +87 -0
  244. groundworkers-0.5.0/tests/unit/test_stack_config_fixtures.py +55 -0
  245. groundworkers-0.5.0/tests/unit/test_system_tools.py +412 -0
  246. groundworkers-0.5.0/tests/unit/test_text_service.py +262 -0
  247. groundworkers-0.5.0/tests/unit/test_text_tools.py +399 -0
  248. groundworkers-0.5.0/tests/unit/test_tui_app.py +938 -0
  249. groundworkers-0.5.0/tests/unit/test_tui_state.py +475 -0
  250. groundworkers-0.5.0/tests/unit/test_vector_store_setup.py +208 -0
  251. groundworkers-0.5.0/tests/unit/test_vocab_service.py +148 -0
  252. groundworkers-0.5.0/uv.lock +4825 -0
  253. groundworkers-0.3.3/PKG-INFO +0 -179
  254. groundworkers-0.3.3/README.md +0 -133
  255. groundworkers-0.3.3/setup.cfg +0 -4
  256. groundworkers-0.3.3/src/groundworkers/__init__.py +0 -3
  257. groundworkers-0.3.3/src/groundworkers/adapters/llm.py +0 -177
  258. groundworkers-0.3.3/src/groundworkers/adapters/omop_emb.py +0 -304
  259. groundworkers-0.3.3/src/groundworkers/app.py +0 -213
  260. groundworkers-0.3.3/src/groundworkers/base/__init__.py +0 -14
  261. groundworkers-0.3.3/src/groundworkers/base/errors.py +0 -22
  262. groundworkers-0.3.3/src/groundworkers/base/results.py +0 -38
  263. groundworkers-0.3.3/src/groundworkers/base/server.py +0 -125
  264. groundworkers-0.3.3/src/groundworkers/bootstrap.py +0 -120
  265. groundworkers-0.3.3/src/groundworkers/config.py +0 -276
  266. groundworkers-0.3.3/src/groundworkers/server.py +0 -133
  267. groundworkers-0.3.3/src/groundworkers/services/grounding.py +0 -118
  268. groundworkers-0.3.3/src/groundworkers.egg-info/PKG-INFO +0 -179
  269. groundworkers-0.3.3/src/groundworkers.egg-info/SOURCES.txt +0 -93
  270. groundworkers-0.3.3/src/groundworkers.egg-info/dependency_links.txt +0 -1
  271. groundworkers-0.3.3/src/groundworkers.egg-info/entry_points.txt +0 -5
  272. groundworkers-0.3.3/src/groundworkers.egg-info/requires.txt +0 -47
  273. groundworkers-0.3.3/src/groundworkers.egg-info/top_level.txt +0 -1
  274. groundworkers-0.3.3/tests/test_bootstrap_config.py +0 -151
  275. groundworkers-0.3.3/tests/test_server_registry.py +0 -419
  276. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/adapters/__init__.py +0 -0
  277. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/adapters/cdm.py +0 -0
  278. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/criteria-gate-yesno/guidance.md +0 -0
  279. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/criteria-gate-yesno/manifest.yaml +0 -0
  280. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/diagnosis-role-modifier/guidance.md +0 -0
  281. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/diagnosis-role-modifier/manifest.yaml +0 -0
  282. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/domain-routing/guidance.md +0 -0
  283. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/domain-routing/manifest.yaml +0 -0
  284. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/domain-routing/rules.yaml +0 -0
  285. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/drug-concept-granularity/guidance.md +0 -0
  286. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/drug-concept-granularity/manifest.yaml +0 -0
  287. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/drug-concept-granularity/rules.yaml +0 -0
  288. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/history-of-event/guidance.md +0 -0
  289. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/history-of-event/manifest.yaml +0 -0
  290. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/standard-concept-preference/guidance.md +0 -0
  291. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/standard-concept-preference/manifest.yaml +0 -0
  292. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/standard-concept-preference/rules.yaml +0 -0
  293. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/__init__.py +0 -0
  294. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/knowledge/__init__.py +0 -0
  295. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/canonical_headers.py +0 -0
  296. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposer.py +0 -0
  297. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/__init__.py +0 -0
  298. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/ddl_.py +0 -0
  299. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/json_.py +0 -0
  300. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/pdf_.py +0 -0
  301. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/xlsx_.py +0 -0
  302. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/xml_.py +0 -0
  303. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/detector.py +0 -0
  304. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/provenance.py +0 -0
  305. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/router.py +0 -0
  306. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/serialisation.py +0 -0
  307. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/base.py +0 -0
  308. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/warnings.py +0 -0
  309. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/__init__.py +1 -1
  310. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/models.py +0 -0
  311. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/__init__.py +0 -0
  312. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/__init__.py +0 -0
  313. {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/rest/__init__.py +0 -0
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env bash
2
+ # Canonical CAVA pre-commit hook: keeps uv.lock in sync with pyproject.toml.
3
+ #
4
+ # If pyproject.toml is staged, finds the specific dependency line(s) that
5
+ # changed (added, removed, or had their version spec edited) and refreshes
6
+ # only those packages in uv.lock via `uv lock --upgrade-package`. Does not
7
+ # touch any other package -- this is a targeted sync, not a blanket
8
+ # `uv lock`, so it never pulls in an unrelated upstream release.
9
+ set -euo pipefail
10
+
11
+ if ! git diff --cached --name-only | grep -q '^pyproject\.toml$'; then
12
+ exit 0
13
+ fi
14
+
15
+ if ! command -v uv >/dev/null 2>&1; then
16
+ echo "pre-commit: uv not found on PATH, skipping uv.lock sync" >&2
17
+ exit 0
18
+ fi
19
+
20
+ changed_names=$(git diff --cached -- pyproject.toml \
21
+ | sed -nE 's/^[+-][[:space:]]*"([A-Za-z0-9][A-Za-z0-9._-]*).*/\1/p' \
22
+ | sort -u)
23
+
24
+ if [ -z "$changed_names" ]; then
25
+ exit 0
26
+ fi
27
+
28
+ upgrade_args=()
29
+ while IFS= read -r name; do
30
+ upgrade_args+=(--upgrade-package "$name")
31
+ done <<< "$changed_names"
32
+
33
+ echo "pre-commit: syncing uv.lock for changed dependencies:"
34
+ echo "$changed_names" | sed 's/^/ - /'
35
+ uv lock "${upgrade_args[@]}"
36
+ git add uv.lock
@@ -0,0 +1,27 @@
1
+ # Contributing
2
+
3
+ ## Development setup
4
+
5
+ ```bash
6
+ uv sync --all-extras --dev
7
+ uv run pytest -q
8
+ uv run ruff check .
9
+ ```
10
+
11
+ ## Opening a pull request
12
+
13
+ 1. Apply **exactly one** label before merging:
14
+
15
+ | Label | When to use |
16
+ |---|---|
17
+ | `breaking` | Public API change, backward-incompatible |
18
+ | `feature` | New functionality, backward-compatible |
19
+ | `fix` | Bug fix |
20
+ | `dependencies` | Dependency version update |
21
+ | `chore` | CI changes, refactoring, test additions, docs — anything that does not affect the public-facing package. Bypasses the label gate; excluded from the changelog and does not bump the version. |
22
+
23
+ 2. When merging (squash), write a clear extended description in the merge dialog. That text — not the PR's opening description — becomes the changelog entry for this change. Leave it blank for `chore` PRs.
24
+
25
+ ## Versioning and releases
26
+
27
+ Versions are derived from git tags; there is no version string in any source file. Releases are triggered by a maintainer publishing the standing draft release on the repository's Releases page. There is no automated commit-back to `main`.
@@ -0,0 +1,66 @@
1
+ name: "🐞 Bug Report"
2
+ description: Report a reproducible bug.
3
+ type: "Bug"
4
+ body:
5
+ - type: checkboxes
6
+ attributes:
7
+ label: Pre-flight
8
+ options:
9
+ - label: I searched existing issues and this is not a duplicate.
10
+ required: true
11
+
12
+ - type: textarea
13
+ id: summary
14
+ attributes:
15
+ label: Summary
16
+ description: One or two sentences describing the bug.
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: reproduction
22
+ attributes:
23
+ label: Reproduction
24
+ description: Steps and/or a minimal code example that reproduces the issue. Wrap code in triple backticks.
25
+ placeholder: |
26
+ 1. Import X and call Y with Z
27
+ 2. Observe error
28
+
29
+ ```python
30
+ # minimal example
31
+ ```
32
+ validations:
33
+ required: true
34
+
35
+ - type: textarea
36
+ id: actual
37
+ attributes:
38
+ label: Actual behaviour
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: expected
44
+ attributes:
45
+ label: Expected behaviour
46
+ validations:
47
+ required: true
48
+
49
+ - type: textarea
50
+ id: logs
51
+ attributes:
52
+ label: Error output
53
+ description: Full traceback if applicable. Formatted automatically.
54
+ render: python-traceback
55
+
56
+ - type: textarea
57
+ id: system
58
+ attributes:
59
+ label: System info
60
+ description: |
61
+ Run this in your environment and paste the output:
62
+
63
+ ```shell
64
+ python <(curl -s https://raw.githubusercontent.com/AustralianCancerDataNetwork/cava-devops/main/scripts/cava_system_info.py)
65
+ ```
66
+ render: shell
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Discussions
4
+ url: https://github.com/orgs/AustralianCancerDataNetwork/discussions
5
+ about: Questions and general discussion about the CAVA stack.
@@ -0,0 +1,32 @@
1
+ name: "🚀 Feature Request"
2
+ description: Propose a new feature or enhancement.
3
+ type: "Feature"
4
+ body:
5
+ - type: checkboxes
6
+ attributes:
7
+ label: Pre-flight
8
+ options:
9
+ - label: I searched existing issues and this has not been requested before.
10
+ required: true
11
+
12
+ - type: textarea
13
+ id: problem
14
+ attributes:
15
+ label: Problem or motivation
16
+ description: What are you trying to do that you currently cannot?
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: proposal
22
+ attributes:
23
+ label: Proposed solution
24
+ description: How would you like this to work?
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: alternatives
30
+ attributes:
31
+ label: Alternatives considered
32
+ description: Other approaches you considered and why you ruled them out.
@@ -0,0 +1,65 @@
1
+ name: "❗ Something is not working"
2
+ description: Something behaves unexpectedly but you are not sure if it is a bug.
3
+ body:
4
+ - type: checkboxes
5
+ attributes:
6
+ label: Pre-flight
7
+ options:
8
+ - label: I searched existing issues for this problem.
9
+ required: true
10
+
11
+ - type: textarea
12
+ id: summary
13
+ attributes:
14
+ label: Problem summary
15
+ description: 1-2 sentences describing what is not working.
16
+ validations:
17
+ required: true
18
+
19
+ - type: textarea
20
+ id: reproduction
21
+ attributes:
22
+ label: Reproduction
23
+ description: Steps and/or a minimal code example. Wrap code in triple backticks.
24
+ placeholder: |
25
+ 1. Import X and call Y with Z
26
+ 2. Observe unexpected behaviour
27
+
28
+ ```python
29
+ # minimal example
30
+ ```
31
+ validations:
32
+ required: true
33
+
34
+ - type: textarea
35
+ id: actual
36
+ attributes:
37
+ label: Actual outcome
38
+ validations:
39
+ required: true
40
+
41
+ - type: textarea
42
+ id: expected
43
+ attributes:
44
+ label: Expected outcome
45
+ validations:
46
+ required: true
47
+
48
+ - type: textarea
49
+ id: logs
50
+ attributes:
51
+ label: Error messages
52
+ description: Full traceback if applicable. Formatted automatically.
53
+ render: python-traceback
54
+
55
+ - type: textarea
56
+ id: system
57
+ attributes:
58
+ label: System info
59
+ description: |
60
+ Run this in your environment and paste the output:
61
+
62
+ ```shell
63
+ python <(curl -s https://raw.githubusercontent.com/AustralianCancerDataNetwork/cava-devops/main/scripts/cava_system_info.py)
64
+ ```
65
+ render: shell
@@ -0,0 +1,9 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR do? This text becomes the changelog entry — write it for a reader who will see it months from now, not for the reviewer reading the diff. Leave blank for chore PRs. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] Applied exactly one label (`breaking`, `feature`, `fix`, `dependencies`, or `chore`)
8
+ - [ ] Tests pass locally (`uv run pytest -q`)
9
+ - [ ] Lint passes (`uv run ruff check .`)
@@ -0,0 +1,31 @@
1
+ name-template: 'v$RESOLVED_VERSION'
2
+ tag-template: 'v$RESOLVED_VERSION'
3
+ commitish: main
4
+
5
+ categories:
6
+ - title: Breaking Changes
7
+ labels: ['breaking']
8
+ - title: Features
9
+ labels: ['feature']
10
+ - title: Fixes
11
+ labels: ['fix']
12
+ - title: Dependencies
13
+ labels: ['dependencies']
14
+
15
+ template: |
16
+ $CHANGES
17
+
18
+ change-template: '- **$TITLE** (#$NUMBER) @$AUTHOR'
19
+
20
+ version-resolver:
21
+ major:
22
+ labels: ['breaking']
23
+ minor:
24
+ labels: ['feature']
25
+ patch:
26
+ labels: ['fix', 'dependencies']
27
+ default: patch
28
+
29
+ exclude-labels: ['chore']
30
+
31
+ autolabeler: []
@@ -0,0 +1,52 @@
1
+ name: CI
2
+ on:
3
+ pull_request:
4
+ branches: [main]
5
+ types: [opened, synchronize, reopened, labeled, unlabeled]
6
+ jobs:
7
+ label-gate:
8
+ uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/label-gate.yml@main
9
+ build-test:
10
+ uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/build-test.yml@main
11
+ build-test-postgres:
12
+ uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/build-test-postgres.yml@main
13
+ with:
14
+ ty-src: src
15
+ postgres-image: pgvector/pgvector:pg18
16
+ postgres-db: test_db
17
+ postgres-user: postgres
18
+ postgres-password: postgres
19
+ setup-commands: |
20
+ mkdir -p "$RUNNER_TEMP/omop"
21
+ cp tests/support/postgres_ci_config.toml "$RUNNER_TEMP/omop/config.toml"
22
+ export OA_CONFIG_PATH="$RUNNER_TEMP/omop/config.toml"
23
+ export GROUNDWORKERS_CONFIG_PATH="$RUNNER_TEMP/omop/config.toml"
24
+ export GROUNDWORKERS_REQUIRE_INTEGRATION=1
25
+ export GROUNDWORKERS_TEST_DATABASE_URL="postgresql+psycopg://postgres:postgres@localhost:5432/test_db"
26
+ echo "OA_CONFIG_PATH=$RUNNER_TEMP/omop/config.toml" >> "$GITHUB_ENV"
27
+ echo "GROUNDWORKERS_CONFIG_PATH=$RUNNER_TEMP/omop/config.toml" >> "$GITHUB_ENV"
28
+ echo "GROUNDWORKERS_REQUIRE_INTEGRATION=1" >> "$GITHUB_ENV"
29
+ echo "GROUNDWORKERS_TEST_DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/test_db" >> "$GITHUB_ENV"
30
+ uv run omop-config connections add pg_test \
31
+ --dialect postgresql+psycopg \
32
+ --host localhost \
33
+ --port 5432 \
34
+ --user postgres \
35
+ --password postgres \
36
+ --database-name test_db \
37
+ --test-only false
38
+ uv run omop-config databases add test_cdm_db \
39
+ --kind cdm \
40
+ --connection pg_test \
41
+ --schema-name public
42
+ uv run omop-config databases add test_vector_db \
43
+ --kind generic \
44
+ --connection pg_test \
45
+ --schema-name public
46
+ uv run omop-config vector-stores add test_embeddings \
47
+ --backend-type pgvector \
48
+ --database test_vector_db
49
+ uv run omop-config configure groundworkers \
50
+ --cdm-db test_cdm_db \
51
+ --vector-store-name test_embeddings
52
+ uv run python -m tests.support.seed_postgres_fixture
@@ -0,0 +1,10 @@
1
+ name: Deploy Docs
2
+ on:
3
+ push:
4
+ tags: ['v*']
5
+ workflow_dispatch:
6
+ permissions:
7
+ contents: write
8
+ jobs:
9
+ deploy:
10
+ uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/deploy-docs.yml@main
@@ -0,0 +1,13 @@
1
+ name: Release Update
2
+ on:
3
+ pull_request:
4
+ types: [closed]
5
+ branches: [main]
6
+ permissions:
7
+ contents: write
8
+ pull-requests: read
9
+ jobs:
10
+ draft:
11
+ if: github.event.pull_request.merged == true
12
+ uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/release-drafter.yml@main
13
+ secrets: inherit
@@ -0,0 +1,21 @@
1
+ name: Publish
2
+ on:
3
+ push:
4
+ tags: ['v*']
5
+ jobs:
6
+ build:
7
+ uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/publish.yml@main
8
+ publish:
9
+ # Inline: PyPI OIDC checks job_workflow_ref, which must point to this file.
10
+ # Moving pypa/gh-action-pypi-publish into cava-devops would break the trusted publisher.
11
+ needs: build
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ id-token: write
15
+ environment:
16
+ name: pypi
17
+ url: https://pypi.org/p/groundworkers
18
+ steps:
19
+ - uses: actions/download-artifact@v4
20
+ with: { name: dist, path: dist/ }
21
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,22 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .pytest_cache/
5
+ .mypy_cache/
6
+ .ruff_cache/
7
+ dist/
8
+ build/
9
+ *.egg-info/
10
+ .DS_Store
11
+ _design/
12
+ *.log
13
+ *.bak
14
+ *.tmp
15
+ .vscode/
16
+ settings.json
17
+ *.local.yaml
18
+ *.local.toml
19
+ site/
20
+ _knowledge/
21
+ data/
22
+ .env
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,58 @@
1
+ ### CHANGELOG NO LONGER MAINTAINED
2
+ now handled in ci/cd automation consistent the rest of the cava-devops stack
3
+
4
+ ## 0.3.4
5
+ - started building out the configuration TUI
6
+ - lock upper boundary for oa_configurator compatibility
7
+
8
+ ## 0.3.3
9
+
10
+ feature: changed the way that knowledge packs are registered, updated baseline knowledge packs (status is very draft for this part - ymmv)
11
+
12
+ ## 0.3.2
13
+
14
+ fix: repaired integration tests
15
+
16
+ ## 0.3.1
17
+
18
+ chore: version bump
19
+
20
+ ## 0.3.0
21
+
22
+ feat: knowledge-base integration, layer cleanup, oa-configurator integration, graph and embedding services
23
+ fix: candidate-bundle metadata, knowledge content-serving, embedding-backend honesty, source-profile signals
24
+
25
+ - populate identity metadata (`concept_code`, `vocabulary_id`, `domain_id`, `concept_class_id`) on embedding-only candidates in `concept_candidate_bundle` via a single batch `concept_views` backfill (omop-emb never carries these); warn when the graph service is unavailable to enrich them
26
+ - finish the knowledge catalogue: add `KnowledgeCatalogue.get_pack()` and a `knowledge_pack` MCP tool that serve pack `guidance`/`rules`/`examples` content — previously only manifest metadata and filenames were exposed; also collapse the dead tail branch in `PackApplicability.matches`
27
+ - reject an unsupported embedding backend eagerly at build time with an actionable message, clarifying that FAISS is a query-time cache accelerator (`faiss_cache_dir` + the `embedding-faiss` extra), not a standalone backend value
28
+ - record `inferred_vocab` on source-vocabulary columns so the router derives a table-level domain hint from them, and surface the matched source profile's `structural_skip_field_types` and `packed_value_column_hint` on `PreIngestBundle` / the assisted-plan REST response instead of discarding them
29
+ - require `omop-emb>=1.1.1`
30
+ - add knowledge-base catalogue integration and expand the knowledge-facing tool and service surface
31
+ - introduce dedicated graph and grounding services so concept and resolver tools delegate through a cleaner service-layer split
32
+ - integrate `oa-configurator` into application/bootstrap wiring and refresh the example configuration path
33
+ - expand the `omop-graph` and `omop-emb` adapter layer, including parentless domain-constrained grounding support via `omop-graph>=1.3.0`
34
+ - refresh architecture and service documentation, including new graph, grounding, resolver, and source-planning pages
35
+
36
+ ## 0.2.0
37
+
38
+ feat: add direct Python service layer, mapping workflows, and docs refresh
39
+
40
+ - add `build_application()` and a shared application container for direct Python consumers
41
+ - add `MappingService` as a reusable service-layer API for mapping-oriented workflows
42
+ - add mapping tools for normalized search, candidate bundles, parent backoff, mapping context, `Maps to value`, mapping-expression resolution, and candidate evaluation
43
+ - keep mapping MCP tools thin by delegating orchestration to the service layer
44
+ - tighten `omop-emb` typing through the adapter and server composition path
45
+ - extend docs to cover MCP and direct-Python integration, layer boundaries, and mapping workflows
46
+
47
+ ## 0.1.1
48
+
49
+ feat: add chunk coherence pass and review-state transitions
50
+
51
+ - add coherence reranking based on approved-set distribution
52
+ - infer provisional sets for inferred chunks
53
+ - transition processed chunks to REVIEW and skip them on resume
54
+ - add unit coverage for coherence behavior
55
+
56
+ ## 0.1.0
57
+
58
+ - alpha release for review
@@ -0,0 +1,23 @@
1
+ .PHONY: setup test lint typecheck check describe
2
+
3
+ PYTHON := .venv/bin/python3
4
+ CONFIG ?= config/groundworkers.example.toml
5
+
6
+ # Mirrors the install CI performs, so a local run reproduces the pipeline exactly.
7
+ setup:
8
+ uv sync --all-extras --dev
9
+
10
+ describe:
11
+ $(PYTHON) -m groundworkers.server --config $(CONFIG) --describe
12
+
13
+ lint:
14
+ uv run ruff check .
15
+
16
+ typecheck:
17
+ uv run ty check src/
18
+
19
+ test:
20
+ uv run pytest -q
21
+
22
+ # The three gates build-test.yml enforces on every pull request.
23
+ check: typecheck lint test
@@ -0,0 +1,133 @@
1
+ Metadata-Version: 2.5
2
+ Name: groundworkers
3
+ Version: 0.5.0
4
+ Summary: Groundworkers MCP server — read-only agentive access to OMOP vocabularies, concept graphs, and embeddings.
5
+ Requires-Python: >=3.12
6
+ Requires-Dist: fastapi<1.0,>=0.110
7
+ Requires-Dist: mcp[cli]<2,>=1
8
+ Requires-Dist: numpy<3,>=1.26
9
+ Requires-Dist: oa-configurator<2,>=1.3.0
10
+ Requires-Dist: omop-alchemy<2,>=1.1
11
+ Requires-Dist: omop-emb<3,>=2.1
12
+ Requires-Dist: omop-graph<3,>=2.1
13
+ Requires-Dist: omop-llm<2,>=1
14
+ Requires-Dist: omop-semantics<1,>=0.6
15
+ Requires-Dist: psutil<8,>=5.9
16
+ Requires-Dist: psycopg[binary]<4,>=3.1
17
+ Requires-Dist: pydantic<3,>=2
18
+ Requires-Dist: python-dotenv<2,>=1
19
+ Requires-Dist: pyyaml<7,>=6
20
+ Requires-Dist: sqlalchemy<3,>=2
21
+ Requires-Dist: uvicorn[standard]<1.0,>=0.29
22
+ Provides-Extra: all-source
23
+ Requires-Dist: openpyxl<4,>=3.1; extra == 'all-source'
24
+ Requires-Dist: pdfplumber>=0.10; extra == 'all-source'
25
+ Requires-Dist: python-docx>=1.0; extra == 'all-source'
26
+ Provides-Extra: dev
27
+ Requires-Dist: httpx<1,>=0.27; extra == 'dev'
28
+ Requires-Dist: ipython>=8.0; extra == 'dev'
29
+ Requires-Dist: mkdocs-material>=9.7.1; extra == 'dev'
30
+ Requires-Dist: mkdocs-mermaid2-plugin; extra == 'dev'
31
+ Requires-Dist: mkdocs>=1.6.1; extra == 'dev'
32
+ Requires-Dist: mkdocstrings-python>=2.0.1; extra == 'dev'
33
+ Requires-Dist: mypy>=1.8; extra == 'dev'
34
+ Requires-Dist: pytest-cov>=4.0; extra == 'dev'
35
+ Requires-Dist: pytest>=9.0.3; extra == 'dev'
36
+ Requires-Dist: requests>=2.33.0; extra == 'dev'
37
+ Requires-Dist: ruff>=0.4; extra == 'dev'
38
+ Requires-Dist: textual>=0.60; extra == 'dev'
39
+ Requires-Dist: tornado>=6.5.5; extra == 'dev'
40
+ Requires-Dist: ty>=0.0.59; extra == 'dev'
41
+ Provides-Extra: docx
42
+ Requires-Dist: python-docx>=1.0; extra == 'docx'
43
+ Provides-Extra: embedding-artifacts
44
+ Requires-Dist: h5py<4,>=3.10; extra == 'embedding-artifacts'
45
+ Provides-Extra: embedding-faiss
46
+ Requires-Dist: omop-emb[faiss-cpu]<3,>=2.1; extra == 'embedding-faiss'
47
+ Provides-Extra: embedding-pgvector
48
+ Requires-Dist: omop-emb[pgvector]<3,>=2.1; extra == 'embedding-pgvector'
49
+ Provides-Extra: pdf
50
+ Requires-Dist: pdfplumber>=0.10; extra == 'pdf'
51
+ Provides-Extra: tui
52
+ Requires-Dist: groundskeeping<1,>=0.8.1; extra == 'tui'
53
+ Requires-Dist: rich<15,>=13; extra == 'tui'
54
+ Requires-Dist: textual>=0.60; extra == 'tui'
55
+ Provides-Extra: xlsx
56
+ Requires-Dist: openpyxl<4,>=3.1; extra == 'xlsx'
57
+ Description-Content-Type: text/markdown
58
+
59
+ # groundworkers
60
+
61
+ Groundworkers is the reusable, read-only capability layer for OMOP vocabulary lookup, concept mapping, source planning, and related analysis. It combines deterministic services with optional embeddings and model-assisted operations.
62
+
63
+ It does not own patient-level writes, session state, or job lifecycle. Those concerns belong to the calling application; `groundcrew` is the usual stateful orchestrator.
64
+
65
+ ## Choose an interface
66
+
67
+ | Interface | Use it when |
68
+ | --- | --- |
69
+ | MCP | An agent needs discoverable tools, prompts, resources, and a shared remote runtime. |
70
+ | REST | An application needs the curated HTTP workflows for candidate bundles or assisted source planning. |
71
+ | Python | A process owns batching, evaluation, or orchestration and can run in-process. |
72
+
73
+ Start with the [documentation home](docs/index.md), or choose a path directly:
74
+
75
+ - [Concepts and capability choices](docs/concepts.md) explains retrieval, grounding, mapping, source planning, and projection.
76
+ - [Installation](docs/usage/installation.md) covers package extras and prerequisites.
77
+ - [Initial local setup](docs/from-scratch.md) walks through a fresh CDM-backed deployment.
78
+ - [Integrations](docs/usage/integrations.md) shows MCP, REST, and Python calls.
79
+ - [Configuration](docs/usage/configuration.md) explains shared-stack references and optional capabilities.
80
+ - [Tools overview](docs/tools/overview.md) maps jobs to the discoverable MCP surface.
81
+
82
+ ## Quick start
83
+
84
+ Install the package and configure the shared OMOP stack:
85
+
86
+ ```bash
87
+ pip install groundworkers
88
+ omop-config configure groundworkers
89
+ ```
90
+
91
+ Inspect the active configuration and MCP surface before starting a service:
92
+
93
+ ```bash
94
+ groundworkers --describe
95
+ ```
96
+
97
+ Run MCP over stdio for a client that starts the process, or over Streamable HTTP for a shared service:
98
+
99
+ ```bash
100
+ groundworkers
101
+ groundworkers --transport streamable-http --host 127.0.0.1 --port 8000
102
+ ```
103
+
104
+ REST is a separate, curated interface:
105
+
106
+ ```bash
107
+ groundworkers --transport rest --host 127.0.0.1 --port 8080
108
+ ```
109
+
110
+ ## Direct Python
111
+
112
+ Build the application once and reuse it. Services are optional when their prerequisites are not configured:
113
+
114
+ ```python
115
+ from groundworkers.app import build_application
116
+ from groundworkers.bootstrap import build_app_config
117
+
118
+ config = build_app_config()
119
+ app = build_application(config)
120
+
121
+ bundle = app.services.mapping.concept_candidate_bundle(
122
+ "type 2 diabetes",
123
+ domain="Condition",
124
+ )
125
+ ```
126
+
127
+ The `mapping` service in this example requires a configured CDM database. Embedding-backed channels require an embedding model and vector store; text, domain classification, and assisted source planning require a configured chat model. Use `groundworkers --describe` to see what the current deployment exposes.
128
+
129
+ ## Companion repositories
130
+
131
+ - [groundcrew](https://github.com/AustralianCancerDataNetwork/groundcrew) owns session state and orchestration.
132
+ - [omop-graph](https://australiancancerdatanetwork.github.io/omop-graph/) provides graph-backed OMOP traversal.
133
+ - [omop-emb](https://australiancancerdatanetwork.github.io/omop-emb/) provides embedding stores and indexes.