{
  "file": "F33-sdk-remote-client.md",
  "bullet": "An agent tool the server cannot import (`F33.custom-tool-module-unimportable`), known bug.",
  "ids": [
    "F33.custom-tool-module-unimportable"
  ],
  "line": 1902,
  "script": "control-agent-server exec --env PYTHONPATH=\"$F33:$F33/clientonly\" --save F33.custom-tool-module-unimportable/probe -- .venv/bin/python - <<'PY'\nimport httpx\nimport f33\nimport qa_f33_ghost  # noqa: F401\nfrom openhands.sdk import Conversation, Tool\n\nagent = f33.agent()\nagent = agent.model_copy(update={\"tools\": [*agent.tools, Tool(name=\"qa_f33_ghost\")]})\nstatuses, cid = {}, None\ntry:\n    conv = Conversation(agent=agent, workspace=f33.workspace(\"ghost\"), visualizer=None, delete_on_close=False)\n    statuses[\"create\"], cid = 201, str(conv.id)\n    try:\n        conv.send_message(\"Reply with one word: ready\")\n        statuses[\"message\"] = 200\n    except httpx.HTTPStatusError as e:\n        statuses[\"message\"] = e.response.status_code\n    conv.close()\nexcept httpx.HTTPStatusError as e:\n    statuses[\"create\"] = e.response.status_code\nf33.emit(\"ghost\", cid=cid, statuses=statuses, server_errors=sum(s >= 500 for s in statuses.values()))\nPY\ncontrol-agent-server api GET /api/tools/ --check . contains terminal --check . not-contains qa_f33_ghost\ntest \"$(jq .server_errors \"$F33/ghost.json\")\" -eq 0  # bug\n",
  "exit_code": 1,
  "elapsed_ms": 10361,
  "failed_line": 24,
  "failed_command": "test \"$(jq .server_errors \"$F33/ghost.json\")\" -eq 0",
  "stdout": "{\n  \"ok\": true,\n  \"exit_code\": 0,\n  \"elapsed_ms\": 9789,\n  \"stdout_tail\": \"{\\\"cid\\\": \\\"c56f63a2-c1a6-4296-bc89-167b849f7622\\\", \\\"server_errors\\\": 1, \\\"statuses\\\": {\\\"create\\\": 201, \\\"message\\\": 500}}\\n\",\n  \"stderr_tail\": \"   \\u2502   error \\u2502                           \\n                             \\u2502    828 \\u2502   \\u2502   messa \\u2502                           \\n                             \\u2502 \\u2771  829 \\u2502   \\u2502   raise \\u2502                           \\n                             \\u2502    830 \\u2502             \\u2502                           \\n                             \\u2502    831 \\u2502   def json( \\u2502                           \\n                             \\u2502    832 \\u2502   \\u2502   retur \\u2502                           \\n                             \\u2570\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u256f                           \\n                             HTTPStatusError: Server                            \\n                             error '500 Internal                                \\n                             Server Error' for url                              \\n                             'http://127.0.0.1:52495/                           \\n                             api/conversations/c56f63                           \\n                             a2-c1a6-4296-bc89-167b84                           \\n                             9f7622/events'                                     \\n                             For more information                               \\n                             check:                                             \\n                             https://developer.mozill                           \\n                             a.org/en-US/docs/Web/HTT                           \\n                             P/Status/500                                       \\n\",\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-034709-4e02-map-f33/evidence/F33.custom-tool-module-unimportable/probe.json\"\n}\n{\n  \"ok\": true,\n  \"status\": 200,\n  \"request\": {\n    \"method\": \"GET\",\n    \"path\": \"/api/tools/\",\n    \"query\": [],\n    \"auth\": \"header\",\n    \"body\": null,\n    \"files\": []\n  },\n  \"response\": {\n    \"status\": 200,\n    \"headers\": {\n      \"content-length\": \"254\",\n      \"content-type\": \"application/json\"\n    },\n    \"body\": [\n      \"ClassifyAndSwitchLLMTool\",\n      \"ask_oracle\",\n      \"file_editor\",\n      \"task_tool_set\",\n      \"task\",\n      \"task_tracker\",\n      \"terminal\",\n      \"workflow_tool_set\",\n      \"workflow\",\n      \"browser_tool_set\",\n      \"edit\",\n      \"list_directory\",\n      \"read_file\",\n      \"write_file\",\n      \"glob\",\n      \"grep\",\n      \"planning_file_editor\",\n      \"qa_f33_echo\"\n    ],\n    \"truncated\": false\n  },\n  \"elapsed_ms\": 50,\n  \"checks\": [\n    {\n      \"check\": \". contains terminal\",\n      \"ok\": true,\n      \"actual\": \"[\\\"ClassifyAndSwitchLLMTool\\\", \\\"ask_oracle\\\", \\\"file_editor\\\", \\\"task_tool_set\\\", \\\"task\\\", \\\"task_tracker\\\", \\\"terminal\\\", \\\"workflow_tool_set\\\", \\\"workflow\\\", \\\"browser_tool_set\\\", \\\"edit\\\", \\\"list_directory\\\", \\\"read_file\\u2026\"\n    },\n    {\n      \"check\": \". not-contains qa_f33_ghost\",\n      \"ok\": true,\n      \"actual\": \"[\\\"ClassifyAndSwitchLLMTool\\\", \\\"ask_oracle\\\", \\\"file_editor\\\", \\\"task_tool_set\\\", \\\"task\\\", \\\"task_tracker\\\", \\\"terminal\\\", \\\"workflow_tool_set\\\", \\\"workflow\\\", \\\"browser_tool_set\\\", \\\"edit\\\", \\\"list_directory\\\", \\\"read_file\\u2026\"\n    }\n  ]\n}\n",
  "stderr": ""
}
