GeneralManager 0.62.2__tar.gz → 0.63.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.
- {generalmanager-0.62.2/src/GeneralManager.egg-info → generalmanager-0.63.0}/PKG-INFO +1 -1
- {generalmanager-0.62.2 → generalmanager-0.63.0}/pyproject.toml +2 -1
- {generalmanager-0.62.2 → generalmanager-0.63.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/GeneralManager.egg-info/SOURCES.txt +6 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/api.py +2 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_errors.py +45 -32
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_mutations.py +5 -4
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/mutation.py +16 -7
- generalmanager-0.63.0/src/general_manager/chat/__init__.py +36 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/__main__.py +5 -2
- generalmanager-0.63.0/src/general_manager/chat/evals/datasets/basic_queries.yaml +216 -0
- generalmanager-0.63.0/src/general_manager/chat/evals/datasets/demo_readiness.yaml +108 -0
- generalmanager-0.63.0/src/general_manager/chat/evals/datasets/edge_cases.yaml +116 -0
- generalmanager-0.63.0/src/general_manager/chat/evals/datasets/follow_ups.yaml +95 -0
- generalmanager-0.63.0/src/general_manager/chat/evals/datasets/large_schema.yaml +70 -0
- generalmanager-0.63.0/src/general_manager/chat/evals/datasets/multi_hop.yaml +156 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/public_api_registry.py +4 -0
- generalmanager-0.62.2/src/general_manager/chat/__init__.py +0 -6
- {generalmanager-0.62.2 → generalmanager-0.63.0}/LICENSE +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/README.md +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/setup.cfg +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_resolvers.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_search.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/remote_api.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/apps.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bootstrap.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/conf.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/logging.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/search_reconcile.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/manager/general_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/py.typed +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/reconciliation.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/args_to_kwargs.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/make_cache_key.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/none_to_zero.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/tests/test_settings.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/tests/test_urls.py +0 -0
- {generalmanager-0.62.2 → generalmanager-0.63.0}/tests/testing_asgi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.63.0
|
|
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.
|
|
7
|
+
version = "0.63.0"
|
|
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" }]
|
|
@@ -85,6 +85,7 @@ where = ["src"]
|
|
|
85
85
|
|
|
86
86
|
[tool.setuptools.package-data]
|
|
87
87
|
"general_manager" = ["py.typed"]
|
|
88
|
+
"general_manager.chat.evals" = ["datasets/*.yaml"]
|
|
88
89
|
|
|
89
90
|
[tool.semantic_release]
|
|
90
91
|
allow_zero_version = true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.63.0
|
|
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
|
|
@@ -91,6 +91,12 @@ src/general_manager/chat/evals/fixtures.py
|
|
|
91
91
|
src/general_manager/chat/evals/readiness.py
|
|
92
92
|
src/general_manager/chat/evals/runner.py
|
|
93
93
|
src/general_manager/chat/evals/traces.py
|
|
94
|
+
src/general_manager/chat/evals/datasets/basic_queries.yaml
|
|
95
|
+
src/general_manager/chat/evals/datasets/demo_readiness.yaml
|
|
96
|
+
src/general_manager/chat/evals/datasets/edge_cases.yaml
|
|
97
|
+
src/general_manager/chat/evals/datasets/follow_ups.yaml
|
|
98
|
+
src/general_manager/chat/evals/datasets/large_schema.yaml
|
|
99
|
+
src/general_manager/chat/evals/datasets/multi_hop.yaml
|
|
94
100
|
src/general_manager/chat/evals/judges/__init__.py
|
|
95
101
|
src/general_manager/chat/evals/judges/answer_quality.py
|
|
96
102
|
src/general_manager/chat/evals/judges/contract.py
|
|
@@ -22,6 +22,7 @@ __all__ = [
|
|
|
22
22
|
"MeasurementType",
|
|
23
23
|
"ObjectVersion",
|
|
24
24
|
"ProxyUploadSink",
|
|
25
|
+
"PublicGraphQLError",
|
|
25
26
|
"RemoteInvalidationClient",
|
|
26
27
|
"StoredFile",
|
|
27
28
|
"StoredFileStatus",
|
|
@@ -77,6 +78,7 @@ from general_manager.uploads.errors import InvalidUploadFilenameError
|
|
|
77
78
|
from general_manager.uploads.errors import InvalidUploadSizeError
|
|
78
79
|
from general_manager.api.graphql import MeasurementScalar
|
|
79
80
|
from general_manager.api.graphql import MeasurementType
|
|
81
|
+
from general_manager.api.graphql_errors import PublicGraphQLError
|
|
80
82
|
from general_manager.uploads.types import ObjectVersion
|
|
81
83
|
from general_manager.uploads.adapters import ProxyUploadSink
|
|
82
84
|
from general_manager.api.remote_invalidation_client import RemoteInvalidationClient
|
|
@@ -14,6 +14,7 @@ from dataclasses import dataclass
|
|
|
14
14
|
from datetime import date, datetime
|
|
15
15
|
from decimal import Decimal
|
|
16
16
|
from typing import TYPE_CHECKING, Protocol, TypeAlias, TypedDict, cast
|
|
17
|
+
from uuid import uuid4
|
|
17
18
|
|
|
18
19
|
from graphql import GraphQLError
|
|
19
20
|
from graphql.language import ast
|
|
@@ -67,6 +68,9 @@ else:
|
|
|
67
68
|
|
|
68
69
|
logger = get_logger("api.graphql")
|
|
69
70
|
|
|
71
|
+
_INTERNAL_ERROR_MESSAGE = "An internal server error occurred."
|
|
72
|
+
_PERMISSION_DENIED_MESSAGE = "Permission denied."
|
|
73
|
+
|
|
70
74
|
GrapheneBaseType: TypeAlias = "_GrapheneMountedType"
|
|
71
75
|
GrapheneBaseTypeClass: TypeAlias = type[GrapheneBaseType]
|
|
72
76
|
PermissionFilter: TypeAlias = dict[str, object]
|
|
@@ -133,6 +137,13 @@ class SubscriptionEvent:
|
|
|
133
137
|
# ---------------------------------------------------------------------------
|
|
134
138
|
|
|
135
139
|
|
|
140
|
+
class PublicGraphQLError(GraphQLError):
|
|
141
|
+
"""Deliberately public GraphQL failure with a stable client code."""
|
|
142
|
+
|
|
143
|
+
def __init__(self, message: str, *, code: str) -> None:
|
|
144
|
+
super().__init__(message, extensions={"code": code})
|
|
145
|
+
|
|
146
|
+
|
|
136
147
|
class InvalidMeasurementValueError(TypeError):
|
|
137
148
|
"""Internal scalar error for serializing a non-``Measurement`` value.
|
|
138
149
|
|
|
@@ -215,18 +226,18 @@ class InvalidReadPermissionConfigurationError(TypeError):
|
|
|
215
226
|
EXPECTED_MANAGER_ERRORS: tuple[type[Exception], ...] = (
|
|
216
227
|
PermissionError,
|
|
217
228
|
ValidationError,
|
|
218
|
-
ValueError,
|
|
219
|
-
LookupError,
|
|
220
229
|
GraphQLError,
|
|
221
230
|
)
|
|
222
|
-
"""
|
|
231
|
+
"""Compatibility metadata for permission, validation, and explicit errors."""
|
|
223
232
|
|
|
224
233
|
SUSPICIOUS_MANAGER_ERRORS: tuple[type[Exception], ...] = (
|
|
234
|
+
ValueError,
|
|
235
|
+
LookupError,
|
|
225
236
|
TypeError,
|
|
226
237
|
AttributeError,
|
|
227
238
|
RuntimeError,
|
|
228
239
|
)
|
|
229
|
-
"""
|
|
240
|
+
"""Compatibility metadata for value, lookup, type, attribute, and runtime errors."""
|
|
230
241
|
|
|
231
242
|
HANDLED_MANAGER_ERRORS: tuple[type[Exception], ...] = (
|
|
232
243
|
*EXPECTED_MANAGER_ERRORS,
|
|
@@ -488,6 +499,14 @@ def _build_validation_error_extensions(
|
|
|
488
499
|
}
|
|
489
500
|
|
|
490
501
|
|
|
502
|
+
def _safe_exception_message(error: Exception) -> str:
|
|
503
|
+
"""Render an exception for server logs without risking a secondary failure."""
|
|
504
|
+
try:
|
|
505
|
+
return str(error)
|
|
506
|
+
except Exception: # noqa: BLE001 - rendering must not break error sanitization
|
|
507
|
+
return "Exception message unavailable."
|
|
508
|
+
|
|
509
|
+
|
|
491
510
|
def handle_graph_ql_error(
|
|
492
511
|
error: Exception,
|
|
493
512
|
*,
|
|
@@ -506,12 +525,12 @@ def handle_graph_ql_error(
|
|
|
506
525
|
``"Validation failed."`` with ``BAD_USER_INPUT`` plus ``fieldErrors`` and
|
|
507
526
|
``nonFieldErrors``. When ``field_name_mapper`` is provided, it maps
|
|
508
527
|
``message_dict`` field keys before they are emitted in ``fieldErrors``;
|
|
509
|
-
non-field errors are not mapped.
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
public API contract.
|
|
528
|
+
non-field errors are not mapped. ``PermissionError`` instances use a fixed
|
|
529
|
+
public message. All other exceptions use a generic internal-error message
|
|
530
|
+
and an opaque correlation ID. Logging level/category is diagnostic behavior
|
|
531
|
+
of the internal ``api.graphql`` logger and is not a public API contract.
|
|
513
532
|
"""
|
|
514
|
-
message =
|
|
533
|
+
message = _safe_exception_message(error)
|
|
515
534
|
error_name = type(error).__name__
|
|
516
535
|
if isinstance(error, GraphQLError):
|
|
517
536
|
logger.warning(
|
|
@@ -519,12 +538,6 @@ def handle_graph_ql_error(
|
|
|
519
538
|
context={"error": error_name, "message": message},
|
|
520
539
|
)
|
|
521
540
|
return error
|
|
522
|
-
elif isinstance(error, PermissionError):
|
|
523
|
-
logger.info(
|
|
524
|
-
"graphql permission error",
|
|
525
|
-
context={"error": error_name, "message": message},
|
|
526
|
-
)
|
|
527
|
-
return GraphQLError(message, extensions={"code": "PERMISSION_DENIED"})
|
|
528
541
|
elif isinstance(error, ValidationError):
|
|
529
542
|
logger.warning(
|
|
530
543
|
"graphql user error",
|
|
@@ -539,26 +552,26 @@ def handle_graph_ql_error(
|
|
|
539
552
|
),
|
|
540
553
|
)
|
|
541
554
|
return GraphQLError(message, extensions={"code": "BAD_USER_INPUT"})
|
|
542
|
-
elif isinstance(error,
|
|
543
|
-
logger.
|
|
544
|
-
"graphql
|
|
545
|
-
context={"error": error_name, "message": message},
|
|
546
|
-
)
|
|
547
|
-
return GraphQLError(message, extensions={"code": "BAD_USER_INPUT"})
|
|
548
|
-
elif isinstance(error, SUSPICIOUS_MANAGER_ERRORS):
|
|
549
|
-
logger.warning(
|
|
550
|
-
"graphql caught suspicious error (may indicate a bug)",
|
|
555
|
+
elif isinstance(error, PermissionError):
|
|
556
|
+
logger.info(
|
|
557
|
+
"graphql permission error",
|
|
551
558
|
context={"error": error_name, "message": message},
|
|
552
|
-
exc_info=error,
|
|
553
559
|
)
|
|
554
|
-
return GraphQLError(
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
"graphql internal error",
|
|
558
|
-
context={"error": error_name, "message": message},
|
|
559
|
-
exc_info=error,
|
|
560
|
+
return GraphQLError(
|
|
561
|
+
_PERMISSION_DENIED_MESSAGE,
|
|
562
|
+
extensions={"code": "PERMISSION_DENIED"},
|
|
560
563
|
)
|
|
561
|
-
|
|
564
|
+
|
|
565
|
+
error_id = uuid4().hex
|
|
566
|
+
logger.error(
|
|
567
|
+
"graphql internal error",
|
|
568
|
+
context={"error": error_name, "message": message, "error_id": error_id},
|
|
569
|
+
exc_info=error,
|
|
570
|
+
)
|
|
571
|
+
return GraphQLError(
|
|
572
|
+
_INTERNAL_ERROR_MESSAGE,
|
|
573
|
+
extensions={"code": "INTERNAL_SERVER_ERROR", "errorId": error_id},
|
|
574
|
+
)
|
|
562
575
|
|
|
563
576
|
|
|
564
577
|
def get_read_permission_filter(
|
{generalmanager-0.62.2 → generalmanager-0.63.0}/src/general_manager/api/graphql_mutations.py
RENAMED
|
@@ -28,7 +28,6 @@ from general_manager.uploads.types import UploadOperation
|
|
|
28
28
|
from general_manager.utils.type_checks import safe_issubclass
|
|
29
29
|
from general_manager.utils.format_string import snake_to_camel
|
|
30
30
|
from general_manager.api.graphql_errors import (
|
|
31
|
-
HANDLED_MANAGER_ERRORS,
|
|
32
31
|
MissingManagerIdentifierError,
|
|
33
32
|
handle_graph_ql_error,
|
|
34
33
|
map_field_to_graphene_base_type,
|
|
@@ -396,7 +395,7 @@ def generate_create_mutation_class(
|
|
|
396
395
|
instance = create(**create_kwargs)
|
|
397
396
|
except GraphQLError:
|
|
398
397
|
raise
|
|
399
|
-
except
|
|
398
|
+
except Exception as error:
|
|
400
399
|
raise handle_graph_ql_error(
|
|
401
400
|
error,
|
|
402
401
|
field_name_mapper=lambda field_name: _graphql_mutation_field_name(
|
|
@@ -491,7 +490,7 @@ def generate_update_mutation_class(
|
|
|
491
490
|
instance = update(**update_kwargs)
|
|
492
491
|
except GraphQLError:
|
|
493
492
|
raise
|
|
494
|
-
except
|
|
493
|
+
except Exception as error:
|
|
495
494
|
raise handle_graph_ql_error(
|
|
496
495
|
error,
|
|
497
496
|
field_name_mapper=lambda field_name: _graphql_mutation_field_name(
|
|
@@ -572,7 +571,9 @@ def generate_delete_mutation_class(
|
|
|
572
571
|
creator_id=info.context.user.id,
|
|
573
572
|
history_comment=history_comment,
|
|
574
573
|
)
|
|
575
|
-
except
|
|
574
|
+
except GraphQLError:
|
|
575
|
+
raise
|
|
576
|
+
except Exception as error:
|
|
576
577
|
raise handle_graph_ql_error(
|
|
577
578
|
error,
|
|
578
579
|
field_name_mapper=lambda field_name: _graphql_mutation_field_name(
|
|
@@ -17,9 +17,9 @@ from typing import (
|
|
|
17
17
|
cast,
|
|
18
18
|
)
|
|
19
19
|
import graphene
|
|
20
|
-
from graphql import GraphQLResolveInfo
|
|
20
|
+
from graphql import GraphQLError, GraphQLResolveInfo
|
|
21
21
|
|
|
22
|
-
from general_manager.api.graphql import GraphQL
|
|
22
|
+
from general_manager.api.graphql import GraphQL
|
|
23
23
|
from general_manager.manager.general_manager import GeneralManager
|
|
24
24
|
|
|
25
25
|
from general_manager.utils.format_string import snake_to_camel
|
|
@@ -297,8 +297,10 @@ def graph_ql_mutation(
|
|
|
297
297
|
``success`` field. Resolver execution normalizes GeneralManager arguments,
|
|
298
298
|
calls ``permission.check(normalized_kwargs, info.context.user)`` when a
|
|
299
299
|
permission class is configured, calls the original function, and returns the
|
|
300
|
-
generated mutation instance.
|
|
301
|
-
|
|
300
|
+
generated mutation instance. Explicit ``GraphQLError`` instances are
|
|
301
|
+
preserved. Validation and deliberately public errors retain their intended
|
|
302
|
+
client behavior, while unexpected ordinary exceptions are sanitized and
|
|
303
|
+
assigned correlation IDs by ``GraphQL._handle_graph_ql_error``.
|
|
302
304
|
|
|
303
305
|
Parameters:
|
|
304
306
|
_func: Decorated function for bare usage, or a positional
|
|
@@ -446,7 +448,12 @@ def graph_ql_mutation(
|
|
|
446
448
|
**kwargs: Mutation arguments provided by the client.
|
|
447
449
|
|
|
448
450
|
Returns:
|
|
449
|
-
|
|
451
|
+
An instance of the generated mutation with output fields populated
|
|
452
|
+
and ``success=True``. An instance is returned only on success.
|
|
453
|
+
|
|
454
|
+
Raises:
|
|
455
|
+
GraphQLError: The resolver raises an explicit GraphQL error, or a
|
|
456
|
+
resolver failure is mapped to a GraphQL error.
|
|
450
457
|
"""
|
|
451
458
|
try:
|
|
452
459
|
normalized_kwargs = _normalize_mutation_arguments(
|
|
@@ -462,7 +469,7 @@ def graph_ql_mutation(
|
|
|
462
469
|
expected_count = len(out_types)
|
|
463
470
|
received_count = len(result_values)
|
|
464
471
|
if received_count != expected_count:
|
|
465
|
-
raise MutationTupleReturnLengthMismatchError(
|
|
472
|
+
raise MutationTupleReturnLengthMismatchError( # noqa: TRY301
|
|
466
473
|
fn.__name__,
|
|
467
474
|
expected_count,
|
|
468
475
|
received_count,
|
|
@@ -479,7 +486,9 @@ def graph_ql_mutation(
|
|
|
479
486
|
data[only] = result
|
|
480
487
|
data["success"] = True
|
|
481
488
|
return mutation_class(**data)
|
|
482
|
-
except
|
|
489
|
+
except GraphQLError:
|
|
490
|
+
raise
|
|
491
|
+
except Exception as error:
|
|
483
492
|
raise GraphQL._handle_graph_ql_error(
|
|
484
493
|
error,
|
|
485
494
|
field_name_mapper=snake_to_camel,
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""General Manager chat integration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from general_manager.utils.public_api import build_module_dir, resolve_export
|
|
8
|
+
|
|
9
|
+
__all__ = ["ChatConfigurationError", "initialize_chat"]
|
|
10
|
+
|
|
11
|
+
_MODULE_MAP = {
|
|
12
|
+
"ChatConfigurationError": (
|
|
13
|
+
"general_manager.chat.settings",
|
|
14
|
+
"ChatConfigurationError",
|
|
15
|
+
),
|
|
16
|
+
"initialize_chat": ("general_manager.chat.bootstrap", "initialize_chat"),
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from general_manager.chat.bootstrap import initialize_chat
|
|
21
|
+
from general_manager.chat.settings import ChatConfigurationError
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def __getattr__(name: str) -> object:
|
|
25
|
+
"""Resolve and cache a public chat export."""
|
|
26
|
+
return resolve_export(
|
|
27
|
+
name,
|
|
28
|
+
module_all=__all__,
|
|
29
|
+
module_map=_MODULE_MAP,
|
|
30
|
+
module_globals=globals(),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def __dir__() -> list[str]:
|
|
35
|
+
"""Return the chat module's available names."""
|
|
36
|
+
return build_module_dir(module_all=__all__, module_globals=globals())
|
|
@@ -70,8 +70,11 @@ def main(argv: list[str] | None = None) -> None:
|
|
|
70
70
|
|
|
71
71
|
if args.settings:
|
|
72
72
|
os.environ["DJANGO_SETTINGS_MODULE"] = args.settings
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
elif not os.environ.get("DJANGO_SETTINGS_MODULE"):
|
|
74
|
+
parser.error(
|
|
75
|
+
"Django settings are required; pass --settings or set "
|
|
76
|
+
"DJANGO_SETTINGS_MODULE."
|
|
77
|
+
)
|
|
75
78
|
|
|
76
79
|
import django
|
|
77
80
|
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# Basic single-manager queries with simple filters and field selection.
|
|
2
|
+
|
|
3
|
+
- name: list_all_materials
|
|
4
|
+
description: "List all materials without filters"
|
|
5
|
+
tier: 0
|
|
6
|
+
tags: ["single_manager_query", "grounded_answer"]
|
|
7
|
+
conversation:
|
|
8
|
+
- user: "Show me all materials"
|
|
9
|
+
expectations:
|
|
10
|
+
contract:
|
|
11
|
+
category: single_manager_query
|
|
12
|
+
hard:
|
|
13
|
+
required_tool_calls:
|
|
14
|
+
- name: query
|
|
15
|
+
args_contain:
|
|
16
|
+
manager: MaterialManager
|
|
17
|
+
forbidden_tools: ["mutate"]
|
|
18
|
+
results_contain: ["Steel", "Aluminum", "Cobalt"]
|
|
19
|
+
answer_contains: ["Steel", "Aluminum", "Cobalt"]
|
|
20
|
+
strategy:
|
|
21
|
+
recommended_tool_calls:
|
|
22
|
+
- name: search_managers
|
|
23
|
+
strict_order: false
|
|
24
|
+
tool_calls:
|
|
25
|
+
- name: query
|
|
26
|
+
args_contain:
|
|
27
|
+
manager: MaterialManager
|
|
28
|
+
results_contain: ["Steel", "Aluminum", "Cobalt"]
|
|
29
|
+
answer_contains: ["Steel", "Aluminum", "Cobalt"]
|
|
30
|
+
|
|
31
|
+
- name: filter_material_by_name
|
|
32
|
+
description: "Filter materials by exact name"
|
|
33
|
+
tier: 0
|
|
34
|
+
tags: ["single_manager_query", "grounded_answer"]
|
|
35
|
+
conversation:
|
|
36
|
+
- user: "Find the material named Steel"
|
|
37
|
+
expectations:
|
|
38
|
+
contract:
|
|
39
|
+
category: single_manager_query
|
|
40
|
+
hard:
|
|
41
|
+
required_tool_calls:
|
|
42
|
+
- name: query
|
|
43
|
+
args_contain:
|
|
44
|
+
manager: MaterialManager
|
|
45
|
+
forbidden_tools: ["mutate"]
|
|
46
|
+
results_contain: ["Steel"]
|
|
47
|
+
results_exclude: ["Aluminum", "Cobalt"]
|
|
48
|
+
answer_contains: ["Steel"]
|
|
49
|
+
strategy:
|
|
50
|
+
recommended_tool_calls:
|
|
51
|
+
- name: search_managers
|
|
52
|
+
strict_order: false
|
|
53
|
+
tool_calls:
|
|
54
|
+
- name: query
|
|
55
|
+
args_contain:
|
|
56
|
+
manager: MaterialManager
|
|
57
|
+
results_contain: ["Steel"]
|
|
58
|
+
results_exclude: ["Aluminum", "Cobalt"]
|
|
59
|
+
answer_contains: ["Steel"]
|
|
60
|
+
|
|
61
|
+
- name: search_then_query_parts
|
|
62
|
+
description: "Discovery flow: search managers then query parts"
|
|
63
|
+
tier: 0
|
|
64
|
+
tags: ["manager_discovery", "single_manager_query", "grounded_answer"]
|
|
65
|
+
conversation:
|
|
66
|
+
- user: "What parts do we have in inventory?"
|
|
67
|
+
expectations:
|
|
68
|
+
contract:
|
|
69
|
+
category: single_manager_query
|
|
70
|
+
hard:
|
|
71
|
+
required_tool_calls:
|
|
72
|
+
- name: query
|
|
73
|
+
args_contain:
|
|
74
|
+
manager: PartManager
|
|
75
|
+
forbidden_tools: ["mutate"]
|
|
76
|
+
results_contain: ["Bolt", "Gear", "Bearing"]
|
|
77
|
+
answer_contains: ["Bolt", "Gear", "Bearing"]
|
|
78
|
+
strategy:
|
|
79
|
+
recommended_tool_calls:
|
|
80
|
+
- name: search_managers
|
|
81
|
+
strict_order: false
|
|
82
|
+
tool_calls:
|
|
83
|
+
- name: search_managers
|
|
84
|
+
- name: query
|
|
85
|
+
args_contain:
|
|
86
|
+
manager: PartManager
|
|
87
|
+
results_contain: ["Bolt", "Gear", "Bearing"]
|
|
88
|
+
answer_contains: ["Bolt", "Gear", "Bearing"]
|
|
89
|
+
|
|
90
|
+
- name: get_schema_before_query
|
|
91
|
+
description: "Inspect manager schema before querying"
|
|
92
|
+
tier: 0
|
|
93
|
+
tags: ["schema_inspection", "single_manager_query", "grounded_answer"]
|
|
94
|
+
conversation:
|
|
95
|
+
- user: "What fields does the MaterialManager have? Then list materials."
|
|
96
|
+
expectations:
|
|
97
|
+
contract:
|
|
98
|
+
category: schema_inspection
|
|
99
|
+
hard:
|
|
100
|
+
required_tool_calls:
|
|
101
|
+
- name: get_manager_schema
|
|
102
|
+
args_contain:
|
|
103
|
+
manager: MaterialManager
|
|
104
|
+
- name: query
|
|
105
|
+
args_contain:
|
|
106
|
+
manager: MaterialManager
|
|
107
|
+
forbidden_tools: ["mutate"]
|
|
108
|
+
results_contain: ["Steel", "Aluminum", "Cobalt"]
|
|
109
|
+
answer_contains: ["name", "density", "Steel", "Aluminum", "Cobalt"]
|
|
110
|
+
tool_calls:
|
|
111
|
+
- name: get_manager_schema
|
|
112
|
+
args_contain:
|
|
113
|
+
manager: MaterialManager
|
|
114
|
+
- name: query
|
|
115
|
+
args_contain:
|
|
116
|
+
manager: MaterialManager
|
|
117
|
+
results_contain: ["Steel", "Aluminum", "Cobalt"]
|
|
118
|
+
answer_contains: ["name", "density", "Steel", "Aluminum", "Cobalt"]
|
|
119
|
+
|
|
120
|
+
- name: filter_high_density
|
|
121
|
+
description: "Query with numeric filter"
|
|
122
|
+
tier: 0
|
|
123
|
+
tags: ["single_manager_query", "grounded_answer"]
|
|
124
|
+
conversation:
|
|
125
|
+
- user: "Which materials have density greater than 5?"
|
|
126
|
+
expectations:
|
|
127
|
+
contract:
|
|
128
|
+
category: single_manager_query
|
|
129
|
+
hard:
|
|
130
|
+
required_tool_calls:
|
|
131
|
+
- name: query
|
|
132
|
+
args_contain:
|
|
133
|
+
manager: MaterialManager
|
|
134
|
+
forbidden_tools: ["mutate"]
|
|
135
|
+
results_contain: ["Steel", "Cobalt"]
|
|
136
|
+
results_exclude: ["Aluminum"]
|
|
137
|
+
answer_contains: ["Steel", "Cobalt"]
|
|
138
|
+
answer_excludes: ["Aluminum"]
|
|
139
|
+
strategy:
|
|
140
|
+
recommended_tool_calls:
|
|
141
|
+
- name: search_managers
|
|
142
|
+
strict_order: false
|
|
143
|
+
tool_calls:
|
|
144
|
+
- name: query
|
|
145
|
+
args_contain:
|
|
146
|
+
manager: MaterialManager
|
|
147
|
+
results_contain: ["Steel", "Cobalt"]
|
|
148
|
+
results_exclude: ["Aluminum"]
|
|
149
|
+
answer_contains: ["Steel", "Cobalt"]
|
|
150
|
+
|
|
151
|
+
- name: schema_before_relation_filter
|
|
152
|
+
description: "Inspect schema before using relation filters from a domain query"
|
|
153
|
+
tier: 0
|
|
154
|
+
tags: ["manager_discovery", "schema_inspection", "relation_traversal", "grounded_answer"]
|
|
155
|
+
conversation:
|
|
156
|
+
- user: "Which parts use a material named Steel?"
|
|
157
|
+
expectations:
|
|
158
|
+
contract:
|
|
159
|
+
category: relation_traversal
|
|
160
|
+
hard:
|
|
161
|
+
required_tool_calls:
|
|
162
|
+
- name: get_manager_schema
|
|
163
|
+
args_contain:
|
|
164
|
+
manager: PartManager
|
|
165
|
+
- name: query
|
|
166
|
+
args_contain:
|
|
167
|
+
manager: PartManager
|
|
168
|
+
forbidden_tools: ["mutate"]
|
|
169
|
+
results_contain: ["Bolt"]
|
|
170
|
+
results_exclude: ["Bearing", "Gear"]
|
|
171
|
+
answer_contains: ["Bolt", "Steel"]
|
|
172
|
+
strategy:
|
|
173
|
+
recommended_tool_calls:
|
|
174
|
+
- name: search_managers
|
|
175
|
+
strict_order: false
|
|
176
|
+
tool_calls:
|
|
177
|
+
- name: search_managers
|
|
178
|
+
- name: get_manager_schema
|
|
179
|
+
args_contain:
|
|
180
|
+
manager: PartManager
|
|
181
|
+
- name: query
|
|
182
|
+
args_contain:
|
|
183
|
+
manager: PartManager
|
|
184
|
+
results_contain: ["Bolt"]
|
|
185
|
+
results_exclude: ["Bearing", "Gear"]
|
|
186
|
+
answer_contains: ["Bolt", "Steel"]
|
|
187
|
+
|
|
188
|
+
- name: exact_manager_needs_schema_for_fields
|
|
189
|
+
description: "Exact manager names can skip search but should inspect schema before field-specific query"
|
|
190
|
+
tier: 0
|
|
191
|
+
tags: ["schema_inspection", "single_manager_query", "grounded_answer"]
|
|
192
|
+
conversation:
|
|
193
|
+
- user: "In PartManager, show each part with its material name."
|
|
194
|
+
expectations:
|
|
195
|
+
contract:
|
|
196
|
+
category: schema_inspection
|
|
197
|
+
hard:
|
|
198
|
+
required_tool_calls:
|
|
199
|
+
- name: get_manager_schema
|
|
200
|
+
args_contain:
|
|
201
|
+
manager: PartManager
|
|
202
|
+
- name: query
|
|
203
|
+
args_contain:
|
|
204
|
+
manager: PartManager
|
|
205
|
+
forbidden_tools: ["mutate"]
|
|
206
|
+
results_contain: ["Bolt", "Steel", "Bearing", "Aluminum", "Gear", "Cobalt"]
|
|
207
|
+
answer_contains: ["Bolt", "Steel", "Bearing", "Aluminum", "Gear", "Cobalt"]
|
|
208
|
+
tool_calls:
|
|
209
|
+
- name: get_manager_schema
|
|
210
|
+
args_contain:
|
|
211
|
+
manager: PartManager
|
|
212
|
+
- name: query
|
|
213
|
+
args_contain:
|
|
214
|
+
manager: PartManager
|
|
215
|
+
results_contain: ["Bolt", "Steel", "Bearing", "Aluminum", "Gear", "Cobalt"]
|
|
216
|
+
answer_contains: ["Bolt", "Steel", "Bearing", "Aluminum", "Gear", "Cobalt"]
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Demo readiness cases for a weaker local LLM. These are product-safe,
|
|
2
|
+
# realistic flows that should pass before showing the prototype.
|
|
3
|
+
|
|
4
|
+
- name: demo_inventory_parts
|
|
5
|
+
description: "List available parts from a natural language inventory prompt"
|
|
6
|
+
tier: 1
|
|
7
|
+
tags: ["demo", "manager_discovery", "single_manager_query", "grounded_answer"]
|
|
8
|
+
conversation:
|
|
9
|
+
- user: "What parts do we have in inventory?"
|
|
10
|
+
expectations:
|
|
11
|
+
contract:
|
|
12
|
+
category: single_manager_query
|
|
13
|
+
hard:
|
|
14
|
+
required_tool_calls:
|
|
15
|
+
- name: query
|
|
16
|
+
args_contain:
|
|
17
|
+
manager: PartManager
|
|
18
|
+
forbidden_tools: ["mutate"]
|
|
19
|
+
results_contain: ["Bolt", "Bearing", "Gear"]
|
|
20
|
+
answer_contains: ["Bolt", "Bearing", "Gear"]
|
|
21
|
+
strategy:
|
|
22
|
+
recommended_tool_calls:
|
|
23
|
+
- name: search_managers
|
|
24
|
+
strict_order: false
|
|
25
|
+
|
|
26
|
+
- name: demo_high_density_materials
|
|
27
|
+
description: "Filter materials by numeric density"
|
|
28
|
+
tier: 1
|
|
29
|
+
tags: ["demo", "single_manager_query", "grounded_answer"]
|
|
30
|
+
conversation:
|
|
31
|
+
- user: "Which materials have density greater than 5?"
|
|
32
|
+
expectations:
|
|
33
|
+
contract:
|
|
34
|
+
category: single_manager_query
|
|
35
|
+
hard:
|
|
36
|
+
required_tool_calls:
|
|
37
|
+
- name: query
|
|
38
|
+
args_contain:
|
|
39
|
+
manager: MaterialManager
|
|
40
|
+
forbidden_tools: ["mutate"]
|
|
41
|
+
results_contain: ["Steel", "Cobalt"]
|
|
42
|
+
results_exclude: ["Aluminum"]
|
|
43
|
+
answer_contains: ["Steel", "Cobalt"]
|
|
44
|
+
answer_excludes: ["Aluminum"]
|
|
45
|
+
|
|
46
|
+
- name: demo_cobalt_projects
|
|
47
|
+
description: "Traverse material to project through parts"
|
|
48
|
+
tier: 1
|
|
49
|
+
tags: ["demo", "relation_traversal", "grounded_answer"]
|
|
50
|
+
conversation:
|
|
51
|
+
- user: "What projects contain parts with cobalt?"
|
|
52
|
+
expectations:
|
|
53
|
+
contract:
|
|
54
|
+
category: relation_traversal
|
|
55
|
+
hard:
|
|
56
|
+
required_tool_calls:
|
|
57
|
+
- name: query
|
|
58
|
+
args_contain:
|
|
59
|
+
manager: ProjectManager
|
|
60
|
+
forbidden_tools: ["mutate"]
|
|
61
|
+
results_contain: ["Apollo"]
|
|
62
|
+
results_exclude: ["Mercury"]
|
|
63
|
+
answer_contains: ["Apollo"]
|
|
64
|
+
strategy:
|
|
65
|
+
recommended_tool_calls:
|
|
66
|
+
- name: search_managers
|
|
67
|
+
- name: find_path
|
|
68
|
+
strict_order: false
|
|
69
|
+
|
|
70
|
+
- name: demo_affected_by_update_read_only
|
|
71
|
+
description: "Read-only impact question must not mutate"
|
|
72
|
+
tier: 1
|
|
73
|
+
tags: ["demo", "read_only_safety", "relation_traversal", "grounded_answer"]
|
|
74
|
+
conversation:
|
|
75
|
+
- user: "Which projects would be affected if cobalt parts were updated?"
|
|
76
|
+
expectations:
|
|
77
|
+
contract:
|
|
78
|
+
category: read_only_safety
|
|
79
|
+
hard:
|
|
80
|
+
required_tool_calls:
|
|
81
|
+
- name: query
|
|
82
|
+
args_contain:
|
|
83
|
+
manager: ProjectManager
|
|
84
|
+
forbidden_tools: ["mutate"]
|
|
85
|
+
results_contain: ["Apollo"]
|
|
86
|
+
results_exclude: ["Mercury"]
|
|
87
|
+
answer_contains: ["Apollo"]
|
|
88
|
+
answer_excludes: ["Mercury"]
|
|
89
|
+
strategy:
|
|
90
|
+
recommended_tool_calls:
|
|
91
|
+
- name: search_managers
|
|
92
|
+
- name: find_path
|
|
93
|
+
strict_order: false
|
|
94
|
+
|
|
95
|
+
- name: demo_available_managers
|
|
96
|
+
description: "Explain available manager types without querying records"
|
|
97
|
+
tier: 1
|
|
98
|
+
tags: ["demo", "manager_discovery"]
|
|
99
|
+
conversation:
|
|
100
|
+
- user: "What kinds of managers can I ask about?"
|
|
101
|
+
expectations:
|
|
102
|
+
contract:
|
|
103
|
+
category: manager_discovery
|
|
104
|
+
hard:
|
|
105
|
+
required_tool_calls:
|
|
106
|
+
- name: search_managers
|
|
107
|
+
forbidden_tools: ["mutate", "query"]
|
|
108
|
+
answer_contains: ["Material", "Part", "Project"]
|