harmonyrun 0.4.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. harmonyrun-0.4.9/.claude/plans/0-1-0-src-harmonyrun-staged-scroll.md +129 -0
  2. harmonyrun-0.4.9/.claude/plans/01-/344/272/221/347/253/257/346/234/215/345/212/241/345/231/250/347/273/217/346/234/254/345/234/260/344/270/255/350/275/254/350/256/277/351/227/256/347/234/237/346/234/272-/342/200/224-/345/217/257/350/241/214/346/200/247/345/210/206/346/236/220.md +420 -0
  3. harmonyrun-0.4.9/.claude/plans/02-DroidRun-/344/272/244/344/272/222/345/274/217-Agent/357/274/232ACP-/345/205/274/345/256/271/346/234/215/345/212/241.md +319 -0
  4. harmonyrun-0.4.9/.claude/plans/03-/345/244/232/350/256/276/345/244/207/345/234/272/346/231/257/344/270/213-Socket-/350/277/236/346/216/245/347/250/263/345/256/232/346/200/247/345/210/206/346/236/220.md +173 -0
  5. harmonyrun-0.4.9/.claude/plans/04-droidrunhdcutils-/351/207/215/346/236/204/346/226/271/346/241/210.md +656 -0
  6. harmonyrun-0.4.9/.claude/plans/05-droidrunconfig_manager-/351/207/215/346/236/204/344/270/216/347/273/237/344/270/200/345/214/226/346/226/271/346/241/210.md +735 -0
  7. harmonyrun-0.4.9/.claude/plans/06-tools/347/233/256/345/275/225/351/207/215/346/236/204/350/256/241/345/210/222---/346/210/252/345/233/276/344/270/216a11y/345/244/204/347/220/206/347/273/237/344/270/200/345/214/226.md +1317 -0
  8. harmonyrun-0.4.9/.claude/plans/07-Traces-/350/256/260/345/275/225/347/263/273/347/273/237/351/207/215/346/236/204/350/256/241/345/210/222.md +2290 -0
  9. harmonyrun-0.4.9/.claude/plans/08-/345/210/240/351/231/244-credential_manager-/346/250/241/345/235/227/350/256/241/345/210/222.md +91 -0
  10. harmonyrun-0.4.9/.claude/plans/09-droidrunagent-/344/273/243/347/240/201/346/236/266/346/236/204/344/274/230/345/214/226/345/210/206/346/236/220.md +253 -0
  11. harmonyrun-0.4.9/.claude/plans/10-/351/207/215/346/236/204-droidrunconfig_manager.md +249 -0
  12. harmonyrun-0.4.9/.claude/plans/11-droidruntraces-/346/250/241/345/235/227/344/274/230/345/214/226/350/256/241/345/210/222.md +160 -0
  13. harmonyrun-0.4.9/.claude/plans/12-droidruntools-/346/250/241/345/235/227/346/236/266/346/236/204/346/242/263/347/220/206/344/270/216/344/274/230/345/214/226/345/273/272/350/256/256.md +267 -0
  14. harmonyrun-0.4.9/.claude/plans/13-Agent-/346/250/241/345/235/227/351/207/215/346/236/204/357/274/232/345/215/217/350/256/256/345/210/207/346/215/242-+-/346/236/266/346/236/204/345/210/206/345/261/202-+-/350/201/214/350/264/243/344/270/213/346/262/211.md +271 -0
  15. harmonyrun-0.4.9/.claude/plans/14-droidrunbatch-/346/250/241/345/235/227/357/274/232/346/236/266/346/236/204/346/242/263/347/220/206-+-/347/233/256/345/275/225/351/207/215/347/273/204-+-/345/215/225/346/265/213/350/241/245/345/205/250.md +513 -0
  16. harmonyrun-0.4.9/.claude/plans/15-/346/204/237/347/237/245/346/250/241/345/274/217/345/274/200/345/205/263/357/274/232a11y--screenshot--both-/344/270/211/347/247/215-UI-/344/270/212/346/212/245/346/250/241/345/274/217.md +217 -0
  17. harmonyrun-0.4.9/.claude/plans/16-Flutter-Scroll(Text)-/345/234/272/346/231/257/357/274/232/351/230/273/346/255/242-wrapper-/346/212/212-tight-bounds-Text-/345/220/210/345/271/266/344/270/212/346/235/245.md +427 -0
  18. harmonyrun-0.4.9/.claude/plans/17-DroidRun-/345/210/207/346/215/242-cache-friendly-/346/266/210/346/201/257/346/236/204/351/200/240/346/226/271/346/241/210.md +323 -0
  19. harmonyrun-0.4.9/.claude/plans/18-/345/257/271/345/244/226/345/274/200/346/224/276/350/203/275/345/212/233/346/226/271/346/241/210-/342/200/224-CLI--MCP--Skill-/351/200/211/345/236/213.md +889 -0
  20. harmonyrun-0.4.9/.claude/plans/19-llamaindex-/342/206/222-LangGraph-/350/277/201/347/247/273/345/217/257/350/241/214/346/200/247.md +229 -0
  21. harmonyrun-0.4.9/.claude/plans/20-DroidRun-/342/206/222-HarmonyRun-/351/207/215/345/221/275/345/220/215/346/224/271/345/212/250/346/242/263/347/220/206.md +169 -0
  22. harmonyrun-0.4.9/.claude/plans/21-HarmonyRun-/351/205/215/347/275/256/347/263/273/347/273/237/351/207/215/346/236/204/350/256/241/345/210/222.md +501 -0
  23. harmonyrun-0.4.9/.claude/plans/22-Prompt-/345/256/214/345/205/250-Python-/345/214/226/357/274/210/345/210/240-jinja2--/345/210/240-PromptLoader--/345/210/240-ChatPromptTemplate-/345/214/205/350/243/205/357/274/211.md +985 -0
  24. harmonyrun-0.4.9/.claude/plans/23-HarmonyRun-/350/277/234/347/250/213/347/234/237/346/234/272/347/276/244/346/216/247-v1-/345/256/236/347/216/260/346/226/271/346/241/210/357/274/210/347/213/254/347/253/213/346/250/241/345/235/227/347/211/210/357/274/211.md +709 -0
  25. harmonyrun-0.4.9/.claude/plans/24-App-Cards-/350/207/252/345/212/250/346/224/266/351/233/206/344/270/216/344/274/230/345/214/226.md +277 -0
  26. harmonyrun-0.4.9/.claude/plans/27-a11y-/346/240/221/357/274/232/347/263/273/347/273/237/345/261/202-UI-/345/215/240/344/275/215/350/212/202/347/202/271/345/214/226/357/274/210StatusBar--NavBar--Capsule/357/274/211.md +198 -0
  27. harmonyrun-0.4.9/.claude/plans/28-/345/212/240/345/233/272-HilogMonitor/357/274/232/350/256/251-hilog-toast-/347/233/221/345/220/254/344/270/215/345/206/215/344/270/242/346/227/245/345/277/227.md +266 -0
  28. harmonyrun-0.4.9/.claude/plans/29-HarmonyRun-harness-/344/270/211/351/241/271/346/225/264/346/224/271/357/274/210/345/237/272/344/272/216/347/234/237/345/256/236/350/256/276/345/244/207/346/225/260/346/215/256/345/244/215/346/240/270/357/274/211.md +214 -0
  29. harmonyrun-0.4.9/.claude/plans/90-hdc-0123-x7-hdc-shell-hidumper-sorted-biscuit.md +74 -0
  30. harmonyrun-0.4.9/.claude/plans/a11y-agent-androidworld-adv-cosmic-elephant.md +99 -0
  31. harmonyrun-0.4.9/.claude/plans/agent-events-tender-moth.md +126 -0
  32. harmonyrun-0.4.9/.claude/plans/agent-expressive-hamming.md +92 -0
  33. harmonyrun-0.4.9/.claude/plans/base-utils-common-agent-agent-curried-teapot.md +120 -0
  34. harmonyrun-0.4.9/.claude/plans/bug-bug-moonlit-gizmo.md +295 -0
  35. harmonyrun-0.4.9/.claude/plans/cache-twinkling-spring.md +144 -0
  36. harmonyrun-0.4.9/.claude/plans/claude-claude-typed-tulip.md +84 -0
  37. harmonyrun-0.4.9/.claude/plans/claude-plans-agent-expressive-hamming-m-iridescent-tide.md +94 -0
  38. harmonyrun-0.4.9/.claude/plans/config-yaml-config-harmonyrun-config-ya-expressive-koala.md +242 -0
  39. harmonyrun-0.4.9/.claude/plans/dom-hdc-agent-ai-agent-config-yaml-a11y-immutable-canyon.md +309 -0
  40. harmonyrun-0.4.9/.claude/plans/droidrun-agent-agile-sprout.md +299 -0
  41. harmonyrun-0.4.9/.claude/plans/droidrun-agent-xml-llm-toolscall-xml-typed-metcalfe.md +256 -0
  42. harmonyrun-0.4.9/.claude/plans/droidrun-batch-abundant-ladybug.md +290 -0
  43. harmonyrun-0.4.9/.claude/plans/droidrun-config-manager-calm-seal.md +234 -0
  44. harmonyrun-0.4.9/.claude/plans/droidrun-config-manager-test-mellow-rabbit.md +361 -0
  45. harmonyrun-0.4.9/.claude/plans/droidrun-harmonyrun-harmonyrun-abstract-marshmallow.md +154 -0
  46. harmonyrun-0.4.9/.claude/plans/droidrun-hdcutils-clean-code-transient-wigderson.md +406 -0
  47. harmonyrun-0.4.9/.claude/plans/droidrun-tools-a11y-eager-fiddle.md +252 -0
  48. harmonyrun-0.4.9/.claude/plans/droidrun-traces-nifty-frost.md +145 -0
  49. harmonyrun-0.4.9/.claude/plans/evals-batch-agent-harmonyrun-agent-eval-polymorphic-lake.md +311 -0
  50. harmonyrun-0.4.9/.claude/plans/evals-data-testsuite-jiggly-scone.md +127 -0
  51. harmonyrun-0.4.9/.claude/plans/event-agent-event-shimmering-garden.md +123 -0
  52. harmonyrun-0.4.9/.claude/plans/events-agents-events-render-cli-zesty-music.md +81 -0
  53. harmonyrun-0.4.9/.claude/plans/farm-trace-spicy-fog.md +157 -0
  54. harmonyrun-0.4.9/.claude/plans/fast-agent-user-message-step-splendid-shell.md +115 -0
  55. harmonyrun-0.4.9/.claude/plans/gui-agent-agent-calm-locket.md +157 -0
  56. harmonyrun-0.4.9/.claude/plans/harmonyrun-harmonyrun-evals-harmonyrun-sleepy-blossom.md +147 -0
  57. harmonyrun-0.4.9/.claude/plans/harmonyrun-llm-agent-proud-floyd.md +155 -0
  58. harmonyrun-0.4.9/.claude/plans/hdcutils-graceful-meteor.md +156 -0
  59. harmonyrun-0.4.9/.claude/plans/https-github-com-core-mate-opengui-https-sorted-wirth.md +131 -0
  60. harmonyrun-0.4.9/.claude/plans/inspect-ai-ethereal-comet.md +305 -0
  61. harmonyrun-0.4.9/.claude/plans/inspect-ai-inspect-ai-agent-federated-axolotl.md +430 -0
  62. harmonyrun-0.4.9/.claude/plans/iridescent-skipping-aho.md +700 -0
  63. harmonyrun-0.4.9/.claude/plans/l0-l1-functional-sparkle-agent-a520bd165802283ba.md +349 -0
  64. harmonyrun-0.4.9/.claude/plans/l0-l1-functional-sparkle.md +171 -0
  65. harmonyrun-0.4.9/.claude/plans/linux-harmonyrun-harmonyrun-10-harmonyr-sleepy-stonebraker.md +245 -0
  66. harmonyrun-0.4.9/.claude/plans/mellow-noodling-mochi.md +88 -0
  67. harmonyrun-0.4.9/.claude/plans/p0-1-synthetic-wirth.md +242 -0
  68. harmonyrun-0.4.9/.claude/plans/prancy-forging-patterson.md +289 -0
  69. harmonyrun-0.4.9/.claude/plans/quirky-discovering-pumpkin.md +104 -0
  70. harmonyrun-0.4.9/.claude/plans/run-valiant-scroll.md +169 -0
  71. harmonyrun-0.4.9/.claude/plans/scalable-shimmying-fairy.md +184 -0
  72. harmonyrun-0.4.9/.claude/plans/spicy-leaping-sutherland.md +130 -0
  73. harmonyrun-0.4.9/.claude/plans/tc-app-alliance-013-test-goal-test-effervescent-mccarthy.md +244 -0
  74. harmonyrun-0.4.9/.claude/plans/trajectories-trajectories-data-driver-tingly-otter.md +105 -0
  75. harmonyrun-0.4.9/.claude/plans/tranquil-wandering-corbato.md +111 -0
  76. harmonyrun-0.4.9/.claude/plans/user-cozy-noodle.md +96 -0
  77. harmonyrun-0.4.9/.claude/settings.json +55 -0
  78. harmonyrun-0.4.9/.claude/skills/docs-sync/SKILL.md +73 -0
  79. harmonyrun-0.4.9/.claude/skills/sync-test-suite-schema/SKILL.md +58 -0
  80. harmonyrun-0.4.9/.dockerignore +5 -0
  81. harmonyrun-0.4.9/.github/CODEOWNERS +16 -0
  82. harmonyrun-0.4.9/.github/ISSUE_TEMPLATE/test-feedback.yml +103 -0
  83. harmonyrun-0.4.9/.github/PULL_REQUEST_TEMPLATE.md +18 -0
  84. harmonyrun-0.4.9/.github/workflows/ci.yml +44 -0
  85. harmonyrun-0.4.9/.github/workflows/claude-analyze.yml +73 -0
  86. harmonyrun-0.4.9/.github/workflows/claude-on-feedback.yml +226 -0
  87. harmonyrun-0.4.9/.github/workflows/claude-review.yml +67 -0
  88. harmonyrun-0.4.9/.github/workflows/claude.yml +73 -0
  89. harmonyrun-0.4.9/.github/workflows/docs-check.yml +18 -0
  90. harmonyrun-0.4.9/.github/workflows/release.yml +95 -0
  91. harmonyrun-0.4.9/.gitignore +59 -0
  92. harmonyrun-0.4.9/.gitmodules +3 -0
  93. harmonyrun-0.4.9/.pre-commit-config.yaml +28 -0
  94. harmonyrun-0.4.9/.python-version +1 -0
  95. harmonyrun-0.4.9/CHANGELOG.md +199 -0
  96. harmonyrun-0.4.9/CLAUDE.md +332 -0
  97. harmonyrun-0.4.9/CONTRIBUTING.md +244 -0
  98. harmonyrun-0.4.9/Dockerfile +28 -0
  99. harmonyrun-0.4.9/LICENSE +21 -0
  100. harmonyrun-0.4.9/MANIFEST.in +7 -0
  101. harmonyrun-0.4.9/PKG-INFO +401 -0
  102. harmonyrun-0.4.9/README.md +342 -0
  103. harmonyrun-0.4.9/TODO.md +84 -0
  104. harmonyrun-0.4.9/docs/CLI/344/275/277/347/224/250/350/257/264/346/230/216.md +862 -0
  105. harmonyrun-0.4.9/docs/Inspect_AI/344/273/213/347/273/215.md +582 -0
  106. harmonyrun-0.4.9/docs/MCP/345/267/245/345/205/267/345/217/202/350/200/203.md +352 -0
  107. harmonyrun-0.4.9/docs/SDK/344/275/277/347/224/250/350/257/264/346/230/216.md +396 -0
  108. harmonyrun-0.4.9/docs/blog/0000.png +0 -0
  109. harmonyrun-0.4.9/docs/blog/HarmonyRun/350/203/275/345/212/233/344/273/213/347/273/215.md +363 -0
  110. harmonyrun-0.4.9/docs/blog/image-1.png +0 -0
  111. harmonyrun-0.4.9/docs/blog/image.png +0 -0
  112. harmonyrun-0.4.9/docs/examples/01_minimal_sdk.py +47 -0
  113. harmonyrun-0.4.9/docs/examples/02_custom_prompts.py +72 -0
  114. harmonyrun-0.4.9/docs/examples/03_batch_with_report.py +82 -0
  115. harmonyrun-0.4.9/docs/examples/README.md +33 -0
  116. harmonyrun-0.4.9/docs//345/256/211/350/243/205/344/270/216/345/205/274/345/256/271/347/237/251/351/230/265.md +470 -0
  117. harmonyrun-0.4.9/docs//345/272/224/347/224/250/345/215/241/347/211/207.md +144 -0
  118. harmonyrun-0.4.9/docs//346/236/266/346/236/204/346/246/202/350/247/210.md +467 -0
  119. harmonyrun-0.4.9/docs//346/265/213/350/257/225/345/245/227/344/273/266Schema.md +361 -0
  120. harmonyrun-0.4.9/docs//350/257/204/346/265/213/345/245/227/344/273/266/344/275/277/347/224/250/350/257/264/346/230/216.md +459 -0
  121. harmonyrun-0.4.9/evals/.gitignore +10 -0
  122. harmonyrun-0.4.9/evals/CLAUDE.md +367 -0
  123. harmonyrun-0.4.9/evals/README.md +369 -0
  124. harmonyrun-0.4.9/evals/pyproject.toml +45 -0
  125. harmonyrun-0.4.9/evals/pyrightconfig.json +9 -0
  126. harmonyrun-0.4.9/evals/src/harmonyrun_evals/__init__.py +87 -0
  127. harmonyrun-0.4.9/evals/src/harmonyrun_evals/cli.py +408 -0
  128. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/__init__.py +16 -0
  129. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/efficiency.py +71 -0
  130. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/judge.py +71 -0
  131. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/loader.py +450 -0
  132. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/manifest.py +658 -0
  133. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/metrics.py +33 -0
  134. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/models.py +231 -0
  135. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/schemas/task.schema.json +207 -0
  136. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/solver.py +45 -0
  137. harmonyrun-0.4.9/evals/src/harmonyrun_evals/common/state_provider.py +12 -0
  138. harmonyrun-0.4.9/evals/src/harmonyrun_evals/live/__init__.py +16 -0
  139. harmonyrun-0.4.9/evals/src/harmonyrun_evals/live/expectation_match.py +165 -0
  140. harmonyrun-0.4.9/evals/src/harmonyrun_evals/live/outcome_check.py +198 -0
  141. harmonyrun-0.4.9/evals/src/harmonyrun_evals/live/solver.py +247 -0
  142. harmonyrun-0.4.9/evals/src/harmonyrun_evals/live/task.py +89 -0
  143. harmonyrun-0.4.9/evals/src/harmonyrun_evals/reports/__init__.py +18 -0
  144. harmonyrun-0.4.9/evals/src/harmonyrun_evals/reports/glossary.py +212 -0
  145. harmonyrun-0.4.9/evals/src/harmonyrun_evals/reports/patcher.py +140 -0
  146. harmonyrun-0.4.9/evals/src/harmonyrun_evals/reports/serve.py +100 -0
  147. harmonyrun-0.4.9/evals/src/harmonyrun_evals/single_step/__init__.py +14 -0
  148. harmonyrun-0.4.9/evals/src/harmonyrun_evals/single_step/driver.py +247 -0
  149. harmonyrun-0.4.9/evals/src/harmonyrun_evals/single_step/element_match.py +129 -0
  150. harmonyrun-0.4.9/evals/src/harmonyrun_evals/single_step/scorer.py +172 -0
  151. harmonyrun-0.4.9/evals/src/harmonyrun_evals/single_step/solver.py +205 -0
  152. harmonyrun-0.4.9/evals/src/harmonyrun_evals/single_step/task.py +41 -0
  153. harmonyrun-0.4.9/evals/tests/__init__.py +0 -0
  154. harmonyrun-0.4.9/evals/tests/conftest.py +23 -0
  155. harmonyrun-0.4.9/evals/tests/fixtures/grounding_minimal/observations/0.a11y.json +43 -0
  156. harmonyrun-0.4.9/evals/tests/fixtures/grounding_minimal/observations/0.jpeg +0 -0
  157. harmonyrun-0.4.9/evals/tests/fixtures/grounding_minimal/task.yaml +15 -0
  158. harmonyrun-0.4.9/evals/tests/fixtures/live_case_source/app_card.md +5 -0
  159. harmonyrun-0.4.9/evals/tests/fixtures/live_case_source/suite.json +19 -0
  160. harmonyrun-0.4.9/evals/tests/fixtures/live_case_source/task.yaml +15 -0
  161. harmonyrun-0.4.9/evals/tests/fixtures/live_minimal/task.yaml +17 -0
  162. harmonyrun-0.4.9/evals/tests/unit/__init__.py +0 -0
  163. harmonyrun-0.4.9/evals/tests/unit/test_drivers.py +79 -0
  164. harmonyrun-0.4.9/evals/tests/unit/test_element_match.py +40 -0
  165. harmonyrun-0.4.9/evals/tests/unit/test_live_loader.py +94 -0
  166. harmonyrun-0.4.9/evals/tests/unit/test_live_tape.py +65 -0
  167. harmonyrun-0.4.9/evals/tests/unit/test_loader.py +132 -0
  168. harmonyrun-0.4.9/evals/tests/unit/test_manifest.py +428 -0
  169. harmonyrun-0.4.9/evals/tests/unit/test_models.py +325 -0
  170. harmonyrun-0.4.9/evals/tests/unit/test_scorers.py +374 -0
  171. harmonyrun-0.4.9/evals/tests/unit/test_view_patcher.py +72 -0
  172. harmonyrun-0.4.9/pyproject.toml +149 -0
  173. harmonyrun-0.4.9/pyrightconfig.json +38 -0
  174. harmonyrun-0.4.9/scripts/bench_a11y_backends.py +235 -0
  175. harmonyrun-0.4.9/scripts/bench_dump_layout.py +236 -0
  176. harmonyrun-0.4.9/scripts/bench_snapshot.py +263 -0
  177. harmonyrun-0.4.9/scripts/build_release_docs_zip.py +54 -0
  178. harmonyrun-0.4.9/scripts/diagnose_uitest_socket.py +1741 -0
  179. harmonyrun-0.4.9/scripts/docs_hint_for_edit.py +173 -0
  180. harmonyrun-0.4.9/scripts/docs_lint_allowlist.toml +25 -0
  181. harmonyrun-0.4.9/scripts/dump_layout.sh +147 -0
  182. harmonyrun-0.4.9/scripts/extract_changelog.py +44 -0
  183. harmonyrun-0.4.9/scripts/lint_docs.py +859 -0
  184. harmonyrun-0.4.9/scripts/lint_layers.py +565 -0
  185. harmonyrun-0.4.9/scripts/package.sh +92 -0
  186. harmonyrun-0.4.9/scripts/release.py +612 -0
  187. harmonyrun-0.4.9/scripts/release_user_docs.txt +19 -0
  188. harmonyrun-0.4.9/scripts/replay_rejudge.py +840 -0
  189. harmonyrun-0.4.9/scripts/replay_variants/__init__.py +202 -0
  190. harmonyrun-0.4.9/scripts/run_xlsx_eval.py +598 -0
  191. harmonyrun-0.4.9/scripts/server.java +852 -0
  192. harmonyrun-0.4.9/scripts/smoke_app_catalog.py +48 -0
  193. harmonyrun-0.4.9/scripts/smoke_fastagent.py +208 -0
  194. harmonyrun-0.4.9/scripts/smoke_rotation_display.py +74 -0
  195. harmonyrun-0.4.9/scripts/verify_prompt_cache.py +260 -0
  196. harmonyrun-0.4.9/scripts/verify_real_scenario_cache.py +542 -0
  197. harmonyrun-0.4.9/skills/harmonyrun.md +91 -0
  198. harmonyrun-0.4.9/src/harmonyrun/__init__.py +186 -0
  199. harmonyrun-0.4.9/src/harmonyrun/__main__.py +8 -0
  200. harmonyrun-0.4.9/src/harmonyrun/agent/__init__.py +5 -0
  201. harmonyrun-0.4.9/src/harmonyrun/agent/events/__init__.py +18 -0
  202. harmonyrun-0.4.9/src/harmonyrun/agent/events/_render.py +258 -0
  203. harmonyrun-0.4.9/src/harmonyrun/agent/events/handler.py +36 -0
  204. harmonyrun-0.4.9/src/harmonyrun/agent/events/render_registry.py +41 -0
  205. harmonyrun-0.4.9/src/harmonyrun/agent/execution/__init__.py +27 -0
  206. harmonyrun-0.4.9/src/harmonyrun/agent/execution/anti_loop.py +410 -0
  207. harmonyrun-0.4.9/src/harmonyrun/agent/execution/base_agent.py +991 -0
  208. harmonyrun-0.4.9/src/harmonyrun/agent/execution/failure_classifier.py +332 -0
  209. harmonyrun-0.4.9/src/harmonyrun/agent/execution/formatting.py +23 -0
  210. harmonyrun-0.4.9/src/harmonyrun/agent/execution/handle.py +124 -0
  211. harmonyrun-0.4.9/src/harmonyrun/agent/execution/interventions.py +89 -0
  212. harmonyrun-0.4.9/src/harmonyrun/agent/execution/thresholds.py +99 -0
  213. harmonyrun-0.4.9/src/harmonyrun/agent/fast_agent/__init__.py +3 -0
  214. harmonyrun-0.4.9/src/harmonyrun/agent/fast_agent/fast_agent.py +972 -0
  215. harmonyrun-0.4.9/src/harmonyrun/agent/harmony/__init__.py +29 -0
  216. harmonyrun-0.4.9/src/harmonyrun/agent/harmony/harmony_agent.py +1413 -0
  217. harmonyrun-0.4.9/src/harmonyrun/agent/harmony/resources.py +10 -0
  218. harmonyrun-0.4.9/src/harmonyrun/agent/harmony/services.py +358 -0
  219. harmonyrun-0.4.9/src/harmonyrun/agent/llm/__init__.py +70 -0
  220. harmonyrun-0.4.9/src/harmonyrun/agent/llm/cache.py +72 -0
  221. harmonyrun-0.4.9/src/harmonyrun/agent/llm/inference.py +359 -0
  222. harmonyrun-0.4.9/src/harmonyrun/agent/llm/introspect.py +36 -0
  223. harmonyrun-0.4.9/src/harmonyrun/agent/llm/loader.py +274 -0
  224. harmonyrun-0.4.9/src/harmonyrun/agent/llm/messages.py +144 -0
  225. harmonyrun-0.4.9/src/harmonyrun/agent/llm/picker.py +253 -0
  226. harmonyrun-0.4.9/src/harmonyrun/agent/llm/usage.py +203 -0
  227. harmonyrun-0.4.9/src/harmonyrun/agent/manager/__init__.py +9 -0
  228. harmonyrun-0.4.9/src/harmonyrun/agent/manager/base_manager.py +215 -0
  229. harmonyrun-0.4.9/src/harmonyrun/agent/manager/executor_agent.py +409 -0
  230. harmonyrun-0.4.9/src/harmonyrun/agent/manager/manager_agent.py +487 -0
  231. harmonyrun-0.4.9/src/harmonyrun/agent/memory/__init__.py +56 -0
  232. harmonyrun-0.4.9/src/harmonyrun/agent/memory/distiller.py +164 -0
  233. harmonyrun-0.4.9/src/harmonyrun/agent/memory/keys.py +21 -0
  234. harmonyrun-0.4.9/src/harmonyrun/agent/memory/models.py +108 -0
  235. harmonyrun-0.4.9/src/harmonyrun/agent/memory/recall.py +39 -0
  236. harmonyrun-0.4.9/src/harmonyrun/agent/memory/store.py +158 -0
  237. harmonyrun-0.4.9/src/harmonyrun/agent/oneflows/__init__.py +11 -0
  238. harmonyrun-0.4.9/src/harmonyrun/agent/oneflows/app_matcher.py +85 -0
  239. harmonyrun-0.4.9/src/harmonyrun/agent/oneflows/app_starter_workflow.py +177 -0
  240. harmonyrun-0.4.9/src/harmonyrun/agent/oneflows/structured_output_agent.py +80 -0
  241. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/__init__.py +114 -0
  242. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/_env.py +45 -0
  243. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/constants.py +60 -0
  244. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/packing.py +367 -0
  245. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/resolver.py +68 -0
  246. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/state_user.py +402 -0
  247. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/system/__init__.py +27 -0
  248. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/system/executor.py +44 -0
  249. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/system/fast_agent.py +64 -0
  250. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/system/manager.py +194 -0
  251. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/executor/README.md +39 -0
  252. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/executor/system.en.j2 +63 -0
  253. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/executor/system.zh.j2 +63 -0
  254. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/executor/user.en.j2 +75 -0
  255. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/executor/user.zh.j2 +75 -0
  256. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/fast_agent/README.md +53 -0
  257. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/fast_agent/system.en.j2 +157 -0
  258. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/fast_agent/system.zh.j2 +156 -0
  259. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/manager/README.md +26 -0
  260. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/manager/system.en.j2 +164 -0
  261. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/templates/manager/system.zh.j2 +164 -0
  262. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/__init__.py +53 -0
  263. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/delta_trail.py +182 -0
  264. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/device_state.py +306 -0
  265. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/executor_user.py +57 -0
  266. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/goal.py +142 -0
  267. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/history.py +162 -0
  268. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/labels.py +24 -0
  269. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/next_step.py +32 -0
  270. harmonyrun-0.4.9/src/harmonyrun/agent/prompt/user_blocks/task_plan.py +50 -0
  271. harmonyrun-0.4.9/src/harmonyrun/agent/state/__init__.py +72 -0
  272. harmonyrun-0.4.9/src/harmonyrun/agent/state/flow_states.py +85 -0
  273. harmonyrun-0.4.9/src/harmonyrun/agent/state/observations.py +202 -0
  274. harmonyrun-0.4.9/src/harmonyrun/agent/state/state.py +402 -0
  275. harmonyrun-0.4.9/src/harmonyrun/agent/state/state_components.py +204 -0
  276. harmonyrun-0.4.9/src/harmonyrun/agent/tools/__init__.py +49 -0
  277. harmonyrun-0.4.9/src/harmonyrun/agent/tools/actions.py +653 -0
  278. harmonyrun-0.4.9/src/harmonyrun/agent/tools/context.py +44 -0
  279. harmonyrun-0.4.9/src/harmonyrun/agent/tools/dispatcher.py +85 -0
  280. harmonyrun-0.4.9/src/harmonyrun/agent/tools/gestures.py +120 -0
  281. harmonyrun-0.4.9/src/harmonyrun/agent/tools/registry.py +501 -0
  282. harmonyrun-0.4.9/src/harmonyrun/agent/tools/result.py +16 -0
  283. harmonyrun-0.4.9/src/harmonyrun/agent/tools/schemas.py +276 -0
  284. harmonyrun-0.4.9/src/harmonyrun/app_cards/__init__.py +55 -0
  285. harmonyrun-0.4.9/src/harmonyrun/app_cards/app_card_provider.py +26 -0
  286. harmonyrun-0.4.9/src/harmonyrun/app_cards/loading.py +69 -0
  287. harmonyrun-0.4.9/src/harmonyrun/app_cards/provider_factory.py +60 -0
  288. harmonyrun-0.4.9/src/harmonyrun/app_cards/providers/__init__.py +7 -0
  289. harmonyrun-0.4.9/src/harmonyrun/app_cards/providers/composite_provider.py +104 -0
  290. harmonyrun-0.4.9/src/harmonyrun/app_cards/providers/local_provider.py +113 -0
  291. harmonyrun-0.4.9/src/harmonyrun/app_cards/providers/server_provider.py +120 -0
  292. harmonyrun-0.4.9/src/harmonyrun/app_cards/suite_resolve.py +112 -0
  293. harmonyrun-0.4.9/src/harmonyrun/app_cards/writing.py +74 -0
  294. harmonyrun-0.4.9/src/harmonyrun/batch/__init__.py +49 -0
  295. harmonyrun-0.4.9/src/harmonyrun/batch/execution/__init__.py +34 -0
  296. harmonyrun-0.4.9/src/harmonyrun/batch/execution/device_gate.py +73 -0
  297. harmonyrun-0.4.9/src/harmonyrun/batch/execution/driver_factory.py +60 -0
  298. harmonyrun-0.4.9/src/harmonyrun/batch/execution/phase.py +152 -0
  299. harmonyrun-0.4.9/src/harmonyrun/batch/execution/resources.py +169 -0
  300. harmonyrun-0.4.9/src/harmonyrun/batch/execution/runner.py +687 -0
  301. harmonyrun-0.4.9/src/harmonyrun/batch/execution/scheduler.py +159 -0
  302. harmonyrun-0.4.9/src/harmonyrun/batch/loading/__init__.py +29 -0
  303. harmonyrun-0.4.9/src/harmonyrun/batch/loading/levels.py +23 -0
  304. harmonyrun-0.4.9/src/harmonyrun/batch/loading/loader.py +285 -0
  305. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/README.md +29 -0
  306. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/__init__.py +114 -0
  307. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/agent_goal/en.j2 +22 -0
  308. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/agent_goal/zh.j2 +23 -0
  309. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/postcondition/en.j2 +8 -0
  310. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/postcondition/zh.j2 +8 -0
  311. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/precondition/en.j2 +8 -0
  312. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/precondition/zh.j2 +8 -0
  313. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/test_execution/en.j2 +13 -0
  314. harmonyrun-0.4.9/src/harmonyrun/batch/loading/prompts/test_execution/zh.j2 +13 -0
  315. harmonyrun-0.4.9/src/harmonyrun/batch/loading/validation.py +60 -0
  316. harmonyrun-0.4.9/src/harmonyrun/batch/models.py +149 -0
  317. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/__init__.py +49 -0
  318. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/_common.py +26 -0
  319. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/html_report.py +84 -0
  320. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/json_report.py +97 -0
  321. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/live.py +323 -0
  322. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/paths.py +37 -0
  323. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/templates/report.html +1191 -0
  324. harmonyrun-0.4.9/src/harmonyrun/batch/reporting/viewer.py +309 -0
  325. harmonyrun-0.4.9/src/harmonyrun/batch/schemas/report.schema.json +123 -0
  326. harmonyrun-0.4.9/src/harmonyrun/batch/schemas/test_suite.schema.json +129 -0
  327. harmonyrun-0.4.9/src/harmonyrun/batch/suite_runner.py +487 -0
  328. harmonyrun-0.4.9/src/harmonyrun/cli/__init__.py +9 -0
  329. harmonyrun-0.4.9/src/harmonyrun/cli/_capture.py +202 -0
  330. harmonyrun-0.4.9/src/harmonyrun/cli/_logging.py +21 -0
  331. harmonyrun-0.4.9/src/harmonyrun/cli/_runtime.py +55 -0
  332. harmonyrun-0.4.9/src/harmonyrun/cli/feedback.py +60 -0
  333. harmonyrun-0.4.9/src/harmonyrun/cli/main.py +332 -0
  334. harmonyrun-0.4.9/src/harmonyrun/cli/mcp.py +219 -0
  335. harmonyrun-0.4.9/src/harmonyrun/cli/memory_cmd.py +145 -0
  336. harmonyrun-0.4.9/src/harmonyrun/cli/run.py +150 -0
  337. harmonyrun-0.4.9/src/harmonyrun/cli/view.py +37 -0
  338. harmonyrun-0.4.9/src/harmonyrun/config/__init__.py +88 -0
  339. harmonyrun-0.4.9/src/harmonyrun/config/config_example.yaml +96 -0
  340. harmonyrun-0.4.9/src/harmonyrun/config/manager.py +322 -0
  341. harmonyrun-0.4.9/src/harmonyrun/config/paths.py +66 -0
  342. harmonyrun-0.4.9/src/harmonyrun/config/schema/__init__.py +32 -0
  343. harmonyrun-0.4.9/src/harmonyrun/config/schema/agent.py +182 -0
  344. harmonyrun-0.4.9/src/harmonyrun/config/schema/llm.py +28 -0
  345. harmonyrun-0.4.9/src/harmonyrun/config/schema/mcp.py +18 -0
  346. harmonyrun-0.4.9/src/harmonyrun/config/schema/overrides.py +262 -0
  347. harmonyrun-0.4.9/src/harmonyrun/config/schema/root.py +247 -0
  348. harmonyrun-0.4.9/src/harmonyrun/config/schema/runtime.py +121 -0
  349. harmonyrun-0.4.9/src/harmonyrun/diagnostics/__init__.py +13 -0
  350. harmonyrun-0.4.9/src/harmonyrun/diagnostics/checks.py +498 -0
  351. harmonyrun-0.4.9/src/harmonyrun/diagnostics/results.py +64 -0
  352. harmonyrun-0.4.9/src/harmonyrun/diagnostics/runner.py +130 -0
  353. harmonyrun-0.4.9/src/harmonyrun/env_keys.py +80 -0
  354. harmonyrun-0.4.9/src/harmonyrun/events/__init__.py +34 -0
  355. harmonyrun-0.4.9/src/harmonyrun/events/bus.py +83 -0
  356. harmonyrun-0.4.9/src/harmonyrun/events/model/__init__.py +122 -0
  357. harmonyrun-0.4.9/src/harmonyrun/events/model/agent.py +378 -0
  358. harmonyrun-0.4.9/src/harmonyrun/events/model/base.py +73 -0
  359. harmonyrun-0.4.9/src/harmonyrun/events/model/catalog.py +32 -0
  360. harmonyrun-0.4.9/src/harmonyrun/events/model/device.py +129 -0
  361. harmonyrun-0.4.9/src/harmonyrun/events/model/llm.py +53 -0
  362. harmonyrun-0.4.9/src/harmonyrun/events/transports/__init__.py +15 -0
  363. harmonyrun-0.4.9/src/harmonyrun/events/transports/langgraph.py +85 -0
  364. harmonyrun-0.4.9/src/harmonyrun/farm/CLAUDE.md +280 -0
  365. harmonyrun-0.4.9/src/harmonyrun/farm/__init__.py +27 -0
  366. harmonyrun-0.4.9/src/harmonyrun/farm/_bootstrap.py +38 -0
  367. harmonyrun-0.4.9/src/harmonyrun/farm/cli.py +397 -0
  368. harmonyrun-0.4.9/src/harmonyrun/farm/endpoint.py +36 -0
  369. harmonyrun-0.4.9/src/harmonyrun/farm/remote_driver.py +426 -0
  370. harmonyrun-0.4.9/src/harmonyrun/farm/server/__init__.py +3 -0
  371. harmonyrun-0.4.9/src/harmonyrun/farm/server/app.py +266 -0
  372. harmonyrun-0.4.9/src/harmonyrun/farm/server/archive.py +141 -0
  373. harmonyrun-0.4.9/src/harmonyrun/farm/server/auth.py +41 -0
  374. harmonyrun-0.4.9/src/harmonyrun/farm/server/dispatch.py +155 -0
  375. harmonyrun-0.4.9/src/harmonyrun/farm/server/pool.py +168 -0
  376. harmonyrun-0.4.9/src/harmonyrun/farm/server/schemas.py +70 -0
  377. harmonyrun-0.4.9/src/harmonyrun/farm/server/session.py +206 -0
  378. harmonyrun-0.4.9/src/harmonyrun/feedback/__init__.py +13 -0
  379. harmonyrun-0.4.9/src/harmonyrun/feedback/context.py +19 -0
  380. harmonyrun-0.4.9/src/harmonyrun/feedback/discovery.py +85 -0
  381. harmonyrun-0.4.9/src/harmonyrun/feedback/flow.py +111 -0
  382. harmonyrun-0.4.9/src/harmonyrun/feedback/github.py +224 -0
  383. harmonyrun-0.4.9/src/harmonyrun/feedback/issue.py +109 -0
  384. harmonyrun-0.4.9/src/harmonyrun/feedback/packaging.py +76 -0
  385. harmonyrun-0.4.9/src/harmonyrun/hdcutils/__init__.py +52 -0
  386. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/__init__.py +37 -0
  387. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/diagnostic.py +82 -0
  388. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/installer.py +189 -0
  389. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/spec.py +166 -0
  390. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/uitest_agent_1.1.12.so +0 -0
  391. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/uitest_agent_1.1.3.so +0 -0
  392. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/uitest_agent_1.1.5.so +0 -0
  393. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/uitest_agent_1.2.3.so +0 -0
  394. harmonyrun-0.4.9/src/harmonyrun/hdcutils/agent/uitest_agent_x86_1.1.9.so +0 -0
  395. harmonyrun-0.4.9/src/harmonyrun/hdcutils/client.py +108 -0
  396. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/__init__.py +3 -0
  397. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/apps.py +391 -0
  398. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/core.py +181 -0
  399. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/display.py +219 -0
  400. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/display_state.py +589 -0
  401. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/files.py +54 -0
  402. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/forwards.py +90 -0
  403. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/input.py +99 -0
  404. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/recording.py +337 -0
  405. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/screen.py +376 -0
  406. harmonyrun-0.4.9/src/harmonyrun/hdcutils/device/system.py +82 -0
  407. harmonyrun-0.4.9/src/harmonyrun/hdcutils/emulator/__init__.py +25 -0
  408. harmonyrun-0.4.9/src/harmonyrun/hdcutils/emulator/scenario.py +297 -0
  409. harmonyrun-0.4.9/src/harmonyrun/hdcutils/errors.py +41 -0
  410. harmonyrun-0.4.9/src/harmonyrun/hdcutils/hilog.py +441 -0
  411. harmonyrun-0.4.9/src/harmonyrun/hdcutils/keycode.py +361 -0
  412. harmonyrun-0.4.9/src/harmonyrun/hdcutils/rpc/__init__.py +5 -0
  413. harmonyrun-0.4.9/src/harmonyrun/hdcutils/rpc/client.py +462 -0
  414. harmonyrun-0.4.9/src/harmonyrun/hdcutils/rpc/framing.py +103 -0
  415. harmonyrun-0.4.9/src/harmonyrun/hdcutils/rpc/recovery.py +114 -0
  416. harmonyrun-0.4.9/src/harmonyrun/hdcutils/transport/__init__.py +23 -0
  417. harmonyrun-0.4.9/src/harmonyrun/hdcutils/transport/ports.py +128 -0
  418. harmonyrun-0.4.9/src/harmonyrun/hdcutils/transport/recording.py +93 -0
  419. harmonyrun-0.4.9/src/harmonyrun/hdcutils/transport/runner.py +204 -0
  420. harmonyrun-0.4.9/src/harmonyrun/hdcutils/types.py +43 -0
  421. harmonyrun-0.4.9/src/harmonyrun/hdcutils/version.py +12 -0
  422. harmonyrun-0.4.9/src/harmonyrun/hdcutils/wake.py +258 -0
  423. harmonyrun-0.4.9/src/harmonyrun/hypium/__init__.py +12 -0
  424. harmonyrun-0.4.9/src/harmonyrun/hypium/action_mapper.py +159 -0
  425. harmonyrun-0.4.9/src/harmonyrun/hypium/assertion_builder.py +280 -0
  426. harmonyrun-0.4.9/src/harmonyrun/hypium/cli.py +140 -0
  427. harmonyrun-0.4.9/src/harmonyrun/hypium/code_polisher.py +203 -0
  428. harmonyrun-0.4.9/src/harmonyrun/hypium/component_resolver.py +221 -0
  429. harmonyrun-0.4.9/src/harmonyrun/hypium/generator.py +306 -0
  430. harmonyrun-0.4.9/src/harmonyrun/hypium/template.py +157 -0
  431. harmonyrun-0.4.9/src/harmonyrun/hypium/trajectory_loader.py +280 -0
  432. harmonyrun-0.4.9/src/harmonyrun/log_handlers.py +68 -0
  433. harmonyrun-0.4.9/src/harmonyrun/mcp/__init__.py +28 -0
  434. harmonyrun-0.4.9/src/harmonyrun/mcp/schemas.py +107 -0
  435. harmonyrun-0.4.9/src/harmonyrun/mcp/server.py +96 -0
  436. harmonyrun-0.4.9/src/harmonyrun/mcp/session.py +124 -0
  437. harmonyrun-0.4.9/src/harmonyrun/mcp/tools/__init__.py +5 -0
  438. harmonyrun-0.4.9/src/harmonyrun/mcp/tools/actions.py +218 -0
  439. harmonyrun-0.4.9/src/harmonyrun/mcp/tools/connection.py +62 -0
  440. harmonyrun-0.4.9/src/harmonyrun/mcp/tools/perception.py +233 -0
  441. harmonyrun-0.4.9/src/harmonyrun/mcp/transport.py +19 -0
  442. harmonyrun-0.4.9/src/harmonyrun/tools/__init__.py +79 -0
  443. harmonyrun-0.4.9/src/harmonyrun/tools/contracts.py +39 -0
  444. harmonyrun-0.4.9/src/harmonyrun/tools/driver/__init__.py +25 -0
  445. harmonyrun-0.4.9/src/harmonyrun/tools/driver/app_catalog.py +113 -0
  446. harmonyrun-0.4.9/src/harmonyrun/tools/driver/base.py +362 -0
  447. harmonyrun-0.4.9/src/harmonyrun/tools/driver/factory.py +82 -0
  448. harmonyrun-0.4.9/src/harmonyrun/tools/driver/harmony.py +1185 -0
  449. harmonyrun-0.4.9/src/harmonyrun/tools/driver/perceiving.py +89 -0
  450. harmonyrun-0.4.9/src/harmonyrun/tools/driver/proxy.py +228 -0
  451. harmonyrun-0.4.9/src/harmonyrun/tools/driver/recording.py +603 -0
  452. harmonyrun-0.4.9/src/harmonyrun/tools/driver/stealth.py +217 -0
  453. harmonyrun-0.4.9/src/harmonyrun/tools/monitors/__init__.py +26 -0
  454. harmonyrun-0.4.9/src/harmonyrun/tools/monitors/hilog_monitor.py +463 -0
  455. harmonyrun-0.4.9/src/harmonyrun/tools/monitors/screen_recorder.py +208 -0
  456. harmonyrun-0.4.9/src/harmonyrun/tools/perception/__init__.py +59 -0
  457. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/__init__.py +68 -0
  458. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/bundle_serde.py +139 -0
  459. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/constants.py +54 -0
  460. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/converters/__init__.py +5 -0
  461. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/converters/a11y_converter.py +116 -0
  462. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/extractors/__init__.py +5 -0
  463. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/extractors/nav_state.py +232 -0
  464. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/extractors/phone_state.py +399 -0
  465. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/filters/__init__.py +40 -0
  466. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/filters/base.py +24 -0
  467. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/filters/concise_filter.py +123 -0
  468. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/filters/detailed_filter.py +173 -0
  469. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/filters/passthrough_filter.py +23 -0
  470. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/formatters/__init__.py +10 -0
  471. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/formatters/base.py +39 -0
  472. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/formatters/indexed_formatter.py +941 -0
  473. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/pipeline.py +137 -0
  474. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/simplifiers/__init__.py +20 -0
  475. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/simplifiers/highlight_marker.py +58 -0
  476. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/simplifiers/system_ui_pruner.py +171 -0
  477. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/simplifiers/tree_simplifier.py +227 -0
  478. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/utils/__init__.py +42 -0
  479. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/utils/coordinate.py +25 -0
  480. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/utils/geometry.py +148 -0
  481. harmonyrun-0.4.9/src/harmonyrun/tools/perception/processors/utils/semantic.py +58 -0
  482. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/__init__.py +47 -0
  483. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/config.py +80 -0
  484. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/offline.py +140 -0
  485. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/provider.py +341 -0
  486. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/screenshot.py +272 -0
  487. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/snapshot.py +178 -0
  488. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/state.py +261 -0
  489. harmonyrun-0.4.9/src/harmonyrun/tools/perception/ui/stealth_state.py +106 -0
  490. harmonyrun-0.4.9/src/harmonyrun/traces/__init__.py +50 -0
  491. harmonyrun-0.4.9/src/harmonyrun/traces/case_report.py +274 -0
  492. harmonyrun-0.4.9/src/harmonyrun/traces/folder.py +221 -0
  493. harmonyrun-0.4.9/src/harmonyrun/traces/format.py +33 -0
  494. harmonyrun-0.4.9/src/harmonyrun/traces/llm_log.py +212 -0
  495. harmonyrun-0.4.9/src/harmonyrun/traces/recorder.py +293 -0
  496. harmonyrun-0.4.9/src/harmonyrun/traces/serializers.py +138 -0
  497. harmonyrun-0.4.9/src/harmonyrun/traces/sinks.py +60 -0
  498. harmonyrun-0.4.9/src/harmonyrun/traces/telemetry/__init__.py +22 -0
  499. harmonyrun-0.4.9/src/harmonyrun/traces/telemetry/tracker.py +180 -0
  500. harmonyrun-0.4.9/src/harmonyrun/traces/templates/case_report.html +1908 -0
  501. harmonyrun-0.4.9/src/harmonyrun/traces/writer.py +309 -0
  502. harmonyrun-0.4.9/tests/__init__.py +0 -0
  503. harmonyrun-0.4.9/tests/conftest.py +30 -0
  504. harmonyrun-0.4.9/tests/integration/__init__.py +0 -0
  505. harmonyrun-0.4.9/tests/integration/farm/__init__.py +0 -0
  506. harmonyrun-0.4.9/tests/integration/farm/test_server.py +208 -0
  507. harmonyrun-0.4.9/tests/integration/hdcutils/__init__.py +0 -0
  508. harmonyrun-0.4.9/tests/integration/hdcutils/conftest.py +111 -0
  509. harmonyrun-0.4.9/tests/integration/hdcutils/test_agent.py +126 -0
  510. harmonyrun-0.4.9/tests/integration/hdcutils/test_apps.py +157 -0
  511. harmonyrun-0.4.9/tests/integration/hdcutils/test_client.py +68 -0
  512. harmonyrun-0.4.9/tests/integration/hdcutils/test_device_core.py +107 -0
  513. harmonyrun-0.4.9/tests/integration/hdcutils/test_display.py +144 -0
  514. harmonyrun-0.4.9/tests/integration/hdcutils/test_files.py +104 -0
  515. harmonyrun-0.4.9/tests/integration/hdcutils/test_forwards.py +74 -0
  516. harmonyrun-0.4.9/tests/integration/hdcutils/test_hilog.py +220 -0
  517. harmonyrun-0.4.9/tests/integration/hdcutils/test_input.py +119 -0
  518. harmonyrun-0.4.9/tests/integration/hdcutils/test_recording.py +122 -0
  519. harmonyrun-0.4.9/tests/integration/hdcutils/test_rpc.py +119 -0
  520. harmonyrun-0.4.9/tests/integration/hdcutils/test_screen.py +73 -0
  521. harmonyrun-0.4.9/tests/integration/hdcutils/test_system.py +70 -0
  522. harmonyrun-0.4.9/tests/integration/hdcutils/test_transport.py +239 -0
  523. harmonyrun-0.4.9/tests/integration/hdcutils/test_ui_modes.py +162 -0
  524. harmonyrun-0.4.9/tests/integration/hdcutils/test_wake.py +102 -0
  525. harmonyrun-0.4.9/tests/integration/mcp/__init__.py +0 -0
  526. harmonyrun-0.4.9/tests/integration/mcp/conftest.py +91 -0
  527. harmonyrun-0.4.9/tests/integration/mcp/test_roundtrip.py +115 -0
  528. harmonyrun-0.4.9/tests/integration/mcp/test_zero_config.py +91 -0
  529. harmonyrun-0.4.9/tests/integration/test_agent_pipeline.py +613 -0
  530. harmonyrun-0.4.9/tests/integration/test_executor_pipeline.py +281 -0
  531. harmonyrun-0.4.9/tests/integration/test_run_command.py +546 -0
  532. harmonyrun-0.4.9/tests/integration/test_test_command.py +587 -0
  533. harmonyrun-0.4.9/tests/unit/__init__.py +0 -0
  534. harmonyrun-0.4.9/tests/unit/agent/__init__.py +0 -0
  535. harmonyrun-0.4.9/tests/unit/agent/droid/__init__.py +0 -0
  536. harmonyrun-0.4.9/tests/unit/agent/droid/test_services.py +384 -0
  537. harmonyrun-0.4.9/tests/unit/agent/droid/test_stagnation_state.py +48 -0
  538. harmonyrun-0.4.9/tests/unit/agent/events/__init__.py +0 -0
  539. harmonyrun-0.4.9/tests/unit/agent/events/test_handler_render.py +252 -0
  540. harmonyrun-0.4.9/tests/unit/agent/execution/__init__.py +0 -0
  541. harmonyrun-0.4.9/tests/unit/agent/execution/test_execution_agent.py +344 -0
  542. harmonyrun-0.4.9/tests/unit/agent/execution/test_failure_classifier.py +328 -0
  543. harmonyrun-0.4.9/tests/unit/agent/execution/test_handle_nested_events.py +74 -0
  544. harmonyrun-0.4.9/tests/unit/agent/execution/test_stagnation_helpers.py +786 -0
  545. harmonyrun-0.4.9/tests/unit/agent/executor/__init__.py +0 -0
  546. harmonyrun-0.4.9/tests/unit/agent/fast_agent/__init__.py +0 -0
  547. harmonyrun-0.4.9/tests/unit/agent/fast_agent/test_fastagent_handle_llm_input_helpers.py +214 -0
  548. harmonyrun-0.4.9/tests/unit/agent/fast_agent/test_fastagent_native_tools_loop.py +14 -0
  549. harmonyrun-0.4.9/tests/unit/agent/fast_agent/test_fastagent_settle.py +56 -0
  550. harmonyrun-0.4.9/tests/unit/agent/harmony/__init__.py +0 -0
  551. harmonyrun-0.4.9/tests/unit/agent/harmony/test_node_finalize_helpers.py +306 -0
  552. harmonyrun-0.4.9/tests/unit/agent/llm/__init__.py +0 -0
  553. harmonyrun-0.4.9/tests/unit/agent/llm/test_inference.py +251 -0
  554. harmonyrun-0.4.9/tests/unit/agent/llm/test_loader.py +144 -0
  555. harmonyrun-0.4.9/tests/unit/agent/llm/test_messages_strip_thinking.py +62 -0
  556. harmonyrun-0.4.9/tests/unit/agent/llm/test_picker.py +67 -0
  557. harmonyrun-0.4.9/tests/unit/agent/manager/__init__.py +0 -0
  558. harmonyrun-0.4.9/tests/unit/agent/manager/test_plan_todos.py +146 -0
  559. harmonyrun-0.4.9/tests/unit/agent/memory/__init__.py +0 -0
  560. harmonyrun-0.4.9/tests/unit/agent/memory/test_device_date_prompt.py +51 -0
  561. harmonyrun-0.4.9/tests/unit/agent/memory/test_store.py +124 -0
  562. harmonyrun-0.4.9/tests/unit/agent/memory/test_task_memory_prompt.py +51 -0
  563. harmonyrun-0.4.9/tests/unit/agent/test_app_card_injection.py +81 -0
  564. harmonyrun-0.4.9/tests/unit/agent/test_app_matcher.py +97 -0
  565. harmonyrun-0.4.9/tests/unit/agent/test_context_pack.py +1075 -0
  566. harmonyrun-0.4.9/tests/unit/agent/test_device_info_xml.py +152 -0
  567. harmonyrun-0.4.9/tests/unit/agent/test_usage_cache.py +111 -0
  568. harmonyrun-0.4.9/tests/unit/agent/tools/__init__.py +0 -0
  569. harmonyrun-0.4.9/tests/unit/agent/tools/test_actions_complete.py +280 -0
  570. harmonyrun-0.4.9/tests/unit/agent/tools/test_dispatcher.py +168 -0
  571. harmonyrun-0.4.9/tests/unit/agent/tools/test_gestures.py +77 -0
  572. harmonyrun-0.4.9/tests/unit/agent/tools/test_registry.py +500 -0
  573. harmonyrun-0.4.9/tests/unit/agent/tools/test_schemas.py +99 -0
  574. harmonyrun-0.4.9/tests/unit/agent/tools/test_type_at.py +46 -0
  575. harmonyrun-0.4.9/tests/unit/app_cards/__init__.py +0 -0
  576. harmonyrun-0.4.9/tests/unit/app_cards/test_writing.py +55 -0
  577. harmonyrun-0.4.9/tests/unit/batch/__init__.py +0 -0
  578. harmonyrun-0.4.9/tests/unit/batch/conftest.py +223 -0
  579. harmonyrun-0.4.9/tests/unit/batch/execution/__init__.py +0 -0
  580. harmonyrun-0.4.9/tests/unit/batch/execution/test_device_gate.py +131 -0
  581. harmonyrun-0.4.9/tests/unit/batch/execution/test_phase.py +83 -0
  582. harmonyrun-0.4.9/tests/unit/batch/execution/test_resources.py +141 -0
  583. harmonyrun-0.4.9/tests/unit/batch/execution/test_runner.py +437 -0
  584. harmonyrun-0.4.9/tests/unit/batch/execution/test_scheduler.py +172 -0
  585. harmonyrun-0.4.9/tests/unit/batch/loading/__init__.py +0 -0
  586. harmonyrun-0.4.9/tests/unit/batch/loading/test_levels.py +44 -0
  587. harmonyrun-0.4.9/tests/unit/batch/loading/test_loader.py +192 -0
  588. harmonyrun-0.4.9/tests/unit/batch/loading/test_validation.py +74 -0
  589. harmonyrun-0.4.9/tests/unit/batch/reporting/__init__.py +0 -0
  590. harmonyrun-0.4.9/tests/unit/batch/reporting/test_html_report.py +117 -0
  591. harmonyrun-0.4.9/tests/unit/batch/reporting/test_json_report.py +69 -0
  592. harmonyrun-0.4.9/tests/unit/batch/reporting/test_live.py +228 -0
  593. harmonyrun-0.4.9/tests/unit/batch/reporting/test_paths.py +57 -0
  594. harmonyrun-0.4.9/tests/unit/batch/reporting/test_viewer.py +59 -0
  595. harmonyrun-0.4.9/tests/unit/batch/test_models.py +119 -0
  596. harmonyrun-0.4.9/tests/unit/cli/__init__.py +0 -0
  597. harmonyrun-0.4.9/tests/unit/cli/test_capture.py +139 -0
  598. harmonyrun-0.4.9/tests/unit/config/__init__.py +0 -0
  599. harmonyrun-0.4.9/tests/unit/config/fixtures/legacy_tracing.yaml +4 -0
  600. harmonyrun-0.4.9/tests/unit/config/fixtures/minimal.yaml +4 -0
  601. harmonyrun-0.4.9/tests/unit/config/test_consumer_imports.py +60 -0
  602. harmonyrun-0.4.9/tests/unit/config/test_env_keys.py +62 -0
  603. harmonyrun-0.4.9/tests/unit/config/test_facade_helpers.py +64 -0
  604. harmonyrun-0.4.9/tests/unit/config/test_fork_isolation.py +46 -0
  605. harmonyrun-0.4.9/tests/unit/config/test_isolation.py +107 -0
  606. harmonyrun-0.4.9/tests/unit/config/test_legacy_field_compat.py +108 -0
  607. harmonyrun-0.4.9/tests/unit/config/test_loader.py +100 -0
  608. harmonyrun-0.4.9/tests/unit/config/test_overrides.py +127 -0
  609. harmonyrun-0.4.9/tests/unit/config/test_paths_prompts.py +40 -0
  610. harmonyrun-0.4.9/tests/unit/config/test_perception_mode.py +57 -0
  611. harmonyrun-0.4.9/tests/unit/config/test_user_paths_and_migration.py +74 -0
  612. harmonyrun-0.4.9/tests/unit/config/test_yaml_schema_sync.py +66 -0
  613. harmonyrun-0.4.9/tests/unit/events/test_bus.py +53 -0
  614. harmonyrun-0.4.9/tests/unit/farm/__init__.py +0 -0
  615. harmonyrun-0.4.9/tests/unit/farm/test_archive.py +119 -0
  616. harmonyrun-0.4.9/tests/unit/farm/test_dispatch.py +72 -0
  617. harmonyrun-0.4.9/tests/unit/farm/test_pool_session.py +95 -0
  618. harmonyrun-0.4.9/tests/unit/farm/test_remote_driver.py +287 -0
  619. harmonyrun-0.4.9/tests/unit/feedback/__init__.py +0 -0
  620. harmonyrun-0.4.9/tests/unit/feedback/test_feedback.py +263 -0
  621. harmonyrun-0.4.9/tests/unit/hdcutils/__init__.py +0 -0
  622. harmonyrun-0.4.9/tests/unit/hdcutils/agent/__init__.py +0 -0
  623. harmonyrun-0.4.9/tests/unit/hdcutils/agent/test_diagnostic.py +79 -0
  624. harmonyrun-0.4.9/tests/unit/hdcutils/agent/test_installer.py +201 -0
  625. harmonyrun-0.4.9/tests/unit/hdcutils/agent/test_spec.py +128 -0
  626. harmonyrun-0.4.9/tests/unit/hdcutils/backends/__init__.py +0 -0
  627. harmonyrun-0.4.9/tests/unit/hdcutils/device/__init__.py +0 -0
  628. harmonyrun-0.4.9/tests/unit/hdcutils/device/test_display_state.py +598 -0
  629. harmonyrun-0.4.9/tests/unit/hdcutils/device/test_forwards.py +39 -0
  630. harmonyrun-0.4.9/tests/unit/hdcutils/device/test_parse_label_batch.py +54 -0
  631. harmonyrun-0.4.9/tests/unit/hdcutils/device/test_parse_mission_list.py +116 -0
  632. harmonyrun-0.4.9/tests/unit/hdcutils/device/test_screen_socket_revive.py +149 -0
  633. harmonyrun-0.4.9/tests/unit/hdcutils/device/test_snapshot_skew.py +90 -0
  634. harmonyrun-0.4.9/tests/unit/hdcutils/emulator/__init__.py +0 -0
  635. harmonyrun-0.4.9/tests/unit/hdcutils/emulator/test_scenario.py +169 -0
  636. harmonyrun-0.4.9/tests/unit/hdcutils/rpc/__init__.py +0 -0
  637. harmonyrun-0.4.9/tests/unit/hdcutils/rpc/test_client_busy.py +27 -0
  638. harmonyrun-0.4.9/tests/unit/hdcutils/rpc/test_client_cancel_poison.py +126 -0
  639. harmonyrun-0.4.9/tests/unit/hdcutils/rpc/test_framing.py +117 -0
  640. harmonyrun-0.4.9/tests/unit/hdcutils/rpc/test_recovery.py +116 -0
  641. harmonyrun-0.4.9/tests/unit/hdcutils/test_client_parsing.py +39 -0
  642. harmonyrun-0.4.9/tests/unit/hdcutils/test_errors.py +54 -0
  643. harmonyrun-0.4.9/tests/unit/hdcutils/test_hilog.py +407 -0
  644. harmonyrun-0.4.9/tests/unit/hdcutils/test_keycode.py +44 -0
  645. harmonyrun-0.4.9/tests/unit/hdcutils/test_types.py +44 -0
  646. harmonyrun-0.4.9/tests/unit/hdcutils/test_version.py +16 -0
  647. harmonyrun-0.4.9/tests/unit/hdcutils/transport/__init__.py +0 -0
  648. harmonyrun-0.4.9/tests/unit/hdcutils/transport/test_ports.py +78 -0
  649. harmonyrun-0.4.9/tests/unit/hdcutils/transport/test_recording.py +131 -0
  650. harmonyrun-0.4.9/tests/unit/hypium/__init__.py +0 -0
  651. harmonyrun-0.4.9/tests/unit/hypium/conftest.py +118 -0
  652. harmonyrun-0.4.9/tests/unit/hypium/test_action_mapper.py +142 -0
  653. harmonyrun-0.4.9/tests/unit/hypium/test_generator.py +122 -0
  654. harmonyrun-0.4.9/tests/unit/hypium/test_trajectory_loader.py +153 -0
  655. harmonyrun-0.4.9/tests/unit/mcp/__init__.py +0 -0
  656. harmonyrun-0.4.9/tests/unit/mcp/test_config_schema.py +54 -0
  657. harmonyrun-0.4.9/tests/unit/mcp/test_perception_raw.py +97 -0
  658. harmonyrun-0.4.9/tests/unit/mcp/test_schemas.py +127 -0
  659. harmonyrun-0.4.9/tests/unit/mcp/test_server_registration.py +129 -0
  660. harmonyrun-0.4.9/tests/unit/mcp/test_session.py +162 -0
  661. harmonyrun-0.4.9/tests/unit/tools/driver/test_app_catalog.py +125 -0
  662. harmonyrun-0.4.9/tests/unit/tools/driver/test_base_defaults.py +53 -0
  663. harmonyrun-0.4.9/tests/unit/tools/driver/test_driver_proxy.py +116 -0
  664. harmonyrun-0.4.9/tests/unit/tools/driver/test_emulator_routing.py +163 -0
  665. harmonyrun-0.4.9/tests/unit/tools/driver/test_extract_bundle.py +53 -0
  666. harmonyrun-0.4.9/tests/unit/tools/driver/test_factory.py +130 -0
  667. harmonyrun-0.4.9/tests/unit/tools/driver/test_perceiving_driver.py +104 -0
  668. harmonyrun-0.4.9/tests/unit/tools/driver/test_posture_calibration.py +61 -0
  669. harmonyrun-0.4.9/tests/unit/tools/driver/test_proxy_contract.py +133 -0
  670. harmonyrun-0.4.9/tests/unit/tools/driver/test_proxy_forwarding.py +339 -0
  671. harmonyrun-0.4.9/tests/unit/tools/driver/test_recording_raw_dump.py +332 -0
  672. harmonyrun-0.4.9/tests/unit/tools/driver/test_recording_touchpad.py +102 -0
  673. harmonyrun-0.4.9/tests/unit/tools/driver/test_stealth_swipe.py +158 -0
  674. harmonyrun-0.4.9/tests/unit/tools/driver/test_unlock_contract.py +196 -0
  675. harmonyrun-0.4.9/tests/unit/tools/monitors/__init__.py +0 -0
  676. harmonyrun-0.4.9/tests/unit/tools/monitors/test_hilog_monitor.py +420 -0
  677. harmonyrun-0.4.9/tests/unit/tools/perception/__init__.py +0 -0
  678. harmonyrun-0.4.9/tests/unit/tools/perception/processors/__init__.py +0 -0
  679. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_bundle_serde.py +109 -0
  680. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_highlight_marker.py +177 -0
  681. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_indexed_formatter_clickable.py +135 -0
  682. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_indexed_formatter_selected.py +98 -0
  683. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_nav_state.py +227 -0
  684. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_phone_state_back_stack.py +107 -0
  685. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_phone_state_display.py +426 -0
  686. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_phone_state_keyboard_unknown.py +43 -0
  687. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_phone_state_modal.py +189 -0
  688. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_phone_state_selected_tab.py +158 -0
  689. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_pipeline.py +448 -0
  690. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_system_ui_pruner.py +390 -0
  691. harmonyrun-0.4.9/tests/unit/tools/perception/processors/test_tree_simplifier.py +274 -0
  692. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_offline_provider_bundle.py +87 -0
  693. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_provider_annotate.py +134 -0
  694. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_provider_screenshot_path.py +178 -0
  695. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_screenshot.py +176 -0
  696. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_snapshot.py +256 -0
  697. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_state_clear_point.py +259 -0
  698. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_state_convert_point.py +70 -0
  699. harmonyrun-0.4.9/tests/unit/tools/perception/ui/test_state_page_signature.py +159 -0
  700. harmonyrun-0.4.9/tests/unit/tools/test_public_api.py +178 -0
  701. harmonyrun-0.4.9/tests/unit/traces/__init__.py +1 -0
  702. harmonyrun-0.4.9/tests/unit/traces/test_case_report.py +338 -0
  703. harmonyrun-0.4.9/tests/unit/traces/test_events.py +158 -0
  704. harmonyrun-0.4.9/tests/unit/traces/test_folder.py +165 -0
  705. harmonyrun-0.4.9/tests/unit/traces/test_llm_log.py +221 -0
  706. harmonyrun-0.4.9/tests/unit/traces/test_recorder.py +213 -0
  707. harmonyrun-0.4.9/tests/unit/traces/test_serializers.py +134 -0
  708. harmonyrun-0.4.9/tests/unit/traces/test_sinks.py +67 -0
  709. harmonyrun-0.4.9/tests/unit/traces/test_telemetry.py +175 -0
  710. harmonyrun-0.4.9/tests/unit/traces/test_writer.py +227 -0
  711. harmonyrun-0.4.9/uv.lock +2744 -0
