mainsequence 4.4.5__tar.gz → 4.4.8__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.5/mainsequence.egg-info → mainsequence-4.4.8}/PKG-INFO +1 -1
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/AGENTS.md +7 -1
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +67 -1
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/api.py +279 -2
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/cli.py +585 -31
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/agent_runtime_models.py +3 -3
- mainsequence-4.4.8/mainsequence/client/command_center/connections.py +680 -0
- mainsequence-4.4.8/mainsequence/scaffold_skills.py +260 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/SOURCES.txt +2 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/pyproject.toml +1 -1
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_cli.py +284 -1
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_command_center_models.py +201 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_filter_normalization.py +12 -14
- mainsequence-4.4.8/tests/test_scaffold_skills.py +179 -0
- mainsequence-4.4.5/mainsequence/client/command_center/connections.py +0 -274
- {mainsequence-4.4.5 → mainsequence-4.4.8}/LICENSE +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/README.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/__main__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/config.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/base.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/client.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/defaults.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/logconf.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/setup.cfg +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_cli_migrations.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_client.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_instrumentation.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_logconf.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_run_configuration.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_schema_names.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_workspace_snapshot.py +0 -0
|
@@ -25,6 +25,10 @@ installed Main Sequence scaffold files so the local CLI surface, `AGENTS.md`, an
|
|
|
25
25
|
- `mainsequence project update AGENTS.md --path .`
|
|
26
26
|
- `mainsequence project update_agent_skills --path .`
|
|
27
27
|
|
|
28
|
+
After refreshing skills, `.agents/skills/mainsequence/PINNED_FROM.txt` records
|
|
29
|
+
the installed SDK version that supplied the copied Main Sequence skills. Inspect
|
|
30
|
+
that sentinel when checking whether the managed skills are current.
|
|
31
|
+
|
|
28
32
|
Canonical Main Sequence documentation root:
|
|
29
33
|
`https://mainsequence-sdk.github.io/mainsequence-sdk/`
|
|
30
34
|
|
|
@@ -210,7 +214,9 @@ For any non-trivial Main Sequence task:
|
|
|
210
214
|
12. After updating the SDK, refresh the installed Main Sequence scaffold files:
|
|
211
215
|
`mainsequence project update AGENTS.md --path .`
|
|
212
216
|
`mainsequence project update_agent_skills --path .`
|
|
213
|
-
13.
|
|
217
|
+
13. Check `.agents/skills/mainsequence/PINNED_FROM.txt` when you need to verify
|
|
218
|
+
which SDK version supplied the copied Main Sequence skills.
|
|
219
|
+
14. Verify platform state with the CLI or platform tooling instead of guessing.
|
|
214
220
|
|
|
215
221
|
## Orchestrator Rule
|
|
216
222
|
|
|
@@ -33,6 +33,72 @@ frontend/editor tooling or a future explicit transform, but the current backend
|
|
|
33
33
|
hot-path validate, extract JSONPath rows, coerce schemas, or reshape provider responses because a
|
|
34
34
|
mapping exists.
|
|
35
35
|
|
|
36
|
+
## Connection CLI And Transport Modes
|
|
37
|
+
|
|
38
|
+
Use the Main Sequence CLI to create or update the Adapter from API connection instance that points
|
|
39
|
+
Command Center at the provider API.
|
|
40
|
+
|
|
41
|
+
Backend/deployed API mode:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
mainsequence cc connection create-adapter-from-api \
|
|
45
|
+
--name "Provider API" \
|
|
46
|
+
--api-base-url https://api.example.com \
|
|
47
|
+
--workspace-uid <workspace-uid> \
|
|
48
|
+
--default
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Direct local/tunnel development mode:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
cloudflared tunnel --url http://127.0.0.1:8021
|
|
55
|
+
|
|
56
|
+
mainsequence cc connection create-adapter-from-api \
|
|
57
|
+
--name "Provider API local" \
|
|
58
|
+
--debug-api-base-url https://example.trycloudflare.com \
|
|
59
|
+
--workspace-uid <workspace-uid> \
|
|
60
|
+
--default
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Patch an existing Adapter from API connection:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
mainsequence cc connection patch-adapter-from-api <connection-uid> \
|
|
67
|
+
--api-base-url https://api.example.com
|
|
68
|
+
|
|
69
|
+
mainsequence cc connection patch-adapter-from-api <connection-uid> \
|
|
70
|
+
--debug-api-base-url https://example.trycloudflare.com
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Inspect connection state:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
mainsequence cc connection list --filter type_id=command_center.adapter_from_api
|
|
77
|
+
mainsequence cc connection detail <connection-uid>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
CLI characteristics:
|
|
81
|
+
|
|
82
|
+
- `--api-base-url` creates backend mode public config with `apiBaseUrl`.
|
|
83
|
+
- `--debug-api-base-url` creates direct mode public config with `transportMode=direct`,
|
|
84
|
+
`debugApiBaseUrl`, `compiledContractSource=direct`, and derived contract/OpenAPI URLs.
|
|
85
|
+
- `--public-config-json` and `--public-config-file` accept a full publicConfig object when URL
|
|
86
|
+
options are not enough.
|
|
87
|
+
- `--config-json` and `--config-file` set public non-secret `configValues`.
|
|
88
|
+
- `--secure-config-json` and `--secure-config-file` send secret values as `secureConfig`; returned
|
|
89
|
+
connection details expose only `secureFields`, not the raw secret values.
|
|
90
|
+
- `patch-adapter-from-api` must target an existing `command_center.adapter_from_api` connection; do
|
|
91
|
+
not use it for other connection types.
|
|
92
|
+
- Do not include `applicationBindings` in Adapter from API public config. The
|
|
93
|
+
`AdapterFromApiConnectionPublicConfig` model rejects it.
|
|
94
|
+
|
|
95
|
+
Direct mode is critical during development. It lets a workspace test the connection against a local
|
|
96
|
+
API before any resource release or API deployment. Run the local API, expose it with a Cloudflare
|
|
97
|
+
tunnel, create or patch the connection with `--debug-api-base-url`, and validate the workspace
|
|
98
|
+
connection/query flow directly. This avoids constant API deployments while iterating on the
|
|
99
|
+
contract, operation metadata, response shape, and widget behavior. Switch to `--api-base-url` only
|
|
100
|
+
when the deployed API is ready to be the stable backend target.
|
|
101
|
+
|
|
36
102
|
## Scope
|
|
37
103
|
|
|
38
104
|
This skill owns:
|
|
@@ -50,7 +116,7 @@ This skill does not own:
|
|
|
50
116
|
|
|
51
117
|
- general FastAPI project structure
|
|
52
118
|
- unrelated API routes for non-Command Center clients
|
|
53
|
-
- Command Center connection
|
|
119
|
+
- general Command Center connection management beyond the Adapter from API CLI workflow above
|
|
54
120
|
- workspace layout or widget mounting
|
|
55
121
|
- backend adapter runtime internals
|
|
56
122
|
- resource release or deployment orchestration
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
"""
|
|
4
2
|
mainsequence.cli.api
|
|
5
3
|
====================
|
|
@@ -14,6 +12,8 @@ This module is intentionally aligned with the VS Code extension implementation:
|
|
|
14
12
|
Any behavioral differences vs the VS Code extension should be considered bugs.
|
|
15
13
|
"""
|
|
16
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
17
|
import importlib
|
|
18
18
|
import json
|
|
19
19
|
import os
|
|
@@ -3176,6 +3176,283 @@ def get_connection_instance(
|
|
|
3176
3176
|
raise ApiError(f"Connection fetch failed: {e}") from e
|
|
3177
3177
|
|
|
3178
3178
|
|
|
3179
|
+
def _adapter_from_api_public_config_model():
|
|
3180
|
+
module = importlib.import_module("mainsequence.client.command_center.connections")
|
|
3181
|
+
return module.AdapterFromApiConnectionPublicConfig
|
|
3182
|
+
|
|
3183
|
+
|
|
3184
|
+
def _adapter_from_api_public_config_requested(
|
|
3185
|
+
*,
|
|
3186
|
+
public_config: dict[str, Any] | None,
|
|
3187
|
+
api_base_url: str | None,
|
|
3188
|
+
debug_api_base_url: str | None,
|
|
3189
|
+
config_values: dict[str, Any] | None,
|
|
3190
|
+
compiled_contract: dict[str, Any] | None,
|
|
3191
|
+
contract_version: str | None,
|
|
3192
|
+
request_timeout_ms: int | None,
|
|
3193
|
+
query_cache_policy: str | None,
|
|
3194
|
+
query_cache_ttl_ms: int | None,
|
|
3195
|
+
dedupe_in_flight: bool | None,
|
|
3196
|
+
) -> bool:
|
|
3197
|
+
return any(
|
|
3198
|
+
value is not None
|
|
3199
|
+
for value in (
|
|
3200
|
+
public_config,
|
|
3201
|
+
api_base_url,
|
|
3202
|
+
debug_api_base_url,
|
|
3203
|
+
config_values,
|
|
3204
|
+
compiled_contract,
|
|
3205
|
+
contract_version,
|
|
3206
|
+
request_timeout_ms,
|
|
3207
|
+
query_cache_policy,
|
|
3208
|
+
query_cache_ttl_ms,
|
|
3209
|
+
dedupe_in_flight,
|
|
3210
|
+
)
|
|
3211
|
+
)
|
|
3212
|
+
|
|
3213
|
+
|
|
3214
|
+
def _adapter_from_api_public_config_payload(
|
|
3215
|
+
*,
|
|
3216
|
+
public_config: dict[str, Any] | None = None,
|
|
3217
|
+
api_base_url: str | None = None,
|
|
3218
|
+
debug_api_base_url: str | None = None,
|
|
3219
|
+
existing_public_config: dict[str, Any] | None = None,
|
|
3220
|
+
config_values: dict[str, Any] | None = None,
|
|
3221
|
+
compiled_contract: dict[str, Any] | None = None,
|
|
3222
|
+
contract_version: str | None = None,
|
|
3223
|
+
request_timeout_ms: int | None = None,
|
|
3224
|
+
query_cache_policy: str | None = None,
|
|
3225
|
+
query_cache_ttl_ms: int | None = None,
|
|
3226
|
+
dedupe_in_flight: bool | None = None,
|
|
3227
|
+
) -> dict[str, Any]:
|
|
3228
|
+
public_config_model = _adapter_from_api_public_config_model()
|
|
3229
|
+
normalized_api_base_url = api_base_url.strip() if isinstance(api_base_url, str) else api_base_url
|
|
3230
|
+
normalized_debug_api_base_url = (
|
|
3231
|
+
debug_api_base_url.strip()
|
|
3232
|
+
if isinstance(debug_api_base_url, str)
|
|
3233
|
+
else debug_api_base_url
|
|
3234
|
+
)
|
|
3235
|
+
normalized_api_base_url = normalized_api_base_url or None
|
|
3236
|
+
normalized_debug_api_base_url = normalized_debug_api_base_url or None
|
|
3237
|
+
|
|
3238
|
+
source_count = sum(
|
|
3239
|
+
value is not None
|
|
3240
|
+
for value in (public_config, normalized_api_base_url, normalized_debug_api_base_url)
|
|
3241
|
+
)
|
|
3242
|
+
if source_count > 1:
|
|
3243
|
+
raise ApiError(
|
|
3244
|
+
"Provide only one public config source: public_config, api_base_url, "
|
|
3245
|
+
"or debug_api_base_url."
|
|
3246
|
+
)
|
|
3247
|
+
|
|
3248
|
+
optional_kwargs: dict[str, Any] = {}
|
|
3249
|
+
if config_values is not None:
|
|
3250
|
+
optional_kwargs["config_values"] = dict(config_values)
|
|
3251
|
+
if compiled_contract is not None:
|
|
3252
|
+
optional_kwargs["compiled_contract"] = dict(compiled_contract)
|
|
3253
|
+
if contract_version is not None:
|
|
3254
|
+
optional_kwargs["contract_version"] = contract_version
|
|
3255
|
+
if request_timeout_ms is not None:
|
|
3256
|
+
optional_kwargs["request_timeout_ms"] = request_timeout_ms
|
|
3257
|
+
if query_cache_policy is not None:
|
|
3258
|
+
optional_kwargs["query_cache_policy"] = query_cache_policy
|
|
3259
|
+
if query_cache_ttl_ms is not None:
|
|
3260
|
+
optional_kwargs["query_cache_ttl_ms"] = query_cache_ttl_ms
|
|
3261
|
+
if dedupe_in_flight is not None:
|
|
3262
|
+
optional_kwargs["dedupe_in_flight"] = dedupe_in_flight
|
|
3263
|
+
|
|
3264
|
+
alias_updates = {
|
|
3265
|
+
"configValues": config_values,
|
|
3266
|
+
"compiledContract": compiled_contract,
|
|
3267
|
+
"contractVersion": contract_version,
|
|
3268
|
+
"requestTimeoutMs": request_timeout_ms,
|
|
3269
|
+
"queryCachePolicy": query_cache_policy,
|
|
3270
|
+
"queryCacheTtlMs": query_cache_ttl_ms,
|
|
3271
|
+
"dedupeInFlight": dedupe_in_flight,
|
|
3272
|
+
}
|
|
3273
|
+
|
|
3274
|
+
try:
|
|
3275
|
+
if public_config is not None:
|
|
3276
|
+
payload = dict(public_config)
|
|
3277
|
+
payload.update({key: value for key, value in alias_updates.items() if value is not None})
|
|
3278
|
+
config = public_config_model.model_validate(payload)
|
|
3279
|
+
elif normalized_debug_api_base_url is not None:
|
|
3280
|
+
config = public_config_model.direct(
|
|
3281
|
+
debug_api_base_url=normalized_debug_api_base_url,
|
|
3282
|
+
**optional_kwargs,
|
|
3283
|
+
)
|
|
3284
|
+
elif normalized_api_base_url is not None:
|
|
3285
|
+
config = public_config_model.backend(
|
|
3286
|
+
api_base_url=normalized_api_base_url,
|
|
3287
|
+
**optional_kwargs,
|
|
3288
|
+
)
|
|
3289
|
+
else:
|
|
3290
|
+
payload = dict(existing_public_config or {})
|
|
3291
|
+
if not payload:
|
|
3292
|
+
raise ApiError(
|
|
3293
|
+
"Adapter from API public config is required. Provide api_base_url, "
|
|
3294
|
+
"debug_api_base_url, or public_config."
|
|
3295
|
+
)
|
|
3296
|
+
payload.update({key: value for key, value in alias_updates.items() if value is not None})
|
|
3297
|
+
config = public_config_model.model_validate(payload)
|
|
3298
|
+
except ApiError:
|
|
3299
|
+
raise
|
|
3300
|
+
except Exception as e:
|
|
3301
|
+
raise ApiError(f"Adapter from API public config is invalid: {e}") from e
|
|
3302
|
+
|
|
3303
|
+
return config.to_public_config()
|
|
3304
|
+
|
|
3305
|
+
|
|
3306
|
+
def create_adapter_from_api_connection(
|
|
3307
|
+
*,
|
|
3308
|
+
name: str,
|
|
3309
|
+
description: str = "",
|
|
3310
|
+
public_config: dict[str, Any] | None = None,
|
|
3311
|
+
api_base_url: str | None = None,
|
|
3312
|
+
debug_api_base_url: str | None = None,
|
|
3313
|
+
secure_config: dict[str, Any] | None = None,
|
|
3314
|
+
workspace_uid: str | None = None,
|
|
3315
|
+
is_default: bool | None = None,
|
|
3316
|
+
tags: list[str] | None = None,
|
|
3317
|
+
config_values: dict[str, Any] | None = None,
|
|
3318
|
+
compiled_contract: dict[str, Any] | None = None,
|
|
3319
|
+
contract_version: str | None = None,
|
|
3320
|
+
request_timeout_ms: int | None = None,
|
|
3321
|
+
query_cache_policy: str | None = None,
|
|
3322
|
+
query_cache_ttl_ms: int | None = None,
|
|
3323
|
+
dedupe_in_flight: bool | None = None,
|
|
3324
|
+
timeout: int | None = None,
|
|
3325
|
+
) -> dict[str, Any]:
|
|
3326
|
+
"""
|
|
3327
|
+
Create one command_center.adapter_from_api connection through the SDK client model.
|
|
3328
|
+
"""
|
|
3329
|
+
public_config_payload = _adapter_from_api_public_config_payload(
|
|
3330
|
+
public_config=public_config,
|
|
3331
|
+
api_base_url=api_base_url,
|
|
3332
|
+
debug_api_base_url=debug_api_base_url,
|
|
3333
|
+
config_values=config_values,
|
|
3334
|
+
compiled_contract=compiled_contract,
|
|
3335
|
+
contract_version=contract_version,
|
|
3336
|
+
request_timeout_ms=request_timeout_ms,
|
|
3337
|
+
query_cache_policy=query_cache_policy,
|
|
3338
|
+
query_cache_ttl_ms=query_cache_ttl_ms,
|
|
3339
|
+
dedupe_in_flight=dedupe_in_flight,
|
|
3340
|
+
)
|
|
3341
|
+
|
|
3342
|
+
try:
|
|
3343
|
+
connection = _run_sdk_model_operation(
|
|
3344
|
+
module_name="mainsequence.client.command_center.connections",
|
|
3345
|
+
class_name="ConnectionInstance",
|
|
3346
|
+
operation=lambda ClientConnectionInstance: ClientConnectionInstance.create_adapter_from_api(
|
|
3347
|
+
name=name,
|
|
3348
|
+
description=description,
|
|
3349
|
+
public_config=public_config_payload,
|
|
3350
|
+
secure_config=secure_config,
|
|
3351
|
+
workspace_uid=workspace_uid,
|
|
3352
|
+
is_default=is_default,
|
|
3353
|
+
tags=tags,
|
|
3354
|
+
timeout=timeout,
|
|
3355
|
+
),
|
|
3356
|
+
)
|
|
3357
|
+
return _sdk_object_to_dict(connection)
|
|
3358
|
+
except Exception as e:
|
|
3359
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
3360
|
+
raise
|
|
3361
|
+
raise ApiError(f"Adapter from API connection creation failed: {e}") from e
|
|
3362
|
+
|
|
3363
|
+
|
|
3364
|
+
def patch_adapter_from_api_connection(
|
|
3365
|
+
connection_uid: str,
|
|
3366
|
+
*,
|
|
3367
|
+
name: str | None = None,
|
|
3368
|
+
description: str | None = None,
|
|
3369
|
+
public_config: dict[str, Any] | None = None,
|
|
3370
|
+
api_base_url: str | None = None,
|
|
3371
|
+
debug_api_base_url: str | None = None,
|
|
3372
|
+
secure_config: dict[str, Any] | None = None,
|
|
3373
|
+
workspace_uid: str | None = None,
|
|
3374
|
+
is_default: bool | None = None,
|
|
3375
|
+
tags: list[str] | None = None,
|
|
3376
|
+
config_values: dict[str, Any] | None = None,
|
|
3377
|
+
compiled_contract: dict[str, Any] | None = None,
|
|
3378
|
+
contract_version: str | None = None,
|
|
3379
|
+
request_timeout_ms: int | None = None,
|
|
3380
|
+
query_cache_policy: str | None = None,
|
|
3381
|
+
query_cache_ttl_ms: int | None = None,
|
|
3382
|
+
dedupe_in_flight: bool | None = None,
|
|
3383
|
+
timeout: int | None = None,
|
|
3384
|
+
) -> dict[str, Any]:
|
|
3385
|
+
"""
|
|
3386
|
+
Patch one command_center.adapter_from_api connection through the SDK client model.
|
|
3387
|
+
"""
|
|
3388
|
+
patch_kwargs: dict[str, Any] = {}
|
|
3389
|
+
if name is not None:
|
|
3390
|
+
patch_kwargs["name"] = name
|
|
3391
|
+
if description is not None:
|
|
3392
|
+
patch_kwargs["description"] = description
|
|
3393
|
+
if secure_config is not None:
|
|
3394
|
+
patch_kwargs["secureConfig"] = secure_config
|
|
3395
|
+
if workspace_uid is not None:
|
|
3396
|
+
patch_kwargs["workspaceUid"] = workspace_uid
|
|
3397
|
+
if is_default is not None:
|
|
3398
|
+
patch_kwargs["isDefault"] = is_default
|
|
3399
|
+
if tags is not None:
|
|
3400
|
+
patch_kwargs["tags"] = list(tags)
|
|
3401
|
+
|
|
3402
|
+
public_config_requested = _adapter_from_api_public_config_requested(
|
|
3403
|
+
public_config=public_config,
|
|
3404
|
+
api_base_url=api_base_url,
|
|
3405
|
+
debug_api_base_url=debug_api_base_url,
|
|
3406
|
+
config_values=config_values,
|
|
3407
|
+
compiled_contract=compiled_contract,
|
|
3408
|
+
contract_version=contract_version,
|
|
3409
|
+
request_timeout_ms=request_timeout_ms,
|
|
3410
|
+
query_cache_policy=query_cache_policy,
|
|
3411
|
+
query_cache_ttl_ms=query_cache_ttl_ms,
|
|
3412
|
+
dedupe_in_flight=dedupe_in_flight,
|
|
3413
|
+
)
|
|
3414
|
+
if not patch_kwargs and not public_config_requested:
|
|
3415
|
+
raise ApiError("Adapter from API connection patch payload is empty.")
|
|
3416
|
+
|
|
3417
|
+
try:
|
|
3418
|
+
|
|
3419
|
+
def _patch(ClientConnectionInstance):
|
|
3420
|
+
connection = ClientConnectionInstance.get_adapter_from_api(
|
|
3421
|
+
uid=str(connection_uid),
|
|
3422
|
+
timeout=timeout,
|
|
3423
|
+
)
|
|
3424
|
+
resolved_patch_kwargs = dict(patch_kwargs)
|
|
3425
|
+
if public_config_requested:
|
|
3426
|
+
resolved_patch_kwargs["publicConfig"] = _adapter_from_api_public_config_payload(
|
|
3427
|
+
public_config=public_config,
|
|
3428
|
+
api_base_url=api_base_url,
|
|
3429
|
+
debug_api_base_url=debug_api_base_url,
|
|
3430
|
+
existing_public_config=getattr(connection, "public_config", None),
|
|
3431
|
+
config_values=config_values,
|
|
3432
|
+
compiled_contract=compiled_contract,
|
|
3433
|
+
contract_version=contract_version,
|
|
3434
|
+
request_timeout_ms=request_timeout_ms,
|
|
3435
|
+
query_cache_policy=query_cache_policy,
|
|
3436
|
+
query_cache_ttl_ms=query_cache_ttl_ms,
|
|
3437
|
+
dedupe_in_flight=dedupe_in_flight,
|
|
3438
|
+
)
|
|
3439
|
+
return connection.patch(**resolved_patch_kwargs)
|
|
3440
|
+
|
|
3441
|
+
connection = _run_sdk_model_operation(
|
|
3442
|
+
module_name="mainsequence.client.command_center.connections",
|
|
3443
|
+
class_name="ConnectionInstance",
|
|
3444
|
+
operation=_patch,
|
|
3445
|
+
)
|
|
3446
|
+
return _sdk_object_to_dict(connection)
|
|
3447
|
+
except Exception as e:
|
|
3448
|
+
err_name = type(e).__name__
|
|
3449
|
+
if err_name == "NotFoundError":
|
|
3450
|
+
raise ApiError(f"Connection not found: {connection_uid}") from e
|
|
3451
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
3452
|
+
raise
|
|
3453
|
+
raise ApiError(f"Adapter from API connection patch failed: {e}") from e
|
|
3454
|
+
|
|
3455
|
+
|
|
3179
3456
|
def _serialize_sdk_search_response(payload: Any) -> dict[str, Any] | list[dict[str, Any]]:
|
|
3180
3457
|
if isinstance(payload, list):
|
|
3181
3458
|
return [_sdk_object_to_dict(item) for item in payload]
|