autoforge-agent 0.4.2__tar.gz → 0.4.3__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 (230) hide show
  1. autoforge_agent-0.4.3/LICENSE +21 -0
  2. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/PKG-INFO +66 -3
  3. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/README.md +63 -2
  4. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/__init__.py +69 -0
  5. autoforge_agent-0.4.3/autoforge/agent.py +6380 -0
  6. autoforge_agent-0.4.3/autoforge/audit.py +263 -0
  7. autoforge_agent-0.4.3/autoforge/autonomy/controls.py +320 -0
  8. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/selfmod.py +42 -11
  9. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/browser.py +9 -3
  10. autoforge_agent-0.4.3/autoforge/bus.py +907 -0
  11. autoforge_agent-0.4.3/autoforge/chaining.py +749 -0
  12. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cli.py +703 -25
  13. autoforge_agent-0.4.3/autoforge/core/agent.py +628 -0
  14. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/core/compaction.py +448 -33
  15. autoforge_agent-0.4.3/autoforge/core/lineedit.py +2339 -0
  16. autoforge_agent-0.4.3/autoforge/core/llm.py +827 -0
  17. autoforge_agent-0.4.3/autoforge/core/message.py +159 -0
  18. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/core/steering.py +196 -4
  19. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cpu/ops.py +24 -0
  20. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cpu/safety.py +15 -0
  21. autoforge_agent-0.4.3/autoforge/egress.py +327 -0
  22. autoforge_agent-0.4.3/autoforge/forge/capability_policy.py +318 -0
  23. autoforge_agent-0.4.3/autoforge/forge/claimgate.py +775 -0
  24. autoforge_agent-0.4.3/autoforge/forge/containment.py +492 -0
  25. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/generator.py +19 -6
  26. autoforge_agent-0.4.3/autoforge/forge/manifest.py +212 -0
  27. autoforge_agent-0.4.3/autoforge/forge/pipeline.py +523 -0
  28. autoforge_agent-0.4.3/autoforge/forge/sandbox.py +534 -0
  29. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/verifier.py +85 -1
  30. autoforge_agent-0.4.3/autoforge/forge/wsl_isolation.py +505 -0
  31. autoforge_agent-0.4.3/autoforge/lanes.py +441 -0
  32. autoforge_agent-0.4.3/autoforge/market.py +144 -0
  33. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/mcp.py +13 -0
  34. autoforge_agent-0.4.3/autoforge/media.py +475 -0
  35. autoforge_agent-0.4.3/autoforge/mission.py +666 -0
  36. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/modes.py +81 -7
  37. autoforge_agent-0.4.3/autoforge/package_hot_reload.py +284 -0
  38. autoforge_agent-0.4.3/autoforge/route/__init__.py +5 -0
  39. autoforge_agent-0.4.3/autoforge/route/arbiter.py +272 -0
  40. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/route/router.py +97 -21
  41. autoforge_agent-0.4.3/autoforge/runs.py +708 -0
  42. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/setup_wizard.py +35 -8
  43. autoforge_agent-0.4.3/autoforge/skills.py +982 -0
  44. autoforge_agent-0.4.3/autoforge/store.py +1089 -0
  45. autoforge_agent-0.4.3/autoforge/tars_port.py +375 -0
  46. autoforge_agent-0.4.3/autoforge/tools/exposure.py +141 -0
  47. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/tools/registry.py +204 -18
  48. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/tools/spec.py +48 -1
  49. autoforge_agent-0.4.3/autoforge/vault.py +398 -0
  50. autoforge_agent-0.4.3/autoforge/vendor/tars/__init__.py +27 -0
  51. autoforge_agent-0.4.3/autoforge/vendor/tars/agent.py +225 -0
  52. autoforge_agent-0.4.3/autoforge/vendor/tars/core/__init__.py +1 -0
  53. autoforge_agent-0.4.3/autoforge/vendor/tars/core/config.py +72 -0
  54. autoforge_agent-0.4.3/autoforge/vendor/tars/core/credentials.py +28 -0
  55. autoforge_agent-0.4.3/autoforge/vendor/tars/core/session.py +743 -0
  56. autoforge_agent-0.4.3/autoforge/vendor/tars/core/types.py +389 -0
  57. autoforge_agent-0.4.3/autoforge/vendor/tars/core/utils.py +406 -0
  58. autoforge_agent-0.4.3/autoforge/vendor/tars/roles/__init__.py +1 -0
  59. autoforge_agent-0.4.3/autoforge/vendor/tars/roles/executor.py +696 -0
  60. autoforge_agent-0.4.3/autoforge/vendor/tars/roles/probing.py +1056 -0
  61. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/__init__.py +1 -0
  62. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/eval_hooks.py +80 -0
  63. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/task_log.py +221 -0
  64. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/web_access_monitor.py +302 -0
  65. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/__init__.py +1 -0
  66. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/dynamic_probe.py +40 -0
  67. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/runtime_context.py +52 -0
  68. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/static_skills.py +287 -0
  69. autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/__init__.py +1 -0
  70. autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/schemas.py +869 -0
  71. autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/vm_handlers.py +775 -0
  72. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/vision.py +1 -1
  73. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/webtools.py +9 -0
  74. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/PKG-INFO +66 -3
  75. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/SOURCES.txt +89 -1
  76. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/FINDINGS.md +110 -8
  77. autoforge_agent-0.4.3/probes/probe_cap_big_prompt.py +104 -0
  78. autoforge_agent-0.4.3/probes/probe_cap_default.py +133 -0
  79. autoforge_agent-0.4.3/probes/probe_ceiling_focus.py +100 -0
  80. autoforge_agent-0.4.3/probes/probe_ceiling_retry.py +130 -0
  81. autoforge_agent-0.4.3/probes/probe_length_vs_route.py +133 -0
  82. autoforge_agent-0.4.3/probes/probe_reasoning_ceiling.py +97 -0
  83. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/pyproject.toml +1 -1
  84. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/_terminal.py +14 -0
  85. autoforge_agent-0.4.3/tests/conftest.py +68 -0
  86. autoforge_agent-0.4.3/tests/test_audit_vault.py +365 -0
  87. autoforge_agent-0.4.3/tests/test_bus.py +422 -0
  88. autoforge_agent-0.4.3/tests/test_bus_mount.py +117 -0
  89. autoforge_agent-0.4.3/tests/test_cap_ceiling.py +233 -0
  90. autoforge_agent-0.4.3/tests/test_chaining.py +416 -0
  91. autoforge_agent-0.4.3/tests/test_claimgate.py +290 -0
  92. autoforge_agent-0.4.3/tests/test_claimgate_pipeline.py +195 -0
  93. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_cli.py +1 -1
  94. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_compaction.py +84 -6
  95. autoforge_agent-0.4.3/tests/test_compaction_interrupt.py +295 -0
  96. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_compaction_wiring.py +6 -1
  97. autoforge_agent-0.4.3/tests/test_containment.py +223 -0
  98. autoforge_agent-0.4.3/tests/test_context_limits.py +328 -0
  99. autoforge_agent-0.4.3/tests/test_controls.py +382 -0
  100. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_cpu.py +41 -0
  101. autoforge_agent-0.4.3/tests/test_egress.py +169 -0
  102. autoforge_agent-0.4.3/tests/test_forge_abort_reach.py +339 -0
  103. autoforge_agent-0.4.3/tests/test_forge_arbitration.py +282 -0
  104. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_forge_failure_feedback.py +16 -1
  105. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_generator_coercion.py +50 -0
  106. autoforge_agent-0.4.3/tests/test_host_facts.py +214 -0
  107. autoforge_agent-0.4.3/tests/test_image_paste.py +295 -0
  108. autoforge_agent-0.4.3/tests/test_interrupt_end_to_end.py +217 -0
  109. autoforge_agent-0.4.3/tests/test_interrupt_input_burst.py +139 -0
  110. autoforge_agent-0.4.3/tests/test_interrupt_responsiveness.py +267 -0
  111. autoforge_agent-0.4.3/tests/test_lanes.py +517 -0
  112. autoforge_agent-0.4.3/tests/test_lineedit.py +772 -0
  113. autoforge_agent-0.4.3/tests/test_lineedit_console_pending.py +155 -0
  114. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_llm_client.py +12 -4
  115. autoforge_agent-0.4.3/tests/test_llm_failover.py +278 -0
  116. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_llm_retry.py +21 -4
  117. autoforge_agent-0.4.3/tests/test_llm_usage.py +193 -0
  118. autoforge_agent-0.4.3/tests/test_market_prelookup.py +714 -0
  119. autoforge_agent-0.4.3/tests/test_media.py +500 -0
  120. autoforge_agent-0.4.3/tests/test_media_mcp_server.py +287 -0
  121. autoforge_agent-0.4.3/tests/test_mission.py +335 -0
  122. autoforge_agent-0.4.3/tests/test_mission_assumption.py +452 -0
  123. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_modes.py +30 -0
  124. autoforge_agent-0.4.3/tests/test_openclaw_port.py +212 -0
  125. autoforge_agent-0.4.3/tests/test_peer_market_config.py +89 -0
  126. autoforge_agent-0.4.3/tests/test_prompt_stability.py +127 -0
  127. autoforge_agent-0.4.3/tests/test_quiet_children.py +77 -0
  128. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_reach.py +40 -0
  129. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_reasoning_budget.py +11 -3
  130. autoforge_agent-0.4.3/tests/test_routing_weights.py +165 -0
  131. autoforge_agent-0.4.3/tests/test_run_python_tool.py +190 -0
  132. autoforge_agent-0.4.3/tests/test_runs_resume.py +736 -0
  133. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_self_knowledge.py +57 -6
  134. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_skills.py +94 -2
  135. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_steering.py +134 -2
  136. autoforge_agent-0.4.3/tests/test_store.py +123 -0
  137. autoforge_agent-0.4.3/tests/test_store_concurrency.py +141 -0
  138. autoforge_agent-0.4.3/tests/test_tars_port.py +181 -0
  139. autoforge_agent-0.4.3/tests/test_tool_exposure.py +332 -0
  140. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_v02.py +162 -0
  141. autoforge_agent-0.4.3/tests/test_wsl_isolation.py +185 -0
  142. autoforge_agent-0.4.2/autoforge/agent.py +0 -2971
  143. autoforge_agent-0.4.2/autoforge/core/agent.py +0 -271
  144. autoforge_agent-0.4.2/autoforge/core/lineedit.py +0 -678
  145. autoforge_agent-0.4.2/autoforge/core/llm.py +0 -324
  146. autoforge_agent-0.4.2/autoforge/core/message.py +0 -89
  147. autoforge_agent-0.4.2/autoforge/forge/pipeline.py +0 -304
  148. autoforge_agent-0.4.2/autoforge/forge/sandbox.py +0 -301
  149. autoforge_agent-0.4.2/autoforge/route/__init__.py +0 -3
  150. autoforge_agent-0.4.2/autoforge/skills.py +0 -496
  151. autoforge_agent-0.4.2/autoforge/store.py +0 -611
  152. autoforge_agent-0.4.2/tests/conftest.py +0 -36
  153. autoforge_agent-0.4.2/tests/test_host_facts.py +0 -117
  154. autoforge_agent-0.4.2/tests/test_lineedit.py +0 -317
  155. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/MANIFEST.in +0 -0
  156. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/__main__.py +0 -0
  157. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/__init__.py +0 -0
  158. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/confirm.py +0 -0
  159. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/policy.py +0 -0
  160. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/roles.py +0 -0
  161. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/spawn.py +0 -0
  162. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/autonomy/topology.py +0 -0
  163. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/configfile.py +0 -0
  164. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/core/__init__.py +0 -0
  165. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cpu/__init__.py +0 -0
  166. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cpu/kernel.py +0 -0
  167. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cpu/probe.py +0 -0
  168. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/cpu/tune.py +0 -0
  169. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/ecosystem.py +0 -0
  170. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/__init__.py +0 -0
  171. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/adversary.py +0 -0
  172. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/evolution.py +0 -0
  173. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/fuzzer.py +0 -0
  174. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/invariance.py +0 -0
  175. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/metacog.py +0 -0
  176. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/forge/validity.py +0 -0
  177. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/__init__.py +0 -0
  178. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/backend_triton.py +0 -0
  179. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/bench.py +0 -0
  180. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/kernel.py +0 -0
  181. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/ops.py +0 -0
  182. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/probe.py +0 -0
  183. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/safety.py +0 -0
  184. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/gpu/units.py +0 -0
  185. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/measure.py +0 -0
  186. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/notify.py +0 -0
  187. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/schedule.py +0 -0
  188. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/timing.py +0 -0
  189. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/tools/__init__.py +0 -0
  190. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/tools/composition.py +0 -0
  191. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/web/__init__.py +0 -0
  192. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/web/server.py +0 -0
  193. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge/web/static/index.html +0 -0
  194. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/dependency_links.txt +0 -0
  195. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/entry_points.txt +0 -0
  196. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/requires.txt +0 -0
  197. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/top_level.txt +0 -0
  198. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_forge_latency.py +0 -0
  199. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_gateway_context_503.py +0 -0
  200. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_gateway_empty.py +0 -0
  201. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_gateway_max_tokens.py +0 -0
  202. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_gateway_models.py +0 -0
  203. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_gateway_thinking.py +0 -0
  204. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_generator_reply.py +0 -0
  205. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/probe_model_latency.py +0 -0
  206. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/raw_generator_reply.txt +0 -0
  207. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/probes/raw_generator_reply_clean.txt +0 -0
  208. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/setup.cfg +0 -0
  209. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/mcp_server_fixture.py +0 -0
  210. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_autoforge.py +0 -0
  211. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_browser.py +0 -0
  212. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_ecosystem.py +0 -0
  213. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_execution_samples.py +0 -0
  214. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_invariance.py +0 -0
  215. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_json_repair.py +0 -0
  216. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_live_progress.py +0 -0
  217. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_llm_response_shape.py +0 -0
  218. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_mcp.py +0 -0
  219. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_mcp_http.py +0 -0
  220. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_memory_injection.py +0 -0
  221. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_notify.py +0 -0
  222. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_policy_gates.py +0 -0
  223. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_roles.py +0 -0
  224. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_schedule.py +0 -0
  225. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_setup.py +0 -0
  226. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_topology.py +0 -0
  227. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_validity.py +0 -0
  228. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_vision.py +0 -0
  229. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_web.py +0 -0
  230. {autoforge_agent-0.4.2 → autoforge_agent-0.4.3}/tests/test_web_live.py +0 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yangyi Zhang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,17 +1,19 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autoforge-agent
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: Agent framework with verifiable self-made tools (the forge pipeline).
5
5
  Author: Zhang Yangyi
