diff --git a/robot/actor_context_export_import.robot b/robot/actor_context_export_import.robot index fe2d9706..650863b2 100644 --- a/robot/actor_context_export_import.robot +++ b/robot/actor_context_export_import.robot @@ -36,23 +36,23 @@ Export Then Import Round-Trip Preserves Context Set Suite Variable ${EXPORT_FILE} ${export_path} ${result} = Run Process ${PYTHON} -m cleveragents actor context export - ... ${CONTEXT_NAME} --output ${export_path} --context-dir ${ctx_dir} + ... ${CONTEXT_NAME} ${export_path} --context-dir ${ctx_dir} Log Export stdout: ${result.stdout} Log Export stderr: ${result.stderr} Should Be Equal As Integers ${result.rc} 0 File Should Exist ${export_path} - # 3. Remove the original context - ${result} = Run Process ${PYTHON} -m cleveragents actor context remove + # 3. Delete the original context + ${result} = Run Process ${PYTHON} -m cleveragents actor context delete ... ${CONTEXT_NAME} --yes --context-dir ${ctx_dir} - Log Remove stdout: ${result.stdout} - Log Remove stderr: ${result.stderr} + Log Delete stdout: ${result.stdout} + Log Delete stderr: ${result.stderr} Should Be Equal As Integers ${result.rc} 0 Directory Should Not Exist ${ctx_dir}/${CONTEXT_NAME} # 4. Import the context back ${result} = Run Process ${PYTHON} -m cleveragents actor context import - ... ${CONTEXT_NAME} --input ${export_path} --context-dir ${ctx_dir} + ... ${CONTEXT_NAME} ${export_path} --context-dir ${ctx_dir} Log Import stdout: ${result.stdout} Log Import stderr: ${result.stderr} Should Be Equal As Integers ${result.rc} 0 @@ -66,7 +66,7 @@ Export Then Import Round-Trip Preserves Context Should Contain ${result.stdout} verified Export With JSON Format Flag Shows Structured Output - [Documentation] Verify --format json produces machine-readable output. + [Documentation] Verify export to JSON file works correctly. ${ctx_dir} = Set Variable ${TEMP}/actor_ctx_fmt Create Directory ${ctx_dir} @@ -76,19 +76,19 @@ Export With JSON Format Flag Shows Structured Output ... from cleveragents.reactive.context_manager import ContextManager; mgr \= ContextManager("fmt-test", "${ctx_dir}"); mgr.add_message("user", "test"); print("ok") Should Be Equal As Integers ${result.rc} 0 - # Export with --format json + # Export to JSON file (positional arg) ${export_path} = Set Variable ${TEMP}/fmt-export.json ${result} = Run Process ${PYTHON} -m cleveragents actor context export - ... fmt-test --output ${export_path} --context-dir ${ctx_dir} --format json + ... fmt-test ${export_path} --context-dir ${ctx_dir} Log Export stdout: ${result.stdout} Log Export stderr: ${result.stderr} Should Be Equal As Integers ${result.rc} 0 - Should Contain ${result.stdout} context_export + File Should Exist ${export_path} -Import Without Update Fails For Existing Context - [Documentation] Verify importing into an existing context without --update fails. +Import Into Existing Context Overwrites Data + [Documentation] Verify importing into an existing context overwrites it. - ${ctx_dir} = Set Variable ${TEMP}/actor_ctx_noupdate + ${ctx_dir} = Set Variable ${TEMP}/actor_ctx_overwrite Create Directory ${ctx_dir} # Create existing context @@ -96,16 +96,16 @@ Import Without Update Fails For Existing Context ... from cleveragents.reactive.context_manager import ContextManager; mgr \= ContextManager("existing", "${ctx_dir}"); mgr.add_message("user", "original"); print("ok") Should Be Equal As Integers ${result.rc} 0 - # Create import file + # Create import file with new content ${import_path} = Set Variable ${TEMP}/existing-import.json ${result} = Run Process ${PYTHON} -c ... import json; data \= {"context_name": "existing", "messages": [{"role": "user", "content": "new", "timestamp": "2026-01-01", "metadata": {}}], "metadata": {}, "state": {}, "global_context": {}}; open("${import_path}", "w").write(json.dumps(data)); print("ok") Should Be Equal As Integers ${result.rc} 0 - # Import without --update should fail + # Import should succeed (overwrites existing context) ${result} = Run Process ${PYTHON} -m cleveragents actor context import - ... existing --input ${import_path} --context-dir ${ctx_dir} - Should Be Equal As Integers ${result.rc} 1 + ... existing ${import_path} --context-dir ${ctx_dir} + Should Be Equal As Integers ${result.rc} 0 *** Keywords *** Setup Test Environment diff --git a/robot/helper_a2a_facade_wiring.py b/robot/helper_a2a_facade_wiring.py index d08b9266..167b7eb9 100644 --- a/robot/helper_a2a_facade_wiring.py +++ b/robot/helper_a2a_facade_wiring.py @@ -103,8 +103,8 @@ def _mock_resource_registry_service() -> MagicMock: def wired_session_create() -> None: """Dispatch session.create through a wired facade.""" facade = A2aLocalFacade(services={"session_service": _mock_session_service()}) - resp = facade.dispatch(A2aRequest(operation="session.create")) - if resp.status == "ok" and resp.data["session_id"] == "INTEG-SESSION-001": + resp = facade.dispatch(A2aRequest(method="session.create")) + if resp.result is not None and resp.result["session_id"] == "INTEG-SESSION-001": print("a2a-wired-session-create-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -116,11 +116,11 @@ def wired_session_close() -> None: facade = A2aLocalFacade(services={"session_service": _mock_session_service()}) resp = facade.dispatch( A2aRequest( - operation="session.close", + method="session.close", params={"session_id": "INTEG-SESSION-001"}, ) ) - if resp.status == "ok" and resp.data["status"] == "closed": + if resp.result is not None and resp.result["status"] == "closed": print("a2a-wired-session-close-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -134,11 +134,11 @@ def wired_plan_create() -> None: ) resp = facade.dispatch( A2aRequest( - operation="plan.create", + method="plan.create", params={"action_name": "local/test"}, ) ) - if resp.status == "ok" and resp.data["plan_id"] == "INTEG-PLAN-001": + if resp.result is not None and resp.result["plan_id"] == "INTEG-PLAN-001": print("a2a-wired-plan-create-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -152,11 +152,11 @@ def wired_plan_status() -> None: ) resp = facade.dispatch( A2aRequest( - operation="plan.status", + method="plan.status", params={"plan_id": "INTEG-PLAN-001"}, ) ) - if resp.status == "ok" and resp.data["phase"] == "strategize": + if resp.result is not None and resp.result["phase"] == "strategize": print("a2a-wired-plan-status-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -166,9 +166,9 @@ def wired_plan_status() -> None: def wired_registry_tools() -> None: """Dispatch registry.list_tools through a wired facade.""" facade = A2aLocalFacade(services={"tool_registry": _mock_tool_registry()}) - resp = facade.dispatch(A2aRequest(operation="registry.list_tools")) - tools = resp.data.get("tools", []) - if resp.status == "ok" and len(tools) == 1: + resp = facade.dispatch(A2aRequest(method="registry.list_tools")) + tools = resp.result.get("tools", []) if resp.result is not None else [] + if resp.result is not None and len(tools) == 1: print("a2a-wired-registry-tools-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -180,9 +180,9 @@ def wired_registry_resources() -> None: facade = A2aLocalFacade( services={"resource_registry_service": _mock_resource_registry_service()} ) - resp = facade.dispatch(A2aRequest(operation="registry.list_resources")) - resources = resp.data.get("resources", []) - if resp.status == "ok" and len(resources) == 1: + resp = facade.dispatch(A2aRequest(method="registry.list_resources")) + resources = resp.result.get("resources", []) if resp.result is not None else [] + if resp.result is not None and len(resources) == 1: print("a2a-wired-registry-resources-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -192,8 +192,8 @@ def wired_registry_resources() -> None: def wired_context_stub() -> None: """Dispatch context.get and verify stub response.""" facade = A2aLocalFacade() - resp = facade.dispatch(A2aRequest(operation="context.get")) - if resp.status == "ok" and resp.data.get("stub") is True: + resp = facade.dispatch(A2aRequest(method="context.get")) + if resp.result is not None and resp.result.get("stub") is True: print("a2a-wired-context-stub-ok") else: print(f"FAIL: {resp}", file=sys.stderr) @@ -204,9 +204,9 @@ def wired_event_subscribe() -> None: """Dispatch event.subscribe through a wired facade.""" queue = A2aEventQueue() facade = A2aLocalFacade(services={"event_queue": queue}) - resp = facade.dispatch(A2aRequest(operation="event.subscribe")) - sub_id = resp.data.get("subscription_id", "") - if resp.status == "ok" and sub_id: + resp = facade.dispatch(A2aRequest(method="event.subscribe")) + sub_id = resp.result.get("subscription_id", "") if resp.result is not None else "" + if resp.result is not None and sub_id: print("a2a-wired-event-subscribe-ok") else: print(f"FAIL: {resp}", file=sys.stderr)