feat: prepare 2.2.0 with UI and execution fixes
Add dark theme, richer Markdown and readable plugin results. Improve Android input evidence, response integrity and diagnostics. Unify lifecycle, guidance receipts and evidence sources across clients. Keep direct action dispatch without an added AI quota approval layer. Align version metadata at 2.2.0 and bundle Helper 1.2.2. Validation: 3063 backend tests before the version bump; 44 after. Frontend: 317 tests and production build passed.
This commit is contained in:
1 parent
83bcfd54d5
commit
fac4ccb760
146 files changed
+5689
-2033
No files matched your search
@@ -271,6 +271,63 @@ async def test_receipt_disk_failure_preserves_successful_write_result(monkeypatc
|
||||
assert outcome.side_effect != "none"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_write_popup_source_updates_cached_observation_target():
|
||||
runtime = PluginRuntime.__new__(PluginRuntime)
|
||||
runtime.ctx = None
|
||||
runtime.bindings = {
|
||||
"write": ("visual-test", Tool(name="write", inputSchema={"type": "object"}))
|
||||
}
|
||||
runtime.packages = {
|
||||
"visual-test": (
|
||||
manifest(
|
||||
capabilities={
|
||||
"kind": "visual",
|
||||
"tools": {
|
||||
"observe": {
|
||||
"effect": "read",
|
||||
"observation": True,
|
||||
"target_argument": "window_id",
|
||||
},
|
||||
"write": {"effect": "write", "target_argument": "window_id"},
|
||||
},
|
||||
}
|
||||
),
|
||||
SimpleNamespace(argument_constraints={}, secrets={}),
|
||||
None,
|
||||
)
|
||||
}
|
||||
runtime.sessions = {
|
||||
"visual-test": SimpleNamespace(
|
||||
call=AsyncMock(
|
||||
return_value=CallToolResult(
|
||||
content=[ImageContent(type="image", mimeType="image/png", data="aW1hZ2U=")],
|
||||
structuredContent={
|
||||
"artemis": {
|
||||
"version": 1,
|
||||
"execution": "completed",
|
||||
"source": {"kind": "computer", "target_id": "123"},
|
||||
}
|
||||
},
|
||||
)
|
||||
),
|
||||
stop_uncertain=False,
|
||||
)
|
||||
}
|
||||
runtime.ensure_resources_ready = lambda: None
|
||||
runtime._image_targets = {}
|
||||
runtime.last_images = {}
|
||||
runtime._observation_calls = {"visual-test": ("observe", {"pid": 7, "window_id": 10})}
|
||||
runtime._recordings = None
|
||||
first = await runtime.call("write", {"pid": 7, "window_id": 10})
|
||||
assert first.status == "success"
|
||||
assert first.pre_image_valid is False
|
||||
assert runtime._image_targets["visual-test"][0] == "123"
|
||||
assert runtime._observation_calls["visual-test"] == ("observe", {"pid": 7, "window_id": 123})
|
||||
second = await runtime.call("write", {"pid": 7, "window_id": 123})
|
||||
assert second.pre_image_valid is True
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_v2_observation_without_task_context_never_starts_recording(monkeypatch):
|
||||
runtime = PluginRuntime.__new__(PluginRuntime)
|
||||
|
||||
Reference in new issue
Block a user