6
6
  License: MIT
7
7
  Keywords: agents,llm,tools,self-improvement,verification
8
8
  Requires-Python: >=3.10
9
9
  Description-Content-Type: text/markdown
10
+ License-File: LICENSE
10
11
  Requires-Dist: requests>=2.28
11
12
  Provides-Extra: dev
12
13
  Requires-Dist: pytest>=7; extra == "dev"
13
14
  Requires-Dist: pytest-xdist; extra == "dev"
14
15
  Requires-Dist: pyyaml; extra == "dev"
16
+ Dynamic: license-file
15
17
 
16
18
  # autoforge
17
19
 
@@ -98,7 +100,7 @@ auto config
98
100
  base_url https://aiping.cn/api/v1 config C:\Users\you\.autoforge\config.json
99
101
  model DeepSeek-V4.1-Flash config C:\Users\you\.autoforge\config.json
100
102
  api_key QC-5...e262 (len 68) config C:\Users\you\.autoforge\config.json
101
- max_tokens 3000 config C:\Users\you\.autoforge\config.json
103
+ max_tokens 32768 default
102
104
  proxy True config C:\Users\you\.autoforge\config.json
103
105
  ```
104
106
 
@@ -113,6 +115,19 @@ auto --policy supervised # keep the harness, drop the latitud
113
115
  AUTOFORGE_POLICY=supervised auto # same, this shell only
114
116
  ```
