multi-forge 1.1.1__tar.gz → 1.1.4__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.
- {multi_forge-1.1.1 → multi_forge-1.1.4}/.gitignore +4 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/PKG-INFO +13 -4
- {multi_forge-1.1.1 → multi_forge-1.1.4}/README.md +3 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/pyproject.toml +37 -9
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/adapters/litellm.py +14 -10
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/authority.py +21 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/codex_stop.py +3 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/commands.py +405 -349
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/direct_commands.py +4 -8
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/policy.py +4 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/main.py +30 -5
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/memory.py +24 -18
- multi_forge-1.1.4/src/forge/cli/memory_writer.py +171 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/policy.py +9 -3
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/search.py +46 -13
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session.py +18 -12
- multi_forge-1.1.4/src/forge/cli/session_delete.py +294 -0
- multi_forge-1.1.4/src/forge/cli/session_derived_preflight.py +41 -0
- multi_forge-1.1.4/src/forge/cli/session_effort_hint.py +78 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_fork.py +13 -4
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_launch_args.py +5 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_lifecycle.py +107 -94
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_manage.py +30 -719
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_model.py +54 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_resume_modes.py +111 -67
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/status_line.py +3 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/context.py +28 -5
- multi_forge-1.1.4/src/forge/cli/statusline/effort.py +37 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/formatting.py +34 -77
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/names.py +1 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/palette.py +1 -7
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/registry.py +30 -48
- multi_forge-1.1.4/src/forge/cli/statusline/routing.py +50 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/sources.py +10 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/transfer.py +10 -6
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-deepseek.yaml +3 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-kimi.yaml +4 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-minimax.yaml +3 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/model_catalog.yaml +72 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/model_routes.yaml +126 -0
- multi_forge-1.1.4/src/forge/core/effort_observation.py +31 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/codex.py +8 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/codex_fork.py +3 -2
- multi_forge-1.1.4/src/forge/core/llm/clients/effort.py +19 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/clients/litellm.py +41 -17
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/clients/openai_compat.py +2 -3
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/clients/openrouter.py +12 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/protocols.py +6 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/claude_session.py +134 -18
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/codex_bridge.py +29 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/codex_interactive.py +140 -50
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/codex_session.py +163 -70
- multi_forge-1.1.4/src/forge/core/ops/codex_thread_index.py +26 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/gc.py +140 -3
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/policy.py +35 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session.py +11 -36
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_adopt.py +62 -64
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_authority.py +13 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_authority_launch.py +36 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_fork_execution.py +42 -33
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_fork_preflight.py +2 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_model.py +60 -10
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/transfer.py +54 -4
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/env.py +19 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/reviewer_runtime.py +6 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/reviewer_settings.py +15 -15
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/session_runner.py +24 -15
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/supervisor_auth.py +8 -6
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/run_id.py +30 -1
- multi_forge-1.1.4/src/forge/core/worker_controls.py +74 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/workqueue/queue.py +99 -5
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/plan_check.py +37 -13
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/shadow.py +7 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/stop_review.py +31 -9
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/supervisor.py +2 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/team/handlers.py +1 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/client_adapter.py +5 -0
- multi_forge-1.1.4/src/forge/proxy/effort_observation.py +60 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/passthrough.py +5 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/passthrough_ingress.py +76 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/reasoning.py +38 -24
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/runtime_truth.py +90 -12
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/server.py +24 -5
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/engine.py +5 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/models.py +3 -0
- multi_forge-1.1.4/src/forge/search/cleanup.py +107 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/active.py +97 -19
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/claude/invoke.py +2 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/cleanup.py +32 -18
- multi_forge-1.1.4/src/forge/session/cleanup_content.py +727 -0
- multi_forge-1.1.4/src/forge/session/cleanup_dependencies.py +266 -0
- multi_forge-1.1.4/src/forge/session/cleanup_git.py +72 -0
- multi_forge-1.1.4/src/forge/session/cleanup_state.py +20 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/codex_invoke.py +68 -5
- multi_forge-1.1.4/src/forge/session/deletion.py +642 -0
- multi_forge-1.1.4/src/forge/session/derived_overrides.py +160 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/exceptions.py +10 -0
- multi_forge-1.1.4/src/forge/session/hooks/producers.py +22 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/hooks/session_start.py +65 -25
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/index.py +224 -94
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/launch.py +9 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/launch_confirmation.py +8 -3
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/manager.py +508 -1053
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/memory_writer.py +2 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/models.py +3 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/overrides.py +28 -15
- multi_forge-1.1.4/src/forge/session/purge_native.py +756 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/rewind.py +3 -1
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/shadow_curation.py +2 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/store.py +92 -11
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/transfer.py +64 -22
- multi_forge-1.1.4/src/forge/session/workers.py +263 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/sidecar/container.py +17 -3
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/sidecar/docker.py +1 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/4-proxy.md +3 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist.md +2 -2
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/scripts/start-container.sh +2 -1
- multi_forge-1.1.1/src/forge/cli/memory_writer.py +0 -151
- multi_forge-1.1.1/src/forge/core/ops/codex_thread_index.py +0 -15
- multi_forge-1.1.1/src/forge/policy/rule_pack/__init__.py +0 -1
- multi_forge-1.1.1/src/forge/policy/rule_pack/consent.py +0 -157
- multi_forge-1.1.1/src/forge/policy/rule_pack/definitions.py +0 -89
- multi_forge-1.1.1/src/forge/policy/rule_pack/outcomes.py +0 -134
- {multi_forge-1.1.1 → multi_forge-1.1.4}/LICENSE +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/NOTICE +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/agents/.gitkeep +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/commands/.gitkeep +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/adapters/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/creation.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/registry.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/remote/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/remote/base.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/remote/openrouter.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/backend/sources.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/activity.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/auth.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/backend.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/claude.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/codex.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/config_cmd.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/consumer_lane_freeze.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/editor.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/extensions.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/gc.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/guards.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/_group.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/_helpers.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/codex_patch.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/codex_policy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/codex_policy_feedback.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/codex_transfer.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/protocols.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/read_hygiene.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/hooks/verification.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/info.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/logs.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/memory_report.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/model.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/output.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/proxy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/proxy_audit.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/proxy_costs.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/runtime.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_adopt.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_authority.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_authority_options.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_codex.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_lane.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_memory.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_repair.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_rewind.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_route_recovery.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_routing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/session_supervisor_options.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/rendering.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/throttle.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/statusline/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/supervisor_auth.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/telemetry.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/trace.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/workflow.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/cli/workspace.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/dataclass_utils.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/backends/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/backends/litellm.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/anthropic-passthrough.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/codex-responses-local.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-anthropic-local.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-anthropic.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-gemini-flash-local.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-gemini-local.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-gemini-test.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-gemini.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-openai-codex-local.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-openai-local.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/litellm-openai.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-anthropic.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-gemini-flash.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-gemini.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-glm.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-openai-codex.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-openai.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/defaults/templates/openrouter-qwen.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/loader.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/config/schema.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/auth/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/auth/capabilities.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/auth/credentials_file.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/auth/protocols.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/auth/secrets.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/auth/template_secrets.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/backend_dependency.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/credential_registry.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/model_practices.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/system_prompt_addendums/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/system_prompt_addendums/gemini.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/data/system_prompt_addendums/openai.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/effort.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/identifiers.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/_lifecycle.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/claude.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/codex_stream.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/invoker/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/judgments/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/judgments/openrouter.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/judgments/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/judgments/usage.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/lanes.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/clients/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/clients/base.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/credentials.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/detection.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/errors.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/openrouter_policy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/llm/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/logging.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/metric_formatting.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/catalog.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/direct_model.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/model_practices.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/model_reference.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/model_routes.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/models/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/naming.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/native_review_types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/backend_reconcile.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/codex_adopt.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/codex_enrollment.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/context.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/provider_trace.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/proxy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/resolution.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_active.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_context.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_model_routing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_repair.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/session_routing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/usage_summary.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/ops/workspace.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/paths.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/process.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/provider_types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/codex_reviewer_home.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/cost_tracking.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/headless_json.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/llm_call.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/proxy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/routing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/structured_output.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/tagger.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/throttle.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/reactive/watchdog.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/codex_feedback.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/codex_preflight.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/codex_preflight_cache.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/codex_review_source.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/codex_rollouts.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/codex_turn_enrollment.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/launch_args.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime/registry.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/runtime_vocab.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/exceptions.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/io.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/lock.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/retention.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/timestamps.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/state/versioned_store.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/caps.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/downstream.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/downstream_retention.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/jsonl_io.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/upstream.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/telemetry/vocabulary.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/tiers.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/transcript.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/typing_helpers.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/billing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/correlation.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/emit.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/ledger.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/measurement.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/usage/vocabulary.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/wire_shapes.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/workqueue/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/core/workqueue/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/codex_hooks.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/doctor.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/exceptions.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/hook_dispatcher.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/hook_migration.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/hooks.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/installer.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/models.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/module_planning.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/ownership.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/path_policy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/preset.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/project_compat.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/project_registry.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/runtime_removal.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/settings_merge.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/settings_rollback.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/skill_cache.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/skill_compiler.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/skill_planning.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/skill_validation.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/tracking.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/unmanaged.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/install/version.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/action_identity.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/deterministic/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/deterministic/base.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/deterministic/coding_standards.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/deterministic/registry.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/deterministic/tdd.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/diff.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/engine.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/protocols.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/queries.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/attempts.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/deadline.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/identity.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/native_codex.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/plan_source.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/shadow_runner.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/turn_evidence.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/semantic/verdict.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/store.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/supervisor_lane_degrade.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/team/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/team/config.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/team/prompts.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/policy/types.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/accounting_persistence.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/audit_logger.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/base_client.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/client_factory.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/converters.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/cost_logger.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/cost_tracker.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/data_models.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/error_hints.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/intercept.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/metrics.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/model_routes.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/ports.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/provider_trace_logger.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/proxies.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/proxy_identity.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/proxy_orchestrator.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/proxy_startup.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/request_id.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/response_headers.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/responses_ingress.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/responses_passthrough.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/sse_framing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/stream_relay.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/proxy/utils.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/adversarial.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/backend_readiness.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/consensus.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/code_consensus_evaluation.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/code_debate_evaluation.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/codereview-performance.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/codereview-quick.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/codereview-security.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/codereview.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/consensus_evaluation.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/debate_evaluation.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/docreview-quick.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/docreview.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/resources/thinkdeep.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/routing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/synthesis.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/review/worker_preparation.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/runtime_config.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/bm25_store.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/content_store.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/engine.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/exceptions.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/extractor.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/index_state.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/store.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/search/tokenizer.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/addendum.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/artifacts.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/authority.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/claude/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/claude/cleanup.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/claude/paths.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/claude/relocate.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/codex_handoff.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/config.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/consumer_lanes.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/context_limit.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/context_rendering.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/effective.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/events.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/git.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/hooks/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/hooks/models.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/identity.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/launchability.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/memory_inheritance.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/model_pin.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/passport.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/plan_resolution.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/prev_sessions.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/project_memory.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/routing.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/validation.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/verification_config.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/workspace.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/worktree/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/worktree/cleanup.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/worktree/config_copy.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/session/worktree/create.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/forge/sidecar/__init__.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/analyze/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/analyze/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/challenge/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/challenge/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/consensus/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/consensus/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/consensus/resources/synthesis.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/debate/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/debate/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/panel/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/panel/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/panel/resources/synthesis.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/SKILL.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/0-enable.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/1-preflight.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/10-resume.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/11-config.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/12-search.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/13-policy.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/14-workflow.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/15-skills.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/16-memory.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/17-info.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/18-disable.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/19-uninstall.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/2-extension.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/20-cleanup.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/3-authentication.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/5-session.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/6-hook.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/7-costs.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/8-status-line.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/checklist/9-direct-commands.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/coverage-map.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/execution-budget.json +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/report-template.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/resources/runtime-matrix.json +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/scripts/qa-artifact.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/scripts/qa-run-metrics.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/scripts/qa-selection.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/qa/scripts/walkthrough-state.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/references/claude-4.6.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/references/claude-4.8.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/references/gemini-3.1.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/references/gpt-5.5.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/references/skills-writing-guide.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/resources/code-anthropic.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/resources/code-gemini.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/resources/code-openai.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review/resources/code.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review-docs/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review-docs/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review-docs/resources/docs-anthropic.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review-docs/resources/docs-gemini.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review-docs/resources/docs-openai.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/review-docs/resources/docs.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/smoke-test/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/smoke-test/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/smoke-test/scripts/smoke-test.sh +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/content.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/forge-skill.yaml +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/code-anthropic.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/code-gemini.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/code-openai.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/code.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/docs-anthropic.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/docs-gemini.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/docs-openai.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/understand/resources/docs.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/SKILL.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/resources/checklist.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/resources/journey-map.md +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/claude-wrapper.sh +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/cleanup-owned.sh +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/package-identity.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/protected-paths.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/run-in-repo.sh +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/setup-test-repo.sh +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/walkthrough-report.py +0 -0
- {multi_forge-1.1.1 → multi_forge-1.1.4}/src/skills/walkthrough/scripts/walkthrough-state.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: multi-forge
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.4
|
|
4
4
|
Summary: Multi-runtime agent toolkit: proxy routing, cost control, session management, policy enforcement, and workflow orchestration
|
|
5
5
|
Project-URL: Homepage, https://github.com/hapa1i/multi-forge
|
|
6
6
|
Project-URL: Repository, https://github.com/hapa1i/multi-forge
|
|
@@ -21,25 +21,30 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
22
|
Classifier: Topic :: Software Development
|
|
23
23
|
Requires-Python: <3.14,>=3.11
|
|
24
|
-
Requires-Dist: aiohttp<4,>=3.14.
|
|
24
|
+
Requires-Dist: aiohttp<4,>=3.14.4
|
|
25
25
|
Requires-Dist: apscheduler<4,>=3.11.2
|
|
26
26
|
Requires-Dist: backoff<3,>=2.2.1
|
|
27
27
|
Requires-Dist: boto3<2,>=1.43.1
|
|
28
|
+
Requires-Dist: certifi>=2026.10.19
|
|
28
29
|
Requires-Dist: click>=8.3.1
|
|
29
30
|
Requires-Dist: coolname<6,>=5.0.0
|
|
30
31
|
Requires-Dist: cryptography>=50.0.0
|
|
31
32
|
Requires-Dist: dacite>=1.8.0
|
|
33
|
+
Requires-Dist: dnspython>=2.9.0
|
|
32
34
|
Requires-Dist: expression<6,>=5.6.0
|
|
33
35
|
Requires-Dist: fastapi-sso<1,>=0.19.0
|
|
34
36
|
Requires-Dist: fastapi<0.137,>=0.136.3
|
|
37
|
+
Requires-Dist: filelock>=4.2.1
|
|
35
38
|
Requires-Dist: httpx>=0.25.0
|
|
36
|
-
Requires-Dist: litellm==1.102.
|
|
39
|
+
Requires-Dist: litellm==1.102.2
|
|
40
|
+
Requires-Dist: multidict<7,>=6.9.1
|
|
41
|
+
Requires-Dist: oauthlib<5,>=4.0.0
|
|
37
42
|
Requires-Dist: openai>=1.0.0
|
|
38
43
|
Requires-Dist: orjson<4,>=3.11.6
|
|
39
44
|
Requires-Dist: packaging>=21.0
|
|
40
45
|
Requires-Dist: pydantic-settings<3,>=2.14.1
|
|
41
46
|
Requires-Dist: pydantic>=2.0.0
|
|
42
|
-
Requires-Dist: pyjwt<3,>=2.
|
|
47
|
+
Requires-Dist: pyjwt<3,>=2.15.0
|
|
43
48
|
Requires-Dist: python-dateutil<3,>=2.9.0
|
|
44
49
|
Requires-Dist: python-dotenv>=1.2.2
|
|
45
50
|
Requires-Dist: python-multipart<1,>=0.0.31
|
|
@@ -49,6 +54,7 @@ Requires-Dist: rich<14,>=13.9.4
|
|
|
49
54
|
Requires-Dist: ruamel-yaml>=0.18.0
|
|
50
55
|
Requires-Dist: starlette<1.8,>=1.7.0
|
|
51
56
|
Requires-Dist: tenacity>=8.0.0
|
|
57
|
+
Requires-Dist: urllib3<3,>=2.8.0
|
|
52
58
|
Requires-Dist: uvicorn<1,>=0.33.0
|
|
53
59
|
Requires-Dist: uvloop<1,>=0.21.0; sys_platform != 'win32'
|
|
54
60
|
Requires-Dist: watchfiles>=0.20
|
|
@@ -194,6 +200,9 @@ forge auth login -c openrouter # store OPENROUTER_API_KEY
|
|
|
194
200
|
forge session start --proxy openrouter-anthropic
|
|
195
201
|
```
|
|
196
202
|
|
|
203
|
+
These PyPI installs resolve compatible dependency versions. For a constrained installation from reviewed source or a
|
|
204
|
+
release wheel, see [dependency security](docs/developer/dependency_security.md).
|
|
205
|
+
|
|
197
206
|
Developing on Forge itself? See [CONTRIBUTING.md](CONTRIBUTING.md) for the editable install.
|
|
198
207
|
|
|
199
208
|
Once running, try `/smoke-test` (Claude) or `$smoke-test` (Codex) for a read-only health check. `/walkthrough` teaches
|
|
@@ -137,6 +137,9 @@ forge auth login -c openrouter # store OPENROUTER_API_KEY
|
|
|
137
137
|
forge session start --proxy openrouter-anthropic
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
+
These PyPI installs resolve compatible dependency versions. For a constrained installation from reviewed source or a
|
|
141
|
+
release wheel, see [dependency security](docs/developer/dependency_security.md).
|
|
142
|
+
|
|
140
143
|
Developing on Forge itself? See [CONTRIBUTING.md](CONTRIBUTING.md) for the editable install.
|
|
141
144
|
|
|
142
145
|
Once running, try `/smoke-test` (Claude) or `$smoke-test` (Codex) for a read-only health check. `/walkthrough` teaches
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "multi-forge"
|
|
3
|
-
version = "1.1.
|
|
3
|
+
version = "1.1.4"
|
|
4
4
|
description = "Multi-runtime agent toolkit: proxy routing, cost control, session management, policy enforcement, and workflow orchestration"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -42,34 +42,44 @@ dependencies = [
|
|
|
42
42
|
# Proxy dependencies (previously optional, now core). Forge owns the
|
|
43
43
|
# default-Uvicorn LiteLLM startup set because the upstream `proxy` extra
|
|
44
44
|
# caps cryptography below Forge's patched floor. This set is start/health
|
|
45
|
-
# validated through LiteLLM 1.102.
|
|
45
|
+
# validated through LiteLLM 1.102.2; run scripts/test-wheel-runtime.sh before
|
|
46
46
|
# raising the ceiling. Alternate servers, databases, and cloud integrations
|
|
47
47
|
# remain outside Forge's runtime path.
|
|
48
|
-
"aiohttp>=3.14.
|
|
48
|
+
"aiohttp>=3.14.4,<4",
|
|
49
49
|
"apscheduler>=3.11.2,<4",
|
|
50
50
|
"backoff>=2.2.1,<3",
|
|
51
51
|
# LiteLLM 1.88+ imports the Focus S3 destination during proxy startup.
|
|
52
52
|
"boto3>=1.43.1,<2",
|
|
53
|
+
# Exclude the compromised CA trust roots from clean installations too.
|
|
54
|
+
"certifi>=2026.10.19",
|
|
53
55
|
"cryptography>=50.0.0",
|
|
56
|
+
# Keep email-validator's transitive DNS security floor in wheel metadata despite no direct Forge import.
|
|
57
|
+
"dnspython>=2.9.0",
|
|
54
58
|
# LiteLLM 1.95 imports outbound-credential tagged unions at startup.
|
|
55
59
|
"expression>=5.6.0,<6",
|
|
56
60
|
# Keep FastAPI's lock-proven route-tree behavior; upgrade it separately.
|
|
57
61
|
"fastapi>=0.136.3,<0.137",
|
|
58
62
|
"fastapi-sso>=0.19.0,<1",
|
|
63
|
+
# Keep huggingface-hub's transitive file-lock security floor in wheel metadata despite no direct Forge import.
|
|
64
|
+
"filelock>=4.2.1",
|
|
65
|
+
# Runtime security floors belong in wheel metadata, not only uv constraints.
|
|
66
|
+
"multidict>=6.9.1,<7",
|
|
67
|
+
"oauthlib>=4.0.0,<5",
|
|
59
68
|
"orjson>=3.11.6,<4",
|
|
60
69
|
"pydantic-settings>=2.14.1,<3",
|
|
61
|
-
"pyjwt>=2.
|
|
70
|
+
"pyjwt>=2.15.0,<3",
|
|
62
71
|
"python-multipart>=0.0.31,<1",
|
|
63
72
|
# LiteLLM 1.95 imports its Redis support from the default startup graph.
|
|
64
73
|
"redis>=5.2.0,<8",
|
|
65
74
|
# Starlette 1.7 fixes TestClient's deprecated AnyIO BlockingPortal import.
|
|
66
75
|
"starlette>=1.7.0,<1.8",
|
|
76
|
+
"urllib3>=2.8.0,<3",
|
|
67
77
|
"uvicorn>=0.33.0,<1",
|
|
68
78
|
"uvloop>=0.21.0,<1; sys_platform != 'win32'",
|
|
69
79
|
"watchfiles>=0.20",
|
|
70
80
|
"websockets>=15.0.1,<16",
|
|
71
81
|
# Packaged Gemini 3.8 Flash metadata and the verified proxy runtime.
|
|
72
|
-
"litellm==1.102.
|
|
82
|
+
"litellm==1.102.2",
|
|
73
83
|
]
|
|
74
84
|
|
|
75
85
|
[project.scripts]
|
|
@@ -82,7 +92,7 @@ Issues = "https://github.com/hapa1i/multi-forge/issues"
|
|
|
82
92
|
Documentation = "https://github.com/hapa1i/multi-forge/tree/main/docs"
|
|
83
93
|
|
|
84
94
|
[build-system]
|
|
85
|
-
requires = ["hatchling"]
|
|
95
|
+
requires = ["hatchling==1.32.4"]
|
|
86
96
|
build-backend = "hatchling.build"
|
|
87
97
|
|
|
88
98
|
[tool.hatch.build.targets.wheel]
|
|
@@ -148,9 +158,18 @@ disallow_untyped_calls = false
|
|
|
148
158
|
|
|
149
159
|
# Security floor for transitive dependencies (Dependabot alerts)
|
|
150
160
|
[tool.uv]
|
|
161
|
+
# uv sync does not consume UV_BUILD_CONSTRAINT; keep its isolated builds pinned too.
|
|
162
|
+
# scripts/check-dependency-pins.py checks this list against the build-group export.
|
|
163
|
+
build-constraint-dependencies = [
|
|
164
|
+
"hatchling==1.32.4",
|
|
165
|
+
"packaging==26.3",
|
|
166
|
+
"pathspec==1.1.1",
|
|
167
|
+
"pluggy==1.6.0",
|
|
168
|
+
"tomlkit==0.15.2",
|
|
169
|
+
"trove-classifiers==2026.9.21.13",
|
|
170
|
+
]
|
|
151
171
|
constraint-dependencies = [
|
|
152
|
-
"
|
|
153
|
-
"virtualenv>=20.36.1",
|
|
172
|
+
"virtualenv>=21.14.13",
|
|
154
173
|
"mcp>=1.28.1",
|
|
155
174
|
"Pygments>=2.20.0",
|
|
156
175
|
"pyasn1>=0.6.4",
|
|
@@ -158,12 +177,20 @@ constraint-dependencies = [
|
|
|
158
177
|
|
|
159
178
|
[dependency-groups]
|
|
160
179
|
dev = [
|
|
180
|
+
"pre-commit-hooks==6.0.0",
|
|
181
|
+
"isort==9.0.1",
|
|
182
|
+
"mdformat==1.0.0",
|
|
183
|
+
"mdformat-gfm==1.0.0",
|
|
184
|
+
"mdformat-gfm-alerts==2.1.0",
|
|
185
|
+
"mdformat-simple-breaks==0.1.0",
|
|
186
|
+
"mdformat-frontmatter==2.1.2",
|
|
161
187
|
"pytest>=9.0.3",
|
|
162
188
|
"pytest-cov>=4.1.0",
|
|
163
189
|
"pytest-asyncio>=0.23.0",
|
|
164
190
|
"pytest-mock>=3.15.1",
|
|
191
|
+
"pytest-xdist>=3.8.0",
|
|
165
192
|
"ruff>=0.15.0",
|
|
166
|
-
"black>=26.
|
|
193
|
+
"black>=26.10.1",
|
|
167
194
|
"mypy>=1.13.0",
|
|
168
195
|
"pyright>=1.1.0",
|
|
169
196
|
"pytest-rerunfailures>=14.0",
|
|
@@ -172,6 +199,7 @@ dev = [
|
|
|
172
199
|
"types-requests>=2.31.0",
|
|
173
200
|
"httpx2>=2.3.0",
|
|
174
201
|
]
|
|
202
|
+
build = ["hatchling==1.32.4"]
|
|
175
203
|
provider-check = [
|
|
176
204
|
# scripts/count-tokens.py imports provider-specific count_tokens surfaces;
|
|
177
205
|
# keep lock refreshes inside the API families verified by that script.
|
|
@@ -24,6 +24,8 @@ from forge.backend.registry import ManagedBackendProcess
|
|
|
24
24
|
from forge.core.paths import get_forge_home
|
|
25
25
|
from forge.core.state import now_iso
|
|
26
26
|
|
|
27
|
+
STARTUP_HEALTH_TIMEOUT_S = 30.0
|
|
28
|
+
|
|
27
29
|
|
|
28
30
|
class LiteLLMAdapter(BackendAdapter):
|
|
29
31
|
"""Adapter for managing LiteLLM backend processes.
|
|
@@ -38,7 +40,7 @@ class LiteLLMAdapter(BackendAdapter):
|
|
|
38
40
|
which checks BackendDependency.required_env_vars before starting.
|
|
39
41
|
"""
|
|
40
42
|
|
|
41
|
-
def _wait_for_health(self, port: int, timeout: float =
|
|
43
|
+
def _wait_for_health(self, port: int, timeout: float = STARTUP_HEALTH_TIMEOUT_S) -> bool:
|
|
42
44
|
"""Wait for backend to become healthy.
|
|
43
45
|
|
|
44
46
|
Uses /health/liveliness (not /health) because the full health endpoint
|
|
@@ -53,18 +55,20 @@ class LiteLLMAdapter(BackendAdapter):
|
|
|
53
55
|
Returns:
|
|
54
56
|
True if healthy within timeout, False otherwise
|
|
55
57
|
"""
|
|
56
|
-
|
|
58
|
+
deadline = time.monotonic() + timeout
|
|
57
59
|
url = f"http://localhost:{port}/health/liveliness"
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
response = client.get(url)
|
|
61
|
+
with httpx.Client(timeout=httpx.Timeout(2.0)) as client:
|
|
62
|
+
while (remaining := deadline - time.monotonic()) > 0:
|
|
63
|
+
try:
|
|
64
|
+
response = client.get(url, timeout=min(2.0, remaining))
|
|
63
65
|
if response.status_code == 200:
|
|
64
66
|
return True
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
except httpx.RequestError:
|
|
68
|
+
pass
|
|
69
|
+
remaining = deadline - time.monotonic()
|
|
70
|
+
if remaining > 0:
|
|
71
|
+
time.sleep(min(0.5, remaining))
|
|
68
72
|
|
|
69
73
|
return False
|
|
70
74
|
|
|
@@ -107,7 +111,7 @@ class LiteLLMAdapter(BackendAdapter):
|
|
|
107
111
|
start_new_session=True, # Detach from parent
|
|
108
112
|
)
|
|
109
113
|
|
|
110
|
-
if not self._wait_for_health(port, timeout=
|
|
114
|
+
if not self._wait_for_health(port, timeout=STARTUP_HEALTH_TIMEOUT_S):
|
|
111
115
|
try:
|
|
112
116
|
os.killpg(proc.pid, signal.SIGKILL)
|
|
113
117
|
except ProcessLookupError:
|
|
@@ -22,6 +22,11 @@ from forge.session.authority import (
|
|
|
22
22
|
from forge.session.hooks import resolve_session_store
|
|
23
23
|
from forge.session.models import SessionState
|
|
24
24
|
from forge.session.store import SessionStore
|
|
25
|
+
from forge.session.workers import (
|
|
26
|
+
SESSION_INSTANCE_ENV,
|
|
27
|
+
capture_session_instance,
|
|
28
|
+
session_worker_lease,
|
|
29
|
+
)
|
|
25
30
|
|
|
26
31
|
|
|
27
32
|
@dataclass(frozen=True)
|
|
@@ -35,6 +40,7 @@ class AuthorityGuardResult:
|
|
|
35
40
|
state: SessionState | None = None
|
|
36
41
|
store: SessionStore | None = None
|
|
37
42
|
marker: AuthorityMarker | None = None
|
|
43
|
+
instance_id: str | None = None
|
|
38
44
|
|
|
39
45
|
|
|
40
46
|
def evaluate_authority_guard(data: dict[str, Any] | None, *, runtime: str) -> AuthorityGuardResult:
|
|
@@ -47,6 +53,7 @@ def evaluate_authority_guard(data: dict[str, Any] | None, *, runtime: str) -> Au
|
|
|
47
53
|
|
|
48
54
|
state: SessionState | None = None
|
|
49
55
|
store: SessionStore | None = None
|
|
56
|
+
instance_id: str | None = None
|
|
50
57
|
covered_tool = sanitize_covered_tool_name(data.get("tool_name") if isinstance(data.get("tool_name"), str) else None)
|
|
51
58
|
try:
|
|
52
59
|
payload_cwd = data.get("cwd")
|
|
@@ -54,6 +61,9 @@ def evaluate_authority_guard(data: dict[str, Any] | None, *, runtime: str) -> Au
|
|
|
54
61
|
store = resolve_session_store(cwd, session_id=data.get("session_id") if runtime == "claude_code" else None)
|
|
55
62
|
if store is None:
|
|
56
63
|
raise ValueError("managed session could not be resolved")
|
|
64
|
+
instance_id = os.environ.get(SESSION_INSTANCE_ENV) or capture_session_instance(
|
|
65
|
+
store.forge_root, store.session_name
|
|
66
|
+
)
|
|
57
67
|
state = store.read()
|
|
58
68
|
marker = parse_authority_marker(raw_marker, state)
|
|
59
69
|
authority = state.intent.authority
|
|
@@ -72,6 +82,7 @@ def evaluate_authority_guard(data: dict[str, Any] | None, *, runtime: str) -> Au
|
|
|
72
82
|
state=state,
|
|
73
83
|
store=store,
|
|
74
84
|
marker=marker,
|
|
85
|
+
instance_id=instance_id,
|
|
75
86
|
)
|
|
76
87
|
except Exception:
|
|
77
88
|
return AuthorityGuardResult(
|
|
@@ -82,6 +93,7 @@ def evaluate_authority_guard(data: dict[str, Any] | None, *, runtime: str) -> Au
|
|
|
82
93
|
state=state,
|
|
83
94
|
store=store,
|
|
84
95
|
marker=None,
|
|
96
|
+
instance_id=instance_id,
|
|
85
97
|
)
|
|
86
98
|
|
|
87
99
|
|
|
@@ -89,6 +101,8 @@ def journal_authority_denial(result: AuthorityGuardResult, *, runtime: str) -> b
|
|
|
89
101
|
"""Best-effort denial journal; return False without weakening the deny."""
|
|
90
102
|
if not result.deny or result.state is None or result.store is None:
|
|
91
103
|
return True
|
|
104
|
+
if result.instance_id is None:
|
|
105
|
+
return False
|
|
92
106
|
try:
|
|
93
107
|
run_id = result.marker.run_id if result.marker is not None else _recover_valid_marker_run_id()
|
|
94
108
|
hook_digest = (
|
|
@@ -107,7 +121,13 @@ def journal_authority_denial(result: AuthorityGuardResult, *, runtime: str) -> b
|
|
|
107
121
|
hook_registration_sha256=hook_digest,
|
|
108
122
|
covered_tool=result.covered_tool or "unknown",
|
|
109
123
|
)
|
|
110
|
-
|
|
124
|
+
with session_worker_lease(
|
|
125
|
+
result.store.forge_root,
|
|
126
|
+
result.store.session_name,
|
|
127
|
+
expected_instance_id=result.instance_id,
|
|
128
|
+
label="authority denial",
|
|
129
|
+
):
|
|
130
|
+
append_authority_event(str(result.store.forge_root), event)
|
|
111
131
|
except Exception:
|
|
112
132
|
return False
|
|
113
133
|
return True
|
|
@@ -31,6 +31,7 @@ from forge.session.effective import compute_effective_intent
|
|
|
31
31
|
from forge.session.hooks.session_start import resolve_session_store
|
|
32
32
|
from forge.session.models import SessionState, session_runtime
|
|
33
33
|
from forge.session.store import SessionStore
|
|
34
|
+
from forge.session.workers import SESSION_INSTANCE_ENV, capture_session_instance
|
|
34
35
|
|
|
35
36
|
_log = logging.getLogger(__name__)
|
|
36
37
|
INPUT_BYTES = 512_000
|
|
@@ -110,7 +111,7 @@ def resolve_context(data: dict[str, Any]) -> tuple[stop_review.TurnContext, Sess
|
|
|
110
111
|
data.get("turn_id", ""),
|
|
111
112
|
sup,
|
|
112
113
|
read_bound_lane(state, SUPERVISOR_CONSUMER),
|
|
113
|
-
|
|
114
|
+
os.environ.get(SESSION_INSTANCE_ENV) or capture_session_instance(store.forge_root, state.name),
|
|
114
115
|
native_boundary=boundary_from_hook(data, admitted=True) if sup.native_source else None,
|
|
115
116
|
)
|
|
116
117
|
return context, store
|
|
@@ -218,6 +219,6 @@ def _freeze_lane(store: SessionStore, context: stop_review.TurnContext) -> None:
|
|
|
218
219
|
ensure_consumer_lane_binding(state, SUPERVISOR_CONSUMER, context.lane)
|
|
219
220
|
|
|
220
221
|
try:
|
|
221
|
-
store.update(timeout_s=1, mutate=mutate)
|
|
222
|
+
store.update(timeout_s=1, mutate=mutate, expected_instance_id=context.session_identity)
|
|
222
223
|
except Exception as exc:
|
|
223
224
|
_log.warning("Stop reviewer lane could not be frozen (%s)", type(exc).__name__)
|