harness-sdk-python 0.13.0__tar.gz → 0.13.1__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.
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/PKG-INFO +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/pyproject.toml +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/src/harness_sdk/run_manager.py +9 -9
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_ack_visibility.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_batches.py +3 -3
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_branch_anchor.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_dispatching.py +2 -2
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_edit_dispatched.py +4 -4
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_edit_reload.py +7 -7
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_enqueue.py +3 -3
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_input_required.py +5 -5
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_meta.py +2 -2
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_outcomes.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_prepare_hooks.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_restore.py +2 -2
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_rewind_during_run.py +6 -6
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_settle.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_steer.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_stop_continue.py +1 -1
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_stopping_window.py +17 -17
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/.gitignore +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/README.md +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/examples/__init__.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/examples/runs_app.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/src/harness_sdk/__init__.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/src/harness_sdk/fenced_postgres.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/src/harness_sdk/linear_thread.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/run_helpers.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_fenced_postgres.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_linear_thread.py +0 -0
- {harness_sdk_python-0.13.0 → harness_sdk_python-0.13.1}/tests/test_placement.py +0 -0
|
@@ -53,9 +53,9 @@ _CAPABILITIES = frozenset(
|
|
|
53
53
|
)
|
|
54
54
|
|
|
55
55
|
_TRIGGERS = (
|
|
56
|
-
"send
|
|
57
|
-
"edit
|
|
58
|
-
"reload
|
|
56
|
+
"message-send",
|
|
57
|
+
"message-edit",
|
|
58
|
+
"message-reload",
|
|
59
59
|
"input-resume",
|
|
60
60
|
"error-continue",
|
|
61
61
|
"stop-continue",
|
|
@@ -641,7 +641,7 @@ class RunManager:
|
|
|
641
641
|
|
|
642
642
|
def _send_trigger(self) -> str:
|
|
643
643
|
status = self._status()
|
|
644
|
-
return self._continue_type() if status in ("error", "stopped") else "send
|
|
644
|
+
return self._continue_type() if status in ("error", "stopped") else "message-send"
|
|
645
645
|
|
|
646
646
|
def _stage_dispatch(self, e: _Send) -> None:
|
|
647
647
|
assert e.message is not None
|
|
@@ -673,13 +673,13 @@ class RunManager:
|
|
|
673
673
|
if steer:
|
|
674
674
|
self._entry()["steerQueue"] = []
|
|
675
675
|
self._dispatching = [("steerQueue", item) for item in steer]
|
|
676
|
-
self._dispatch("send
|
|
676
|
+
self._dispatch("message-send", steer, input_outcomes=input_outcomes)
|
|
677
677
|
return True
|
|
678
678
|
queue = self._lane_items("queue")
|
|
679
679
|
if queue:
|
|
680
680
|
self._entry()["queue"].pop(0)
|
|
681
681
|
self._dispatching = [("queue", queue[0])]
|
|
682
|
-
self._dispatch("send
|
|
682
|
+
self._dispatch("message-send", [queue[0]], input_outcomes=input_outcomes)
|
|
683
683
|
return True
|
|
684
684
|
return False
|
|
685
685
|
|
|
@@ -989,7 +989,7 @@ class RunManager:
|
|
|
989
989
|
self._check_anchor(e)
|
|
990
990
|
self._stage_rewind(
|
|
991
991
|
_Rewind(
|
|
992
|
-
"edit
|
|
992
|
+
"message-edit",
|
|
993
993
|
[self._stamped(e.message, e.meta)],
|
|
994
994
|
e.source_meta["parentId"],
|
|
995
995
|
e.ack,
|
|
@@ -1044,7 +1044,7 @@ class RunManager:
|
|
|
1044
1044
|
)
|
|
1045
1045
|
self._stage_rewind(
|
|
1046
1046
|
_Rewind(
|
|
1047
|
-
"edit
|
|
1047
|
+
"message-edit",
|
|
1048
1048
|
[self._stamped(e.message, e.meta)],
|
|
1049
1049
|
e.source_meta["parentId"],
|
|
1050
1050
|
e.ack,
|
|
@@ -1057,7 +1057,7 @@ class RunManager:
|
|
|
1057
1057
|
def _apply_reload(self, e: _Reload) -> Any:
|
|
1058
1058
|
self._stage_rewind(
|
|
1059
1059
|
_Rewind(
|
|
1060
|
-
"reload
|
|
1060
|
+
"message-reload",
|
|
1061
1061
|
[],
|
|
1062
1062
|
e.source_meta["parentId"],
|
|
1063
1063
|
e.ack,
|
|
@@ -91,7 +91,7 @@ async def test_rewind_edit_acks_with_its_dispatch():
|
|
|
91
91
|
async with run_host(script, capabilities=("rewind",)) as (drv, host):
|
|
92
92
|
seq = drv.post("run/edit", edit_params("u1", msg("u2"), anchor=None))
|
|
93
93
|
rerun = await script.next_call()
|
|
94
|
-
assert rerun.ctx.trigger == "edit
|
|
94
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
95
95
|
await drv.wait_status("running")
|
|
96
96
|
assert dispatching_ids(covered_state(drv, seq)) == ["u2"]
|
|
97
97
|
host.live.state["messages"] = [msg("u2")]
|
|
@@ -21,7 +21,7 @@ async def test_multi_steer_batch_places_all_and_dispatches_once():
|
|
|
21
21
|
]
|
|
22
22
|
)
|
|
23
23
|
call = await script.next_call()
|
|
24
|
-
assert call.ctx.trigger == "send
|
|
24
|
+
assert call.ctx.trigger == "message-send"
|
|
25
25
|
assert [m["id"] for m in call.ctx.messages] == ["s1", "s2", "s3"]
|
|
26
26
|
script.no_call()
|
|
27
27
|
assert queue_ids(drv.replica, "steerQueue") == []
|
|
@@ -146,7 +146,7 @@ async def test_rewind_outranks_send_and_continue_in_one_batch():
|
|
|
146
146
|
]
|
|
147
147
|
)
|
|
148
148
|
rerun = await script.next_call()
|
|
149
|
-
assert rerun.ctx.trigger == "edit
|
|
149
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
150
150
|
assert [m["id"] for m in rerun.ctx.messages] == ["m2"]
|
|
151
151
|
script.no_call()
|
|
152
152
|
assert (await drv.res(first))["type"] == "accepted"
|
|
@@ -173,7 +173,7 @@ async def test_send_outranks_the_completing_input_answer():
|
|
|
173
173
|
]
|
|
174
174
|
)
|
|
175
175
|
run = await script.next_call()
|
|
176
|
-
assert run.ctx.trigger == "send
|
|
176
|
+
assert run.ctx.trigger == "message-send"
|
|
177
177
|
assert [m["id"] for m in run.ctx.messages] == ["s1"]
|
|
178
178
|
assert run.ctx.input_outcomes == ((request, {"output": "ok"}, None),)
|
|
179
179
|
script.no_call()
|
|
@@ -196,7 +196,7 @@ async def test_post_reload_sends_anchor_on_the_reload_targets_parent():
|
|
|
196
196
|
async with run_host(script, capabilities=("rewind",)) as (drv, host):
|
|
197
197
|
drv.post("run/reload", reload_params("a1", anchor="u1"))
|
|
198
198
|
call = await script.next_call()
|
|
199
|
-
assert call.ctx.trigger == "reload
|
|
199
|
+
assert call.ctx.trigger == "message-reload"
|
|
200
200
|
call.ack()
|
|
201
201
|
script.thread["a1"] = {
|
|
202
202
|
"parentId": "u1", "role": "assistant", "isLeaf": True, "onActiveBranch": False
|
|
@@ -58,7 +58,7 @@ async def test_idle_send_dispatches_straight_into_dispatching():
|
|
|
58
58
|
drv.post("run/enqueue", add("m1"))
|
|
59
59
|
await script.next_call()
|
|
60
60
|
await drv.wait_status("running")
|
|
61
|
-
assert drv.run["dispatching"]["trigger"] == "send
|
|
61
|
+
assert drv.run["dispatching"]["trigger"] == "message-send"
|
|
62
62
|
assert dispatching_ids(drv.replica) == ["m1"]
|
|
63
63
|
assert queue_ids(drv.replica, "queue") == []
|
|
64
64
|
assert residence(drv, "m1") == ["dispatching"]
|
|
@@ -119,7 +119,7 @@ async def test_edit_replacement_rides_dispatching_until_ack():
|
|
|
119
119
|
async with run_host(script, capabilities=("rewind",)) as (drv, host):
|
|
120
120
|
seq = drv.post("run/edit", edit_params("u1", msg("u2"), anchor=None))
|
|
121
121
|
rerun = await script.next_call()
|
|
122
|
-
assert rerun.ctx.trigger == "edit
|
|
122
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
123
123
|
await drv.wait_status("running")
|
|
124
124
|
assert dispatching_ids(drv.replica) == ["u2"]
|
|
125
125
|
host.live.state["messages"] = [msg("u2")]
|
|
@@ -19,7 +19,7 @@ async def test_edit_of_dispatched_item_stops_rewinds_reruns(command):
|
|
|
19
19
|
await drv.wait_status("running")
|
|
20
20
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
21
21
|
rerun = await script.next_call()
|
|
22
|
-
assert rerun.ctx.trigger == "edit
|
|
22
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
23
23
|
assert [m["parts"][0]["text"] for m in rerun.ctx.messages] == ["edited"]
|
|
24
24
|
assert rerun.ctx.has_rollback
|
|
25
25
|
assert rerun.ctx.rollback_to == "p0"
|
|
@@ -54,7 +54,7 @@ async def test_edit_of_dispatched_non_leaf_stops_and_reruns(command):
|
|
|
54
54
|
seq = drv.post(command, target(message=msg("m1", "edited")))
|
|
55
55
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
56
56
|
rerun = await script.next_call()
|
|
57
|
-
assert rerun.ctx.trigger == "edit
|
|
57
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
58
58
|
assert [m["parts"][0]["text"] for m in rerun.ctx.messages] == ["edited"]
|
|
59
59
|
rerun.ack()
|
|
60
60
|
rerun.finish(RunManager.Stop(dispatch_queue=False))
|
|
@@ -72,7 +72,7 @@ async def test_edit_of_dispatched_item_with_queued_items_stops_and_reruns():
|
|
|
72
72
|
seq = drv.post("run/enqueue", target(message=msg("m1", "edited")))
|
|
73
73
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
74
74
|
rerun = await script.next_call()
|
|
75
|
-
assert rerun.ctx.trigger == "edit
|
|
75
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
76
76
|
rerun.ack()
|
|
77
77
|
rerun.finish(RunManager.Stop(dispatch_queue=False))
|
|
78
78
|
assert (await drv.res(seq))["type"] == "accepted"
|
|
@@ -90,5 +90,5 @@ async def test_edit_of_dispatched_item_in_error_reruns_without_stop():
|
|
|
90
90
|
await drv.wait_status("error")
|
|
91
91
|
drv.post("run/enqueue", target(message=msg("m1", "edited")))
|
|
92
92
|
rerun = await script.next_call()
|
|
93
|
-
assert rerun.ctx.trigger == "edit
|
|
93
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
94
94
|
assert rerun.ctx.rollback_to is None
|
|
@@ -27,7 +27,7 @@ async def test_edit_in_ready_dispatches_message_edit():
|
|
|
27
27
|
async with run_host(script, capabilities=("rewind",)) as (drv, host):
|
|
28
28
|
drv.post("run/edit", edit_params("u1", msg("u2", "v2"), anchor=None))
|
|
29
29
|
call = await script.next_call()
|
|
30
|
-
assert call.ctx.trigger == "edit
|
|
30
|
+
assert call.ctx.trigger == "message-edit"
|
|
31
31
|
assert [m["id"] for m in call.ctx.messages] == ["u2"]
|
|
32
32
|
assert call.ctx.has_rollback
|
|
33
33
|
assert call.ctx.rollback_to is None
|
|
@@ -71,7 +71,7 @@ async def test_deep_edit_with_queue_non_empty_reruns_and_keeps_queue():
|
|
|
71
71
|
await drv.wait_status("error")
|
|
72
72
|
drv.post("run/edit", edit_params("u1", msg("u2"), anchor=None))
|
|
73
73
|
rerun = await script.next_call()
|
|
74
|
-
assert rerun.ctx.trigger == "edit
|
|
74
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
75
75
|
assert rerun.ctx.rollback_to is None
|
|
76
76
|
assert [item["id"] for item in drv.run["queue"]] == ["m2"]
|
|
77
77
|
|
|
@@ -88,7 +88,7 @@ async def test_leaf_edit_in_error_accepted_with_queue_non_empty():
|
|
|
88
88
|
await drv.wait_status("error")
|
|
89
89
|
drv.post("run/edit", edit_params("m1", msg("u2"), anchor=None))
|
|
90
90
|
call = await script.next_call()
|
|
91
|
-
assert call.ctx.trigger == "edit
|
|
91
|
+
assert call.ctx.trigger == "message-edit"
|
|
92
92
|
assert call.ctx.rollback_to is None
|
|
93
93
|
assert [item["id"] for item in drv.run["queue"]] == ["m2"]
|
|
94
94
|
|
|
@@ -140,7 +140,7 @@ async def test_reload_dispatches_with_empty_messages():
|
|
|
140
140
|
async with run_host(script, capabilities=("rewind",)) as (drv, host):
|
|
141
141
|
drv.post("run/reload", reload_params("a1", anchor="u1"))
|
|
142
142
|
call = await script.next_call()
|
|
143
|
-
assert call.ctx.trigger == "reload
|
|
143
|
+
assert call.ctx.trigger == "message-reload"
|
|
144
144
|
assert call.ctx.messages == ()
|
|
145
145
|
assert call.ctx.rollback_to == "u1"
|
|
146
146
|
call.ack()
|
|
@@ -205,7 +205,7 @@ async def test_deep_reload_with_queue_non_empty_reruns_and_keeps_queue():
|
|
|
205
205
|
await drv.wait_status("error")
|
|
206
206
|
drv.post("run/reload", reload_params("a0", anchor="u0"))
|
|
207
207
|
call = await script.next_call()
|
|
208
|
-
assert call.ctx.trigger == "reload
|
|
208
|
+
assert call.ctx.trigger == "message-reload"
|
|
209
209
|
assert call.ctx.rollback_to == "u0"
|
|
210
210
|
assert [item["id"] for item in drv.run["queue"]] == ["m2"]
|
|
211
211
|
|
|
@@ -260,7 +260,7 @@ async def test_edit_anchor_assertion():
|
|
|
260
260
|
script.no_call()
|
|
261
261
|
drv.post("run/edit", edit_params("u1", msg("u2"), anchor=None))
|
|
262
262
|
call = await script.next_call()
|
|
263
|
-
assert call.ctx.trigger == "edit
|
|
263
|
+
assert call.ctx.trigger == "message-edit"
|
|
264
264
|
assert call.ctx.rollback_to is None
|
|
265
265
|
|
|
266
266
|
|
|
@@ -283,5 +283,5 @@ async def test_reload_anchor_assertion():
|
|
|
283
283
|
script.no_call()
|
|
284
284
|
drv.post("run/reload", reload_params("a1", anchor="u1"))
|
|
285
285
|
call = await script.next_call()
|
|
286
|
-
assert call.ctx.trigger == "reload
|
|
286
|
+
assert call.ctx.trigger == "message-reload"
|
|
287
287
|
assert call.ctx.rollback_to == "u1"
|
|
@@ -9,7 +9,7 @@ async def test_ready_add_dispatches_message_send():
|
|
|
9
9
|
async with run_host(script) as (drv, host):
|
|
10
10
|
seq = drv.post("run/enqueue", add("m1"))
|
|
11
11
|
call = await script.next_call()
|
|
12
|
-
assert call.ctx.trigger == "send
|
|
12
|
+
assert call.ctx.trigger == "message-send"
|
|
13
13
|
assert [m["id"] for m in call.ctx.messages] == ["m1"]
|
|
14
14
|
assert not call.ctx.has_rollback
|
|
15
15
|
await drv.wait_status("running")
|
|
@@ -31,7 +31,7 @@ async def test_running_add_becomes_queue_item():
|
|
|
31
31
|
script.no_call()
|
|
32
32
|
call.finish(RunManager.Complete())
|
|
33
33
|
drain = await script.next_call()
|
|
34
|
-
assert drain.ctx.trigger == "send
|
|
34
|
+
assert drain.ctx.trigger == "message-send"
|
|
35
35
|
assert [m["id"] for m in drain.ctx.messages] == ["m2"]
|
|
36
36
|
drain.ack()
|
|
37
37
|
drain.finish(RunManager.Complete())
|
|
@@ -69,7 +69,7 @@ async def test_steer_lane_drains_first_and_whole():
|
|
|
69
69
|
await drv.command("run/steer", add("s2"), terminal=False)
|
|
70
70
|
call.finish(RunManager.Complete())
|
|
71
71
|
steered = await script.next_call()
|
|
72
|
-
assert steered.ctx.trigger == "send
|
|
72
|
+
assert steered.ctx.trigger == "message-send"
|
|
73
73
|
assert [m["id"] for m in steered.ctx.messages] == ["s1", "s2"]
|
|
74
74
|
steered.ack()
|
|
75
75
|
steered.finish(RunManager.Complete())
|
|
@@ -322,7 +322,7 @@ async def test_edit_while_parked_clears_requests_and_reruns():
|
|
|
322
322
|
await park(drv, script, [tool_call("r1")], anchor="a1")
|
|
323
323
|
drv.post("run/edit", edit_params("u1", msg("u2"), anchor=None))
|
|
324
324
|
rerun = await script.next_call()
|
|
325
|
-
assert rerun.ctx.trigger == "edit
|
|
325
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
326
326
|
assert rerun.ctx.rollback_to is None
|
|
327
327
|
await drv.wait(lambda s: "inputRequests" not in run_of(s))
|
|
328
328
|
rerun.ack()
|
|
@@ -337,7 +337,7 @@ async def test_reload_while_parked_clears_requests_and_reruns():
|
|
|
337
337
|
await park(drv, script, [tool_call("r1")], anchor="a1")
|
|
338
338
|
drv.post("run/reload", reload_params("a1", anchor="u1"))
|
|
339
339
|
rerun = await script.next_call()
|
|
340
|
-
assert rerun.ctx.trigger == "reload
|
|
340
|
+
assert rerun.ctx.trigger == "message-reload"
|
|
341
341
|
assert rerun.ctx.rollback_to == "u1"
|
|
342
342
|
await drv.wait(lambda s: "inputRequests" not in run_of(s))
|
|
343
343
|
rerun.ack()
|
|
@@ -351,7 +351,7 @@ async def test_steer_add_while_parked_abandons_input_and_dispatches():
|
|
|
351
351
|
await park(drv, script, [tool_call("r1"), approval("r2")])
|
|
352
352
|
drv.post("run/steer", add("s1"))
|
|
353
353
|
run = await script.next_call()
|
|
354
|
-
assert run.ctx.trigger == "send
|
|
354
|
+
assert run.ctx.trigger == "message-send"
|
|
355
355
|
assert [m["id"] for m in run.ctx.messages] == ["s1"]
|
|
356
356
|
assert run.ctx.input_outcomes == (
|
|
357
357
|
(tool_call("r1"), None, None),
|
|
@@ -394,7 +394,7 @@ async def test_promote_to_steer_while_parked_abandons_input_and_dispatches():
|
|
|
394
394
|
script.no_call()
|
|
395
395
|
await drv.command("run/steer", target(messageId="m2"))
|
|
396
396
|
run = await script.next_call()
|
|
397
|
-
assert run.ctx.trigger == "send
|
|
397
|
+
assert run.ctx.trigger == "message-send"
|
|
398
398
|
assert [m["id"] for m in run.ctx.messages] == ["m2"]
|
|
399
399
|
assert run.ctx.input_outcomes == ((tool_call("r1"), None, None),)
|
|
400
400
|
assert "inputRequests" not in drv.run
|
|
@@ -434,7 +434,7 @@ async def test_steer_add_with_partial_answers_hands_over_the_answered_subset():
|
|
|
434
434
|
)
|
|
435
435
|
drv.post("run/steer", add("s1"))
|
|
436
436
|
run = await script.next_call()
|
|
437
|
-
assert run.ctx.trigger == "send
|
|
437
|
+
assert run.ctx.trigger == "message-send"
|
|
438
438
|
assert [m["id"] for m in run.ctx.messages] == ["s1"]
|
|
439
439
|
assert run.ctx.input_outcomes == (
|
|
440
440
|
(tool_call("r1"), {"output": "ok"}, None),
|
|
@@ -137,7 +137,7 @@ async def test_edit_meta_rides_the_replacement_message():
|
|
|
137
137
|
edit_params("u1", msg("u2", "v2"), anchor=None, meta={"edited": True}),
|
|
138
138
|
)
|
|
139
139
|
call = await script.next_call()
|
|
140
|
-
assert call.ctx.trigger == "edit
|
|
140
|
+
assert call.ctx.trigger == "message-edit"
|
|
141
141
|
assert call.ctx.meta("u2") == {"edited": True}
|
|
142
142
|
assert "meta" not in call.ctx.messages[0]
|
|
143
143
|
assert call.ctx.meta() is None
|
|
@@ -151,7 +151,7 @@ async def test_reload_meta_rides_the_start_root():
|
|
|
151
151
|
async with run_host(script, capabilities=("rewind",)) as (drv, _):
|
|
152
152
|
drv.post("run/reload", reload_params("a1", anchor="u1", meta={"retry": 1}))
|
|
153
153
|
call = await script.next_call()
|
|
154
|
-
assert call.ctx.trigger == "reload
|
|
154
|
+
assert call.ctx.trigger == "message-reload"
|
|
155
155
|
assert call.ctx.meta() == {"retry": 1}
|
|
156
156
|
call.ack()
|
|
157
157
|
call.finish(RunManager.Complete())
|
|
@@ -13,7 +13,7 @@ async def test_register_overwrites_whatever_is_in_the_state():
|
|
|
13
13
|
"error": {"message": "old"},
|
|
14
14
|
"queue": [msg("q1")],
|
|
15
15
|
"steerQueue": [msg("s1")],
|
|
16
|
-
"dispatch": {"type": "send
|
|
16
|
+
"dispatch": {"type": "message-send", "messages": [msg("m1")]},
|
|
17
17
|
}
|
|
18
18
|
async with run_host(script, initial_runs=stale) as (drv, host):
|
|
19
19
|
assert drv.replica == {"status": "ready", "runs": []}
|
|
@@ -94,7 +94,7 @@ async def test_prepare_message_applies_to_edit():
|
|
|
94
94
|
) as (drv, host):
|
|
95
95
|
drv.post("run/edit", edit_params("u1", noisy("u2"), anchor=None))
|
|
96
96
|
call = await script.next_call()
|
|
97
|
-
assert call.ctx.trigger == "edit
|
|
97
|
+
assert call.ctx.trigger == "message-edit"
|
|
98
98
|
assert [m["parts"] for m in call.ctx.messages] == [
|
|
99
99
|
[{"type": "text", "text": "u2"}]
|
|
100
100
|
]
|
|
@@ -89,7 +89,7 @@ async def test_steer_while_hydrated_abandons_input_and_dispatches():
|
|
|
89
89
|
):
|
|
90
90
|
drv.post("run/steer", add("s1"))
|
|
91
91
|
run = await script.next_call()
|
|
92
|
-
assert run.ctx.trigger == "send
|
|
92
|
+
assert run.ctx.trigger == "message-send"
|
|
93
93
|
assert [m["id"] for m in run.ctx.messages] == ["s1"]
|
|
94
94
|
assert run.ctx.input_outcomes == ((tool_call("r1"), None, None),)
|
|
95
95
|
await drv.wait_status("running")
|
|
@@ -114,7 +114,7 @@ async def test_malformed_restore_states_raise():
|
|
|
114
114
|
({"runs": [parked_entry(error={"message": "x"})]}, "error"),
|
|
115
115
|
({"runs": [parked_entry(error=None)]}, "error"),
|
|
116
116
|
({"runs": [parked_entry(stopping={"reason": "stop"})]}, "stopping"),
|
|
117
|
-
({"runs": [parked_entry(nextDispatch={"trigger": "edit
|
|
117
|
+
({"runs": [parked_entry(nextDispatch={"trigger": "message-edit"})]}, "nextDispatch"),
|
|
118
118
|
({"runs": [parked_entry(inputRequests=[])]}, "non-empty list"),
|
|
119
119
|
({"runs": [parked_entry(inputRequests=["nope"])]}, "objects"),
|
|
120
120
|
(
|
|
@@ -33,7 +33,7 @@ async def test_running_leaf_edit_stops_settles_then_rewinds():
|
|
|
33
33
|
await drv.wait_status("running")
|
|
34
34
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
35
35
|
rerun = await script.next_call()
|
|
36
|
-
assert rerun.ctx.trigger == "edit
|
|
36
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
37
37
|
assert [m["id"] for m in rerun.ctx.messages] == ["m2"]
|
|
38
38
|
assert rerun.ctx.rollback_to is None
|
|
39
39
|
rerun.ack()
|
|
@@ -50,7 +50,7 @@ async def test_running_leaf_edit_accepted_with_non_empty_queues():
|
|
|
50
50
|
seq = drv.post("run/edit", edit_params("m1", msg("m2"), anchor=None))
|
|
51
51
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
52
52
|
rerun = await script.next_call()
|
|
53
|
-
assert rerun.ctx.trigger == "edit
|
|
53
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
54
54
|
rerun.ack()
|
|
55
55
|
rerun.finish(RunManager.Stop(dispatch_queue=False))
|
|
56
56
|
assert (await drv.res(seq))["type"] == "accepted"
|
|
@@ -67,7 +67,7 @@ async def test_running_leaf_reload_stops_settles_then_rewinds():
|
|
|
67
67
|
await asyncio.wait_for(call.ctx.stop_requested.wait(), 5)
|
|
68
68
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
69
69
|
rerun = await script.next_call()
|
|
70
|
-
assert rerun.ctx.trigger == "reload
|
|
70
|
+
assert rerun.ctx.trigger == "message-reload"
|
|
71
71
|
assert rerun.ctx.rollback_to == "m1"
|
|
72
72
|
rerun.ack()
|
|
73
73
|
rerun.finish(RunManager.Stop(dispatch_queue=False))
|
|
@@ -97,7 +97,7 @@ async def test_running_non_leaf_edit_stops_settles_then_rewinds():
|
|
|
97
97
|
await asyncio.wait_for(call.ctx.stop_requested.wait(), 5)
|
|
98
98
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
99
99
|
rerun = await script.next_call()
|
|
100
|
-
assert rerun.ctx.trigger == "edit
|
|
100
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
101
101
|
assert [m["id"] for m in rerun.ctx.messages] == ["m2"]
|
|
102
102
|
assert rerun.ctx.rollback_to is None
|
|
103
103
|
rerun.ack()
|
|
@@ -113,7 +113,7 @@ async def test_running_non_leaf_reload_stops_settles_then_rewinds():
|
|
|
113
113
|
await asyncio.wait_for(call.ctx.stop_requested.wait(), 5)
|
|
114
114
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
115
115
|
rerun = await script.next_call()
|
|
116
|
-
assert rerun.ctx.trigger == "reload
|
|
116
|
+
assert rerun.ctx.trigger == "message-reload"
|
|
117
117
|
assert rerun.ctx.rollback_to == "m1"
|
|
118
118
|
rerun.ack()
|
|
119
119
|
rerun.finish(RunManager.Stop(dispatch_queue=False))
|
|
@@ -142,5 +142,5 @@ async def test_leaf_reload_in_error_accepted_with_non_empty_queue():
|
|
|
142
142
|
await drv.wait_status("error")
|
|
143
143
|
drv.post("run/reload", reload_params("a1", anchor="m1"))
|
|
144
144
|
rerun = await script.next_call()
|
|
145
|
-
assert rerun.ctx.trigger == "reload
|
|
145
|
+
assert rerun.ctx.trigger == "message-reload"
|
|
146
146
|
assert queue_ids(drv.replica, "queue") == ["q1"]
|
|
@@ -176,7 +176,7 @@ async def test_rewind_edit_settles_at_its_dispatch():
|
|
|
176
176
|
async with run_host(script, capabilities=("rewind",)) as (drv, host):
|
|
177
177
|
seq = drv.post("run/edit", edit_params("u1", msg("u2"), anchor=None))
|
|
178
178
|
rerun = await script.next_call()
|
|
179
|
-
assert rerun.ctx.trigger == "edit
|
|
179
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
180
180
|
assert (await drv.res(seq))["type"] == "accepted"
|
|
181
181
|
rerun.ack()
|
|
182
182
|
rerun.finish(RunManager.Complete())
|
|
@@ -9,7 +9,7 @@ async def test_ready_steer_add_dispatches_like_enqueue():
|
|
|
9
9
|
async with run_host(script) as (drv, host):
|
|
10
10
|
drv.post("run/steer", add("m1"))
|
|
11
11
|
call = await script.next_call()
|
|
12
|
-
assert call.ctx.trigger == "send
|
|
12
|
+
assert call.ctx.trigger == "message-send"
|
|
13
13
|
assert [m["id"] for m in call.ctx.messages] == ["m1"]
|
|
14
14
|
|
|
15
15
|
|
|
@@ -33,7 +33,7 @@ async def test_stop_outcome_can_keep_the_queue_draining():
|
|
|
33
33
|
await drv.stop(terminal=False)
|
|
34
34
|
call.finish(RunManager.Stop(dispatch_queue=True))
|
|
35
35
|
drain = await script.next_call()
|
|
36
|
-
assert drain.ctx.trigger == "send
|
|
36
|
+
assert drain.ctx.trigger == "message-send"
|
|
37
37
|
assert [m["id"] for m in drain.ctx.messages] == ["m2"]
|
|
38
38
|
await drv.wait_status("running")
|
|
39
39
|
|
|
@@ -89,10 +89,10 @@ async def test_mid_run_edit_stages_the_window_and_promotes_in_one_envelope():
|
|
|
89
89
|
await asyncio.wait_for(call.ctx.stop_requested.wait(), 5)
|
|
90
90
|
await drv.wait(lambda s: "stopping" in (s["runs"] or [{}])[0])
|
|
91
91
|
assert drv.replica["status"] == "running"
|
|
92
|
-
assert drv.run["stopping"] == {"reason": "edit
|
|
92
|
+
assert drv.run["stopping"] == {"reason": "message-edit"}
|
|
93
93
|
staged = drv.run["nextDispatch"]
|
|
94
94
|
assert staged == {
|
|
95
|
-
"trigger": "edit
|
|
95
|
+
"trigger": "message-edit",
|
|
96
96
|
"messages": [msg("m2")],
|
|
97
97
|
"rollbackTo": "p0",
|
|
98
98
|
}
|
|
@@ -101,12 +101,12 @@ async def test_mid_run_edit_stages_the_window_and_promotes_in_one_envelope():
|
|
|
101
101
|
for env, state in states(drv)
|
|
102
102
|
if any(r["seq"] == seq for r in env.get("res", []))
|
|
103
103
|
)
|
|
104
|
-
assert window_of(opened) == ({"reason": "edit
|
|
104
|
+
assert window_of(opened) == ({"reason": "message-edit"}, staged)
|
|
105
105
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
106
106
|
rerun = await script.next_call()
|
|
107
|
-
assert rerun.ctx.trigger == "edit
|
|
107
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
108
108
|
assert rerun.ctx.rollback_to == "p0"
|
|
109
|
-
await drv.wait(lambda s: (s["runs"][0].get("dispatching") or {}).get("trigger") == "edit
|
|
109
|
+
await drv.wait(lambda s: (s["runs"][0].get("dispatching") or {}).get("trigger") == "message-edit")
|
|
110
110
|
trail = [
|
|
111
111
|
(window_of(state), (state["runs"] or [{}])[0].get("dispatching"))
|
|
112
112
|
for _, state in states(drv)
|
|
@@ -114,11 +114,11 @@ async def test_mid_run_edit_stages_the_window_and_promotes_in_one_envelope():
|
|
|
114
114
|
promoted = next(
|
|
115
115
|
i
|
|
116
116
|
for i, (_, record) in enumerate(trail)
|
|
117
|
-
if record is not None and record["trigger"] == "edit
|
|
117
|
+
if record is not None and record["trigger"] == "message-edit"
|
|
118
118
|
)
|
|
119
119
|
assert trail[promoted][0] == (None, None)
|
|
120
120
|
assert trail[promoted][1] == staged
|
|
121
|
-
assert trail[promoted - 1][0] == ({"reason": "edit
|
|
121
|
+
assert trail[promoted - 1][0] == ({"reason": "message-edit"}, staged)
|
|
122
122
|
assert (await drv.res(seq))["type"] == "accepted"
|
|
123
123
|
rerun.ack()
|
|
124
124
|
rerun.finish(RunManager.Complete())
|
|
@@ -134,16 +134,16 @@ async def test_mid_run_reload_stages_reason_and_empty_messages():
|
|
|
134
134
|
call = await start_run(drv, script)
|
|
135
135
|
seq = drv.post("run/reload", reload_params("a1", anchor="m1", meta={"retry": 1}))
|
|
136
136
|
await drv.wait(lambda s: "stopping" in (s["runs"] or [{}])[0])
|
|
137
|
-
assert drv.run["stopping"] == {"reason": "reload
|
|
137
|
+
assert drv.run["stopping"] == {"reason": "message-reload"}
|
|
138
138
|
assert drv.run["nextDispatch"] == {
|
|
139
|
-
"trigger": "reload
|
|
139
|
+
"trigger": "message-reload",
|
|
140
140
|
"messages": [],
|
|
141
141
|
"rollbackTo": "m1",
|
|
142
142
|
"rootMeta": {"retry": 1},
|
|
143
143
|
}
|
|
144
144
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
145
145
|
rerun = await script.next_call()
|
|
146
|
-
assert rerun.ctx.trigger == "reload
|
|
146
|
+
assert rerun.ctx.trigger == "message-reload"
|
|
147
147
|
assert rerun.ctx.meta() == {"retry": 1}
|
|
148
148
|
await drv.wait(lambda s: "stopping" not in (s["runs"] or [{}])[0])
|
|
149
149
|
assert drv.run["dispatching"]["rootMeta"] == {"retry": 1}
|
|
@@ -163,15 +163,15 @@ async def test_edit_of_dispatched_message_opens_the_window(command):
|
|
|
163
163
|
seq = drv.post(command, target(message=msg("m1", "edited")))
|
|
164
164
|
await drv.wait(lambda s: "stopping" in (s["runs"] or [{}])[0])
|
|
165
165
|
assert drv.replica["status"] == "running"
|
|
166
|
-
assert drv.run["stopping"] == {"reason": "edit
|
|
166
|
+
assert drv.run["stopping"] == {"reason": "message-edit"}
|
|
167
167
|
assert drv.run["nextDispatch"] == {
|
|
168
|
-
"trigger": "edit
|
|
168
|
+
"trigger": "message-edit",
|
|
169
169
|
"messages": [msg("m1", "edited")],
|
|
170
170
|
"rollbackTo": "p0",
|
|
171
171
|
}
|
|
172
172
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
173
173
|
rerun = await script.next_call()
|
|
174
|
-
assert rerun.ctx.trigger == "edit
|
|
174
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
175
175
|
assert rerun.ctx.rollback_to == "p0"
|
|
176
176
|
assert (await drv.res(seq))["type"] == "accepted"
|
|
177
177
|
rerun.ack()
|
|
@@ -190,12 +190,12 @@ async def test_later_rewind_supersedes_the_staged_one():
|
|
|
190
190
|
second = drv.post("run/reload", reload_params("a1", anchor="m1"))
|
|
191
191
|
assert_rejected(await drv.res(first), "superseded")
|
|
192
192
|
await drv.wait(
|
|
193
|
-
lambda s: s["runs"][0]["nextDispatch"]["trigger"] == "reload
|
|
193
|
+
lambda s: s["runs"][0]["nextDispatch"]["trigger"] == "message-reload"
|
|
194
194
|
)
|
|
195
|
-
assert drv.run["stopping"] == {"reason": "reload
|
|
195
|
+
assert drv.run["stopping"] == {"reason": "message-reload"}
|
|
196
196
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
197
197
|
rerun = await script.next_call()
|
|
198
|
-
assert rerun.ctx.trigger == "reload
|
|
198
|
+
assert rerun.ctx.trigger == "message-reload"
|
|
199
199
|
assert (await drv.res(second))["type"] == "accepted"
|
|
200
200
|
rerun.ack()
|
|
201
201
|
rerun.finish(RunManager.Complete())
|
|
@@ -235,7 +235,7 @@ async def test_sends_during_the_window_park_in_their_lanes():
|
|
|
235
235
|
assert queue_ids(drv.replica, "steerQueue") == ["s1"]
|
|
236
236
|
call.finish(RunManager.Stop(dispatch_queue=False))
|
|
237
237
|
rerun = await script.next_call()
|
|
238
|
-
assert rerun.ctx.trigger == "edit
|
|
238
|
+
assert rerun.ctx.trigger == "message-edit"
|
|
239
239
|
assert (await drv.res(seq))["type"] == "accepted"
|
|
240
240
|
assert queue_ids(drv.replica, "queue") == ["q1"]
|
|
241
241
|
assert queue_ids(drv.replica, "steerQueue") == ["s1"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|