115
117
 
118
+ `max_tokens` is a budget rather than a limit on the answer: the generator's model
119
+ reasons before it writes, and the trace is spent out of the same budget. At the old
120
+ 3000 the trace took the whole of it and the envelope never began, so the default is
121
+ 32768. A provider with a lower ceiling is not a problem -- a 400 that names
122
+ `max_tokens` is answered at the number it names. Two things to know before tuning it
123
+ down: an envelope cut off mid-JSON fails to parse, and a truncated one that *does*
124
+ parse arrives with empty `probes`, which the pipeline accepts as a tool that has been
125
+ verified. If a gateway answers `503 暂无可用服务商` for a large cap on a reasoning
126
+ model no matter how long you wait, that is its routing rather than the number you
127
+ sent: the combination measured to work through the aiping gateway is
128
+ `--model Qwen3.5-Flash` with `AUTOFORGE_MAX_TOKENS=4000`, while a direct provider
129
+ endpoint takes the full 32768. Numbers and controls in `probes/FINDINGS.md`.
130
+
116
131
  Why bother with a file when environment variables exist: a variable exported
117
132
  *after* a terminal was opened is invisible to that terminal — Windows and POSIX
118
133
  alike inherit the environment at process start. That turns configuration into
@@ -169,6 +184,35 @@ with `/` as text. Paste a block and it collapses to a one-line
169
184
  `[Pasted text #1: 40 lines → …]` placeholder — the text is kept on disk and
