GeneralManager 0.90.0__tar.gz → 0.91.1__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 (379) hide show
  1. {generalmanager-0.90.0/src/GeneralManager.egg-info → generalmanager-0.91.1}/PKG-INFO +1 -1
  2. {generalmanager-0.90.0 → generalmanager-0.91.1}/pyproject.toml +1 -1
  3. {generalmanager-0.90.0 → generalmanager-0.91.1/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/SOURCES.txt +1 -0
  5. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_query_permissions.py +141 -2
  6. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_resolvers.py +26 -1
  7. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_search.py +22 -28
  8. generalmanager-0.91.1/src/general_manager/api/graphql_work_limits.py +35 -0
  9. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/orm_interface.py +15 -0
  10. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/general_manager.py +19 -0
  11. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/permission_data_manager.py +16 -2
  12. {generalmanager-0.90.0 → generalmanager-0.91.1}/LICENSE +0 -0
  13. {generalmanager-0.90.0 → generalmanager-0.91.1}/README.md +0 -0
  14. {generalmanager-0.90.0 → generalmanager-0.91.1}/setup.cfg +0 -0
  15. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  16. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/requires.txt +0 -0
  17. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/top_level.txt +0 -0
  18. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/__init__.py +0 -0
  19. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/__init__.py +0 -0
  20. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/api.py +0 -0
  21. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/bucket.py +0 -0
  22. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/cache.py +0 -0
  23. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/dataframes.py +0 -0
  24. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/factory.py +0 -0
  25. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/general_manager.py +0 -0
  26. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/interface.py +0 -0
  27. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/manager.py +0 -0
  28. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/measurement.py +0 -0
  29. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/permission.py +0 -0
  30. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/rule.py +0 -0
  31. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/search.py +0 -0
  32. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/utils.py +0 -0
  33. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/__init__.py +0 -0
  34. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql.py +0 -0
  35. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_as_of.py +0 -0
  36. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_errors.py +0 -0
  37. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_filter_contract.py +0 -0
  38. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_groups.py +0 -0
  39. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_identifiers.py +0 -0
  40. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_mutations.py +0 -0
  41. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_ordering.py +0 -0
  42. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_output.py +0 -0
  43. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_prefetch.py +0 -0
  44. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_relations.py +0 -0
  45. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  46. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_subscriptions.py +0 -0
  47. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_type.py +0 -0
  48. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_units.py +0 -0
  49. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_value_contract.py +0 -0
  50. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_view.py +0 -0
  51. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup.py +0 -0
  52. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  53. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  54. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/mutation.py +0 -0
  55. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/mutation_controls.py +0 -0
  56. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/notification_batching.py +0 -0
  57. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/property.py +0 -0
  58. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/registry.py +0 -0
  59. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/remote_api.py +0 -0
  60. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/remote_invalidation.py +0 -0
  61. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/remote_invalidation_client.py +0 -0
  62. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/apps.py +0 -0
  63. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/as_of.py +0 -0
  64. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bootstrap.py +0 -0
  65. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/__init__.py +0 -0
  66. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  67. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/_ordering.py +0 -0
  68. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/base_bucket.py +0 -0
  69. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/calculation_bucket.py +0 -0
  70. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/database_bucket.py +0 -0
  71. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/excel_bucket.py +0 -0
  72. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/group_bucket.py +0 -0
  73. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/indexing.py +0 -0
  74. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/projection.py +0 -0
  75. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/request_bucket.py +0 -0
  76. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/__init__.py +0 -0
  77. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/_dependency_graph.py +0 -0
  78. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/batch_refresh.py +0 -0
  79. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/cache_decorator.py +0 -0
  80. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/cache_tracker.py +0 -0
  81. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/data_change_context.py +0 -0
  82. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_cache.py +0 -0
  83. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_index.py +0 -0
  84. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_matching.py +0 -0
  85. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_publish.py +0 -0
  86. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_shards.py +0 -0
  87. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/model_dependency_collector.py +0 -0
  88. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/run_context.py +0 -0
  89. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/run_context_lru.py +0 -0
  90. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/signals.py +0 -0
  91. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/transaction_barrier.py +0 -0
  92. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/__init__.py +0 -0
  93. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/audit.py +0 -0
  94. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/audit_identity.py +0 -0
  95. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/bootstrap.py +0 -0
  96. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/checks.py +0 -0
  97. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/consumer.py +0 -0
  98. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/context.py +0 -0
  99. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/errors.py +0 -0
  100. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/__init__.py +0 -0
  101. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/__main__.py +0 -0
  102. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/baseline.py +0 -0
  103. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  104. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  105. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  106. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  107. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  108. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  109. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  110. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/diagnostics.py +0 -0
  111. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/execution.py +0 -0
  112. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/fingerprints.py +0 -0
  113. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/fixtures.py +0 -0
  114. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  115. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  116. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/contract.py +0 -0
  117. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  118. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/result_set.py +0 -0
  119. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  120. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/outcomes.py +0 -0
  121. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/readiness.py +0 -0
  122. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/runner.py +0 -0
  123. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/traces.py +0 -0
  124. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/graphql_contract.py +0 -0
  125. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/grounding.py +0 -0
  126. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/models.py +0 -0
  127. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/mutation_inputs.py +0 -0
  128. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/__init__.py +0 -0
  129. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/action_contract.py +0 -0
  130. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/binding_diagnostics.py +0 -0
  131. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/budget.py +0 -0
  132. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/calculation_scope.py +0 -0
  133. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/calculations.py +0 -0
  134. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/catalog.py +0 -0
  135. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/category_binding.py +0 -0
  136. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/choice_context.py +0 -0
  137. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/clarification.py +0 -0
  138. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/config.py +0 -0
  139. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/contract.py +0 -0
  140. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/conversion.py +0 -0
  141. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/cross_query.py +0 -0
  142. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/deferred_calculations.py +0 -0
  143. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/deferred_schema.py +0 -0
  144. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/events.py +0 -0
  145. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/evidence.py +0 -0
  146. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/evidence_selection.py +0 -0
  147. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/group_actions.py +0 -0
  148. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/models.py +0 -0
  149. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/planner.py +0 -0
  150. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/planner_context.py +0 -0
  151. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/provider_calls.py +0 -0
  152. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/resolver.py +0 -0
  153. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/scheduler.py +0 -0
  154. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/schema_projection.py +0 -0
  155. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/selector_clarification.py +0 -0
  156. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/selector_question.py +0 -0
  157. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/synthesis.py +0 -0
  158. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/validation.py +0 -0
  159. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/__init__.py +0 -0
  160. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/_shared.py +0 -0
  161. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/anthropic.py +0 -0
  162. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/base.py +0 -0
  163. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/google.py +0 -0
  164. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/ollama.py +0 -0
  165. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/openai.py +0 -0
  166. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/rate_limits.py +0 -0
  167. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/routing.py +0 -0
  168. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/schema_index.py +0 -0
  169. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/schema_inspection.py +0 -0
  170. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/settings.py +0 -0
  171. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/signals.py +0 -0
  172. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/system_prompt.py +0 -0
  173. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/tool_metadata.py +0 -0
  174. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/tools.py +0 -0
  175. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/turns.py +0 -0
  176. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/views.py +0 -0
  177. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/conf.py +0 -0
  178. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/dataframes/__init__.py +0 -0
  179. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/dataframes/measurements.py +0 -0
  180. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/__init__.py +0 -0
  181. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/auto_factory.py +0 -0
  182. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/factories.py +0 -0
  183. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/factory_methods.py +0 -0
  184. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/__init__.py +0 -0
  185. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/base_interface.py +0 -0
  186. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/__init__.py +0 -0
  187. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/calculation.py +0 -0
  188. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/database.py +0 -0
  189. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/excel.py +0 -0
  190. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  191. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/request.py +0 -0
  192. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/__init__.py +0 -0
  193. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/base.py +0 -0
  194. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/builtin.py +0 -0
  195. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  196. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  197. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  198. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  199. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/configuration.py +0 -0
  200. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  201. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  202. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  203. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  204. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  205. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  206. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  207. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/factory.py +0 -0
  208. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  209. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  210. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  211. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  212. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  213. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/history_query.py +0 -0
  214. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  215. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  216. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  217. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  218. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/collection_probes.py +0 -0
  219. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  220. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  221. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  222. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  223. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  224. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  225. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  226. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  227. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  228. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/registry.py +0 -0
  229. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  230. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  231. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/request/relation_inputs.py +0 -0
  232. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/excel.py +0 -0
  233. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/excel_store.py +0 -0
  234. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/excel_workbook.py +0 -0
  235. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  236. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  237. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  238. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/__init__.py +0 -0
  239. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/calculation.py +0 -0
  240. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/database.py +0 -0
  241. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/excel.py +0 -0
  242. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  243. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/read_only.py +0 -0
  244. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  245. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/request.py +0 -0
  246. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/__init__.py +0 -0
  247. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  248. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  249. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/capability_models.py +0 -0
  250. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/requests.py +0 -0
  251. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/unit_contract.py +0 -0
  252. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/__init__.py +0 -0
  253. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  254. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/errors.py +0 -0
  255. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/history.py +0 -0
  256. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/models.py +0 -0
  257. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/logging.py +0 -0
  258. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  259. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  260. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  261. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  262. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/search_index.py +0 -0
  263. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/search_reconcile.py +0 -0
  264. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  265. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/shell.py +0 -0
  266. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/sync_read_only.py +0 -0
  267. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  268. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  269. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/__init__.py +0 -0
  270. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/bulk_create.py +0 -0
  271. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/group_manager.py +0 -0
  272. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/input.py +0 -0
  273. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/meta.py +0 -0
  274. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/measurement/__init__.py +0 -0
  275. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/measurement/measurement.py +0 -0
  276. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/measurement/measurement_field.py +0 -0
  277. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/metrics/__init__.py +0 -0
  278. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/metrics/graphql.py +0 -0
  279. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0001_initial.py +0 -0
  280. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  281. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  282. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  283. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  284. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  285. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  286. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  287. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  288. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  289. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  290. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  291. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  292. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/__init__.py +0 -0
  293. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/models.py +0 -0
  294. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/__init__.py +0 -0
  295. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/audit.py +0 -0
  296. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/base_permission.py +0 -0
  297. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/graphql_capabilities.py +0 -0
  298. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/manager_based_permission.py +0 -0
  299. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/mutation_permission.py +0 -0
  300. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/permission_checks.py +0 -0
  301. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/relation_aliases.py +0 -0
  302. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/utils.py +0 -0
  303. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/public_api_registry.py +0 -0
  304. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/py.typed +0 -0
  305. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/rule/__init__.py +0 -0
  306. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/rule/handler.py +0 -0
  307. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/rule/rule.py +0 -0
  308. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/__init__.py +0 -0
  309. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/async_tasks.py +0 -0
  310. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/authorization.py +0 -0
  311. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backend.py +0 -0
  312. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backend_registry.py +0 -0
  313. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/__init__.py +0 -0
  314. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/dev.py +0 -0
  315. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/meilisearch.py +0 -0
  316. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/opensearch.py +0 -0
  317. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/typesense.py +0 -0
  318. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/checks.py +0 -0
  319. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/config.py +0 -0
  320. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/identity.py +0 -0
  321. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/indexer.py +0 -0
  322. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/invalidation.py +0 -0
  323. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/m2m_invalidation.py +0 -0
  324. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/models.py +0 -0
  325. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/projection.py +0 -0
  326. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/reconciliation.py +0 -0
  327. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/registry.py +0 -0
  328. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/tasks.py +0 -0
  329. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/utils.py +0 -0
  330. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/seeding/__init__.py +0 -0
  331. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/seeding/manager_landscape.py +0 -0
  332. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/__init__.py +0 -0
  333. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/adapters.py +0 -0
  334. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/checks.py +0 -0
  335. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/config.py +0 -0
  336. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/errors.py +0 -0
  337. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/finalization.py +0 -0
  338. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/graphql.py +0 -0
  339. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/graphql_types.py +0 -0
  340. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/metrics.py +0 -0
  341. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/models.py +0 -0
  342. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/public.py +0 -0
  343. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/s3.py +0 -0
  344. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/services.py +0 -0
  345. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/tokens.py +0 -0
  346. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/types.py +0 -0
  347. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/urls.py +0 -0
  348. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/views.py +0 -0
  349. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/__init__.py +0 -0
  350. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  351. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  352. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_make_cache_key.py +0 -0
  353. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_none_to_zero.py +0 -0
  354. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/executable_contract.py +0 -0
  355. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/filter_parser.py +0 -0
  356. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/format_string.py +0 -0
  357. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/json_encoder.py +0 -0
  358. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/path_mapping.py +0 -0
  359. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/public_api.py +0 -0
  360. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/testing.py +0 -0
  361. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/type_checks.py +0 -0
  362. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/__init__.py +0 -0
  363. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/actions.py +0 -0
  364. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backend_registry.py +0 -0
  365. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/__init__.py +0 -0
  366. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/celery.py +0 -0
  367. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/local.py +0 -0
  368. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/n8n.py +0 -0
  369. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/config.py +0 -0
  370. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/engine.py +0 -0
  371. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/event_registry.py +0 -0
  372. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/events.py +0 -0
  373. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/models.py +0 -0
  374. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/signal_bridge.py +0 -0
  375. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/tasks.py +0 -0
  376. {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/telemetry.py +0 -0
  377. {generalmanager-0.90.0 → generalmanager-0.91.1}/tests/test_settings.py +0 -0
  378. {generalmanager-0.90.0 → generalmanager-0.91.1}/tests/test_urls.py +0 -0
  379. {generalmanager-0.90.0 → generalmanager-0.91.1}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.90.0
3
+ Version: 0.91.1
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "GeneralManager"
7
- version = "0.90.0"
7
+ version = "0.91.1"
8
8
  description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.90.0
3
+ Version: 0.91.1
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -53,6 +53,7 @@ src/general_manager/api/graphql_view.py
53
53
  src/general_manager/api/graphql_warmup.py
54
54
  src/general_manager/api/graphql_warmup_registry.py
55
55
  src/general_manager/api/graphql_warmup_tasks.py
56
+ src/general_manager/api/graphql_work_limits.py
56
57
  src/general_manager/api/mutation.py
57
58
  src/general_manager/api/mutation_controls.py
58
59
  src/general_manager/api/notification_batching.py
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING
9
9
 
10
10
  from graphql import GraphQLError
11
11
 
12
+ from general_manager.api.graphql_work_limits import get_graphql_work_limit
12
13
  from general_manager.bucket.base_bucket import Bucket
13
14
  from general_manager.bucket.request_bucket import RequestBucket
14
15
  from general_manager.manager.general_manager import GeneralManager
@@ -47,7 +48,7 @@ CUSTOM_PROJECTION_ERROR = (
47
48
  )
48
49
 
49
50
  # Bound field/path decisions; bucket materialization and row checks precede this.
50
- MAX_QUERY_PERMISSION_CANDIDATES = 1000
51
+ MAX_QUERY_PERMISSION_CANDIDATES: int | None = None
51
52
  _LOOKUPS = {
52
53
  "exact",
53
54
  "iexact",
@@ -79,11 +80,16 @@ class QueryFieldAuthorizationBudget:
79
80
  """Share only accounting across authorization calls in one operation."""
80
81
 
81
82
  decisions: int = 0
83
+ limit: int | None = field(
84
+ default_factory=lambda: get_graphql_work_limit(
85
+ "GRAPHQL_QUERY_PERMISSION_LIMIT", MAX_QUERY_PERMISSION_CANDIDATES
86
+ )
87
+ )
82
88
 
83
89
  def charge(self) -> None:
84
90
  """Reject work exceeding the operation's field/path decision limit."""
85
91
  self.decisions += 1
86
- if self.decisions > MAX_QUERY_PERMISSION_CANDIDATES:
92
+ if self.limit is not None and self.decisions > self.limit:
87
93
  raise GraphQLError(_LIMIT_ERROR)
88
94
 
89
95
 
@@ -655,3 +661,136 @@ def authorize_query_fields(
655
661
  check(candidate, normalized_parts)
656
662
  if isinstance(candidates, RequestBucket) and not candidates.response_is_complete:
657
663
  raise GraphQLError(INCOMPLETE_ERROR)
664
+
665
+
666
+ def _prepare_pushdown_structure(
667
+ manager: type[GeneralManager],
668
+ ) -> _NativeQueryStructure | None:
669
+ """Attest native construction before statically interpreting field policies."""
670
+ from general_manager.utils.executable_contract import executable_matches
671
+
672
+ if type(manager) is not GeneralManagerMeta:
673
+ return None
674
+ from general_manager.manager.general_manager import (
675
+ _QUERY_PUSHDOWN_MANAGER_METHODS,
676
+ _COMMON_MANAGER_IDENTIFICATION,
677
+ )
678
+ from general_manager.interface.orm_interface import (
679
+ _QUERY_PUSHDOWN_INTERFACE_METHODS,
680
+ )
681
+
682
+ if not _unchanged_metadata_methods(manager, _QUERY_PUSHDOWN_MANAGER_METHODS):
683
+ return None
684
+ identification, signature = _COMMON_MANAGER_IDENTIFICATION
685
+ if getattr_static(
686
+ manager, "identification"
687
+ ) is not identification or not executable_matches(identification.fget, signature):
688
+ return None
689
+ interface = getattr_static(manager, "Interface", None)
690
+ if not _unchanged_metadata_methods(interface, _QUERY_PUSHDOWN_INTERFACE_METHODS):
691
+ return None
692
+ for owner in (manager, interface):
693
+ if any(
694
+ getattr_static(owner, name, None) is not getattr_static(object, name)
695
+ for name in ("__new__", "__getattribute__", "__setattr__")
696
+ ):
697
+ return None
698
+ structure = _prepare_native_query_structure(manager)
699
+ if structure is None:
700
+ return None
701
+ return structure
702
+
703
+
704
+ def can_filter_before_query_authorization(
705
+ candidates: Bucket[GeneralManager],
706
+ paths: Iterable[str],
707
+ info: ResolveInfo | None = None,
708
+ ) -> bool:
709
+ """Prove predicates harmless once, before narrowing a native row domain.
710
+
711
+ Permission declarations remain stable during a query. Every relation hop
712
+ must be readable, and each traversed target must have an unconditional row
713
+ read plan for this actor; otherwise membership could reveal hidden targets.
714
+ Unknown/custom policies retain full-domain runtime authorization.
715
+ """
716
+ from general_manager.bucket.database_bucket import DatabaseBucket
717
+ from general_manager.api.graphql_errors import get_read_permission_filter
718
+ from general_manager.api.graphql_relations import (
719
+ get_graphql_manager_registry,
720
+ resolve_general_manager_type,
721
+ )
722
+ from general_manager.permission.manager_based_permission import (
723
+ additional_local_read_permission,
724
+ )
725
+
726
+ if type(candidates) is not DatabaseBucket:
727
+ return False
728
+ structures: dict[type[GeneralManager], _NativeQueryStructure | None] = {}
729
+ readable_targets: dict[type[GeneralManager], bool] = {}
730
+
731
+ def safe_path(manager: type[GeneralManager], parts: tuple[str, ...]) -> bool:
732
+ if manager not in structures:
733
+ structures[manager] = _prepare_pushdown_structure(manager)
734
+ structure = structures[manager]
735
+ if structure is None or not parts:
736
+ return False
737
+ prepared = structure.flat_field(parts)
738
+ if prepared is not None:
739
+ return not prepared.additional
740
+ field_name, *rest = parts
741
+ aliases, names, _ = _operand_field_names(
742
+ manager, field_name, structure.attributes, native_paths=False
743
+ )
744
+ if (
745
+ len(aliases) > 1
746
+ or not names.intersection(structure.attributes)
747
+ or names.intersection(structure.properties)
748
+ or any(
749
+ additional_local_read_permission(
750
+ structure.permission, name, manager=manager
751
+ )
752
+ is not False
753
+ for name in names
754
+ )
755
+ ):
756
+ return False
757
+ metadata: dict[str, object] = dict(
758
+ structure.attributes.get(aliases[0] if aliases else field_name, {})
759
+ )
760
+ target = resolve_general_manager_type(
761
+ metadata.get("type"), get_graphql_manager_registry()
762
+ )
763
+ if target is None or not rest:
764
+ return False
765
+ if target not in structures:
766
+ structures[target] = _prepare_pushdown_structure(target)
767
+ target_structure = structures[target]
768
+ if target_structure is None:
769
+ return False
770
+ # A target field called e.g. "contains" wins over lookup spelling,
771
+ # matching the existing runtime authorization grammar.
772
+ if (
773
+ len(rest) == 1
774
+ and rest[0] in _LOOKUPS
775
+ and rest[0]
776
+ not in (
777
+ set(target_structure.attributes)
778
+ | set(target_structure.properties)
779
+ | set(target_structure.interface.get_attributes())
780
+ )
781
+ ):
782
+ return True
783
+ if info is None:
784
+ return False
785
+ if target not in readable_targets:
786
+ plan = get_read_permission_filter(target, info)
787
+ readable_targets[target] = (
788
+ plan.decision == "allow_all"
789
+ and not plan.requires_instance_check
790
+ and not plan.filters
791
+ )
792
+ return readable_targets[target] and safe_path(target, tuple(rest))
793
+
794
+ return all(
795
+ safe_path(candidates._manager_class, tuple(path.split("__"))) for path in paths
796
+ )
@@ -1184,6 +1184,12 @@ def check_read_permission(
1184
1184
  return check_read_permission_for_user(instance, info.context.user, field_name)
1185
1185
 
1186
1186
 
1187
+ _QUERY_PUSHDOWN_CHECKS = tuple(
1188
+ (function, executable_signature(function))
1189
+ for function in (check_read_permission, check_read_permission_for_user)
1190
+ )
1191
+
1192
+
1187
1193
  def resolve_with_read_permission(
1188
1194
  instance: GeneralManager,
1189
1195
  info: GraphQLResolveInfo,
@@ -2114,6 +2120,24 @@ def create_list_resolver(
2114
2120
  # requests nor validate the remote lookup vocabulary.
2115
2121
  qs = MaterializedBucket(manager_class, qs)
2116
2122
  else:
2123
+ from general_manager.api.graphql_query_permissions import (
2124
+ can_filter_before_query_authorization,
2125
+ )
2126
+
2127
+ filter_first = all(
2128
+ current is original and executable_matches(original, signature)
2129
+ for current, (original, signature) in zip(
2130
+ (check_read_permission, check_read_permission_for_user),
2131
+ _QUERY_PUSHDOWN_CHECKS,
2132
+ strict=True,
2133
+ )
2134
+ ) and can_filter_before_query_authorization(
2135
+ base_queryset,
2136
+ set(plan.filters) | set(plan.excludes) | set(plan.normalized_excludes),
2137
+ info,
2138
+ )
2139
+ if filter_first:
2140
+ base_queryset = apply_query_parameter_plan(base_queryset, plan, None)
2117
2141
  authorization_result = apply_read_authorization(
2118
2142
  base_queryset,
2119
2143
  manager_class,
@@ -2130,7 +2154,8 @@ def create_list_resolver(
2130
2154
  budget_additional_permissions_only=True,
2131
2155
  prepare_native_structure=isinstance(qs, DatabaseBucket),
2132
2156
  )
2133
- qs = apply_query_parameter_plan(qs, plan, None)
2157
+ if not filter_first:
2158
+ qs = apply_query_parameter_plan(qs, plan, None)
2134
2159
  if grouping_validator is not None:
2135
2160
  grouping_validator(qs, group_by, order_by, info)
2136
2161
  qs_grouped = apply_grouping(qs, group_by)
@@ -10,7 +10,6 @@ from __future__ import annotations
10
10
  from dataclasses import replace
11
11
 
12
12
  import json
13
- import os
14
13
  from collections.abc import Callable, Generator, Iterable, Mapping
15
14
  from datetime import date, datetime
16
15
  from decimal import Decimal
@@ -28,6 +27,7 @@ from graphql import GraphQLError, GraphQLID
28
27
  from django.core.exceptions import FieldDoesNotExist
29
28
  from django.db import models
30
29
 
30
+ from general_manager.api.graphql_work_limits import get_graphql_work_limit
31
31
  from general_manager.conf import get_setting
32
32
  from general_manager.api.graphql_identifiers import property_identifier_type
33
33
  from general_manager.api.graphql_ordering import (
@@ -101,15 +101,11 @@ SearchTotalMode = Literal["exact", "bounded"]
101
101
  _BAD_USER_INPUT_CODE = "BAD_USER_INPUT"
102
102
  _PAGE_MUST_BE_POSITIVE = "page must be a positive integer."
103
103
  _PAGE_SIZE_MUST_BE_POSITIVE = "pageSize must be a positive integer."
104
- DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT = 1000
105
- _SEARCH_TOTAL_SCAN_LIMIT_UNSET = object()
104
+ DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT: int | None = None
106
105
  SEARCH_SOURCE_AUTHORIZATION_LIMIT_ERROR = (
107
106
  "Search source authorization candidate limit exceeded."
108
107
  )
109
108
  SEARCH_TOTAL_MODE_ERROR = "must be one of: exact, bounded."
110
- SEARCH_TOTAL_SCAN_LIMIT_ERROR = (
111
- "GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT must be a positive integer."
112
- )
113
109
  _MALFORMED_NATIVE_ID = object()
114
110
 
115
111
  _SEARCH_SCAN_LIMIT_EXCEEDED = (
@@ -204,24 +200,11 @@ def normalize_search_total_mode(total_mode: str | None = None) -> SearchTotalMod
204
200
  return cast(SearchTotalMode, normalized)
205
201
 
206
202
 
207
- def get_graphql_search_total_scan_limit() -> int:
208
- """Resolve the shared candidate budget from Django settings, then the env."""
209
- raw_limit = get_setting(
210
- "GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT",
211
- _SEARCH_TOTAL_SCAN_LIMIT_UNSET,
203
+ def get_graphql_search_total_scan_limit() -> int | None:
204
+ """Resolve the optional shared candidate budget from settings, then env."""
205
+ return get_graphql_work_limit(
206
+ "GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT", DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT
212
207
  )
213
- if raw_limit is _SEARCH_TOTAL_SCAN_LIMIT_UNSET:
214
- env_limit = os.environ.get("GENERAL_MANAGER_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT")
215
- if env_limit is None:
216
- raw_limit = DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT
217
- else:
218
- try:
219
- raw_limit = int(env_limit)
220
- except ValueError:
221
- raise _bad_user_input_error(SEARCH_TOTAL_SCAN_LIMIT_ERROR) from None
222
- if not isinstance(raw_limit, int) or isinstance(raw_limit, bool) or raw_limit <= 0:
223
- raise _bad_user_input_error(SEARCH_TOTAL_SCAN_LIMIT_ERROR)
224
- return raw_limit
225
208
 
226
209
 
227
210
  def sort_search_hit_entries(
@@ -1569,6 +1552,9 @@ def register_search_query(
1569
1552
  QueryFieldAuthorizationBudget,
1570
1553
  )
1571
1554
 
1555
+ source_limit = get_graphql_work_limit(
1556
+ "GRAPHQL_SEARCH_SOURCE_AUTHORIZATION_LIMIT", MAX_QUERY_PERMISSION_CANDIDATES
1557
+ )
1572
1558
  source_candidate_count = 0
1573
1559
  authorization_budget = QueryFieldAuthorizationBudget()
1574
1560
 
@@ -1577,7 +1563,7 @@ def register_search_query(
1577
1563
  ) -> Generator[GeneralManager, None, None]:
1578
1564
  nonlocal source_candidate_count
1579
1565
  for candidate in source:
1580
- if source_candidate_count >= MAX_QUERY_PERMISSION_CANDIDATES:
1566
+ if source_limit is not None and source_candidate_count >= source_limit:
1581
1567
  raise GraphQLError(SEARCH_SOURCE_AUTHORIZATION_LIMIT_ERROR)
1582
1568
  source_candidate_count += 1
1583
1569
  if passes_permission_filters(candidate, info, permission_plan=plan):
@@ -1804,11 +1790,19 @@ def register_search_query(
1804
1790
  fast_source is not None and common_filter_execution_valid()
1805
1791
  )
1806
1792
  while True:
1807
- remaining_scan_budget = total_scan_limit - scanned_hits
1808
- if remaining_scan_budget <= 0:
1793
+ remaining_scan_budget = (
1794
+ None
1795
+ if total_scan_limit is None
1796
+ else total_scan_limit - scanned_hits
1797
+ )
1798
+ if remaining_scan_budget is not None and remaining_scan_budget <= 0:
1809
1799
  manager_total_is_exact = False
1810
1800
  break
1811
- query_limit = min(fetch_limit, remaining_scan_budget)
1801
+ query_limit = (
1802
+ fetch_limit
1803
+ if remaining_scan_budget is None
1804
+ else min(fetch_limit, remaining_scan_budget)
1805
+ )
1812
1806
  result = backend.search(
1813
1807
  index_name,
1814
1808
  query,
@@ -1981,7 +1975,7 @@ def register_search_query(
1981
1975
  break
1982
1976
  if len(result.hits) < query_limit and not can_continue_page:
1983
1977
  break
1984
- if scanned_hits >= total_scan_limit:
1978
+ if total_scan_limit is not None and scanned_hits >= total_scan_limit:
1985
1979
  manager_total_is_exact = False
1986
1980
  break
1987
1981
  total += total_hits_for_manager
@@ -0,0 +1,35 @@
1
+ """Server-owned optional GraphQL workload budgets, independent of permissions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+
7
+ from graphql import GraphQLError
8
+
9
+ from general_manager.conf import get_setting
10
+
11
+ _UNSET = object()
12
+
13
+
14
+ def get_graphql_work_limit(name: str, default: int | None = None) -> int | None:
15
+ """Resolve Django settings before environment; explicit None means unlimited."""
16
+ value = get_setting(name, _UNSET)
17
+ if value is _UNSET:
18
+ raw = os.environ.get(f"GENERAL_MANAGER_{name}")
19
+ if raw is None:
20
+ return default
21
+ if raw.strip().lower() in {"none", "unlimited"}:
22
+ return None
23
+ try:
24
+ value = int(raw)
25
+ except ValueError:
26
+ value = raw
27
+ if value is None:
28
+ return None
29
+ if isinstance(value, int) and not isinstance(value, bool) and value > 0:
30
+ return value
31
+ message = f"{name} must be a positive integer or None (unlimited)."
32
+ raise GraphQLError(
33
+ message,
34
+ extensions={"code": "BAD_USER_INPUT"},
35
+ )
@@ -189,3 +189,18 @@ class OrmInterfaceBase(InterfaceBase, Generic[HistoryModelT]):
189
189
  ),
190
190
  )
191
191
  return lifecycle.describe_custom_fields(model)
192
+
193
+
194
+ from general_manager.utils.executable_contract import executable_signature as _signature
195
+
196
+ _QUERY_PUSHDOWN_INTERFACE_METHODS = tuple(
197
+ (
198
+ name,
199
+ descriptor,
200
+ _signature(
201
+ descriptor.__func__ if isinstance(descriptor, classmethod) else descriptor
202
+ ),
203
+ )
204
+ for name in ("__init__", "_from_trusted_orm_instance")
205
+ for descriptor in (OrmInterfaceBase.__dict__[name],)
206
+ )
@@ -920,3 +920,22 @@ _COMMON_MANAGER_EXECUTABLES = tuple(
920
920
  _COMMON_MANAGER_GETATTR,
921
921
  )
922
922
  )
923
+
924
+
925
+ # Native filter pushdown may not erase observable custom hydration behavior.
926
+ _QUERY_PUSHDOWN_MANAGER_METHODS = tuple(
927
+ (
928
+ name,
929
+ descriptor,
930
+ executable_signature(
931
+ descriptor.__func__ if isinstance(descriptor, classmethod) else descriptor
932
+ ),
933
+ )
934
+ for name in (
935
+ "__init__",
936
+ "__getattr__",
937
+ "_from_trusted_orm_instance",
938
+ "_track_identification_dependency",
939
+ )
940
+ for descriptor in (GeneralManager.__dict__[name],)
941
+ )
@@ -45,6 +45,20 @@ class PermissionRelationResolutionError(PermissionError):
45
45
  )
46
46
 
47
47
 
48
+ def _resolved_relation_model(
49
+ field: models.ForeignKey[models.Model],
50
+ ) -> type[models.Model]:
51
+ """Use Django's resolved relation owner, not an early cached string reference."""
52
+ # RelatedField.related_model is cached; inspecting it during model assembly
53
+ # can retain a string even after Django resolves remote_field.model.
54
+ related_model = getattr(field.remote_field, "model", None)
55
+ if not isinstance(related_model, type) or not issubclass(
56
+ related_model, models.Model
57
+ ):
58
+ raise PermissionRelationResolutionError(field.name)
59
+ return related_model
60
+
61
+
48
62
  GeneralManagerData = TypeVar("GeneralManagerData", bound=GeneralManager)
49
63
 
50
64
 
@@ -299,7 +313,7 @@ class PermissionDataManager(Generic[GeneralManagerData]):
299
313
  if identifier is None or name == field.attname:
300
314
  return identifier
301
315
 
302
- related_type = field.related_model
316
+ related_type = _resolved_relation_model(field)
303
317
  manager_type = getattr(related_type, "_general_manager_class", None)
304
318
  # A write check needs the target on the write database even if a read
305
319
  # router would select a replica. Standalone checks retain Django hints.
@@ -342,7 +356,7 @@ class PermissionDataManager(Generic[GeneralManagerData]):
342
356
  backing = getattr(getattr(manager, "_interface", None), "_instance", None)
343
357
  if (
344
358
  manager.identification.get("id") != related.pk
345
- or not isinstance(backing, field.related_model)
359
+ or not isinstance(backing, _resolved_relation_model(field))
346
360
  or backing.pk != related.pk
347
361
  or backing._state.db != related._state.db
348
362
  or getattr(backing, field.target_field.attname)
File without changes