@steerable/runtime-darwin-arm64 0.10.2 → 0.11.0

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 (29) hide show
  1. package/package.json +1 -1
  2. package/python-runtime/manifest.json +1 -1
  3. package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_harness-0.10.2.dist-info → steerable_agent_harness-0.11.0.dist-info}/METADATA +1 -1
  4. package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_harness-0.10.2.dist-info → steerable_agent_harness-0.11.0.dist-info}/RECORD +7 -7
  5. package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_protocol-0.10.2.dist-info → steerable_agent_protocol-0.11.0.dist-info}/METADATA +1 -1
  6. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.11.0.dist-info/RECORD +11 -0
  7. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/__init__.py +12 -0
  8. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/orchestration.py +374 -35
  9. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/peer.py +192 -0
  10. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/pool.py +96 -2
  11. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/subagent.py +27 -8
  12. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/team_board.py +229 -0
  13. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/tree.py +155 -0
  14. package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_runtime-0.10.2.dist-info → steerable_agent_runtime-0.11.0.dist-info}/METADATA +32 -1
  15. package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_runtime-0.10.2.dist-info → steerable_agent_runtime-0.11.0.dist-info}/RECORD +17 -11
  16. package/python-runtime/python/lib/python3.12/site-packages/steerable_sidecar/sidecar.py +49 -1
  17. package/python-runtime/python/lib/python3.12/site-packages/{steerable_sidecar-0.10.2.dist-info → steerable_sidecar-0.11.0.dist-info}/METADATA +25 -1
  18. package/python-runtime/python/lib/python3.12/site-packages/{steerable_sidecar-0.10.2.dist-info → steerable_sidecar-0.11.0.dist-info}/RECORD +9 -9
  19. package/runtime.json +44 -32
  20. package/python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.10.2.dist-info/RECORD +0 -11
  21. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_harness-0.10.2.dist-info → steerable_agent_harness-0.11.0.dist-info}/INSTALLER +0 -0
  22. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_harness-0.10.2.dist-info → steerable_agent_harness-0.11.0.dist-info}/WHEEL +0 -0
  23. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_protocol-0.10.2.dist-info → steerable_agent_protocol-0.11.0.dist-info}/INSTALLER +0 -0
  24. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_protocol-0.10.2.dist-info → steerable_agent_protocol-0.11.0.dist-info}/WHEEL +0 -0
  25. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_runtime-0.10.2.dist-info → steerable_agent_runtime-0.11.0.dist-info}/INSTALLER +0 -0
  26. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_agent_runtime-0.10.2.dist-info → steerable_agent_runtime-0.11.0.dist-info}/WHEEL +0 -0
  27. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_sidecar-0.10.2.dist-info → steerable_sidecar-0.11.0.dist-info}/INSTALLER +0 -0
  28. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_sidecar-0.10.2.dist-info → steerable_sidecar-0.11.0.dist-info}/WHEEL +0 -0
  29. /package/python-runtime/python/lib/python3.12/site-packages/{steerable_sidecar-0.10.2.dist-info → steerable_sidecar-0.11.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,155 @@
1
+ """Tree-wide addressing: any agent in one spawn tree can message another.
2
+
3
+ Up to now ``agent_send`` only reached an executor's **own** children — a pool
4
+ sees exactly the loops it built. That makes collaboration strictly downward:
5
+ a sibling, or the parent itself, is unaddressable no matter how the parent
6
+ choreographed the work. Real "split this refactor across four agents" needs
7
+ the other direction: an implementer telling the researcher what it found, a
8
+ reviewer asking the implementer why a test changed, a worker reporting to the
9
+ agent that spawned it.
10
+
11
+ This module is the addressing layer for that. One ``AgentTree`` per root turn
12
+ holds every addressable member, and each member is registered by the executor
13
+ that **owns** it — the only thing that can steer or resume it. So ``send``
14
+ resolves a lineage id across the whole tree and then delegates to that owner;
15
+ nothing here pokes at another agent's loop directly.
16
+
17
+ Why an explicit tree instead of "walk up and ask": resume is a parent
18
+ operation (only the owning pool holds the loop, its schemas and its budget
19
+ line), so a peer message must arrive at the owner anyway. Holding the owner's
20
+ delivery callback at registration makes that one hop instead of a recursive
21
+ search that could deadlock against a parent waiting on its child.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import logging
27
+ from collections.abc import Awaitable, Callable
28
+ from dataclasses import dataclass
29
+
30
+ __all__ = ["AgentTree", "TreeMember"]
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+ #: Delivers a message to one member, returning the same ``steered`` /
35
+ #: ``resumed`` / ``error:*`` vocabulary ``AgentPool.send`` already uses. The
36
+ #: owner decides what a message means for its agent (steer while running,
37
+ #: resume when settled); the tree does not know.
38
+ Deliver = Callable[[str], Awaitable[str]]
39
+
40
+
41
+ @dataclass(frozen=True, slots=True)
42
+ class TreeMember:
43
+ """One addressable agent.
44
+
45
+ ``lineage`` is the tree id (``0`` is the root, ``0.2.1`` a grandchild), so
46
+ a sender can name any relative: ``0`` for the agent that started
47
+ everything, ``0.1`` for a sibling, ``0.2.1`` for a grandchild.
48
+ """
49
+
50
+ lineage: str
51
+ depth: int
52
+ parent: str | None
53
+ profile: str | None = None
54
+
55
+ def to_wire(self) -> dict[str, object]:
56
+ """Camel-case payload for a tool result."""
57
+ return {
58
+ "childId": self.lineage,
59
+ "depth": self.depth,
60
+ **({"parentId": self.parent} if self.parent is not None else {}),
61
+ **({"profile": self.profile} if self.profile else {}),
62
+ }
63
+
64
+
65
+ class AgentTree:
66
+ """Every addressable member of one spawn tree.
67
+
68
+ Registration is the authorization: an agent is reachable exactly while its
69
+ owner keeps it registered, so closing a child unregisters it and the
70
+ address stops resolving. There is no separate permission table to drift.
71
+
72
+ The root registers itself through ``register_root``; every other member
73
+ registers at spawn. Membership is scoped to the tree object, which is why
74
+ a message cannot escape into an unrelated conversation's agents.
75
+ """
76
+
77
+ def __init__(self) -> None:
78
+ self._deliver: dict[str, Deliver] = {}
79
+ self._members: dict[str, TreeMember] = {}
80
+
81
+ # -- registration --------------------------------------------------
82
+
83
+ def register_root(self, deliver: Deliver) -> TreeMember:
84
+ """Make the root agent (``0``) addressable.
85
+
86
+ Children need this to report to whoever spawned them — without it the
87
+ only upward channel is the completion notice, which carries a status
88
+ and no reply path.
89
+ """
90
+ return self._register(TreeMember(lineage="0", depth=0, parent=None), deliver)
91
+
92
+ def register(self, member: TreeMember, deliver: Deliver) -> TreeMember:
93
+ """Make one child addressable for as long as its owner keeps it so."""
94
+ return self._register(member, deliver)
95
+
96
+ def _register(self, member: TreeMember, deliver: Deliver) -> TreeMember:
97
+ self._members[member.lineage] = member
98
+ self._deliver[member.lineage] = deliver
99
+ return member
100
+
101
+ def unregister(self, lineage: str) -> None:
102
+ """Stop resolving one address; a later send reports it as unknown."""
103
+ self._members.pop(lineage, None)
104
+ self._deliver.pop(lineage, None)
105
+
106
+ # -- addressing ----------------------------------------------------
107
+
108
+ def get(self, lineage: str) -> TreeMember | None:
109
+ """The member at ``lineage``, or ``None`` when it is not reachable."""
110
+ return self._members.get(lineage)
111
+
112
+ def members(self) -> list[TreeMember]:
113
+ """Every reachable member, root first then in registration order."""
114
+ return sorted(self._members.values(), key=lambda m: (m.depth, m.lineage))
115
+
116
+ def resolve(self, sender: str, target: str) -> TreeMember | None:
117
+ """The member ``target`` names, if ``sender`` may address it.
118
+
119
+ Two refusals, both structural rather than policy:
120
+
121
+ - the target must be registered (an unknown or closed agent has no
122
+ owner to deliver to);
123
+ - a member cannot address itself — that is a no-op the model would
124
+ read as a delivered message.
125
+
126
+ Everything else is allowed on purpose. Siblings, parent and children
127
+ are all in one tree because one agent created the work, and a worker
128
+ that cannot tell a sibling what it found falls back to routing every
129
+ fact through the parent, which is the cost this exists to remove.
130
+ """
131
+ if target == sender:
132
+ return None
133
+ return self._members.get(target)
134
+
135
+ async def send(self, sender: str, target: str, message: str) -> str:
136
+ """Deliver ``message`` from ``sender`` to ``target``.
137
+
138
+ Returns the owner's delivery verdict (``steered`` / ``resumed`` /
139
+ ``error:*``). An unaddressable target reports ``error:unknown_member``
140
+ with the reachable ids, so a model that guessed a name can correct
141
+ itself instead of retrying the same call.
142
+ """
143
+ member = self.resolve(sender, target)
144
+ deliver = self._deliver.get(target)
145
+ if member is None or deliver is None:
146
+ known = ", ".join(m.lineage for m in self.members()) or "(none)"
147
+ return (
148
+ f"error:unknown_member: {target!r} is not reachable from this "
149
+ f"tree; reachable: {known}"
150
+ )
151
+ try:
152
+ return await deliver(message)
153
+ except Exception as exc: # noqa: BLE001 — a peer failure is data
154
+ logger.warning("peer send %s -> %s failed: %s", sender, target, exc)
155
+ return f"error:delivery_failed: {target!r}: {exc}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerable-agent-runtime
3
- Version: 0.10.2
3
+ Version: 0.11.0
4
4
  Summary: Steerable agent runtime: LLM, tool, storage, and transport adapters.
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -88,6 +88,37 @@ release. Nothing in the single-agent path changed.
88
88
  - **`SubagentExecutor.attach_pool()` / `.pool`** expose the shared pool so a
89
89
  host can report children's usage alongside the turn's own bill.
90
90
 
91
+ ## Upgrading from 0.10
92
+
93
+ Peer messaging and a shared task board (R8). Additive on the tool surface:
94
+ the same six orchestration tools exist, `agent_send` gained reach, and four
95
+ board tools appear when the family is on.
96
+
97
+ - **`agent_send` is tree-wide.** It used to reach only an executor's own
98
+ children. It now accepts any live lineage id in the turn's spawn tree — the
99
+ root (`0`), a sibling, a child — authorized by membership, not by a
100
+ permission table. Delivery still goes through the owning pool, so the
101
+ verdict vocabulary (`steered` / `resumed` / `error:*`) is unchanged. A
102
+ message to the root steers the parent loop and lands as a user turn at its
103
+ next round boundary.
104
+ - **Leaf agents get `agent_send` and `agent_list`.** A child that may not
105
+ spawn (depth wall) or that came from `delegate_subagent` is still a member
106
+ of the job, so it is advertised those two tools with no `agent_spawn`. A
107
+ host that counts tools per child will see two more.
108
+ - **`agent_list` gained `members` and `self`** next to `children` — the live
109
+ addresses `agent_send` accepts. `children` keeps its meaning and shape.
110
+ - **New: `AgentTree` / `TreeMember` / `TeamTaskBoard` / `TaskItem`,**
111
+ `OrchestrationExecutor(tree=..., team_board=...)`, and
112
+ `AgentPool.tree`. Passing neither keeps the previous behaviour exactly
113
+ (single-pool reach, no board tools). `PeerToolsExecutor` is the layer that
114
+ gives a leaf the two messaging tools.
115
+ - **New board tools, advertised with the family:** `team_task_create`,
116
+ `team_task_claim`, `team_task_complete`, `team_task_list`. They are
117
+ in-process and per turn — the board does not outlive its root turn, and the
118
+ durable child index remains the record of what survived.
119
+ - **`subagent` children now register in the same tree,** so a delegated child
120
+ and an `agent_spawn` child can message each other. `AgentPool.tree` exposes
121
+ it; `attach_pool` is what makes a delegation part of the turn's job.
91
122
  Selectively install just the bits you need:
92
123
 
93
124
  ```bash
@@ -1,11 +1,11 @@
1
- steerable_agent_runtime-0.10.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
- steerable_agent_runtime-0.10.2.dist-info/METADATA,sha256=ltUpA8xrtG9agCH31z9bLgNdSMipBr2ypLNO6jLYdm4,4824
3
- steerable_agent_runtime-0.10.2.dist-info/RECORD,,
4
- steerable_agent_runtime-0.10.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- steerable_agent_runtime-0.10.2.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
6
- steerable_agent_runtime-0.10.2.dist-info/direct_url.json,sha256=P_UymzDO3Obfcpg0LQ3QOoqb3bdZf-pBgtKYq6uOTQE,303
7
- steerable_agent_runtime-0.10.2.dist-info/top_level.txt,sha256=oH6AX0Sbye_DmFcu-JFEwuu-yXwyCkkdquPt8t0pFJE,24
8
- steerable_agent_runtime/__init__.py,sha256=lgvWntuMpJUldnGi0oOhS4Sc6qInx29gPbM1DtHgTZE,13414
1
+ steerable_agent_runtime-0.11.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ steerable_agent_runtime-0.11.0.dist-info/METADATA,sha256=p0mi6i8cGICwZmZIxB29wLTPZnao10KPvgH6Tms_C-k,6769
3
+ steerable_agent_runtime-0.11.0.dist-info/RECORD,,
4
+ steerable_agent_runtime-0.11.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ steerable_agent_runtime-0.11.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
6
+ steerable_agent_runtime-0.11.0.dist-info/direct_url.json,sha256=ynbDZRQrFTAM9HNmanpnH67hn0SPZjj7e-HwGyfekcc,303
7
+ steerable_agent_runtime-0.11.0.dist-info/top_level.txt,sha256=oH6AX0Sbye_DmFcu-JFEwuu-yXwyCkkdquPt8t0pFJE,24
8
+ steerable_agent_runtime/__init__.py,sha256=4cY8-MICTOiT87TqaJNlVHeG0BtB305I13k90RDGXBg,13732
9
9
  steerable_agent_runtime/__pycache__/__init__.cpython-312.pyc,,
10
10
  steerable_agent_runtime/__pycache__/antihallucination.cpython-312.pyc,,
11
11
  steerable_agent_runtime/__pycache__/approval.cpython-312.pyc,,
@@ -40,6 +40,7 @@ steerable_agent_runtime/__pycache__/native_bridge.cpython-312.pyc,,
40
40
  steerable_agent_runtime/__pycache__/observation_aging.cpython-312.pyc,,
41
41
  steerable_agent_runtime/__pycache__/orchestration.cpython-312.pyc,,
42
42
  steerable_agent_runtime/__pycache__/otel.cpython-312.pyc,,
43
+ steerable_agent_runtime/__pycache__/peer.cpython-312.pyc,,
43
44
  steerable_agent_runtime/__pycache__/plugins.cpython-312.pyc,,
44
45
  steerable_agent_runtime/__pycache__/pool.cpython-312.pyc,,
45
46
  steerable_agent_runtime/__pycache__/pricing.cpython-312.pyc,,
@@ -54,6 +55,7 @@ steerable_agent_runtime/__pycache__/sandboxed.cpython-312.pyc,,
54
55
  steerable_agent_runtime/__pycache__/skills.cpython-312.pyc,,
55
56
  steerable_agent_runtime/__pycache__/spill.cpython-312.pyc,,
56
57
  steerable_agent_runtime/__pycache__/subagent.cpython-312.pyc,,
58
+ steerable_agent_runtime/__pycache__/team_board.cpython-312.pyc,,
57
59
  steerable_agent_runtime/__pycache__/todo.cpython-312.pyc,,
58
60
  steerable_agent_runtime/__pycache__/tokens.cpython-312.pyc,,
59
61
  steerable_agent_runtime/__pycache__/tool_presentation.cpython-312.pyc,,
@@ -61,6 +63,7 @@ steerable_agent_runtime/__pycache__/tool_schema.cpython-312.pyc,,
61
63
  steerable_agent_runtime/__pycache__/tool_search.cpython-312.pyc,,
62
64
  steerable_agent_runtime/__pycache__/tools.cpython-312.pyc,,
63
65
  steerable_agent_runtime/__pycache__/tracing.cpython-312.pyc,,
66
+ steerable_agent_runtime/__pycache__/tree.cpython-312.pyc,,
64
67
  steerable_agent_runtime/__pycache__/world_state.cpython-312.pyc,,
65
68
  steerable_agent_runtime/antihallucination.py,sha256=_IU1q0NKLjjw_3D-1JGr1FbBkRhSwaPTwibD_z-5IdQ,27133
66
69
  steerable_agent_runtime/approval.py,sha256=l9VaKSqG1w_w0TSKFI6FwBLzwAs-MaqyKpXdewA7fl8,26825
@@ -115,10 +118,11 @@ steerable_agent_runtime/model_info.py,sha256=yLiA8uWzPv7fHO7mUlgd0NlpbT1PBXKWX-u
115
118
  steerable_agent_runtime/model_resolve.py,sha256=vcKDvfLiBcTr99dj1FDsiKiA16o0IC6trm-yRFdlgQY,10332
116
119
  steerable_agent_runtime/native_bridge.py,sha256=Mu9CeTBHyjwU6Q2Yn-4sW1JGNW6H4dSVfYuuX4W212k,38582
117
120
  steerable_agent_runtime/observation_aging.py,sha256=4ajPHONvyh46LIRLTNqJGmJtSeDX6kJe1-1zhDuRaG8,8129
118
- steerable_agent_runtime/orchestration.py,sha256=ONHk7OqKj-uyFQX6npzuNtirUTUeax_OCCXRDq_KEKw,39999
121
+ steerable_agent_runtime/orchestration.py,sha256=Oj6POU3TBGX9ASRonayo0iVJV2xZGqlfiCMev3mJeSQ,54172
119
122
  steerable_agent_runtime/otel.py,sha256=idBWSnIbXowF7fzfFS9rkhPFZTf0e1SdSuNMJJw0aRg,14471
123
+ steerable_agent_runtime/peer.py,sha256=xTL1P95ng3vLue_6lnmMNpmGn373ZnZJxARpRu_chKQ,7383
120
124
  steerable_agent_runtime/plugins.py,sha256=VCProcLnWzVxr7WRI5ndRbkdX-fXh1CTa-YCg-q60Xc,18444
121
- steerable_agent_runtime/pool.py,sha256=luAViiyMB7EzFu0AzNsHK1yzKEoG_pmvH9J4btqpuO4,47600
125
+ steerable_agent_runtime/pool.py,sha256=eanoBpa8XTMimuAmcj3uENVNXped20gAusiTYp9TXOY,51752
122
126
  steerable_agent_runtime/pricing.py,sha256=EsciOP14OFnP5m0UIOF9uNV_DTCBE4OIEDSGCiZhGbM,3081
123
127
  steerable_agent_runtime/pseudo.py,sha256=K3bIpjacetNqfBmK30gzquS7pZ-xYXgluDE8mHSG_d0,24200
124
128
  steerable_agent_runtime/recording.py,sha256=y7iRHJD_NzlxpZvFvtqy94mYfCVagp9bJCK_BfJIp7w,16796
@@ -140,7 +144,8 @@ steerable_agent_runtime/storage/in_memory.py,sha256=6MgDanAiVqpYagTeMcljhk62GCGZ
140
144
  steerable_agent_runtime/storage/sqlalchemy_store.py,sha256=RagEhi1bLXS7_ET-UsN8SWvNr2NbnXF_2yNe6CXjYTE,24337
141
145
  steerable_agent_runtime/storage/sqlite_store.py,sha256=qBepGs82s6nRiUO92DtleuGFDQQHiFpCNTyib9T3zaY,23324
142
146
  steerable_agent_runtime/storage/write_lease.py,sha256=Yzwe0ggIfVPlJaRwGUYr_dOHVBC9R4842ALLoc3iQO8,6115
143
- steerable_agent_runtime/subagent.py,sha256=LufKJazOEOf4ce6XJ9s_GY22uPY5w-dzbdiW5ECr1lg,31791
147
+ steerable_agent_runtime/subagent.py,sha256=bPPcSHHmmy12TPJgqnH393_6dzNoFLsmXRU2N2nkm-c,32889
148
+ steerable_agent_runtime/team_board.py,sha256=VCWxhXlwu9GwQvZ49MSRPg1uVR-xzU8OxQzvKm5KBs0,8528
144
149
  steerable_agent_runtime/todo.py,sha256=59uuGm_a8kqAJ0vIS0IWg1GbEXL9OBBkPqUkv2-G2B0,13255
145
150
  steerable_agent_runtime/tokens.py,sha256=6WKyxf5dYP98UoLa6ONUbwQubUaLfw6yyr6z98zJuX0,6480
146
151
  steerable_agent_runtime/tool_presentation.py,sha256=k4K4Zva1by75l3HDpNUMSbVQeuvB7BYM3gI9Mtunw-g,6850
@@ -154,4 +159,5 @@ steerable_agent_runtime/transport/__pycache__/fastapi_sse.cpython-312.pyc,,
154
159
  steerable_agent_runtime/transport/__pycache__/stdio_jsonrpc.cpython-312.pyc,,
155
160
  steerable_agent_runtime/transport/fastapi_sse.py,sha256=u6yuKdSFxYeRajyArvHTW_wrtFbQAdcFo8Ib3WWyKMg,3555
156
161
  steerable_agent_runtime/transport/stdio_jsonrpc.py,sha256=zivW7_1fQC1voeF-Q4HhTI1QBQMj0zZMJRzs1DTwoPs,15861
162
+ steerable_agent_runtime/tree.py,sha256=1RYQwjP1fEHzYalG2TiDatc-BZ5r_TiaqD6ZslwgJPQ,6658
157
163
  steerable_agent_runtime/world_state.py,sha256=y08rAXzgM_PEe7UAdhGeix2bAc_clC6gXQDn-CIeYTE,13043
@@ -78,9 +78,11 @@ from steerable_agent_runtime import (
78
78
  AcpEngineSpec,
79
79
  AcpPermissionPolicy,
80
80
  AcpToolBridge,
81
+ AgentTree,
81
82
  OrchestrationConfig,
82
83
  OrchestrationExecutor,
83
84
  SessionBudgetExceeded,
85
+ TeamTaskBoard,
84
86
  TreeBudget,
85
87
  PluginLoadError,
86
88
  PluginStateError,
@@ -124,6 +126,7 @@ from steerable_agent_runtime import (
124
126
  skill_to_dict,
125
127
  skill_tool_descriptor,
126
128
  subagent_tool_descriptor,
129
+ team_tool_descriptors,
127
130
  mcp_invoker,
128
131
  register_mcp_catalog,
129
132
  )
@@ -2518,6 +2521,15 @@ class Sidecar:
2518
2521
  # and delegate children appear in agent_list.
2519
2522
  orchestration_param = params.get("orchestration")
2520
2523
  orchestration: OrchestrationExecutor | None = None
2524
+ # R8: one tree and one board per turn. The tree is what makes every
2525
+ # agent in the job addressable — a worker messaging a sibling, a child
2526
+ # reporting to the root — and the board is the plan they share. Both
2527
+ # live exactly as long as the turn: a spawn tree does not outlive its
2528
+ # root run, and the durable registry answers the different question of
2529
+ # what survives. The root registers once its loop exists (below), since
2530
+ # a message to it is delivered by steering that loop.
2531
+ team_tree: AgentTree | None = None
2532
+ team_board: TeamTaskBoard | None = None
2521
2533
  if (
2522
2534
  isinstance(orchestration_param, dict)
2523
2535
  and orchestration_param
@@ -2552,6 +2564,13 @@ class Sidecar:
2552
2564
  else None
2553
2565
  ),
2554
2566
  )
2567
+ # R8: a peer tree and a shared board come with the family unless
2568
+ # the host turns them off. Both are additive — an agent that never
2569
+ # messages or claims behaves exactly as before — so they default
2570
+ # on rather than requiring a second opt-in.
2571
+ if orchestration_param.get("team", True):
2572
+ team_tree = AgentTree()
2573
+ team_board = TeamTaskBoard()
2555
2574
  # The parent loop is created after this executor (the loop needs
2556
2575
  # the executor), so a fork reads the transcript through a holder.
2557
2576
  orchestration = OrchestrationExecutor(
@@ -2577,6 +2596,8 @@ class Sidecar:
2577
2596
  parent_route=parent_route,
2578
2597
  provider_factory=_orchestration_provider_factory,
2579
2598
  budget=tree_budget,
2599
+ tree=team_tree,
2600
+ team_board=team_board,
2580
2601
  )
2581
2602
  if subagent_executor is not None:
2582
2603
  subagent_executor.attach_pool(orchestration.pool)
@@ -2585,6 +2606,11 @@ class Sidecar:
2585
2606
  *(tools or []),
2586
2607
  *orchestration_tool_descriptors(orch_config),
2587
2608
  ]
2609
+ if team_board is not None:
2610
+ # The root writes the plan, so it always has the board tools;
2611
+ # children get them from their own executor (which is why the
2612
+ # descriptors are appended here once, not per child).
2613
+ tools = [*(tools or []), *team_tool_descriptors(orch_config)]
2588
2614
  # Router-answered tools (run_code, ask_user): registered on the
2589
2615
  # sidecar's router but unknown to the host — under toolsViaHost the
2590
2616
  # inner executor forwards every call to the host, so they must be
@@ -2690,7 +2716,15 @@ class Sidecar:
2690
2716
  # holder's declaration above).
2691
2717
  if orchestration is not None:
2692
2718
  parent_loop_holder.append(loop)
2693
- # Expose the pool to the panel's live controls (interrupt a running
2719
+ if team_tree is not None:
2720
+ # The root is a member too: a child reporting a finding, or a
2721
+ # worker asking whoever wrote the plan, needs an address that
2722
+ # reaches this turn's parent loop. Steering is the delivery —
2723
+ # it lands at the next round boundary as a user message, the
2724
+ # same channel a host steer uses.
2725
+ team_tree.register_root(
2726
+ lambda message, target=loop: _deliver_to_loop(target, message)
2727
+ ) # Expose the pool to the panel's live controls (interrupt a running
2694
2728
  # child). Keyed by chat: one turn at a time per chat, so a later
2695
2729
  # turn simply replaces it.
2696
2730
  if params.get("chatId"):
@@ -3923,6 +3957,20 @@ def _tree_report_of(budget: TreeBudget) -> dict[str, Any]:
3923
3957
  return {"limit": report.limit, "spent": report.spent, "byAgent": dict(report.by_agent)}
3924
3958
 
3925
3959
 
3960
+ async def _deliver_to_loop(loop: CoreLoop, message: str) -> str:
3961
+ """Deliver a peer message to the turn's own parent loop.
3962
+
3963
+ Steering is the only channel the root has: it is a running run, so the
3964
+ message becomes a user turn at the next round boundary — the same path a
3965
+ host-initiated steer takes, which is what makes a child's report visible
3966
+ to the model rather than to some side table. The verdict vocabulary
3967
+ matches ``AgentPool.send`` (``steered`` / ``resumed``) so a sender reads
3968
+ one set of answers whether the target is a child or the root.
3969
+ """
3970
+ loop.steer(message)
3971
+ return "steered"
3972
+
3973
+
3926
3974
  def _tree_budget_from(params: dict[str, Any]) -> TreeBudget:
3927
3975
  """Build the turn tree's shared token limit from the request.
3928
3976
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerable-sidecar
3
- Version: 0.10.2
3
+ Version: 0.11.0
4
4
  Summary: Steerable agent runtime sidecar — JSON-RPC over stdio.
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -82,6 +82,30 @@ Every change below is additive except where noted.
82
82
  the child re-reads the parent prefix on a different route. Changing the route
83
83
  without a fork fails closed.
84
84
 
85
+ ## Upgrading from 0.10
86
+
87
+ Peer messaging and a shared task board ride the orchestration opt-in. Nothing
88
+ changes for a host that does not enable it.
89
+
90
+ - **`orchestration.team` (default `true`)** — with `enabled: true`, the turn
91
+ also creates a spawn tree and a shared task board, and advertises four board
92
+ tools (`team_task_create`, `team_task_claim`, `team_task_complete`,
93
+ `team_task_list`) to every agent in the job. `team: false` keeps the six-tool
94
+ family without them, for a host that does not want the extra tools in the
95
+ prompt.
96
+ - **`agent_send` reaches the whole job.** Any live lineage id is addressable —
97
+ `0` (the turn's root), a sibling, a child — not just this executor's own
98
+ children. A message to the root steers the parent loop, so a worker's report
99
+ arrives as a user turn. `agent_list` now also returns `members` (live
100
+ addresses with depth and profile) and `self`.
101
+ - **Depth no longer gates messaging.** A child at the depth wall, and a
102
+ `delegate_subagent` child, are advertised `agent_send` + `agent_list` and
103
+ nothing else from the family. A host that counts child tools sees two more.
104
+ - **The tree and board are per turn.** They do not outlive the root run;
105
+ `agent.children.list` remains the durable record. A message to an id that
106
+ belonged to an earlier turn is not resumable through the tree — that is what
107
+ `agent_send`'s registry path handles.
108
+
85
109
  ## Embedding
86
110
 
87
111
  ```python
@@ -1,14 +1,14 @@
1
1
  ../../../bin/steerable-sidecar,sha256=585U51qsZ6YLxjRRp6qNsSx231-LesLDofKABRJGKPg,264
2
2
  ../../../bin/steerable-sidecar-acp,sha256=NyQYfZ5KrcRCUhtmpNf2dU05RdUwekozg8GtUdFcxh0,267
3
3
  ../../../bin/steerable-sidecar-headless,sha256=fnPsDRsBH1__rlO-Zhh_8LzgplWrXILWJpad3oFSvF4,264
4
- steerable_sidecar-0.10.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
5
- steerable_sidecar-0.10.2.dist-info/METADATA,sha256=xH802x3dYDVucHialyJA8IgP1c3wagQio8dzHjiIuS8,3877
6
- steerable_sidecar-0.10.2.dist-info/RECORD,,
7
- steerable_sidecar-0.10.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- steerable_sidecar-0.10.2.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
9
- steerable_sidecar-0.10.2.dist-info/direct_url.json,sha256=JEZpx7yE780bV5TFGx5tokZeGi6EKgHWvn_3JJtTZ3E,297
10
- steerable_sidecar-0.10.2.dist-info/entry_points.txt,sha256=qrH9-x-0XSrW3-G1-QmU4j8A7b731wKPnc_XS_oAkO8,190
11
- steerable_sidecar-0.10.2.dist-info/top_level.txt,sha256=0QLlBP9tgRT5PLQXFYLc_FTgTH87Qn6JGsgJj4ZvhDs,18
4
+ steerable_sidecar-0.11.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
5
+ steerable_sidecar-0.11.0.dist-info/METADATA,sha256=sEx44fSw8YYkxijoI3fQaY36LAmuVGQxpWeTzeP8Lvw,5272
6
+ steerable_sidecar-0.11.0.dist-info/RECORD,,
7
+ steerable_sidecar-0.11.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ steerable_sidecar-0.11.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
9
+ steerable_sidecar-0.11.0.dist-info/direct_url.json,sha256=p_X38H9svp4Cw2AHeViap9EkkW3IUdtzVXf2QP9BCDA,297
10
+ steerable_sidecar-0.11.0.dist-info/entry_points.txt,sha256=qrH9-x-0XSrW3-G1-QmU4j8A7b731wKPnc_XS_oAkO8,190
11
+ steerable_sidecar-0.11.0.dist-info/top_level.txt,sha256=0QLlBP9tgRT5PLQXFYLc_FTgTH87Qn6JGsgJj4ZvhDs,18
12
12
  steerable_sidecar/__init__.py,sha256=p-szaR3e6eP8xV0O9GyEKgdEISz3iaDXvsZv8XhBEKo,669
13
13
  steerable_sidecar/__main__.py,sha256=qzdZBagiiY-v60K__iEjRSLxh3e-davno32o3s2SpQI,4294
14
14
  steerable_sidecar/__pycache__/__init__.cpython-312.pyc,,
@@ -69,7 +69,7 @@ steerable_sidecar/run_code_driver.py,sha256=L46TH_st_7Kw9SdhPcDK8GQP0I-7xTmjRIAz
69
69
  steerable_sidecar/sandbox.py,sha256=9Ts-ddkaqWp9E-BcmZamj2SWuVugcHBCLo6LqBzMEs0,30164
70
70
  steerable_sidecar/search_tools.py,sha256=CKqca5zjGTZsA7uLKh_UkXz9AFt4Fe1PBVqTQTHVYNs,6118
71
71
  steerable_sidecar/shell_session.py,sha256=Q1MIQXwHWag1QUbUfApQ75Q0aYSFXZaoeo7oV6wTPhU,10538
72
- steerable_sidecar/sidecar.py,sha256=nCb1iH3_Ls8Ug571Bi95Z1DvnC7-VzENnrldmv8eQmU,189423
72
+ steerable_sidecar/sidecar.py,sha256=52297rpGdHI-Qw1DRzScj1QHecd4TT2QFP1EUmN1yCI,192126
73
73
  steerable_sidecar/stream_chunks.py,sha256=SghkPzrRkmBdXN6FoR8Sldpxi-WT8GRzEYtA3tEyQVU,4681
74
74
  steerable_sidecar/todo_tools.py,sha256=A0XKJd5ZK6TVj3qH9zNvoCKd_Cebq_P5FhWvYoVv1hQ,1598
75
75
  steerable_sidecar/tool_contract.json,sha256=BEj64csxA_jr8hh_gHKsPu97jqNyIHa7YE_U5oYsvok,8135
package/runtime.json CHANGED
@@ -8,7 +8,7 @@
8
8
  },
9
9
  {
10
10
  "path": "python-runtime/manifest.json",
11
- "sha256": "3e3dfc18a19c65b03f6ffc2f8235dfc0b45d67e1128d8750990b00fedad7d90f"
11
+ "sha256": "db120757c56c7c39cefe40ecab6fec38f92faa2a82cc283172b250c06dbf549c"
12
12
  },
13
13
  {
14
14
  "path": "python-runtime/python/bin/2to3",
@@ -6815,19 +6815,19 @@
6815
6815
  "sha256": "3e972a442ac2e0d22211245269400f662d05799427e2047109496a5529e02978"
6816
6816
  },
6817
6817
  {
6818
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.10.2.dist-info/INSTALLER",
6818
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.11.0.dist-info/INSTALLER",
6819
6819
  "sha256": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508"
6820
6820
  },
6821
6821
  {
6822
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.10.2.dist-info/METADATA",
6823
- "sha256": "e7c53bd8b7e7a02a81c7872d836ec5e2e2dbed9ca1903736c8d2396c777197df"
6822
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.11.0.dist-info/METADATA",
6823
+ "sha256": "3a9c13b62192fbab973abbe52b1be3d258fc4d6f36a82cd9260a926771a851aa"
6824
6824
  },
6825
6825
  {
6826
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.10.2.dist-info/RECORD",
6827
- "sha256": "d8dbbaf545291f5d7d7a198079f8fd941ece518bdde7df83af1752fb0ef06be8"
6826
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.11.0.dist-info/RECORD",
6827
+ "sha256": "57b6a2225ed20e89b7b0f08b5edf591be687363a0ad52ae648ef85eeed39f94b"
6828
6828
  },
6829
6829
  {
6830
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.10.2.dist-info/WHEEL",
6830
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_harness-0.11.0.dist-info/WHEEL",
6831
6831
  "sha256": "98e75747d0b7c0c568bfb71263c3d8f970b3a374a6996087bc642be5cb09a1aa"
6832
6832
  },
6833
6833
  {
@@ -6839,24 +6839,24 @@
6839
6839
  "sha256": "8deca72a770e3f41d61295dc16cec0ef2df3e339684749e309aaf680c7017dba"
6840
6840
  },
6841
6841
  {
6842
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.10.2.dist-info/INSTALLER",
6842
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.11.0.dist-info/INSTALLER",
6843
6843
  "sha256": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508"
6844
6844
  },
6845
6845
  {
6846
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.10.2.dist-info/METADATA",
6847
- "sha256": "93318aaeeed5cdbaab35928e5c1fac342d21b7b2ca2c6566926b82dc4b7a568f"
6846
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.11.0.dist-info/METADATA",
6847
+ "sha256": "f9d4e128a66174cca0b5cd2127e4dc1e87544c70850af061cb0c695f8a77cfc5"
6848
6848
  },
6849
6849
  {
6850
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.10.2.dist-info/RECORD",
6851
- "sha256": "d92ac61df480b1251a8e0e2ea4cce773bbf9ee08134094efaf50546d41c53aab"
6850
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.11.0.dist-info/RECORD",
6851
+ "sha256": "80b2a19de5490d29e2858509db14befbf458eb9235ff5ed3bff39ef384a85a43"
6852
6852
  },
6853
6853
  {
6854
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.10.2.dist-info/WHEEL",
6854
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_protocol-0.11.0.dist-info/WHEEL",
6855
6855
  "sha256": "98e75747d0b7c0c568bfb71263c3d8f970b3a374a6996087bc642be5cb09a1aa"
6856
6856
  },
6857
6857
  {
6858
6858
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/__init__.py",
6859
- "sha256": "960bd69edb8ca495257671a2d283a14b849ceaa227c76f603db3350ed1e04d91"
6859
+ "sha256": "e1c63cf8c2024ce893f3b4ea689365547786d01b41df4e48d7793dd110c65c18"
6860
6860
  },
6861
6861
  {
6862
6862
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/antihallucination.py",
@@ -7032,19 +7032,23 @@
7032
7032
  },
7033
7033
  {
7034
7034
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/orchestration.py",
7035
- "sha256": "38d1e4ecea8a8febb21505fa9e9cee36d8ab51351e6b1fce0825d10eafca10ac"
7035
+ "sha256": "3a3e8f394dd30465fd0124689daca8d22549576c591aa95f88231ebf79897924"
7036
7036
  },
7037
7037
  {
7038
7038
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/otel.py",
7039
7039
  "sha256": "89d0564a721b5e8c05edfcdf152f6b9213c56537f47b549d4ae34c249c346918"
7040
7040
  },
7041
+ {
7042
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/peer.py",
7043
+ "sha256": "c532f53fde67837bcbb9effa96798c3699869f7ef7667649c4046946efdc84a4"
7044
+ },
7041
7045
  {
7042
7046
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/plugins.py",
7043
7047
  "sha256": "5423eba1c2e75b3571afb5912399dd45b91d5fe7d78750936be60283eabad177"
7044
7048
  },
7045
7049
  {
7046
7050
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/pool.py",
7047
- "sha256": "96e0158a2c8c07b13316ed00ccdb072b5cb3284a06fe99af1fd2786edaa9b8ee"
7051
+ "sha256": "79a9e80696bc5d33229ae026723dee10d54d5e979ddb4800bac893629f535ce6"
7048
7052
  },
7049
7053
  {
7050
7054
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/pricing.py",
@@ -7112,7 +7116,11 @@
7112
7116
  },
7113
7117
  {
7114
7118
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/subagent.py",
7115
- "sha256": "2ee7ca25acce10e7f871ee9727db3f198db6b8f639c3e7736dd896e440abd658"
7119
+ "sha256": "6cf3dc4871e69b2d764cf260aa71f7f77ffa77336814bb265d15363769e49be7"
7120
+ },
7121
+ {
7122
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/team_board.py",
7123
+ "sha256": "5425b1857970bbd1b042f678f4c4913e0d6e551fb1cd4f0ec50cef2a6e4a06cd"
7116
7124
  },
7117
7125
  {
7118
7126
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/todo.py",
@@ -7154,24 +7162,28 @@
7154
7162
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/transport/stdio_jsonrpc.py",
7155
7163
  "sha256": "ce2bd6effd5f402d6fa1e17e4381e14c8d50050323d3364c251cecd434f0a0fb"
7156
7164
  },
7165
+ {
7166
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/tree.py",
7167
+ "sha256": "d51610c233f57c41f361a946d938836ad73e059e6bfd389aa83e99b25c2024f4"
7168
+ },
7157
7169
  {
7158
7170
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime/world_state.py",
7159
7171
  "sha256": "cb4f2b017ce033f3c47bb50076119e8b1d9b01cfdc942ea05d00e7f8221e6131"
7160
7172
  },
7161
7173
  {
7162
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.10.2.dist-info/INSTALLER",
7174
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.11.0.dist-info/INSTALLER",
7163
7175
  "sha256": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508"
7164
7176
  },
7165
7177
  {
7166
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.10.2.dist-info/METADATA",
7167
- "sha256": "96d52903cc6bb46f5a8021f7d73f5b2e035d48c8a906bdb2a4b34eea32d8766e"
7178
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.11.0.dist-info/METADATA",
7179
+ "sha256": "a749a2ea2f1c1880b0666648c41dbdc0b4cf6676a8d7428fbe01fa4e6b3f0be9"
7168
7180
  },
7169
7181
  {
7170
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.10.2.dist-info/RECORD",
7171
- "sha256": "eddfe053c50e1786c05203d92cf9d85e6b3f59dbfbfc9c3c3331c387425706e6"
7182
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.11.0.dist-info/RECORD",
7183
+ "sha256": "d6fa42beea1577569703576dbb436b1cdfc1028d861c34bddf4dfca31c1491fd"
7172
7184
  },
7173
7185
  {
7174
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.10.2.dist-info/WHEEL",
7186
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_agent_runtime-0.11.0.dist-info/WHEEL",
7175
7187
  "sha256": "98e75747d0b7c0c568bfb71263c3d8f970b3a374a6996087bc642be5cb09a1aa"
7176
7188
  },
7177
7189
  {
@@ -7308,7 +7320,7 @@
7308
7320
  },
7309
7321
  {
7310
7322
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar/sidecar.py",
7311
- "sha256": "9c26f5887dff2ecf14839ef5062f796750ef9c2efe57310d9eb95d9aff1e4265"
7323
+ "sha256": "e76dbdeeba4674723e430d4347349c8f540779c7784d3d9014fd44526375c822"
7312
7324
  },
7313
7325
  {
7314
7326
  "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar/stream_chunks.py",
@@ -7339,23 +7351,23 @@
7339
7351
  "sha256": "d00b8b7d1d932a9f9c9ba8c1f812ed63a7f8fb84026a787373ae0bf3b353edca"
7340
7352
  },
7341
7353
  {
7342
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.10.2.dist-info/INSTALLER",
7354
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.11.0.dist-info/INSTALLER",
7343
7355
  "sha256": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508"
7344
7356
  },
7345
7357
  {
7346
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.10.2.dist-info/METADATA",
7347
- "sha256": "c47f34db1ddd60356e70789a972240f0880fd5cdf06a0422a3c7731e3888b92f"
7358
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.11.0.dist-info/METADATA",
7359
+ "sha256": "b04c78e1f4b0f18624c628e82377d0698dfa2c09ae546431a56793cde3fc2efc"
7348
7360
  },
7349
7361
  {
7350
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.10.2.dist-info/RECORD",
7351
- "sha256": "1239836bfc8b0e32b354b77eb390bc2dd34563729423cee674cf47933dcdba65"
7362
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.11.0.dist-info/RECORD",
7363
+ "sha256": "255c4142e77708323d4cc635bea78e53bca88d7ece3c741575c4af8cdb95903a"
7352
7364
  },
7353
7365
  {
7354
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.10.2.dist-info/WHEEL",
7366
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.11.0.dist-info/WHEEL",
7355
7367
  "sha256": "98e75747d0b7c0c568bfb71263c3d8f970b3a374a6996087bc642be5cb09a1aa"
7356
7368
  },
7357
7369
  {
7358
- "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.10.2.dist-info/entry_points.txt",
7370
+ "path": "python-runtime/python/lib/python3.12/site-packages/steerable_sidecar-0.11.0.dist-info/entry_points.txt",
7359
7371
  "sha256": "aab1fdfb1fb45d2ad6dfe1b5f90994e23f00edbef7d7028f9dcfd74bfa0090ef"
7360
7372
  },
7361
7373
  {
@@ -8779,7 +8791,7 @@
8779
8791
  "sha256": "482786a0d83d8536eddc78aafdf702d247ddc1f33d45115bdfe86c92a3d6043f"
8780
8792
  }
8781
8793
  ],
8782
- "packageVersion": "0.10.2",
8794
+ "packageVersion": "0.11.0",
8783
8795
  "runCodePython": "python-runtime/python/bin/python3",
8784
8796
  "schemaVersion": 1,
8785
8797
  "sidecarPython": "python-runtime/python/bin/python3",