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.
Files changed (141) hide show
  1. {mainsequence-4.4.5/mainsequence.egg-info → mainsequence-4.4.8}/PKG-INFO +1 -1
  2. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/AGENTS.md +7 -1
  3. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +67 -1
  4. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/api.py +279 -2
  5. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/cli.py +585 -31
  6. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/agent_runtime_models.py +3 -3
  7. mainsequence-4.4.8/mainsequence/client/command_center/connections.py +680 -0
  8. mainsequence-4.4.8/mainsequence/scaffold_skills.py +260 -0
  9. {mainsequence-4.4.5 → mainsequence-4.4.8/mainsequence.egg-info}/PKG-INFO +1 -1
  10. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/SOURCES.txt +2 -0
  11. {mainsequence-4.4.5 → mainsequence-4.4.8}/pyproject.toml +1 -1
  12. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_cli.py +284 -1
  13. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_command_center_models.py +201 -0
  14. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_filter_normalization.py +12 -14
  15. mainsequence-4.4.8/tests/test_scaffold_skills.py +179 -0
  16. mainsequence-4.4.5/mainsequence/client/command_center/connections.py +0 -274
  17. {mainsequence-4.4.5 → mainsequence-4.4.8}/LICENSE +0 -0
  18. {mainsequence-4.4.5 → mainsequence-4.4.8}/README.md +0 -0
  19. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  20. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  21. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  22. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  23. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  24. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  25. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  26. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  27. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  28. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  29. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  30. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  31. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  32. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  33. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  34. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  35. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  36. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  37. {mainsequence-4.4.5 → mainsequence-4.4.8}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  38. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/__init__.py +0 -0
  39. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/__main__.py +0 -0
  40. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/bootstrap.py +0 -0
  41. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/__init__.py +0 -0
  42. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/browser_auth.py +0 -0
  43. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/config.py +0 -0
  44. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/docker_utils.py +0 -0
  45. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/doctor.py +0 -0
  46. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/local_ops.py +0 -0
  47. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/migrations.py +0 -0
  48. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/model_filters.py +0 -0
  49. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/project_status.py +0 -0
  50. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/pydantic_cli.py +0 -0
  51. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/sdk_utils.py +0 -0
  52. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/ssh_utils.py +0 -0
  53. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/cli/ui.py +0 -0
  54. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/__init__.py +0 -0
  55. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/base.py +0 -0
  56. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/client.py +0 -0
  57. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/__init__.py +0 -0
  58. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/app_component.py +0 -0
  59. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/data_models.py +0 -0
  60. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/workspace.py +0 -0
  61. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  62. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/compute_validation.py +0 -0
  63. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  64. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  65. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  66. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  67. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/dtype_codec.py +0 -0
  68. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/exceptions.py +0 -0
  69. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/fastapi/__init__.py +0 -0
  70. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/fastapi/auth.py +0 -0
  71. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/metatables/__init__.py +0 -0
  72. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/metatables/core.py +0 -0
  73. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/models_foundry.py +0 -0
  74. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/models_helpers.py +0 -0
  75. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/models_user.py +0 -0
  76. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/client/utils.py +0 -0
  77. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/defaults.py +0 -0
  78. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/instrumentation/__init__.py +0 -0
  79. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/instrumentation/utils.py +0 -0
  80. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/logconf.py +0 -0
  81. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/__init__.py +0 -0
  82. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/__main__.py +0 -0
  83. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  84. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  85. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  86. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  87. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  88. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  89. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  90. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  91. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  92. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  93. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/future_registry.py +0 -0
  94. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/hashing.py +0 -0
  95. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  96. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  97. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/env.py +0 -0
  98. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/provider.py +0 -0
  99. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/registry.py +0 -0
  100. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  101. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  102. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  103. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  104. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  105. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/schema_names.py +0 -0
  106. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  107. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence/runtime_flags.py +0 -0
  108. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/dependency_links.txt +0 -0
  109. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/entry_points.txt +0 -0
  110. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/requires.txt +0 -0
  111. {mainsequence-4.4.5 → mainsequence-4.4.8}/mainsequence.egg-info/top_level.txt +0 -0
  112. {mainsequence-4.4.5 → mainsequence-4.4.8}/setup.cfg +0 -0
  113. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_auth_precedence.py +0 -0
  114. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_build_operations_hashing.py +0 -0
  115. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_cli_browser_auth.py +0 -0
  116. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_cli_migrations.py +0 -0
  117. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_client.py +0 -0
  118. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_command_center_app_component_models.py +0 -0
  119. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_command_center_data_models.py +0 -0
  120. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  121. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_data_node_storage_dimension_queries.py +0 -0
  122. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_data_node_update_flow.py +0 -0
  123. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_dependency_extras.py +0 -0
  124. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_duckdb_interface_dimensions.py +0 -0
  125. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_instrumentation.py +0 -0
  126. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_logconf.py +0 -0
  127. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_meta_table_migrations.py +0 -0
  128. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_meta_tables_client_models.py +0 -0
  129. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  130. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_models_user_request_bound_auth.py +0 -0
  131. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_pod_project_resolution.py +0 -0
  132. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_project_batch_jobs_from_file.py +0 -0
  133. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_run_configuration.py +0 -0
  134. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_schema_names.py +0 -0
  135. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_secret_client_model.py +0 -0
  136. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_source_table_configuration.py +0 -0
  137. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_sqlite_interface_dimensions.py +0 -0
  138. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_update_runner_uid_runtime.py +0 -0
  139. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_update_statistics.py +0 -0
  140. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_update_uid_guards.py +0 -0
  141. {mainsequence-4.4.5 → mainsequence-4.4.8}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.5
3
+ Version: 4.4.8
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -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. Verify platform state with the CLI or platform tooling instead of guessing.
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 instance creation
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]