autoforge-agent 0.4.1__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 (233) hide show
  1. autoforge_agent-0.4.3/LICENSE +21 -0
  2. autoforge_agent-0.4.3/MANIFEST.in +10 -0
  3. {autoforge_agent-0.4.1/autoforge_agent.egg-info → autoforge_agent-0.4.3}/PKG-INFO +67 -3
  4. autoforge_agent-0.4.1/PKG-INFO → autoforge_agent-0.4.3/README.md +63 -16
  5. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/__init__.py +69 -0
  6. autoforge_agent-0.4.3/autoforge/agent.py +6380 -0
  7. autoforge_agent-0.4.3/autoforge/audit.py +263 -0
  8. autoforge_agent-0.4.3/autoforge/autonomy/controls.py +320 -0
  9. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/selfmod.py +42 -11
  10. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/browser.py +9 -3
  11. autoforge_agent-0.4.3/autoforge/bus.py +907 -0
  12. autoforge_agent-0.4.3/autoforge/chaining.py +749 -0
  13. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cli.py +703 -25
  14. autoforge_agent-0.4.3/autoforge/core/agent.py +628 -0
  15. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/core/compaction.py +448 -33
  16. autoforge_agent-0.4.3/autoforge/core/lineedit.py +2339 -0
  17. autoforge_agent-0.4.3/autoforge/core/llm.py +827 -0
  18. autoforge_agent-0.4.3/autoforge/core/message.py +159 -0
  19. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/core/steering.py +196 -4
  20. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/ops.py +24 -0
  21. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/safety.py +15 -0
  22. autoforge_agent-0.4.3/autoforge/egress.py +327 -0
  23. autoforge_agent-0.4.3/autoforge/forge/capability_policy.py +318 -0
  24. autoforge_agent-0.4.3/autoforge/forge/claimgate.py +775 -0
  25. autoforge_agent-0.4.3/autoforge/forge/containment.py +492 -0
  26. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/generator.py +19 -6
  27. autoforge_agent-0.4.3/autoforge/forge/manifest.py +212 -0
  28. autoforge_agent-0.4.3/autoforge/forge/pipeline.py +523 -0
  29. autoforge_agent-0.4.3/autoforge/forge/sandbox.py +534 -0
  30. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/verifier.py +85 -1
  31. autoforge_agent-0.4.3/autoforge/forge/wsl_isolation.py +505 -0
  32. autoforge_agent-0.4.3/autoforge/lanes.py +441 -0
  33. autoforge_agent-0.4.3/autoforge/market.py +144 -0
  34. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/mcp.py +13 -0
  35. autoforge_agent-0.4.3/autoforge/media.py +475 -0
  36. autoforge_agent-0.4.3/autoforge/mission.py +666 -0
  37. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/modes.py +81 -7
  38. autoforge_agent-0.4.3/autoforge/package_hot_reload.py +284 -0
  39. autoforge_agent-0.4.3/autoforge/route/__init__.py +5 -0
  40. autoforge_agent-0.4.3/autoforge/route/arbiter.py +272 -0
  41. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/route/router.py +97 -21
  42. autoforge_agent-0.4.3/autoforge/runs.py +708 -0
  43. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/setup_wizard.py +35 -8
  44. autoforge_agent-0.4.3/autoforge/skills.py +982 -0
  45. autoforge_agent-0.4.3/autoforge/store.py +1089 -0
  46. autoforge_agent-0.4.3/autoforge/tars_port.py +375 -0
  47. autoforge_agent-0.4.3/autoforge/tools/exposure.py +141 -0
  48. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/registry.py +204 -18
  49. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/spec.py +48 -1
  50. autoforge_agent-0.4.3/autoforge/vault.py +398 -0
  51. autoforge_agent-0.4.3/autoforge/vendor/tars/__init__.py +27 -0
  52. autoforge_agent-0.4.3/autoforge/vendor/tars/agent.py +225 -0
  53. autoforge_agent-0.4.3/autoforge/vendor/tars/core/__init__.py +1 -0
  54. autoforge_agent-0.4.3/autoforge/vendor/tars/core/config.py +72 -0
  55. autoforge_agent-0.4.3/autoforge/vendor/tars/core/credentials.py +28 -0
  56. autoforge_agent-0.4.3/autoforge/vendor/tars/core/session.py +743 -0
  57. autoforge_agent-0.4.3/autoforge/vendor/tars/core/types.py +389 -0
  58. autoforge_agent-0.4.3/autoforge/vendor/tars/core/utils.py +406 -0
  59. autoforge_agent-0.4.3/autoforge/vendor/tars/roles/__init__.py +1 -0
  60. autoforge_agent-0.4.3/autoforge/vendor/tars/roles/executor.py +696 -0
  61. autoforge_agent-0.4.3/autoforge/vendor/tars/roles/probing.py +1056 -0
  62. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/__init__.py +1 -0
  63. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/eval_hooks.py +80 -0
  64. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/task_log.py +221 -0
  65. autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/web_access_monitor.py +302 -0
  66. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/__init__.py +1 -0
  67. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/dynamic_probe.py +40 -0
  68. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/runtime_context.py +52 -0
  69. autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/static_skills.py +287 -0
  70. autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/__init__.py +1 -0
  71. autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/schemas.py +869 -0
  72. autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/vm_handlers.py +775 -0
  73. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/vision.py +1 -1
  74. autoforge_agent-0.4.3/autoforge/web/static/index.html +406 -0
  75. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/webtools.py +9 -0
  76. autoforge_agent-0.4.1/README.md → autoforge_agent-0.4.3/autoforge_agent.egg-info/PKG-INFO +80 -2
  77. autoforge_agent-0.4.3/autoforge_agent.egg-info/SOURCES.txt +215 -0
  78. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/requires.txt +1 -0
  79. autoforge_agent-0.4.3/probes/FINDINGS.md +363 -0
  80. autoforge_agent-0.4.3/probes/probe_cap_big_prompt.py +104 -0
  81. autoforge_agent-0.4.3/probes/probe_cap_default.py +133 -0
  82. autoforge_agent-0.4.3/probes/probe_ceiling_focus.py +100 -0
  83. autoforge_agent-0.4.3/probes/probe_ceiling_retry.py +130 -0
  84. autoforge_agent-0.4.3/probes/probe_forge_latency.py +102 -0
  85. autoforge_agent-0.4.3/probes/probe_gateway_context_503.py +60 -0
  86. autoforge_agent-0.4.3/probes/probe_gateway_empty.py +83 -0
  87. autoforge_agent-0.4.3/probes/probe_gateway_max_tokens.py +122 -0
  88. autoforge_agent-0.4.3/probes/probe_gateway_models.py +134 -0
  89. autoforge_agent-0.4.3/probes/probe_gateway_thinking.py +134 -0
  90. autoforge_agent-0.4.3/probes/probe_generator_reply.py +69 -0
  91. autoforge_agent-0.4.3/probes/probe_length_vs_route.py +133 -0
  92. autoforge_agent-0.4.3/probes/probe_model_latency.py +66 -0
  93. autoforge_agent-0.4.3/probes/probe_reasoning_ceiling.py +97 -0
  94. autoforge_agent-0.4.3/probes/raw_generator_reply.txt +23 -0
  95. autoforge_agent-0.4.3/probes/raw_generator_reply_clean.txt +16 -0
  96. autoforge_agent-0.4.3/pyproject.toml +38 -0
  97. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/_terminal.py +14 -0
  98. autoforge_agent-0.4.3/tests/conftest.py +68 -0
  99. autoforge_agent-0.4.3/tests/test_audit_vault.py +365 -0
  100. autoforge_agent-0.4.3/tests/test_bus.py +422 -0
  101. autoforge_agent-0.4.3/tests/test_bus_mount.py +117 -0
  102. autoforge_agent-0.4.3/tests/test_cap_ceiling.py +233 -0
  103. autoforge_agent-0.4.3/tests/test_chaining.py +416 -0
  104. autoforge_agent-0.4.3/tests/test_claimgate.py +290 -0
  105. autoforge_agent-0.4.3/tests/test_claimgate_pipeline.py +195 -0
  106. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_cli.py +1 -1
  107. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_compaction.py +84 -6
  108. autoforge_agent-0.4.3/tests/test_compaction_interrupt.py +295 -0
  109. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_compaction_wiring.py +6 -1
  110. autoforge_agent-0.4.3/tests/test_containment.py +223 -0
  111. autoforge_agent-0.4.3/tests/test_context_limits.py +328 -0
  112. autoforge_agent-0.4.3/tests/test_controls.py +382 -0
  113. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_cpu.py +41 -0
  114. autoforge_agent-0.4.3/tests/test_egress.py +169 -0
  115. autoforge_agent-0.4.3/tests/test_forge_abort_reach.py +339 -0
  116. autoforge_agent-0.4.3/tests/test_forge_arbitration.py +282 -0
  117. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_forge_failure_feedback.py +16 -1
  118. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_generator_coercion.py +50 -0
  119. autoforge_agent-0.4.3/tests/test_host_facts.py +214 -0
  120. autoforge_agent-0.4.3/tests/test_image_paste.py +295 -0
  121. autoforge_agent-0.4.3/tests/test_interrupt_end_to_end.py +217 -0
  122. autoforge_agent-0.4.3/tests/test_interrupt_input_burst.py +139 -0
  123. autoforge_agent-0.4.3/tests/test_interrupt_responsiveness.py +267 -0
  124. autoforge_agent-0.4.3/tests/test_lanes.py +517 -0
  125. autoforge_agent-0.4.3/tests/test_lineedit.py +772 -0
  126. autoforge_agent-0.4.3/tests/test_lineedit_console_pending.py +155 -0
  127. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_llm_client.py +12 -4
  128. autoforge_agent-0.4.3/tests/test_llm_failover.py +278 -0
  129. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_llm_retry.py +21 -4
  130. autoforge_agent-0.4.3/tests/test_llm_usage.py +193 -0
  131. autoforge_agent-0.4.3/tests/test_market_prelookup.py +714 -0
  132. autoforge_agent-0.4.3/tests/test_media.py +500 -0
  133. autoforge_agent-0.4.3/tests/test_media_mcp_server.py +287 -0
  134. autoforge_agent-0.4.3/tests/test_mission.py +335 -0
  135. autoforge_agent-0.4.3/tests/test_mission_assumption.py +452 -0
  136. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_modes.py +30 -0
  137. autoforge_agent-0.4.3/tests/test_openclaw_port.py +212 -0
  138. autoforge_agent-0.4.3/tests/test_peer_market_config.py +89 -0
  139. autoforge_agent-0.4.3/tests/test_prompt_stability.py +127 -0
  140. autoforge_agent-0.4.3/tests/test_quiet_children.py +77 -0
  141. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_reach.py +40 -0
  142. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_reasoning_budget.py +11 -3
  143. autoforge_agent-0.4.3/tests/test_routing_weights.py +165 -0
  144. autoforge_agent-0.4.3/tests/test_run_python_tool.py +190 -0
  145. autoforge_agent-0.4.3/tests/test_runs_resume.py +736 -0
  146. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_self_knowledge.py +57 -6
  147. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_skills.py +94 -2
  148. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_steering.py +134 -2
  149. autoforge_agent-0.4.3/tests/test_store.py +123 -0
  150. autoforge_agent-0.4.3/tests/test_store_concurrency.py +141 -0
  151. autoforge_agent-0.4.3/tests/test_tars_port.py +181 -0
  152. autoforge_agent-0.4.3/tests/test_tool_exposure.py +332 -0
  153. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_v02.py +162 -0
  154. autoforge_agent-0.4.3/tests/test_wsl_isolation.py +185 -0
  155. autoforge_agent-0.4.1/MANIFEST.in +0 -6
  156. autoforge_agent-0.4.1/autoforge/agent.py +0 -2971
  157. autoforge_agent-0.4.1/autoforge/core/agent.py +0 -271
  158. autoforge_agent-0.4.1/autoforge/core/lineedit.py +0 -678
  159. autoforge_agent-0.4.1/autoforge/core/llm.py +0 -324
  160. autoforge_agent-0.4.1/autoforge/core/message.py +0 -89
  161. autoforge_agent-0.4.1/autoforge/forge/pipeline.py +0 -304
  162. autoforge_agent-0.4.1/autoforge/forge/sandbox.py +0 -301
  163. autoforge_agent-0.4.1/autoforge/route/__init__.py +0 -3
  164. autoforge_agent-0.4.1/autoforge/skills.py +0 -496
  165. autoforge_agent-0.4.1/autoforge/store.py +0 -611
  166. autoforge_agent-0.4.1/autoforge_agent.egg-info/SOURCES.txt +0 -115
  167. autoforge_agent-0.4.1/pyproject.toml +0 -24
  168. autoforge_agent-0.4.1/tests/conftest.py +0 -36
  169. autoforge_agent-0.4.1/tests/test_host_facts.py +0 -117
  170. autoforge_agent-0.4.1/tests/test_lineedit.py +0 -317
  171. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/__main__.py +0 -0
  172. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/__init__.py +0 -0
  173. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/confirm.py +0 -0
  174. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/policy.py +0 -0
  175. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/roles.py +0 -0
  176. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/spawn.py +0 -0
  177. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/topology.py +0 -0
  178. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/configfile.py +0 -0
  179. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/core/__init__.py +0 -0
  180. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/__init__.py +0 -0
  181. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/kernel.py +0 -0
  182. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/probe.py +0 -0
  183. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/tune.py +0 -0
  184. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/ecosystem.py +0 -0
  185. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/__init__.py +0 -0
  186. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/adversary.py +0 -0
  187. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/evolution.py +0 -0
  188. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/fuzzer.py +0 -0
  189. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/invariance.py +0 -0
  190. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/metacog.py +0 -0
  191. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/validity.py +0 -0
  192. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/__init__.py +0 -0
  193. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/backend_triton.py +0 -0
  194. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/bench.py +0 -0
  195. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/kernel.py +0 -0
  196. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/ops.py +0 -0
  197. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/probe.py +0 -0
  198. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/safety.py +0 -0
  199. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/units.py +0 -0
  200. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/measure.py +0 -0
  201. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/notify.py +0 -0
  202. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/schedule.py +0 -0
  203. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/timing.py +0 -0
  204. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/__init__.py +0 -0
  205. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/composition.py +0 -0
  206. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/web/__init__.py +0 -0
  207. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/web/server.py +0 -0
  208. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/dependency_links.txt +0 -0
  209. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/entry_points.txt +0 -0
  210. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/top_level.txt +0 -0
  211. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/setup.cfg +0 -0
  212. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/mcp_server_fixture.py +0 -0
  213. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_autoforge.py +0 -0
  214. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_browser.py +0 -0
  215. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_ecosystem.py +0 -0
  216. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_execution_samples.py +0 -0
  217. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_invariance.py +0 -0
  218. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_json_repair.py +0 -0
  219. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_live_progress.py +0 -0
  220. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_llm_response_shape.py +0 -0
  221. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_mcp.py +0 -0
  222. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_mcp_http.py +0 -0
  223. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_memory_injection.py +0 -0
  224. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_notify.py +0 -0
  225. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_policy_gates.py +0 -0
  226. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_roles.py +0 -0
  227. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_schedule.py +0 -0
  228. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_setup.py +0 -0
  229. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_topology.py +0 -0
  230. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_validity.py +0 -0
  231. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_vision.py +0 -0
  232. {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_web.py +0 -0
  233. {autoforge_agent-0.4.1 → 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.
@@ -0,0 +1,10 @@
1
+ # The sdist ships the test suite (setuptools picks up tests/test*.py on its own),
2
+ # so it has to ship everything that suite imports or reads:
3
+ # - conftest.py and the shared fakes the terminal and MCP tests drive
4
+ # - probes/: the captured generator replies test_json_repair reads by path
5
+ # Without this the tarball carried 39 test modules that could not be collected,
6
+ # plus two that failed on a missing fixture. Found by unpacking the release and
7
+ # running it -- which is now a job in ci.yml, and was briefly a job in
8
+ # tool-market's reproduce workflow before it moved to the repo that can fix it.
9
+ recursive-include tests *.py
10
+ recursive-include probes *.txt *.md *.py
@@ -1,16 +1,19 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autoforge-agent
3
- Version: 0.4.1
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"
15
+ Requires-Dist: pyyaml; extra == "dev"
16
+ Dynamic: license-file
14
17
 
15
18
  # autoforge
16
19
 
@@ -97,7 +100,7 @@ auto config
97
100
  base_url https://aiping.cn/api/v1 config C:\Users\you\.autoforge\config.json
98
101
  model DeepSeek-V4.1-Flash config C:\Users\you\.autoforge\config.json
99
102
  api_key QC-5...e262 (len 68) config C:\Users\you\.autoforge\config.json
100
- max_tokens 3000 config C:\Users\you\.autoforge\config.json
103
+ max_tokens 32768 default
101
104
  proxy True config C:\Users\you\.autoforge\config.json
102
105
  ```
103
106
 
@@ -112,6 +115,19 @@ auto --policy supervised # keep the harness, drop the latitud
112
115
  AUTOFORGE_POLICY=supervised auto # same, this shell only
113
116
  ```
114
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
+
115
131
  Why bother with a file when environment variables exist: a variable exported
116
132
  *after* a terminal was opened is invisible to that terminal — Windows and POSIX
117
133
  alike inherit the environment at process start. That turns configuration into
@@ -168,6 +184,35 @@ with `/` as text. Paste a block and it collapses to a one-line
168
184
  `[Pasted text #1: 40 lines → …]` placeholder — the text is kept on disk and
169
185
  expanded again before it reaches the model.
170
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
+
171
216
  The behaviour degrades honestly: a pipe, a redirect, or a test gets the plain
172
217
  cooked-mode reader and no heartbeat, because there is no terminal to own.
173
218
 
@@ -310,9 +355,15 @@ context but `force=True` still runs it. `rehab()` puts it back on trial.
310
355
 
311
356
  ```
312
357
  score = w_text·similarity + w_success·success_rate + w_trust·state_trust
313
- − w_cost·cost_penalty − w_over·over_trigger_penalty
314
358
  ```
315
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
+
316
367
  **Every freedom is declared, and each declaration is classified.** Two presets
317
368
  ship — `full` (the default: nothing denied) and `supervised` — selected with
318
369
  `--policy` or `AUTOFORGE_POLICY`, and `autoforge config` prints which is live.
@@ -475,3 +526,16 @@ similarity rather than embeddings — swap `text_similarity` for a vector index
475
526
  when the library is big enough to need it. `RoleType.FORGE` is declarative only:
476
527
  a topology names a forge role, it does not yet change which tools that child can
477
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 |
@@ -1,17 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: autoforge-agent
3
- Version: 0.4.1
4
- Summary: Agent framework with verifiable self-made tools (the forge pipeline).
5
- Author: Zhang Yangyi
6
- License: MIT
7
- Keywords: agents,llm,tools,self-improvement,verification
8
- Requires-Python: >=3.10
9
- Description-Content-Type: text/markdown
10
- Requires-Dist: requests>=2.28
11
- Provides-Extra: dev
12
- Requires-Dist: pytest>=7; extra == "dev"
13
- Requires-Dist: pytest-xdist; extra == "dev"
14
-
15
1
  # autoforge
16
2
 
17
3
  An agent framework that **builds its own tools** — and makes them earn their keep.
@@ -97,7 +83,7 @@ auto config
97
83
  base_url https://aiping.cn/api/v1 config C:\Users\you\.autoforge\config.json
98
84
  model DeepSeek-V4.1-Flash config C:\Users\you\.autoforge\config.json
99
85
  api_key QC-5...e262 (len 68) config C:\Users\you\.autoforge\config.json
100
- max_tokens 3000 config C:\Users\you\.autoforge\config.json
86
+ max_tokens 32768 default
101
87
  proxy True config C:\Users\you\.autoforge\config.json
102
88
  ```
103
89
 
@@ -112,6 +98,19 @@ auto --policy supervised # keep the harness, drop the latitud
112
98
  AUTOFORGE_POLICY=supervised auto # same, this shell only
113
99
  ```
114
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
+
115
114
  Why bother with a file when environment variables exist: a variable exported
116
115
  *after* a terminal was opened is invisible to that terminal — Windows and POSIX
117
116
  alike inherit the environment at process start. That turns configuration into
@@ -168,6 +167,35 @@ with `/` as text. Paste a block and it collapses to a one-line
168
167
  `[Pasted text #1: 40 lines → …]` placeholder — the text is kept on disk and
169
168
  expanded again before it reaches the model.
170
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
+
171
199
  The behaviour degrades honestly: a pipe, a redirect, or a test gets the plain
172
200
  cooked-mode reader and no heartbeat, because there is no terminal to own.
173
201
 
@@ -310,9 +338,15 @@ context but `force=True` still runs it. `rehab()` puts it back on trial.
310
338
 
311
339
  ```
312
340
  score = w_text·similarity + w_success·success_rate + w_trust·state_trust
313
- − w_cost·cost_penalty − w_over·over_trigger_penalty
314
341
  ```
315
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
+
316
350
  **Every freedom is declared, and each declaration is classified.** Two presets
317
351
  ship — `full` (the default: nothing denied) and `supervised` — selected with
318
352
  `--policy` or `AUTOFORGE_POLICY`, and `autoforge config` prints which is live.
@@ -475,3 +509,16 @@ similarity rather than embeddings — swap `text_similarity` for a vector index
475
509
  when the library is big enough to need it. `RoleType.FORGE` is declarative only:
476
510
  a topology names a forge role, it does not yet change which tools that child can
477
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