langchain-agentx-python 2.2.5__py3-none-any.whl → 2.2.7__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.2.5"
14
+ __version__ = "2.2.7"
15
15
 
16
16
  from .loop import ( # noqa: F401
17
17
  create_loop_agent,
@@ -176,6 +176,12 @@ class RuntimeTool(ABC):
176
176
  is_concurrency_safe: bool = False
177
177
  """是否支持并发执行。"""
178
178
 
179
+ requires_user_interaction: bool = False
180
+ """
181
+ 对齐 CC ``Tool.requiresUserInteraction()``。
182
+ True 时 bypassPermissions / auto allow 不得吞掉上游 ask(如 AskUser gather)。
183
+ """
184
+
179
185
  never_truncate: bool = False
180
186
  """
181
187
  禁止 ToolOutputManager 截断输出。
@@ -272,6 +278,15 @@ class RuntimeTool(ABC):
272
278
  _ = data, ctx
273
279
  return self.is_concurrency_safe
274
280
 
281
+ def requires_user_interaction_for(
282
+ self,
283
+ data: dict[str, Any],
284
+ ctx: ToolExecutionContext,
285
+ ) -> bool:
286
+ """该次调用是否强制用户交互;默认读取类属性(对齐 CC requiresUserInteraction)。"""
287
+ _ = data, ctx
288
+ return bool(self.requires_user_interaction)
289
+
275
290
  def resolve_capabilities(
276
291
  self,
277
292
  data: dict[str, Any],
@@ -4,12 +4,13 @@ inner_permission_chain.py — CC inner 段 1–5(hasPermissionsToUseToolInner
4
4
  职责:
5
5
  在 PermissionOrchestrator 内编排 global deny/ask → L1 → mode 短路 → path policy
6
6
  → acceptEdits 快路径 → passthrough→ask。
7
+ RUI(requires_user_interaction)上游 ask 对齐 CC step 1e,不被 bypass 吞掉。
7
8
 
8
9
  链路位置:
9
10
  permission_orchestrator._evaluate_inner / _aevaluate_inner
10
11
 
11
12
  当前裁剪范围:
12
- 段 6(auto / L3)不在此模块;auto_mode hook 仍由 aauthorize outer 暂存至 Phase 4。
13
+ 段 6(auto / L3)不在此模块。
13
14
  """
14
15
 
15
16
  from __future__ import annotations
@@ -64,6 +65,9 @@ class InnerPermissionChain:
64
65
  seg12 = self._segment_1_2_global(tool_name, data, ctx, tool_flags)
65
66
  if seg12 is not None:
66
67
  if seg12.behavior == "ask":
68
+ # CC step 1e:RUI + ask 不被 bypassPermissions 吞掉
69
+ if tool.requires_user_interaction_for(data, ctx):
70
+ return seg12
67
71
  seg4 = self._segment_4_mode_shortcircuit(tool, data, ctx, tool_flags)
68
72
  if seg4 is not None:
69
73
  return seg4
@@ -72,6 +76,10 @@ class InnerPermissionChain:
72
76
  l1 = tool.run_l1_permission_check(data, ctx)
73
77
  if l1.outcome != "continue":
74
78
  if l1.outcome == "ask":
79
+ if l1.decision is None:
80
+ raise ValueError(f"L1 outcome={l1.outcome!r} requires decision")
81
+ if tool.requires_user_interaction_for(data, ctx):
82
+ return l1.decision
75
83
  seg4 = self._segment_4_mode_shortcircuit(tool, data, ctx, tool_flags)
76
84
  if seg4 is not None:
77
85
  return seg4
@@ -4,12 +4,13 @@ outer_permission_resolver.py — 段 6 outer 裁决(GAP-3)
4
4
  职责:
5
5
  inner 产出 ask 后:auto 分类器消化 / headless fail-close deny;非 ask 原样返回。
6
6
  classifier 熔断到顶:CLI → ask;headless → ClassifierDenialLimitAbort。
7
+ RUI 工具的 ask 不被 auto allow 吞掉(对齐 CC requiresUserInteraction)。
7
8
 
8
9
  链路位置:
9
10
  PermissionOrchestrator._resolve_outer
10
11
 
11
12
  当前裁剪范围:
12
- 不调用 L3 UI;AskUserQuestion gather 仍由 pipeline 特例处理。
13
+ 不调用 L3 UI;AskUserQuestion gather ask 经 RUI 保留后由 pipeline L3 处理。
13
14
  """
14
15
 
15
16
  from __future__ import annotations
@@ -61,6 +62,8 @@ class OuterPermissionResolver:
61
62
  tool_flags = ctx.tool_flags if hasattr(ctx, "tool_flags") else {}
62
63
  mode = str(tool_flags.get("permission_mode", "default"))
63
64
 
65
+ inner_ask = decision
66
+
64
67
  if mode == "auto":
65
68
  auto_decision = await self._run_auto_mode_hook(tool, data, ctx)
66
69
  if auto_decision is not None:
@@ -70,12 +73,18 @@ class OuterPermissionResolver:
70
73
  ctx,
71
74
  headless=headless,
72
75
  )
73
- if auto_decision.behavior in ("allow", "deny", "ask"):
76
+ if (
77
+ auto_decision.behavior == "allow"
78
+ and tool.requires_user_interaction_for(data, ctx)
79
+ ):
80
+ # CC:忽略 auto allow,保留 ask;继续走下方 headless / 透传
81
+ pass
82
+ elif auto_decision.behavior in ("allow", "deny", "ask"):
74
83
  return auto_decision
75
84
 
76
85
  if headless:
77
- return self._headless_deny(decision)
78
- return decision
86
+ return self._headless_deny(inner_ask)
87
+ return inner_ask
79
88
 
80
89
  @staticmethod
81
90
  async def _run_auto_mode_hook(
@@ -31,8 +31,10 @@ runtime/pipeline.py — 工具执行管道与输出大小管控
31
31
  IdenticalCallMemo;命中则直接返回带 Hint 的 ToolResultEnvelope(不执行 invoke),
32
32
  作为“软提示防重复”策略的执行层硬约束替代。
33
33
 
34
- AskUserQuestion:
35
- `truncate_if_needed` 之后发 `ask_user_question_completed`(`_emit_post_invoke_analytics`)。
34
+ AskUserQuestion(CC L3):
35
+ 无 answers 时 L1 ask → 进 ``_handle_l3_ask``(不再 pending envelope 短路);
36
+ handler 经 ``updated_input`` 注入 answers[+annotations] 后唯一 invoke;
37
+ `truncate_if_needed` 之后发 `ask_user_question_completed`。
36
38
  """
37
39
 
38
40
  from __future__ import annotations
@@ -77,7 +79,9 @@ from .denial_tracking_bridge import (
77
79
  record_l3_response,
78
80
  suppression_observability_events,
79
81
  )
82
+ from .messages import INTERRUPT_MESSAGE_FOR_TOOL_USE
80
83
  from .prompt import (
84
+ DecisionReasonType,
81
85
  HeadlessPromptHandler,
82
86
  LegacyResolverPromptHandler,
83
87
  PermissionUpdate,
@@ -126,41 +130,6 @@ def _as_run_result(
126
130
  _ASK_USER_QUESTION_TOOL_NAME = "AskUserQuestion"
127
131
 
128
132
 
129
- def _try_envelope_pending_user_questions_gather(
130
- *,
131
- tool: RuntimeTool,
132
- auth: AuthorizationDecision,
133
- headless: bool,
134
- ) -> ToolResultEnvelope | None:
135
- """
136
- AskUserQuestion:run_l1 / evaluate_permission 以 behavior=ask + metadata.gather_tool 表达「待 UI 收集答案」。
137
- 在 sync/async pipeline 中于默认 ask→blocked 之前短路,返回 ok envelope(payload 含 questions)。
138
- """
139
- md = auth.metadata or {}
140
- if md.get("gather_tool") != tool.name:
141
- return None
142
- if headless:
143
- return blocked_envelope(
144
- tool.name,
145
- "AskUserQuestion requires interactive mode.",
146
- policy_id="ask_user_question_headless",
147
- )
148
- return ToolResultEnvelope(
149
- status="ok",
150
- tool_name=tool.name,
151
- summary=auth.ask_prompt or auth.message or "Answer questions?",
152
- payload={
153
- "pending_user_questions": True,
154
- "questions": md.get("questions"),
155
- },
156
- meta={
157
- "gather_tool": tool.name,
158
- "permission": "pending_user_questions",
159
- "policy_id": auth.policy_id,
160
- },
161
- )
162
-
163
-
164
133
  def _emit_ask_user_question_analytics(
165
134
  *,
166
135
  tool: RuntimeTool,
@@ -173,9 +142,6 @@ def _emit_ask_user_question_analytics(
173
142
  return
174
143
  if envelope.status != "ok":
175
144
  return
176
- meta_out = envelope.meta or {}
177
- if meta_out.get("permission") == "pending_user_questions":
178
- return
179
145
  collector = ctx.trace_collector
180
146
  session_id = ctx.trace_emit_session_id
181
147
  if collector is None or not isinstance(session_id, str) or not session_id.strip():
@@ -763,26 +729,6 @@ class ToolExecutorPipeline:
763
729
  )
764
730
  return _as_run_result(env, parsed_input=parsed_data, ctx=ctx)
765
731
  if auth.behavior == "ask":
766
- gather = _try_envelope_pending_user_questions_gather(
767
- tool=tool, auth=auth, headless=self._headless
768
- )
769
- if gather is not None:
770
- self._attach_runtime_observability(
771
- gather,
772
- ctx=ctx,
773
- events=[
774
- {
775
- "event": "permission_checked",
776
- "behavior": "pending_user_questions",
777
- "policy_id": auth.policy_id,
778
- },
779
- ],
780
- decision_trace=(auth.metadata or {}).get("decision_trace"),
781
- )
782
- final_g = self._output_manager.truncate_if_needed(
783
- gather, tool, ctx.tool_call_id
784
- )
785
- return _as_run_result(final_g, parsed_input=parsed_data, ctx=ctx)
786
732
  logger.warning(
787
733
  "tool permission requires ask tool=%s headless=%s policy_id=%s",
788
734
  tool.name,
@@ -960,26 +906,6 @@ class ToolExecutorPipeline:
960
906
  )
961
907
  return _as_run_result(env, parsed_input=parsed_data, ctx=ctx)
962
908
  if auth.behavior == "ask":
963
- gather = _try_envelope_pending_user_questions_gather(
964
- tool=tool, auth=auth, headless=self._headless
965
- )
966
- if gather is not None:
967
- self._attach_runtime_observability(
968
- gather,
969
- ctx=ctx,
970
- events=[
971
- {
972
- "event": "permission_checked",
973
- "behavior": "pending_user_questions",
974
- "policy_id": auth.policy_id,
975
- },
976
- ],
977
- decision_trace=(auth.metadata or {}).get("decision_trace"),
978
- )
979
- final_g = self._output_manager.truncate_if_needed(
980
- gather, tool, ctx.tool_call_id
981
- )
982
- return _as_run_result(final_g, parsed_input=parsed_data, ctx=ctx)
983
909
  logger.warning(
984
910
  "tool permission requires ask tool=%s headless=%s policy_id=%s",
985
911
  tool.name,
@@ -1125,6 +1051,12 @@ class ToolExecutorPipeline:
1125
1051
  ctx: ToolExecutionContext,
1126
1052
  auth: AuthorizationDecision,
1127
1053
  ) -> PromptRequest:
1054
+ md = auth.metadata or {}
1055
+ is_gather = md.get("gather_tool") == tool.name
1056
+ questions = md.get("questions") if is_gather else None
1057
+ if is_gather and questions is None:
1058
+ raw_q = parsed_data.get("questions")
1059
+ questions = raw_q if isinstance(raw_q, list) else None
1128
1060
  return PromptRequest(
1129
1061
  tool_name=tool.name,
1130
1062
  input_data=parsed_data,
@@ -1135,6 +1067,8 @@ class ToolExecutorPipeline:
1135
1067
  suggestions=self._suggestions_from_auth(auth),
1136
1068
  headless=False,
1137
1069
  session_headless=self._headless,
1070
+ interaction_kind="gather" if is_gather else "permission",
1071
+ questions=questions if isinstance(questions, list) else None,
1138
1072
  )
1139
1073
 
1140
1074
  def _maybe_suppress_l3_ask(
@@ -1319,21 +1253,51 @@ class ToolExecutorPipeline:
1319
1253
  )
1320
1254
 
1321
1255
  if resp.behavior == "deny":
1256
+ reason = resp.decision_reason
1257
+ is_cancel = (
1258
+ reason is not None and reason.type == DecisionReasonType.USER_ABORT
1259
+ )
1260
+ is_gather = (auth.metadata or {}).get("gather_tool") == tool.name
1261
+ if is_cancel:
1262
+ msg = resp.message or resp.reason or INTERRUPT_MESSAGE_FOR_TOOL_USE
1263
+ behavior_evt = "ask_cancelled_by_user"
1264
+ extra_meta = {
1265
+ "l3_outcome": "cancel",
1266
+ "source_status": "interrupted",
1267
+ "error_kind": "aborted",
1268
+ }
1269
+ else:
1270
+ if is_gather:
1271
+ msg = (
1272
+ resp.message
1273
+ or resp.reason
1274
+ or "User declined to answer questions."
1275
+ )
1276
+ else:
1277
+ msg = (
1278
+ resp.message
1279
+ or resp.reason
1280
+ or auth.ask_prompt
1281
+ or "User rejected the operation."
1282
+ )
1283
+ behavior_evt = "ask_rejected_by_resolver"
1284
+ extra_meta = {"l3_outcome": "decline"}
1322
1285
  env = attach_permission_tool_input(
1323
1286
  blocked_envelope(
1324
1287
  tool.name,
1325
- resp.message or resp.reason or auth.ask_prompt or "User rejected the operation.",
1288
+ msg,
1326
1289
  policy_id=auth.policy_id,
1327
1290
  ),
1328
1291
  parsed_data,
1329
1292
  )
1293
+ env.meta = {**(env.meta or {}), **extra_meta}
1330
1294
  attach_denial_tracking_meta(env, tool, ctx, auth)
1331
1295
  self._attach_runtime_observability(
1332
1296
  env,
1333
1297
  ctx=ctx,
1334
1298
  events=[
1335
1299
  self._permission_checked_event(
1336
- "ask_rejected_by_resolver",
1300
+ behavior_evt,
1337
1301
  auth.policy_id,
1338
1302
  parsed_data,
1339
1303
  decision_source=resp.decision_source.value,
@@ -16,6 +16,7 @@ from .race import HitlRaceCoordinator, PromptBranch, PromptClassifier
16
16
  from .types import (
17
17
  DecisionReason,
18
18
  DecisionReasonType,
19
+ InteractionKind,
19
20
  PermissionUpdate,
20
21
  PromptDecisionSource,
21
22
  PromptRequest,
@@ -26,6 +27,7 @@ __all__ = [
26
27
  "PermissionPromptHandler",
27
28
  "DecisionReason",
28
29
  "DecisionReasonType",
30
+ "InteractionKind",
29
31
  "PermissionUpdate",
30
32
  "PromptDecisionSource",
31
33
  "PromptRequest",
@@ -4,12 +4,15 @@ prompt/types.py — L3 HITL 数据契约
4
4
  职责:
5
5
  PromptRequest / PromptResponse 与 PermissionUpdate、PromptDecisionSource。
6
6
  L2 ask 决策打包为 PromptRequest,L3 产出二态 PromptResponse。
7
+ AskUser gather:interaction_kind=gather;updated_input 可含 answers[+annotations]。
7
8
 
8
9
  链路位置:
9
- ToolExecutorPipeline ask 分支 → PermissionPromptHandler.handle(Phase 3 接线)。
10
+ ToolExecutorPipeline ask 分支 → PermissionPromptHandler.handle。
10
11
 
11
12
  当前裁剪:
12
- PermissionUpdate 为 CC addRules/replaceRules 等的最小 Python 镜像;持久化由 Phase 3 接入。
13
+ PermissionUpdate 为 CC addRules/replaceRules 等的最小 Python 镜像。
14
+ A2:cancel=USER_ABORT / decline=USER_REJECT;reject_with_feedback=P1。
15
+ A3:图片 contentBlocks 旁路未建模。
13
16
  """
14
17
 
15
18
  from __future__ import annotations
@@ -28,6 +31,8 @@ from .messages import (
28
31
  )
29
32
  from ..messages import REJECT_MESSAGE, SUBAGENT_REJECT_MESSAGE
30
33
 
34
+ InteractionKind = Literal["gather", "permission"]
35
+
31
36
 
32
37
  class PromptDecisionSource(StrEnum):
33
38
  """L3 决议来源,对齐 CC decisionReason.type。"""
@@ -108,11 +113,19 @@ class PromptRequest:
108
113
  display_label: str | None = None
109
114
  """UI 短摘要;来自 tool.summary_for_ui_call()。None 时 L3 fallback tool_name。"""
110
115
  suggestions: tuple[PermissionUpdate, ...] = field(default_factory=tuple)
116
+ interaction_kind: InteractionKind = "permission"
117
+ """permission=Allow/Deny;gather=AskUser Q→A(对 CC AskUserQuestionPermissionRequest)。"""
118
+ questions: list[Any] | None = None
119
+ """gather 时的问题列表(常来自 auth.metadata.questions);permission 为 None。"""
111
120
 
112
121
 
113
122
  @dataclass(frozen=True)
114
123
  class PromptResponse:
115
- """L3 → Pipeline 出参;behavior 仅 allow/deny。"""
124
+ """L3 → Pipeline 出参;behavior 仅 allow/deny。
125
+
126
+ allow 时 ``updated_input`` 可含 answers 与可选 annotations(A1)。
127
+ deny 时用 ``decision_reason.type`` 区分 cancel(USER_ABORT)与 decline(USER_REJECT)(A2 MVP)。
128
+ """
116
129
 
117
130
  behavior: Literal["allow", "deny"]
118
131
  decision_source: PromptDecisionSource
@@ -2,13 +2,16 @@
2
2
  tools/ask_user_question/tool.py — AskUserQuestionTool
3
3
 
4
4
  职责:
5
- CC AskUserQuestion 对齐:normalize → validate → permissions(含待答两跳)→ invoke → present。
5
+ CC AskUserQuestion 对齐:normalize → validate → L1 ask(无 answers)→
6
+ L3 注入 answers[+annotations] → invoke → present。
6
7
 
7
8
  链路位置:
8
- ToolRuntimeLoader.register_default_tools;pipeline 对 gather_tool 短路返回 pending envelope。
9
+ ToolRuntimeLoader.register_default_tools;pipeline 对 gather ask 走
10
+ ``_handle_l3_ask``(不再 pending envelope 短路)。
9
11
 
10
12
  当前裁剪范围:
11
- v3:preview HTML 校验(ctx.question_preview_format)、annotations、present 摘要;渠道禁用集合对齐 CC。
13
+ v3:preview HTML 校验、annotations、present 摘要;渠道禁用集合对齐 CC。
14
+ A3 图片 contentBlocks 旁路未做。
12
15
  """
13
16
 
14
17
  from __future__ import annotations
@@ -40,7 +43,7 @@ from .prompt import (
40
43
  )
41
44
  from .validators import QuestionValidator
42
45
 
43
- # AuthorizationDecision.metadata:pipeline 识别待答短路(值须等于 RuntimeTool.name)
46
+ # AuthorizationDecision.metadata:L3 PromptRequest.interaction_kind=gather 识别键
44
47
  GATHER_TOOL_META_KEY = "gather_tool"
45
48
 
46
49
  # CC isEnabled:Telegram/Discord 等无 TUI 渠道
@@ -84,6 +87,7 @@ class AskUserQuestionTool(RuntimeTool):
84
87
  is_read_only: bool = True
85
88
  is_destructive: bool = False
86
89
  is_concurrency_safe: bool = True
90
+ requires_user_interaction: bool = True
87
91
  never_truncate: bool = False
88
92
  dedupe_identical_calls: bool = False
89
93
  max_result_size_chars: int = 100_000
@@ -183,6 +183,8 @@ class ExitPlanModeRuntimeTool(_PlanModeRuntimeToolBase):
183
183
  description: str = EXIT_PLAN_MODE_DESCRIPTION
184
184
  input_model = ExitPlanModeInput
185
185
  output_model = ExitPlanModeOutput
186
+ # 对齐 CC ExitPlanMode.requiresUserInteraction:bypass/auto 不得静默放行确认
187
+ requires_user_interaction: bool = True
186
188
 
187
189
  def prompt_for_model(self, ctx: ToolPromptContext) -> str:
188
190
  _ = ctx
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langchain-agentx-python
3
- Version: 2.2.5
3
+ Version: 2.2.7
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=FDi8b0l3oV8v5zS-G33Yb0qoKw5-jje_-Rfu9sxHzOY,1614
1
+ langchain_agentx/__init__.py,sha256=u163iBLScsjUuLfV2YYL3tProAOl3aRQEK1lyYmWoJA,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
@@ -393,7 +393,7 @@ langchain_agentx/tool_runtime/__init__.py,sha256=C4ZrS6UWSL65ErfNWMvBuZBnht6ZuGb
393
393
  langchain_agentx/tool_runtime/accept_edits_fast_path.py,sha256=UMCOF9Ws7hx3pcYvL-Kq7vzIAGvOGdEfx69ccUDXT-k,2281
394
394
  langchain_agentx/tool_runtime/adapter.py,sha256=rM-Y2zSZ--N-TIvx1HtI1J7ralPU0w4jJuX3bBvIVxM,33847
395
395
  langchain_agentx/tool_runtime/agent_home_bypass.py,sha256=na9xQPgJ02qA3YiJ1F8jN0Uv4uBDPzqRk3lfPPE089g,8010
396
- langchain_agentx/tool_runtime/base.py,sha256=Ez9W42DsaiZcWDDO8UfRKv3E7_Z6WBcABkwdAi6qTK8,21390
396
+ langchain_agentx/tool_runtime/base.py,sha256=asjZ0Rsxchh51OQbt5-h61xoWgC-i5sUbH0e_uSf-X0,21922
397
397
  langchain_agentx/tool_runtime/cancel_projection.py,sha256=81_Bvg8ZiuPdl1usePt7ykXFuO6Sg7UXogYQBX6aysQ,2788
398
398
  langchain_agentx/tool_runtime/capabilities.py,sha256=KHwu5KLqrpPKLOTwHhnvIIs9MTmQYeuS2hAFmI_Nsy8,3837
399
399
  langchain_agentx/tool_runtime/classifier_denial_bridge.py,sha256=Wv40rYc5U3Mn7G3H7sUWrcG78HyLKnrRXvv7Yv9wI5U,2743
@@ -404,14 +404,14 @@ langchain_agentx/tool_runtime/denial_tracking_bridge.py,sha256=qssnZ_tzCIrDeJvtx
404
404
  langchain_agentx/tool_runtime/errors.py,sha256=Ed1FMjBdPfr0WG-YwLIm_7jokl9k_DjHFNiewZTeQfg,8883
405
405
  langchain_agentx/tool_runtime/failure_event_emitter.py,sha256=C7c4Gc7Vo_R6_ah2Xxa2eso7l9Iuz_KTgRV0j0B08rA,10467
406
406
  langchain_agentx/tool_runtime/identical_call_cache.py,sha256=v8WWuTHWR5ThujcMO4Ty28mZS_w-JN24267fZ4PHWK8,3865
407
- langchain_agentx/tool_runtime/inner_permission_chain.py,sha256=zNjrEeeqIZDs_wZzmrfWqFXxCPxgSesEz2VFr1f37S0,16639
407
+ langchain_agentx/tool_runtime/inner_permission_chain.py,sha256=k0uf-Tvr4NitX9xsSvGki2iuwBn0IZZ0t_rQf49CbnE,17075
408
408
  langchain_agentx/tool_runtime/limits.py,sha256=imE1IetmyKQM82INR0VkP3qZNM4bjUJuf1CG5BkY0uw,356
409
409
  langchain_agentx/tool_runtime/loader.py,sha256=ZeT-xIB6TDkehqyYWx1gkvI0aKx9_xKDKJhqyIvlAvw,9397
410
410
  langchain_agentx/tool_runtime/loop_loader.py,sha256=C_4T9XxlDmKaTzGv4MO6mJuR-rd6uueb1ZWwEKvvFaE,9087
411
411
  langchain_agentx/tool_runtime/loop_runtime_context.py,sha256=HBZMdtKD7MpU8o7JmURFZGPTfxr2aFFlFF2nBZR_n8s,3613
412
412
  langchain_agentx/tool_runtime/messages.py,sha256=Fp-ZiLAbOQAQa8uIv-owE8PXtWyhpYSXxtzy3PVbKSw,3631
413
413
  langchain_agentx/tool_runtime/models.py,sha256=cO9EgLKPXiktHl_xXtBwLQrCo6mj4tbT4WoPmuFLE0w,20345
414
- langchain_agentx/tool_runtime/outer_permission_resolver.py,sha256=X3rocXXLvnXCUMufG-mBr1Mk0So7FxLd5nrZo9OE5kg,3763
414
+ langchain_agentx/tool_runtime/outer_permission_resolver.py,sha256=8uKS148DXxt5SfDIHmbRwee4FchKdlquUZbfWeyNRXw,4184
415
415
  langchain_agentx/tool_runtime/override.py,sha256=D8TRftoeWzqlTuWCGUxNkFY7XzWx_d5oxI_ltNibqPA,10258
416
416
  langchain_agentx/tool_runtime/path_safety.py,sha256=dUrl2SObKmRDwdm9k8veO_Eh0iXw0LPLAMZJGxeKnTE,8548
417
417
  langchain_agentx/tool_runtime/permission_context.py,sha256=ReVV2kjVWAPTsPaYXxRB-dICqualEvi2zzwF8NX_Wkk,6229
@@ -422,7 +422,7 @@ langchain_agentx/tool_runtime/permission_rules.py,sha256=ev6-Hm3N8YtbJO3SLGpoGMU
422
422
  langchain_agentx/tool_runtime/permission_settings_loader.py,sha256=Xu6dso0ghh4pb7Puf8nj20nXxjGeQvL4kIGycavwG_o,5624
423
423
  langchain_agentx/tool_runtime/permission_settings_sync.py,sha256=g6TvjWwa7D0kw5rDznPsoMv7xylESPOyWA2vZW4HDm0,4590
424
424
  langchain_agentx/tool_runtime/permission_snapshot.py,sha256=xFoi9fIcZjSw_zrIoyglneM-vJsDOLCEjiVoazr5Ack,1947
425
- langchain_agentx/tool_runtime/pipeline.py,sha256=b4ZlEMH5i3_rqWjPx3g7BD6Yv2hvk-R6qgKFgo-b3eU,54284
425
+ langchain_agentx/tool_runtime/pipeline.py,sha256=cNC8FzeBtfNo8I02wXsaBbbpwxbVXu67eRnr_OfEU3Y,53104
426
426
  langchain_agentx/tool_runtime/policy.py,sha256=PLk_-5wu69_Gjqig0pj71brcu6VfLvGSIHsAUHOiYIQ,30068
427
427
  langchain_agentx/tool_runtime/policy_decorator.py,sha256=XWbgh_TRlPJ-J-RFo1FKjIN_n_Z9rtLTfSwBQoyLTTg,2264
428
428
  langchain_agentx/tool_runtime/process_loader.py,sha256=1YMn6ntnpdbIHJbO7wF1xuz7gNKYxK0UJAOxq96dZX4,6166
@@ -475,7 +475,7 @@ langchain_agentx/tool_runtime/execution/appliers/stubs.py,sha256=B4FaJX63uXpOcKR
475
475
  langchain_agentx/tool_runtime/progress/__init__.py,sha256=iMp-7s8G9_fELXJLPY1sWqpHYqpvtmUyNU3KinJgc5w,727
476
476
  langchain_agentx/tool_runtime/progress/event.py,sha256=tM-lvqhs6435pjVW4BjP9vb2Ryuuvwo6CmtybVD8juk,2711
477
477
  langchain_agentx/tool_runtime/progress/sampler.py,sha256=FqJWaYAIBj4xC40qHVkG1MrHHwirZ5rd-I5vnmgmGh8,5362
478
- langchain_agentx/tool_runtime/prompt/__init__.py,sha256=8tQkXdQTjJqgkbJTCCpN1Z_k_wrLNiUoWwluYU8Te4w,1123
478
+ langchain_agentx/tool_runtime/prompt/__init__.py,sha256=bLtNsq8iDMvF9tkwLpBKTJ9Y6iWAfdvsqhOz_u5UvvM,1167
479
479
  langchain_agentx/tool_runtime/prompt/_abort.py,sha256=z9LFN6e067ptsfR571liagkHiQnauoksfMbpoRUIXfo,1568
480
480
  langchain_agentx/tool_runtime/prompt/cli_interactive.py,sha256=3_Uyzu5FeOOCNOC7SvrZr7qalGaCxMbqpiGTyCeZscw,5898
481
481
  langchain_agentx/tool_runtime/prompt/handler.py,sha256=t7TQkBiyPESf6uTBDikmu2iZVPmUmsqH7dO-NZypzdQ,570
@@ -484,7 +484,7 @@ langchain_agentx/tool_runtime/prompt/legacy_resolver_adapter.py,sha256=wFMSSaJrO
484
484
  langchain_agentx/tool_runtime/prompt/messages.py,sha256=IYkQPRSHTW87pZ6u31phWX45ooAG0cqn3OnZ4UyJPOU,1569
485
485
  langchain_agentx/tool_runtime/prompt/race.py,sha256=kNNHxP1CLI3ysVx8T0i8UM_ya190837bSngJYhEsTP4,11326
486
486
  langchain_agentx/tool_runtime/prompt/session_mode.py,sha256=kt_8BxPzoBQmeGbZBvl2ih6n_--4NDjTgK0D2kMryV4,2714
487
- langchain_agentx/tool_runtime/prompt/types.py,sha256=vfokexTdun0pjTlteA4CSb1fX94p0GDdkwCsXeTenlM,4618
487
+ langchain_agentx/tool_runtime/prompt/types.py,sha256=mvPk6HSxKlngihpRnNut1VDbmKsAejHxCKvihzXIREA,5334
488
488
  langchain_agentx/tool_runtime/resolvers/__init__.py,sha256=3nr1ouLHAF1O17Zfg1yKrZ5qAezDwRdVSWKN0lu-Iik,818
489
489
  langchain_agentx/tool_runtime/resolvers/agent_session.py,sha256=ZcQga1itCTX2TgNoIaCfVzV20w7nQjSkgDYRU4AWHto,3855
490
490
  langchain_agentx/tool_runtime/resolvers/background.py,sha256=gSdkP2GiPVr7eV00LRKoeQVgU4eUjbpKgmbNIHAeyUI,869
@@ -524,7 +524,7 @@ langchain_agentx/tools/ask_user_question/constants.py,sha256=vK5QraZBBVj7woW1TF0
524
524
  langchain_agentx/tools/ask_user_question/html_preview.py,sha256=OwNpsH9qm8iJ-TTbzkMFvG49T4-oNJXJXH4OZ8r55wc,3913
525
525
  langchain_agentx/tools/ask_user_question/models.py,sha256=uLc2UK_v8iMFEL1Zk0mUOBYdcg2HfbaLdH68o8kr7GE,3376
526
526
  langchain_agentx/tools/ask_user_question/prompt.py,sha256=0RdVuUeNzQBzPeVrLcbiBqh1uizFgUANvaKOZpVy_qg,2803
527
- langchain_agentx/tools/ask_user_question/tool.py,sha256=-f41ZDny0gi3HLniZ4IoBJJ9bKOQR6GB5D6CE9MpVbI,13362
527
+ langchain_agentx/tools/ask_user_question/tool.py,sha256=DgU7OBAqrJBb77ewQ76okoUFJxTThAiN6PRMPa8_FvU,13467
528
528
  langchain_agentx/tools/ask_user_question/validators.py,sha256=gUYuuKJNrExWGvhFlmhqqSU8ax7s4EhXMvTEjapHeiY,5974
529
529
  langchain_agentx/tools/bash/__init__.py,sha256=molPHFDylE2wWG_aQx7fb0ciAx3wWpdXzIixTZV5ne4,214
530
530
  langchain_agentx/tools/bash/ast_security.py,sha256=6DFd_TwT986dbGkKT3UnDIZioBdmi8mbJcYSI-XEtdM,22444
@@ -591,7 +591,7 @@ langchain_agentx/tools/plan_mode/__init__.py,sha256=wO5FX24xEB0Dx9h6bysBt1ql3wn0
591
591
  langchain_agentx/tools/plan_mode/constants.py,sha256=vBjcx9JTSOhU9jfCJ4RKnCxVQPn0HzHapouKxRf2Zns,293
592
592
  langchain_agentx/tools/plan_mode/models.py,sha256=kRHPJetlB9X5nAq7-bWm1WcC68YsAj17UxY7fR6TpZ4,1204
593
593
  langchain_agentx/tools/plan_mode/prompt.py,sha256=69o04P598fYs70EaHmpx6_XTk6fgxj06njn5Qq51YF0,3935
594
- langchain_agentx/tools/plan_mode/tool.py,sha256=SBp3MZoPEsLiDOu6qXYDIxZwkG0z8OpLDSqIW2aT3iM,8717
594
+ langchain_agentx/tools/plan_mode/tool.py,sha256=IDOPKUn2cdvO43Evsu5Ns0U6x1T3aji8IOtqdBDDyYU,8852
595
595
  langchain_agentx/tools/read/__init__.py,sha256=82jaYnSYVxREh7HR3tiPAoNLQGmdCsWlkFXHyUg9-ME,217
596
596
  langchain_agentx/tools/read/backend.py,sha256=YqKJ5jzMIrND3WC582jDvVA2mh2rKZ12LK9Vt-j3bz0,14524
597
597
  langchain_agentx/tools/read/limits.py,sha256=JrCEv1UCzBYevf0rDgGOFFfOAHCo04LjLOCj5m1rmbc,2843
@@ -761,8 +761,8 @@ langchain_agentx/workspace/root_grant_manager.py,sha256=W3gy8HTevbERbXqIgRcjzOXO
761
761
  langchain_agentx/workspace/tool_boundary.py,sha256=UDwX6swpSLsx9HNkYuuRRiV5o7ZZG_Bru2Yn0c5kNX8,5724
762
762
  langchain_agentx/workspace/validators.py,sha256=tQt-6TOcL8Fw7Ig5ebA9S7vGWh1rby920eFW6x8Tk9E,1439
763
763
  langchain_agentx/workspace/view.py,sha256=PGasqTaqhlD03SXXazHuw4RHfV681AIdlsYqL70pEjc,4774
764
- langchain_agentx_python-2.2.5.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
765
- langchain_agentx_python-2.2.5.dist-info/METADATA,sha256=H6Y0pRHIIab1cfuQGeOYWKXCW0WcbzoFI3fDduI-uDM,24250
766
- langchain_agentx_python-2.2.5.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
767
- langchain_agentx_python-2.2.5.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
768
- langchain_agentx_python-2.2.5.dist-info/RECORD,,
764
+ langchain_agentx_python-2.2.7.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
765
+ langchain_agentx_python-2.2.7.dist-info/METADATA,sha256=hqm9pkU7FcAv244Gd1gPQyI1-A81Xf3uWQmi9YZq-Wg,24250
766
+ langchain_agentx_python-2.2.7.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
767
+ langchain_agentx_python-2.2.7.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
768
+ langchain_agentx_python-2.2.7.dist-info/RECORD,,