@@ -0,0 +1,129 @@
1
+ # `src/harmonyrun` 模块级变更对比报告:0.1.0 → 当前
2
+
3
+ > 本文是**分析报告**,不是实现计划。用户只关注 `src/harmonyrun` 下代码,按模块对比 0.1.0 到现在的差异。
4
+
5
+ ## Context
6
+
7
+ - **基线 `0.1.0`** = commit `f669cdd`(2026-05-17 "补充最新的plan实现")
8
+ - **当前 HEAD** = commit `203a2d0`(= tag `v0.3.0` + 4 commits)
9
+ - 仓库另有 tag `0.5.28`(commit `f86e247` "删除Android相关代码")在旧 Android `droidrun` 谱系上,**不在当前主线**,本报告忽略。
10
+ - 区间内 `src/harmonyrun` 累计:**181 文件变更,+7884 / −3728**,横跨 50 个提交;104 新增、12 删除、65 修改、0 重命名(prompt 重构走"删旧 .py + 增 .j2 树",git 不识别为 rename)。
11
+
12
+ ### 各模块改动量
13
+
14
+ | 模块 | +行 | −行 | 文件 | 性质 |
15
+ |---|---:|---:|---:|---|
16
+ | `agent` | 4100 | 2240 | 110 | 范式重构(最大面) |
17
+ | `cli` | 1206 | 137 | 6 | 新增控制台捕获 + 反馈链路 |
18
+ | `tools` | 778 | 79 | 11 | 感知增强 + 方向翻转 + 原子捕获 |
19
+ | `traces` | 558 | 67 | 5 | 报告延迟生成 + 反馈按钮 |
20
+ | `batch` | 494 | 229 | 22 | prompts 迁移 + 多语言 + 回调 |
21
+ | `hdcutils` | 491 | 951 | 15 | **净删**:后端抽象/屏幕流移除 |
22
+ | `config` | 180 | 13 | 6 | 多语言 + 姿态 + per-case 覆盖 |
23
+ | `__init__.py` | 62 | 0 | 1 | SDK 公共导出 +20 |
24
+ | `mcp` | 8 | 8 | 2 | 截图 png→jpeg |
25
+ | `farm` | 3 | 3 | 2 | 微调 |
26
+ | `log_handlers.py` | 4 | 1 | 1 | tee 兼容修正 |
27
+
28
+ ---
29
+
30
+ ## 1. `agent`(+4100/−2240,本质是消息架构范式切换)
31
+
32
+ **核心:从"历史线性积累 + 二阶 LLM 压缩" → "固定块级 state-user 架构 + 滑窗 + cache 锚点"。**
33
+
34
+ - **prompts 体系**:`fast_agent / manager / executor` 三处 `prompts.py`(分别 308/409/281 行 Python 段常量)全部删除,迁到 Jinja2 模板树。约定:数字前缀子目录(`01_role/`…)+ 每块一对 `en.j2`/`zh.j2` + 可选 `_meta.md`;Environment 用 `StrictUndefined` + `trim_blocks=False`/`keep_trailing_newline=True`;工具名/XML 标签/参数名恒英文,只切自然语言。
35
+ - **context_pack v1→v2**(已核实常量):
36
+ - 0.1.0:`RECENT_SCREENSHOTS_TO_SEND=1`、`COMPRESS_EVERY_N_STEPS=10`、`KEEP_RECENT_STEPS_RAW=5`、`COMPRESS_AFTER_STEP=15`(压缩驱动)。
37
+ - HEAD:`SCREENSHOTS_PER_TURN=1`、`MAX_AGENT_HISTORY_ITEMS=25`、`FULL_A11Y_FOR_LAST_N_STEPS=2`(滑窗驱动,最近 2 步带完整 a11y,更早只留骨架行)。
38
+ - 每步固定发 2~4 条消息:`SystemMessage` + 多块 `HumanMessage`(GOAL_XML / AGENT_HISTORY_XML / CURRENT_DEVICE_STATE_XML / prev+current 截图 / NEXT_STEP_XML)+ 可选最近一组 tool round。
39
+ - `cache_control` 只挂 system 末尾 + GOAL 块 + AGENT_HISTORY 块;**image 块永不挂**;DEVICE_STATE/NEXT_STEP 不挂。
40
+ - `pack_messages_for_send` 签名改:`(history=...)` → `(state_user_message=..., recent_tool_pair=...)`。
41
+ - `message_history` 从核心内存结构 **降级为 trace-only**,LLM 输入每轮从 `step_observations` 重建。
42
+ - **compression 整组删除**:`agent/compression/{__init__,compressor,prompts}.py`(原 stage-A 确定性摘要 + stage-B LLM 改写 + fallback)。连带:`llm_loader._OPTIONAL_PROFILES` 从 `("history_compressor",)` 变 `()`;`prompt_resolver` 删 `history_compressor_system` 角色;`event_handler` 删 `HistoryCompressedEvent` 分支。
43
+ - **FastAgent 内核**:抽出 `state.py`(原 `_FastState`)、新增 `state_user.py`(`build_state_user_for_step` 多块组装)、新增 `final_chance.py`(stagnation/max-steps 时给最后一轮,tool 绑定限 `complete`,强制判定而非 inconclusive)。
44
+ - **state 模型**:新增 `last_tool_round`(native tool-calling 要求整对回传)、`last_state_delta`(设备侧可观测变化快照,渲染 `<state_change>` 回灌)、`previous_screenshot`;删 `last_compressed_step`/`last_digest_text`。
45
+ - **动作集合稳定**:`ACTION_SPECS` 仍是单一真源,无新增/删除 action。
46
+
47
+ ---
48
+
49
+ ## 2. `hdcutils`(+491/−951,唯一净删模块)
50
+
51
+ **核心:废除后端抽象层 + 移除 RPC 屏幕流,数据路径下沉、按调用动态降级。**
52
+
53
+ - **删 `backends/`**(`base`/`socket_backend`/`shell_backend`,共 ~502 行):原 SocketBackend(持久 TCP RPC + 帧格式标准化)/ ShellBackend(逐次 `uitest dumpLayout`)逻辑内聚进 `device/screen.py:ScreenOps`。layout 改 **per-call** 决策(`ui_mode` 参数 + `_resolve_ui_mode`),socket 失败后置 `_socket_dead` 粘性标志自动降级 shell。
54
+ - **删 `rpc/screen_pump.py`**(134 行)+ `rpc/client.py` 的全部屏幕流方法(`start/stop_screen_stream`、`capture_screen_once` 等):截图改用无状态 `hdc shell snapshot_display -t jpeg`,不再走 uitest 守护进程的持续帧流。
55
+ - **`HdcDevice` / `build_harmony_driver` 删 `ui_backend` 参数**;`ensure_uitest_ready()` 改为无条件调 `ensure_agent_pushed()`,失败降级为警告不中断。
56
+ - **新增任务栈导入(Tier 1.4)**:`device/apps.py` 加 `MissionInfo` dataclass + `parse_mission_list()` + `dump_mission_list()`(解析 `aa dump -l`),供 perception 构造 backStack。
57
+ - `rpc/recovery.py` 的 tier-2 简化(不再处理屏幕 socket)。
58
+
59
+ ---
60
+
61
+ ## 3. `tools`(+778/−79,感知与驱动增强)
62
+
63
+ - **driver**:
64
+ - `base.py`/`proxy.py`/`harmony.py`/`recording.py` 新增原子接口 `get_ui_tree_with_screenshot()`(单往返同时拿树+截图);ProxyDriver 补显式转发。
65
+ - `harmony.py` 新增**方向翻转**机制(`orientation_flip_by_model` 配置 + `_FLIP_MAP` + 读/写路径翻转,让 LLM 看到的方向与请求动作一致),`factory.py` 删 `ui_backend`、加 `orientation_flip_by_model`。
66
+ - `recording.py` 新增原始 dump 持久化(`set_raw_dump` + `_dump_raw_uitree`/`_dump_raw_screenshot`,落 `uitest_raw/`)。
67
+ - **perception**:
68
+ - `pipeline.py:process_ui_tree` + `extractors/phone_state.py` 新增 `mission_list` 参数与 `backStack` 字段注入(仅有后台任务时才输出,避噪)。
69
+ - `formatters/indexed_formatter.py` 新增 back-stack 渲染行、`selected`(活跃 tab)标记、`CLIPPED_*_BY_Npx` 裁剪标记(`_compute_clip_markers`)。
70
+ - 新增 `perception/ui/offline.py:OfflineStateProvider` —— 为 `harmonyrun-evals` 走真实 a11y 管道做黑盒感知,导出到 `perception/ui/__init__.py`。
71
+
72
+ ---
73
+
74
+ ## 4. `cli`(+1206/−137,第二大改动面)
75
+
76
+ - **新增 `cli/_capture.py`**(~207 行):进程级 stdout/stderr tee 单例(`_TeeStream`),`enable_console_capture()`(须在 `setup_cli_logging` 前)→ `attach_console_logfile(path)`(轨迹目录就绪后切磁盘镜像)。1MB 缓冲上限,穿透 `isatty`/`fileno`。
77
+ - **新增 `cli/feedback.py`**(~565 行):`harmonyrun feedback [path]` 打包 trajectory zip(含 console.log,默认排除录屏)→ `gh` 推 GitHub draft release + 建 `claude-fix` issue;无 gh 时降级浏览器预填表单;支持 `--dry-run`。
78
+ - **新增 `cli/view.py`**(~241 行):`harmonyrun view [path]` 起本地 HTTP 动态渲染轨迹/套件报告,不落 HTML 文件。
79
+ - `cli/main.py` 注册 `feedback`/`view` 子命令,`run`/`test` 接入捕获 + `on_suite_trajectory_allocated` 回调;`cli/run.py` 加 `save_uitest_raw`。
80
+
81
+ ---
82
+
83
+ ## 5. `traces`(+558/−67)
84
+
85
+ - `case_report.py:render_case_html` 返回值 `Path`→`str`(不再直接落盘,交 `view` 服务);新增 `_build_feedback_config` 注入 `__INLINE_FEEDBACK_JSON__`(反馈按钮 "📮 提交反馈")。
86
+ - `folder.py` 新增 `uitest_raw_*` 路径与 `ensure_uitest_raw_dir`;截图统一 `.png`→`.jpeg`。
87
+ - 新增 `traces/format.py`(`TRAJECTORY_FORMAT_VERSION`)供 `view` 检测过期轨迹;模板 `case_report.html` 大幅扩展(反馈按钮 + 原始用例信息面板)。
88
+
89
+ ---
90
+
91
+ ## 6. `batch`(+494/−229)
92
+
93
+ - 删 `batch/loading/prompts.py`(153 行)→ `batch/loading/prompts/` Jinja2 树;`build_*_goal` 全链路加 `language` 参数。
94
+ - `models.py` 新增 `TestCase.config_overrides`(per-case 覆盖),level 扩到 L0–L5。
95
+ - `execution/runner.py`:新增 `_apply_display_preferences()`(setup 阶段按 orientation/fold 调姿态);per-case `apply_overrides` 隔离 deep-copy;trace 注入原始用例字段;移除即时 `render_case_html`(改 `view` 按需生成)。
96
+ - `suite_runner.py` 加 `on_suite_trajectory_allocated` 回调(避免 batch import cli);`reporting/live.py` 只写 `report.json` + 新增 `find_latest_suite_run`。
97
+ - `schemas/test_suite.schema.json`:level 枚举扩 L3–L5 + 新增 `config_overrides`。
98
+
99
+ ---
100
+
101
+ ## 7. `config`(+180/−13)
102
+
103
+ - `schema/agent.py` 新增 `prompt_language`(en/zh)。
104
+ - `schema/runtime.py`:**删 `ui_backend`**;新增 `orientation`/`fold_display`/`stream_screenshots`/`save_uitest_raw`。
105
+ - `manager.py` 新增 `devices.yaml` 旁路加载(`_load_orientation_flip_map_from_yaml`)+ `_apply_runtime_env_overrides`(`HARMONYRUN_STREAM_SCREENSHOTS`/`HARMONYRUN_SAVE_UITEST_RAW`)。
106
+
107
+ ---
108
+
109
+ ## 8. 其余
110
+
111
+ - **`mcp`**(+8/−8):截图 mime `image/png`→`image/jpeg`(perception tool + 两个 resource),actions 微调。atomic 模式与分层不变。
112
+ - **`farm`**(+3/−3):仅文档 + server/app.py 微调。
113
+ - **`__init__.py`**(+62):`_LAZY_EXPORTS` 扩出 ~20 个 SDK 入口(`pack_messages_for_send`/`build_*_xml`/`StepObservation`/`build_harmony_driver`/`UIState`/`OfflineStateProvider`/`find_latest_suite_run`/`load_test_cases`/`render_case_html`/`TraceFolder`/`apply_overrides` 等)。
114
+ - **`log_handlers.py`**(+4/−1):`CLILogHandler` 的 `Console(file=stream or sys.stdout)`→`Console(file=stream)`,让 tee 能 retroactively 抓住 rich 输出。
115
+ - `app_cards`/`hypium`:本区间无改动。
116
+
117
+ ---
118
+
119
+ ## 跨切面主题(设计演进方向)
120
+
121
+ 1. **消息架构范式切换**:压缩驱动 → 块级 state-user + 滑窗 + cache 锚点(agent 大头)。
122
+ 2. **设备通路简化**:后端抽象/屏幕流移除,改 per-call 路由 + 无状态 snapshot + 自动降级(hdcutils 净删)。
123
+ 3. **更精准的设备侧上下文**:任务栈 backStack、CLIPPED 裁剪标记、方向翻转、原始 uitest dump 落盘 —— 全部来自设备可观测源,契合 harness 哲学。
124
+ 4. **报告解耦**:JSON 单一事实源,HTML 由 `harmonyrun view` 按需动态生成(runner/reporting 不再即时写 HTML)。
125
+ 5. **反馈驱动闭环**:console tee → zip → `harmonyrun feedback` → GitHub issue/Action 自动分析。
126
+ 6. **prompts 工程化 + 多语言**:四处 prompts.py → Jinja2 模板树,`prompt_language` 全链路。
127
+ 7. **评测可复现**:`OfflineStateProvider` 让 evals 走真实感知管道。
128
+
129
+ > 注:CLAUDE.md 记 "N=2 双截图",但代码真值 `SCREENSHOTS_PER_TURN=1`(prev/current 滚动机制已就位,发送数常量默认 1)—— 属文档漂移,以代码为准。
@@ -0,0 +1,420 @@
1
+ # 云端服务器经本地中转访问真机 — 可行性分析
2
+
3
+ - 会话时间: 2026-04-22T08:04:13
4
+ - 会话 ID: `e1e23ed9-6085-4290-bb3f-56925e8f2a8a`
5
+ - 计划版本数: 2
6
+
7
+ ## 原始诉求
8
+
9
+ > 此诉求和当前代码仓没有太大关系,我是想让你帮我分析下这套方案的落地可行性,我现在有一台云端服务器,服务器上有全套的鸿蒙开发环境,比如HDC命令,我想实现一套可以让服务器直连我某一台真实手机的能力,这个手机我可以通过某一台电脑连接,我可以在电脑上也配合启动一套服务用来中转消息,我核心的诉求就是分析下让服务器的环境中能通过hdc命令访问这台真实手机的方案可行性。当前代码仓中有写关于socket与手机交互的能力,我不知道对你这次分析有没有借鉴作用,你可以借鉴分析下。
10
+
11
+ ---
12
+
13
+ ## Plan v1 (2026-04-22T08:17:24)
14
+
15
+ ## 方案可行性分析:云端服务器通过 hdc 远程访问本地真机
16
+
17
+ ### Context(背景与目标)
18
+
19
+ - **现状**:云端服务器已具备鸿蒙开发环境(含 hdc 命令),但没有物理 USB 口,无法直接接手机。
20
+ - **目标**:让云端服务器的 `hdc xxx` 命令像"设备就在本地 USB"一样,透明地作用在"电脑 A 上连着的真机"。
21
+ - **已确认的假设**(来自用户对齐):
22
+ 1. 网络方向:**电脑 A 可主动出网连云端**(云端无法主动回连),→ 采用 SSH 反向隧道。
23
+ 2. 云端使用范围:**仅命令行 hdc** (`hdc shell` / `hdc file send|recv` / `hdc list targets` 等),不需要在云端直连 fport 本地端口。
24
+ 3. 规模:**当前一台手机,未来可能多台**,方案需为多设备预留扩展性。
25
+ - **参考**:当前仓库 [droidrun](/Users/legend/Desktop/Code/droidrun) 已有 `run_hdc()` 统一封装([_utils.py:79-174](src/droidrun/agent/harmony/_utils.py#L79-L174)),印证"只要 hdc 环境变量生效,所有命令自动走远程"这一思路可行。
26
+
27
+ ---
28
+
29
+ ### 结论先行
30
+
31
+ **可行性:高,且落地代价很小。** 核心只要三件事:
32
+
33
+ 1. 电脑 A 上用 `hdc -m` 起远程模式 server(仅监听 127.0.0.1)。
34
+ 2. 电脑 A 上常驻一条 SSH 反向隧道,把 `127.0.0.1:8710` 送到云端 `127.0.0.1:8710`。
35
+ 3. 云端设置 `HDC_SERVER_HOST=127.0.0.1` / `HDC_SERVER_PORT=8710`。
36
+
37
+ 命令层所有 hdc 调用即刻透明远程化,无需改业务代码。多台手机天然由同一 hdc server 并管,云端用 `hdc -t <serial>` 区分。
38
+
39
+ ---
40
+
41
+ ### HDC 的远程能力(只保留本方案用到的事实)
42
+
43
+ - HDC 与 ADB 架构一致:`client ⇄ server(8710)⇄ daemon(设备内)`。一个 server 可同时管多台设备。
44
+ - `hdc -m -s <bind>:<port>`:以远程模式启动 server,允许外部 client 接入。
45
+ - `HDC_SERVER_HOST` / `HDC_SERVER_PORT`:client 通过环境变量定位远程 server(零代码改动)。
46
+ - 多设备区分:`hdc -t <serial> <sub-command>` 或 `hdc list targets` 列出当前 server 下所有设备。
47
+ - **hdc 协议本身无加密、无认证**:必须走加密隧道保护;严禁让 server 监听 `0.0.0.0`。
48
+
49
+ ---
50
+
51
+ ### 推荐架构
52
+
53
+ ```
54
+ ┌─────────────────────┐ ┌──────────────────────┐
55
+ │ 云端服务器 │ │ 电脑 A │
56
+ │ ─────────────────── │ │ ──────────────────── │
57
+ │ HDC_SERVER_HOST= │ │ │
58
+ │ 127.0.0.1 │◄──── SSH reverse tunnel ─────┤ hdc -m -s │
59
+ │ HDC_SERVER_PORT= │ 127.0.0.1:8710 │ 127.0.0.1:8710 │
60
+ │ 8710 │ (电脑主动建立) │ │
61
+ │ │ │ │ USB / WiFi │
62
+ │ hdc list targets │ │ │ │
63
+ │ hdc -t <s> shell … │ │ ▼ │
64
+ │ hdc -t <s> file … │ │ 📱 手机 1..N │
65
+ └─────────────────────┘ └──────────────────────┘
66
+ ```
67
+
68
+ **关键操作序列**:
69
+
70
+ 1. **电脑 A(一次性初始化)**:
71
+ ```sh
72
+ hdc kill
73
+ hdc -m -s 127.0.0.1:8710 # 仅监听本机,把风险面交给 SSH
74
+ hdc list targets # 确认本机能看到手机
75
+ ```
76
+
77
+ 2. **电脑 A(常驻反向隧道)**:
78
+ ```sh
79
+ autossh -M 0 -N \
80
+ -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
81
+ -o ExitOnForwardFailure=yes \
82
+ -R 127.0.0.1:8710:127.0.0.1:8710 \
83
+ <user>@<云端>
84
+ # 建议包成 systemd user service / launchd plist / Windows 任务,开机自启
85
+ ```
86
+
87
+ 3. **云端(使用)**:
88
+ ```sh
89
+ export HDC_SERVER_HOST=127.0.0.1
90
+ export HDC_SERVER_PORT=8710
91
+ hdc list targets # 应看到电脑 A 上的手机
92
+ hdc -t <serial> shell uname -a
93
+ hdc -t <serial> file send ./x /data/local/tmp/x
94
+ hdc -t <serial> file recv /data/local/tmp/log ./
95
+ ```
96
+
97
+ ---
98
+
99
+ ### 多手机扩展(前瞻设计)
100
+
101
+ **默认路径(推荐,最简单)**:一台电脑 A 上只跑**一个** hdc server,所有 USB/WiFi 接入的手机都挂在它下面。
102
+
103
+ - 云端用 `hdc -t <serial>` 明确指定目标设备;`hdc list targets` 返回全部 serial。
104
+ - 扩容时只需把新手机插电脑 A(或用 `hdc tconn` 接入局域网的手机),**隧道和环境变量都不变**。
105
+ - 这是 HDC 原生语义,与单机开发体验一致。
106
+
107
+ **需要考虑独立实例的两种情况**:
108
+
109
+ | 场景 | 处理 |
110
+ |---|---|
111
+ | 多个电脑 A(不同地点各接一批手机) | 每台电脑跑一份 hdc server,分别用不同端口反向转发(8710/8711/8712…),云端按端口区分"机位"而非按 serial |
112
+ | 多用户抢占同一台手机 | 在云端或电脑 A 前置一层代理(最简即 SSH ForceCommand 脚本),按登录账号做 `hdc -t` 注入与审计 |
113
+
114
+ ---
115
+
116
+ ### 安全加固(必做)
117
+
118
+ - **hdc -m 必须只监听 127.0.0.1**,绝不监听 0.0.0.0。所有外部访问全部经过 SSH。
119
+ - **SSH 账号专用**:云端给电脑 A 配一个受限账号,禁用 shell,只允许 port forward:
120
+ ```
121
+ # /home/<user>/.ssh/authorized_keys on 云端
122
+ command="/bin/false",no-pty,no-X11-forwarding,permitopen="127.0.0.1:8710" ssh-ed25519 AAAA... tunnel@电脑A
123
+ ```
124
+ - **云端 sshd 配置**:`AllowTcpForwarding yes`,`GatewayPorts no`(避免意外对外暴露)。
125
+ - **可选增强**:在 hdc server 外包一层 mTLS 代理(`stunnel` / `ghostunnel`),为多用户场景准备。
126
+ - **合规提醒**:`hdc shell` 具有接近 root 的调试能力,凭据应一机一号、可审计、可快速吊销。
127
+
128
+ ---
129
+
130
+ ### 借鉴 droidrun 仓库的启发(虽与本方案关联不大)
131
+
132
+ - 仓库的 `run_hdc()` 通用执行器([_utils.py:79-174](src/droidrun/agent/harmony/_utils.py#L79-L174))印证:**只要环境变量生效,上层业务代码不用改**。若未来想把 droidrun 整体搬到云端,只需在调用侧统一注入 `HDC_SERVER_HOST/PORT`。
133
+ - 仓库的"socket / shell 双后端"配置([config_manager.py:115](src/droidrun/config_manager.py#L115))展示了一个优雅降级模式。即便不需要 fport 直连能力,这也是"业务需要直连设备端口时"的一条备用路径——强行切 `ui_backend=shell`,全走 `hdc shell`+`hdc file recv`,在远程 server 模式下天然可用。
134
+ - **与本方案的关系**:用户明确只要命令行 hdc,因此仓库中那套"fport + 直连 127.0.0.1:port"的 socket 模式**不会被触发**,不需要为 fport 动态端口做二级隧道,方案大幅简化。
135
+
136
+ ---
137
+
138
+ ### 风险清单
139
+
140
+ | 风险 | 影响 | 缓解 |
141
+ |---|---|---|
142
+ | hdc client/server 版本不一致 | 协议不兼容直接断连 | 云端与电脑 A 的 hdc 二进制必须来自**同一个 SDK 版本**;运维脚本锁定版本并定期核对 `hdc -v` |
143
+ | SSH 隧道断连 | 全部命令失败 | `autossh` + `ServerAliveInterval=30`;systemd/launchd 自动重启;云端对隧道端口做存活探测告警 |
144
+ | 电脑 A 意外共享账号 / 权限外泄 | 等同于把手机 root shell 给了外人 | authorized_keys 强制 `permitopen` + `command=/bin/false`;定期轮换密钥 |
145
+ | 多用户并发操作同一台手机 | hdc 本身不做锁,命令相互干扰 | 当前单用户场景无问题;需要时在电脑 A 前加一个串行化代理,或直接约定"一机一人" |
146
+ | 长连接 / 阻塞命令(如 `hdc shell` 交互) | 隧道中断时云端客户端可能僵死 | 命令层加 `timeout` 包裹(参考仓库 [_utils.py:79-174](src/droidrun/agent/harmony/_utils.py#L79-L174) 的做法) |
147
+
148
+ ---
149
+
150
+ ### 最小可行验证(MVP,20 分钟以内可跑通)
151
+
152
+ 1. 电脑 A 装好鸿蒙 SDK,USB 连上一台手机,`hdc list targets` 应看到设备。
153
+ 2. 电脑 A:`hdc kill && hdc -m -s 127.0.0.1:8710`。
154
+ 3. 电脑 A:`ssh -N -R 127.0.0.1:8710:127.0.0.1:8710 <user>@<云端>`(先手动跑一次验证打通)。
155
+ 4. 云端新开一个 shell:
156
+ ```sh
157
+ export HDC_SERVER_HOST=127.0.0.1 HDC_SERVER_PORT=8710
158
+ hdc list targets # 看到手机 serial 即成功
159
+ hdc -t <serial> shell uname -a # 远端执行
160
+ echo "hello" > /tmp/a && hdc -t <serial> file send /tmp/a /data/local/tmp/a_from_cloud
161
+ hdc -t <serial> file recv /data/local/tmp/a_from_cloud /tmp/b && cat /tmp/b
162
+ ```
163
+ 5. 全部通过即说明协议层打通。之后把 SSH 隧道包成 `autossh` / systemd 常驻、把 `hdc -m` 写进电脑 A 开机项即可上线。
164
+
165
+ MVP 通过即代表方案无拦路虎,后续工程化只是"脚本化 + 监控告警 + 多手机接入时的 serial 路由约定"。
166
+
167
+ ---
168
+
169
+ ### 需要在电脑 A / 云端执行的关键文件/配置清单
170
+
171
+ - 电脑 A:开机自启脚本或 systemd user unit,内容为 `hdc kill; hdc -m -s 127.0.0.1:8710`。
172
+ - 电脑 A:`autossh` 常驻任务(参数见上文)。
173
+ - 云端:目标用户 `~/.ssh/authorized_keys` 中加入**受限隧道公钥**(`command="/bin/false"`, `permitopen="127.0.0.1:8710"`)。
174
+ - 云端:在使用 hdc 的服务/登录环境中导出 `HDC_SERVER_HOST=127.0.0.1`、`HDC_SERVER_PORT=8710`(写入 `/etc/profile.d/hdc.sh` 或业务容器的环境变量)。
175
+ - 双方:hdc 二进制版本锁定(记录到运维 runbook)。
176
+
177
+ ---
178
+
179
+ ## Plan v2 (2026-04-22T08:30:20)
180
+
181
+ ## 方案可行性分析:云端服务器通过 hdc 远程驱动本地真机(含 socket 后端)
182
+
183
+ ### Context(背景与目标)
184
+
185
+ - **现状**:云端服务器已具备鸿蒙开发环境(含 hdc),但没有物理 USB 口。
186
+ - **新目标**:云端不仅能跑 `hdc` 命令,还要能**像 droidrun 一样完整驱动这台手机**;且为了高效,**UI 树(a11y 树)和截图必须走 socket 后端**,不退化到 `hdc shell`。
187
+ - **网络假设(用户已确认)**:电脑 A 可主动连云端,云端无法回连 → 所有跨网通道走**电脑 A 发起**的 SSH。
188
+ - **规模假设**:当前一台手机,未来可能多台。
189
+ - **参考仓库**:[droidrun](/Users/legend/Desktop/Code/droidrun)。关键代码已读确认:
190
+ - `hdc fport` 在 [_uitest_rpc.py:741-752](droidrun/hdcutils/_uitest_rpc.py#L741-L752) 建立。
191
+ - 每个 `UitestRpcClient` **只分配一个** `_local_port`([_uitest_rpc.py:744](droidrun/hdcutils/_uitest_rpc.py#L744)),main/layout/screen **三个 socket 共用同一本地端口**([_uitest_rpc.py:519](droidrun/hdcutils/_uitest_rpc.py#L519)、[_uitest_rpc.py:795](droidrun/hdcutils/_uitest_rpc.py#L795)、[_uitest_rpc.py:799-800](droidrun/hdcutils/_uitest_rpc.py#L799-L800)),因为远端 `localabstract:uitest_socket` 支持多连接复用。
192
+ - 结论:**每台手机只需 1 条额外隧道**(+ 1 条公用的 hdc 协议隧道),不需要 3 条。
193
+
194
+ ---
195
+
196
+ ### 核心困难:fport 本地端口不在云端
197
+
198
+ 当 `hdc` 环境变量指向远程 server 时,云端执行的 `hdc fport tcp:PORT localabstract:uitest_socket` 实际在**电脑 A**的 `127.0.0.1:PORT` 上开监听,而 droidrun 紧接着在**云端进程里**跑 `asyncio.open_connection("127.0.0.1", PORT)`([_uitest_rpc.py:523](droidrun/hdcutils/_uitest_rpc.py#L523) / [_uitest_rpc.py:800](droidrun/hdcutils/_uitest_rpc.py#L800) / [_uitest_rpc.py:887-901](droidrun/hdcutils/_uitest_rpc.py#L887-L901))——云端上这个端口没人监听,直接失败。
199
+
200
+ 这是唯一真正需要解决的工程点。命令层(hdc shell/file/list)已在上一版方案中打通,不再赘述。
201
+
202
+ ---
203
+
204
+ ### 三条可行路径(按改动量递增)
205
+
206
+ #### 路径 A:**固定 uitest 端口 + 双反向隧道**(推荐 MVP)
207
+
208
+ 让 `_local_port` 不再动态分配,改用约定好的固定端口;电脑 A 的 SSH 反向隧道预先把这个端口也打穿。
209
+
210
+ **改动点**:
211
+ - [_uitest_rpc.py:744](droidrun/hdcutils/_uitest_rpc.py#L744) 的 `get_free_port()` 改为"优先读环境变量 `DROIDRUN_UITEST_LOCAL_PORT`,否则退化到现行动态分配"。单行改动,不破坏本地开发体验。
212
+ - 电脑 A 的 SSH 隧道由一条变两条:
213
+ ```sh
214
+ autossh -N \
215
+ -R 127.0.0.1:8710:127.0.0.1:8710 \
216
+ -R 127.0.0.1:18012:127.0.0.1:18012 \
217
+ <user>@<云端>
218
+ ```
219
+ - 云端业务环境:
220
+ ```sh
221
+ export HDC_SERVER_HOST=127.0.0.1
222
+ export HDC_SERVER_PORT=8710
223
+ export DROIDRUN_UITEST_LOCAL_PORT=18012
224
+ ```
225
+
226
+ **多手机扩展**:
227
+ - 每加一台手机,云端为其分配一个独立端口(18013、18014…),反向隧道对应加一条 `-R`。
228
+ - droidrun 的 `UitestRpcClient` 本就按设备 serial 实例化,`_local_port` 端口在业务启动时按 serial → 端口映射注入即可。
229
+ - 约定一张简单的映射表(YAML/env),运维侧维护。
230
+
231
+ **优点**:
232
+ - 代码改动最小(一两行 + env 注入),可 20 分钟落地。
233
+ - 性能开销仅"一次 SSH 加密 + 一次 TCP 跳",JPEG 0.5x 屏幕流在公网可稳定(典型 100KB–1MB/帧)。
234
+ - 无新增运行时组件,可靠性等同 SSH。
235
+
236
+ **缺点**:
237
+ - 端口池由人手动维护,扩容到几十台时琐碎。
238
+ - 云端业务若并发多实例同一设备,会冲突(但这本来 uitest daemon 也不支持并发多 client)。
239
+
240
+ ---
241
+
242
+ #### 路径 B:**电脑 A 侧跑 uitest gateway 代理**(推荐进化版)
243
+
244
+ 电脑 A 上常驻一个小型代理进程,专门负责:本地建 fport + 连 uitest abstract socket,对外(云端方向)暴露一个按"设备 serial"多路复用的统一入口。
245
+
246
+ **架构**:
247
+ ```
248
+ 云端 droidrun (多实例 / 多设备)
249
+ ↓ asyncio.open_connection("127.0.0.1", 9000)
250
+ ↓ SSH reverse tunnel -R 9000:127.0.0.1:9000
251
+ 电脑 A: uitest-gateway (监听 9000)
252
+ ├─ 握手帧:选定 target serial
253
+ ├─ 内部 hdc fport tcp:动态 localabstract:uitest_socket
254
+ └─ 把云端连接的字节双向桥到本地 fport 端口
255
+ 手机 uitest daemon
256
+ ```
257
+
258
+ **对 droidrun 的改动**:
259
+ - `_ensure_forward`:在云端启用"gateway 模式"时跳过 `hdc fport`(因为 fport 由 gateway 代管)。
260
+ - `_ensure_socket` / `_ensure_layout_socket_unlocked` / `_ensure_screen_socket_unlocked`:三处 `open_connection("127.0.0.1", port)` 改为"连 gateway + 发一个 1 帧的握手(设备 serial + 通道类型)"。
261
+ - 用 `ui_backend` 类似的配置开关控制(`"socket"` / `"socket-gateway"` / `"shell"`),本地开发不变。
262
+
263
+ **优点**:
264
+ - 云端不再需要感知电脑 A 的端口布局,扩容手机零运维。
265
+ - 代理层可做图像降帧/降采样(如把 0.5x 再压到 0.25x 或跳帧),**公网带宽可控性显著好于路径 A**。
266
+ - 支持多用户/多 droidrun 实例并发,按 serial 排他加锁,顺便解决 uitest daemon 单 client 的限制。
267
+ - 隧道只有一条(9000 复用),配置简单。
268
+
269
+ **缺点**:
270
+ - 需要实现并维护 gateway(估计 300–600 行 Python/Go)。
271
+ - 协议设计:握手 + 三通道多路复用 + 错误传播,要做好才能稳。
272
+ - 对 droidrun 的三个 `open_connection` 站点做抽象(`_connect_uitest_channel(kind)` 之类的方法),中等改动。
273
+
274
+ ---
275
+
276
+ #### 路径 C:**把 driver 下沉到电脑 A,云端只剩 agent/LLM**(性能最优)
277
+
278
+ 彻底拆分:云端只跑"决策层"(LLM agent、规划、状态机),**真正驱动手机的代码跑在电脑 A**,两者通过一层更高抽象的 RPC(HTTP/gRPC/WebSocket)沟通。
279
+
280
+ **边界**:
281
+ - 云端 → 电脑 A:`dump_layout` / `snapshot` / `tap(x, y)` / `input_text` / `set_rotation` 等"动作级"RPC。
282
+ - 电脑 A → 云端:事件回调、屏幕帧流(可按云端 agent 实际消费频率拉,而非手机推多少传多少)。
283
+
284
+ **对仓库的改动**:
285
+ - 把 `HdcDevice` 和 `UitestRpcClient` 抽成"本地 driver"和"远端 driver"两实现,共享同一套接口。
286
+ - 远端 driver 客户端在云端,服务端在电脑 A(可以复用 droidrun 的现有实现 + 一层 HTTP 包装)。
287
+
288
+ **优点**:
289
+ - 性能最优:uitest socket 不跨公网,图像可在电脑 A 就地压缩/编码(甚至转成 H.264 流)。
290
+ - 延迟可控(RPC 频率由云端主动拉而非被动接)。
291
+ - 最符合"把沉重 I/O 留在设备侧、把智力留在云端"的分布式架构直觉。
292
+
293
+ **缺点**:
294
+ - 改动最大:需要设计接口、拆代码、引入 RPC 框架、做双向错误/超时/重连。
295
+ - 落地周期按周计。
296
+ - 调试链路更长(问题可能出在云端、隧道、电脑 A、手机四者任意一层)。
297
+
298
+ ---
299
+
300
+ ### 推荐路线
301
+
302
+ **分两阶段走**:
303
+
304
+ 1. **阶段一(本周内):路径 A**
305
+ - 最小改动验证整条链路:反向隧道 × 2 + 环境变量 + `get_free_port()` 可被 env 覆盖。
306
+ - 产出:一份可复现的 MVP 脚本 + 对 droidrun 的 1–2 行 patch。
307
+ - 验收:云端调 `HarmonyDriver.get_ui_tree()` 和 `capture_screen()` 能正常拿到内容;`ui_backend=socket` 不降级。
308
+
309
+ 2. **阶段二(若长期使用 / 多手机多用户):路径 B**
310
+ - 在路径 A 稳定后,把 gateway 写出来、切换 `ui_backend=socket-gateway`。
311
+ - 阶段一的隧道和 env 管理开销消失,扩容成本随之趋零。
312
+
313
+ **暂不推荐路径 C**,除非云端并发跑几十路 agent 需要严格带宽控制,或屏幕流的公网延迟成为 agent 决策瓶颈再回头考虑。
314
+
315
+ ---
316
+
317
+ ### 架构图(目标形态:路径 A + hdc 命令兼容)
318
+
319
+ ```
320
+ ┌───────────────────────────┐ ┌──────────────────────────┐
321
+ │ 云端服务器 │ │ 电脑 A │
322
+ │ ───────────────────────── │ │ ──────────────────── │
323
+ │ HDC_SERVER_HOST=127.0.0.1 │ │ │
324
+ │ HDC_SERVER_PORT=8710 │◄── SSH -R 8710 ─────────────┤ hdc -m -s 127.0.0.1:8710 │
325
+ │ DROIDRUN_UITEST_LOCAL_ │ │ │
326
+ │ PORT=18012 │◄── SSH -R 18012 ────────────┤ 127.0.0.1:18012 │
327
+ │ │ (电脑 A 发起的 autossh) │ ▲ │
328
+ │ droidrun HarmonyDriver │ │ │ hdc fport │
329
+ │ ├─ hdc list targets │ │ │ │
330
+ │ ├─ UitestRpcClient │ │ localabstract: │
331
+ │ │ open_connection( │ │ uitest_socket │
332
+ │ │ 127.0.0.1, 18012) │ │ │ │
333
+ │ └─ get_ui_tree / │ │ ▼ │
334
+ │ capture_screen │ │ 📱 手机 │
335
+ └───────────────────────────┘ └──────────────────────────┘
336
+ ```
337
+
338
+ ---
339
+
340
+ ### 对 droidrun 仓库的具体改动(路径 A)
341
+
342
+ 1. **[_uitest_rpc.py:741-752](droidrun/hdcutils/_uitest_rpc.py#L741-L752) `_ensure_forward()`**
343
+ - 读取 env `DROIDRUN_UITEST_LOCAL_PORT`(或构造参数注入),若存在则替代 `get_free_port()`。
344
+ - 多手机场景:支持 `DROIDRUN_UITEST_LOCAL_PORT_<serial>` 或按构造参数传入。
345
+ 2. **端口占用清理**:在复用固定端口时,`_ensure_forward` 前面加一次 `hdc fport rm` 的容错(避免上次崩溃残留)。仓库已有 `fport rm` 逻辑([_uitest_rpc.py:754-765](droidrun/hdcutils/_uitest_rpc.py#L754-L765)),仅需在 `_ensure_forward` 前也调一次。
346
+ 3. **配置项**:在 `config_manager.py` 加一个可选字段(如 `device.uitest_local_port`),方便多实例编排。
347
+
348
+ **非侵入性**:本地开发不设这些 env/配置时,行为与现在完全一致。
349
+
350
+ ---
351
+
352
+ ### 安全加固
353
+
354
+ - `hdc -m` 仅监听 `127.0.0.1`。
355
+ - `uitest_socket` 的固定本地端口同样仅监听 `127.0.0.1`。
356
+ - SSH 账号:`authorized_keys` 用 `command="/bin/false"` + `permitopen="127.0.0.1:8710"` 和每个 `permitopen="127.0.0.1:1801X"` 约束。
357
+ - 云端 sshd:`AllowTcpForwarding yes`、`GatewayPorts no`。
358
+ - 合规:hdc shell + uitest 等价于手机 root 级控制,凭据一机一号、可审计、可吊销。
359
+
360
+ ---
361
+
362
+ ### 风险清单(相对上一版新增项加粗)
363
+
364
+ | 风险 | 影响 | 缓解 |
365
+ |---|---|---|
366
+ | hdc client/server 版本不一致 | 协议不兼容直接断连 | 云端与电脑 A 使用同一版本的 hdc |
367
+ | SSH 隧道断连 | 所有命令与 socket 失败 | autossh + `ServerAliveInterval=30` + systemd 常驻 |
368
+ | **公网抖动导致屏幕流卡顿** | agent 看到的帧不新鲜 | 仓库屏幕推送走"保留最新一帧"策略([_uitest_rpc.py:436-479](droidrun/hdcutils/_uitest_rpc.py#L436-L479)),天然容忍;若仍不够,进化到路径 B 做代理层降帧 |
369
+ | **uitest daemon 单 client 限制** | 多云端进程抢同一手机会互相踢 | 路径 A 通过单实例约束规避;路径 B 在 gateway 层做 serial 级串行化锁 |
370
+ | **固定端口冲突(多手机 / 多部署)** | fport 建立失败 | 每台手机独立端口;部署前 `hdc fport ls` 清理 |
371
+ | 电脑 A 账号外泄 | 等同手机 root 泄漏 | `permitopen` 白名单、密钥轮换 |
372
+
373
+ ---
374
+
375
+ ### 最小可行验证(MVP)
376
+
377
+ 1. 电脑 A:
378
+ ```sh
379
+ hdc kill
380
+ hdc -m -s 127.0.0.1:8710
381
+ hdc list targets # 确保本地能看到手机
382
+ ```
383
+ 2. 电脑 A:
384
+ ```sh
385
+ autossh -M 0 -N -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes \
386
+ -R 127.0.0.1:8710:127.0.0.1:8710 \
387
+ -R 127.0.0.1:18012:127.0.0.1:18012 \
388
+ <user>@<云端>
389
+ ```
390
+ 3. 对 droidrun 打 patch:`_ensure_forward()` 读 env(改动 ≤10 行)。
391
+ 4. 云端:
392
+ ```sh
393
+ export HDC_SERVER_HOST=127.0.0.1 HDC_SERVER_PORT=8710
394
+ export DROIDRUN_UITEST_LOCAL_PORT=18012
395
+ python -c "
396
+ import asyncio
397
+ from droidrun.agent.harmony import HarmonyDriver
398
+ async def main():
399
+ d = await HarmonyDriver.create(serial='<serial>')
400
+ print(await d.get_ui_tree()) # 走 socket 后端
401
+ png = await d.capture_screen()
402
+ open('/tmp/x.png','wb').write(png)
403
+ asyncio.run(main())
404
+ "
405
+ ```
406
+ 5. 验证 `/tmp/x.png` 有效 + `ui_backend=socket` 模式没有触发 shell 降级(仓库日志里会打印)。
407
+
408
+ 通过即说明 a11y tree 与截图的 socket 路径已在云端跑通。
409
+
410
+ ---
411
+
412
+ ### 是否要立刻启动路径 B / C 的探讨
413
+
414
+ 视运行规模决定:
415
+ - 单用户 / ≤3 台手机 / 主要是开发验证:**停在路径 A**。
416
+ - 多用户 / 十台以上手机 / 需要并发共享设备:**启动路径 B**(gateway)。
417
+ - 跨大区部署、公网带宽紧张、agent 决策频率高:**考虑路径 C**。
418
+
419
+ 本文档聚焦"能跑通 + 不降级 socket 后端"这一首要目标,推荐按路径 A 落地后再评估是否升级。
420
+