170
185
  expanded again before it reaches the model.
171
186
 
187
+ ### Selecting part of a line
188
+
189
+ ```
190
+ you> check the empty file case
191
+ └──────┘ Shift+arrows select, Ctrl+Insert copies, Ctrl+Delete cuts
192
+ ```
193
+
194
+ `Shift+Left`/`Shift+Right` extend a selection from where the cursor is,
195
+ `Shift+Home`/`Shift+End` take it to either end, and the span is drawn in
196
+ reverse video. `Ctrl+Insert` copies it, `Ctrl+Delete` cuts it, `Shift+Insert`
197
+ and `^V`/`^Y` paste, and `Backspace`, `Delete`, `^K`, `^U` and `^W` remove the
198
+ selection when there is one. Typing over a selection replaces it. `^C` is left
199
+ alone: it still stops the run, because a terminal that can copy but cannot be
200
+ interrupted cannot be left.
201
+
202
+ **The mouse stays the console's.** The editor can take it — `AUTOFORGE_MOUSE=1`
203
+ — and keep the selection itself, which is the only way it ever hears about a
204
+ drag on Windows: the console paints its own highlight, keeps it, and reports
205
+ nothing, so a drag over the middle of the line followed by `Delete` deletes the
206
+ last character instead. But taking the mouse takes it for the whole session:
207
+ quick-edit off means the console stops selecting *and stops scrolling on the
208
+ wheel*, so reading back through what the agent printed stops working. That is a
209
+ worse trade than the bug, and it was reported as such, so the default is to
210
+ leave the mouse alone and select on the keys instead.
211
+
212
+ The keys an X terminal has always had keep working: `Ctrl+A`/`Ctrl+E` for the
213
+ ends of the line, `Ctrl+W` for the previous word, `Ctrl+U`/`Ctrl+K` to kill to
214
+ either end.
215
+
172
216
  The behaviour degrades honestly: a pipe, a redirect, or a test gets the plain
