@miller-tech/uap 1.20.10 → 1.20.11

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miller-tech/uap",
3
- "version": "1.20.10",
3
+ "version": "1.20.11",
4
4
  "description": "Autonomous AI agent memory system with CLAUDE.md protocol enforcement",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -147,10 +147,10 @@ PROXY_TOOL_STATE_FORCED_BUDGET = int(
147
147
  )
148
148
  PROXY_TOOL_STATE_AUTO_BUDGET = int(os.environ.get("PROXY_TOOL_STATE_AUTO_BUDGET", "2"))
149
149
  PROXY_TOOL_STATE_STAGNATION_THRESHOLD = int(
150
- os.environ.get("PROXY_TOOL_STATE_STAGNATION_THRESHOLD", "9")
150
+ os.environ.get("PROXY_TOOL_STATE_STAGNATION_THRESHOLD", "5")
151
151
  )
152
152
  PROXY_TOOL_STATE_CYCLE_WINDOW = int(
153
- os.environ.get("PROXY_TOOL_STATE_CYCLE_WINDOW", "8")
153
+ os.environ.get("PROXY_TOOL_STATE_CYCLE_WINDOW", "4")
154
154
  )
155
155
  PROXY_TOOL_STATE_FINALIZE_THRESHOLD = int(
156
156
  os.environ.get("PROXY_TOOL_STATE_FINALIZE_THRESHOLD", "18")
@@ -2053,7 +2053,7 @@ def _resolve_state_machine_tool_choice(
2053
2053
  monitor.tool_state_stagnation_streak,
2054
2054
  monitor.tool_state_review_cycles,
2055
2055
  )
2056
- return "auto", reason
2056
+ return "required", reason
2057
2057
 
2058
2058
  if monitor.tool_state_forced_budget_remaining <= 0:
2059
2059
  monitor.set_tool_turn_phase("review", reason="forced_budget_exhausted")
@@ -2068,7 +2068,7 @@ def _resolve_state_machine_tool_choice(
2068
2068
  "TOOL STATE MACHINE: forced budget exhausted, entering review (cycles=%d)",
2069
2069
  monitor.tool_state_review_cycles,
2070
2070
  )
2071
- return "auto", "forced_budget_exhausted"
2071
+ return "required", "forced_budget_exhausted"
2072
2072
 
2073
2073
  monitor.tool_state_forced_budget_remaining -= 1
2074
2074
  return "required", "act"
@@ -2088,7 +2088,7 @@ def _resolve_state_machine_tool_choice(
2088
2088
  1, PROXY_TOOL_STATE_FORCED_BUDGET // 2
2089
2089
  )
2090
2090
  return "required", "review_complete"
2091
- return "auto", "review"
2091
+ return "required", "review"
2092
2092
 
2093
2093
  if monitor.tool_turn_phase == "finalize":
2094
2094
  if monitor.tool_state_auto_budget_remaining <= 0:
@@ -1861,7 +1861,8 @@ class TestToolTurnControls(unittest.TestCase):
1861
1861
 
1862
1862
  self.assertEqual(openai_1.get("tool_choice"), "required")
1863
1863
  self.assertEqual(openai_2.get("tool_choice"), "required")
1864
- self.assertEqual(openai_3.get("tool_choice"), "auto")
1864
+ # Review phase now keeps required to prevent end-turn escape
1865
+ self.assertEqual(openai_3.get("tool_choice"), "required")
1865
1866
  finally:
1866
1867
  setattr(proxy, "PROXY_TOOL_STATE_MACHINE", old_state)
1867
1868
  setattr(proxy, "PROXY_TOOL_STATE_MIN_MESSAGES", old_min_msgs)
@@ -1938,7 +1939,8 @@ class TestToolTurnControls(unittest.TestCase):
1938
1939
  }
1939
1940
 
1940
1941
  openai = proxy.build_openai_request(body, monitor)
1941
- self.assertEqual(openai.get("tool_choice"), "auto")
1942
+ # Review phase now keeps required to prevent end-turn escape
1943
+ self.assertEqual(openai.get("tool_choice"), "required")
1942
1944
  self.assertEqual(monitor.tool_turn_phase, "review")
1943
1945
  finally:
1944
1946
  setattr(proxy, "PROXY_TOOL_STATE_MACHINE", old_state)
@@ -2067,7 +2069,8 @@ class TestToolTurnControls(unittest.TestCase):
2067
2069
  }
2068
2070
 
2069
2071
  openai = proxy.build_openai_request(body, monitor)
2070
- self.assertEqual(openai.get("tool_choice"), "auto")
2072
+ # Review phase now keeps required to prevent end-turn escape
2073
+ self.assertEqual(openai.get("tool_choice"), "required")
2071
2074
  self.assertEqual(monitor.tool_turn_phase, "review")
2072
2075
  self.assertEqual(monitor.tool_state_review_cycles, 1)
2073
2076
  finally: