harness-sdk-python 0.16.0__tar.gz → 0.17.0__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 (37) hide show
  1. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/PKG-INFO +2 -2
  2. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/examples/runs_app.py +15 -17
  3. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/pyproject.toml +2 -2
  4. harness_sdk_python-0.17.0/src/harness_sdk/__init__.py +9 -0
  5. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/src/harness_sdk/run_manager.py +475 -344
  6. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/run_helpers.py +40 -32
  7. harness_sdk_python-0.17.0/tests/test_durability.py +306 -0
  8. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_enqueue.py +3 -11
  9. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_fenced_postgres.py +51 -14
  10. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_input_required.py +8 -8
  11. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_outcomes.py +33 -32
  12. harness_sdk_python-0.17.0/tests/test_restore.py +124 -0
  13. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_rewind_during_run.py +2 -10
  14. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_settle.py +28 -4
  15. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_stop_continue.py +6 -5
  16. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_stopping_window.py +37 -29
  17. harness_sdk_python-0.16.0/src/harness_sdk/__init__.py +0 -11
  18. harness_sdk_python-0.16.0/src/harness_sdk/run_trays.py +0 -363
  19. harness_sdk_python-0.16.0/tests/test_restore.py +0 -177
  20. harness_sdk_python-0.16.0/tests/test_run_tray_durability.py +0 -339
  21. harness_sdk_python-0.16.0/tests/test_run_trays.py +0 -544
  22. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/.gitignore +0 -0
  23. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/README.md +0 -0
  24. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/examples/__init__.py +0 -0
  25. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/src/harness_sdk/fenced_postgres.py +0 -0
  26. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/src/harness_sdk/linear_thread.py +0 -0
  27. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_applied_visibility.py +0 -0
  28. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_batches.py +0 -0
  29. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_branch_anchor.py +0 -0
  30. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_dispatching.py +0 -0
  31. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_edit_dispatched.py +0 -0
  32. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_edit_reload.py +0 -0
  33. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_linear_thread.py +0 -0
  34. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_meta.py +0 -0
  35. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_placement.py +0 -0
  36. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_prepare_hooks.py +0 -0
  37. {harness_sdk_python-0.16.0 → harness_sdk_python-0.17.0}/tests/test_steer.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: harness-sdk-python
3
- Version: 0.16.0
3
+ Version: 0.17.0
4
4
  Summary: RunManager: the harness-sdk runs subsystem for Python Statewire hosts
5
5
  Project-URL: Repository, https://github.com/assistant-ui/harness-sdk
6
6
  License-Expression: MIT
7
7
  Requires-Python: <4.0,>=3.12
8
- Requires-Dist: pinned<0.11,>=0.10.0
8
+ Requires-Dist: pinned<0.12,>=0.11.0
9
9
  Requires-Dist: statewire<0.10,>=0.9.0
10
10
  Provides-Extra: deepagents
11
11
  Requires-Dist: deepagents>=0.6.12; extra == 'deepagents'
@@ -20,10 +20,11 @@ from typing import Any
20
20
  from fastapi import FastAPI
21
21
  from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
22
22
  from pinned import PinnedHost, PinnedWorker
23
+ from pinned.testing import MemoryStateStore
23
24
  from statewire import Statewire, command, plain
24
25
  from statewire.langgraph import append_langgraph_event
25
26
 
26
- from harness_sdk import RunManager, linear_thread
27
+ from harness_sdk import RunManager, linear_thread, run_manager
27
28
 
28
29
 
29
30
  def select_model() -> str:
@@ -81,19 +82,15 @@ class RunsHost(Statewire):
81
82
  role=lambda m: "user" if m["type"] == "human" else "assistant",
82
83
  )
83
84
  self.turn = 0
84
- self.runs = RunManager(
85
- state=self.state,
86
- run=self.run,
87
- thread=self.thread,
88
- create_task=self.create_task,
89
- schedule=self.schedule,
90
- capabilities=("rewind",),
91
- )
92
85
  yield