173
217
  cooked-mode reader and no heartbeat, because there is no terminal to own.
174
218
 
@@ -311,9 +355,15 @@ context but `force=True` still runs it. `rehab()` puts it back on trial.
311
355
 
312
356
  ```
313
357
  score = w_text·similarity + w_success·success_rate + w_trust·state_trust
314
- − w_cost·cost_penalty − w_over·over_trigger_penalty
315
358
  ```
316
359
 
360
+ `cost` and `over_trigger` were terms here until 2026-09-28, when the library
361
+ was measured and both scored a constant for all 120 tools — `cost_hint` is
362
+ "cheap" everywhere and nothing re-probes a forged tool against its
363
+ `TriggerProbe`, so `trigger_misses` stays 0. They were removed rather than
364
+ weighted at zero: a tunable weight on a constant is a knob that can only make
365
+ retrieval worse, and `amend_self` would have had no signal to notice it by.
366
+
317
367
  **Every freedom is declared, and each declaration is classified.** Two presets
318
368
  ship — `full` (the default: nothing denied) and `supervised` — selected with
319
369
  `--policy` or `AUTOFORGE_POLICY`, and `autoforge config` prints which is live.
@@ -476,3 +526,16 @@ similarity rather than embeddings — swap `text_similarity` for a vector index
476
526
  when the library is big enough to need it. `RoleType.FORGE` is declarative only:
