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.
- {mainsequence-6.0.26/mainsequence.egg-info → mainsequence-6.0.28}/PKG-INFO +1 -1
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/AGENTS.md +7 -1
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +17 -1
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +13 -1
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/api.py +120 -120
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/cli.py +150 -151
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/agent_runtime_models.py +37 -14
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/base.py +38 -27
- mainsequence-6.0.28/mainsequence/client/fastapi/auth.py +66 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/models_helpers.py +31 -15
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/models_user.py +198 -348
- {mainsequence-6.0.26 → mainsequence-6.0.28/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/SOURCES.txt +2 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/pyproject.toml +1 -1
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_cli.py +133 -77
- mainsequence-6.0.28/tests/test_fastapi_request_identity.py +108 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_filter_normalization.py +143 -35
- mainsequence-6.0.28/tests/test_models_user_request_bound_auth.py +179 -0
- mainsequence-6.0.28/tests/test_notification_uid_contract.py +84 -0
- mainsequence-6.0.26/mainsequence/client/fastapi/auth.py +0 -112
- mainsequence-6.0.26/tests/test_models_user_request_bound_auth.py +0 -364
- {mainsequence-6.0.26 → mainsequence-6.0.28}/LICENSE +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/README.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/maintenance/project-maintenance/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/agent_scaffold/skills/sdk_project_execution/SKILL.md +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/__main__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/bootstrap.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/config.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/cli/ui.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/client.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/client/utils.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/defaults.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/logconf.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/project_skills.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/runtime_context.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/setup.cfg +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_auth_precedence.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_canonical_api_route_contract.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_cli_migrations.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_client.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_dependency_extras.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_instrumentation.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_logconf.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_project_branch_contract.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_project_skills.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_run_configuration.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_schema_names.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_secret_client_model.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_update_statistics.py +0 -0
- {mainsequence-6.0.26 → mainsequence-6.0.28}/tests/test_update_uid_guards.py +0 -0
|
@@ -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
|
|
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.
|
|
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
|
|