world-model-optimizer 0.2.0__tar.gz → 0.2.1__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 (565) hide show
  1. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/PKG-INFO +41 -15
  2. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/README.md +40 -14
  3. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/pyproject.toml +13 -4
  4. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/app.py +221 -40
  5. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/app_test.py +685 -5
  6. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/harness_app.py +26 -108
  7. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/harness_app_test.py +133 -204
  8. world_model_optimizer-0.2.0/wmo/cli/harness_distill.py → world_model_optimizer-0.2.1/wmo/cli/model_app.py +491 -93
  9. world_model_optimizer-0.2.0/wmo/cli/harness_distill_test.py → world_model_optimizer-0.2.1/wmo/cli/model_app_test.py +312 -36
  10. world_model_optimizer-0.2.1/wmo/cli/model_roles.py +138 -0
  11. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/model_roles_test.py +137 -1
  12. world_model_optimizer-0.2.1/wmo/cli/optimize_model_app.py +1425 -0
  13. world_model_optimizer-0.2.1/wmo/cli/optimize_model_app_test.py +1441 -0
  14. world_model_optimizer-0.2.1/wmo/cli/pool_registry.py +791 -0
  15. world_model_optimizer-0.2.1/wmo/cli/pool_registry_test.py +834 -0
  16. world_model_optimizer-0.2.1/wmo/cli/route_app.py +1147 -0
  17. world_model_optimizer-0.2.1/wmo/cli/route_app_test.py +2547 -0
  18. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/ui.py +16 -10
  19. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/config.py +18 -2
  20. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/config_test.py +13 -1
  21. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/settings.py +6 -0
  22. world_model_optimizer-0.2.1/wmo/conftest.py +46 -0
  23. world_model_optimizer-0.2.1/wmo/distill/README.md +96 -0
  24. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/config.py +136 -21
  25. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/config_test.py +74 -48
  26. world_model_optimizer-0.2.1/wmo/distill/configs/distill-headline.toml +89 -0
  27. world_model_optimizer-0.2.1/wmo/distill/configs/distill-qwen-anchor.toml +145 -0
  28. world_model_optimizer-0.2.1/wmo/distill/configs/distill-smoke-dev.toml +70 -0
  29. world_model_optimizer-0.2.1/wmo/distill/configs/distill-tau2-smoke.toml +74 -0
  30. world_model_optimizer-0.2.1/wmo/distill/configs/tb2-harbor-job-template.yaml +15 -0
  31. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/cost.py +0 -4
  32. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/cost_test.py +0 -2
  33. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/data.py +2 -35
  34. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/data_test.py +0 -52
  35. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/loop.py +136 -69
  36. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/loop_test.py +85 -0
  37. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/rendering.py +0 -13
  38. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/rollouts.py +46 -1
  39. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/rollouts_test.py +3 -0
  40. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/store.py +187 -9
  41. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/store_test.py +309 -0
  42. world_model_optimizer-0.2.1/wmo/distill/tau2.py +628 -0
  43. world_model_optimizer-0.2.1/wmo/distill/tau2_proxy.py +328 -0
  44. world_model_optimizer-0.2.1/wmo/distill/tau2_proxy_test.py +288 -0
  45. world_model_optimizer-0.2.1/wmo/distill/tau2_test.py +359 -0
  46. world_model_optimizer-0.2.1/wmo/distill/xtoken/__init__.py +68 -0
  47. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/chunks.py +0 -5
  48. world_model_optimizer-0.2.1/wmo/distill/xtoken/prompt_logprobs_test.py +604 -0
  49. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/__init__.py +10 -1
  50. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/build.py +34 -1
  51. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/build_test.py +35 -1
  52. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/eval_suites.py +4 -1
  53. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/closed_loop.py +87 -2
  54. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/closed_loop_test.py +171 -0
  55. world_model_optimizer-0.2.1/wmo/env/llm_agent.py +243 -0
  56. world_model_optimizer-0.2.1/wmo/env/llm_agent_test.py +271 -0
  57. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/grid.py +4 -6
  58. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/open_loop.py +10 -10
  59. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_runtime.py +7 -1
  60. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_runtime_test.py +38 -0
  61. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/__init__.py +6 -0
  62. world_model_optimizer-0.2.1/wmo/optimize/cluster_labels.py +89 -0
  63. world_model_optimizer-0.2.1/wmo/optimize/cluster_labels_test.py +64 -0
  64. world_model_optimizer-0.2.1/wmo/optimize/compression.py +490 -0
  65. world_model_optimizer-0.2.1/wmo/optimize/compression_endpoint.py +418 -0
  66. world_model_optimizer-0.2.1/wmo/optimize/compression_endpoint_test.py +616 -0
  67. world_model_optimizer-0.2.1/wmo/optimize/compression_test.py +508 -0
  68. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/knn.py +198 -3
  69. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/outcomes.py +76 -0
  70. world_model_optimizer-0.2.1/wmo/optimize/outcomes_test.py +182 -0
  71. world_model_optimizer-0.2.1/wmo/optimize/pipeline.py +472 -0
  72. world_model_optimizer-0.2.1/wmo/optimize/pipeline_test.py +351 -0
  73. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/policy.py +442 -22
  74. world_model_optimizer-0.2.1/wmo/optimize/policy_test.py +1266 -0
  75. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/report.py +35 -2
  76. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/report_test.py +99 -0
  77. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/routing.py +63 -16
  78. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/routing_test.py +72 -1
  79. world_model_optimizer-0.2.1/wmo/optimize/scorecard.py +1100 -0
  80. world_model_optimizer-0.2.1/wmo/optimize/scorecard_test.py +973 -0
  81. world_model_optimizer-0.2.1/wmo/optimize/sweep.py +614 -0
  82. world_model_optimizer-0.2.1/wmo/optimize/sweep_test.py +394 -0
  83. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/anthropic.py +29 -5
  84. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/azure_openai.py +21 -0
  85. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/base.py +33 -2
  86. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/bedrock.py +115 -12
  87. world_model_optimizer-0.2.1/wmo/providers/bedrock_test.py +330 -0
  88. world_model_optimizer-0.2.1/wmo/providers/catalog.py +179 -0
  89. world_model_optimizer-0.2.1/wmo/providers/catalog_test.py +128 -0
  90. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/openai.py +23 -1
  91. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/openai_responses.py +12 -0
  92. world_model_optimizer-0.2.1/wmo/providers/openrouter.py +212 -0
  93. world_model_optimizer-0.2.1/wmo/providers/openrouter_pricing.py +283 -0
  94. world_model_optimizer-0.2.1/wmo/providers/openrouter_pricing_test.py +239 -0
  95. world_model_optimizer-0.2.1/wmo/providers/openrouter_test.py +329 -0
  96. world_model_optimizer-0.2.1/wmo/providers/pool.py +571 -0
  97. world_model_optimizer-0.2.1/wmo/providers/pool_test.py +930 -0
  98. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/registry.py +2 -0
  99. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/openai_test.py +123 -2
  100. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tinker.py +43 -9
  101. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/waterfall.py +11 -1
  102. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/waterfall_test.py +22 -0
  103. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/repo_layout_test.py +9 -5
  104. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/builds.py +2 -1
  105. world_model_optimizer-0.2.1/wmo/serving/chat.py +1828 -0
  106. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/chat_openai_client_test.py +168 -12
  107. world_model_optimizer-0.2.1/wmo/serving/chat_test.py +2930 -0
  108. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/endpoint_config.py +10 -1
  109. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/endpoint_config_test.py +12 -1
  110. world_model_optimizer-0.2.1/wmo/serving/query_embeddings.py +199 -0
  111. world_model_optimizer-0.2.1/wmo/serving/query_embeddings_test.py +156 -0
  112. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/savings.py +11 -2
  113. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/savings_test.py +25 -0
  114. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/server.py +12 -1
  115. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/server_test.py +48 -0
  116. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/__init__.py +2 -0
  117. world_model_optimizer-0.2.1/wmo/tracking/pricing.py +156 -0
  118. world_model_optimizer-0.2.1/wmo/tracking/pricing_test.py +118 -0
  119. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/tracker.py +46 -2
  120. world_model_optimizer-0.2.1/wmo/tracking/tracker_test.py +171 -0
  121. world_model_optimizer-0.2.0/wmo/cli/model_roles.py +0 -82
  122. world_model_optimizer-0.2.0/wmo/cli/route_app.py +0 -274
  123. world_model_optimizer-0.2.0/wmo/cli/route_app_test.py +0 -319
  124. world_model_optimizer-0.2.0/wmo/conftest.py +0 -19
  125. world_model_optimizer-0.2.0/wmo/env/llm_agent.py +0 -93
  126. world_model_optimizer-0.2.0/wmo/env/llm_agent_test.py +0 -100
  127. world_model_optimizer-0.2.0/wmo/optimize/outcomes_test.py +0 -77
  128. world_model_optimizer-0.2.0/wmo/optimize/policy_test.py +0 -612
  129. world_model_optimizer-0.2.0/wmo/providers/bedrock_test.py +0 -144
  130. world_model_optimizer-0.2.0/wmo/providers/pool.py +0 -170
  131. world_model_optimizer-0.2.0/wmo/providers/pool_test.py +0 -219
  132. world_model_optimizer-0.2.0/wmo/serving/chat.py +0 -878
  133. world_model_optimizer-0.2.0/wmo/serving/chat_test.py +0 -936
  134. world_model_optimizer-0.2.0/wmo/tracking/pricing.py +0 -99
  135. world_model_optimizer-0.2.0/wmo/tracking/pricing_test.py +0 -60
  136. world_model_optimizer-0.2.0/wmo/tracking/tracker_test.py +0 -83
  137. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/.gitignore +0 -0
  138. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/conftest.py +0 -0
  139. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/LICENSE +0 -0
  140. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/__init__.py +0 -0
  141. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/__init__.py +0 -0
  142. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/anthropic.py +0 -0
  143. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/anthropic_test.py +0 -0
  144. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/aws_mantle.py +0 -0
  145. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/azure_openai.py +0 -0
  146. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/azure_openai_test.py +0 -0
  147. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/base.py +0 -0
  148. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/bedrock.py +0 -0
  149. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/bedrock_test.py +0 -0
  150. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/openai.py +0 -0
  151. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/adapters/openai_test.py +0 -0
  152. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/classify.py +0 -0
  153. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/classify_test.py +0 -0
  154. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/import_hygiene_test.py +0 -0
  155. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/pricing.py +0 -0
  156. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/pricing_test.py +0 -0
  157. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/py.typed +0 -0
  158. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/types.py +0 -0
  159. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/types_test.py +0 -0
  160. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/waterfall.py +0 -0
  161. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/packages/llm-waterfall/llm_waterfall/waterfall_test.py +0 -0
  162. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/__init__.py +0 -0
  163. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/__init__.py +0 -0
  164. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/default.py +0 -0
  165. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/definitions_test.py +0 -0
  166. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/meta.py +0 -0
  167. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/optimizer.py +0 -0
  168. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/optimizer_test.py +0 -0
  169. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/project.py +0 -0
  170. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/agents/project_test.py +0 -0
  171. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/api_test.py +0 -0
  172. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/__init__.py +0 -0
  173. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/agent_session.py +0 -0
  174. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/agent_session_test.py +0 -0
  175. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/e2b_cmds.py +0 -0
  176. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/e2b_cmds_test.py +0 -0
  177. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/eval_closed_loop.py +0 -0
  178. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/eval_closed_loop_test.py +0 -0
  179. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/hosted_session.py +0 -0
  180. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/hosted_session_test.py +0 -0
  181. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/ingest_cmd.py +0 -0
  182. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/ingest_cmd_test.py +0 -0
  183. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/platform_cmds.py +0 -0
  184. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/platform_cmds_test.py +0 -0
  185. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/session_state.py +0 -0
  186. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/session_state_test.py +0 -0
  187. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/ui_test.py +0 -0
  188. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/workspace_sync.py +0 -0
  189. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/cli/workspace_sync_test.py +0 -0
  190. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/__init__.py +0 -0
  191. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/card.py +0 -0
  192. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/card_test.py +0 -0
  193. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/dotenv.py +0 -0
  194. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/dotenv_test.py +0 -0
  195. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/settings_test.py +0 -0
  196. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/store.py +0 -0
  197. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/config/store_test.py +0 -0
  198. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/__init__.py +0 -0
  199. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/api_test.py +0 -0
  200. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/apps.py +0 -0
  201. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/apps_test.py +0 -0
  202. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/brave.py +0 -0
  203. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/brave_test.py +0 -0
  204. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/connector.py +0 -0
  205. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/connector_test.py +0 -0
  206. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/credentials.py +0 -0
  207. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/credentials_test.py +0 -0
  208. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/github.py +0 -0
  209. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/github_test.py +0 -0
  210. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/google.py +0 -0
  211. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/google_test.py +0 -0
  212. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/notion.py +0 -0
  213. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/notion_test.py +0 -0
  214. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/oauth.py +0 -0
  215. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/oauth_test.py +0 -0
  216. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/slack.py +0 -0
  217. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/slack_test.py +0 -0
  218. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/store.py +0 -0
  219. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/store_test.py +0 -0
  220. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/types.py +0 -0
  221. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/connect/types_test.py +0 -0
  222. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/__init__.py +0 -0
  223. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/parsing.py +0 -0
  224. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/parsing_test.py +0 -0
  225. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/render.py +0 -0
  226. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/render_test.py +0 -0
  227. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/text.py +0 -0
  228. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/types.py +0 -0
  229. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/core/types_test.py +0 -0
  230. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/__init__.py +0 -0
  231. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/agents.py +0 -0
  232. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/agents_test.py +0 -0
  233. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/deadlines.py +0 -0
  234. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/deadlines_test.py +0 -0
  235. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/fake_tinker.py +0 -0
  236. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/fake_tinker_test.py +0 -0
  237. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/gate.py +0 -0
  238. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/gate_test.py +0 -0
  239. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/renderers.py +0 -0
  240. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/renderers_test.py +0 -0
  241. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/rendering_test.py +0 -0
  242. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/samples.py +0 -0
  243. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/samples_test.py +0 -0
  244. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/teacher.py +0 -0
  245. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/teacher_test.py +0 -0
  246. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/tokens.py +0 -0
  247. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/tokens_test.py +0 -0
  248. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/tracking.py +0 -0
  249. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/tracking_test.py +0 -0
  250. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/tripwire.py +0 -0
  251. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/tripwire_test.py +0 -0
  252. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/byte_offsets.py +0 -0
  253. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/byte_offsets_test.py +0 -0
  254. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/chunks_test.py +0 -0
  255. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/prompt_logprobs.py +0 -0
  256. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/teacher_render.py +0 -0
  257. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/distill/xtoken/teacher_render_test.py +0 -0
  258. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/autoconfig.py +0 -0
  259. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/autoconfig_test.py +0 -0
  260. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/demo.py +0 -0
  261. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/demo_test.py +0 -0
  262. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/eval_suites_test.py +0 -0
  263. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/grounding.py +0 -0
  264. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/grounding_test.py +0 -0
  265. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/integration_test.py +0 -0
  266. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/knowledge.py +0 -0
  267. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/knowledge_test.py +0 -0
  268. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/loader.py +0 -0
  269. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/play.py +0 -0
  270. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/play_test.py +0 -0
  271. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/prompts.py +0 -0
  272. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/replay.py +0 -0
  273. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/replay_test.py +0 -0
  274. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/reporting.py +0 -0
  275. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/workspace.py +0 -0
  276. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/workspace_test.py +0 -0
  277. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/world_model.py +0 -0
  278. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/engine/world_model_test.py +0 -0
  279. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/__init__.py +0 -0
  280. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/base.py +0 -0
  281. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/base_test.py +0 -0
  282. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/episode.py +0 -0
  283. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/episode_test.py +0 -0
  284. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/scenarios.py +0 -0
  285. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/env/scenarios_test.py +0 -0
  286. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/__init__.py +0 -0
  287. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/agreement.py +0 -0
  288. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/agreement_test.py +0 -0
  289. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/base.py +0 -0
  290. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/base_test.py +0 -0
  291. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/closed_loop.py +0 -0
  292. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/closed_loop_test.py +0 -0
  293. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/failover.py +0 -0
  294. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/failover_test.py +0 -0
  295. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/gold.py +0 -0
  296. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/gold_test.py +0 -0
  297. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/grid_plot.py +0 -0
  298. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/grid_plot_test.py +0 -0
  299. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/grid_test.py +0 -0
  300. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/__init__.py +0 -0
  301. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/agent.py +0 -0
  302. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/agent_test.py +0 -0
  303. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/ctrf.py +0 -0
  304. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/ctrf_test.py +0 -0
  305. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/e2b_environment.py +0 -0
  306. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/e2b_environment_test.py +0 -0
  307. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/e2b_template_policy.py +0 -0
  308. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/scorer.py +0 -0
  309. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/scorer_test.py +0 -0
  310. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/tasks.py +0 -0
  311. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/harbor/tasks_test.py +0 -0
  312. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/open_loop_test.py +0 -0
  313. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/tasks.py +0 -0
  314. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/evals/tasks_test.py +0 -0
  315. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/__init__.py +0 -0
  316. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/code_runtime.py +0 -0
  317. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/code_runtime_test.py +0 -0
  318. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/create.py +0 -0
  319. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/create_test.py +0 -0
  320. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/delta.py +0 -0
  321. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/delta_test.py +0 -0
  322. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/doc.py +0 -0
  323. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/doc_test.py +0 -0
  324. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/e2b_ledger.py +0 -0
  325. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/e2b_ledger_test.py +0 -0
  326. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/e2b_reap.py +0 -0
  327. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/e2b_reap_test.py +0 -0
  328. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/e2b_sandbox.py +0 -0
  329. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/e2b_sandbox_test.py +0 -0
  330. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/environment.py +0 -0
  331. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/live_session.py +0 -0
  332. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/live_session_test.py +0 -0
  333. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/mutate.py +0 -0
  334. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/mutate_test.py +0 -0
  335. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_e2b.py +0 -0
  336. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_e2b_test.py +0 -0
  337. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_entry/entry.ts +0 -0
  338. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_entry/runner_frames.ts +0 -0
  339. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_entry/runner_live.ts +0 -0
  340. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_entry/runner_service.ts +0 -0
  341. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_entry/runner_stdio.ts +0 -0
  342. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_entry/runner_termination.ts +0 -0
  343. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_local.py +0 -0
  344. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_local_test.py +0 -0
  345. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_vendor.py +0 -0
  346. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/pi_vendor_test.py +0 -0
  347. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/population.py +0 -0
  348. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/population_test.py +0 -0
  349. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/project_proposer.py +0 -0
  350. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/project_proposer_test.py +0 -0
  351. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/proposer.py +0 -0
  352. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/proposer_test.py +0 -0
  353. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/runner_link.py +0 -0
  354. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/runner_link_test.py +0 -0
  355. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/runtime.py +0 -0
  356. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/runtime_test.py +0 -0
  357. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/scoring.py +0 -0
  358. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/scoring_test.py +0 -0
  359. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/skills.py +0 -0
  360. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/skills_test.py +0 -0
  361. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/source_tree.py +0 -0
  362. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/source_tree_test.py +0 -0
  363. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/store.py +0 -0
  364. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/store_test.py +0 -0
  365. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/tools.py +0 -0
  366. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/tools_test.py +0 -0
  367. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/manifest.sha256 +0 -0
  368. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/CHANGELOG.md +0 -0
  369. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/LICENSE +0 -0
  370. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/README.md +0 -0
  371. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/VENDOR.md +0 -0
  372. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/docs/agent-harness.md +0 -0
  373. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/docs/durable-harness.md +0 -0
  374. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/docs/hooks.md +0 -0
  375. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/docs/models.md +0 -0
  376. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/docs/observability.md +0 -0
  377. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/package.json +0 -0
  378. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/agent-loop.ts +0 -0
  379. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/agent.ts +0 -0
  380. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/agent-harness.ts +0 -0
  381. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/compaction/branch-summarization.ts +0 -0
  382. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/compaction/compaction.ts +0 -0
  383. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/compaction/utils.ts +0 -0
  384. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/env/nodejs.ts +0 -0
  385. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/messages.ts +0 -0
  386. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/prompt-templates.ts +0 -0
  387. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/jsonl-repo.ts +0 -0
  388. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/jsonl-storage.ts +0 -0
  389. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/memory-repo.ts +0 -0
  390. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/memory-storage.ts +0 -0
  391. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/repo-utils.ts +0 -0
  392. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/session.ts +0 -0
  393. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/session/uuid.ts +0 -0
  394. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/skills.ts +0 -0
  395. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/system-prompt.ts +0 -0
  396. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/types.ts +0 -0
  397. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/utils/shell-output.ts +0 -0
  398. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/harness/utils/truncate.ts +0 -0
  399. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/index.ts +0 -0
  400. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/node.ts +0 -0
  401. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/proxy.ts +0 -0
  402. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/src/types.ts +0 -0
  403. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/agent-loop.test.ts +0 -0
  404. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/agent.test.ts +0 -0
  405. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/e2e.test.ts +0 -0
  406. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/agent-harness-stream.test.ts +0 -0
  407. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/agent-harness.test.ts +0 -0
  408. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/compaction.test.ts +0 -0
  409. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/nodejs-env.test.ts +0 -0
  410. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/prompt-templates.test.ts +0 -0
  411. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/repo.test.ts +0 -0
  412. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/resource-formatting.test.ts +0 -0
  413. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/session-test-utils.ts +0 -0
  414. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/session-uuid.test.ts +0 -0
  415. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/session.test.ts +0 -0
  416. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/skills.test.ts +0 -0
  417. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/storage.test.ts +0 -0
  418. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/system-prompt.test.ts +0 -0
  419. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/harness/truncate.test.ts +0 -0
  420. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/scratch/simple.ts +0 -0
  421. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/utils/calculate.ts +0 -0
  422. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/test/utils/get-current-time.ts +0 -0
  423. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/tsconfig.build.json +0 -0
  424. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/vitest.config.ts +0 -0
  425. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/pi-agent/vitest.harness.config.ts +0 -0
  426. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/vendor/vendor_pi.sh +0 -0
  427. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/workspace_patch.py +0 -0
  428. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/harness/workspace_patch_test.py +0 -0
  429. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/__init__.py +0 -0
  430. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/adapter.py +0 -0
  431. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/base.py +0 -0
  432. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/base_test.py +0 -0
  433. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/braintrust.py +0 -0
  434. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/braintrust_test.py +0 -0
  435. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/detect.py +0 -0
  436. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/detect_test.py +0 -0
  437. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/langfuse.py +0 -0
  438. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/langfuse_test.py +0 -0
  439. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/langsmith.py +0 -0
  440. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/langsmith_test.py +0 -0
  441. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/mastra.py +0 -0
  442. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/mastra_test.py +0 -0
  443. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/messages.py +0 -0
  444. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/messages_test.py +0 -0
  445. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/normalize.py +0 -0
  446. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/normalize_test.py +0 -0
  447. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/otel_genai.py +0 -0
  448. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/otel_genai_envcap_roundtrip_test.py +0 -0
  449. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/otel_genai_test.py +0 -0
  450. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/otel_writer.py +0 -0
  451. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/otel_writer_test.py +0 -0
  452. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/phoenix.py +0 -0
  453. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/phoenix_test.py +0 -0
  454. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/postgres.py +0 -0
  455. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/postgres_test.py +0 -0
  456. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/posthog.py +0 -0
  457. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/posthog_test.py +0 -0
  458. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/quality.py +0 -0
  459. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/quality_test.py +0 -0
  460. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/stream.py +0 -0
  461. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/stream_test.py +0 -0
  462. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/testdata/sample_otlp.json +0 -0
  463. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/ingest/testdata/sample_spans.jsonl +0 -0
  464. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/base.py +0 -0
  465. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/base_test.py +0 -0
  466. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/gepa.py +0 -0
  467. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/gepa_test.py +0 -0
  468. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/judge.py +0 -0
  469. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/judge_quality.py +0 -0
  470. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/judge_quality_test.py +0 -0
  471. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/judge_test.py +0 -0
  472. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/knn_test.py +0 -0
  473. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/numeric.py +0 -0
  474. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/numeric_test.py +0 -0
  475. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/reward.py +0 -0
  476. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/optimize/reward_test.py +0 -0
  477. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/__init__.py +0 -0
  478. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/auth.py +0 -0
  479. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/auth_test.py +0 -0
  480. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/client.py +0 -0
  481. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/client_test.py +0 -0
  482. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/credentials.py +0 -0
  483. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/credentials_test.py +0 -0
  484. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/transfer.py +0 -0
  485. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/platform/transfer_test.py +0 -0
  486. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/__init__.py +0 -0
  487. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/_bedrock_chat.py +0 -0
  488. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/_bedrock_chat_test.py +0 -0
  489. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/_openai_common.py +0 -0
  490. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/_responses_common.py +0 -0
  491. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/_responses_common_test.py +0 -0
  492. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/base_test.py +0 -0
  493. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/models.py +0 -0
  494. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/models_test.py +0 -0
  495. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/openai_responses_test.py +0 -0
  496. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/retry.py +0 -0
  497. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/retry_test.py +0 -0
  498. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/_openai_common_test.py +0 -0
  499. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/anthropic_test.py +0 -0
  500. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/azure_openai_test.py +0 -0
  501. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/bedrock_test.py +0 -0
  502. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/registry_test.py +0 -0
  503. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tests/streaming_test.py +0 -0
  504. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/providers/tinker_test.py +0 -0
  505. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/__init__.py +0 -0
  506. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/ablation.py +0 -0
  507. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/ablation_test.py +0 -0
  508. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/concurrency_plot.py +0 -0
  509. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/concurrency_plot_test.py +0 -0
  510. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/concurrency_run.py +0 -0
  511. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/concurrency_run_test.py +0 -0
  512. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/concurrency_scaling.py +0 -0
  513. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/concurrency_scaling_test.py +0 -0
  514. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/gepa_scaling.py +0 -0
  515. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/gepa_scaling_test.py +0 -0
  516. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/pipeline.py +0 -0
  517. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/pipeline_test.py +0 -0
  518. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/scaling_split.py +0 -0
  519. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/scaling_split_test.py +0 -0
  520. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/scenario_fidelity.py +0 -0
  521. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/scenario_fidelity_test.py +0 -0
  522. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/scenario_recovery.py +0 -0
  523. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/scenario_recovery_test.py +0 -0
  524. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/seed_stability.py +0 -0
  525. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/seed_stability_test.py +0 -0
  526. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/trace_scaling.py +0 -0
  527. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/research/trace_scaling_test.py +0 -0
  528. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/__init__.py +0 -0
  529. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/embedders.py +0 -0
  530. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/embedders_test.py +0 -0
  531. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/leakfree.py +0 -0
  532. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/leakfree_test.py +0 -0
  533. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/retriever.py +0 -0
  534. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/retrieval/retriever_test.py +0 -0
  535. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/__init__.py +0 -0
  536. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/builder.py +0 -0
  537. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/builder_test.py +0 -0
  538. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/__init__.py +0 -0
  539. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/clustering.py +0 -0
  540. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/clustering_test.py +0 -0
  541. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/facets.py +0 -0
  542. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/facets_test.py +0 -0
  543. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/selection.py +0 -0
  544. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/mining/selection_test.py +0 -0
  545. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/synthesis/__init__.py +0 -0
  546. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/synthesis/scenario_set.py +0 -0
  547. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/synthesis/scenario_set_test.py +0 -0
  548. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/synthesis/synthesizer.py +0 -0
  549. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/synthesis/synthesizer_test.py +0 -0
  550. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/verification/__init__.py +0 -0
  551. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/verification/judge.py +0 -0
  552. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/verification/judge_test.py +0 -0
  553. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/verification/verify.py +0 -0
  554. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/scenarios/verification/verify_test.py +0 -0
  555. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/__init__.py +0 -0
  556. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/builds_test.py +0 -0
  557. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/traces_source.py +0 -0
  558. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/serving/traces_source_test.py +0 -0
  559. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/telemetry.py +0 -0
  560. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/telemetry_test.py +0 -0
  561. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/clock.py +0 -0
  562. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/metered.py +0 -0
  563. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/metered_test.py +0 -0
  564. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/store.py +0 -0
  565. {world_model_optimizer-0.2.0 → world_model_optimizer-0.2.1}/wmo/tracking/store_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: world-model-optimizer
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Run agents, build world models from traces, and optimize agent harnesses.
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: anthropic>=0.39
@@ -57,9 +57,9 @@ Description-Content-Type: text/markdown
57
57
 