477
527
  a topology names a forge role, it does not yet change which tools that child can
478
528
  reach.
529
+
530
+ ## Related work by the same author
531
+
532
+ The same claim -- *a number is meaningless until it is shown to survive its own
533
+ verification* -- is made and measured in other domains:
534
+
535
+ | repo | the number it refuses to trust |
536
+ | ---- | ---- |
537
+ | [autoforge](https://github.com/ZhangYangyi03/autoforge) | a tool's fitness, until an oracle outside the tool agrees |
538
+ | [agentic-eda](https://github.com/ZhangYangyi03/agentic-eda) | a circuit's area, until equivalence to the reference netlist is proven |
539
+ | [debt-verify](https://github.com/ZhangYangyi03/debt-verify) | a debt clause decision, until it survives the published revision record |
540
+ | [tool-market](https://github.com/ZhangYangyi03/tool-market) | a tool's liveness, until the hash chain says which revision is live |
541
+ | [agent-safety-bench](https://github.com/ZhangYangyi03/agent-safety-bench) | a model's safety compliance, measured rather than assumed |
@@ -83,7 +83,7 @@ auto config
83
83
  base_url https://aiping.cn/api/v1 config C:\Users\you\.autoforge\config.json
84
84
  model DeepSeek-V4.1-Flash config C:\Users\you\.autoforge\config.json
85
85
  api_key QC-5...e262 (len 68) config C:\Users\you\.autoforge\config.json
86
- max_tokens 3000 config C:\Users\you\.autoforge\config.json
86
+ max_tokens 32768 default
87
87
  proxy True config C:\Users\you\.autoforge\config.json
88
88
  ```
89
89
 
@@ -98,6 +98,19 @@ auto --policy supervised # keep the harness, drop the latitud
98
98
  AUTOFORGE_POLICY=supervised auto # same, this shell only
99
99
  ```
100
100
 
101
+ `max_tokens` is a budget rather than a limit on the answer: the generator's model
102
+ reasons before it writes, and the trace is spent out of the same budget. At the old
103
+ 3000 the trace took the whole of it and the envelope never began, so the default is
104
+ 32768. A provider with a lower ceiling is not a problem -- a 400 that names
105
+ `max_tokens` is answered at the number it names. Two things to know before tuning it
106
+ down: an envelope cut off mid-JSON fails to parse, and a truncated one that *does*
107
+ parse arrives with empty `probes`, which the pipeline accepts as a tool that has been
108
+ verified. If a gateway answers `503 暂无可用服务商` for a large cap on a reasoning
109
+ model no matter how long you wait, that is its routing rather than the number you
110
+ sent: the combination measured to work through the aiping gateway is
111
+ `--model Qwen3.5-Flash` with `AUTOFORGE_MAX_TOKENS=4000`, while a direct provider
112
+ endpoint takes the full 32768. Numbers and controls in `probes/FINDINGS.md`.
113
+
101
114
  Why bother with a file when environment variables exist: a variable exported
102
115
  *after* a terminal was opened is invisible to that terminal — Windows and POSIX
103
116
  alike inherit the environment at process start. That turns configuration into
@@ -154,6 +167,35 @@ with `/` as text. Paste a block and it collapses to a one-line
154
167
  `[Pasted text #1: 40 lines → …]` placeholder — the text is kept on disk and
155
168
  expanded again before it reaches the model.
156
169
 
170
+ ### Selecting part of a line
171
+
172
+ ```
173
+ you> check the empty file case
174
+ └──────┘ Shift+arrows select, Ctrl+Insert copies, Ctrl+Delete cuts
175
+ ```
176
+
177
+ `Shift+Left`/`Shift+Right` extend a selection from where the cursor is,
178
+ `Shift+Home`/`Shift+End` take it to either end, and the span is drawn in
179
+ reverse video. `Ctrl+Insert` copies it, `Ctrl+Delete` cuts it, `Shift+Insert`
180
+ and `^V`/`^Y` paste, and `Backspace`, `Delete`, `^K`, `^U` and `^W` remove the
181
+ selection when there is one. Typing over a selection replaces it. `^C` is left
182
+ alone: it still stops the run, because a terminal that can copy but cannot be
183
+ interrupted cannot be left.
184
+
185
+ **The mouse stays the console's.** The editor can take it — `AUTOFORGE_MOUSE=1`
186
+ — and keep the selection itself, which is the only way it ever hears about a
187
+ drag on Windows: the console paints its own highlight, keeps it, and reports
188
+ nothing, so a drag over the middle of the line followed by `Delete` deletes the
189
+ last character instead. But taking the mouse takes it for the whole session:
190
+ quick-edit off means the console stops selecting *and stops scrolling on the
191
+ wheel*, so reading back through what the agent printed stops working. That is a
192
+ worse trade than the bug, and it was reported as such, so the default is to
193
+ leave the mouse alone and select on the keys instead.
194
+
195
+ The keys an X terminal has always had keep working: `Ctrl+A`/`Ctrl+E` for the
196
+ ends of the line, `Ctrl+W` for the previous word, `Ctrl+U`/`Ctrl+K` to kill to
197
+ either end.
198
+
157
199
  The behaviour degrades honestly: a pipe, a redirect, or a test gets the plain
158
200
  cooked-mode reader and no heartbeat, because there is no terminal to own.
159
201
 
@@ -296,9 +338,15 @@ context but `force=True` still runs it. `rehab()` puts it back on trial.
296
338
 
297
339
  ```
298
340
  score = w_text·similarity + w_success·success_rate + w_trust·state_trust
299
- − w_cost·cost_penalty − w_over·over_trigger_penalty
300
341
  ```
301
342
 
343
+ `cost` and `over_trigger` were terms here until 2026-09-28, when the library
344
+ was measured and both scored a constant for all 120 tools — `cost_hint` is
345
+ "cheap" everywhere and nothing re-probes a forged tool against its
346
+ `TriggerProbe`, so `trigger_misses` stays 0. They were removed rather than
347
+ weighted at zero: a tunable weight on a constant is a knob that can only make
348
+ retrieval worse, and `amend_self` would have had no signal to notice it by.
349
+
302
350
  **Every freedom is declared, and each declaration is classified.** Two presets
303
351
  ship — `full` (the default: nothing denied) and `supervised` — selected with
304
352
  `--policy` or `AUTOFORGE_POLICY`, and `autoforge config` prints which is live.
@@ -461,3 +509,16 @@ similarity rather than embeddings — swap `text_similarity` for a vector index
461
509
  when the library is big enough to need it. `RoleType.FORGE` is declarative only:
462
510
  a topology names a forge role, it does not yet change which tools that child can
463
511
  reach.
512
+
513
+ ## Related work by the same author
514
+
515
+ The same claim -- *a number is meaningless until it is shown to survive its own
516
+ verification* -- is made and measured in other domains:
517
+
518
+ | repo | the number it refuses to trust |
519
+ | ---- | ---- |
520
+ | [autoforge](https://github.com/ZhangYangyi03/autoforge) | a tool's fitness, until an oracle outside the tool agrees |
521
+ | [agentic-eda](https://github.com/ZhangYangyi03/agentic-eda) | a circuit's area, until equivalence to the reference netlist is proven |
522
+ | [debt-verify](https://github.com/ZhangYangyi03/debt-verify) | a debt clause decision, until it survives the published revision record |
523
+ | [tool-market](https://github.com/ZhangYangyi03/tool-market) | a tool's liveness, until the hash chain says which revision is live |
524
+ | [agent-safety-bench](https://github.com/ZhangYangyi03/agent-safety-bench) | a model's safety compliance, measured rather than assumed |
@@ -15,6 +15,75 @@ Design pillars
15
15
  Freedom is the default; verification lets you *trust* what the freedom produced.
16
16
  """
17
17
 
18
+ import os
19
+
20
+ # No console window for any child this *process* starts.
21
+ #
22
+ # The agent is started by a scheduled task through pythonw, which owns no
23
+ # console. Windows gives a console-subsystem child of a console-less parent a
24
+ # *fresh* console -- a visible window on the operator's desktop -- so every
25
+ # subprocess that starts without a flag flashes one. Measured on 2026-09-16 by
26
+ # enumerating visible top-level windows by pid: flags=0 yields one visible
27
+ # PseudoConsoleWindow, DETACHED_PROCESS none. `GetConsoleWindow()` is the wrong
28
+ # probe for this: it reports non-zero even under DETACHED_PROCESS, where no
29
+ # window is shown. The flag is CREATE_NO_WINDOW, not DETACHED_PROCESS: see the
30
+ # long note at `_NO_WINDOW` below for why the difference is load-bearing.
31
+ #
32
+ # Done here, at import, rather than at each call site: the spawns live in
33
+ # webtools (the search worker), market, schedule, cpu/safety and mcp, and a rule
34
+ # that has to be remembered at five places is a rule that will be missing from
35
+ # the sixth. Nothing in this package does `from subprocess import Popen`, so the
36
+ # class is always looked up on the module and one assignment covers all of them.
37
+ #
38
+ # AUTOFORGE_KEEP_CONSOLE=1 opts out, for the case where a visible window is what
39
+ # is wanted -- debugging a child that dies before it can log.
40
+ if os.name == "nt" and not os.environ.get("AUTOFORGE_KEEP_CONSOLE"):
41
+ import subprocess as _subprocess
42
+
43
+ #: CREATE_NO_WINDOW: the child gets a console, but it is hidden -- and every
44
+ #: console-subsystem process it starts inherits that hidden console instead
45
+ #: of being handed a fresh one of its own.
46
+ #:
47
+ #: The previous value was DETACHED_PROCESS (0x00000008), chosen because it
48
+ #: was measured to produce no visible window for the *direct* child. It is
49
+ #: the wrong flag, for two reasons that only show up one level deeper or one
50
+ #: pipe further:
51
+ #:
52
+ #: * DETACHED_PROCESS creates no console at all, so the child has none to
53
+ #: pass down. Every console-subsystem process *it* starts is therefore a
54
+ #: console-less parent's child -- exactly the condition this block exists
55
+ #: to prevent -- and Windows gives it a fresh, visible console. One level
56
+ #: of detachment only moves the flash from the child to the grandchild.
57
+ #: `shell=True` always adds that level: cmd.exe is the child, the real
58
+ #: command is the flashed grandchild.
59
+ #: * a detached child has no console for `wsl.exe` to write to, and it
60
+ #: then exits 0 with empty stdout and empty stderr on a captured pipe --
61
+ #: measured on this host. That silent-nothing is what `wsl_isolation`
62
+ #: used to read as "the distro is not answering".
63
+ #:
64
+ #: CREATE_NO_WINDOW has neither problem. Verified on 2026-09-16 by
65
+ #: enumerating visible top-level windows by pid under the default Windows
66
+ #: Terminal host: DETACHED_PROCESS -> one CASCADIA_HOSTING_WINDOW_CLASS
67
+ #: window, which also took focus; CREATE_NO_WINDOW -> none, with the
68
+ #: command's output intact. The wsl carve-out that used to live here is gone
69
+ #: with it: CREATE_NO_WINDOW needs no per-executable exception.
70
+ _NO_WINDOW = 0x08000000 # CREATE_NO_WINDOW
71
+
72
+ class _QuietPopen(_subprocess.Popen):
73
+ """subprocess.Popen, but the child never gets a console window."""
74
+
75
+ def __init__(self, *args, **kwargs):
76
+ flags = int(kwargs.get("creationflags") or 0)
77
+ # OR'd, not assigned: a caller that asks for CREATE_NEW_PROCESS_GROUP
78
+ # or a detached browser keeps its flag.
79
+ kwargs["creationflags"] = flags | _NO_WINDOW
80
+ super().__init__(*args, **kwargs)
81
+
82
+ if _subprocess.Popen.__name__ != "_QuietPopen":
83
+ _subprocess.Popen = _QuietPopen
84
+ globals()["_QuietPopen"] = _QuietPopen
85
+
86
+
18
87
  # One source of truth: pyproject.toml. Hardcoding the version here meant the
19
88
  # package reported 0.2.0 while pyproject said 0.4.0 -- a number nobody would
20
89
  # notice was wrong until they quoted it. Read it from the installed metadata