meshagent-cli 0.42.2__tar.gz → 0.43.1__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 (147) hide show
  1. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/PKG-INFO +18 -16
  2. meshagent_cli-0.43.1/meshagent/cli/_filedrop.py +112 -0
  3. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/agent_cli_options_test.py +1 -1
  4. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/agents.py +4 -5
  5. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/ask.py +1786 -173
  6. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/ask_test.py +458 -15
  7. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/async_typer.py +58 -37
  8. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/async_typer_test.py +5 -5
  9. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/chatbot.py +8 -8
  10. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/cli.py +4 -4
  11. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/cli_test.py +34 -1
  12. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/create.py +224 -331
  13. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/create_test.py +223 -133
  14. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/dataset_test.py +1 -1
  15. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/doctor.py +310 -163
  16. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/doctor_test.py +237 -49
  17. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/image_test.py +1 -1
  18. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/launch.py +47 -41
  19. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/launch_test.py +1 -1
  20. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/llm_test.py +1 -1
  21. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/mailbot_test.py +1 -1
  22. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/multi.py +2 -2
  23. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/process.py +1319 -936
  24. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/process_test.py +862 -120
  25. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/registry_test.py +1 -1
  26. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/room_connect.py +128 -88
  27. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/room_connect_test.py +90 -15
  28. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/rooms_test.py +1 -1
  29. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/root_commands.py +23 -11
  30. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/services_test.py +1 -1
  31. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/task_runner_test.py +3 -2
  32. meshagent_cli-0.43.1/meshagent/cli/thread_inspect.py +269 -0
  33. meshagent_cli-0.43.1/meshagent/cli/thread_inspect_test.py +66 -0
  34. meshagent_cli-0.43.1/meshagent/cli/thread_sidebar.py +423 -0
  35. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tool_call_summary.py +8 -0
  36. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tool_integrations.py +4 -4
  37. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/create.py +1 -15
  38. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/deploy_room.py +24 -14
  39. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/deploy_room_test.py +48 -3
  40. meshagent_cli-0.43.1/meshagent/cli/version.py +1 -0
  41. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/webhook.py +6 -1
  42. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/webserver.py +4 -3
  43. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/worker_test.py +1 -1
  44. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent_cli.egg-info/PKG-INFO +18 -16
  45. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent_cli.egg-info/SOURCES.txt +4 -0
  46. meshagent_cli-0.43.1/meshagent_cli.egg-info/requires.txt +43 -0
  47. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/pyproject.toml +17 -15
  48. meshagent_cli-0.42.2/meshagent/cli/version.py +0 -1
  49. meshagent_cli-0.42.2/meshagent_cli.egg-info/requires.txt +0 -41
  50. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/LICENSE +0 -0
  51. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/README.md +0 -0
  52. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/__init__.py +0 -0
  53. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/agent.py +0 -0
  54. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/agent_package_cli.py +0 -0
  55. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/agent_package_cli_test.py +0 -0
  56. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/agents_test.py +0 -0
  57. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/api_keys.py +0 -0
  58. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/api_keys_test.py +0 -0
  59. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/auth.py +0 -0
  60. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/auth_async.py +0 -0
  61. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/auth_async_test.py +0 -0
  62. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/auth_test.py +0 -0
  63. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/call.py +0 -0
  64. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/cli_mcp.py +0 -0
  65. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/cli_secrets.py +0 -0
  66. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/common_options.py +0 -0
  67. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/config.py +0 -0
  68. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/config_test.py +0 -0
  69. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/containers.py +0 -0
  70. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/containers_test.py +0 -0
  71. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/create_project_templates/__init__.py +0 -0
  72. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  73. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  74. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  75. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/dataset.py +0 -0
  76. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/developer.py +0 -0
  77. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/developer_test.py +0 -0
  78. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  79. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/doctor_templates/__init__.py +0 -0
  80. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/feeds.py +0 -0
  81. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/helper.py +0 -0
  82. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/helper_test.py +0 -0
  83. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/helpers.py +0 -0
  84. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/host.py +0 -0
  85. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/image.py +0 -0
  86. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/llm.py +0 -0
  87. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/local_settings.py +0 -0
  88. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/local_settings_test.py +0 -0
  89. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/mailbot.py +0 -0
  90. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/mailboxes.py +0 -0
  91. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/meeting_transcriber.py +0 -0
  92. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/memory.py +0 -0
  93. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/memory_test.py +0 -0
  94. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/meshagent_images.py +0 -0
  95. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/meshagent_images_test.py +0 -0
  96. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/messaging.py +0 -0
  97. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/oauth2.py +0 -0
  98. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/oauth2_test.py +0 -0
  99. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/oci_archive.py +0 -0
  100. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/oci_archive_test.py +0 -0
  101. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/participant_token.py +0 -0
  102. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/port.py +0 -0
  103. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/port_test.py +0 -0
  104. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/preamble_rules.py +0 -0
  105. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/preamble_rules_test.py +0 -0
  106. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/process_live_test.py +0 -0
  107. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/projects.py +0 -0
  108. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/projects_test.py +0 -0
  109. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/queue.py +0 -0
  110. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/queue_test.py +0 -0
  111. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/registry.py +0 -0
  112. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/room.py +0 -0
  113. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/room_services.py +0 -0
  114. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/rooms.py +0 -0
  115. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/root_commands_test.py +0 -0
  116. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/routes.py +0 -0
  117. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/scheduled_tasks.py +0 -0
  118. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/scheduled_tasks_test.py +0 -0
  119. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/services.py +0 -0
  120. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/sessions.py +0 -0
  121. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/sessions_test.py +0 -0
  122. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/storage.py +0 -0
  123. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/storage_test.py +0 -0
  124. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/subscriptions.py +0 -0
  125. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/sync.py +0 -0
  126. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/sync_test.py +0 -0
  127. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/task_runner.py +0 -0
  128. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/test.py +0 -0
  129. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tool_call_summary_test.py +0 -0
  130. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tool_integrations_test.py +0 -0
  131. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/__init__.py +0 -0
  132. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/auth_switch.py +0 -0
  133. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/auth_switch_test.py +0 -0
  134. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/project_activate.py +0 -0
  135. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/project_activate_test.py +0 -0
  136. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/setup.py +0 -0
  137. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  138. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/tui/setup_test.py +0 -0
  139. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/version_check.py +0 -0
  140. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/version_check_test.py +0 -0
  141. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/voicebot.py +0 -0
  142. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/webserver_test.py +0 -0
  143. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent/cli/worker.py +0 -0
  144. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  145. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent_cli.egg-info/entry_points.txt +0 -0
  146. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/meshagent_cli.egg-info/top_level.txt +0 -0
  147. {meshagent_cli-0.42.2 → meshagent_cli-0.43.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.42.2
3
+ Version: 0.43.1
4
4
  Summary: CLI for Meshagent
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Documentation, https://docs.meshagent.com
@@ -22,31 +22,33 @@ 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.42.2
25
+ Requires-Dist: meshagent-llm-proxy==0.43.1
26
+ Requires-Dist: meshagent-codex==0.43.1
26
27
  Requires-Dist: rich~=14.3.0
27
28
  Requires-Dist: sounddevice~=0.5
28
29
  Requires-Dist: textual<9.0,>=8.2.3
30
+ Requires-Dist: textual-image[textual]~=0.12.0
29
31
  Requires-Dist: prompt-toolkit~=3.0.52
30
32
  Requires-Dist: ascii-magic~=2.3
31
33
  Requires-Dist: pillow~=11.3.0
32
34
  Provides-Extra: all
33
- Requires-Dist: meshagent-agents[all]==0.42.2; extra == "all"
34
- Requires-Dist: meshagent-api[all]==0.42.2; extra == "all"
35
- Requires-Dist: meshagent-commoncrawl==0.42.2; extra == "all"
36
- Requires-Dist: meshagent-scrapy==0.42.2; extra == "all"
37
- Requires-Dist: meshagent-computers==0.42.2; extra == "all"
38
- Requires-Dist: meshagent-openai==0.42.2; extra == "all"
39
- Requires-Dist: meshagent-anthropic==0.42.2; extra == "all"
40
- Requires-Dist: meshagent-otel==0.42.2; extra == "all"
41
- Requires-Dist: meshagent-mcp==0.42.2; extra == "all"
42
- Requires-Dist: meshagent-tools==0.42.2; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.43.1; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.43.1; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.43.1; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.43.1; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.43.1; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.43.1; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.43.1; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.43.1; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.43.1; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.43.1; extra == "all"
43
45
  Requires-Dist: supabase-auth~=2.28.0; extra == "all"
44
46
  Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
45
47
  Provides-Extra: mcp-service
46
- Requires-Dist: meshagent-agents[all]==0.42.2; extra == "mcp-service"
47
- Requires-Dist: meshagent-api==0.42.2; extra == "mcp-service"
48
- Requires-Dist: meshagent-mcp==0.42.2; extra == "mcp-service"
49
- Requires-Dist: meshagent-tools==0.42.2; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.43.1; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.43.1; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.43.1; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.43.1; extra == "mcp-service"
50
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
51
53
  Dynamic: license-file
52
54
 
@@ -0,0 +1,112 @@
1
+ from __future__ import annotations
2
+
3
+ import mimetypes
4
+ import re
5
+ import shlex
6
+ from pathlib import Path
7
+ from urllib.parse import unquote, urlparse
8
+
9
+ _FILE_URI_RE = re.compile(r"file://(?:(?:%[0-9A-Fa-f]{2})|[^\s'\"<>])+")
10
+
11
+
12
+ def dropped_file_paths_from_text(
13
+ text: str,
14
+ *,
15
+ current_working_directory: str | Path,
16
+ ) -> list[Path]:
17
+ """Return existing file paths from text emitted by terminal file drops."""
18
+ paths: list[Path] = []
19
+ seen: set[str] = set()
20
+ for candidate in _dropped_path_candidates(text):
21
+ for path in _expanded_existing_files(
22
+ candidate,
23
+ current_working_directory=Path(current_working_directory),
24
+ ):
25
+ key = str(path)
26
+ if key in seen:
27
+ continue
28
+ seen.add(key)
29
+ paths.append(path)
30
+ return paths
31
+
32
+
33
+ def dropped_image_file_paths_from_text(
34
+ text: str,
35
+ *,
36
+ current_working_directory: str | Path,
37
+ ) -> list[Path]:
38
+ return [
39
+ path
40
+ for path in dropped_file_paths_from_text(
41
+ text,
42
+ current_working_directory=current_working_directory,
43
+ )
44
+ if _is_image_path(path)
45
+ ]
46
+
47
+
48
+ def _dropped_path_candidates(text: str) -> list[str]:
49
+ stripped_text = text.strip()
50
+ if stripped_text == "":
51
+ return []
52
+ if "\n" not in stripped_text and stripped_text.startswith("file://"):
53
+ return [stripped_text]
54
+
55
+ file_uri_candidates = _FILE_URI_RE.findall(stripped_text)
56
+ if len(file_uri_candidates) > 0:
57
+ return file_uri_candidates
58
+
59
+ raw_candidate = [stripped_text] if "\n" not in stripped_text else []
60
+ try:
61
+ split_candidates = shlex.split(stripped_text)
62
+ except ValueError:
63
+ split_candidates = []
64
+ if len(split_candidates) > 0:
65
+ return raw_candidate + [
66
+ candidate for candidate in split_candidates if candidate != stripped_text
67
+ ]
68
+ if len(raw_candidate) > 0:
69
+ return raw_candidate
70
+
71
+ return [line.strip() for line in stripped_text.splitlines() if line.strip() != ""]
72
+
73
+
74
+ def _expanded_existing_files(
75
+ candidate: str,
76
+ *,
77
+ current_working_directory: Path,
78
+ ) -> list[Path]:
79
+ candidate_path = _path_from_candidate(candidate)
80
+ if candidate_path is None:
81
+ return []
82
+ if not candidate_path.is_absolute():
83
+ candidate_path = current_working_directory / candidate_path
84
+ try:
85
+ resolved = candidate_path.expanduser().resolve()
86
+ except OSError:
87
+ return []
88
+ if resolved.is_file():
89
+ return [resolved]
90
+ if not resolved.is_dir():
91
+ return []
92
+ return sorted(
93
+ (path.resolve() for path in resolved.rglob("*") if path.is_file()),
94
+ key=str,
95
+ )
96
+
97
+
98
+ def _path_from_candidate(candidate: str) -> Path | None:
99
+ normalized = candidate.strip().strip("\"'").replace("\x00", "")
100
+ if normalized == "":
101
+ return None
102
+ parsed = urlparse(normalized)
103
+ if parsed.scheme == "file":
104
+ if parsed.netloc not in ("", "localhost"):
105
+ return None
106
+ return Path(unquote(parsed.path))
107
+ return Path(normalized)
108
+
109
+
110
+ def _is_image_path(path: Path) -> bool:
111
+ mime_type = mimetypes.guess_type(str(path))[0]
112
+ return isinstance(mime_type, str) and mime_type.startswith("image/")
@@ -1,4 +1,4 @@
1
- from click.testing import CliRunner
1
+ from typer._click.testing import CliRunner
2
2
  import pytest
3
3
 
4
4
  from meshagent.cli import async_typer
@@ -2,7 +2,6 @@ import json
2
2
  import os
3
3
  from typing import Annotated, Any, Awaitable, Callable, Literal, Optional
4
4
 
5
- import click
6
5
  import typer
7
6
  from rich import print
8
7
 
@@ -426,14 +425,14 @@ async def _run_agent_use_tui(
426
425
 
427
426
  def _write_message(agent_message: AgentMessage) -> None:
428
427
  if isinstance(agent_message, AgentTextContentDelta):
429
- click.echo(agent_message.text, nl=False)
428
+ typer.echo(agent_message.text, nl=False)
430
429
 
431
430
  response_text = await session.ask(
432
431
  prompt=message,
433
432
  on_message=_write_message if output == "text" else None,
434
433
  )
435
434
  if output == "json":
436
- click.echo(
435
+ typer.echo(
437
436
  json.dumps(
438
437
  {
439
438
  "thread_path": session.thread_id,
@@ -443,7 +442,7 @@ async def _run_agent_use_tui(
443
442
  )
444
443
  )
445
444
  else:
446
- click.echo()
445
+ typer.echo()
447
446
  return
448
447
 
449
448
  await ask_module._run_ask_tui(
@@ -671,7 +670,7 @@ async def agent_use_command(
671
670
  name: Annotated[Optional[str], typer.Option("--name", help="Agent name")] = None,
672
671
  thread_path: Annotated[
673
672
  Optional[str],
674
- typer.Option("--thread-path", help="Thread path to open"),
673
+ typer.Option("--thread-id", help="Thread id to open"),
675
674
  ] = None,
676
675
  load: Annotated[
677
676
  bool,