93
86
 
87
+ async def get_message_meta(self, message_id: str | None) -> dict[str, Any] | None:
88
+ return await self.thread.get_message_meta(message_id)
89
+
94
90
  async def get_message_child_id(self, parent_id: str) -> str | None:
95
91
  return await self.thread.get_message_child_id(parent_id)
96
92
 
93
+ @run_manager(capabilities=("rewind",))
97
94
  async def run(self, ctx: RunManager.RunContext) -> Any:
98
95
  if ctx.has_rollback:
99
96
  self.truncate(ctx.rollback_to)
@@ -158,38 +155,39 @@ class RunsHost(Statewire):
158
155
 
159
156
  @command("run/enqueue")
160
157
  async def run_enqueue(self, params, *, ctx):
161
- return await self.runs.enqueue(params, applied=ctx.applied)
158
+ return await (await self.run.get()).enqueue(params, applied=ctx.applied)
162
159
 
163
160
  @command("run/steer")
164
161
  async def run_steer(self, params, *, ctx):
165
- return await self.runs.steer(params, applied=ctx.applied)
162
+ return await (await self.run.get()).steer(params, applied=ctx.applied)
166
163
 
167
164
  @command("run/dequeue")
168
165
  async def run_dequeue(self, params):
169
- return await self.runs.dequeue(params)
166
+ return await (await self.run.get()).dequeue(params)
170
167
 
171
168
  @command("run/edit")
172
169
  async def run_edit(self, params, *, ctx):
173
- return await self.runs.edit(params, applied=ctx.applied)
170
+ return await (await self.run.get()).edit(params, applied=ctx.applied)
174
171
 
175
172
  @command("run/reload")
176
173
  async def run_reload(self, params, *, ctx):
177
- return await self.runs.reload(params, applied=ctx.applied)
174
+ return await (await self.run.get()).reload(params, applied=ctx.applied)
178
175
 
179
176
  @command("run/stop")
180
177
  async def run_stop(self, params=None, *, ctx):
181
- return await self.runs.stop(params, applied=ctx.applied)
178
+ return await (await self.run.get()).stop(params, applied=ctx.applied)
182
179
 
183
180
  @command("run/continue")
184
181
  async def run_continue(self, params=None, *, ctx):
185
- return await self.runs.continue_run(applied=ctx.applied)
182
+ return await (await self.run.get()).continue_run(applied=ctx.applied)
186
183
 
187
184
  @command("run/input")
188
185
  async def run_input(self, params):
189
- return await self.runs.input(params)
186
+ return await (await self.run.get()).input(params)
190
187
 
191
188
 
192
189
  worker = PinnedWorker(
190
+ state_store=MemoryStateStore(),
193
191
  pinboard_url=os.environ.get("PINBOARD_URL"),
194
192
  token=os.environ.get("PINBOARD_TOKEN"),
195
193
  advertise_url=os.environ.get("ADVERTISE_URL"),
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "harness-sdk-python"
3
- version = "0.16.0"
3
+ version = "0.17.0"
4
4
  description = "RunManager: the harness-sdk runs subsystem for Python Statewire hosts"
5
5
  readme = "README.md"
6
6
  license = "MIT"
7
7
  requires-python = ">=3.12,<4.0"
8
- dependencies = ["statewire>=0.9.0,<0.10", "pinned>=0.10.0,<0.11"]
8
+ dependencies = ["statewire>=0.9.0,<0.10", "pinned>=0.11.0,<0.12"]
9
9
 
10
10
  [project.optional-dependencies]
11
11
  postgres = ["langgraph-checkpoint-postgres>=2.0.0"]
@@ -0,0 +1,9 @@
1
+ from .linear_thread import linear_thread
2
+ from .run_manager import RunManager, RunManagerDescriptor, run_manager
3
+
4
+ __all__ = [
5
+ "RunManager",
6
+ "RunManagerDescriptor",
7
+ "linear_thread",
8
+ "run_manager",
9
+ ]