langchain-agentx-python 2.1.9__py3-none-any.whl → 2.2.0__py3-none-any.whl

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.
@@ -11,7 +11,7 @@ from langchain_agentx import create_loop_agent
11
11
  ```
12
12
  """
13
13
 
14
- __version__ = "2.1.9"
14
+ __version__ = "2.2.0"
15
15
 
16
16
  from .loop import ( # noqa: F401
17
17
  create_loop_agent,
@@ -35,13 +35,20 @@ for chunk in agent.stream({"messages": [{"role": "user", "content": "Hello"}]}):
35
35
  from .graph.factory import (
36
36
  create_loop_agent,
37
37
  )
38
- from .loop_abort import LoopAbortSignal, raise_if_cancel_requested
38
+ from .loop_abort import (
39
+ LoopAbortSignal,
40
+ abort_signal_for_phase,
41
+ is_cancel_requested,
42
+ raise_if_cancel_requested,
43
+ )
39
44
  from .config import build_agent_config
40
45
 
41
46
  __all__ = [
42
47
  # 主要接口
43
48
  "create_loop_agent",
44
49
  "LoopAbortSignal",
50
+ "abort_signal_for_phase",
51
+ "is_cancel_requested",
45
52
  "raise_if_cancel_requested",
46
53
  # 配置助手
47
54
  "build_agent_config",
@@ -23,7 +23,12 @@ from ..exit.reason_codes import (
23
23
  TERMINAL_REASON_CLASSIFIER_DENIAL_LIMIT,
24
24
  TERMINAL_REASON_HOOK_STOPPED,
25
25
  )
26
- from ..loop_abort import LoopAbortSignal, raise_if_cancel_requested
26
+ from ..loop_abort import (
27
+ LoopAbortSignal,
28
+ abort_signal_for_phase,
29
+ is_cancel_requested,
30
+ raise_if_cancel_requested,
31
+ )
27
32
  from ..model.orphan_tool_results import synthetic_tool_messages_for_orphan_tool_calls
28
33
  from ...tool_runtime.classifier_denial_limit import ClassifierDenialLimitAbort
29
34
  from ...tool_runtime.permission_context import clear_auto_approved_window
@@ -72,7 +77,9 @@ class _LoopBuiltinModelControl:
72
77
  raise_if_cancel_requested(phase="model")
73
78
  return handler(request)
74
79
  except asyncio.CancelledError:
75
- raise_if_cancel_requested(phase="model")
80
+ # D-A′-1:就地 abort;禁止 raise_if_cancel_requested 逃逸
81
+ if is_cancel_requested():
82
+ return _model_abort_response(abort_signal_for_phase("model"))
76
83
  raise
77
84
  except LoopAbortSignal as sig:
78
85
  if sig.terminal_reason not in (
@@ -88,7 +95,8 @@ class _LoopBuiltinModelControl:
88
95
  raise_if_cancel_requested(phase="model")
89
96
  return await handler(request)
90
97
  except asyncio.CancelledError:
91
- raise_if_cancel_requested(phase="model")
98
+ if is_cancel_requested():
99
+ return _model_abort_response(abort_signal_for_phase("model"))
92
100
  raise
93
101
  except LoopAbortSignal as sig:
94
102
  if sig.terminal_reason not in (
@@ -184,7 +192,11 @@ def builtin_sync_tool_wrapper(request: Any, handler: Any) -> Any:
184
192
  result = handler(_with_injected_agent_tool_model(request))
185
193
  return apply_tool_message_status_to_result(result)
186
194
  except asyncio.CancelledError:
187
- raise_if_cancel_requested(phase="tools")
195
+ if is_cancel_requested():
196
+ return _tool_abort_command(
197
+ request,
198
+ terminal_reason=TERMINAL_REASON_ABORTED_TOOLS,
199
+ )
188
200
  raise
189
201
  except ClassifierDenialLimitAbort as exc:
190
202
  return _tool_abort_command(
@@ -207,7 +219,11 @@ async def builtin_async_tool_wrapper(request: Any, handler: Any) -> Any:
207
219
  result = await handler(_with_injected_agent_tool_model(request))
208
220
  return apply_tool_message_status_to_result(result)
209
221
  except asyncio.CancelledError:
210
- raise_if_cancel_requested(phase="tools")
222
+ if is_cancel_requested():
223
+ return _tool_abort_command(
224
+ request,
225
+ terminal_reason=TERMINAL_REASON_ABORTED_TOOLS,
226
+ )
211
227
  raise
212
228
  except ClassifierDenialLimitAbort as exc:
213
229
  return _tool_abort_command(
@@ -37,7 +37,7 @@ from ..exit.reason_codes import (
37
37
  TERMINAL_REASON_ABORTED_TOOLS,
38
38
  TERMINAL_REASON_CLASSIFIER_DENIAL_LIMIT,
39
39
  )
40
- from ..loop_abort import LoopAbortSignal, raise_if_cancel_requested
40
+ from ..loop_abort import LoopAbortSignal, is_cancel_requested, raise_if_cancel_requested
41
41
  from .builtin_loop_control import tools_batch_abort_command
42
42
 
43
43
 
@@ -112,7 +112,11 @@ class RuntimeToolsNode(Runnable):
112
112
  tool_messages = self._message_adapter.records_to_graph_messages(records)
113
113
  return {"messages": tool_messages}
114
114
  except asyncio.CancelledError:
115
- raise_if_cancel_requested(phase="tools")
115
+ if is_cancel_requested():
116
+ return tools_batch_abort_command(
117
+ tool_calls,
118
+ terminal_reason=TERMINAL_REASON_ABORTED_TOOLS,
119
+ )
116
120
  raise
117
121
  except ClassifierDenialLimitAbort as exc:
118
122
  return tools_batch_abort_command(
@@ -147,7 +151,11 @@ class RuntimeToolsNode(Runnable):
147
151
  tool_messages = self._message_adapter.records_to_graph_messages(records)
148
152
  return {"messages": tool_messages}
149
153
  except asyncio.CancelledError:
150
- raise_if_cancel_requested(phase="tools")
154
+ if is_cancel_requested():
155
+ return tools_batch_abort_command(
156
+ tool_calls,
157
+ terminal_reason=TERMINAL_REASON_ABORTED_TOOLS,
158
+ )
151
159
  raise
152
160
  except ClassifierDenialLimitAbort as exc:
153
161
  return tools_batch_abort_command(
@@ -2,6 +2,9 @@
2
2
 
3
3
  P1(Doc-35 D-ABORT-1):``raise_if_cancel_requested`` 读 ``RunContext.cancel_requested``,
4
4
  真则抛既有 ``LoopAbortSignal``(单轨);禁止平行 Abort 异常族。
5
+
6
+ 层 A′(2026-07-21):``except CancelledError`` 路径禁止二次 ``raise_if_cancel_requested``
7
+ 逃逸;用 ``is_cancel_requested`` + 就地 abort 响应(见 ``abort_signal_for_phase``)。
5
8
  """
6
9
 
7
10
  from __future__ import annotations
@@ -41,27 +44,44 @@ class LoopAbortSignal(Exception):
41
44
  super().__init__(detail or terminal_reason)
42
45
 
43
46
 
47
+ def is_cancel_requested() -> bool:
48
+ """当前 RunContext 是否已请求取消(无 context 则为 False)。"""
49
+ from .run_context import get_run_context
50
+
51
+ ctx = get_run_context()
52
+ return ctx is not None and bool(ctx.cancel_requested)
53
+
54
+
55
+ def abort_signal_for_phase(
56
+ phase: CancelAbortPhase,
57
+ *,
58
+ detail: str = "cancel_requested",
59
+ ) -> LoopAbortSignal:
60
+ """构造相位对应的 ``LoopAbortSignal``(不抛出;供 CancelledError 就地收口)。"""
61
+ if phase == "tools":
62
+ return LoopAbortSignal(TERMINAL_REASON_ABORTED_TOOLS, detail=detail)
63
+ return LoopAbortSignal(TERMINAL_REASON_ABORTED_STREAMING, detail=detail)
64
+
65
+
44
66
  def raise_if_cancel_requested(*, phase: CancelAbortPhase) -> None:
45
67
  """若当前 ``RunContext.cancel_requested`` 为真,抛既有 ``LoopAbortSignal``。
46
68
 
47
69
  对齐 CC ``query.ts`` 读 ``signal.aborted``;SDK 原语为 bool(D-SEM-1),
48
70
  退出语义仅走 ``LoopAbortSignal`` → ``builtin_loop_control``(D-ABORT-1)。
49
71
  无 RunContext 时 no-op。
50
- """
51
- from .run_context import get_run_context
52
72
 
53
- ctx = get_run_context()
54
- if ctx is None or not ctx.cancel_requested:
73
+ **禁止**在 ``except CancelledError`` 内调用本函数再让异常逃逸;该路径应
74
+ ``is_cancel_requested`` + 就地 abort 响应(D-A′-1)。
75
+ """
76
+ if not is_cancel_requested():
55
77
  return
56
- if phase == "tools":
57
- raise LoopAbortSignal(
58
- TERMINAL_REASON_ABORTED_TOOLS,
59
- detail="cancel_requested",
60
- )
61
- raise LoopAbortSignal(
62
- TERMINAL_REASON_ABORTED_STREAMING,
63
- detail="cancel_requested",
64
- )
78
+ raise abort_signal_for_phase(phase)
65
79
 
66
80
 
67
- __all__ = ["CancelAbortPhase", "LoopAbortSignal", "raise_if_cancel_requested"]
81
+ __all__ = [
82
+ "CancelAbortPhase",
83
+ "LoopAbortSignal",
84
+ "abort_signal_for_phase",
85
+ "is_cancel_requested",
86
+ "raise_if_cancel_requested",
87
+ ]
@@ -21,8 +21,12 @@ from typing import Any, AsyncIterator, Literal
21
21
 
22
22
  from langgraph.errors import GraphRecursionError
23
23
 
24
+ from langchain_agentx.loop.loop_abort import LoopAbortSignal, is_cancel_requested
24
25
  from ..exit.reason_codes import (
26
+ TERMINAL_REASON_ABORTED_STREAMING,
27
+ TERMINAL_REASON_ABORTED_TOOLS,
25
28
  TERMINAL_REASON_GRAPH_RUNTIME_ERROR,
29
+ TERMINAL_REASON_HOOK_STOPPED,
26
30
  TERMINAL_REASON_RUNTIME_BUDGET_EXHAUSTED,
27
31
  TRANSITION_REACTIVE_COMPACT_RETRY,
28
32
  )
@@ -43,6 +47,14 @@ logger = logging.getLogger(__name__)
43
47
  # CC `tengu_query_error` 的 SDK trace 等价 event_type
44
48
  LOOP_STREAM_DRIVER_ERROR_EVENT = "loop.stream_driver.error"
45
49
 
50
+ _ABORT_TERMINAL_REASONS = frozenset(
51
+ {
52
+ TERMINAL_REASON_ABORTED_STREAMING,
53
+ TERMINAL_REASON_ABORTED_TOOLS,
54
+ TERMINAL_REASON_HOOK_STOPPED,
55
+ }
56
+ )
57
+
46
58
 
47
59
  class LoopStreamDriver:
48
60
  def __init__(self) -> None:
@@ -123,9 +135,65 @@ class LoopStreamDriver:
123
135
  self._log_missing_root_chain_end_anomaly()
124
136
  except asyncio.CancelledError as exc:
125
137
  self.result.final_error = exc
138
+ # 用户 Stop 触发的 Task.cancel:合成 abort closeout(D-A′-3 / I7 区分裸 cancel)
139
+ if is_cancel_requested() and not self.result.saw_finish_surface:
140
+ reason = TERMINAL_REASON_ABORTED_STREAMING
141
+ terminal = build_loop_terminal(
142
+ reason=reason,
143
+ error_kind="aborted",
144
+ step=(self.result.last_loop_snapshot or {}).get("step"),
145
+ turn_count=(self.result.last_loop_snapshot or {}).get("turn_count"),
146
+ provider_finish_reason=(self.result.last_loop_snapshot or {}).get(
147
+ "finish_reason"
148
+ ),
149
+ errors=[str(exc) or "cancel_requested"],
150
+ )
151
+ self.result.terminal = terminal
152
+ synthetic_output = self._build_synthetic_graph_output(terminal)
153
+ self.result.graph_output = synthetic_output
154
+ self.result.saw_finish_surface = True
155
+ yield build_synthetic_root_chain_end(graph_output=synthetic_output)
126
156
  for repair in self._orphan_tool_result_repairs(closeout_kind="cancelled"):
127
157
  yield repair
128
158
  raise
159
+ except LoopAbortSignal as exc:
160
+ # D-A′-3:同轨 abort closeout;禁止落入 graph_runtime_error
161
+ self.result.final_error = exc
162
+ reason = (
163
+ exc.terminal_reason
164
+ if exc.terminal_reason in _ABORT_TERMINAL_REASONS
165
+ else TERMINAL_REASON_ABORTED_STREAMING
166
+ )
167
+ logger.info(
168
+ "LoopStreamDriver graph stream aborted: %s",
169
+ exc.detail or reason,
170
+ extra={"loop_stream_driver_abort": {"terminal_reason": reason}},
171
+ )
172
+ for repair in self._orphan_tool_result_repairs(closeout_kind="interrupted"):
173
+ yield repair
174
+ if not self.result.saw_error_visible_surface:
175
+ self.result.saw_error_visible_surface = True
176
+ yield build_synthetic_error_visible_event(
177
+ message=str(exc.detail or reason),
178
+ error_kind="aborted",
179
+ )
180
+ if not self.result.saw_finish_surface:
181
+ terminal = build_loop_terminal(
182
+ reason=reason,
183
+ error_kind="aborted",
184
+ step=(self.result.last_loop_snapshot or {}).get("step"),
185
+ turn_count=(self.result.last_loop_snapshot or {}).get("turn_count"),
186
+ provider_finish_reason=(self.result.last_loop_snapshot or {}).get(
187
+ "finish_reason"
188
+ ),
189
+ errors=[str(exc)],
190
+ )
191
+ self.result.terminal = terminal
192
+ synthetic_output = self._build_synthetic_graph_output(terminal)
193
+ self.result.graph_output = synthetic_output
194
+ self.result.saw_finish_surface = True
195
+ yield build_synthetic_root_chain_end(graph_output=synthetic_output)
196
+ raise
129
197
  except GraphRecursionError as exc:
130
198
  self.result.final_error = exc
131
199
  self._log_catch_error(exc)
@@ -43,7 +43,12 @@ from langchain_agentx.loop.exit.reason_codes import (
43
43
  TERMINAL_REASON_HOOK_STOPPED,
44
44
  )
45
45
  from langchain_agentx.loop.exit.terminal import apply_terminal_reason_projection, read_terminal_reason
46
- from langchain_agentx.loop.loop_abort import LoopAbortSignal, raise_if_cancel_requested
46
+ from langchain_agentx.loop.loop_abort import (
47
+ LoopAbortSignal,
48
+ abort_signal_for_phase,
49
+ is_cancel_requested,
50
+ raise_if_cancel_requested,
51
+ )
47
52
  from langchain_agentx.loop.run_context import register_spawned_task
48
53
  from langchain_agentx.loop.stream.loop_driver import LoopStreamDriver
49
54
  from langchain_agentx.loop.subagent.context import (
@@ -598,7 +603,9 @@ async def _collect_subagent_events(
598
603
  child_run_id=child_run_id,
599
604
  )
600
605
  except asyncio.CancelledError:
601
- raise_if_cancel_requested(phase="model")
606
+ # D-A′-1:就地转为 LoopAbortSignal 再抛给 body(勿在 except 内 raise_if 逃逸)
607
+ if is_cancel_requested():
608
+ raise abort_signal_for_phase("model") from None
602
609
  raise
603
610
  except LoopAbortSignal:
604
611
  # 上抛给 _run_subagent_body → status=interrupted(勿吞成 completed)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langchain-agentx-python
3
- Version: 2.1.9
3
+ Version: 2.2.0
4
4
  Summary: LangChain/LangGraph-based agent utilities for CodeBaseX.
5
5
  Author-email: GoodMood2008 <GoodMood2008@users.noreply.github.com>
6
6
  License: Apache License
@@ -1,4 +1,4 @@
1
- langchain_agentx/__init__.py,sha256=Ap7xVSHcnVF6vuJw2G3SKTcI2QDzn2JSGQZSj-zuHjY,1614
1
+ langchain_agentx/__init__.py,sha256=_jWRBw5rNM52V1JxowuR91v-mVr2N_1x-Adhgz-4XrU,1614
2
2
  langchain_agentx/command/__init__.py,sha256=Ej260S5uFQcmEtGZQG_NH7BYjHoStrpBLtGUsBTxyZk,631
3
3
  langchain_agentx/command/allowed_tools.py,sha256=TVA0VM8rm98H-QbLK_GRiX5RhEAZFxKawliMi4kk96A,3359
4
4
  langchain_agentx/command/context.py,sha256=DIGOGPBw5UGDBm0WNNJlKx1h_9rCRmcdROv4DT61Qug,731
@@ -24,9 +24,9 @@ langchain_agentx/health/__init__.py,sha256=fbav8Q7Yhd5Ykr_C6xjMeJccIip6FyeGkNTeg
24
24
  langchain_agentx/health/checks.py,sha256=eUPT4lDjSBEiwRF8o_5wnEEIQArCWEL3M338OQoKwfA,17965
25
25
  langchain_agentx/health/models.py,sha256=lHwdvn0w-qs-c8mI6I3nlnoCk8--y7gADj7C9u7eO9k,2055
26
26
  langchain_agentx/health/preflight.py,sha256=wGysAnhT-jR1LfyjdaX9diO573Zzt5Z1M3vxDbpdcK0,5612
27
- langchain_agentx/loop/__init__.py,sha256=DspRAfaf_j6NkMByH6TqG1jTis8gyFGAipREVfn_Cng,1305
27
+ langchain_agentx/loop/__init__.py,sha256=JoFPFrlllvGCYFEk2RUuqq9AfUIdLVSNbrRdTRy6g_I,1428
28
28
  langchain_agentx/loop/benchmark_frozen_config.py,sha256=YI4IaDVMBOEucF36F2oNv5mw1TqMG_rm_LJSpKAnFWM,13942
29
- langchain_agentx/loop/loop_abort.py,sha256=IWcbqDA1ye4k00e2-mRjCgOtQl15EDk9tTosbgR4haU,2459
29
+ langchain_agentx/loop/loop_abort.py,sha256=cKlHxZh0u7-drCVqEiRtzkO270MHw6grJuZ1NpKoGfo,3250
30
30
  langchain_agentx/loop/message_contract.py,sha256=Twl83TneU2PRdxgGRBxs6S9_ovRT6cb5WeCUzd6oJnE,2196
31
31
  langchain_agentx/loop/run_context.py,sha256=dhNiLhvqD_QYacGMA0B5P3wWpSe3O6wU_XcVEzb86Z4,8303
32
32
  langchain_agentx/loop/config/__init__.py,sha256=WdRQVXuvGU4myaGOZ8guFFvUb66jfsAIp9DLANJGieg,1083
@@ -67,11 +67,11 @@ langchain_agentx/loop/exit/resolution.py,sha256=taIMHzAUtgrQoU9446-CUXBN0PyCujhl
67
67
  langchain_agentx/loop/exit/terminal.py,sha256=_DAZk-kS4Xd0nxMlayLo60-uj1Y5ozgBjLlWUP6RDdc,3524
68
68
  langchain_agentx/loop/exit/withheld_error.py,sha256=LfX3j7Rgd9VoMzlz7GOs9TPuRe7RXr_Gxweyotx3tqQ,1846
69
69
  langchain_agentx/loop/graph/__init__.py,sha256=9pUUqn7G87n3lV45iYIU24j0wcTHyCD--SSdtv3urh4,136
70
- langchain_agentx/loop/graph/builtin_loop_control.py,sha256=QpiHe8b_yp4fyLlZ8nSXlW19cTrWGvYUkOGQZrXE9Ow,8722
70
+ langchain_agentx/loop/graph/builtin_loop_control.py,sha256=31o4H6SDGC_vECSliXecuVEnzlD1ahlVZ5JzEpxYY04,9248
71
71
  langchain_agentx/loop/graph/factory.py,sha256=TthwQtNiOeT5K-bgBhuW89yrkdP6iyYXCcL4tn-puJk,103958
72
72
  langchain_agentx/loop/graph/graph_edges.py,sha256=kW6Npx-nMIPzcaisCxVPkTwf5Y9GOKy1NWCNkJWeJBQ,47370
73
73
  langchain_agentx/loop/graph/reactive_compact_node.py,sha256=633b5hTnR3BK8GBEKWhzOwGB0BQrVRKozNxDomWFjLo,8762
74
- langchain_agentx/loop/graph/runtime_tools_node.py,sha256=Elppfi83hgSy_9_st4-eZ4sX_usBm2l5dlJyLDqwFjw,7062
74
+ langchain_agentx/loop/graph/runtime_tools_node.py,sha256=wQkbc0ophyefpPZEc0q1vKoJOIdS4S6d6hSsrkdRLDk,7387
75
75
  langchain_agentx/loop/hook/__init__.py,sha256=rOjc1cqWBxrcp651w_SQX50dWY7o28L2c-r8iVs-SWU,2167
76
76
  langchain_agentx/loop/hook/async_hook_runner.py,sha256=SNyuYnQoowZzBTBHQb6o5L9wTG2Rl7qryeMtqFyEsxI,3195
77
77
  langchain_agentx/loop/hook/config.py,sha256=f8XtGGHtyjuRvZNhkU8ohbhyqOHD7mHZn_w0rVXMX_o,9157
@@ -132,7 +132,7 @@ langchain_agentx/loop/runtime/context_factory.py,sha256=m3ics_dOTqEKNlf6ETIOnVj6
132
132
  langchain_agentx/loop/runtime/subagent_execution_paths.py,sha256=Bgyiom48uta1FZcnIE7fIxyrD-VFCRsw7s8IxIxmLb4,4033
133
133
  langchain_agentx/loop/stream/graph_driver.py,sha256=qMZHEw3wJ19Tfbz31-VPLy8Mt6e90xKougIjAoaEFCE,3935
134
134
  langchain_agentx/loop/stream/helpers.py,sha256=b2sqtwrAa5ic5B5AzNqItU8pmDHw13iGs3hBiShSIZk,1390
135
- langchain_agentx/loop/stream/loop_driver.py,sha256=_AMnczeTVDgCuQvZDE06ueWdos3-OPKHioz9XTOeZSE,21696
135
+ langchain_agentx/loop/stream/loop_driver.py,sha256=v9XbmYv4O9ad-SLBXM3FN50V96_77bY8Tlvam13GnzQ,25028
136
136
  langchain_agentx/loop/stream/result.py,sha256=xQb9r1cxGCQpoAZ0gNo71CjhSE3eYOiYp5KnoOBzBF8,1131
137
137
  langchain_agentx/loop/stream/synthetic_events.py,sha256=Z3JT3iTuB9UQOoQXUprAYvaFV0vXEAuf5iqXYH9YSyI,2175
138
138
  langchain_agentx/loop/stream/transcript_gate.py,sha256=4AH3O0l8OrY_GQdqf-TOKOVS3selPLUC0jYLWQUTfkg,4690
@@ -153,7 +153,7 @@ langchain_agentx/loop/subagent/progress.py,sha256=_4YCDnVDH8sBiwXhCQVB8OHaUQwsCO
153
153
  langchain_agentx/loop/subagent/progress_dispatcher.py,sha256=e1Kd16WRUOAJSeAjupukrlxHoyCR_JO84SHqntMCzdQ,3831
154
154
  langchain_agentx/loop/subagent/prompt.py,sha256=p7RgzibNfEJdfX8nBnZGEwQLa3_EgOn4E56T9MBRIEc,1722
155
155
  langchain_agentx/loop/subagent/reasoning_extractor.py,sha256=KrCQtBdKzsjAEfA7H5COuXzBhuGGonT2Su8IEKYlUpA,1334
156
- langchain_agentx/loop/subagent/runner.py,sha256=7T3tflwqpblhnDlBqqJgQvpt8p14qRtUqpc-tSPlR6E,33231
156
+ langchain_agentx/loop/subagent/runner.py,sha256=kUge-LUA2scfSGkocCVACfIC_OApZeOCYG9JTJgGFsI,33446
157
157
  langchain_agentx/loop/subagent/subagent_termination_classifier.py,sha256=ULArQeAibgy6ETSf4vRR0L6X1rsDM7-ZuLzRWQ_pmeY,3158
158
158
  langchain_agentx/loop/subagent/transcript.py,sha256=-S0VjZcvqlJQGkVGu8VDMTYwTwOePdjDHfjYi3uu7BY,7187
159
159
  langchain_agentx/loop/subagent/transcript_message_builder.py,sha256=gcDdbVOospJ9f0b-eM_0Y1uc4yTstaraWZdejokDyDQ,2081
@@ -759,8 +759,8 @@ langchain_agentx/workspace/root_grant_manager.py,sha256=W3gy8HTevbERbXqIgRcjzOXO
759
759
  langchain_agentx/workspace/tool_boundary.py,sha256=UDwX6swpSLsx9HNkYuuRRiV5o7ZZG_Bru2Yn0c5kNX8,5724
760
760
  langchain_agentx/workspace/validators.py,sha256=tQt-6TOcL8Fw7Ig5ebA9S7vGWh1rby920eFW6x8Tk9E,1439
761
761
  langchain_agentx/workspace/view.py,sha256=PGasqTaqhlD03SXXazHuw4RHfV681AIdlsYqL70pEjc,4774
762
- langchain_agentx_python-2.1.9.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
763
- langchain_agentx_python-2.1.9.dist-info/METADATA,sha256=6jvj-EwhulXBUBtaJgpJEaiyiFDPgxUnU7nX6dvS6Zk,24250
764
- langchain_agentx_python-2.1.9.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
765
- langchain_agentx_python-2.1.9.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
766
- langchain_agentx_python-2.1.9.dist-info/RECORD,,
762
+ langchain_agentx_python-2.2.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
763
+ langchain_agentx_python-2.2.0.dist-info/METADATA,sha256=nn2x47UdjwxReSgREvpk012hKVMAXtw303b9JRhUdAM,24250
764
+ langchain_agentx_python-2.2.0.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
765
+ langchain_agentx_python-2.2.0.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
766
+ langchain_agentx_python-2.2.0.dist-info/RECORD,,