{
  "file": "F33-sdk-remote-client.md",
  "bullet": "Join a run during a long tool call (`F33.conversation-run-join-long-tool`), known bug.",
  "ids": [
    "F33.conversation-run-join-long-tool"
  ],
  "line": 1398,
  "script": "control-agent-server exec --env PYTHONPATH=\"$F33\" --save F33.conversation-run-join-long-tool/probe -- .venv/bin/python - <<'PY'\nimport os\nimport threading\nimport time\nimport f33\nfrom openhands.sdk import Conversation\nfrom openhands.sdk.conversation.exceptions import ConversationRunError\nfrom openhands.sdk.event import ActionEvent\n\nacted = threading.Event()\nstub = f33.agent(model=\"openai/qa-stub\", base_url=os.environ[\"LONG_STUB\"] + \"/v1\", api_key=\"qa-stub\", num_retries=0)\nconv = Conversation(agent=stub, workspace=f33.workspace(\"longtool\"), visualizer=None, delete_on_close=False,\n                    callbacks=[lambda e: isinstance(e, ActionEvent) and e.tool_name == \"terminal\" and acted.set()])\nconv.set_title(\"qa-f33 long tool\")\nconv.send_message(\"qa-f33 long tool call\")\nconv.run(blocking=False)\nassert acted.wait(60), \"no terminal ActionEvent\"\nt0 = time.monotonic()\ntry:\n    conv.run(timeout=300)\n    error = None\nexcept ConversationRunError as e:\n    error = repr(e.original_exception)\nstatus = conv.state.execution_status.value\nf33.emit(\"longtool\", cid=str(conv.id), waited=round(time.monotonic() - t0, 1), error=error, status=status,\n         joined=error is None and status == \"finished\")\nconv.close()\nPY\nLONG=$(jq -r .cid \"$F33/longtool.json\")\ncontrol-agent-server conversation wait \"$LONG\" --until finished --timeout 120\ntest \"$(cat \"$F33/longtool/qa-f33-long.txt\")\" = late\ncontrol-agent-server conversation events \"$LONG\" --kinds ActionEvent --contains '\"timeout\": 90.0' --expect-count 1\ncontrol-agent-server api GET \"<redacted:session-cookie>/$LONG\" --check execution_status eq finished --save F33.conversation-run-join-long-tool/get\ntest \"$(jq .joined \"$F33/longtool.json\")\" = true  # bug\n",
  "exit_code": 1,
  "elapsed_ms": 55742,
  "failed_line": 34,
  "failed_command": "test \"$(jq .joined \"$F33/longtool.json\")\" = true",
  "stdout": "{\n  \"ok\": true,\n  \"exit_code\": 0,\n  \"elapsed_ms\": 43488,\n  \"stdout_tail\": \"{\\\"cid\\\": \\\"2f647462-4749-450d-a576-59b29a96d9eb\\\", \\\"error\\\": \\\"ReadTimeout('timed out')\\\", \\\"joined\\\": false, \\\"status\\\": \\\"running\\\", \\\"waited\\\": 30.0}\\n\",\n  \"stderr_tail\": \"[10/13/26 03:53:07] INFO     run() triggered         remote_conversation.py:1335\\n                             successfully: <Response                            \\n                             [200 OK]>                                          \\n[10/13/26 03:53:37] ERROR    Request failed: timed    remote_conversation.py:144\\n                             out                                                \\n\",\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-034709-4e02-map-f33/evidence/F33.conversation-run-join-long-tool/probe.json\"\n}\n{\n  \"id\": \"2f647462-4749-450d-a576-59b29a96d9eb\",\n  \"ok\": true,\n  \"status\": \"finished\",\n  \"transitions\": [\n    \"running\",\n    \"finished\"\n  ],\n  \"waited_ms\": 9474\n}\n{\n  \"ok\": true,\n  \"id\": \"2f647462-4749-450d-a576-59b29a96d9eb\",\n  \"total\": 11,\n  \"kinds\": {\n    \"SystemPromptEvent\": 1,\n    \"MessageEvent\": 1,\n    \"ConversationStateUpdateEvent\": 5,\n    \"ActionEvent\": 2,\n    \"ObservationEvent\": 2\n  },\n  \"matching\": 1,\n  \"events\": [\n    {\n      \"id\": \"7413879a-c5e6-4f96-be11-9d149fb6f76f\",\n      \"kind\": \"ActionEvent\",\n      \"source\": \"agent\",\n      \"timestamp\": \"2026-10-13T03:53:07.542396\",\n      \"tool_name\": \"terminal\",\n      \"action\": \"{\\\"command\\\": \\\"sleep 45; printf late > qa-f33-long.txt\\\", \\\"is_input\\\": false, \\\"timeout\\\": 90.0, \\\"reset\\\": false, \\\"kind\\\": \\\"TerminalAction\\\"}\"\n    }\n  ]\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"GET\",\n    \"path\": \"<redacted:session-cookie>/2f647462-4749-450d-a576-59b29a96d9eb\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": null,\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"4590\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": {\n      \"id\": \"2f647462-4749-450d-a576-59b29a96d9eb\",\n      \"workspace\": {\n        \"working_dir\": \"/workspace/verification-artifacts/runs/20261013-034709-4e02-map-f33/fixtures/qa-f33/longtool\",\n        \"kind\": \"LocalWorkspace\"\n      },\n      \"persistence_dir\": \"/workspace/verification-artifacts/runs/20261013-034709-4e02-map-f33/server/workspace/conversations/2f6474624749450da57659b29a96d9eb\",\n      \"max_iterations\": 500,\n      \"stuck_detection\": true,\n      \"execution_status\": \"finished\",\n      \"confirmation_policy\": {\n        \"kind\": \"NeverConfirm\"\n      },\n      \"security_analyzer\": null,\n      \"activated_knowledge_skills\": [],\n      \"invoked_skills\": [],\n      \"blocked_actions\": {},\n      \"blocked_messages\": {},\n      \"last_user_message_id\": \"17bef409-7db2-4d88-b875-c0d18af2d3eb\",\n      \"leaf_event_id\": \"ee2361e4-bafe-4d4b-aedf-1648d58157dc\",\n      \"stats\": {\n        \"usage_to_metrics\": {\n          \"qa-f33\": {\n            \"model_name\": \"openai/qa-stub\",\n            \"accumulated_cost\": 0.0,\n            \"max_budget_per_task\": null,\n            \"accumulated_token_usage\": {\n              \"model\": \"openai/qa-stub\",\n              \"prompt_tokens\": 20,\n              \"completion_tokens\": 10,\n              \"cache_read_tokens\": 0,\n              \"cache_write_tokens\": 0,\n              \"reasoning_tokens\": 0,\n              \"context_window\": 0,\n              \"per_turn_token\": 15,\n              \"response_id\": \"\"\n            },\n            \"costs\": [],\n            \"response_latencies\": [\n              {\n                \"model\": \"openai/qa-stub\",\n                \"latency\": 0.03370094299316406,\n                \"response_id\": \"chatcmpl-qa-5b32f093\"\n              },\n              {\n                \"model\": \"openai/qa-stub\",\n                \"latency\": 0.014586687088012695,\n                \"response_id\": \"chatcmpl-qa-8fe3da93\"\n              }\n            ],\n            \"token_usages\": [\n              {\n                \"model\": \"openai/qa-stub\",\n                \"prompt_tokens\": 10,\n                \"completion_tokens\": 5,\n                \"cache_read_tokens\": 0,\n                \"cache_write_tokens\": 0,\n                \"reasoning_tokens\": 0,\n                \"context_window\": 0,\n                \"per_turn_token\": 15,\n                \"response_id\": \"chatcmpl-qa-5b32f093\"\n              },\n              {\n                \"model\": \"openai/qa-stub\",\n                \"prompt_tokens\": 10,\n                \"completion_tokens\": 5,\n                \"cache_read_tokens\": 0,\n                \"cache_write_tokens\": 0,\n                \"reasoning_tokens\": 0,\n                \"context_window\": 0,\n                \"per_turn_token\": 15,\n                \"response_id\": \"chatcmpl-qa-8fe3da93\"\n              }\n            ]\n          }\n        }\n      },\n      \"secret_registry\": {\n        \"secret_sources\": {}\n      },\n      \"agent_state\": {},\n      \"hook_config\": null,\n      \"title\": \"qa-f33 long tool\",\n      \"metrics\": null,\n      \"created_at\": \"2026-10-13T03:53:06.341579Z\",\n      \"updated_at\": \"2026-10-13T03:53:53.674306Z\",\n      \"forked_from_conversation_id\": null,\n      \"forked_from_event_id\": null,\n      \"parent_conversation_id\": null,\n      \"sub_conversation_ids\": [],\n      \"tags\": {},\n      \"current_model_id\": null,\n      \"available_models\": [],\n      \"supports_runtime_model_switch\": false,\n      \"launched_agent_profile\": null,\n      \"agent\": {\n        \"llm\": {\n          \"model\": \"openai/qa-stub\",\n          \"api_key\": null,\n          \"provider_connection_id\": null,\n          \"auth_type\": \"api_key\",\n          \"subscription_vendor\": null,\n          \"base_url\": \"http://127.0.0.1:43177/v1\",\n          \"api_version\": null,\n          \"aws_access_key_id\": null,\n          \"aws_secret_access_key\": null,\n          \"aws_session_token\": null,\n          \"aws_region_name\": null,\n          \"aws_profile_name\": null,\n          \"aws_role_name\": null,\n          \"aws_session_name\": null,\n          \"aws_bedrock_runtime_endpoint\": null,\n          \"openrouter_site_url\": \"https://docs.all-hands.dev/\",\n          \"openrouter_app_name\": \"OpenHands\",\n          \"num_retries\": 0,\n          \"retry_multiplier\": 8.0,\n          \"retry_min_wait\": 8,\n          \"retry_max_wait\": 64,\n          \"timeout\": 300,\n          \"stream_idle_timeout\": 300.0,\n          \"max_message_chars\": 30000,\n          \"temperature\": null,\n          \"top_p\": null,\n          \"top_k\": null,\n          \"max_input_tokens\": null,\n          \"max_output_tokens\": null,\n          \"model_canonical_name\": null,\n          \"api_mode\": \"auto\",\n          \"capability_overrides\": {},\n          \"extra_headers\": null,\n          \"input_cost_per_token\": null,\n          \"output_cost_per_token\": null,\n          \"ollama_base_url\": null,\n          \"stream\": false,\n          \"drop_params\": true,\n          \"disable_vision\": null,\n          \"disable_stop_word\": false,\n          \"caching_prompt\": true,\n          \"log_completions\": false,\n          \"log_completions_folder\": \"logs/completions\",\n          \"custom_tokenizer\": null,\n          \"native_tool_calling\": true,\n          \"force_string_serializer\": null,\n          \"inline_image_urls\": null,\n          \"reasoning_effort\": \"high\",\n          \"reasoning_summary\": null,\n          \"enable_encrypted_reasoning\": true,\n          \"prompt_cache_retention\": \"24h\",\n          \"extended_thinking_budget\": 200000,\n          \"seed\": null,\n          \"usage_id\": \"qa-f33\",\n          \"litellm_extra_body\": {},\n          \"is_subscription\": false\n        },\n        \"tools\": [\n          {\n            \"name\": \"terminal\",\n            \"params\": {}\n          }\n        ],\n        \"mcp_config\": {},\n        \"filter_tools_regex\": null,\n        \"include_default_tools\": [\n          \"FinishTool\",\n          \"ThinkTool\"\n        ],\n        \"agent_context\": null,\n        \"system_prompt\": null,\n        \"system_prompt_filename\": \"system_prompt.j2\",\n        \"security_policy_filename\": \"security_policy.j2\",\n        \"system_prompt_kwargs\": {\n          \"llm_security_analyzer\": true\n        },\n        \"condenser\": null,\n        \"critic\": null,\n        \"tool_concurrency_limit\": 1,\n        \"persona\": null,\n        \"kind\": \"Agent\"\n      },\n      \"client_tools\": [],\n      \"tool_module_qualnames\": {\n        \"ClassifyAndSwitchLLMTool\": \"openhands.sdk.tool.builtins.classify_and_switch_llm\",\n        \"ask_oracle\": \"openhands.tools.ask_oracle.definition\",\n        \"file_editor\": \"openhands.tools.file_editor.definition\",\n        \"task_tool_set\": \"openhands.tools.task.definition\",\n        \"task\": \"openhands.tools.task.definition\",\n        \"task_tracker\": \"openhands.tools.task_tracker.definition\",\n        \"terminal\": \"openhands.tools.terminal.definition\",\n        \"workflow_tool_set\": \"openhands.tools.workflow.definition\",\n        \"workflow\": \"openhands.tools.workflow.definition\"\n      },\n      \"runtime_info\": {\n        \"runtime_status\": \"available\",\n        \"can_resume\": true,\n        \"runtime_error\": null\n      }\n    },\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 98,\n  \"checks\": [\n    {\n      \"check\": \"execution_status eq finished\",\n      \"ok\": true,\n      \"actual\": \"finished\"\n    }\n  ],\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-034709-4e02-map-f33/evidence/F33.conversation-run-join-long-tool/get.json\"\n}\n",
  "stderr": ""
}
