mainsequence 4.4.23__tar.gz → 4.4.25__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.23 → mainsequence-4.4.25}/PKG-INFO +1 -1
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/a2a_communication/SKILL.md +46 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/api.py +4 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/cli.py +29 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/agent_runtime_models.py +52 -2
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/table_visuals.py +3 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence.egg-info/PKG-INFO +1 -1
- {mainsequence-4.4.23 → mainsequence-4.4.25}/pyproject.toml +1 -1
- {mainsequence-4.4.23 → mainsequence-4.4.25}/LICENSE +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/README.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/__main__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/config.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/base.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/client.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/tabular.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/ui.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/providers/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/bindings.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/registry.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/table.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/workspaces/documents.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/defaults.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/logconf.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/setup.cfg +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_cli.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_cli_migrations.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_client.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_command_center_models.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_command_center_table_contracts.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_command_center_tabular_transform.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_filter_normalization.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_instrumentation.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_logconf.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_run_configuration.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_schema_names.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_workspace_snapshot.py +0 -0
{mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/a2a_communication/SKILL.md
RENAMED
|
@@ -139,6 +139,33 @@ mainsequence agent session a2a send \
|
|
|
139
139
|
--strict-dictionary
|
|
140
140
|
```
|
|
141
141
|
|
|
142
|
+
## Send Files
|
|
143
|
+
|
|
144
|
+
A2A can send inline files as raw parts. For PDFs, use `--file`; the CLI reads
|
|
145
|
+
the file bytes, enforces the 15 MiB inline limit, base64 encodes the bytes, and
|
|
146
|
+
sends the part with `filename` and `mediaType`.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
mainsequence agent session a2a send \
|
|
150
|
+
<target_agent_session_uid> \
|
|
151
|
+
--message "Please summarize this PDF." \
|
|
152
|
+
--file report.pdf \
|
|
153
|
+
--media-type application/pdf
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The same handle shortcut works with files:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
mainsequence agent session a2a send \
|
|
160
|
+
portfolios \
|
|
161
|
+
--message "Please summarize this PDF." \
|
|
162
|
+
--file report.pdf \
|
|
163
|
+
--media-type application/pdf
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For retries of the exact same message and file attachment, reuse the same
|
|
167
|
+
`--message-id`.
|
|
168
|
+
|
|
142
169
|
## Python Usage
|
|
143
170
|
|
|
144
171
|
In Python, use the backend handle to get or create the target session, then
|
|
@@ -178,6 +205,23 @@ response = AgentSession.send_a2a_message(
|
|
|
178
205
|
)
|
|
179
206
|
```
|
|
180
207
|
|
|
208
|
+
To send a PDF, pass a file attachment. The SDK reads the raw bytes, enforces the
|
|
209
|
+
15 MiB inline limit, base64 encodes them, and sends `filename` plus `mediaType`:
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
response = AgentSession.send_a2a_message(
|
|
213
|
+
session.uid,
|
|
214
|
+
message="Please summarize this PDF.",
|
|
215
|
+
files=[
|
|
216
|
+
{
|
|
217
|
+
"path": "report.pdf",
|
|
218
|
+
"media_type": "application/pdf",
|
|
219
|
+
"filename": "report.pdf",
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
)
|
|
223
|
+
```
|
|
224
|
+
|
|
181
225
|
Reusable helper:
|
|
182
226
|
|
|
183
227
|
```python
|
|
@@ -190,6 +234,7 @@ def send_to_agent_handle(
|
|
|
190
234
|
message: str,
|
|
191
235
|
*,
|
|
192
236
|
name: str | None = None,
|
|
237
|
+
files: list[dict[str, str]] | None = None,
|
|
193
238
|
strict_dictionary: bool = False,
|
|
194
239
|
):
|
|
195
240
|
agent = Agent.get_by_uid(target_agent_uid)
|
|
@@ -201,6 +246,7 @@ def send_to_agent_handle(
|
|
|
201
246
|
return AgentSession.send_a2a_message(
|
|
202
247
|
session.uid, # The SDK sends this as A2A message.contextId.
|
|
203
248
|
message=message,
|
|
249
|
+
files=files,
|
|
204
250
|
strict_dictionary=strict_dictionary,
|
|
205
251
|
)
|
|
206
252
|
```
|
|
@@ -1244,6 +1244,7 @@ def send_agent_session_a2a_message(
|
|
|
1244
1244
|
agent_session_uid: str,
|
|
1245
1245
|
*,
|
|
1246
1246
|
message: str,
|
|
1247
|
+
files: list[dict[str, Any]] | None = None,
|
|
1247
1248
|
message_id: str | None = None,
|
|
1248
1249
|
strict_dictionary: bool = False,
|
|
1249
1250
|
json_repair_attempts: int = 3,
|
|
@@ -1262,6 +1263,7 @@ def send_agent_session_a2a_message(
|
|
|
1262
1263
|
ClientAgentSession,
|
|
1263
1264
|
agent_session_uid=str(agent_session_uid),
|
|
1264
1265
|
message=message,
|
|
1266
|
+
files=files,
|
|
1265
1267
|
message_id=message_id,
|
|
1266
1268
|
cached_runtime_access=cached_runtime_access,
|
|
1267
1269
|
strict_dictionary=strict_dictionary,
|
|
@@ -1287,6 +1289,7 @@ def _send_agent_session_a2a_message_with_cache(
|
|
|
1287
1289
|
*,
|
|
1288
1290
|
agent_session_uid: str,
|
|
1289
1291
|
message: str,
|
|
1292
|
+
files: list[dict[str, Any]] | None,
|
|
1290
1293
|
message_id: str | None,
|
|
1291
1294
|
cached_runtime_access: dict[str, Any] | None,
|
|
1292
1295
|
strict_dictionary: bool,
|
|
@@ -1300,6 +1303,7 @@ def _send_agent_session_a2a_message_with_cache(
|
|
|
1300
1303
|
payload = ClientAgentSession.send_a2a_message(
|
|
1301
1304
|
agent_session_uid,
|
|
1302
1305
|
message=message,
|
|
1306
|
+
files=files,
|
|
1303
1307
|
message_id=message_id,
|
|
1304
1308
|
strict_dictionary=strict_dictionary,
|
|
1305
1309
|
json_repair_attempts=json_repair_attempts,
|
|
@@ -3898,6 +3898,8 @@ def _agent_session_a2a_send_impl(
|
|
|
3898
3898
|
parent_session_uid: str | None,
|
|
3899
3899
|
message: str | None,
|
|
3900
3900
|
message_file: pathlib.Path | None,
|
|
3901
|
+
files: list[pathlib.Path] | None,
|
|
3902
|
+
media_types: list[str] | None,
|
|
3901
3903
|
strict_dictionary: bool,
|
|
3902
3904
|
json_repair_attempts: int,
|
|
3903
3905
|
message_id: str | None,
|
|
@@ -3919,6 +3921,20 @@ def _agent_session_a2a_send_impl(
|
|
|
3919
3921
|
if json_repair_attempts < 1:
|
|
3920
3922
|
error("--json-repair-attempts must be greater than 0.")
|
|
3921
3923
|
raise typer.Exit(1)
|
|
3924
|
+
attachment_paths = list(files or [])
|
|
3925
|
+
attachment_media_types = list(media_types or [])
|
|
3926
|
+
if attachment_media_types and len(attachment_media_types) != len(attachment_paths):
|
|
3927
|
+
error("--media-type must be provided once per --file when used.")
|
|
3928
|
+
raise typer.Exit(1)
|
|
3929
|
+
attachments = [
|
|
3930
|
+
{
|
|
3931
|
+
"path": str(path),
|
|
3932
|
+
"media_type": attachment_media_types[index]
|
|
3933
|
+
if attachment_media_types
|
|
3934
|
+
else "application/pdf",
|
|
3935
|
+
}
|
|
3936
|
+
for index, path in enumerate(attachment_paths)
|
|
3937
|
+
]
|
|
3922
3938
|
effective_message_id = str(message_id).strip() if message_id is not None else ""
|
|
3923
3939
|
if not effective_message_id:
|
|
3924
3940
|
effective_message_id = f"msg-{uuid.uuid4()}"
|
|
@@ -3936,6 +3952,7 @@ def _agent_session_a2a_send_impl(
|
|
|
3936
3952
|
response_payload = send_agent_session_a2a_message(
|
|
3937
3953
|
agent_session_uid,
|
|
3938
3954
|
message=resolved_message,
|
|
3955
|
+
files=attachments,
|
|
3939
3956
|
message_id=effective_message_id,
|
|
3940
3957
|
strict_dictionary=strict_dictionary,
|
|
3941
3958
|
json_repair_attempts=json_repair_attempts,
|
|
@@ -6779,6 +6796,16 @@ def agent_session_a2a_send_cmd(
|
|
|
6779
6796
|
"--message-file",
|
|
6780
6797
|
help="Path to a UTF-8 text file containing the A2A message.",
|
|
6781
6798
|
),
|
|
6799
|
+
files: list[pathlib.Path] | None = typer.Option(
|
|
6800
|
+
None,
|
|
6801
|
+
"--file",
|
|
6802
|
+
help="Inline file attachment to send as an A2A raw part.",
|
|
6803
|
+
),
|
|
6804
|
+
media_types: list[str] | None = typer.Option(
|
|
6805
|
+
None,
|
|
6806
|
+
"--media-type",
|
|
6807
|
+
help="Media type for each --file. Defaults to application/pdf.",
|
|
6808
|
+
),
|
|
6782
6809
|
strict_dictionary: bool = typer.Option(
|
|
6783
6810
|
False,
|
|
6784
6811
|
"--strict-dictionary",
|
|
@@ -6811,6 +6838,8 @@ def agent_session_a2a_send_cmd(
|
|
|
6811
6838
|
parent_session_uid=parent_session_uid,
|
|
6812
6839
|
message=message,
|
|
6813
6840
|
message_file=message_file,
|
|
6841
|
+
files=files,
|
|
6842
|
+
media_types=media_types,
|
|
6814
6843
|
strict_dictionary=strict_dictionary,
|
|
6815
6844
|
json_repair_attempts=json_repair_attempts,
|
|
6816
6845
|
message_id=message_id,
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import base64
|
|
3
4
|
import datetime
|
|
4
5
|
import json
|
|
6
|
+
import pathlib
|
|
5
7
|
import time
|
|
6
8
|
import uuid
|
|
7
9
|
from enum import Enum
|
|
@@ -14,7 +16,7 @@ from .base import BaseObjectOrm, BasePydanticModel, ShareableObjectMixin
|
|
|
14
16
|
from .exceptions import ApiError, raise_for_response
|
|
15
17
|
from .utils import make_request, serialize_to_json
|
|
16
18
|
|
|
17
|
-
DEFAULT_AGENT_SESSION_LONG_REQUEST_TIMEOUT = (5.0,
|
|
19
|
+
DEFAULT_AGENT_SESSION_LONG_REQUEST_TIMEOUT = (5.0, 900.0)
|
|
18
20
|
DEFAULT_AGENT_RUNTIME_ACCESS_CACHE_TTL_SECONDS = 60.0
|
|
19
21
|
DEFAULT_AGENT_RUNTIME_ACCESS_CACHE_EXPIRY_SKEW_SECONDS = 30.0
|
|
20
22
|
STANDARD_A2A_MESSAGE_SEND_PATH = "/api/a2a/v1/message:send"
|
|
@@ -22,6 +24,7 @@ STANDARD_A2A_CONTENT_TYPE = "application/a2a+json"
|
|
|
22
24
|
STANDARD_A2A_OUTPUT_CONTRACT_METADATA_KEY = (
|
|
23
25
|
"https://mainsequence.ai/a2a/extensions/output-contract/v1"
|
|
24
26
|
)
|
|
27
|
+
MAX_INLINE_A2A_FILE_BYTES = 15 * 1024 * 1024
|
|
25
28
|
|
|
26
29
|
|
|
27
30
|
class AgentSessionStatus(str, Enum):
|
|
@@ -712,6 +715,7 @@ class AgentSession(BaseObjectOrm, BasePydanticModel):
|
|
|
712
715
|
*,
|
|
713
716
|
agent_session_uid: str,
|
|
714
717
|
message: str,
|
|
718
|
+
files: list[Any] | None = None,
|
|
715
719
|
message_id: str | None = None,
|
|
716
720
|
strict_dictionary: bool = False,
|
|
717
721
|
json_repair_attempts: int = 3,
|
|
@@ -727,12 +731,16 @@ class AgentSession(BaseObjectOrm, BasePydanticModel):
|
|
|
727
731
|
normalized_message_id = f"msg-{uuid.uuid4()}"
|
|
728
732
|
|
|
729
733
|
accepted_output_modes = ["application/json"] if strict_dictionary else ["text/plain"]
|
|
734
|
+
parts: list[dict[str, Any]] = [{"text": normalized_message}]
|
|
735
|
+
for file_spec in files or []:
|
|
736
|
+
parts.append(AgentSession._build_standard_a2a_raw_file_part(file_spec))
|
|
737
|
+
|
|
730
738
|
body: dict[str, Any] = {
|
|
731
739
|
"message": {
|
|
732
740
|
"messageId": normalized_message_id,
|
|
733
741
|
"role": "ROLE_USER",
|
|
734
742
|
"contextId": agent_session_uid,
|
|
735
|
-
"parts":
|
|
743
|
+
"parts": parts,
|
|
736
744
|
},
|
|
737
745
|
"configuration": {
|
|
738
746
|
"acceptedOutputModes": accepted_output_modes,
|
|
@@ -751,6 +759,46 @@ class AgentSession(BaseObjectOrm, BasePydanticModel):
|
|
|
751
759
|
}
|
|
752
760
|
return body
|
|
753
761
|
|
|
762
|
+
@staticmethod
|
|
763
|
+
def _build_standard_a2a_raw_file_part(file_spec: Any) -> dict[str, Any]:
|
|
764
|
+
if isinstance(file_spec, (str, pathlib.Path)):
|
|
765
|
+
path = pathlib.Path(file_spec).expanduser()
|
|
766
|
+
media_type = "application/pdf" if path.suffix.lower() == ".pdf" else ""
|
|
767
|
+
filename = path.name
|
|
768
|
+
elif isinstance(file_spec, dict):
|
|
769
|
+
raw_path = file_spec.get("path")
|
|
770
|
+
if raw_path is None:
|
|
771
|
+
raise ValueError("A2A file attachment requires a path")
|
|
772
|
+
path = pathlib.Path(str(raw_path)).expanduser()
|
|
773
|
+
media_type = str(
|
|
774
|
+
file_spec.get("media_type") or file_spec.get("mediaType") or ""
|
|
775
|
+
).strip()
|
|
776
|
+
if not media_type and path.suffix.lower() == ".pdf":
|
|
777
|
+
media_type = "application/pdf"
|
|
778
|
+
filename = str(file_spec.get("filename") or path.name).strip()
|
|
779
|
+
else:
|
|
780
|
+
raise TypeError("A2A file attachment must be a path or dict")
|
|
781
|
+
|
|
782
|
+
if not media_type:
|
|
783
|
+
raise ValueError(f"A2A file attachment '{path}' requires media_type")
|
|
784
|
+
if not filename:
|
|
785
|
+
raise ValueError(f"A2A file attachment '{path}' requires filename")
|
|
786
|
+
|
|
787
|
+
file_bytes = path.read_bytes()
|
|
788
|
+
if len(file_bytes) > MAX_INLINE_A2A_FILE_BYTES:
|
|
789
|
+
size_mib = len(file_bytes) / (1024 * 1024)
|
|
790
|
+
limit_mib = MAX_INLINE_A2A_FILE_BYTES / (1024 * 1024)
|
|
791
|
+
raise ValueError(
|
|
792
|
+
f"A2A attachment '{filename}' is {size_mib:.1f} MiB; "
|
|
793
|
+
f"inline attachments are limited to {limit_mib:.0f} MiB."
|
|
794
|
+
)
|
|
795
|
+
|
|
796
|
+
return {
|
|
797
|
+
"raw": base64.b64encode(file_bytes).decode("ascii"),
|
|
798
|
+
"filename": filename,
|
|
799
|
+
"mediaType": media_type,
|
|
800
|
+
}
|
|
801
|
+
|
|
754
802
|
@classmethod
|
|
755
803
|
def _post_standard_a2a_message(
|
|
756
804
|
cls,
|
|
@@ -793,6 +841,7 @@ class AgentSession(BaseObjectOrm, BasePydanticModel):
|
|
|
793
841
|
agent_session: str | AgentSession,
|
|
794
842
|
*,
|
|
795
843
|
message: str,
|
|
844
|
+
files: list[Any] | None = None,
|
|
796
845
|
message_id: str | None = None,
|
|
797
846
|
strict_dictionary: bool = False,
|
|
798
847
|
json_repair_attempts: int = 3,
|
|
@@ -806,6 +855,7 @@ class AgentSession(BaseObjectOrm, BasePydanticModel):
|
|
|
806
855
|
body = cls._build_standard_a2a_message_send_body(
|
|
807
856
|
agent_session_uid=session_uid,
|
|
808
857
|
message=message,
|
|
858
|
+
files=files,
|
|
809
859
|
message_id=message_id,
|
|
810
860
|
strict_dictionary=strict_dictionary,
|
|
811
861
|
json_repair_attempts=json_repair_attempts,
|
|
@@ -42,6 +42,7 @@ TableFrameVisualColumnFormat = Literal[
|
|
|
42
42
|
"percent",
|
|
43
43
|
"volume",
|
|
44
44
|
"currency",
|
|
45
|
+
"datetime",
|
|
45
46
|
"formula",
|
|
46
47
|
]
|
|
47
48
|
TableFrameVisualColumnKind = Literal["sparkline", "bar", "heatmap"]
|
|
@@ -85,6 +86,8 @@ class TableFrameVisualColumnMetadata(ContractBaseModel):
|
|
|
85
86
|
default=None,
|
|
86
87
|
alias="formulaResultFormat",
|
|
87
88
|
)
|
|
89
|
+
date_time_input_format: str | None = Field(default=None, alias="dateTimeInputFormat")
|
|
90
|
+
date_time_output_format: str | None = Field(default=None, alias="dateTimeOutputFormat")
|
|
88
91
|
decimals: int | None = None
|
|
89
92
|
visible: bool | None = None
|
|
90
93
|
color_scale: TableFrameColorScaleMetadata | None = Field(default=None, alias="colorScale")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/dashboards/streamlit/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/app_component.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/connections.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/tabular.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/contracts/ui.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/data_models.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/providers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/__init__.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/bindings.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/registry.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/widgets/table.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/command_center/workspace_snapshot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/__init__.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/duckdb.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/client/data_sources_interfaces/sqlite.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/compiled_sql/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/build_operations.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/data_nodes.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/namespacing.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/persist_managers.py
RENAMED
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/data_nodes/run_operations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/mainsequence/meta_tables/sqlalchemy_contracts.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_command_center_app_component_models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-4.4.23 → mainsequence-4.4.25}/tests/test_data_node_storage_dimension_queries.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|