Auto-run queued session inputs
This commit is contained in:
@@ -20,8 +20,11 @@ from src.session_store import (
|
||||
_deserialize_output_schema,
|
||||
_optional_float,
|
||||
_optional_int,
|
||||
consume_next_session_input,
|
||||
deserialize_model_config,
|
||||
deserialize_runtime_config,
|
||||
enqueue_session_input,
|
||||
list_session_input_queue,
|
||||
load_agent_session,
|
||||
load_session,
|
||||
save_agent_session,
|
||||
@@ -234,6 +237,58 @@ class TestStoredAgentSessionRoundTrip(unittest.TestCase):
|
||||
self.assertEqual(loaded.plugin_state, {})
|
||||
|
||||
|
||||
class TestSessionInputQueue(unittest.TestCase):
|
||||
def test_consume_next_turn_uses_fifo_and_preserves_guidance(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as td:
|
||||
directory = Path(td) / 'sessions'
|
||||
directory.mkdir()
|
||||
first = enqueue_session_input(
|
||||
'session-1',
|
||||
directory=directory,
|
||||
content='first queued turn',
|
||||
kind='next_turn',
|
||||
)
|
||||
guidance = enqueue_session_input(
|
||||
'session-1',
|
||||
directory=directory,
|
||||
content='guide current run',
|
||||
kind='guidance',
|
||||
)
|
||||
second = enqueue_session_input(
|
||||
'session-1',
|
||||
directory=directory,
|
||||
content='second queued turn',
|
||||
kind='next_turn',
|
||||
)
|
||||
|
||||
consumed_first = consume_next_session_input(
|
||||
'session-1',
|
||||
directory=directory,
|
||||
)
|
||||
consumed_second = consume_next_session_input(
|
||||
'session-1',
|
||||
directory=directory,
|
||||
)
|
||||
consumed_none = consume_next_session_input(
|
||||
'session-1',
|
||||
directory=directory,
|
||||
)
|
||||
pending = list_session_input_queue('session-1', directory=directory)
|
||||
|
||||
self.assertIsNotNone(consumed_first)
|
||||
self.assertIsNotNone(consumed_second)
|
||||
assert consumed_first is not None
|
||||
assert consumed_second is not None
|
||||
self.assertEqual(consumed_first['id'], first['id'])
|
||||
self.assertEqual(consumed_first['content'], 'first queued turn')
|
||||
self.assertEqual(consumed_first['status'], 'consumed')
|
||||
self.assertEqual(consumed_second['id'], second['id'])
|
||||
self.assertEqual(consumed_second['content'], 'second queued turn')
|
||||
self.assertIsNone(consumed_none)
|
||||
self.assertEqual([item['id'] for item in pending], [guidance['id']])
|
||||
self.assertEqual(pending[0]['kind'], 'guidance')
|
||||
|
||||
|
||||
class TestModelConfigSerialization(unittest.TestCase):
|
||||
"""serialize_model_config + deserialize_model_config round-trip."""
|
||||
|
||||
@@ -389,8 +444,8 @@ class TestRuntimeConfigSerialization(unittest.TestCase):
|
||||
config = deserialize_runtime_config(payload)
|
||||
|
||||
self.assertEqual(config.max_turns, 50)
|
||||
self.assertAlmostEqual(config.command_timeout_seconds, 30.0)
|
||||
self.assertEqual(config.max_output_chars, 12000)
|
||||
self.assertAlmostEqual(config.command_timeout_seconds, 300.0)
|
||||
self.assertEqual(config.max_output_chars, 50000)
|
||||
self.assertFalse(config.stream_model_responses)
|
||||
self.assertIsNone(config.auto_snip_threshold_tokens)
|
||||
self.assertIsNone(config.auto_compact_threshold_tokens)
|
||||
|
||||
Reference in New Issue
Block a user