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.
- autoforge_agent-0.4.3/LICENSE +21 -0
- autoforge_agent-0.4.3/MANIFEST.in +10 -0
- {autoforge_agent-0.4.1/autoforge_agent.egg-info → autoforge_agent-0.4.3}/PKG-INFO +67 -3
- autoforge_agent-0.4.1/PKG-INFO → autoforge_agent-0.4.3/README.md +63 -16
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/__init__.py +69 -0
- autoforge_agent-0.4.3/autoforge/agent.py +6380 -0
- autoforge_agent-0.4.3/autoforge/audit.py +263 -0
- autoforge_agent-0.4.3/autoforge/autonomy/controls.py +320 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/selfmod.py +42 -11
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/browser.py +9 -3
- autoforge_agent-0.4.3/autoforge/bus.py +907 -0
- autoforge_agent-0.4.3/autoforge/chaining.py +749 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cli.py +703 -25
- autoforge_agent-0.4.3/autoforge/core/agent.py +628 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/core/compaction.py +448 -33
- autoforge_agent-0.4.3/autoforge/core/lineedit.py +2339 -0
- autoforge_agent-0.4.3/autoforge/core/llm.py +827 -0
- autoforge_agent-0.4.3/autoforge/core/message.py +159 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/core/steering.py +196 -4
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/ops.py +24 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/safety.py +15 -0
- autoforge_agent-0.4.3/autoforge/egress.py +327 -0
- autoforge_agent-0.4.3/autoforge/forge/capability_policy.py +318 -0
- autoforge_agent-0.4.3/autoforge/forge/claimgate.py +775 -0
- autoforge_agent-0.4.3/autoforge/forge/containment.py +492 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/generator.py +19 -6
- autoforge_agent-0.4.3/autoforge/forge/manifest.py +212 -0
- autoforge_agent-0.4.3/autoforge/forge/pipeline.py +523 -0
- autoforge_agent-0.4.3/autoforge/forge/sandbox.py +534 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/verifier.py +85 -1
- autoforge_agent-0.4.3/autoforge/forge/wsl_isolation.py +505 -0
- autoforge_agent-0.4.3/autoforge/lanes.py +441 -0
- autoforge_agent-0.4.3/autoforge/market.py +144 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/mcp.py +13 -0
- autoforge_agent-0.4.3/autoforge/media.py +475 -0
- autoforge_agent-0.4.3/autoforge/mission.py +666 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/modes.py +81 -7
- autoforge_agent-0.4.3/autoforge/package_hot_reload.py +284 -0
- autoforge_agent-0.4.3/autoforge/route/__init__.py +5 -0
- autoforge_agent-0.4.3/autoforge/route/arbiter.py +272 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/route/router.py +97 -21
- autoforge_agent-0.4.3/autoforge/runs.py +708 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/setup_wizard.py +35 -8
- autoforge_agent-0.4.3/autoforge/skills.py +982 -0
- autoforge_agent-0.4.3/autoforge/store.py +1089 -0
- autoforge_agent-0.4.3/autoforge/tars_port.py +375 -0
- autoforge_agent-0.4.3/autoforge/tools/exposure.py +141 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/registry.py +204 -18
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/spec.py +48 -1
- autoforge_agent-0.4.3/autoforge/vault.py +398 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/__init__.py +27 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/agent.py +225 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/core/__init__.py +1 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/core/config.py +72 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/core/credentials.py +28 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/core/session.py +743 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/core/types.py +389 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/core/utils.py +406 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/roles/__init__.py +1 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/roles/executor.py +696 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/roles/probing.py +1056 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/__init__.py +1 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/eval_hooks.py +80 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/task_log.py +221 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/runtime/web_access_monitor.py +302 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/__init__.py +1 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/dynamic_probe.py +40 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/runtime_context.py +52 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/skill_system/static_skills.py +287 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/__init__.py +1 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/schemas.py +869 -0
- autoforge_agent-0.4.3/autoforge/vendor/tars/toolkit/vm_handlers.py +775 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/vision.py +1 -1
- autoforge_agent-0.4.3/autoforge/web/static/index.html +406 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/webtools.py +9 -0
- autoforge_agent-0.4.1/README.md → autoforge_agent-0.4.3/autoforge_agent.egg-info/PKG-INFO +80 -2
- autoforge_agent-0.4.3/autoforge_agent.egg-info/SOURCES.txt +215 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/requires.txt +1 -0
- autoforge_agent-0.4.3/probes/FINDINGS.md +363 -0
- autoforge_agent-0.4.3/probes/probe_cap_big_prompt.py +104 -0
- autoforge_agent-0.4.3/probes/probe_cap_default.py +133 -0
- autoforge_agent-0.4.3/probes/probe_ceiling_focus.py +100 -0
- autoforge_agent-0.4.3/probes/probe_ceiling_retry.py +130 -0
- autoforge_agent-0.4.3/probes/probe_forge_latency.py +102 -0
- autoforge_agent-0.4.3/probes/probe_gateway_context_503.py +60 -0
- autoforge_agent-0.4.3/probes/probe_gateway_empty.py +83 -0
- autoforge_agent-0.4.3/probes/probe_gateway_max_tokens.py +122 -0
- autoforge_agent-0.4.3/probes/probe_gateway_models.py +134 -0
- autoforge_agent-0.4.3/probes/probe_gateway_thinking.py +134 -0
- autoforge_agent-0.4.3/probes/probe_generator_reply.py +69 -0
- autoforge_agent-0.4.3/probes/probe_length_vs_route.py +133 -0
- autoforge_agent-0.4.3/probes/probe_model_latency.py +66 -0
- autoforge_agent-0.4.3/probes/probe_reasoning_ceiling.py +97 -0
- autoforge_agent-0.4.3/probes/raw_generator_reply.txt +23 -0
- autoforge_agent-0.4.3/probes/raw_generator_reply_clean.txt +16 -0
- autoforge_agent-0.4.3/pyproject.toml +38 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/_terminal.py +14 -0
- autoforge_agent-0.4.3/tests/conftest.py +68 -0
- autoforge_agent-0.4.3/tests/test_audit_vault.py +365 -0
- autoforge_agent-0.4.3/tests/test_bus.py +422 -0
- autoforge_agent-0.4.3/tests/test_bus_mount.py +117 -0
- autoforge_agent-0.4.3/tests/test_cap_ceiling.py +233 -0
- autoforge_agent-0.4.3/tests/test_chaining.py +416 -0
- autoforge_agent-0.4.3/tests/test_claimgate.py +290 -0
- autoforge_agent-0.4.3/tests/test_claimgate_pipeline.py +195 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_cli.py +1 -1
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_compaction.py +84 -6
- autoforge_agent-0.4.3/tests/test_compaction_interrupt.py +295 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_compaction_wiring.py +6 -1
- autoforge_agent-0.4.3/tests/test_containment.py +223 -0
- autoforge_agent-0.4.3/tests/test_context_limits.py +328 -0
- autoforge_agent-0.4.3/tests/test_controls.py +382 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_cpu.py +41 -0
- autoforge_agent-0.4.3/tests/test_egress.py +169 -0
- autoforge_agent-0.4.3/tests/test_forge_abort_reach.py +339 -0
- autoforge_agent-0.4.3/tests/test_forge_arbitration.py +282 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_forge_failure_feedback.py +16 -1
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_generator_coercion.py +50 -0
- autoforge_agent-0.4.3/tests/test_host_facts.py +214 -0
- autoforge_agent-0.4.3/tests/test_image_paste.py +295 -0
- autoforge_agent-0.4.3/tests/test_interrupt_end_to_end.py +217 -0
- autoforge_agent-0.4.3/tests/test_interrupt_input_burst.py +139 -0
- autoforge_agent-0.4.3/tests/test_interrupt_responsiveness.py +267 -0
- autoforge_agent-0.4.3/tests/test_lanes.py +517 -0
- autoforge_agent-0.4.3/tests/test_lineedit.py +772 -0
- autoforge_agent-0.4.3/tests/test_lineedit_console_pending.py +155 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_llm_client.py +12 -4
- autoforge_agent-0.4.3/tests/test_llm_failover.py +278 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_llm_retry.py +21 -4
- autoforge_agent-0.4.3/tests/test_llm_usage.py +193 -0
- autoforge_agent-0.4.3/tests/test_market_prelookup.py +714 -0
- autoforge_agent-0.4.3/tests/test_media.py +500 -0
- autoforge_agent-0.4.3/tests/test_media_mcp_server.py +287 -0
- autoforge_agent-0.4.3/tests/test_mission.py +335 -0
- autoforge_agent-0.4.3/tests/test_mission_assumption.py +452 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_modes.py +30 -0
- autoforge_agent-0.4.3/tests/test_openclaw_port.py +212 -0
- autoforge_agent-0.4.3/tests/test_peer_market_config.py +89 -0
- autoforge_agent-0.4.3/tests/test_prompt_stability.py +127 -0
- autoforge_agent-0.4.3/tests/test_quiet_children.py +77 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_reach.py +40 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_reasoning_budget.py +11 -3
- autoforge_agent-0.4.3/tests/test_routing_weights.py +165 -0
- autoforge_agent-0.4.3/tests/test_run_python_tool.py +190 -0
- autoforge_agent-0.4.3/tests/test_runs_resume.py +736 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_self_knowledge.py +57 -6
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_skills.py +94 -2
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_steering.py +134 -2
- autoforge_agent-0.4.3/tests/test_store.py +123 -0
- autoforge_agent-0.4.3/tests/test_store_concurrency.py +141 -0
- autoforge_agent-0.4.3/tests/test_tars_port.py +181 -0
- autoforge_agent-0.4.3/tests/test_tool_exposure.py +332 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_v02.py +162 -0
- autoforge_agent-0.4.3/tests/test_wsl_isolation.py +185 -0
- autoforge_agent-0.4.1/MANIFEST.in +0 -6
- autoforge_agent-0.4.1/autoforge/agent.py +0 -2971
- autoforge_agent-0.4.1/autoforge/core/agent.py +0 -271
- autoforge_agent-0.4.1/autoforge/core/lineedit.py +0 -678
- autoforge_agent-0.4.1/autoforge/core/llm.py +0 -324
- autoforge_agent-0.4.1/autoforge/core/message.py +0 -89
- autoforge_agent-0.4.1/autoforge/forge/pipeline.py +0 -304
- autoforge_agent-0.4.1/autoforge/forge/sandbox.py +0 -301
- autoforge_agent-0.4.1/autoforge/route/__init__.py +0 -3
- autoforge_agent-0.4.1/autoforge/skills.py +0 -496
- autoforge_agent-0.4.1/autoforge/store.py +0 -611
- autoforge_agent-0.4.1/autoforge_agent.egg-info/SOURCES.txt +0 -115
- autoforge_agent-0.4.1/pyproject.toml +0 -24
- autoforge_agent-0.4.1/tests/conftest.py +0 -36
- autoforge_agent-0.4.1/tests/test_host_facts.py +0 -117
- autoforge_agent-0.4.1/tests/test_lineedit.py +0 -317
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/__main__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/confirm.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/policy.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/roles.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/spawn.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/autonomy/topology.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/configfile.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/core/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/kernel.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/probe.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/cpu/tune.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/ecosystem.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/adversary.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/evolution.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/fuzzer.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/invariance.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/metacog.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/forge/validity.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/backend_triton.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/bench.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/kernel.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/ops.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/probe.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/safety.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/gpu/units.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/measure.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/notify.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/schedule.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/timing.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/tools/composition.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/web/__init__.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge/web/server.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/dependency_links.txt +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/entry_points.txt +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/autoforge_agent.egg-info/top_level.txt +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/setup.cfg +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/mcp_server_fixture.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_autoforge.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_browser.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_ecosystem.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_execution_samples.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_invariance.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_json_repair.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_live_progress.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_llm_response_shape.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_mcp.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_mcp_http.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_memory_injection.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_notify.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_policy_gates.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_roles.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_schedule.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_setup.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_topology.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_validity.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_vision.py +0 -0
- {autoforge_agent-0.4.1 → autoforge_agent-0.4.3}/tests/test_web.py +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|