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.
Files changed (534) hide show
  1. {multi_forge-1.1.0 → multi_forge-1.1.3}/PKG-INFO +10 -3
  2. {multi_forge-1.1.0 → multi_forge-1.1.3}/README.md +3 -0
  3. {multi_forge-1.1.0 → multi_forge-1.1.3}/pyproject.toml +29 -5
  4. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/authority.py +21 -1
  5. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_stop.py +3 -2
  6. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/commands.py +406 -350
  7. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/policy.py +6 -4
  8. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/main.py +30 -5
  9. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/memory.py +24 -18
  10. multi_forge-1.1.3/src/forge/cli/memory_writer.py +171 -0
  11. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/policy.py +12 -1
  12. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/search.py +46 -13
  13. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session.py +18 -12
  14. multi_forge-1.1.3/src/forge/cli/session_delete.py +294 -0
  15. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_fork.py +1 -1
  16. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_lifecycle.py +87 -75
  17. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_manage.py +30 -719
  18. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_resume_modes.py +108 -65
  19. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/sources.py +13 -9
  20. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/transfer.py +10 -6
  21. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/model_catalog.yaml +21 -10
  22. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/claude.py +2 -0
  23. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/types.py +1 -0
  24. multi_forge-1.1.3/src/forge/core/judgments/__init__.py +19 -0
  25. multi_forge-1.1.3/src/forge/core/judgments/openrouter.py +370 -0
  26. multi_forge-1.1.3/src/forge/core/judgments/types.py +215 -0
  27. multi_forge-1.1.3/src/forge/core/judgments/usage.py +99 -0
  28. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/openai_compat.py +39 -18
  29. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/openrouter.py +7 -0
  30. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/catalog.py +24 -1
  31. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/types.py +7 -0
  32. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/claude_session.py +79 -18
  33. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_bridge.py +29 -1
  34. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_interactive.py +93 -49
  35. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_session.py +163 -70
  36. multi_forge-1.1.3/src/forge/core/ops/codex_thread_index.py +26 -0
  37. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/gc.py +140 -3
  38. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/policy.py +35 -1
  39. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_adopt.py +62 -64
  40. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_authority.py +13 -0
  41. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_authority_launch.py +36 -1
  42. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_fork_execution.py +42 -33
  43. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/transfer.py +54 -4
  44. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/session_runner.py +4 -0
  45. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/structured_output.py +9 -4
  46. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/downstream.py +4 -0
  47. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/emit.py +6 -0
  48. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/measurement.py +13 -7
  49. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/workqueue/queue.py +99 -5
  50. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/plan_check.py +37 -13
  51. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/shadow.py +7 -1
  52. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/stop_review.py +31 -9
  53. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/supervisor.py +1 -0
  54. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/client_adapter.py +2 -0
  55. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/converters.py +109 -34
  56. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/cost_logger.py +5 -1
  57. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/data_models.py +9 -3
  58. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/passthrough.py +15 -8
  59. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/passthrough_ingress.py +1 -0
  60. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/server.py +6 -0
  61. multi_forge-1.1.3/src/forge/search/cleanup.py +107 -0
  62. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/active.py +97 -19
  63. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/cleanup.py +32 -18
  64. multi_forge-1.1.3/src/forge/session/cleanup_content.py +727 -0
  65. multi_forge-1.1.3/src/forge/session/cleanup_dependencies.py +266 -0
  66. multi_forge-1.1.3/src/forge/session/cleanup_git.py +72 -0
  67. multi_forge-1.1.3/src/forge/session/cleanup_state.py +20 -0
  68. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/codex_invoke.py +8 -0
  69. multi_forge-1.1.3/src/forge/session/deletion.py +642 -0
  70. multi_forge-1.1.3/src/forge/session/hooks/producers.py +22 -0
  71. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/hooks/session_start.py +65 -25
  72. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/index.py +224 -94
  73. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/launch.py +9 -0
  74. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/manager.py +485 -1030
  75. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/models.py +3 -1
  76. multi_forge-1.1.3/src/forge/session/purge_native.py +756 -0
  77. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/store.py +92 -11
  78. multi_forge-1.1.3/src/forge/session/workers.py +263 -0
  79. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/sidecar/docker.py +1 -0
  80. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/start-container.sh +2 -1
  81. multi_forge-1.1.0/src/forge/cli/memory_writer.py +0 -151
  82. multi_forge-1.1.0/src/forge/core/ops/codex_thread_index.py +0 -15
  83. {multi_forge-1.1.0 → multi_forge-1.1.3}/.gitignore +0 -0
  84. {multi_forge-1.1.0 → multi_forge-1.1.3}/LICENSE +0 -0
  85. {multi_forge-1.1.0 → multi_forge-1.1.3}/NOTICE +0 -0
  86. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/agents/.gitkeep +0 -0
  87. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/commands/.gitkeep +0 -0
  88. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/__init__.py +0 -0
  89. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/__init__.py +0 -0
  90. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/adapters/__init__.py +0 -0
  91. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/adapters/litellm.py +0 -0
  92. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/creation.py +0 -0
  93. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/registry.py +0 -0
  94. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/remote/__init__.py +0 -0
  95. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/remote/base.py +0 -0
  96. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/remote/openrouter.py +0 -0
  97. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/backend/sources.py +0 -0
  98. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/__init__.py +0 -0
  99. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/activity.py +0 -0
  100. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/auth.py +0 -0
  101. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/backend.py +0 -0
  102. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/claude.py +0 -0
  103. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/codex.py +0 -0
  104. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/config_cmd.py +0 -0
  105. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/consumer_lane_freeze.py +0 -0
  106. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/editor.py +0 -0
  107. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/extensions.py +0 -0
  108. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/gc.py +0 -0
  109. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/guards.py +0 -0
  110. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/__init__.py +0 -0
  111. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/_group.py +0 -0
  112. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/_helpers.py +0 -0
  113. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_patch.py +0 -0
  114. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_policy.py +0 -0
  115. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_policy_feedback.py +0 -0
  116. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/codex_transfer.py +0 -0
  117. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/direct_commands.py +0 -0
  118. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/protocols.py +0 -0
  119. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/read_hygiene.py +0 -0
  120. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/hooks/verification.py +0 -0
  121. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/info.py +0 -0
  122. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/logs.py +0 -0
  123. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/memory_report.py +0 -0
  124. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/model.py +0 -0
  125. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/output.py +0 -0
  126. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/proxy.py +0 -0
  127. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/proxy_audit.py +0 -0
  128. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/proxy_costs.py +0 -0
  129. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/runtime.py +0 -0
  130. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_adopt.py +0 -0
  131. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_authority.py +0 -0
  132. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_authority_options.py +0 -0
  133. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_codex.py +0 -0
  134. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_lane.py +0 -0
  135. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_launch_args.py +0 -0
  136. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_memory.py +0 -0
  137. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_model.py +0 -0
  138. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_repair.py +0 -0
  139. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_rewind.py +0 -0
  140. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_route_recovery.py +0 -0
  141. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_routing.py +0 -0
  142. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/session_supervisor_options.py +0 -0
  143. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/status_line.py +0 -0
  144. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/__init__.py +0 -0
  145. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/context.py +0 -0
  146. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/formatting.py +0 -0
  147. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/names.py +0 -0
  148. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/palette.py +0 -0
  149. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/registry.py +0 -0
  150. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/rendering.py +0 -0
  151. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/throttle.py +0 -0
  152. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/statusline/types.py +0 -0
  153. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/supervisor_auth.py +0 -0
  154. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/telemetry.py +0 -0
  155. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/trace.py +0 -0
  156. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/workflow.py +0 -0
  157. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/cli/workspace.py +0 -0
  158. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/__init__.py +0 -0
  159. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/dataclass_utils.py +0 -0
  160. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/__init__.py +0 -0
  161. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/backends/__init__.py +0 -0
  162. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/backends/litellm.yaml +0 -0
  163. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/__init__.py +0 -0
  164. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/anthropic-passthrough.yaml +0 -0
  165. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/codex-responses-local.yaml +0 -0
  166. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-anthropic-local.yaml +0 -0
  167. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-anthropic.yaml +0 -0
  168. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini-flash-local.yaml +0 -0
  169. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini-local.yaml +0 -0
  170. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini-test.yaml +0 -0
  171. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-gemini.yaml +0 -0
  172. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-openai-codex-local.yaml +0 -0
  173. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-openai-local.yaml +0 -0
  174. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/litellm-openai.yaml +0 -0
  175. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-anthropic.yaml +0 -0
  176. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-deepseek.yaml +0 -0
  177. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-gemini-flash.yaml +0 -0
  178. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-gemini.yaml +0 -0
  179. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-glm.yaml +0 -0
  180. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-kimi.yaml +0 -0
  181. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-minimax.yaml +0 -0
  182. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-openai-codex.yaml +0 -0
  183. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-openai.yaml +0 -0
  184. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/defaults/templates/openrouter-qwen.yaml +0 -0
  185. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/loader.py +0 -0
  186. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/config/schema.py +0 -0
  187. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/__init__.py +0 -0
  188. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/__init__.py +0 -0
  189. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/capabilities.py +0 -0
  190. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/credentials_file.py +0 -0
  191. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/protocols.py +0 -0
  192. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/secrets.py +0 -0
  193. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/auth/template_secrets.py +0 -0
  194. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/backend_dependency.py +0 -0
  195. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/credential_registry.py +0 -0
  196. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/__init__.py +0 -0
  197. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/model_practices.yaml +0 -0
  198. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/model_routes.yaml +0 -0
  199. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/system_prompt_addendums/__init__.py +0 -0
  200. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/system_prompt_addendums/gemini.md +0 -0
  201. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/data/system_prompt_addendums/openai.md +0 -0
  202. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/effort.py +0 -0
  203. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/identifiers.py +0 -0
  204. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/__init__.py +0 -0
  205. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/_lifecycle.py +0 -0
  206. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/codex.py +0 -0
  207. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/codex_fork.py +0 -0
  208. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/invoker/codex_stream.py +0 -0
  209. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/lanes.py +0 -0
  210. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/__init__.py +0 -0
  211. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/__init__.py +0 -0
  212. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/base.py +0 -0
  213. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/clients/litellm.py +0 -0
  214. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/credentials.py +0 -0
  215. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/detection.py +0 -0
  216. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/errors.py +0 -0
  217. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/openrouter_policy.py +0 -0
  218. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/protocols.py +0 -0
  219. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/llm/types.py +0 -0
  220. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/logging.py +0 -0
  221. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/metric_formatting.py +0 -0
  222. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/__init__.py +0 -0
  223. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/direct_model.py +0 -0
  224. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/model_practices.py +0 -0
  225. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/model_reference.py +0 -0
  226. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/models/model_routes.py +0 -0
  227. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/naming.py +0 -0
  228. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/native_review_types.py +0 -0
  229. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/__init__.py +0 -0
  230. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/backend_reconcile.py +0 -0
  231. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_adopt.py +0 -0
  232. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/codex_enrollment.py +0 -0
  233. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/context.py +0 -0
  234. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/provider_trace.py +0 -0
  235. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/proxy.py +0 -0
  236. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/resolution.py +0 -0
  237. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session.py +0 -0
  238. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_active.py +0 -0
  239. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_context.py +0 -0
  240. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_fork_preflight.py +0 -0
  241. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_model.py +0 -0
  242. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_model_routing.py +0 -0
  243. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_repair.py +0 -0
  244. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/session_routing.py +0 -0
  245. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/usage_summary.py +0 -0
  246. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/ops/workspace.py +0 -0
  247. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/paths.py +0 -0
  248. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/process.py +0 -0
  249. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/provider_types.py +0 -0
  250. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/__init__.py +0 -0
  251. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/codex_reviewer_home.py +0 -0
  252. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/cost_tracking.py +0 -0
  253. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/env.py +0 -0
  254. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/headless_json.py +0 -0
  255. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/llm_call.py +0 -0
  256. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/proxy.py +0 -0
  257. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/reviewer_runtime.py +0 -0
  258. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/reviewer_settings.py +0 -0
  259. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/routing.py +0 -0
  260. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/supervisor_auth.py +0 -0
  261. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/tagger.py +0 -0
  262. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/throttle.py +0 -0
  263. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/reactive/watchdog.py +0 -0
  264. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/run_id.py +0 -0
  265. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/__init__.py +0 -0
  266. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_feedback.py +0 -0
  267. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_preflight.py +0 -0
  268. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_preflight_cache.py +0 -0
  269. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_review_source.py +0 -0
  270. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_rollouts.py +0 -0
  271. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/codex_turn_enrollment.py +0 -0
  272. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/launch_args.py +0 -0
  273. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime/registry.py +0 -0
  274. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/runtime_vocab.py +0 -0
  275. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/__init__.py +0 -0
  276. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/exceptions.py +0 -0
  277. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/io.py +0 -0
  278. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/lock.py +0 -0
  279. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/retention.py +0 -0
  280. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/timestamps.py +0 -0
  281. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/state/versioned_store.py +0 -0
  282. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/__init__.py +0 -0
  283. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/caps.py +0 -0
  284. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/downstream_retention.py +0 -0
  285. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/jsonl_io.py +0 -0
  286. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/upstream.py +0 -0
  287. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/telemetry/vocabulary.py +0 -0
  288. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/tiers.py +0 -0
  289. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/transcript.py +0 -0
  290. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/typing_helpers.py +0 -0
  291. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/__init__.py +0 -0
  292. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/billing.py +0 -0
  293. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/correlation.py +0 -0
  294. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/ledger.py +0 -0
  295. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/usage/vocabulary.py +0 -0
  296. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/wire_shapes.py +0 -0
  297. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/workqueue/__init__.py +0 -0
  298. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/core/workqueue/types.py +0 -0
  299. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/__init__.py +0 -0
  300. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/codex_hooks.py +0 -0
  301. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/doctor.py +0 -0
  302. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/exceptions.py +0 -0
  303. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/hook_dispatcher.py +0 -0
  304. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/hook_migration.py +0 -0
  305. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/hooks.py +0 -0
  306. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/installer.py +0 -0
  307. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/models.py +0 -0
  308. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/module_planning.py +0 -0
  309. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/ownership.py +0 -0
  310. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/path_policy.py +0 -0
  311. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/preset.py +0 -0
  312. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/project_compat.py +0 -0
  313. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/project_registry.py +0 -0
  314. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/runtime_removal.py +0 -0
  315. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/settings_merge.py +0 -0
  316. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/settings_rollback.py +0 -0
  317. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_cache.py +0 -0
  318. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_compiler.py +0 -0
  319. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_planning.py +0 -0
  320. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/skill_validation.py +0 -0
  321. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/tracking.py +0 -0
  322. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/unmanaged.py +0 -0
  323. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/install/version.py +0 -0
  324. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/__init__.py +0 -0
  325. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/action_identity.py +0 -0
  326. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/__init__.py +0 -0
  327. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/base.py +0 -0
  328. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/coding_standards.py +0 -0
  329. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/registry.py +0 -0
  330. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/deterministic/tdd.py +0 -0
  331. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/diff.py +0 -0
  332. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/engine.py +0 -0
  333. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/protocols.py +0 -0
  334. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/queries.py +0 -0
  335. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/__init__.py +0 -0
  336. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/attempts.py +0 -0
  337. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/deadline.py +0 -0
  338. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/identity.py +0 -0
  339. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/native_codex.py +0 -0
  340. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/plan_source.py +0 -0
  341. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/shadow_runner.py +0 -0
  342. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/turn_evidence.py +0 -0
  343. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/semantic/verdict.py +0 -0
  344. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/store.py +0 -0
  345. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/supervisor_lane_degrade.py +0 -0
  346. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/__init__.py +0 -0
  347. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/config.py +0 -0
  348. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/handlers.py +0 -0
  349. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/team/prompts.py +0 -0
  350. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/policy/types.py +0 -0
  351. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/__init__.py +0 -0
  352. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/accounting_persistence.py +0 -0
  353. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/audit_logger.py +0 -0
  354. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/base_client.py +0 -0
  355. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/client_factory.py +0 -0
  356. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/cost_tracker.py +0 -0
  357. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/error_hints.py +0 -0
  358. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/intercept.py +0 -0
  359. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/metrics.py +0 -0
  360. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/model_routes.py +0 -0
  361. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/ports.py +0 -0
  362. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/provider_trace_logger.py +0 -0
  363. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxies.py +0 -0
  364. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxy_identity.py +0 -0
  365. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxy_orchestrator.py +0 -0
  366. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/proxy_startup.py +0 -0
  367. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/reasoning.py +0 -0
  368. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/request_id.py +0 -0
  369. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/response_headers.py +0 -0
  370. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/responses_ingress.py +0 -0
  371. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/responses_passthrough.py +0 -0
  372. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/runtime_truth.py +0 -0
  373. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/sse_framing.py +0 -0
  374. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/stream_relay.py +0 -0
  375. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/proxy/utils.py +0 -0
  376. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/__init__.py +0 -0
  377. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/adversarial.py +0 -0
  378. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/backend_readiness.py +0 -0
  379. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/consensus.py +0 -0
  380. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/engine.py +0 -0
  381. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/models.py +0 -0
  382. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/__init__.py +0 -0
  383. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/code_consensus_evaluation.md +0 -0
  384. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/code_debate_evaluation.md +0 -0
  385. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview-performance.md +0 -0
  386. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview-quick.md +0 -0
  387. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview-security.md +0 -0
  388. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/codereview.md +0 -0
  389. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/consensus_evaluation.md +0 -0
  390. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/debate_evaluation.md +0 -0
  391. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/docreview-quick.md +0 -0
  392. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/docreview.md +0 -0
  393. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/resources/thinkdeep.md +0 -0
  394. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/routing.py +0 -0
  395. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/synthesis.py +0 -0
  396. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/review/worker_preparation.py +0 -0
  397. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/runtime_config.py +0 -0
  398. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/__init__.py +0 -0
  399. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/bm25_store.py +0 -0
  400. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/content_store.py +0 -0
  401. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/engine.py +0 -0
  402. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/exceptions.py +0 -0
  403. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/extractor.py +0 -0
  404. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/index_state.py +0 -0
  405. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/store.py +0 -0
  406. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/search/tokenizer.py +0 -0
  407. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/__init__.py +0 -0
  408. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/addendum.py +0 -0
  409. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/artifacts.py +0 -0
  410. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/authority.py +0 -0
  411. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/__init__.py +0 -0
  412. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/cleanup.py +0 -0
  413. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/invoke.py +0 -0
  414. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/paths.py +0 -0
  415. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/claude/relocate.py +0 -0
  416. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/codex_handoff.py +0 -0
  417. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/config.py +0 -0
  418. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/consumer_lanes.py +0 -0
  419. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/context_limit.py +0 -0
  420. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/context_rendering.py +0 -0
  421. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/effective.py +0 -0
  422. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/events.py +0 -0
  423. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/exceptions.py +0 -0
  424. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/git.py +0 -0
  425. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/hooks/__init__.py +0 -0
  426. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/hooks/models.py +0 -0
  427. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/identity.py +0 -0
  428. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/launch_confirmation.py +0 -0
  429. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/launchability.py +0 -0
  430. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/memory_inheritance.py +0 -0
  431. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/memory_writer.py +0 -0
  432. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/model_pin.py +0 -0
  433. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/overrides.py +0 -0
  434. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/passport.py +0 -0
  435. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/plan_resolution.py +0 -0
  436. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/prev_sessions.py +0 -0
  437. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/project_memory.py +0 -0
  438. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/rewind.py +0 -0
  439. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/routing.py +0 -0
  440. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/shadow_curation.py +0 -0
  441. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/transfer.py +0 -0
  442. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/validation.py +0 -0
  443. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/verification_config.py +0 -0
  444. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/workspace.py +0 -0
  445. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/__init__.py +0 -0
  446. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/cleanup.py +0 -0
  447. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/config_copy.py +0 -0
  448. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/session/worktree/create.py +0 -0
  449. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/sidecar/__init__.py +0 -0
  450. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/forge/sidecar/container.py +0 -0
  451. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/analyze/content.md +0 -0
  452. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/analyze/forge-skill.yaml +0 -0
  453. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/challenge/content.md +0 -0
  454. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/challenge/forge-skill.yaml +0 -0
  455. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/consensus/content.md +0 -0
  456. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/consensus/forge-skill.yaml +0 -0
  457. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/consensus/resources/synthesis.md +0 -0
  458. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/debate/content.md +0 -0
  459. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/debate/forge-skill.yaml +0 -0
  460. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/panel/content.md +0 -0
  461. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/panel/forge-skill.yaml +0 -0
  462. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/panel/resources/synthesis.md +0 -0
  463. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/SKILL.md +0 -0
  464. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/0-enable.md +0 -0
  465. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/1-preflight.md +0 -0
  466. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/10-resume.md +0 -0
  467. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/11-config.md +0 -0
  468. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/12-search.md +0 -0
  469. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/13-policy.md +0 -0
  470. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/14-workflow.md +0 -0
  471. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/15-skills.md +0 -0
  472. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/16-memory.md +0 -0
  473. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/17-info.md +0 -0
  474. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/18-disable.md +0 -0
  475. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/19-uninstall.md +0 -0
  476. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/2-extension.md +0 -0
  477. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/20-cleanup.md +0 -0
  478. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/3-authentication.md +0 -0
  479. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/4-proxy.md +0 -0
  480. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/5-session.md +0 -0
  481. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/6-hook.md +0 -0
  482. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/7-costs.md +0 -0
  483. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/8-status-line.md +0 -0
  484. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist/9-direct-commands.md +0 -0
  485. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/checklist.md +0 -0
  486. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/coverage-map.md +0 -0
  487. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/execution-budget.json +0 -0
  488. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/report-template.md +0 -0
  489. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/resources/runtime-matrix.json +0 -0
  490. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/qa-artifact.py +0 -0
  491. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/qa-run-metrics.py +0 -0
  492. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/qa-selection.py +0 -0
  493. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/qa/scripts/walkthrough-state.py +0 -0
  494. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/content.md +0 -0
  495. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/forge-skill.yaml +0 -0
  496. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/claude-4.6.md +0 -0
  497. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/claude-4.8.md +0 -0
  498. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/gemini-3.1.md +0 -0
  499. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/gpt-5.5.md +0 -0
  500. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/references/skills-writing-guide.md +0 -0
  501. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code-anthropic.md +0 -0
  502. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code-gemini.md +0 -0
  503. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code-openai.md +0 -0
  504. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review/resources/code.md +0 -0
  505. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/content.md +0 -0
  506. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/forge-skill.yaml +0 -0
  507. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs-anthropic.md +0 -0
  508. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs-gemini.md +0 -0
  509. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs-openai.md +0 -0
  510. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/review-docs/resources/docs.md +0 -0
  511. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/smoke-test/content.md +0 -0
  512. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/smoke-test/forge-skill.yaml +0 -0
  513. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/smoke-test/scripts/smoke-test.sh +0 -0
  514. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/content.md +0 -0
  515. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/forge-skill.yaml +0 -0
  516. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code-anthropic.md +0 -0
  517. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code-gemini.md +0 -0
  518. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code-openai.md +0 -0
  519. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/code.md +0 -0
  520. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs-anthropic.md +0 -0
  521. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs-gemini.md +0 -0
  522. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs-openai.md +0 -0
  523. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/understand/resources/docs.md +0 -0
  524. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/SKILL.md +0 -0
  525. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/resources/checklist.md +0 -0
  526. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/resources/journey-map.md +0 -0
  527. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/claude-wrapper.sh +0 -0
  528. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/cleanup-owned.sh +0 -0
  529. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/package-identity.py +0 -0
  530. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/protected-paths.py +0 -0
  531. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/run-in-repo.sh +0 -0
  532. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/setup-test-repo.sh +0 -0
  533. {multi_forge-1.1.0 → multi_forge-1.1.3}/src/skills/walkthrough/scripts/walkthrough-report.py +0 -0
  534. {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.0
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.3
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.13.0
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.0"
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.3,<4",
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.13.0,<3",
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>=20.36.1",
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
- append_authority_event(str(result.store.forge_root), event)
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
- store.review_identity(create=True) or "",
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__)