meshagent-cli 0.46.0__tar.gz → 0.46.2__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 (153) hide show
  1. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/PKG-INFO +17 -17
  2. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agents.py +1 -3
  3. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agents_test.py +9 -6
  4. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/projects.py +26 -43
  5. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/projects_test.py +13 -8
  6. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room.py +3 -5
  7. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/routes.py +26 -1
  8. meshagent_cli-0.46.2/meshagent/cli/routes_test.py +119 -0
  9. meshagent_cli-0.46.2/meshagent/cli/sqlite.py +1017 -0
  10. meshagent_cli-0.46.2/meshagent/cli/sqlite_test.py +68 -0
  11. meshagent_cli-0.46.2/meshagent/cli/version.py +1 -0
  12. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/PKG-INFO +17 -17
  13. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/SOURCES.txt +3 -0
  14. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/requires.txt +16 -16
  15. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/pyproject.toml +16 -16
  16. meshagent_cli-0.46.0/meshagent/cli/version.py +0 -1
  17. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/LICENSE +0 -0
  18. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/README.md +0 -0
  19. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/__init__.py +0 -0
  20. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/_filedrop.py +0 -0
  21. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent.py +0 -0
  22. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent_cli_options_test.py +0 -0
  23. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent_package_cli.py +0 -0
  24. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent_package_cli_test.py +0 -0
  25. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/ask.py +0 -0
  26. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/ask_test.py +0 -0
  27. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/async_typer.py +0 -0
  28. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/async_typer_test.py +0 -0
  29. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth.py +0 -0
  30. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth_async.py +0 -0
  31. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth_async_test.py +0 -0
  32. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth_test.py +0 -0
  33. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/call.py +0 -0
  34. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/chatbot.py +0 -0
  35. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/cli.py +0 -0
  36. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/cli_mcp.py +0 -0
  37. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/cli_test.py +0 -0
  38. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/common_options.py +0 -0
  39. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/config.py +0 -0
  40. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/config_test.py +0 -0
  41. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/containers.py +0 -0
  42. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/containers_test.py +0 -0
  43. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create.py +0 -0
  44. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
  45. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  46. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  47. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
  48. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  49. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_test.py +0 -0
  50. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/dataset.py +0 -0
  51. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/dataset_test.py +0 -0
  52. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/developer.py +0 -0
  53. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/developer_test.py +0 -0
  54. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor.py +0 -0
  55. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  56. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
  57. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor_test.py +0 -0
  58. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/feeds.py +0 -0
  59. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/helper.py +0 -0
  60. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/helper_test.py +0 -0
  61. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/helpers.py +0 -0
  62. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/host.py +0 -0
  63. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/iam.py +0 -0
  64. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/iam_test.py +0 -0
  65. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/image.py +0 -0
  66. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/image_test.py +0 -0
  67. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/launch.py +0 -0
  68. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/launch_test.py +0 -0
  69. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/llm.py +0 -0
  70. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/llm_test.py +0 -0
  71. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/local_settings.py +0 -0
  72. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/local_settings_test.py +0 -0
  73. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/mailbot.py +0 -0
  74. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/mailbot_test.py +0 -0
  75. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/mailboxes.py +0 -0
  76. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/meeting_transcriber.py +0 -0
  77. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/memory.py +0 -0
  78. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/memory_test.py +0 -0
  79. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/meshagent_images.py +0 -0
  80. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/meshagent_images_test.py +0 -0
  81. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/messaging.py +0 -0
  82. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/messaging_test.py +0 -0
  83. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/multi.py +0 -0
  84. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/oci_archive.py +0 -0
  85. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/oci_archive_test.py +0 -0
  86. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/participant_token.py +0 -0
  87. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/port.py +0 -0
  88. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/port_test.py +0 -0
  89. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/preamble_rules.py +0 -0
  90. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/preamble_rules_test.py +0 -0
  91. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/process.py +0 -0
  92. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/process_live_test.py +0 -0
  93. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/process_test.py +0 -0
  94. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/queue.py +0 -0
  95. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/queue_test.py +0 -0
  96. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/registry.py +0 -0
  97. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/registry_test.py +0 -0
  98. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_connect.py +0 -0
  99. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_connect_test.py +0 -0
  100. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_services.py +0 -0
  101. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_services_test.py +0 -0
  102. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/rooms.py +0 -0
  103. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/rooms_test.py +0 -0
  104. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/root_commands.py +0 -0
  105. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/root_commands_test.py +0 -0
  106. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/scheduled_tasks.py +0 -0
  107. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
  108. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/secrets.py +0 -0
  109. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/secrets_test.py +0 -0
  110. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/service_accounts.py +0 -0
  111. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/service_accounts_test.py +0 -0
  112. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/services.py +0 -0
  113. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/services_test.py +0 -0
  114. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sessions.py +0 -0
  115. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sessions_test.py +0 -0
  116. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/storage.py +0 -0
  117. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/storage_test.py +0 -0
  118. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/subscriptions.py +0 -0
  119. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sync.py +0 -0
  120. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sync_test.py +0 -0
  121. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/task_runner.py +0 -0
  122. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/task_runner_test.py +0 -0
  123. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/test.py +0 -0
  124. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/testing.py +0 -0
  125. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/thread_inspect.py +0 -0
  126. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/thread_inspect_test.py +0 -0
  127. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/thread_sidebar.py +0 -0
  128. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_call_summary.py +0 -0
  129. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_call_summary_test.py +0 -0
  130. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_integrations.py +0 -0
  131. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_integrations_test.py +0 -0
  132. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/__init__.py +0 -0
  133. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/auth_switch.py +0 -0
  134. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
  135. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/create.py +0 -0
  136. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/deploy_room.py +0 -0
  137. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/deploy_room_test.py +0 -0
  138. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/project_activate.py +0 -0
  139. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/project_activate_test.py +0 -0
  140. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/setup.py +0 -0
  141. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  142. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/setup_test.py +0 -0
  143. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/version_check.py +0 -0
  144. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/version_check_test.py +0 -0
  145. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/voicebot.py +0 -0
  146. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/webserver.py +0 -0
  147. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/webserver_test.py +0 -0
  148. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/worker.py +0 -0
  149. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/worker_test.py +0 -0
  150. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  151. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
  152. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/top_level.txt +0 -0
  153. {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.46.0
3
+ Version: 0.46.2
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.46.0
26
- Requires-Dist: meshagent-codex==0.46.0
25
+ Requires-Dist: meshagent-llm-proxy==0.46.2
26
+ Requires-Dist: meshagent-codex==0.46.2
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.46.0; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.46.0; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.46.0; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.46.0; extra == "all"
39
- Requires-Dist: meshagent-computers==0.46.0; extra == "all"
40
- Requires-Dist: meshagent-openai==0.46.0; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.46.0; extra == "all"
42
- Requires-Dist: meshagent-otel==0.46.0; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.46.0; extra == "all"
44
- Requires-Dist: meshagent-tools==0.46.0; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.46.2; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.46.2; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.46.2; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.46.2; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.46.2; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.46.2; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.46.2; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.46.2; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.46.2; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.46.2; 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.46.0; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.46.0; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.46.0; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.46.0; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.46.2; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.46.2; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.46.2; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.46.2; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -609,9 +609,7 @@ async def agent_list_command(
609
609
  project_id = await resolve_project_id(project_id=project_id)
610
610
  agents = await account_client.list_agents(
611
611
  project_id=project_id,
612
- limit=limit if limit is not None else count,
613
- offset=offset,
614
- order_by=order_by,
612
+ page_size=limit if limit is not None else count,
615
613
  filter=filter,
616
614
  )
617
615
  output = [
@@ -64,17 +64,13 @@ class _FakeAgentClient:
64
64
  self,
65
65
  *,
66
66
  project_id: str,
67
- limit: int,
68
- offset: int,
69
- order_by: str,
67
+ page_size: int,
70
68
  filter: str | None = None,
71
69
  ) -> list[ManagedAgent]:
72
70
  self.list_agents_calls.append(
73
71
  {
74
72
  "project_id": project_id,
75
- "limit": limit,
76
- "offset": offset,
77
- "order_by": order_by,
73
+ "page_size": page_size,
78
74
  "filter": filter,
79
75
  }
80
76
  )
@@ -269,6 +265,13 @@ async def test_agent_list_command_outputs_current_agent_shape(
269
265
 
270
266
  await agents.agent_list_command(project_id="project-1")
271
267
 
268
+ assert client.list_agents_calls == [
269
+ {
270
+ "project_id": "resolved-project",
271
+ "page_size": 100,
272
+ "filter": None,
273
+ }
274
+ ]
272
275
  assert printed == [
273
276
  (
274
277
  [
@@ -1,4 +1,3 @@
1
- import builtins
2
1
  import sys
3
2
  from dataclasses import dataclass
4
3
  from typing import Annotated
@@ -6,7 +5,7 @@ from typing import Annotated
6
5
  import typer
7
6
  from rich import print
8
7
 
9
- from meshagent.api.client import Meshagent, NotFoundError
8
+ from meshagent.api.client import Meshagent, NotFoundError, ProjectInfo, ProjectsPage
10
9
  from meshagent.cli import async_typer
11
10
  from meshagent.cli.helper import (
12
11
  get_client,
@@ -27,35 +26,17 @@ class ListedProject:
27
26
 
28
27
 
29
28
  def _parse_listed_projects(
30
- response: object,
29
+ response: ProjectsPage,
31
30
  *,
32
31
  active_project_id: str | None,
33
32
  ) -> list[ListedProject]:
34
- if not isinstance(response, dict):
35
- return []
36
-
37
- project_rows = response.get("projects")
38
- if not isinstance(project_rows, builtins.list):
39
- return []
40
-
41
33
  selectable_projects: list[ListedProject] = []
42
- for row in project_rows:
43
- if not isinstance(row, dict):
44
- continue
45
-
46
- project_id = row.get("id")
47
- if not isinstance(project_id, str):
48
- continue
49
- resolved_project_id = project_id.strip()
34
+ for row in response.projects:
35
+ resolved_project_id = row.id.strip()
50
36
  if resolved_project_id == "":
51
37
  continue
52
38
 
53
- project_name = row.get("name")
54
- resolved_project_name = (
55
- project_name.strip()
56
- if isinstance(project_name, str) and project_name.strip() != ""
57
- else resolved_project_id
58
- )
39
+ resolved_project_name = row.name.strip() or resolved_project_id
59
40
 
60
41
  selectable_projects.append(
61
42
  ListedProject(
@@ -85,25 +66,18 @@ async def _create_project_id(
85
66
  project_name: str,
86
67
  ) -> str:
87
68
  created = await client.create_project(project_name)
88
- if not isinstance(created, dict):
89
- raise RuntimeError("Project creation did not return a valid id.")
90
-
91
- created_project_id = created.get("id")
92
- if not isinstance(created_project_id, str):
93
- raise RuntimeError("Project creation did not return a valid id.")
94
-
95
- resolved_project_id = created_project_id.strip()
69
+ resolved_project_id = created.id.strip()
96
70
  if resolved_project_id == "":
97
71
  raise RuntimeError("Project creation did not return a valid id.")
98
72
 
99
73
  return resolved_project_id
100
74
 
101
75
 
102
- def _project_id_from_payload(project: dict[str, object]) -> str:
103
- project_id = project.get("id")
104
- if not isinstance(project_id, str) or project_id.strip() == "":
76
+ def _project_id_from_payload(project: ProjectInfo) -> str:
77
+ project_id = project.id.strip()
78
+ if project_id == "":
105
79
  raise RuntimeError("Project lookup did not return a valid id.")
106
- return project_id.strip()
80
+ return project_id
107
81
 
108
82
 
109
83
  async def _resolve_project_id_or_key(client: Meshagent, selector: str) -> str:
@@ -186,7 +160,7 @@ async def create(name: str):
186
160
  client = await get_client()
187
161
  try:
188
162
  result = await client.create_project(name)
189
- print(f"[green]Project created:[/] {result['id']}")
163
+ print(f"[green]Project created:[/] {result.id}")
190
164
  finally:
191
165
  await client.close()
192
166
 
@@ -198,14 +172,18 @@ async def list(
198
172
  client = await get_client()
199
173
  projects = await client.list_projects()
200
174
  active_project = await get_active_project()
201
- for project in projects["projects"]:
175
+ output = [
176
+ project.model_dump(mode="json", exclude_none=True)
177
+ for project in projects.projects
178
+ ]
179
+ for project in output:
202
180
  if project["id"] == active_project:
203
- project["name"] = "*" + project["name"]
181
+ project["name"] = "*" + str(project["name"])
204
182
 
205
183
  if o == "json":
206
- print(projects)
184
+ print({"projects": output})
207
185
  else:
208
- print_json_table(projects["projects"], "id", "name", "project_key")
186
+ print_json_table(output, "id", "name", "project_key")
209
187
  await client.close()
210
188
 
211
189
 
@@ -219,9 +197,14 @@ async def get(
219
197
  project_id = await _resolve_project_id_or_key(client, project)
220
198
  project_info = await client.get_project(project_id)
221
199
  if o == "json":
222
- print(project_info)
200
+ print(project_info.model_dump(mode="json", exclude_none=True))
223
201
  else:
224
- print_json_table([project_info], "id", "name", "project_key")
202
+ print_json_table(
203
+ [project_info.model_dump(mode="json", exclude_none=True)],
204
+ "id",
205
+ "name",
206
+ "project_key",
207
+ )
225
208
  finally:
226
209
  await client.close()
227
210
 
@@ -3,6 +3,7 @@ from types import SimpleNamespace
3
3
  import pytest
4
4
 
5
5
  from meshagent.api.client import NotFoundError
6
+ from meshagent.api.client import ProjectInfo, ProjectsPage
6
7
  from meshagent.cli import projects
7
8
 
8
9
 
@@ -18,22 +19,26 @@ class _FakeClient:
18
19
  self.created_project_names: list[str] = []
19
20
  self.closed = False
20
21
 
21
- async def list_projects(self) -> dict[str, list[dict[str, str]]]:
22
- return {"projects": self._project_rows}
22
+ async def list_projects(self) -> ProjectsPage:
23
+ return ProjectsPage(
24
+ projects=[
25
+ ProjectInfo.model_validate(project) for project in self._project_rows
26
+ ]
27
+ )
23
28
 
24
- async def get_project(self, project_id: str) -> dict[str, str]:
29
+ async def get_project(self, project_id: str) -> ProjectInfo:
25
30
  for project in self._project_rows:
26
31
  if project["id"] == project_id:
27
- return project
32
+ return ProjectInfo.model_validate(project)
28
33
  raise NotFoundError("not found")
29
34
 
30
- async def get_project_by_key(self, project_key: str) -> dict[str, str]:
35
+ async def get_project_by_key(self, project_key: str) -> ProjectInfo:
31
36
  for project in self._project_rows:
32
37
  if project.get("project_key") == project_key:
33
- return project
38
+ return ProjectInfo.model_validate(project)
34
39
  raise NotFoundError("not found")
35
40
 
36
- async def create_project(self, name: str) -> dict[str, str]:
41
+ async def create_project(self, name: str) -> ProjectInfo:
37
42
  self.created_project_names.append(name)
38
43
  created_row = {
39
44
  "id": self._created_project_id,
@@ -41,7 +46,7 @@ class _FakeClient:
41
46
  "project_key": name.lower().replace(" ", "-"),
42
47
  }
43
48
  self._project_rows.append(created_row)
44
- return created_row
49
+ return ProjectInfo.model_validate(created_row)
45
50
 
46
51
  async def close(self) -> None:
47
52
  self.closed = True
@@ -51,11 +51,9 @@ app.add_lazy_command(
51
51
  help="Manage dataset tables in a room",
52
52
  )
53
53
  app.add_lazy_command(
54
- name="database",
55
- module="meshagent.cli.dataset",
56
- help="Manage dataset tables in a room",
57
- hidden=True,
58
- deprecated=True,
54
+ name="sqlite",
55
+ module="meshagent.cli.sqlite",
56
+ help="Manage SQLite databases and tables in a room",
59
57
  )
60
58
  app.add_lazy_command(
61
59
  name="memory",
@@ -74,6 +74,30 @@ def _warn_if_non_meshagent_app_domain(domain: str) -> None:
74
74
  )
75
75
 
76
76
 
77
+ async def _list_routes_view(
78
+ client,
79
+ *,
80
+ project_id: str,
81
+ count: int,
82
+ offset: int,
83
+ filter: str | None,
84
+ ):
85
+ routes = []
86
+ continuation_token: str | None = None
87
+ while len(routes) < offset + count:
88
+ page = await client.list_routes_page(
89
+ project_id=project_id,
90
+ page_size=min(max(offset + count - len(routes), 1), 100),
91
+ continuation_token=continuation_token,
92
+ filter=filter,
93
+ )
94
+ routes.extend(page.routes)
95
+ continuation_token = page.continuation_token
96
+ if continuation_token is None:
97
+ break
98
+ return routes[offset : offset + count]
99
+
100
+
77
101
  @app.async_command("create")
78
102
  async def route_create(
79
103
  *,
@@ -317,7 +341,8 @@ async def route_list(
317
341
  filter=filter,
318
342
  )
319
343
  else:
320
- routes = await client.list_routes(
344
+ routes = await _list_routes_view(
345
+ client,
321
346
  project_id=project_id,
322
347
  count=count,
323
348
  offset=offset,
@@ -0,0 +1,119 @@
1
+ import pytest
2
+
3
+ from meshagent.api.client import Route, RoutesPage
4
+ from meshagent.cli import routes
5
+
6
+
7
+ class _FakeRoutesClient:
8
+ def __init__(self) -> None:
9
+ self.closed = False
10
+ self.list_routes_page_calls: list[dict[str, object]] = []
11
+ self.list_routes_calls: list[dict[str, object]] = []
12
+ self.pages = [
13
+ RoutesPage(
14
+ routes=[
15
+ Route.model_validate(
16
+ {
17
+ "domain": "a.meshagent.app",
18
+ "room_name": "room-a",
19
+ "port": "8080",
20
+ }
21
+ ),
22
+ Route.model_validate(
23
+ {
24
+ "domain": "b.meshagent.app",
25
+ "room_name": "room-b",
26
+ "port": "8081",
27
+ }
28
+ ),
29
+ ],
30
+ continuation_token="next",
31
+ ),
32
+ RoutesPage(
33
+ routes=[
34
+ Route.model_validate(
35
+ {
36
+ "domain": "c.meshagent.app",
37
+ "room_name": "room-c",
38
+ "port": "8082",
39
+ }
40
+ )
41
+ ],
42
+ continuation_token=None,
43
+ ),
44
+ ]
45
+
46
+ async def list_routes_page(
47
+ self,
48
+ *,
49
+ project_id: str,
50
+ page_size: int,
51
+ continuation_token: str | None = None,
52
+ filter: str | None = None,
53
+ ) -> RoutesPage:
54
+ self.list_routes_page_calls.append(
55
+ {
56
+ "project_id": project_id,
57
+ "page_size": page_size,
58
+ "continuation_token": continuation_token,
59
+ "filter": filter,
60
+ }
61
+ )
62
+ return self.pages.pop(0)
63
+
64
+ async def list_routes(self, **kwargs):
65
+ self.list_routes_calls.append(kwargs)
66
+ raise AssertionError("route_list should use list_routes_page for pagination")
67
+
68
+ async def close(self) -> None:
69
+ self.closed = True
70
+
71
+
72
+ @pytest.mark.asyncio
73
+ async def test_route_list_without_room_uses_paged_routes_client(
74
+ monkeypatch: pytest.MonkeyPatch,
75
+ ) -> None:
76
+ client = _FakeRoutesClient()
77
+ printed: list[object] = []
78
+
79
+ async def fake_get_client() -> _FakeRoutesClient:
80
+ return client
81
+
82
+ async def fake_resolve_project_id(project_id: str | None = None) -> str:
83
+ assert project_id == "project-1"
84
+ return "resolved-project"
85
+
86
+ monkeypatch.setattr(routes, "get_client", fake_get_client)
87
+ monkeypatch.setattr(routes, "resolve_project_id", fake_resolve_project_id)
88
+ monkeypatch.setattr(routes, "resolve_room", lambda room=None: room)
89
+ monkeypatch.setattr(routes, "print", printed.append)
90
+
91
+ await routes.route_list(
92
+ project_id="project-1",
93
+ count=2,
94
+ offset=1,
95
+ filter="mesh",
96
+ o="json",
97
+ )
98
+
99
+ assert client.list_routes_calls == []
100
+ assert client.list_routes_page_calls == [
101
+ {
102
+ "project_id": "resolved-project",
103
+ "page_size": 3,
104
+ "continuation_token": None,
105
+ "filter": "mesh",
106
+ },
107
+ {
108
+ "project_id": "resolved-project",
109
+ "page_size": 1,
110
+ "continuation_token": "next",
111
+ "filter": "mesh",
112
+ },
113
+ ]
114
+ assert client.closed
115
+ assert len(printed) == 1
116
+ assert [route["domain"] for route in printed[0]["routes"]] == [
117
+ "b.meshagent.app",
118
+ "c.meshagent.app",
119
+ ]