Tests / Test passed: 626
- Host Agent now defaults AI_PLANNER_ENABLED=true (opt-out via env), scoped to apps/device-host-agent/host_agent/execution.py only; the shared runtime.planner_config default (disabled) is unchanged. - Add openspec proposal for cloud-planner-proxy: centralize LLM provider config/credentials on the Cloud Control Plane and let the Host Agent proxy AI Planner decisions through it instead of holding provider API keys locally. Proposal only, no implementation yet.
69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from device.manager import DeviceManager
|
|
from host_agent.execution import create_execution_factories
|
|
from runtime.ai_planner import AIPlanner
|
|
from runtime.planner import Planner
|
|
from runtime.task import TaskRunner
|
|
from workflow.runner import WorkflowRunner
|
|
from workflow.store import WorkflowStore
|
|
|
|
|
|
def test_execution_factories_compose_existing_runtime_and_workflow(tmp_path) -> None:
|
|
manager = DeviceManager()
|
|
workflow_store = WorkflowStore(tmp_path / "workflows.sqlite3")
|
|
|
|
factories = create_execution_factories(
|
|
manager,
|
|
workflow_store=workflow_store,
|
|
)
|
|
task_runner = factories.task_runner_factory()
|
|
workflow_runner = factories.workflow_runner_factory()
|
|
|
|
assert isinstance(task_runner, TaskRunner)
|
|
assert isinstance(workflow_runner, WorkflowRunner)
|
|
assert workflow_runner.store is workflow_store
|
|
assert isinstance(workflow_runner.task_runner_factory(), TaskRunner)
|
|
|
|
|
|
def test_created_task_runner_defaults_to_ai_planner(
|
|
tmp_path, monkeypatch: pytest.MonkeyPatch
|
|
) -> None:
|
|
monkeypatch.delenv("AI_PLANNER_ENABLED", raising=False)
|
|
manager = DeviceManager()
|
|
factories = create_execution_factories(
|
|
manager, workflow_store=WorkflowStore(tmp_path / "workflows.sqlite3")
|
|
)
|
|
|
|
task_runner = factories.task_runner_factory()
|
|
|
|
assert isinstance(task_runner.planner, AIPlanner)
|
|
|
|
|
|
def test_created_task_runner_honors_explicit_ai_planner_opt_out(
|
|
tmp_path, monkeypatch: pytest.MonkeyPatch
|
|
) -> None:
|
|
monkeypatch.setenv("AI_PLANNER_ENABLED", "false")
|
|
manager = DeviceManager()
|
|
factories = create_execution_factories(
|
|
manager, workflow_store=WorkflowStore(tmp_path / "workflows.sqlite3")
|
|
)
|
|
|
|
task_runner = factories.task_runner_factory()
|
|
|
|
assert type(task_runner.planner) is Planner
|
|
|
|
|
|
def test_runtime_owned_packages_do_not_import_host_or_cloud_concerns() -> None:
|
|
root = Path(__file__).resolve().parents[3]
|
|
forbidden = ("import cloud", "from cloud", "import host_agent", "from host_agent")
|
|
|
|
for package in ("core", "device", "driver", "runtime", "tools"):
|
|
for path in (root / package).rglob("*.py"):
|
|
source = path.read_text(encoding="utf-8")
|
|
assert not any(token in source for token in forbidden), path
|