mainsequence 6.0.26__tar.gz → 6.0.28__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 (130) hide show
  1. {mainsequence-6.0.26/mainsequence.egg-info → mainsequence-6.0.28}/PKG-INFO +1 -1
  2. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/AGENTS.md +7 -1
  3. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +17 -1
  4. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +13 -1
  5. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/api.py +120 -120
  6. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/cli.py +150 -151
  7. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/agent_runtime_models.py +37 -14
  8. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/base.py +38 -27
  9. mainsequence-6.0.28/mainsequence/client/fastapi/auth.py +66 -0
  10. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/models_helpers.py +31 -15
  11. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/models_user.py +198 -348
  12. {mainsequence-6.0.26 → mainsequence-6.0.28/mainsequence.egg-info}/PKG-INFO +1 -1
  13. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/SOURCES.txt +2 -0
  14. {mainsequence-6.0.26 → mainsequence-6.0.28}/pyproject.toml +1 -1
  15. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_cli.py +133 -77
  16. mainsequence-6.0.28/tests/test_fastapi_request_identity.py +108 -0
  17. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_filter_normalization.py +143 -35
  18. mainsequence-6.0.28/tests/test_models_user_request_bound_auth.py +179 -0
  19. mainsequence-6.0.28/tests/test_notification_uid_contract.py +84 -0
  20. mainsequence-6.0.26/mainsequence/client/fastapi/auth.py +0 -112
  21. mainsequence-6.0.26/tests/test_models_user_request_bound_auth.py +0 -364
  22. {mainsequence-6.0.26 → mainsequence-6.0.28}/LICENSE +0 -0
  23. {mainsequence-6.0.26 → mainsequence-6.0.28}/README.md +0 -0
  24. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  25. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  26. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  27. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  28. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  29. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  30. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/maintenance/project-maintenance/SKILL.md +0 -0
  31. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  32. {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/sdk_project_execution/SKILL.md +0 -0
  33. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/__init__.py +0 -0
  34. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/__main__.py +0 -0
  35. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/bootstrap.py +0 -0
  36. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/__init__.py +0 -0
  37. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/browser_auth.py +0 -0
  38. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/config.py +0 -0
  39. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/docker_utils.py +0 -0
  40. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/doctor.py +0 -0
  41. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/local_ops.py +0 -0
  42. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/migrations.py +0 -0
  43. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/model_filters.py +0 -0
  44. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/project_status.py +0 -0
  45. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/pydantic_cli.py +0 -0
  46. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/sdk_utils.py +0 -0
  47. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/ssh_utils.py +0 -0
  48. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/ui.py +0 -0
  49. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/__init__.py +0 -0
  50. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/client.py +0 -0
  51. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/compute_validation.py +0 -0
  52. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  53. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  54. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  55. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  56. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/dtype_codec.py +0 -0
  57. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/exceptions.py +0 -0
  58. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/fastapi/__init__.py +0 -0
  59. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/metatables/__init__.py +0 -0
  60. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/metatables/core.py +0 -0
  61. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/models_foundry.py +0 -0
  62. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/utils.py +0 -0
  63. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/defaults.py +0 -0
  64. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/instrumentation/__init__.py +0 -0
  65. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/instrumentation/utils.py +0 -0
  66. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/logconf.py +0 -0
  67. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/__init__.py +0 -0
  68. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/__main__.py +0 -0
  69. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  70. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  71. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  72. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  73. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  74. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  75. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  76. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  77. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  78. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  79. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/future_registry.py +0 -0
  80. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/hashing.py +0 -0
  81. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  82. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  83. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/env.py +0 -0
  84. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/provider.py +0 -0
  85. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/registry.py +0 -0
  86. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  87. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  88. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  89. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  90. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  91. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/schema_names.py +0 -0
  92. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  93. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/project_skills.py +0 -0
  94. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/runtime_context.py +0 -0
  95. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/runtime_flags.py +0 -0
  96. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/scaffold_skills.py +0 -0
  97. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/dependency_links.txt +0 -0
  98. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/entry_points.txt +0 -0
  99. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/requires.txt +0 -0
  100. {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/top_level.txt +0 -0
  101. {mainsequence-6.0.26 → mainsequence-6.0.28}/setup.cfg +0 -0
  102. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_auth_precedence.py +0 -0
  103. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_build_operations_hashing.py +0 -0
  104. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_canonical_api_route_contract.py +0 -0
  105. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_cli_browser_auth.py +0 -0
  106. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_cli_migrations.py +0 -0
  107. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_client.py +0 -0
  108. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  109. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_data_node_storage_dimension_queries.py +0 -0
  110. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_data_node_update_flow.py +0 -0
  111. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_duckdb_interface_dimensions.py +0 -0
  113. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_instrumentation.py +0 -0
  114. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_logconf.py +0 -0
  115. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_meta_table_migrations.py +0 -0
  116. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_meta_tables_client_models.py +0 -0
  117. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  118. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_pod_project_resolution.py +0 -0
  119. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_project_batch_jobs_from_file.py +0 -0
  120. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_project_branch_contract.py +0 -0
  121. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_project_skills.py +0 -0
  122. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_run_configuration.py +0 -0
  123. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_scaffold_skills.py +0 -0
  124. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_schema_names.py +0 -0
  125. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_secret_client_model.py +0 -0
  126. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_source_table_configuration.py +0 -0
  127. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_sqlite_interface_dimensions.py +0 -0
  128. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_update_runner_uid_runtime.py +0 -0
  129. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_update_statistics.py +0 -0
  130. {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_update_uid_guards.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 6.0.26
3
+ Version: 6.0.28
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -107,11 +107,17 @@ Working rules for this role:
107
107
  User-resolution rule for agents:
108
108
 
109
109
  - use `User.get_logged_user()` only when code is running with request-bound identity context:
110
- - FastAPI middleware
110
+ - FastAPI with `LoggedUserContextMiddleware` installed by the application
111
111
  - Streamlit
112
112
  - code that explicitly binds `_CURRENT_AUTH_HEADERS`
113
+ - treat its result as `RequestUserIdentity`: the human caller's canonical `uid` and optional
114
+ `username`, never a numeric id or a full account profile
115
+ - in FastAPI handlers, prefer `request.state.user` or `request.state.user_uid`; never use
116
+ `request.state.user_id`
113
117
  - use `User.get_authenticated_user_details()` in standalone authenticated CLI or script code that
114
118
  is not request-bound
119
+ - keep authentication context separate from route-level authorization, deployment ownership,
120
+ runtime workload credentials, and runtime target identity
115
121
  - do not describe this as a CLI versus non-CLI distinction; the boundary is request-bound identity
116
122
  context versus a plain authenticated SDK session
117
123
 
@@ -94,7 +94,23 @@ Record:
94
94
 
95
95
  Use `LoggedUserContextMiddleware` when the platform-authenticated request user
96
96
  must be available through `request.state`. This middleware binds request headers
97
- to the SDK request context; it is not an authorization policy by itself.
97
+ to the SDK request context; it is not an authorization policy by itself. The
98
+ application must install it explicitly with
99
+ `app.add_middleware(LoggedUserContextMiddleware)`.
100
+
101
+ The middleware exposes only the human caller's UID-based request identity:
102
+
103
+ - `request.state.user` is `RequestUserIdentity`
104
+ - `request.state.user_uid` is the canonical public user UUID
105
+ - `request.state.user_id` does not exist
106
+
107
+ In deployed runtimes, identity comes from the trusted gateway's `X-User-UID`.
108
+ For direct local API development, a bearer-authenticated request is validated
109
+ through `/api/v1/users/me/`; this supports testing a local service through a
110
+ Cloudflare tunnel before deploying it. Never inject `X-User-UID` from frontend code, and
111
+ never confuse the requesting human with the release owner, workload principal,
112
+ or runtime target. Use the UID for application authorization after identity has
113
+ been resolved.
98
114
 
99
115
  ### 2. Implement the provider
100
116
 
@@ -179,7 +179,19 @@ Current CLI note:
179
179
  - `mainsequence constants list --filter name=MODEL__DEFAULT_WINDOW`
180
180
  - `mainsequence secrets list --filter name=POLYGON_API_KEY`
181
181
 
182
- ### 7. Access assumptions must be verified
182
+ ### 7. Public principal identity is UID-only
183
+
184
+ All SDK and CLI sharing mutations identify users and teams by public UUID:
185
+
186
+ - `add_to_view(user_uid)` and `add_to_edit(user_uid)`
187
+ - `remove_from_view(user_uid)` and `remove_from_edit(user_uid)`
188
+ - the corresponding team methods use `team_uid`
189
+
190
+ Never pass or request a numeric user or team database ID. CLI sharing commands
191
+ take `<USER_UID>` or `<TEAM_UID>`, and access-state output is interpreted through
192
+ public UID fields.
193
+
194
+ ### 8. Access assumptions must be verified
183
195
 
184
196
  If the task claims a resource is shareable, readable, or maintainable by another actor, verify that path explicitly with the relevant CLI or client workflow.
185
197