multi-forge 1.1.0__tar.gz → 1.1.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.
- {multi_forge-1.1.0 → multi_forge-1.1.3}/PKG-INFO +10 -3
- {multi_forge-1.1.0 → multi_forge-1.1.3}/README.md +3 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/pyproject.toml +29 -5
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/authority.py +21 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_stop.py +3 -2
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/commands.py +406 -350
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/policy.py +6 -4
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/main.py +30 -5
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/memory.py +24 -18
- multi_forge-1.1.3/src/forge/cli/memory_writer.py +171 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/policy.py +12 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/search.py +46 -13
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session.py +18 -12
- multi_forge-1.1.3/src/forge/cli/session_delete.py +294 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_fork.py +1 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_lifecycle.py +87 -75
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_manage.py +30 -719
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_resume_modes.py +108 -65
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/sources.py +13 -9
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/transfer.py +10 -6
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/model_catalog.yaml +21 -10
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/claude.py +2 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/types.py +1 -0
- multi_forge-1.1.3/src/forge/core/judgments/__init__.py +19 -0
- multi_forge-1.1.3/src/forge/core/judgments/openrouter.py +370 -0
- multi_forge-1.1.3/src/forge/core/judgments/types.py +215 -0
- multi_forge-1.1.3/src/forge/core/judgments/usage.py +99 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/openai_compat.py +39 -18
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/openrouter.py +7 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/catalog.py +24 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/types.py +7 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/claude_session.py +79 -18
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_bridge.py +29 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_interactive.py +93 -49
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_session.py +163 -70
- multi_forge-1.1.3/src/forge/core/ops/codex_thread_index.py +26 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/gc.py +140 -3
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/policy.py +35 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_adopt.py +62 -64
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_authority.py +13 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_authority_launch.py +36 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_fork_execution.py +42 -33
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/transfer.py +54 -4
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/session_runner.py +4 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/structured_output.py +9 -4
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/downstream.py +4 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/emit.py +6 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/measurement.py +13 -7
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/workqueue/queue.py +99 -5
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/plan_check.py +37 -13
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/shadow.py +7 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/stop_review.py +31 -9
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/supervisor.py +1 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/client_adapter.py +2 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/converters.py +109 -34
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/cost_logger.py +5 -1
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/data_models.py +9 -3
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/passthrough.py +15 -8
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/passthrough_ingress.py +1 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/server.py +6 -0
- multi_forge-1.1.3/src/forge/search/cleanup.py +107 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/active.py +97 -19
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/cleanup.py +32 -18
- multi_forge-1.1.3/src/forge/session/cleanup_content.py +727 -0
- multi_forge-1.1.3/src/forge/session/cleanup_dependencies.py +266 -0
- multi_forge-1.1.3/src/forge/session/cleanup_git.py +72 -0
- multi_forge-1.1.3/src/forge/session/cleanup_state.py +20 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/codex_invoke.py +8 -0
- multi_forge-1.1.3/src/forge/session/deletion.py +642 -0
- multi_forge-1.1.3/src/forge/session/hooks/producers.py +22 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/hooks/session_start.py +65 -25
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/index.py +224 -94
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/launch.py +9 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/manager.py +485 -1030
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/models.py +3 -1
- multi_forge-1.1.3/src/forge/session/purge_native.py +756 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/store.py +92 -11
- multi_forge-1.1.3/src/forge/session/workers.py +263 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/sidecar/docker.py +1 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/start-container.sh +2 -1
- multi_forge-1.1.0/src/forge/cli/memory_writer.py +0 -151
- multi_forge-1.1.0/src/forge/core/ops/codex_thread_index.py +0 -15
- {multi_forge-1.1.0 → multi_forge-1.1.3}/.gitignore +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/LICENSE +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/NOTICE +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/agents/.gitkeep +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/commands/.gitkeep +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/adapters/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/adapters/litellm.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/creation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/registry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/remote/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/remote/base.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/remote/openrouter.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/sources.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/activity.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/auth.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/backend.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/claude.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/codex.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/config_cmd.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/consumer_lane_freeze.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/editor.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/extensions.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/gc.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/guards.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/_group.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/_helpers.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_patch.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_policy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_policy_feedback.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_transfer.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/direct_commands.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/protocols.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/read_hygiene.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/verification.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/info.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/logs.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/memory_report.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/model.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/output.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/proxy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/proxy_audit.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/proxy_costs.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/runtime.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_adopt.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_authority.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_authority_options.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_codex.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_lane.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_launch_args.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_memory.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_model.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_repair.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_rewind.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_route_recovery.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_routing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_supervisor_options.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/status_line.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/context.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/formatting.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/names.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/palette.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/registry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/rendering.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/throttle.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/types.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/supervisor_auth.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/telemetry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/trace.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/workflow.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/workspace.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/dataclass_utils.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/backends/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/backends/litellm.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/anthropic-passthrough.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/codex-responses-local.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-anthropic-local.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-anthropic.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini-flash-local.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini-local.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini-test.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-openai-codex-local.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-openai-local.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-openai.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-anthropic.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-deepseek.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-gemini-flash.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-gemini.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-glm.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-kimi.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-minimax.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-openai-codex.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-openai.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-qwen.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/loader.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/schema.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/capabilities.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/credentials_file.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/protocols.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/secrets.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/template_secrets.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/backend_dependency.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/credential_registry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/model_practices.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/model_routes.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/system_prompt_addendums/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/system_prompt_addendums/gemini.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/system_prompt_addendums/openai.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/effort.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/identifiers.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/_lifecycle.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/codex.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/codex_fork.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/codex_stream.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/lanes.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/base.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/litellm.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/credentials.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/detection.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/errors.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/openrouter_policy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/protocols.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/types.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/logging.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/metric_formatting.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/direct_model.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/model_practices.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/model_reference.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/model_routes.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/naming.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/native_review_types.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/backend_reconcile.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_adopt.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_enrollment.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/context.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/provider_trace.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/proxy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/resolution.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_active.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_context.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_fork_preflight.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_model.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_model_routing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_repair.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_routing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/usage_summary.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/workspace.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/paths.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/process.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/provider_types.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/codex_reviewer_home.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/cost_tracking.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/env.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/headless_json.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/llm_call.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/proxy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/reviewer_runtime.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/reviewer_settings.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/routing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/supervisor_auth.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/tagger.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/throttle.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/watchdog.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/run_id.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_feedback.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_preflight.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_preflight_cache.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_review_source.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_rollouts.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_turn_enrollment.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/launch_args.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/registry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime_vocab.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/exceptions.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/io.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/lock.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/retention.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/timestamps.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/versioned_store.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/caps.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/downstream_retention.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/jsonl_io.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/upstream.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/vocabulary.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/tiers.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/transcript.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/typing_helpers.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/billing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/correlation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/ledger.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/vocabulary.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/wire_shapes.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/workqueue/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/workqueue/types.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/codex_hooks.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/doctor.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/exceptions.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/hook_dispatcher.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/hook_migration.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/hooks.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/installer.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/models.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/module_planning.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/ownership.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/path_policy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/preset.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/project_compat.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/project_registry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/runtime_removal.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/settings_merge.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/settings_rollback.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_cache.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_compiler.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_planning.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_validation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/tracking.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/unmanaged.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/version.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/action_identity.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/base.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/coding_standards.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/registry.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/tdd.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/diff.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/engine.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/protocols.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/queries.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/attempts.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/deadline.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/identity.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/native_codex.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/plan_source.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/shadow_runner.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/turn_evidence.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/verdict.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/store.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/supervisor_lane_degrade.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/config.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/handlers.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/prompts.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/types.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/accounting_persistence.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/audit_logger.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/base_client.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/client_factory.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/cost_tracker.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/error_hints.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/intercept.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/metrics.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/model_routes.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/ports.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/provider_trace_logger.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxies.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxy_identity.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxy_orchestrator.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxy_startup.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/reasoning.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/request_id.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/response_headers.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/responses_ingress.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/responses_passthrough.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/runtime_truth.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/sse_framing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/stream_relay.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/utils.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/adversarial.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/backend_readiness.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/consensus.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/engine.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/models.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/code_consensus_evaluation.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/code_debate_evaluation.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview-performance.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview-quick.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview-security.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/consensus_evaluation.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/debate_evaluation.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/docreview-quick.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/docreview.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/thinkdeep.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/routing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/synthesis.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/worker_preparation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/runtime_config.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/bm25_store.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/content_store.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/engine.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/exceptions.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/extractor.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/index_state.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/store.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/tokenizer.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/addendum.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/artifacts.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/authority.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/cleanup.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/invoke.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/paths.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/relocate.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/codex_handoff.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/config.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/consumer_lanes.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/context_limit.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/context_rendering.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/effective.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/events.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/exceptions.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/git.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/hooks/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/hooks/models.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/identity.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/launch_confirmation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/launchability.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/memory_inheritance.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/memory_writer.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/model_pin.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/overrides.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/passport.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/plan_resolution.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/prev_sessions.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/project_memory.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/rewind.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/routing.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/shadow_curation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/transfer.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/validation.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/verification_config.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/workspace.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/cleanup.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/config_copy.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/create.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/sidecar/__init__.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/sidecar/container.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/analyze/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/analyze/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/challenge/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/challenge/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/consensus/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/consensus/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/consensus/resources/synthesis.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/debate/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/debate/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/panel/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/panel/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/panel/resources/synthesis.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/SKILL.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/0-enable.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/1-preflight.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/10-resume.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/11-config.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/12-search.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/13-policy.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/14-workflow.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/15-skills.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/16-memory.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/17-info.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/18-disable.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/19-uninstall.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/2-extension.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/20-cleanup.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/3-authentication.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/4-proxy.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/5-session.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/6-hook.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/7-costs.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/8-status-line.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/9-direct-commands.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/coverage-map.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/execution-budget.json +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/report-template.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/runtime-matrix.json +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/qa-artifact.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/qa-run-metrics.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/qa-selection.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/walkthrough-state.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/claude-4.6.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/claude-4.8.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/gemini-3.1.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/gpt-5.5.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/skills-writing-guide.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code-anthropic.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code-gemini.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code-openai.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs-anthropic.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs-gemini.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs-openai.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/smoke-test/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/smoke-test/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/smoke-test/scripts/smoke-test.sh +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/content.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/forge-skill.yaml +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code-anthropic.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code-gemini.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code-openai.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs-anthropic.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs-gemini.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs-openai.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/SKILL.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/resources/checklist.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/resources/journey-map.md +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/claude-wrapper.sh +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/cleanup-owned.sh +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/package-identity.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/protected-paths.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/run-in-repo.sh +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/setup-test-repo.sh +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/walkthrough-report.py +0 -0
- {multi_forge-1.1.0 → multi_forge-1.1.3}/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.3
|
|
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,10 +21,11 @@ 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
|
|
@@ -34,12 +35,14 @@ Requires-Dist: fastapi-sso<1,>=0.19.0
|
|
|
34
35
|
Requires-Dist: fastapi<0.137,>=0.136.3
|
|
35
36
|
Requires-Dist: httpx>=0.25.0
|
|
36
37
|
Requires-Dist: litellm==1.102.0
|
|
38
|
+
Requires-Dist: multidict<7,>=6.9.1
|
|
39
|
+
Requires-Dist: oauthlib<5,>=4.0.0
|
|
37
40
|
Requires-Dist: openai>=1.0.0
|
|
38
41
|
Requires-Dist: orjson<4,>=3.11.6
|
|
39
42
|
Requires-Dist: packaging>=21.0
|
|
40
43
|
Requires-Dist: pydantic-settings<3,>=2.14.1
|
|
41
44
|
Requires-Dist: pydantic>=2.0.0
|
|
42
|
-
Requires-Dist: pyjwt<3,>=2.
|
|
45
|
+
Requires-Dist: pyjwt<3,>=2.15.0
|
|
43
46
|
Requires-Dist: python-dateutil<3,>=2.9.0
|
|
44
47
|
Requires-Dist: python-dotenv>=1.2.2
|
|
45
48
|
Requires-Dist: python-multipart<1,>=0.0.31
|
|
@@ -49,6 +52,7 @@ Requires-Dist: rich<14,>=13.9.4
|
|
|
49
52
|
Requires-Dist: ruamel-yaml>=0.18.0
|
|
50
53
|
Requires-Dist: starlette<1.8,>=1.7.0
|
|
51
54
|
Requires-Dist: tenacity>=8.0.0
|
|
55
|
+
Requires-Dist: urllib3<3,>=2.8.0
|
|
52
56
|
Requires-Dist: uvicorn<1,>=0.33.0
|
|
53
57
|
Requires-Dist: uvloop<1,>=0.21.0; sys_platform != 'win32'
|
|
54
58
|
Requires-Dist: watchfiles>=0.20
|
|
@@ -194,6 +198,9 @@ forge auth login -c openrouter # store OPENROUTER_API_KEY
|
|
|
194
198
|
forge session start --proxy openrouter-anthropic
|
|
195
199
|
```
|
|
196
200
|
|
|
201
|
+
These PyPI installs resolve compatible dependency versions. For a constrained installation from reviewed source or a
|
|
202
|
+
release wheel, see [dependency security](docs/developer/dependency_security.md).
|
|
203
|
+
|
|
197
204
|
Developing on Forge itself? See [CONTRIBUTING.md](CONTRIBUTING.md) for the editable install.
|
|
198
205
|
|
|
199
206
|
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.3"
|
|
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"
|
|
@@ -45,25 +45,31 @@ dependencies = [
|
|
|
45
45
|
# validated through LiteLLM 1.102.0; 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",
|
|
54
56
|
# LiteLLM 1.95 imports outbound-credential tagged unions at startup.
|
|
55
57
|
"expression>=5.6.0,<6",
|
|
56
58
|
# Keep FastAPI's lock-proven route-tree behavior; upgrade it separately.
|
|
57
59
|
"fastapi>=0.136.3,<0.137",
|
|
58
60
|
"fastapi-sso>=0.19.0,<1",
|
|
61
|
+
# Runtime security floors belong in wheel metadata, not only uv constraints.
|
|
62
|
+
"multidict>=6.9.1,<7",
|
|
63
|
+
"oauthlib>=4.0.0,<5",
|
|
59
64
|
"orjson>=3.11.6,<4",
|
|
60
65
|
"pydantic-settings>=2.14.1,<3",
|
|
61
|
-
"pyjwt>=2.
|
|
66
|
+
"pyjwt>=2.15.0,<3",
|
|
62
67
|
"python-multipart>=0.0.31,<1",
|
|
63
68
|
# LiteLLM 1.95 imports its Redis support from the default startup graph.
|
|
64
69
|
"redis>=5.2.0,<8",
|
|
65
70
|
# Starlette 1.7 fixes TestClient's deprecated AnyIO BlockingPortal import.
|
|
66
71
|
"starlette>=1.7.0,<1.8",
|
|
72
|
+
"urllib3>=2.8.0,<3",
|
|
67
73
|
"uvicorn>=0.33.0,<1",
|
|
68
74
|
"uvloop>=0.21.0,<1; sys_platform != 'win32'",
|
|
69
75
|
"watchfiles>=0.20",
|
|
@@ -82,7 +88,7 @@ Issues = "https://github.com/hapa1i/multi-forge/issues"
|
|
|
82
88
|
Documentation = "https://github.com/hapa1i/multi-forge/tree/main/docs"
|
|
83
89
|
|
|
84
90
|
[build-system]
|
|
85
|
-
requires = ["hatchling"]
|
|
91
|
+
requires = ["hatchling==1.32.4"]
|
|
86
92
|
build-backend = "hatchling.build"
|
|
87
93
|
|
|
88
94
|
[tool.hatch.build.targets.wheel]
|
|
@@ -148,9 +154,19 @@ disallow_untyped_calls = false
|
|
|
148
154
|
|
|
149
155
|
# Security floor for transitive dependencies (Dependabot alerts)
|
|
150
156
|
[tool.uv]
|
|
157
|
+
# uv sync does not consume UV_BUILD_CONSTRAINT; keep its isolated builds pinned too.
|
|
158
|
+
# scripts/check-dependency-pins.py checks this list against the build-group export.
|
|
159
|
+
build-constraint-dependencies = [
|
|
160
|
+
"hatchling==1.32.4",
|
|
161
|
+
"packaging==26.3",
|
|
162
|
+
"pathspec==1.1.1",
|
|
163
|
+
"pluggy==1.6.0",
|
|
164
|
+
"tomlkit==0.15.2",
|
|
165
|
+
"trove-classifiers==2026.9.21.13",
|
|
166
|
+
]
|
|
151
167
|
constraint-dependencies = [
|
|
152
168
|
"filelock>=3.20.3",
|
|
153
|
-
"virtualenv>=
|
|
169
|
+
"virtualenv>=21.14.12",
|
|
154
170
|
"mcp>=1.28.1",
|
|
155
171
|
"Pygments>=2.20.0",
|
|
156
172
|
"pyasn1>=0.6.4",
|
|
@@ -158,6 +174,13 @@ constraint-dependencies = [
|
|
|
158
174
|
|
|
159
175
|
[dependency-groups]
|
|
160
176
|
dev = [
|
|
177
|
+
"pre-commit-hooks==6.0.0",
|
|
178
|
+
"isort==9.0.1",
|
|
179
|
+
"mdformat==1.0.0",
|
|
180
|
+
"mdformat-gfm==1.0.0",
|
|
181
|
+
"mdformat-gfm-alerts==2.1.0",
|
|
182
|
+
"mdformat-simple-breaks==0.1.0",
|
|
183
|
+
"mdformat-frontmatter==2.1.2",
|
|
161
184
|
"pytest>=9.0.3",
|
|
162
185
|
"pytest-cov>=4.1.0",
|
|
163
186
|
"pytest-asyncio>=0.23.0",
|
|
@@ -172,6 +195,7 @@ dev = [
|
|
|
172
195
|
"types-requests>=2.31.0",
|
|
173
196
|
"httpx2>=2.3.0",
|
|
174
197
|
]
|
|
198
|
+
build = ["hatchling==1.32.4"]
|
|
175
199
|
provider-check = [
|
|
176
200
|
# scripts/count-tokens.py imports provider-specific count_tokens surfaces;
|
|
177
201
|
# keep lock refreshes inside the API families verified by that script.
|
|
@@ -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__)
|