mainsequence 4.4.16__tar.gz → 4.4.19__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-4.4.16/mainsequence.egg-info → mainsequence-4.4.19}/PKG-INFO +1 -1
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/a2a_communication/SKILL.md +4 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/data_access/exploration/SKILL.md +68 -8
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/api.py +75 -289
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/cli.py +93 -941
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/config.py +42 -5
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/agent_runtime_models.py +255 -131
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/metatables/core.py +26 -14
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/models_foundry.py +0 -6
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/compiled_sql/v1.py +22 -3
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/persist_managers.py +4 -2
- {mainsequence-4.4.16 → mainsequence-4.4.19/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-4.4.16 → mainsequence-4.4.19}/pyproject.toml +1 -1
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_cli.py +299 -792
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_filter_normalization.py +337 -85
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_meta_tables_client_models.py +41 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_run_configuration.py +37 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/LICENSE +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/README.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/__main__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/base.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/client.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/contracts/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/contracts/table_visuals.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/contracts/tabular.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/contracts/ui.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/providers/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/widgets/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/widgets/bindings.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/widgets/registry.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/widgets/table.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/workspaces/documents.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/defaults.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/logconf.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/setup.cfg +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_cli_migrations.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_client.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_command_center_models.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_command_center_table_contracts.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_command_center_tabular_transform.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_instrumentation.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_logconf.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_schema_names.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.4.16 → mainsequence-4.4.19}/tests/test_workspace_snapshot.py +0 -0
{mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/a2a_communication/SKILL.md
RENAMED
|
@@ -83,6 +83,10 @@ mainsequence agent session a2a send \
|
|
|
83
83
|
- Parse the CLI output as the standard A2A JSON response.
|
|
84
84
|
- Consume only `message.parts` from the A2A response.
|
|
85
85
|
- Do not depend on reasoning, tool traces, runtime paths, or transport metadata.
|
|
86
|
+
- If a send times out or disconnects and must be retried, reuse the same
|
|
87
|
+
`--message-id` value so the target can treat it as the same logical message.
|
|
88
|
+
- If the CLI generated the message id and the send failed, reuse the
|
|
89
|
+
`A2A message id for exact retry` value printed with the error.
|
|
86
90
|
|
|
87
91
|
## Deterministic Execution Path
|
|
88
92
|
|
{mainsequence-4.4.16 → mainsequence-4.4.19}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
@@ -92,22 +92,81 @@ For platform discovery, start with the `mainsequence` CLI.
|
|
|
92
92
|
|
|
93
93
|
Discovery priority:
|
|
94
94
|
|
|
95
|
-
- use search first when the
|
|
96
|
-
- use list and filters when the
|
|
95
|
+
- use semantic description search first when the user describes a dataset in natural language
|
|
96
|
+
- use list and filters only when the user already knows a structured field to constrain by
|
|
97
|
+
- use column lookup only when the user is specifically searching for a schema or column name
|
|
97
98
|
- use detail only after you have identified the candidate object you want to inspect
|
|
98
99
|
|
|
99
|
-
|
|
100
|
+
Semantic description discovery searches `MetaTable` metadata rows through:
|
|
101
|
+
|
|
102
|
+
- `GET /orm/api/ts_manager/meta_table/description-search/?q=<text>`
|
|
103
|
+
|
|
104
|
+
The same discovery surface applies to `MetaTable` metadata and to published
|
|
105
|
+
`DataNode` storage tables, because `DataNode` storage is represented by
|
|
106
|
+
`TimeIndexMetaTable` metadata.
|
|
107
|
+
|
|
108
|
+
Typical semantic discovery commands:
|
|
100
109
|
|
|
101
110
|
- `mainsequence data-node search "<keyword>"`
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
-
|
|
111
|
+
|
|
112
|
+
Optional ranking knobs for description discovery:
|
|
113
|
+
|
|
114
|
+
- `--trigram-k 200`
|
|
115
|
+
- `--embed-k 200`
|
|
116
|
+
- `--w-trgm 0.65`
|
|
117
|
+
- `--w-emb 0.35`
|
|
118
|
+
|
|
119
|
+
The response is paginated metadata:
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"count": 2,
|
|
124
|
+
"next": null,
|
|
125
|
+
"previous": null,
|
|
126
|
+
"results": [
|
|
127
|
+
{
|
|
128
|
+
"orm_class": "TimeIndexMetaTable",
|
|
129
|
+
"uid": "0b0f5733-b1ee-4d09-b51f-9e29073007fd",
|
|
130
|
+
"data_source_uid": "864e7c22-482a-464a-8758-0d3408abd77f",
|
|
131
|
+
"identifier": "ms_markets__externalpricests__mainsequence_examples",
|
|
132
|
+
"namespace": "mainsequence.examples",
|
|
133
|
+
"description": "...",
|
|
134
|
+
"physical_table_name": "ms_markets__externalpricests__mainsequence_examples",
|
|
135
|
+
"table_contract": {},
|
|
136
|
+
"columns": [],
|
|
137
|
+
"indexes_meta": [],
|
|
138
|
+
"foreign_keys": [],
|
|
139
|
+
"cadence": "1d",
|
|
140
|
+
"time_indexed_profile": {}
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Structured filtering is a different path. Use it only when you already know the
|
|
147
|
+
field to filter by:
|
|
148
|
+
|
|
106
149
|
- `mainsequence data-node list`
|
|
107
150
|
- `mainsequence data-node list --show-filters`
|
|
108
151
|
- `mainsequence data-node list --filter KEY=VALUE`
|
|
109
152
|
- `mainsequence data-node detail <DATA_NODE_STORAGE_UID>`
|
|
110
153
|
|
|
154
|
+
Column lookup is also a different path. Use it only for schema-name discovery,
|
|
155
|
+
not as the default dataset discovery flow:
|
|
156
|
+
|
|
157
|
+
- `mainsequence data-node search "<column-name>" --mode column`
|
|
158
|
+
|
|
159
|
+
Raw SQL inspection is only for targeted exploration after you have a UID:
|
|
160
|
+
|
|
161
|
+
- `mainsequence meta-table run_query <META_TABLE_UID> "SELECT * FROM public.some_table LIMIT 100"`
|
|
162
|
+
- `mainsequence data-node run_query <DATA_NODE_STORAGE_UID> "SELECT * FROM public.some_table LIMIT 100"`
|
|
163
|
+
|
|
164
|
+
Use the MetaTable command for `MetaTable` UIDs. Use the DataNode command only
|
|
165
|
+
for `DataNode` storage UIDs. Do not confuse the two surfaces.
|
|
166
|
+
|
|
167
|
+
For direct SDK/backend usage, MetaTable raw SQL is sent as a JSON string body,
|
|
168
|
+
not as an object. Do not send `{ "sql": "SELECT ..." }`.
|
|
169
|
+
|
|
111
170
|
### 2. Stop at discovery boundaries
|
|
112
171
|
|
|
113
172
|
Use the CLI or SDK client to identify what exists and collect the relevant identifiers, object UIDs, and metadata.
|
|
@@ -117,7 +176,8 @@ Do not define code-level read patterns here.
|
|
|
117
176
|
For `DataNode` discovery specifically:
|
|
118
177
|
|
|
119
178
|
- start with `mainsequence data-node search`
|
|
120
|
-
- use `mainsequence data-node list` when you need broader enumeration or structured filters
|
|
179
|
+
- use `mainsequence data-node list` only when you need broader enumeration or structured filters
|
|
180
|
+
- use `mainsequence data-node search "<column-name>" --mode column` only for schema-name lookup
|
|
121
181
|
- use `mainsequence data-node detail` only after search or list identified the target storage
|
|
122
182
|
|
|
123
183
|
### 3. Report platform objects with evidence
|
|
@@ -24,7 +24,14 @@ from urllib.parse import urlencode
|
|
|
24
24
|
|
|
25
25
|
import requests
|
|
26
26
|
|
|
27
|
-
from .config import
|
|
27
|
+
from .config import (
|
|
28
|
+
backend_url,
|
|
29
|
+
clear_runtime_access_cache,
|
|
30
|
+
get_runtime_access_cache,
|
|
31
|
+
get_tokens,
|
|
32
|
+
save_runtime_access_cache,
|
|
33
|
+
save_tokens,
|
|
34
|
+
)
|
|
28
35
|
|
|
29
36
|
AUTH_PATHS = {
|
|
30
37
|
"authorize": "/auth/cli/authorize/",
|
|
@@ -39,7 +46,6 @@ CLI_BROWSER_CLIENT_ID = "mainsequence-cli"
|
|
|
39
46
|
S = requests.Session()
|
|
40
47
|
S.headers.update({"Content-Type": "application/json"})
|
|
41
48
|
|
|
42
|
-
DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS = 900.0
|
|
43
49
|
_UNSET = object()
|
|
44
50
|
|
|
45
51
|
|
|
@@ -1061,7 +1067,6 @@ def semantic_search_agents(
|
|
|
1061
1067
|
def create_agent(
|
|
1062
1068
|
*,
|
|
1063
1069
|
name: str,
|
|
1064
|
-
agent_unique_id: str,
|
|
1065
1070
|
description: str | None = None,
|
|
1066
1071
|
status: str | None = None,
|
|
1067
1072
|
labels: list[str] | None = None,
|
|
@@ -1080,7 +1085,6 @@ def create_agent(
|
|
|
1080
1085
|
key: value
|
|
1081
1086
|
for key, value in {
|
|
1082
1087
|
"name": name,
|
|
1083
|
-
"agent_unique_id": agent_unique_id,
|
|
1084
1088
|
"description": description,
|
|
1085
1089
|
"status": status,
|
|
1086
1090
|
"labels": labels,
|
|
@@ -1107,55 +1111,6 @@ def create_agent(
|
|
|
1107
1111
|
raise ApiError(f"Agent creation failed: {e}") from e
|
|
1108
1112
|
|
|
1109
1113
|
|
|
1110
|
-
def get_or_create_agent(
|
|
1111
|
-
*,
|
|
1112
|
-
name: str,
|
|
1113
|
-
agent_unique_id: str,
|
|
1114
|
-
description: str | None = None,
|
|
1115
|
-
status: str | None = None,
|
|
1116
|
-
labels: list[str] | None = None,
|
|
1117
|
-
llm_provider: str | None = None,
|
|
1118
|
-
llm_model: str | None = None,
|
|
1119
|
-
engine_name: str | None = None,
|
|
1120
|
-
runtime_config: dict[str, Any] | None = None,
|
|
1121
|
-
configuration: dict[str, Any] | None = None,
|
|
1122
|
-
metadata: dict[str, Any] | None = None,
|
|
1123
|
-
timeout: int | None = None,
|
|
1124
|
-
) -> dict[str, Any]:
|
|
1125
|
-
"""
|
|
1126
|
-
Get or create one agent via SDK client model.
|
|
1127
|
-
"""
|
|
1128
|
-
payload = {
|
|
1129
|
-
key: value
|
|
1130
|
-
for key, value in {
|
|
1131
|
-
"name": name,
|
|
1132
|
-
"agent_unique_id": agent_unique_id,
|
|
1133
|
-
"description": description,
|
|
1134
|
-
"status": status,
|
|
1135
|
-
"labels": labels,
|
|
1136
|
-
"llm_provider": llm_provider,
|
|
1137
|
-
"llm_model": llm_model,
|
|
1138
|
-
"engine_name": engine_name,
|
|
1139
|
-
"runtime_config": runtime_config,
|
|
1140
|
-
"configuration": configuration,
|
|
1141
|
-
"metadata": metadata,
|
|
1142
|
-
}.items()
|
|
1143
|
-
if value is not None
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
try:
|
|
1147
|
-
agent = _run_sdk_model_operation(
|
|
1148
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1149
|
-
class_name="Agent",
|
|
1150
|
-
operation=lambda ClientAgent: ClientAgent.get_or_create(timeout=timeout, **payload),
|
|
1151
|
-
)
|
|
1152
|
-
return _sdk_object_to_dict(agent)
|
|
1153
|
-
except Exception as e:
|
|
1154
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1155
|
-
raise
|
|
1156
|
-
raise ApiError(f"Agent get_or_create failed: {e}") from e
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
1114
|
def delete_agent(
|
|
1160
1115
|
agent_uid: str,
|
|
1161
1116
|
*,
|
|
@@ -1255,41 +1210,13 @@ def list_agent_sessions(
|
|
|
1255
1210
|
timeout: int | None = None,
|
|
1256
1211
|
filters: dict[str, Any] | None = None,
|
|
1257
1212
|
agent_uid: str | None = None,
|
|
1258
|
-
agent_unique_id: str | None = None,
|
|
1259
1213
|
) -> list[dict[str, Any]]:
|
|
1260
1214
|
"""
|
|
1261
1215
|
List agent sessions via SDK client model, optionally scoped to one agent.
|
|
1262
1216
|
"""
|
|
1263
|
-
if agent_uid and agent_unique_id:
|
|
1264
|
-
raise ApiError("Pass either agent_uid or agent_unique_id, not both.")
|
|
1265
|
-
|
|
1266
1217
|
session_filters = dict(filters or {})
|
|
1267
1218
|
if agent_uid:
|
|
1268
1219
|
session_filters["agent_uid"] = str(agent_uid)
|
|
1269
|
-
elif agent_unique_id:
|
|
1270
|
-
try:
|
|
1271
|
-
agent = _run_sdk_model_operation(
|
|
1272
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1273
|
-
class_name="Agent",
|
|
1274
|
-
operation=lambda ClientAgent: ClientAgent.get_by_agent_unique_id(
|
|
1275
|
-
str(agent_unique_id), timeout=timeout
|
|
1276
|
-
),
|
|
1277
|
-
)
|
|
1278
|
-
except Exception as e:
|
|
1279
|
-
err_name = type(e).__name__
|
|
1280
|
-
if err_name in {"DoesNotExist", "NotFoundError"}:
|
|
1281
|
-
raise ApiError(f"Agent not found for agent_unique_id={agent_unique_id!r}") from e
|
|
1282
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1283
|
-
raise
|
|
1284
|
-
raise ApiError(
|
|
1285
|
-
f"Agent lookup failed for agent_unique_id={agent_unique_id!r}: {e}"
|
|
1286
|
-
) from e
|
|
1287
|
-
|
|
1288
|
-
resolved_agent = _sdk_object_to_dict(agent)
|
|
1289
|
-
resolved_agent_uid = str(resolved_agent.get("uid") or "").strip()
|
|
1290
|
-
if not resolved_agent_uid:
|
|
1291
|
-
raise ApiError(f"Agent lookup returned no uid for agent_unique_id={agent_unique_id!r}")
|
|
1292
|
-
session_filters["agent_uid"] = resolved_agent_uid
|
|
1293
1220
|
|
|
1294
1221
|
try:
|
|
1295
1222
|
payload = _run_sdk_model_operation(
|
|
@@ -1332,135 +1259,33 @@ def get_agent_session(
|
|
|
1332
1259
|
raise ApiError(f"Agent session fetch failed: {e}") from e
|
|
1333
1260
|
|
|
1334
1261
|
|
|
1335
|
-
def resolve_agent_session_runtime_access(
|
|
1336
|
-
agent_session_uid: str,
|
|
1337
|
-
*,
|
|
1338
|
-
wait_for_runtime: bool = False,
|
|
1339
|
-
timeout: int | None = None,
|
|
1340
|
-
) -> dict[str, Any]:
|
|
1341
|
-
"""
|
|
1342
|
-
Resolve runtime access for one agent session via SDK client model.
|
|
1343
|
-
"""
|
|
1344
|
-
try:
|
|
1345
|
-
runtime_access = _run_sdk_model_operation(
|
|
1346
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1347
|
-
class_name="AgentSession",
|
|
1348
|
-
operation=lambda ClientAgentSession: ClientAgentSession.resolve_runtime_access(
|
|
1349
|
-
str(agent_session_uid),
|
|
1350
|
-
wait_for_runtime=wait_for_runtime,
|
|
1351
|
-
timeout=timeout,
|
|
1352
|
-
),
|
|
1353
|
-
)
|
|
1354
|
-
return _sdk_object_to_dict(runtime_access)
|
|
1355
|
-
except Exception as e:
|
|
1356
|
-
err_name = type(e).__name__
|
|
1357
|
-
if err_name == "NotFoundError":
|
|
1358
|
-
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1359
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1360
|
-
raise
|
|
1361
|
-
raise ApiError(f"Agent session runtime access resolve failed: {e}") from e
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
def wait_agent_session_runtime_ready(
|
|
1365
|
-
agent_session_uid: str,
|
|
1366
|
-
*,
|
|
1367
|
-
timeout_seconds: float = DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS,
|
|
1368
|
-
timeout: int | None = None,
|
|
1369
|
-
) -> dict[str, Any]:
|
|
1370
|
-
"""
|
|
1371
|
-
Wait for one agent session runtime through SDK client model.
|
|
1372
|
-
"""
|
|
1373
|
-
try:
|
|
1374
|
-
ready = _run_sdk_model_operation(
|
|
1375
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1376
|
-
class_name="AgentSession",
|
|
1377
|
-
operation=lambda ClientAgentSession: ClientAgentSession.wait_until_runtime_ready(
|
|
1378
|
-
str(agent_session_uid),
|
|
1379
|
-
timeout_seconds=timeout_seconds,
|
|
1380
|
-
timeout=timeout,
|
|
1381
|
-
),
|
|
1382
|
-
)
|
|
1383
|
-
return _sdk_object_to_dict(ready)
|
|
1384
|
-
except Exception as e:
|
|
1385
|
-
err_name = type(e).__name__
|
|
1386
|
-
if err_name == "NotFoundError":
|
|
1387
|
-
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1388
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1389
|
-
raise
|
|
1390
|
-
raise ApiError(f"Agent session runtime readiness failed: {e}") from e
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
def send_agent_session_a2a_chat(
|
|
1394
|
-
agent_session_uid: str,
|
|
1395
|
-
*,
|
|
1396
|
-
message: str | None = None,
|
|
1397
|
-
a2a_payload: dict[str, Any] | None = None,
|
|
1398
|
-
wait_for_runtime: bool = True,
|
|
1399
|
-
runtime_ready_timeout_seconds: float = DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS,
|
|
1400
|
-
poll_task_until_stable: bool | None = None,
|
|
1401
|
-
runtime_turn_timeout_seconds: float | None = None,
|
|
1402
|
-
omit_reasoning: bool | None = None,
|
|
1403
|
-
response_format: dict[str, Any] | None = None,
|
|
1404
|
-
json_repair: dict[str, Any] | None = None,
|
|
1405
|
-
timeout: int | None = None,
|
|
1406
|
-
) -> dict[str, Any]:
|
|
1407
|
-
"""
|
|
1408
|
-
Send an A2A request through the legacy backend compatibility endpoint.
|
|
1409
|
-
"""
|
|
1410
|
-
try:
|
|
1411
|
-
chat = _run_sdk_model_operation(
|
|
1412
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1413
|
-
class_name="AgentSession",
|
|
1414
|
-
operation=lambda ClientAgentSession: ClientAgentSession.send_a2a_chat(
|
|
1415
|
-
str(agent_session_uid),
|
|
1416
|
-
message=message,
|
|
1417
|
-
a2a_payload=a2a_payload,
|
|
1418
|
-
wait_for_runtime=wait_for_runtime,
|
|
1419
|
-
runtime_ready_timeout_seconds=runtime_ready_timeout_seconds,
|
|
1420
|
-
poll_task_until_stable=poll_task_until_stable,
|
|
1421
|
-
runtime_turn_timeout_seconds=runtime_turn_timeout_seconds,
|
|
1422
|
-
omit_reasoning=omit_reasoning,
|
|
1423
|
-
response_format=response_format,
|
|
1424
|
-
json_repair=json_repair,
|
|
1425
|
-
timeout=timeout,
|
|
1426
|
-
),
|
|
1427
|
-
)
|
|
1428
|
-
return _sdk_object_to_dict(chat)
|
|
1429
|
-
except Exception as e:
|
|
1430
|
-
err_name = type(e).__name__
|
|
1431
|
-
if err_name == "NotFoundError":
|
|
1432
|
-
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1433
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1434
|
-
raise
|
|
1435
|
-
raise ApiError(f"Agent session A2A chat failed: {e}") from e
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
1262
|
def send_agent_session_a2a_message(
|
|
1439
1263
|
agent_session_uid: str,
|
|
1440
1264
|
*,
|
|
1441
1265
|
message: str,
|
|
1266
|
+
message_id: str | None = None,
|
|
1442
1267
|
strict_dictionary: bool = False,
|
|
1443
1268
|
json_repair_attempts: int = 3,
|
|
1444
|
-
history_length: int = 0,
|
|
1445
1269
|
return_immediately: bool = False,
|
|
1446
|
-
wait_for_runtime: bool = True,
|
|
1447
1270
|
timeout: int | None = None,
|
|
1448
1271
|
) -> dict[str, Any]:
|
|
1449
1272
|
"""
|
|
1450
1273
|
Send one standard A2A message through the target session runtime.
|
|
1451
1274
|
"""
|
|
1452
1275
|
try:
|
|
1276
|
+
cached_runtime_access = get_runtime_access_cache(str(agent_session_uid))
|
|
1453
1277
|
payload = _run_sdk_model_operation(
|
|
1454
1278
|
module_name="mainsequence.client.agent_runtime_models",
|
|
1455
1279
|
class_name="AgentSession",
|
|
1456
|
-
operation=lambda ClientAgentSession:
|
|
1457
|
-
|
|
1280
|
+
operation=lambda ClientAgentSession: _send_agent_session_a2a_message_with_cache(
|
|
1281
|
+
ClientAgentSession,
|
|
1282
|
+
agent_session_uid=str(agent_session_uid),
|
|
1458
1283
|
message=message,
|
|
1284
|
+
message_id=message_id,
|
|
1285
|
+
cached_runtime_access=cached_runtime_access,
|
|
1459
1286
|
strict_dictionary=strict_dictionary,
|
|
1460
1287
|
json_repair_attempts=json_repair_attempts,
|
|
1461
|
-
history_length=history_length,
|
|
1462
1288
|
return_immediately=return_immediately,
|
|
1463
|
-
wait_for_runtime=wait_for_runtime,
|
|
1464
1289
|
timeout=timeout,
|
|
1465
1290
|
),
|
|
1466
1291
|
)
|
|
@@ -1471,112 +1296,43 @@ def send_agent_session_a2a_message(
|
|
|
1471
1296
|
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1472
1297
|
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1473
1298
|
raise
|
|
1299
|
+
if "401" in str(e) or "403" in str(e) or "unauthorized" in str(e).lower():
|
|
1300
|
+
clear_runtime_access_cache(str(agent_session_uid))
|
|
1474
1301
|
raise ApiError(f"Agent session A2A message send failed: {e}") from e
|
|
1475
1302
|
|
|
1476
1303
|
|
|
1477
|
-
def
|
|
1478
|
-
|
|
1304
|
+
def _send_agent_session_a2a_message_with_cache(
|
|
1305
|
+
ClientAgentSession,
|
|
1479
1306
|
*,
|
|
1480
|
-
message: str,
|
|
1481
|
-
runtime_access: dict[str, Any] | None = None,
|
|
1482
|
-
wait_for_runtime: bool = True,
|
|
1483
|
-
runtime_turn_timeout_seconds: float | None = None,
|
|
1484
|
-
omit_reasoning: bool | None = True,
|
|
1485
|
-
response_format: dict[str, Any] | None = None,
|
|
1486
|
-
json_repair: dict[str, Any] | None = None,
|
|
1487
|
-
timeout: int | None = None,
|
|
1488
|
-
) -> dict[str, Any]:
|
|
1489
|
-
"""
|
|
1490
|
-
Send one message through the resolved A2A runtime chat stream.
|
|
1491
|
-
"""
|
|
1492
|
-
operation_kwargs: dict[str, Any] = {
|
|
1493
|
-
"message": message,
|
|
1494
|
-
"wait_for_runtime": wait_for_runtime,
|
|
1495
|
-
"runtime_turn_timeout_seconds": runtime_turn_timeout_seconds,
|
|
1496
|
-
"omit_reasoning": omit_reasoning,
|
|
1497
|
-
"response_format": response_format,
|
|
1498
|
-
"json_repair": json_repair,
|
|
1499
|
-
"timeout": timeout,
|
|
1500
|
-
}
|
|
1501
|
-
if runtime_access is not None:
|
|
1502
|
-
operation_kwargs["runtime_access"] = runtime_access
|
|
1503
|
-
try:
|
|
1504
|
-
payload = _run_sdk_model_operation(
|
|
1505
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1506
|
-
class_name="AgentSession",
|
|
1507
|
-
operation=lambda ClientAgentSession: ClientAgentSession.a2a_chat(
|
|
1508
|
-
str(agent_session_uid),
|
|
1509
|
-
**operation_kwargs,
|
|
1510
|
-
),
|
|
1511
|
-
)
|
|
1512
|
-
return _sdk_object_to_dict(payload)
|
|
1513
|
-
except Exception as e:
|
|
1514
|
-
err_name = type(e).__name__
|
|
1515
|
-
if err_name == "NotFoundError":
|
|
1516
|
-
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1517
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1518
|
-
raise
|
|
1519
|
-
raise ApiError(f"Agent session runtime chat failed: {e}") from e
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
def cancel_agent_session_runtime(
|
|
1523
1307
|
agent_session_uid: str,
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
except Exception as e:
|
|
1545
|
-
err_name = type(e).__name__
|
|
1546
|
-
if err_name == "NotFoundError":
|
|
1547
|
-
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1548
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1549
|
-
raise
|
|
1550
|
-
raise ApiError(f"Agent session runtime cancel failed: {e}") from e
|
|
1551
|
-
|
|
1308
|
+
message: str,
|
|
1309
|
+
message_id: str | None,
|
|
1310
|
+
cached_runtime_access: dict[str, Any] | None,
|
|
1311
|
+
strict_dictionary: bool,
|
|
1312
|
+
json_repair_attempts: int,
|
|
1313
|
+
return_immediately: bool,
|
|
1314
|
+
timeout: int | None,
|
|
1315
|
+
):
|
|
1316
|
+
if cached_runtime_access is not None:
|
|
1317
|
+
ClientAgentSession.cache_runtime_access(agent_session_uid, cached_runtime_access)
|
|
1318
|
+
|
|
1319
|
+
payload = ClientAgentSession.send_a2a_message(
|
|
1320
|
+
agent_session_uid,
|
|
1321
|
+
message=message,
|
|
1322
|
+
message_id=message_id,
|
|
1323
|
+
strict_dictionary=strict_dictionary,
|
|
1324
|
+
json_repair_attempts=json_repair_attempts,
|
|
1325
|
+
return_immediately=return_immediately,
|
|
1326
|
+
timeout=timeout,
|
|
1327
|
+
)
|
|
1552
1328
|
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
) -> dict[str, Any]:
|
|
1559
|
-
"""
|
|
1560
|
-
Detach the resolved A2A runtime for one agent session.
|
|
1561
|
-
"""
|
|
1562
|
-
try:
|
|
1563
|
-
payload = _run_sdk_model_operation(
|
|
1564
|
-
module_name="mainsequence.client.agent_runtime_models",
|
|
1565
|
-
class_name="AgentSession",
|
|
1566
|
-
operation=lambda ClientAgentSession: ClientAgentSession.detach_runtime(
|
|
1567
|
-
str(agent_session_uid),
|
|
1568
|
-
reason=reason,
|
|
1569
|
-
timeout=timeout,
|
|
1570
|
-
),
|
|
1329
|
+
resolved_access = ClientAgentSession.get_cached_runtime_access(agent_session_uid)
|
|
1330
|
+
if resolved_access is not None:
|
|
1331
|
+
save_runtime_access_cache(
|
|
1332
|
+
agent_session_uid,
|
|
1333
|
+
_sdk_object_to_dict(resolved_access),
|
|
1571
1334
|
)
|
|
1572
|
-
|
|
1573
|
-
except Exception as e:
|
|
1574
|
-
err_name = type(e).__name__
|
|
1575
|
-
if err_name == "NotFoundError":
|
|
1576
|
-
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1577
|
-
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1578
|
-
raise
|
|
1579
|
-
raise ApiError(f"Agent session runtime detach failed: {e}") from e
|
|
1335
|
+
return payload
|
|
1580
1336
|
|
|
1581
1337
|
|
|
1582
1338
|
def list_agent_users_can_view(
|
|
@@ -4686,6 +4442,36 @@ def run_data_node_storage_query(
|
|
|
4686
4442
|
raise ApiError(f"Data node query failed: {e}") from e
|
|
4687
4443
|
|
|
4688
4444
|
|
|
4445
|
+
def run_meta_table_query(
|
|
4446
|
+
meta_table_uid: str,
|
|
4447
|
+
sql: str,
|
|
4448
|
+
*,
|
|
4449
|
+
timeout: int | None = None,
|
|
4450
|
+
) -> dict[str, Any]:
|
|
4451
|
+
"""
|
|
4452
|
+
Run a raw SQL query against one MetaTable via SDK client model.
|
|
4453
|
+
"""
|
|
4454
|
+
try:
|
|
4455
|
+
|
|
4456
|
+
def _run_query(ClientMetaTable):
|
|
4457
|
+
meta_table = ClientMetaTable.get(uid=str(meta_table_uid), timeout=timeout)
|
|
4458
|
+
payload = meta_table.run_query(sql, timeout=timeout)
|
|
4459
|
+
return dict(payload) if isinstance(payload, dict) else {"ok": True, "results": payload}
|
|
4460
|
+
|
|
4461
|
+
return _run_sdk_model_operation(
|
|
4462
|
+
module_name="mainsequence.client.metatables",
|
|
4463
|
+
class_name="MetaTable",
|
|
4464
|
+
operation=_run_query,
|
|
4465
|
+
)
|
|
4466
|
+
except Exception as e:
|
|
4467
|
+
err_name = type(e).__name__
|
|
4468
|
+
if err_name == "NotFoundError":
|
|
4469
|
+
raise ApiError(f"MetaTable not found: {meta_table_uid}") from e
|
|
4470
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
4471
|
+
raise
|
|
4472
|
+
raise ApiError(f"MetaTable query failed: {e}") from e
|
|
4473
|
+
|
|
4474
|
+
|
|
4689
4475
|
def delete_data_node_storage(
|
|
4690
4476
|
storage_uid: str,
|
|
4691
4477
|
*,
|