meshagent-cli 0.46.4__tar.gz → 0.47.0__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.
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/PKG-INFO +17 -17
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent_package_cli.py +2 -34
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent_package_cli_test.py +4 -4
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agents.py +41 -3
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agents_test.py +86 -7
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/ask.py +17 -1
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/ask_test.py +116 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/cli.py +4 -1
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create.py +149 -2
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/channel.py +1517 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +563 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +659 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/server.py +119 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +1845 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +597 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +316 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/server.py +88 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +1411 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/twilio-channel/server.py +118 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +2700 -0
- meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +104 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_test.py +1637 -1
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/feeds.py +29 -1
- meshagent_cli-0.47.0/meshagent/cli/feeds_test.py +158 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/helper.py +2 -2
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/helper_test.py +5 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/image.py +32 -1
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/image_test.py +109 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/llm_test.py +31 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/mailboxes.py +37 -5
- meshagent_cli-0.47.0/meshagent/cli/mailboxes_test.py +152 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/process.py +87 -6
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/process_test.py +114 -76
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_connect.py +8 -2
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_connect_test.py +59 -6
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/rooms.py +15 -4
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/rooms_test.py +67 -2
- meshagent_cli-0.47.0/meshagent/cli/sample_channel_http_test.py +352 -0
- meshagent_cli-0.47.0/meshagent/cli/sample_channel_live_e2e_test.py +96 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/scheduled_tasks.py +64 -11
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/scheduled_tasks_test.py +126 -10
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/thread_inspect.py +93 -1
- meshagent_cli-0.47.0/meshagent/cli/thread_inspect_test.py +248 -0
- meshagent_cli-0.47.0/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/PKG-INFO +17 -17
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/SOURCES.txt +15 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/requires.txt +16 -16
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/pyproject.toml +16 -16
- meshagent_cli-0.46.4/meshagent/cli/mailboxes_test.py +0 -43
- meshagent_cli-0.46.4/meshagent/cli/thread_inspect_test.py +0 -66
- meshagent_cli-0.46.4/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/LICENSE +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/README.md +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/_filedrop.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/cli_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/iam.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/iam_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/messaging_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/projects.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/projects_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_services_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/routes_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/secrets.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/secrets_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/service_accounts.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/service_accounts_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sqlite.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sqlite_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/testing.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/thread_sidebar.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/deploy_room_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.47.0
|
|
4
4
|
Summary: CLI for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
@@ -22,8 +22,8 @@ Requires-Dist: openpyxl~=3.1
|
|
|
22
22
|
Requires-Dist: xlsxwriter~=3.2
|
|
23
23
|
Requires-Dist: pathspec<2,>=1.0.3
|
|
24
24
|
Requires-Dist: zstandard~=0.25.0
|
|
25
|
-
Requires-Dist: meshagent-llm-proxy==0.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.47.0
|
|
26
|
+
Requires-Dist: meshagent-codex==0.47.0
|
|
27
27
|
Requires-Dist: rich~=14.3.0
|
|
28
28
|
Requires-Dist: sounddevice~=0.5
|
|
29
29
|
Requires-Dist: textual<9.0,>=8.2.3
|
|
@@ -32,23 +32,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
|
|
|
32
32
|
Requires-Dist: ascii-magic~=2.3
|
|
33
33
|
Requires-Dist: pillow~=11.3.0
|
|
34
34
|
Provides-Extra: all
|
|
35
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.47.0; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.47.0; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.47.0; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.47.0; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.47.0; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.47.0; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.47.0; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.47.0; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.47.0; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.47.0; extra == "all"
|
|
45
45
|
Requires-Dist: supabase-auth~=2.28.0; extra == "all"
|
|
46
46
|
Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
|
|
47
47
|
Provides-Extra: mcp-service
|
|
48
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
49
|
-
Requires-Dist: meshagent-api==0.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.47.0; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.47.0; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.47.0; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.47.0; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -9,51 +9,19 @@ from rich.text import Text
|
|
|
9
9
|
from typing import Annotated
|
|
10
10
|
|
|
11
11
|
from meshagent.agents import Package, deploy_package, run_package
|
|
12
|
-
|
|
12
|
+
from meshagent.agents.package import load_package
|
|
13
13
|
from meshagent.api import RoomClient, WebSocketClientProtocol
|
|
14
14
|
from meshagent.cli import async_typer
|
|
15
15
|
from meshagent.cli.common_options import ProjectIdOption, RoomOption
|
|
16
16
|
from meshagent.cli.containers import _stream_container_job_logs_and_wait_for_exit
|
|
17
17
|
from meshagent.cli.helper import get_client, resolve_project_id, resolve_room
|
|
18
|
-
from meshagent.cli.multi import import_from_path
|
|
19
18
|
|
|
20
19
|
|
|
21
20
|
app = async_typer.AsyncTyper(help="Build, run, and deploy packaged services.")
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
def _load_package(*, module_path: str, export_name: str) -> Package:
|
|
25
|
-
|
|
26
|
-
with package_module._agent_base_path_scope(resolved_module_path.parent):
|
|
27
|
-
module = import_from_path(str(resolved_module_path))
|
|
28
|
-
|
|
29
|
-
if export_name not in module.__dict__:
|
|
30
|
-
raise ImportError(f"{resolved_module_path} does not define {export_name}")
|
|
31
|
-
|
|
32
|
-
exported = module.__dict__[export_name]
|
|
33
|
-
if isinstance(exported, Package):
|
|
34
|
-
exported._bind_module_path(module_path=resolved_module_path)
|
|
35
|
-
exported._bind_module_export(
|
|
36
|
-
export_name=export_name,
|
|
37
|
-
export_is_factory=False,
|
|
38
|
-
)
|
|
39
|
-
return exported
|
|
40
|
-
|
|
41
|
-
if callable(exported):
|
|
42
|
-
built = exported()
|
|
43
|
-
if isinstance(built, Package):
|
|
44
|
-
built._bind_module_path(module_path=resolved_module_path)
|
|
45
|
-
built._bind_module_export(
|
|
46
|
-
export_name=export_name,
|
|
47
|
-
export_is_factory=True,
|
|
48
|
-
)
|
|
49
|
-
return built
|
|
50
|
-
raise TypeError(
|
|
51
|
-
f"{resolved_module_path}:{export_name} returned {type(built).__name__}, expected meshagent.agents.Package"
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
raise TypeError(
|
|
55
|
-
f"{resolved_module_path}:{export_name} is {type(exported).__name__}, expected meshagent.agents.Package or a zero-argument callable returning one"
|
|
56
|
-
)
|
|
24
|
+
return load_package(module_path=module_path, export_name=export_name)
|
|
57
25
|
|
|
58
26
|
|
|
59
27
|
def _print_packaged_files(*, package: Package) -> None:
|
|
@@ -184,8 +184,8 @@ async def test_package_run_command_invokes_package_run_and_tails_logs(
|
|
|
184
184
|
captured["delete"] = container_id
|
|
185
185
|
|
|
186
186
|
class _FakeRoomClient:
|
|
187
|
-
def __init__(self, *,
|
|
188
|
-
del
|
|
187
|
+
def __init__(self, *, protocol_factory) -> None:
|
|
188
|
+
del protocol_factory
|
|
189
189
|
self.containers = _FakeContainers()
|
|
190
190
|
|
|
191
191
|
async def __aenter__(self):
|
|
@@ -293,8 +293,8 @@ async def test_package_run_command_deletes_container_on_interrupt(
|
|
|
293
293
|
captured["delete"] = container_id
|
|
294
294
|
|
|
295
295
|
class _FakeRoomClient:
|
|
296
|
-
def __init__(self, *,
|
|
297
|
-
del
|
|
296
|
+
def __init__(self, *, protocol_factory) -> None:
|
|
297
|
+
del protocol_factory
|
|
298
298
|
self.containers = _FakeContainers()
|
|
299
299
|
|
|
300
300
|
async def __aenter__(self):
|
|
@@ -6,6 +6,7 @@ import typer
|
|
|
6
6
|
from rich import print
|
|
7
7
|
|
|
8
8
|
from meshagent.api import RoomException
|
|
9
|
+
from meshagent.api.client import ManagedAgent
|
|
9
10
|
from meshagent.api.managed_agents import ManagedAgentSpec
|
|
10
11
|
from meshagent.agents.chat_client import ChatThreadSession, WebSocketChatClient
|
|
11
12
|
from meshagent.agents.messages import (
|
|
@@ -24,6 +25,35 @@ app = async_typer.AsyncTyper(
|
|
|
24
25
|
)
|
|
25
26
|
|
|
26
27
|
|
|
28
|
+
async def _list_agents(
|
|
29
|
+
account_client,
|
|
30
|
+
*,
|
|
31
|
+
project_id: str,
|
|
32
|
+
count: int,
|
|
33
|
+
offset: int,
|
|
34
|
+
filter: str | None,
|
|
35
|
+
) -> list[ManagedAgent]:
|
|
36
|
+
agents: list[ManagedAgent] = []
|
|
37
|
+
continuation_token: str | None = None
|
|
38
|
+
# The "my" view is paged in access-object order, so exhaust it before applying
|
|
39
|
+
# the CLI's global name ordering and offset.
|
|
40
|
+
while True:
|
|
41
|
+
page = await account_client.list_agents_page(
|
|
42
|
+
project_id=project_id,
|
|
43
|
+
page_size=100,
|
|
44
|
+
continuation_token=continuation_token,
|
|
45
|
+
filter=filter,
|
|
46
|
+
view="my",
|
|
47
|
+
)
|
|
48
|
+
agents.extend(page.agents)
|
|
49
|
+
continuation_token = page.continuation_token
|
|
50
|
+
if continuation_token is None or not page.agents:
|
|
51
|
+
break
|
|
52
|
+
|
|
53
|
+
agents.sort(key=lambda agent: agent.name.lower())
|
|
54
|
+
return agents[offset : offset + count]
|
|
55
|
+
|
|
56
|
+
|
|
27
57
|
def _maybe_parse_json_object(label: str, value: Optional[str]) -> Optional[dict]:
|
|
28
58
|
if value is None:
|
|
29
59
|
return None
|
|
@@ -597,19 +627,27 @@ async def agent_list_command(
|
|
|
597
627
|
] = None,
|
|
598
628
|
offset: Annotated[int, typer.Option(help="Offset for pagination", min=0)] = 0,
|
|
599
629
|
order_by: Annotated[
|
|
600
|
-
str, typer.Option(help='Order by
|
|
630
|
+
str, typer.Option(help='Order agents by name; only "agent_name" is supported')
|
|
601
631
|
] = "agent_name",
|
|
602
632
|
filter: Annotated[
|
|
603
633
|
Optional[str],
|
|
604
634
|
typer.Option("--filter", help="Lowercase contains filter for agent names"),
|
|
605
635
|
] = None,
|
|
606
636
|
):
|
|
637
|
+
if order_by != "agent_name":
|
|
638
|
+
raise typer.BadParameter(
|
|
639
|
+
'Only "agent_name" is supported.', param_hint="--order-by"
|
|
640
|
+
)
|
|
641
|
+
|
|
607
642
|
account_client = await get_client()
|
|
608
643
|
try:
|
|
609
644
|
project_id = await resolve_project_id(project_id=project_id)
|
|
610
|
-
|
|
645
|
+
agent_count = limit if limit is not None else count
|
|
646
|
+
agents = await _list_agents(
|
|
647
|
+
account_client,
|
|
611
648
|
project_id=project_id,
|
|
612
|
-
|
|
649
|
+
count=agent_count,
|
|
650
|
+
offset=offset,
|
|
613
651
|
filter=filter,
|
|
614
652
|
)
|
|
615
653
|
output = [
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
|
+
import typer
|
|
4
5
|
|
|
5
6
|
from meshagent.agents.chat_client import BaseChatClient, ChatThreadSession
|
|
6
7
|
from meshagent.agents.messages import (
|
|
@@ -10,7 +11,7 @@ from meshagent.agents.messages import (
|
|
|
10
11
|
AgentTextContent,
|
|
11
12
|
StartThread,
|
|
12
13
|
)
|
|
13
|
-
from meshagent.api.client import ManagedAgent
|
|
14
|
+
from meshagent.api.client import AgentsPage, ManagedAgent
|
|
14
15
|
from meshagent.api.managed_agents import (
|
|
15
16
|
AllowedOpenAIModel,
|
|
16
17
|
ManagedAgentMetadata,
|
|
@@ -25,6 +26,7 @@ class _FakeAgentClient:
|
|
|
25
26
|
self.create_agent_calls: list[dict[str, object]] = []
|
|
26
27
|
self.update_agent_calls: list[dict[str, object]] = []
|
|
27
28
|
self.list_agents_calls: list[dict[str, object]] = []
|
|
29
|
+
self.list_agents_page_results: list[AgentsPage] = []
|
|
28
30
|
self.get_agent_calls: list[dict[str, object]] = []
|
|
29
31
|
self.list_agents_result: list[ManagedAgent] = []
|
|
30
32
|
self.get_agent_result: ManagedAgent | None = None
|
|
@@ -60,21 +62,27 @@ class _FakeAgentClient:
|
|
|
60
62
|
}
|
|
61
63
|
)
|
|
62
64
|
|
|
63
|
-
async def
|
|
65
|
+
async def list_agents_page(
|
|
64
66
|
self,
|
|
65
67
|
*,
|
|
66
68
|
project_id: str,
|
|
67
69
|
page_size: int,
|
|
70
|
+
continuation_token: str | None = None,
|
|
68
71
|
filter: str | None = None,
|
|
69
|
-
|
|
72
|
+
view: str | None = None,
|
|
73
|
+
) -> AgentsPage:
|
|
70
74
|
self.list_agents_calls.append(
|
|
71
75
|
{
|
|
72
76
|
"project_id": project_id,
|
|
73
77
|
"page_size": page_size,
|
|
78
|
+
"continuation_token": continuation_token,
|
|
74
79
|
"filter": filter,
|
|
80
|
+
"view": view,
|
|
75
81
|
}
|
|
76
82
|
)
|
|
77
|
-
|
|
83
|
+
if self.list_agents_page_results:
|
|
84
|
+
return self.list_agents_page_results.pop(0)
|
|
85
|
+
return AgentsPage(agents=self.list_agents_result, continuation_token=None)
|
|
78
86
|
|
|
79
87
|
async def get_agent(self, *, project_id: str, name: str) -> ManagedAgent:
|
|
80
88
|
self.get_agent_calls.append({"project_id": project_id, "name": name})
|
|
@@ -112,10 +120,12 @@ class _FakeWebSocketChatClient(BaseChatClient):
|
|
|
112
120
|
)
|
|
113
121
|
|
|
114
122
|
|
|
115
|
-
def _sample_configuration(
|
|
123
|
+
def _sample_configuration(
|
|
124
|
+
*, agent_id: str | None = "agent-1", name: str = "planner"
|
|
125
|
+
) -> ManagedAgentSpec:
|
|
116
126
|
return ManagedAgentSpec(
|
|
117
127
|
id=agent_id,
|
|
118
|
-
metadata=ManagedAgentMetadata(name=
|
|
128
|
+
metadata=ManagedAgentMetadata(name=name),
|
|
119
129
|
allowed_models=[AllowedOpenAIModel(model="gpt-4.1")],
|
|
120
130
|
)
|
|
121
131
|
|
|
@@ -123,8 +133,10 @@ def _sample_configuration(*, agent_id: str | None = "agent-1") -> ManagedAgentSp
|
|
|
123
133
|
def _sample_agent(
|
|
124
134
|
*,
|
|
125
135
|
configuration: ManagedAgentSpec | None = None,
|
|
136
|
+
agent_id: str = "agent-1",
|
|
137
|
+
name: str = "planner",
|
|
126
138
|
) -> ManagedAgent:
|
|
127
|
-
configuration = configuration or _sample_configuration()
|
|
139
|
+
configuration = configuration or _sample_configuration(agent_id=agent_id, name=name)
|
|
128
140
|
return ManagedAgent(
|
|
129
141
|
id=configuration.id or "agent-1",
|
|
130
142
|
name=configuration.name,
|
|
@@ -269,7 +281,9 @@ async def test_agent_list_command_outputs_current_agent_shape(
|
|
|
269
281
|
{
|
|
270
282
|
"project_id": "resolved-project",
|
|
271
283
|
"page_size": 100,
|
|
284
|
+
"continuation_token": None,
|
|
272
285
|
"filter": None,
|
|
286
|
+
"view": "my",
|
|
273
287
|
}
|
|
274
288
|
]
|
|
275
289
|
assert printed == [
|
|
@@ -287,6 +301,71 @@ async def test_agent_list_command_outputs_current_agent_shape(
|
|
|
287
301
|
assert client.closed is True
|
|
288
302
|
|
|
289
303
|
|
|
304
|
+
@pytest.mark.asyncio
|
|
305
|
+
async def test_agent_list_command_fetches_all_before_name_sort_and_offset(
|
|
306
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
307
|
+
) -> None:
|
|
308
|
+
client = _FakeAgentClient()
|
|
309
|
+
client.list_agents_page_results = [
|
|
310
|
+
AgentsPage(
|
|
311
|
+
agents=[
|
|
312
|
+
_sample_agent(agent_id=f"agent-{index}", name=f"agent-{index:03}")
|
|
313
|
+
for index in range(60, 160)
|
|
314
|
+
],
|
|
315
|
+
continuation_token="cursor-1",
|
|
316
|
+
),
|
|
317
|
+
AgentsPage(
|
|
318
|
+
agents=[
|
|
319
|
+
_sample_agent(agent_id=f"agent-{index}", name=f"agent-{index:03}")
|
|
320
|
+
for index in range(60)
|
|
321
|
+
],
|
|
322
|
+
continuation_token=None,
|
|
323
|
+
),
|
|
324
|
+
]
|
|
325
|
+
printed: list[str] = []
|
|
326
|
+
_patch_agent_command(monkeypatch, client=client)
|
|
327
|
+
monkeypatch.setattr(agents, "print", lambda value: printed.append(value))
|
|
328
|
+
|
|
329
|
+
await agents.agent_list_command(
|
|
330
|
+
project_id="project-1",
|
|
331
|
+
count=150,
|
|
332
|
+
offset=10,
|
|
333
|
+
filter="planner",
|
|
334
|
+
o="json",
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
assert client.list_agents_calls == [
|
|
338
|
+
{
|
|
339
|
+
"project_id": "resolved-project",
|
|
340
|
+
"page_size": 100,
|
|
341
|
+
"continuation_token": None,
|
|
342
|
+
"filter": "planner",
|
|
343
|
+
"view": "my",
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"project_id": "resolved-project",
|
|
347
|
+
"page_size": 100,
|
|
348
|
+
"continuation_token": "cursor-1",
|
|
349
|
+
"filter": "planner",
|
|
350
|
+
"view": "my",
|
|
351
|
+
},
|
|
352
|
+
]
|
|
353
|
+
output = json.loads(printed[0])
|
|
354
|
+
assert len(output) == 150
|
|
355
|
+
assert output[0]["name"] == "agent-010"
|
|
356
|
+
assert output[-1]["name"] == "agent-159"
|
|
357
|
+
assert client.closed is True
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
@pytest.mark.asyncio
|
|
361
|
+
async def test_agent_list_rejects_unsupported_order() -> None:
|
|
362
|
+
with pytest.raises(typer.BadParameter, match='Only "agent_name" is supported'):
|
|
363
|
+
await agents.agent_list_command(
|
|
364
|
+
project_id="project-1",
|
|
365
|
+
order_by="created_at",
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
|
|
290
369
|
@pytest.mark.asyncio
|
|
291
370
|
async def test_agent_use_session_starts_thread_without_stopping_websocket_client() -> (
|
|
292
371
|
None
|
|
@@ -539,6 +539,21 @@ async def _send_chat_thread_prompt(
|
|
|
539
539
|
await session.start_thread(text=prompt, attachments=file_attachments)
|
|
540
540
|
|
|
541
541
|
|
|
542
|
+
async def _run_ask_chat_thread_prompt(
|
|
543
|
+
*,
|
|
544
|
+
session: ChatThreadSession,
|
|
545
|
+
prompt: str,
|
|
546
|
+
attachments: Sequence[_AskInputAttachment],
|
|
547
|
+
on_message: Callable[[AgentMessage], Awaitable[None] | None],
|
|
548
|
+
) -> None:
|
|
549
|
+
"""Run a TUI turn while forwarding each event exactly as it arrives."""
|
|
550
|
+
await session.ask(
|
|
551
|
+
prompt=prompt,
|
|
552
|
+
attachments=attachments,
|
|
553
|
+
on_message=on_message,
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
|
|
542
557
|
class _AgentMessageChannelClient(Protocol):
|
|
543
558
|
@property
|
|
544
559
|
def has_thread_path(self) -> bool: ...
|
|
@@ -3866,10 +3881,11 @@ async def _run_ask_tui(
|
|
|
3866
3881
|
prompt: str,
|
|
3867
3882
|
attachments: Sequence[_AskInputAttachment] = (),
|
|
3868
3883
|
) -> None:
|
|
3869
|
-
await
|
|
3884
|
+
await _run_ask_chat_thread_prompt(
|
|
3870
3885
|
session=session,
|
|
3871
3886
|
prompt=prompt,
|
|
3872
3887
|
attachments=attachments,
|
|
3888
|
+
on_message=self._handle_agent_message,
|
|
3873
3889
|
)
|
|
3874
3890
|
|
|
3875
3891
|
async def _finalize_active_assistant(self) -> None:
|
|
@@ -173,6 +173,122 @@ class _FakeTTY:
|
|
|
173
173
|
return self._is_tty
|
|
174
174
|
|
|
175
175
|
|
|
176
|
+
@pytest.mark.asyncio
|
|
177
|
+
async def test_run_ask_chat_thread_prompt_forwards_streamed_deltas_once() -> None:
|
|
178
|
+
delivered: list[object] = []
|
|
179
|
+
rendered_text = ""
|
|
180
|
+
render_snapshots: list[str] = []
|
|
181
|
+
|
|
182
|
+
class _StreamingSession:
|
|
183
|
+
async def ask(self, *, prompt, attachments, on_message):
|
|
184
|
+
assert prompt == "stream this"
|
|
185
|
+
assert attachments == ()
|
|
186
|
+
messages = (
|
|
187
|
+
AgentTextContentStarted(
|
|
188
|
+
type=AGENT_EVENT_TEXT_CONTENT_STARTED,
|
|
189
|
+
thread_id="/threads/process-run",
|
|
190
|
+
turn_id="turn-1",
|
|
191
|
+
item_id="item-1",
|
|
192
|
+
),
|
|
193
|
+
AgentTextContentDelta(
|
|
194
|
+
type=AGENT_EVENT_TEXT_CONTENT_DELTA,
|
|
195
|
+
thread_id="/threads/process-run",
|
|
196
|
+
turn_id="turn-1",
|
|
197
|
+
item_id="item-1",
|
|
198
|
+
text="Hello ",
|
|
199
|
+
),
|
|
200
|
+
AgentTextContentDelta(
|
|
201
|
+
type=AGENT_EVENT_TEXT_CONTENT_DELTA,
|
|
202
|
+
thread_id="/threads/process-run",
|
|
203
|
+
turn_id="turn-1",
|
|
204
|
+
item_id="item-1",
|
|
205
|
+
text="world",
|
|
206
|
+
),
|
|
207
|
+
AgentTextContentEnded(
|
|
208
|
+
type=AGENT_EVENT_TEXT_CONTENT_ENDED,
|
|
209
|
+
thread_id="/threads/process-run",
|
|
210
|
+
turn_id="turn-1",
|
|
211
|
+
item_id="item-1",
|
|
212
|
+
),
|
|
213
|
+
)
|
|
214
|
+
for message in messages:
|
|
215
|
+
await ask_module._maybe_await(on_message(message))
|
|
216
|
+
# The aggregate return value must not be rendered after the deltas.
|
|
217
|
+
return "Hello world"
|
|
218
|
+
|
|
219
|
+
async def _render(message) -> None:
|
|
220
|
+
nonlocal rendered_text
|
|
221
|
+
delivered.append(message)
|
|
222
|
+
if isinstance(message, AgentTextContentDelta):
|
|
223
|
+
rendered_text += message.text
|
|
224
|
+
render_snapshots.append(rendered_text)
|
|
225
|
+
|
|
226
|
+
await ask_module._run_ask_chat_thread_prompt(
|
|
227
|
+
session=_StreamingSession(),
|
|
228
|
+
prompt="stream this",
|
|
229
|
+
attachments=(),
|
|
230
|
+
on_message=_render,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
assert render_snapshots == ["Hello ", "Hello world"]
|
|
234
|
+
assert rendered_text == "Hello world"
|
|
235
|
+
assert [type(message) for message in delivered] == [
|
|
236
|
+
AgentTextContentStarted,
|
|
237
|
+
AgentTextContentDelta,
|
|
238
|
+
AgentTextContentDelta,
|
|
239
|
+
AgentTextContentEnded,
|
|
240
|
+
]
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
@pytest.mark.asyncio
|
|
244
|
+
async def test_run_ask_chat_thread_prompt_preserves_sequential_turn_context() -> None:
|
|
245
|
+
completed_prompts: list[str] = []
|
|
246
|
+
request_contexts: list[tuple[str, ...]] = []
|
|
247
|
+
|
|
248
|
+
class _ContextualSession:
|
|
249
|
+
async def ask(self, *, prompt, attachments, on_message):
|
|
250
|
+
assert attachments == ()
|
|
251
|
+
request_contexts.append((*completed_prompts, prompt))
|
|
252
|
+
item_id = f"item-{len(request_contexts)}"
|
|
253
|
+
await ask_module._maybe_await(
|
|
254
|
+
on_message(
|
|
255
|
+
AgentTextContentDelta(
|
|
256
|
+
type=AGENT_EVENT_TEXT_CONTENT_DELTA,
|
|
257
|
+
thread_id="/threads/process-run",
|
|
258
|
+
turn_id=f"turn-{len(request_contexts)}",
|
|
259
|
+
item_id=item_id,
|
|
260
|
+
text=f"response to {prompt}",
|
|
261
|
+
)
|
|
262
|
+
)
|
|
263
|
+
)
|
|
264
|
+
completed_prompts.extend((prompt, f"response to {prompt}"))
|
|
265
|
+
return f"response to {prompt}"
|
|
266
|
+
|
|
267
|
+
session = _ContextualSession()
|
|
268
|
+
delivered: list[AgentTextContentDelta] = []
|
|
269
|
+
await ask_module._run_ask_chat_thread_prompt(
|
|
270
|
+
session=session,
|
|
271
|
+
prompt="first prompt",
|
|
272
|
+
attachments=(),
|
|
273
|
+
on_message=delivered.append,
|
|
274
|
+
)
|
|
275
|
+
await ask_module._run_ask_chat_thread_prompt(
|
|
276
|
+
session=session,
|
|
277
|
+
prompt="second prompt",
|
|
278
|
+
attachments=(),
|
|
279
|
+
on_message=delivered.append,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
assert request_contexts == [
|
|
283
|
+
("first prompt",),
|
|
284
|
+
("first prompt", "response to first prompt", "second prompt"),
|
|
285
|
+
]
|
|
286
|
+
assert [message.text for message in delivered] == [
|
|
287
|
+
"response to first prompt",
|
|
288
|
+
"response to second prompt",
|
|
289
|
+
]
|
|
290
|
+
|
|
291
|
+
|
|
176
292
|
async def _local_chat_session(
|
|
177
293
|
send_message,
|
|
178
294
|
) -> tuple[ask_module.LocalChatClient, ask_module._AgentMessageSession]:
|