feat: add multi-device concurrency, server lifecycle CLI, and unified execution stream

- Implement DevicePool and DeviceExecutionLock concurrency modes (per-device FIFO vs global serialization)
- Extend ArtemisClient SDK and CLI with explicit device targeting and concurrency strategy configuration
- Add server lifecycle management (artemis restart, stop, status) with cross-platform PID discovery
- Update MCP server tools to support multi-device dispatch, trace tagging, and per-device execution
- Enhance Showcase UI with step-by-step visual replay, playback speed controls, and device serial badges
- Add comprehensive unit test coverage and edge-case verification scripts
This commit is contained in:
somew1nd committed 2026-08-26 15:53:14 -07:00
1 parent a36a66ce6d
commit c2c90a6378
84 files changed
+5612 -645

No files matched your search

+1 -1
View File
@@ -50,7 +50,7 @@ class GraphRunner(BaseRunner):
artemis_ctx = ArtemisContext(
device=DeviceContext(
host_platform=platform.os_type.name,
device_serial=self.driver.device_id,
device_id=self.driver.device_id,
)
)
graph = await get_graph(artemis_ctx)
+5 -1
View File
@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from typing import Literal
from artemis.config import OutputConfig, load_agent_config
@@ -50,13 +51,16 @@ class Pipeline:
device_id: str = "default-device",
output_config: OutputConfig | None = None,
enable_outputter: bool | None = None,
locked_package: str | None = None,
**kwargs: Any,
) -> ExecutionContextState:
ctx = ExecutionContext(task_goal=goal, device_id=device_id)
if not driver:
driver = MockDeviceDriver(device_id=device_id)
max_turns = kwargs.get("max_turns", 5)
runner = cls.create_runner(profile=profile, ctx=ctx, driver=driver)
state = await runner.run()
state = await runner.run(max_turns=max_turns)
# Check Outputter configuration
try:
+1 -1
View File
@@ -59,7 +59,7 @@ class ReactiveRunner(BaseRunner):
artemis_ctx = ArtemisContext(
device=DeviceContext(
host_platform=platform.os_type.name,
device_serial=self.driver.device_id,
device_id=self.driver.device_id,
)
)
flash_runner = FlashRunner(