58
58
  # World Model Optimizer
59
59
 
60
- `wmo` is an open-source project for running and building continuously improving agents. It
61
- includes a flexible agent runtime, a world model that simulates tool calls, and an optimizer that
62
- builds task-specific harnesses for stronger performance at lower cost.
60
+ `wmo` turns agent traces you already collect into continuous improvement. Start with a model
61
+ endpoint at frontier quality with 40%+ lower cost. Keep improving it with world model simulations,
62
+ meta-harness optimization, and model distillation.
63
63
 
64
64
  ![World model, runtime agent, and optimizer connected in a continuous improvement loop](assets/world-model-agent-loop.svg)
65
65
 
@@ -71,28 +71,48 @@ builds task-specific harnesses for stronger performance at lower cost.
71
71
 
72
72
  ## Getting started
73
73
 
74
- ### Local setup
75
-
76
- Install WMO, choose the model provider for the built-in runtime agent, and start a local run:
74
+ **1. Register your providers.**
77
75
 
78
76
  ```bash
79
77
  pip install world-model-optimizer
80
78
  wmo providers set
81
- wmo run --task "Inspect this repository and explain it"
82
79
  ```
83
80
 
84
- Build a named world model from collected traces:
81
+ That verifies the provider and then offers to register its models as routing candidates in
82
+ `.wmo/pool.toml`, the roster everything below chooses from. It searches the provider's own
83
+ catalog (OpenRouter's 338 published models included) and asks only for what that backend needs.
84
+ Re-run it to add another provider's models beside the ones already registered.
85
+
86
+ **2. Tune a router on your OTel traces.**
87
+
88
+ ```bash
89
+ wmo build --file traces.jsonl --name my-endpoint
90
+
91
+ # Score every registered model on held-out tasks from your traces
92
+ wmo optimize route sweep my-endpoint --traces traces.otel.jsonl
93
+
94
+ # Turn those measurements into a routing policy
95
+ wmo optimize route fit matrix.json --kind knn \
96
+ --out .wmo/models/my-endpoint/policy.json
97
+ ```
98
+
99
+ **3. Serve it.**
85
100
 
86
101
  ```bash
87
- wmo build --file traces.jsonl --name my-environment
102
+ wmo serve --name my-endpoint
88
103
  ```
89
104
 
90
- Then optimize an agent harness against that model and a set of tasks:
105
+ See what it bought you against the model you were using before:
91
106
 
92
107
  ```bash
93
- wmo optimize harness my-agent my-environment --tasks tasks.jsonl
108
+ wmo optimize route report matrix.json .wmo/models/my-endpoint/policy.json \
109
+ --baseline gpt-5.5
94
110
  ```
95
111
 
112
+ Distill your own small model into the pool with [`wmo optimize distill`](wmo/distill/README.md),
113
+ serve a single model with no routing via `wmo optimize route pin`, or build an optimized harness
114
+ for your agent with `wmo optimize harness`.
115
+
96
116
  ### Hosted platform
97
117
 
98
118
  Create an account at [platform.experientiallabs.ai](https://platform.experientiallabs.ai), then
@@ -121,6 +141,9 @@ wmo optimize harness my-agent my-environment --tasks tasks.jsonl --backend e2b
121
141
 
122
142
  ## Use a world model as an API
123
143
 
144
+ `world-model-optimizer` includes world models that can be used to simulate your agent environment
145
+ for testing and optimization.
146
+
124
147
  ```python
125
148
  from wmo import Action, ActionKind
126
149
  from wmo.config.store import WorldModelStore
@@ -135,7 +158,8 @@ obs = wm.step(session.id, Action(kind=ActionKind.TOOL_CALL, name="add_to_cart",
135
158
  print(obs.content)
136
159
  ```
137
160
 
138
- Or over HTTP (same code path), namespaced by model name: `GET /world_models`, then `POST /world_models/{name}/sessions` and `POST /world_models/{name}/sessions/{id}/step`.
161
+ Or over HTTP (same code path), namespaced by model name: `GET /world_models`, then `POST
162
+ /world_models/{name}/sessions` and `POST /world_models/{name}/sessions/{id}/step`.
139
163
 
140
164
  ## Run after platform login
141
165
 
@@ -176,9 +200,10 @@ the new versioned champion harness.
176
200
 
177
201
  ## Development
178
202
 
179
- Managed with [uv](https://docs.astral.sh/uv/); linting/formatting with [ruff](https://docs.astral.sh/ruff/); type checking with [ty](https://github.com/astral-sh/ty). Conventions live in [AGENTS.md](./AGENTS.md).
203
+ Managed with [uv](https://docs.astral.sh/uv/); linting/formatting with [ruff](https://docs.astral.sh/ruff/); type checking with [ty](https://github.com/astral-sh/ty); tasks run through [just](https://github.com/casey/just) (`brew install just` / `cargo install just`). Conventions live in [AGENTS.md](./AGENTS.md).
180
204
 
181
205
  ```bash
206
+ just setup # first time: .env from the template + uv sync
182
207
  uv sync --extra dev # env + dev tools
183
208
  uv run ruff check . # lint
184
209
  uv run ruff format . # format
@@ -189,7 +214,8 @@ uv run pytest -q # tests
189
214
  ## Usage telemetry
190
215
 
191
216
  `wmo` uses anonymous usage telemetry to track the volume of usage.
192
- Telemetry is strictly metadata. It never includes prompts, traces, actions, observations, file paths,
217
+ Telemetry is strictly metadata. It never includes prompts, traces, actions, observations, file
218
+ paths,
193
219
  model names, provider credentials, or raw user content.
194
220
 
195
221
  Telemetry is enabled by default. To opt out for a project:
@@ -1,8 +1,8 @@
1
1
  # World Model Optimizer
2
2
 
3
- `wmo` is an open-source project for running and building continuously improving agents. It
4
- includes a flexible agent runtime, a world model that simulates tool calls, and an optimizer that
5
- builds task-specific harnesses for stronger performance at lower cost.
3
+ `wmo` turns agent traces you already collect into continuous improvement. Start with a model
4
+ endpoint at frontier quality with 40%+ lower cost. Keep improving it with world model simulations,
5
+ meta-harness optimization, and model distillation.
6
6
 
7
7
  ![World model, runtime agent, and optimizer connected in a continuous improvement loop](assets/world-model-agent-loop.svg)
8
8
 
@@ -14,28 +14,48 @@ builds task-specific harnesses for stronger performance at lower cost.
14
14
 
15
15
  ## Getting started
16
16
 
17
- ### Local setup
18
-
19
- Install WMO, choose the model provider for the built-in runtime agent, and start a local run:
17
+ **1. Register your providers.**
20
18
 
21
19
  ```bash
22
20
  pip install world-model-optimizer
23
21
  wmo providers set
24
- wmo run --task "Inspect this repository and explain it"
25
22
  ```
26
23
 
27
- Build a named world model from collected traces:
24
+ That verifies the provider and then offers to register its models as routing candidates in
25
+ `.wmo/pool.toml`, the roster everything below chooses from. It searches the provider's own
26
+ catalog (OpenRouter's 338 published models included) and asks only for what that backend needs.
27
+ Re-run it to add another provider's models beside the ones already registered.
28
+
29
+ **2. Tune a router on your OTel traces.**
30
+
31
+ ```bash
32
+ wmo build --file traces.jsonl --name my-endpoint
33
+
34
+ # Score every registered model on held-out tasks from your traces
35
+ wmo optimize route sweep my-endpoint --traces traces.otel.jsonl
36
+
37
+ # Turn those measurements into a routing policy
38
+ wmo optimize route fit matrix.json --kind knn \
39
+ --out .wmo/models/my-endpoint/policy.json
40
+ ```
41
+
42
+ **3. Serve it.**
28
43
 
29
44
  ```bash
30
- wmo build --file traces.jsonl --name my-environment
45
+ wmo serve --name my-endpoint
31
46
  ```
32
47
 
33
- Then optimize an agent harness against that model and a set of tasks:
48
+ See what it bought you against the model you were using before:
34
49
 
35
50
  ```bash
36
- wmo optimize harness my-agent my-environment --tasks tasks.jsonl
51
+ wmo optimize route report matrix.json .wmo/models/my-endpoint/policy.json \
52
+ --baseline gpt-5.5
37
53
  ```
38
54
 
55
+ Distill your own small model into the pool with [`wmo optimize distill`](wmo/distill/README.md),
56
+ serve a single model with no routing via `wmo optimize route pin`, or build an optimized harness
57
+ for your agent with `wmo optimize harness`.
58
+
39
59
  ### Hosted platform
40
60
 
41
61
  Create an account at [platform.experientiallabs.ai](https://platform.experientiallabs.ai), then
@@ -64,6 +84,9 @@ wmo optimize harness my-agent my-environment --tasks tasks.jsonl --backend e2b
64
84
 
65
85
  ## Use a world model as an API
66
86
 
87
+ `world-model-optimizer` includes world models that can be used to simulate your agent environment
88
+ for testing and optimization.
89
+
67
90
  ```python
68
91
  from wmo import Action, ActionKind
69
92
  from wmo.config.store import WorldModelStore
@@ -78,7 +101,8 @@ obs = wm.step(session.id, Action(kind=ActionKind.TOOL_CALL, name="add_to_cart",
78
101
  print(obs.content)
79
102
  ```
80
103
 
81
- Or over HTTP (same code path), namespaced by model name: `GET /world_models`, then `POST /world_models/{name}/sessions` and `POST /world_models/{name}/sessions/{id}/step`.
104
+ Or over HTTP (same code path), namespaced by model name: `GET /world_models`, then `POST
105
+ /world_models/{name}/sessions` and `POST /world_models/{name}/sessions/{id}/step`.
82
106
 
83
107
  ## Run after platform login
84
108
 
@@ -119,9 +143,10 @@ the new versioned champion harness.
119
143
 
120
144
  ## Development
121
145
 
122
- Managed with [uv](https://docs.astral.sh/uv/); linting/formatting with [ruff](https://docs.astral.sh/ruff/); type checking with [ty](https://github.com/astral-sh/ty). Conventions live in [AGENTS.md](./AGENTS.md).
146
+ Managed with [uv](https://docs.astral.sh/uv/); linting/formatting with [ruff](https://docs.astral.sh/ruff/); type checking with [ty](https://github.com/astral-sh/ty); tasks run through [just](https://github.com/casey/just) (`brew install just` / `cargo install just`). Conventions live in [AGENTS.md](./AGENTS.md).
123
147
 
124
148
  ```bash
149
+ just setup # first time: .env from the template + uv sync
125
150
  uv sync --extra dev # env + dev tools
126
151
  uv run ruff check . # lint
127
152
  uv run ruff format . # format
@@ -132,7 +157,8 @@ uv run pytest -q # tests
132
157
  ## Usage telemetry
133
158
 
134
159
  `wmo` uses anonymous usage telemetry to track the volume of usage.
135
- Telemetry is strictly metadata. It never includes prompts, traces, actions, observations, file paths,
160
+ Telemetry is strictly metadata. It never includes prompts, traces, actions, observations, file
161
+ paths,
136
162
  model names, provider credentials, or raw user content.
137
163
 
138
164
  Telemetry is enabled by default. To opt out for a project:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "world-model-optimizer"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "Run agents, build world models from traces, and optimize agent harnesses."
5
5
  readme = "README.md"
6
6
  # harbor 0.20.0 requires Python >=3.12; the harbor evaluator is a first-class optimize
@@ -95,7 +95,12 @@ build-backend = "hatchling.build"
95
95
 
96
96
  [tool.hatch.build.targets.wheel]
97
97
  packages = ["wmo", "packages/llm-waterfall/llm_waterfall"]
98
- exclude = ["**/*_test.py"]
98
+ # Test-only code is named for pytest discovery (`*_test.py`), and these two are the exceptions
99
+ # that the glob therefore misses: `fake_tinker` is the deterministic Tinker double the distill
100
+ # tests run the whole loop against, and `wmo/conftest.py` is a pytest fixture module. Both are
101
+ # imported only by tests, so neither belongs in the published wheel. `fake_tinker` stays where
102
+ # it is rather than moving under a test path: five test modules import it by that name.
103
+ exclude = ["**/*_test.py", "wmo/distill/fake_tinker.py", "wmo/conftest.py"]
99
104
  force-include = { "packages/llm-waterfall/LICENSE" = "llm_waterfall/LICENSE" }
100
105
 
101
106
  [tool.hatch.build.targets.sdist]
@@ -124,7 +129,9 @@ environment-capture = { workspace = true }
124
129
  # Tests live inline next to the modules they cover (foo.py -> foo_test.py).
125
130
  python_files = ["*_test.py"]
126
131
  # One root gate covers the flagship and every Python member (same inline-test convention).
127
- testpaths = ["wmo", "packages"]
132
+ # `deploy/` carries the operated services; their tests cover the deploy scripts themselves
133
+ # (a deploy that deletes the box's generated trees rotates the pinned TLS certificate).
134
+ testpaths = ["wmo", "packages", "deploy"]
128
135
  # tau2-bench is a local clone of the external real-environment runner (own test suite, own
129
136
  # deps) that lives beside the tau-bench member data; it is not part of this gate.
130
137
  norecursedirs = ["tau2-bench"]
@@ -158,7 +165,9 @@ python-version = "3.12"
158
165
  [tool.ty.src]
159
166
  # `plot_trace_scaling.py` is a one-off research figure that imports matplotlib ephemerally
160
167
  # (`uv run --with matplotlib`), not a project dependency — exclude it from the type gate.
161
- exclude = ["examples/", ".agents/",
168
+ # `deploy/` is box-side service code: it imports torch and transformers, which live in the
169
+ # GPU box's venv and are deliberately not project dependencies. Ruff still lints it.
170
+ exclude = ["examples/", ".agents/", "deploy/",
162
171
  "packages/environment-capture/*/backend/",
163
172
  "packages/environment-capture/tau-bench/",
164
173
  "packages/environment-capture/terminal-tasks/",
@@ -18,6 +18,7 @@ import uuid
18
18
  from dataclasses import dataclass
19
19
  from datetime import UTC, datetime
20
20
  from pathlib import Path
21
+ from typing import cast
21
22
  from uuid import uuid4
22
23
 
23
24
  import typer
@@ -35,12 +36,14 @@ from rich.panel import Panel
35
36
  from rich.progress import BarColumn, DownloadColumn, Progress, TextColumn
36
37
  from rich.table import Table
37
38
 
39
+ import wmo.cli.pool_registry as pool_registry
38
40
  import wmo.providers as providers
39
41
  from wmo.cli.agent_session import register as register_agent_session_commands
40
42
  from wmo.cli.e2b_cmds import register as register_e2b_commands
41
43
  from wmo.cli.eval_closed_loop import run_agreement, run_closed_loop
42
44
  from wmo.cli.harness_app import harness_app, optimize_app
43
45
  from wmo.cli.ingest_cmd import ingest as _ingest_command
46
+ from wmo.cli.model_roles import configured_role_configs
44
47
  from wmo.cli.platform_cmds import register as register_platform_commands
45
48
  from wmo.cli.ui import (
46
49
  BuildParams,
@@ -75,8 +78,8 @@ from wmo.config import (
75
78
  )
76
79
  from wmo.config.card import make_build_card, save_card
77
80
  from wmo.core.types import JsonObject
81
+ from wmo.engine.build import DEFAULT_TRAIN_SPLIT, ingest, split_traces
78
82
  from wmo.engine.build import build as run_build
79
- from wmo.engine.build import ingest, split_traces
80
83
  from wmo.engine.demo import run_demo
81
84
  from wmo.engine.eval_suites import (
82
85
  discover_eval_suites,
@@ -94,9 +97,10 @@ from wmo.evals.grid_plot import plot_grid, plot_grid_heatmap
94
97
  from wmo.evals.open_loop import EvalReport, OpenLoopEval
95
98
  from wmo.ingest import VendorPull, get_adapter, list_adapters
96
99
  from wmo.optimize.judge import JUDGE_VERSION, RubricJudge
97
- from wmo.providers import ProviderConfig, ProviderKind, verify_all, verify_embedder
100
+ from wmo.providers import ProviderConfig, ProviderKind, VerifyResult, verify_all, verify_embedder
98
101
  from wmo.providers.base import Embedder, EmbedderKind, Provider
99
102
  from wmo.providers.models import resolve_provider_model
103
+ from wmo.providers.pool import Tier
100
104
  from wmo.providers.retry import wrap_provider_with_retries
101
105
  from wmo.research import Side, run_concurrency_scaling
102
106
  from wmo.research.concurrency_run import build_real_runner, build_world_runner
@@ -185,6 +189,12 @@ _CONCURRENCY_ISOLATION_FLAGS: dict[str, tuple[str, ...]] = {
185
189
  _DOWNLOAD_BENCHMARKS = typer.Argument(
186
190
  None, help="Benchmark bundles to download, or 'all'. Omit for a picker."
187
191
  )
192
+ # Repeatable option default hoisted out of the signature (ruff B008 forbids the call inline).
193
+ _POOL_MODEL_OPTION = typer.Option(
194
+ None,
195
+ "--pool-model",
196
+ help="Register this model id as a routing candidate, with no prompts; repeat for several.",
197
+ )
188
198
 
189
199
 
190
200
  @dataclass(frozen=True)
@@ -250,9 +260,55 @@ def providers_set(
250
260
  endpoint: str = typer.Option(None, "--endpoint", help="OpenAI-compatible API endpoint."),
251
261
  deployment: str = typer.Option(None, "--deployment", help="Azure deployment name."),
252
262
  api_version: str = typer.Option(None, "--api-version", help="Azure API version."),
263
+ pool: str = typer.Option(
264
+ None,
265
+ "--pool",
266
+ help="Candidate pool TOML the router picks from (default: <root>/pool.toml).",
267
+ ),
268
+ pool_model: list[str] | None = _POOL_MODEL_OPTION,
269
+ api_key_env: str = typer.Option(
270
+ None, "--api-key-env", help="Env var holding the pool entries' API key (multi-account)."
271
+ ),
272
+ tier: str = typer.Option(
273
+ None, "--tier", help=f"Pool entry tier: {' | '.join(pool_registry.TIERS)}."
274
+ ),
275
+ input_per_mtok: float = typer.Option(
276
+ None,
277
+ "--input-per-mtok",
278
+ min=0.0,
279
+ help="Prompt-token price of every --pool-model, USD per 1M tokens.",
280
+ ),
281
+ output_per_mtok: float = typer.Option(
282
+ None,
283
+ "--output-per-mtok",
284
+ min=0.0,
285
+ help="Completion-token price of every --pool-model, USD per 1M tokens.",
286
+ ),
253
287
  root: str = typer.Option(ARTIFACT_DIR, help="Project dir holding local settings."),
254
288
  ) -> None:
255
- """Choose and verify the model provider used by local worker-agent runs."""
289
+ """Choose the local worker's provider, and register the models the router can choose from.
290
+
291
+ Two things a project needs, in one command. The worker provider lands in
292
+ `<root>/settings.toml` as `[models.worker]`, exactly as before. Then, on a terminal, this
293
+ offers to register models as ROUTING CANDIDATES in `<root>/pool.toml`, the roster
294
+ `wmo optimize route` selects over: pick a backend, search its catalog, and answer only what
295
+ that backend needs (an Azure deployment; a price for a model with no published one, never
296
+ for OpenRouter, which self-prices). Re-run it to add another provider's models beside the
297
+ ones already registered.
298
+
299
+ Scripts keep the old contract: with `--provider` and `--model` both given, nothing is
300
+ prompted. Registering non-interactively is `--pool-model <id>`, repeated per model, with
301
+ `--input-per-mtok`/`--output-per-mtok` when the model has no published price.
302
+ """
303
+ if tier is not None and tier not in pool_registry.TIERS:
304
+ raise typer.BadParameter(f"--tier must be one of: {', '.join(pool_registry.TIERS)}")
305
+ if (input_per_mtok is None) != (output_per_mtok is None):
306
+ # A pool entry takes both prices or neither, so half a pair would be silently dropped
307
+ # (interactively) or rejected as an invalid entry (with --pool-model).
308
+ raise typer.BadParameter(
309
+ "set both --input-per-mtok and --output-per-mtok, or neither; a pool entry prices "
310
+ "prompt and completion tokens together"
311
+ )
256
312
  existing = load_settings(root).models.worker
257
313
  used_picker = _console.is_terminal and (provider is None or model is None)
258
314
  if used_picker:
@@ -310,6 +366,58 @@ def providers_set(
310
366
  f"[green]set[/green] local worker provider to {config.kind.value} "
311
367
  f"({config.model_type or model}) in {settings_path(root)}"
312
368
  )
369
+ _register_pool_models(
370
+ pool_path=pool_registry.pool_path_for(root, pool),
371
+ kind=config.kind,
372
+ pool_model=list(pool_model or []),
373
+ options=pool_registry.EntryOptions(
374
+ endpoint=config.endpoint,
375
+ region=config.region,
376
+ # The RAW flags, not the worker config's: `_worker_provider_config` fills an Azure
377
+ # deployment in from the model id when none was given, and a pool entry must never
378
+ # inherit a guessed deployment name (nothing can derive an operator's own).
379
+ deployment=deployment,
380
+ api_version=api_version,
381
+ api_key_env=api_key_env,
382
+ tier=cast("Tier", tier) if tier is not None else "frontier",
383
+ input_per_mtok=input_per_mtok,
384
+ output_per_mtok=output_per_mtok,
385
+ ),
386
+ interactive=used_picker,
387
+ )
388
+
389
+
390
+ def _register_pool_models(
391
+ *,
392
+ pool_path: Path,
393
+ kind: ProviderKind,
394
+ pool_model: list[str],
395
+ options: pool_registry.EntryOptions,
396
+ interactive: bool,
397
+ ) -> None:
398
+ """Register routing candidates after the worker provider is saved.
399
+
400
+ Explicit `--pool-model` ids win and register with no prompts, so a script gets the same
401
+ roster a person would build by hand. Otherwise the registry is OFFERED only on the run that
402
+ already prompted (a bare `wmo providers set` at a terminal): a scripted
403
+ `--provider ... --model ...` invocation keeps its exact pre-existing behavior and asks
404
+ nothing.
405
+ """
406
+ if pool_model:
407
+ pool_registry.register_model_ids(
408
+ _console, pool_path=pool_path, kind=kind, model_ids=pool_model, options=options
409
+ )
410
+ return
411
+ if not interactive:
412
+ return
413
+ pool_registry.run_pool_registry(
414
+ _console,
415
+ lambda text: _console.input(text),
416
+ lambda text: _console.input(text, password=True),
417
+ pool_path=pool_path,
418
+ default_kind=kind,
419
+ options=options,
420
+ )
313
421
 
314
422
 
315
423
  @providers_app.command("verify")
@@ -319,15 +427,18 @@ def providers_verify(
319
427
  ) -> None:
320
428
  """Ping every configured provider (completion + embed path) and report status.
321
429
 
322
- Gathers provider configs from the built world models (one `--name`, or all of them, deduped by
323
- kind+model), so a brand-new project with nothing built yet has nothing to verify. The phi embed
324
- path of each model is checked too, unless it is the offline (creds-free) hashing embedder.
430
+ Two sources count as "configured", because checking that credentials work is what you do
431
+ BEFORE spending anything on `wmo build`: the `[models.<role>]` roles in
432
+ `<root>/settings.toml` (what `wmo providers set` writes), and the providers persisted inside
433
+ every built world model. Completion providers are deduped by kind+model across both, so a
434
+ role naming the same backend as a built model costs one ping, not two. The phi embed path
435
+ belongs to a BUILT model, so on a project with nothing built that half is skipped with a
436
+ note instead of aborting the command; otherwise every distinct provider-backed embedder is
437
+ checked (the offline hashing embedder needs no credentials and is skipped). `--name` scopes
438
+ the whole report to that one world model.
325
439
  """
326
440
  store = WorldModelStore(root)
327
441
  names = [name] if name is not None else store.list_names()
328
- if not names:
329
- _console.print("[yellow]no world models built yet[/yellow]; run `wmo build --name <name>`")
330
- return
331
442
  configs: list[HarnessConfig] = []
332
443
  for model_name in names:
333
444
  try:
@@ -336,32 +447,88 @@ def providers_verify(
336
447
  raise typer.BadParameter(str(exc)) from exc
337
448
  configs.append(load_config(model_dir))
338
449
 
339
- # Dedup completion providers by kind+model across all selected models.
340
- seen: set[tuple[str, str]] = set()
341
- providers: list[ProviderConfig] = []
342
- for config in configs:
343
- for pc in config.providers:
344
- key = (pc.kind.value, pc.model)
345
- if key not in seen:
346
- seen.add(key)
347
- providers.append(pc)
348
- for result in verify_all(providers):
349
- mark = "[green]ok[/green]" if result.ok else "[red]fail[/red]"
350
- _console.print(f"{mark} {result.kind.value} ({result.model}) {result.detail}")
450
+ # Dedup identical completion calls across all selected models, then across the settings
451
+ # roles. World models come FIRST so a config present in both is pinged with the built
452
+ # artifact's own copy, exactly as before roles were a source.
453
+ labelled = [
454
+ (model_name, pc)
455
+ for model_name, cfg in zip(names, configs, strict=True)
456
+ for pc in cfg.providers
457
+ ]
458
+ # `--name` asks about one world model; widening it to the project's roles would answer a
459
+ # question the caller did not ask (and bill for it).
460
+ if name is None:
461
+ labelled += [(f"models.{role}", pc) for role, pc in configured_role_configs(root)]
462
+ index: dict[str, int] = {}
463
+ provider_configs: list[ProviderConfig] = []
464
+ sources: list[list[str]] = []
465
+ for label, pc in labelled:
466
+ key = _completion_identity(pc)
467
+ if key not in index:
468
+ index[key] = len(provider_configs)
469
+ provider_configs.append(pc)
470
+ sources.append([])
471
+ if label not in sources[index[key]]:
472
+ sources[index[key]].append(label)
473
+
474
+ if not provider_configs:
475
+ _console.print(
476
+ "[yellow]nothing configured[/yellow]; run `wmo providers set` to choose a provider, "
477
+ "or `wmo build --name <name>` to build a world model"
478
+ )
479
+ raise typer.Exit(1)
480
+
481
+ for result, origin in zip(verify_all(provider_configs), sources, strict=True):
482
+ _print_verify_result(result, origin)
483
+
484
+ if not configs:
485
+ _console.print(
486
+ "[dim]embed path: skipped, no world model built yet "
487
+ "(the embedder is chosen by `wmo build`)[/dim]"
488
+ )
489
+ return
351
490
 
352
491
  # Verify each distinct provider-backed embed path (skip the offline hashing embedder).
353
- embed_seen: set[tuple[str, str]] = set()
354
- for config in configs:
492
+ embed_seen: set[str] = set()
493
+ for model_name, config in zip(names, configs, strict=True):
355
494
  if config.embed_provider is EmbedderKind.HASHING:
356
495
  continue
357
496
  embed_config = config.embed_provider_config()
358
- key = (embed_config.kind.value, embed_config.model)
497
+ key = embed_config.model_dump_json()
359
498
  if key in embed_seen:
360
499
  continue
361
500
  embed_seen.add(key)
362
501
  result = verify_embedder(embed_config)
363
- mark = "[green]ok[/green]" if result.ok else "[red]fail[/red]"
364
- _console.print(f"{mark} embed:{result.kind.value} ({result.model}) {result.detail}")
502
+ _print_verify_result(result, [model_name], prefix="embed:")
503
+
504
+
505
+ def _completion_identity(config: ProviderConfig) -> str:
506
+ """What makes two provider configs the SAME completion call, for `providers verify` dedup.
507
+
508
+ Everything the config carries except the embed-only fields, which do not reach a completion
509
+ request. Keying on kind+model alone would collapse one model served from two Bedrock regions,
510
+ or one Azure model behind two deployments or endpoints, into a single ping, and then report
511
+ the config that was never called as verified on the other one's result. Deriving the key
512
+ from the whole config rather than a hand-listed subset means a field added later splits the
513
+ key by default instead of silently widening that collapse.
514
+ """
515
+ return config.model_copy(update={"embed_model": None, "embed_dim": None}).model_dump_json()
516
+
517
+
518
+ def _print_verify_result(result: VerifyResult, sources: list[str], *, prefix: str = "") -> None:
519
+ """Print one `providers verify` line, plus the next step to take when the ping failed.
520
+
521
+ `sources` names what asked for this provider (world model names, `models.<role>` settings
522
+ roles) so a failure points at the thing to fix. The detail is escaped: it carries raw
523
+ provider error text, and an unescaped `[...]` in it would be read as rich markup and crash
524
+ the report.
525
+ """
526
+ mark = "[green]ok[/green]" if result.ok else "[red]fail[/red]"
527
+ origin = f" [dim]({', '.join(sources)})[/dim]" if sources else ""
528
+ detail = f" {escape(result.detail)}" if result.detail else ""
529
+ _console.print(f"{mark} {prefix}{result.kind.value} ({result.model}){origin}{detail}")
530
+ if not result.ok:
531
+ _console.print(f" [yellow]{_credential_hint(result.kind, result.detail)}[/yellow]")
365
532
 
366
533
 
367
534
  @examples_app.command("list")
@@ -432,7 +599,10 @@ def build(
432
599
  None, "--chain", help="Named failover chain from .wmo/fallback.toml (default: its default)."
433
600
  ),
434
601
  train_split: float = typer.Option(
435
- 0.8, help="Train/held-out ratio for GEPA's internal split (lower = bigger valset)."
602
+ DEFAULT_TRAIN_SPLIT,
603
+ help="Train/held-out ratio for GEPA's internal split (lower = bigger valset). Shares "
604
+ "`wmo eval`'s default: both cut the same trace-id hash line, so a mismatch leaks train "
605
+ "traces into the eval holdout.",
436
606
  ),
437
607
  embed_provider: str = typer.Option(
438
608
  "hashing", help="phi embedder: hashing (offline) | bedrock | openai | azure."
@@ -748,19 +918,24 @@ def _verify_or_abort(config: HarnessConfig, chain: str | None = None) -> None:
748
918
  continue
749
919
  failed = True
750
920
  _console.print(f" [red]✗ {label} ({result.model}) failed[/red]: {result.detail}")
751
- if "No module named" in result.detail:
752
- # SDKs are core deps; a missing module means the env is stale or hand-rolled.
753
- _console.print(" [yellow]run `uv sync` to install the provider SDKs[/yellow]")
754
- else:
755
- envs = ", ".join(PROVIDER_ENV_VARS.get(cfg.kind, []))
756
- hint = f" ({envs})" if envs else ""
757
- _console.print(
758
- f" [yellow]check the model id and that your credentials are set{hint}[/yellow]"
759
- )
921
+ _console.print(f" [yellow]{_credential_hint(cfg.kind, result.detail)}[/yellow]")
760
922
  if failed:
761
923
  raise typer.Exit(1)
762
924
 
763
925
 
926
+ def _credential_hint(kind: ProviderKind, detail: str) -> str:
927
+ """The next step for a failed provider ping: install the SDKs, or fix creds/model id.
928
+
929
+ Shared by the pre-build guard and `wmo providers verify` so both name the same env vars.
930
+ """
931
+ if "No module named" in detail:
932
+ # SDKs are core deps; a missing module means the env is stale or hand-rolled.
933
+ return "run `uv sync` to install the provider SDKs"
934
+ envs = ", ".join(PROVIDER_ENV_VARS.get(kind, []))
935
+ hint = f" ({envs})" if envs else ""
936
+ return f"check the model id and that your credentials are set{hint}"
937
+
938
+
764
939
  @app.command("list")
765
940
  def list_models(root: str = typer.Option(ARTIFACT_DIR, help="Project dir to list.")) -> None:
766
941
  """List every world model built under the project dir."""
@@ -823,8 +998,12 @@ def download(
823
998
  raise typer.BadParameter(str(exc)) from exc
824
999
  except urllib.error.HTTPError as exc:
825
1000
  # One unpublished/broken dataset must not abort the REST of a multi-download:
826
- # record it, keep fetching, and fail (with every name) at the end.
827
- failures.append(f"{name}: the Hub answered {exc.code} for {exc.url}")
1001
+ # record it, keep fetching, and fail (with every name) at the end. The reason is
1002
+ # quoted rather than summarized here: a fetch tries more than one dataset repo id
1003
+ # and only the error it raises knows which ones the Hub refused. Reading it off
1004
+ # plain HTTPError attributes keeps this working against the PUBLISHED
1005
+ # environment-capture, which the WMO wheel resolves from PyPI.
1006
+ failures.append(f"{name}: the Hub answered {exc.code} for {exc.url} ({exc.reason})")
828
1007
  _console.print(f"[yellow]skipping {name}: Hub answered {exc.code}[/yellow]")
829
1008
  continue
830
1009
  except urllib.error.URLError as exc:
@@ -911,7 +1090,9 @@ def eval_( # noqa: A001 - `eval` is the user-facing command name; the builtin i
911
1090
  None, "--chain", help="Named failover chain from .wmo/fallback.toml (default: its default)."
912
1091
  ),
913
1092
  train_split: float | None = typer.Option(
914
- None, help="Train/holdout ratio per file (default: 0.7, or suite config)."
1093
+ None,
1094
+ help=f"Train/holdout ratio per file (default: {DEFAULT_TRAIN_SPLIT}, or suite config). "
1095
+ "Must match the ratio the model was built with, or the holdout contains train traces.",
915
1096
  ),
916
1097
  val_frac: float | None = typer.Option(
917
1098
  None,
@@ -1473,7 +1654,7 @@ def _eval_options(
1473
1654
  knowledge: bool | None = None,
1474
1655
  reasoning: bool | None = None,
1475
1656
  ) -> _EvalOptions:
1476
- split = 0.7 if train_split is None else train_split
1657
+ split = DEFAULT_TRAIN_SPLIT if train_split is None else train_split
1477
1658
  dim = 512 if embed_dim is None else embed_dim
1478
1659
  retrieval = True if rag is None else rag
1479
1660
  turns = "all" if sample_turns is None else sample_turns