langchain-agentx-python 2.3.0__py3-none-any.whl → 2.3.2__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.3.0"
14
+ __version__ = "2.3.2"
15
15
 
16
16
  from .loop import ( # noqa: F401
17
17
  create_loop_agent,
@@ -756,8 +756,19 @@ class LoopGraphBuilder:
756
756
  include_agent=not user_has_agent_tool,
757
757
  )
758
758
  for tool in self._services.loader.registry.list():
759
- if tool.name not in self._loop_loader.registry._tools:
760
- self._loop_loader.register(tool)
759
+ if tool.name in self._loop_loader.registry._tools:
760
+ existing = self._loop_loader.registry.get(tool.name)
761
+ if existing is not tool:
762
+ # 宿主与 register_default_tools 同名不同实例:保留默认。
763
+ # debug:CLI 镜像全量默认工具时属常态,勿打 stderr(S-4 仍可 caplog)。
764
+ logger.debug(
765
+ "Host loader tool %r not merged into loop; "
766
+ "register_default_tools already registered %r (S-4)",
767
+ tool.name,
768
+ tool.name,
769
+ )
770
+ continue
771
+ self._loop_loader.register(tool)
761
772
  self._runtime_tools = self._loop_loader.registry.list()
762
773
  from ...loop.prompt.tool_aware_sections import collect_enabled_tool_names
763
774
 
@@ -155,6 +155,7 @@ class ToolRuntimeLoader:
155
155
  目的:为 subagent 组装“过滤后的工具池”而不丢失权限/管控语义。
156
156
  """
157
157
  child = ToolRuntimeLoader(
158
+ policy_config=self._process.policy_config,
158
159
  policy_engine=self._process.policy,
159
160
  headless=self._process.headless if headless is None else headless,
160
161
  prompt_handler=self._process.prompt_handler,
@@ -107,6 +107,7 @@ class LoopLoader:
107
107
  agent_home_segment=self._agent_home,
108
108
  session_cwd=effective_cwd,
109
109
  )
110
+ self._merge_skill_read_roots_policy(cfg)
110
111
  self._inject_project_memory_policy(cfg)
111
112
  plugin_ex = PluginCacheGlobExclusions(
112
113
  cache_root=str(cfg.plugin_cache_dir.resolve()),
@@ -210,11 +211,21 @@ class LoopLoader:
210
211
  setter(patterns)
211
212
  return patterns
212
213
 
214
+ def _merge_skill_read_roots_policy(self, workspace_cfg: Any) -> None:
215
+ """G-2:skill 发现目录并入 read_roots(在 project_memory 注入之前)。"""
216
+ from langchain_agentx.tools.skill.source_paths import resolve_skill_read_roots
217
+
218
+ roots = resolve_skill_read_roots(workspace_cfg)
219
+ if not roots:
220
+ return
221
+ base = self._process.effective_policy_config()
222
+ self._process.apply_policy_config(base.with_merged_read_roots(roots))
223
+
213
224
  def _inject_project_memory_policy(self, workspace_cfg: Any) -> None:
214
225
  """Per-loop 注入 CC projects 树读写根与 path_safety layout。"""
215
226
  layout = workspace_cfg.project_memory_layout
216
227
  workspace_root = str(Path(self._workspace_root).resolve())
217
- base = self._process.policy_config or ToolPolicyConfig()
228
+ base = self._process.effective_policy_config()
218
229
  if not base.read_roots:
219
230
  base = replace(base, read_roots=[workspace_root])
220
231
  if not base.write_roots:
@@ -45,9 +45,11 @@ from __future__ import annotations
45
45
  import fnmatch
46
46
  import os
47
47
  import sys
48
+ from pathlib import Path
48
49
  import warnings
49
50
  from abc import ABC, abstractmethod
50
51
  from dataclasses import dataclass, field, replace
52
+ from collections.abc import Iterable
51
53
  from typing import TYPE_CHECKING, Any
52
54
 
53
55
  from .models import AuthorizationDecision, ToolExecutionContext
@@ -123,6 +125,20 @@ class ToolPolicyConfig:
123
125
  normalize_tool_name_set(self.cli_allow_tools),
124
126
  )
125
127
 
128
+ def with_merged_read_roots(
129
+ self,
130
+ extra: Iterable[str | os.PathLike[str]],
131
+ ) -> "ToolPolicyConfig":
132
+ """Union ``read_roots``;保留 cliArg / rules 等字段(Phase 2 skill 发现根)。"""
133
+ merged: list[str] = []
134
+ seen: set[str] = set()
135
+ for raw in (*self.read_roots, *(str(Path(p).expanduser().resolve()) for p in extra)):
136
+ if not raw or raw in seen:
137
+ continue
138
+ seen.add(raw)
139
+ merged.append(raw)
140
+ return replace(self, read_roots=merged)
141
+
126
142
  def with_project_memory_layout(
127
143
  self,
128
144
  layout: "ProjectMemoryLayout",
@@ -313,11 +329,16 @@ class DefaultPolicyEngine(PolicyEngine):
313
329
  config: 策略配置
314
330
  auto_mode_hook: Auto Mode 授权 Hook(可选,Phase 1 集成)
315
331
  """
332
+ self._auto_mode_hook = auto_mode_hook
333
+ self._internal_paths = InternalPathEvaluator()
334
+ self._agent_home_bypass = AgentHomeSessionBypassEvaluator()
335
+ self.replace_policy_config(config)
336
+
337
+ def replace_policy_config(self, config: ToolPolicyConfig) -> None:
338
+ """原地更新 config 与派生 roots/authorizer(loop project memory 注入)。"""
316
339
  self._config = config
317
340
  self._read_roots = [os.path.realpath(r) for r in config.read_roots]
318
341
  self._write_roots = [os.path.realpath(r) for r in config.write_roots]
319
- self._auto_mode_hook = auto_mode_hook
320
- self._internal_paths = InternalPathEvaluator()
321
342
  self._path_safety: PathSafetyEvaluator | None = None
322
343
  if config.enable_path_safety and config.path_safety is not None:
323
344
  self._path_safety = PathSafetyEvaluator(
@@ -341,7 +362,6 @@ class DefaultPolicyEngine(PolicyEngine):
341
362
  self._within_root(real_path, r) for r in self._read_roots
342
363
  ),
343
364
  )
344
- self._agent_home_bypass = AgentHomeSessionBypassEvaluator()
345
365
 
346
366
  def authorize(
347
367
  self,
@@ -50,14 +50,21 @@ class ProcessLoader:
50
50
  permission_resolver=permission_resolver,
51
51
  )
52
52
  self._adapter = LangChainAdapter()
53
- self._policy_config = policy_config
54
53
  if policy_engine is not None:
55
54
  self._policy: PolicyEngine | None = policy_engine
55
+ if policy_config is not None:
56
+ self._policy_config = policy_config
57
+ elif isinstance(policy_engine, DefaultPolicyEngine):
58
+ self._policy_config = policy_engine._config
59
+ else:
60
+ self._policy_config = None
56
61
  elif policy_config is not None:
62
+ self._policy_config = policy_config
57
63
  self._policy = DefaultPolicyEngine(policy_config)
58
64
  else:
59
- self._policy = DefaultPolicyEngine(ToolPolicyConfig())
60
- self._policy_config = ToolPolicyConfig()
65
+ empty = ToolPolicyConfig()
66
+ self._policy_config = empty
67
+ self._policy = DefaultPolicyEngine(empty)
61
68
 
62
69
  def set_permission_resolver(
63
70
  self,
@@ -141,12 +148,22 @@ class ProcessLoader:
141
148
  def permission_resolver(self) -> PermissionResolver | None:
142
149
  return self._permission_resolver
143
150
 
151
+ def effective_policy_config(self) -> ToolPolicyConfig:
152
+ """policy_config → DefaultPolicyEngine._config → 空配置(loop 注入 SSOT)。"""
153
+ if self._policy_config is not None:
154
+ return self._policy_config
155
+ policy = self._policy
156
+ if isinstance(policy, DefaultPolicyEngine):
157
+ return policy._config
158
+ return ToolPolicyConfig()
159
+
144
160
  def apply_policy_config(self, policy_config: ToolPolicyConfig) -> None:
145
- """替换策略配置并重建 DefaultPolicyEngine(保留 auto_mode hook)。"""
146
- auto_hook = None
147
- if isinstance(self._policy, DefaultPolicyEngine):
148
- auto_hook = self._policy._auto_mode_hook
161
+ """替换策略配置;DefaultPolicyEngine 原地 rebind,保留 engine 实例 id。"""
149
162
  self._policy_config = policy_config
163
+ if isinstance(self._policy, DefaultPolicyEngine):
164
+ self._policy.replace_policy_config(policy_config)
165
+ return
166
+ auto_hook = None
150
167
  self._policy = DefaultPolicyEngine(policy_config, auto_mode_hook=auto_hook)
151
168
 
152
169
  def sync_permission_rules_from_disk(
@@ -24,6 +24,8 @@ from langchain_agentx.tool_runtime.permission_rules import (
24
24
  )
25
25
  from langchain_agentx.tools.bash.read_only_validation import BashReadOnlyClassifier
26
26
 
27
+ from langchain_agentx.tool_runtime.policy import PolicyEngine, resolve_default_policy_engine
28
+
27
29
  if TYPE_CHECKING:
28
30
  from langchain_agentx.tool_runtime.policy import DefaultPolicyEngine
29
31
 
@@ -80,13 +82,14 @@ def cliarg_bash_has_content_allow_without_bare_tool(
80
82
  def try_registry_bash_content_allow_decision(
81
83
  command: str,
82
84
  ctx: ToolExecutionContext,
83
- policy_engine: DefaultPolicyEngine | None,
85
+ policy_engine: PolicyEngine | None,
84
86
  ) -> AuthorizationDecision | None:
85
87
  """cliArg/settings 等内容级 Bash allow(CC bashPermissions prefix allow,path 通过后)。"""
86
- if policy_engine is None:
88
+ engine = resolve_default_policy_engine(policy_engine)
89
+ if engine is None:
87
90
  return None
88
91
  registry = build_permission_rule_registry(
89
- policy_config=policy_engine._config,
92
+ policy_config=engine._config,
90
93
  session_store=ctx.session_store,
91
94
  workspace_root=ctx.workspace_root,
92
95
  agent_home_segment=ctx.agent_home_segment,
@@ -107,10 +110,11 @@ def promote_unscoped_bash_passthrough_to_ask(
107
110
  *,
108
111
  command: str,
109
112
  ctx: ToolExecutionContext,
110
- policy_engine: DefaultPolicyEngine | None,
113
+ policy_engine: PolicyEngine | None,
111
114
  ) -> AuthorizationDecision:
112
115
  """无 cliArg Bash allow 时,write_roots 静默 allow → ask(对齐 CC passthrough)。"""
113
- if policy_engine is None or decision.behavior != "allow":
116
+ engine = resolve_default_policy_engine(policy_engine)
117
+ if engine is None or decision.behavior != "allow":
114
118
  return decision
115
119
  if _READ_ONLY_CLASSIFIER.classify(
116
120
  command.strip(),
@@ -120,7 +124,7 @@ def promote_unscoped_bash_passthrough_to_ask(
120
124
  if decision.policy_id != "write_roots":
121
125
  return decision
122
126
  registry = build_permission_rule_registry(
123
- policy_config=policy_engine._config,
127
+ policy_config=engine._config,
124
128
  session_store=ctx.session_store,
125
129
  workspace_root=ctx.workspace_root,
126
130
  agent_home_segment=ctx.agent_home_segment,
@@ -145,13 +149,14 @@ def promote_unmatched_cliarg_content_only_allow_to_ask(
145
149
  *,
146
150
  command: str,
147
151
  ctx: ToolExecutionContext,
148
- policy_engine: DefaultPolicyEngine | None,
152
+ policy_engine: PolicyEngine | None,
149
153
  ) -> AuthorizationDecision:
150
154
  """roots 内 silent allow → ask(仅 cliArg 有 Bash(pattern) 且无裸 Bash 时)。"""
151
- if policy_engine is None or decision.behavior != "allow" or decision.policy_id:
155
+ engine = resolve_default_policy_engine(policy_engine)
156
+ if engine is None or decision.behavior != "allow" or decision.policy_id:
152
157
  return decision
153
158
  registry = build_permission_rule_registry(
154
- policy_config=policy_engine._config,
159
+ policy_config=engine._config,
155
160
  session_store=ctx.session_store,
156
161
  workspace_root=ctx.workspace_root,
157
162
  agent_home_segment=ctx.agent_home_segment,
@@ -61,6 +61,26 @@ def resolve_managed_skills_dir(agent_home_segment: str) -> Path:
61
61
  return resolve_managed_settings_root() / segment / "skills"
62
62
 
63
63
 
64
+ def resolve_skill_read_roots(
65
+ workspace_cfg: ResolvedAgentStateConfig,
66
+ *,
67
+ project_skills_dir: Path | None = None,
68
+ ) -> tuple[Path, ...]:
69
+ """Skill 发现目录绝对路径(与 ``resolve_skill_source_specs`` 同源,去重保序)。"""
70
+ seen: set[Path] = set()
71
+ roots: list[Path] = []
72
+ for spec in resolve_skill_source_specs(
73
+ workspace_cfg,
74
+ project_skills_dir=project_skills_dir,
75
+ ):
76
+ resolved = spec.skills_dir.expanduser().resolve()
77
+ if resolved in seen:
78
+ continue
79
+ seen.add(resolved)
80
+ roots.append(resolved)
81
+ return tuple(roots)
82
+
83
+
64
84
  def resolve_skill_source_specs(
65
85
  workspace_cfg: ResolvedAgentStateConfig,
66
86
  *,
@@ -83,6 +103,7 @@ __all__ = [
83
103
  "SourcedSkillEntry",
84
104
  "policy_skills_disabled",
85
105
  "resolve_managed_skills_dir",
106
+ "resolve_skill_read_roots",
86
107
  "resolve_skill_source_specs",
87
108
  "resolve_user_skills_dir",
88
109
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langchain-agentx-python
3
- Version: 2.3.0
3
+ Version: 2.3.2
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
@@ -216,34 +216,22 @@ Classifier: Operating System :: OS Independent
216
216
  Requires-Python: >=3.11
217
217
  Description-Content-Type: text/markdown
218
218
  License-File: LICENSE
219
- Requires-Dist: langgraph<1.3.0,>=1.2.5
219
+ Requires-Dist: langgraph<1.3.0,>=1.2.11
220
220
  Requires-Dist: langgraph-prebuilt<1.2.0,>=1.1.0
221
- Requires-Dist: langchain<2.0.0,>=1.3.9
222
- Requires-Dist: langchain-core<2.0.0,>=1.4.7
223
- Requires-Dist: langchain-text-splitters>=1.1.0
224
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6
225
- Requires-Dist: langchain-google-genai<5.0.0,>=4.2.0
226
- Requires-Dist: langchain-community>=0.4.2
227
- Requires-Dist: langchain-openai>=1.3.2
228
- Requires-Dist: openai
221
+ Requires-Dist: langchain<2.0.0,>=1.4.2
222
+ Requires-Dist: langchain-core<2.0.0,>=1.6.3
223
+ Requires-Dist: langchain-text-splitters>=1.1.2
224
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.6.1
225
+ Requires-Dist: langchain-google-genai<4.4,>=4.3.7
226
+ Requires-Dist: langchain-openai>=1.6.2
227
+ Requires-Dist: openai<4.0.0,>=2.45.0
228
+ Requires-Dist: aiohttp>=3.14.3
229
229
  Requires-Dist: tree-sitter==0.21.3
230
230
  Requires-Dist: tree-sitter-languages>=1.10.2
231
- Requires-Dist: networkx
232
- Requires-Dist: matplotlib
233
- Requires-Dist: graspologic
234
- Requires-Dist: future
235
231
  Requires-Dist: wcmatch
236
- Requires-Dist: faiss-cpu
237
- Requires-Dist: tiktoken
238
- Requires-Dist: google-genai<2.0.0,>=1.61.0
232
+ Requires-Dist: google-genai<2.0.0,>=1.65.0
239
233
  Requires-Dist: google-auth<3.0.0,>=2.48.0
240
234
  Requires-Dist: filetype==1.2.0
241
- Requires-Dist: uvicorn[standard]
242
- Requires-Dist: pycryptodome
243
- Requires-Dist: chardet>=5.0.0
244
- Requires-Dist: pandas
245
- Requires-Dist: mcp>=1.19.0
246
- Requires-Dist: fastapi
247
235
  Requires-Dist: portalocker<4,>=2.8.2
248
236
  Requires-Dist: filelock>=3.0
249
237
  Requires-Dist: cachetools<7,>=5.3
@@ -1,4 +1,4 @@
1
- langchain_agentx/__init__.py,sha256=8oCd_P48WoQZB9jQROU6rc2POQ3qA6K1LHWG1xtaSPo,1614
1
+ langchain_agentx/__init__.py,sha256=UYRKrpqJvIQs_odLFNlRSJVoGCAv6UA1VLWG64SQ0gE,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
@@ -68,7 +68,7 @@ langchain_agentx/loop/exit/terminal.py,sha256=_DAZk-kS4Xd0nxMlayLo60-uj1Y5ozgBjL
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
70
  langchain_agentx/loop/graph/builtin_loop_control.py,sha256=31o4H6SDGC_vECSliXecuVEnzlD1ahlVZ5JzEpxYY04,9248
71
- langchain_agentx/loop/graph/factory.py,sha256=TthwQtNiOeT5K-bgBhuW89yrkdP6iyYXCcL4tn-puJk,103958
71
+ langchain_agentx/loop/graph/factory.py,sha256=BMNHUGqNhOhcqxtdsB0TeI5ZHqK_0QdDwb3K32LmhxA,104607
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
74
  langchain_agentx/loop/graph/runtime_tools_node.py,sha256=wQkbc0ophyefpPZEc0q1vKoJOIdS4S6d6hSsrkdRLDk,7387
@@ -406,8 +406,8 @@ langchain_agentx/tool_runtime/failure_event_emitter.py,sha256=C7c4Gc7Vo_R6_ah2Xx
406
406
  langchain_agentx/tool_runtime/identical_call_cache.py,sha256=v8WWuTHWR5ThujcMO4Ty28mZS_w-JN24267fZ4PHWK8,3865
407
407
  langchain_agentx/tool_runtime/inner_permission_chain.py,sha256=50wYXRu7Hi-rvDiI2QxSLC4uBAsJwG3Vp-v3AutLY4E,17629
408
408
  langchain_agentx/tool_runtime/limits.py,sha256=imE1IetmyKQM82INR0VkP3qZNM4bjUJuf1CG5BkY0uw,356
409
- langchain_agentx/tool_runtime/loader.py,sha256=ZeT-xIB6TDkehqyYWx1gkvI0aKx9_xKDKJhqyIvlAvw,9397
410
- langchain_agentx/tool_runtime/loop_loader.py,sha256=C_4T9XxlDmKaTzGv4MO6mJuR-rd6uueb1ZWwEKvvFaE,9087
409
+ langchain_agentx/tool_runtime/loader.py,sha256=vT1_1QoBCpDGhe9sWRqgDZBcuErF35rAcOAENDrUcCI,9452
410
+ langchain_agentx/tool_runtime/loop_loader.py,sha256=H8QKRmoi3ni-8vkyx90W2zfC4quDOfnNTc3d4ote4hM,9615
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
@@ -424,9 +424,9 @@ langchain_agentx/tool_runtime/permission_settings_loader.py,sha256=Xu6dso0ghh4pb
424
424
  langchain_agentx/tool_runtime/permission_settings_sync.py,sha256=g6TvjWwa7D0kw5rDznPsoMv7xylESPOyWA2vZW4HDm0,4590
425
425
  langchain_agentx/tool_runtime/permission_snapshot.py,sha256=xFoi9fIcZjSw_zrIoyglneM-vJsDOLCEjiVoazr5Ack,1947
426
426
  langchain_agentx/tool_runtime/pipeline.py,sha256=cNC8FzeBtfNo8I02wXsaBbbpwxbVXu67eRnr_OfEU3Y,53104
427
- langchain_agentx/tool_runtime/policy.py,sha256=PLk_-5wu69_Gjqig0pj71brcu6VfLvGSIHsAUHOiYIQ,30068
427
+ langchain_agentx/tool_runtime/policy.py,sha256=CZvkFS9m28q1txTz5MTltKGouMQZJnRVyz8DEfRewYA,30892
428
428
  langchain_agentx/tool_runtime/policy_decorator.py,sha256=XWbgh_TRlPJ-J-RFo1FKjIN_n_Z9rtLTfSwBQoyLTTg,2264
429
- langchain_agentx/tool_runtime/process_loader.py,sha256=1YMn6ntnpdbIHJbO7wF1xuz7gNKYxK0UJAOxq96dZX4,6166
429
+ langchain_agentx/tool_runtime/process_loader.py,sha256=qpgfRIla7Tyvbf9FcwGo5Z8x_ymNdMBxrx7OrZAQpzA,6889
430
430
  langchain_agentx/tool_runtime/prompt_context.py,sha256=Dw3Qs8yWwT7dv-ZVHKnQxtPPKQXGySOQpwH4sstfsjE,3233
431
431
  langchain_agentx/tool_runtime/read_ignore_patterns.py,sha256=l4kNulVDaOdQxcs4FeC2DT6k3172D4hgeafEbqGGvTw,3034
432
432
  langchain_agentx/tool_runtime/read_permission.py,sha256=rwH7NEtL57aUKXVjSf6hMOOvEWOayNFyvI_SNoNCHPA,9284
@@ -535,7 +535,7 @@ langchain_agentx/tools/bash/bash_hardening.py,sha256=KEYKRC7kS_to4mzXuChvCmOIIb4
535
535
  langchain_agentx/tools/bash/bash_registry_content.py,sha256=YHE3PwuLBeFrEux4xNaDZjJpYtUSMFPLYr6A7g-fFxk,3569
536
536
  langchain_agentx/tools/bash/bash_runtime_contract.py,sha256=s8vrvMl7405KLGw2hPFbzlzWohm5JX3c9cImMBgqh8I,1511
537
537
  langchain_agentx/tools/bash/boundary_check.py,sha256=k9Bv-baIAUDE3-c_Brw3VSXXYMv_g3lTM0mabIadnwc,8822
538
- langchain_agentx/tools/bash/command_allow_rules.py,sha256=RYW1M9QpJa2HuvOeU9dnmoiNhmExKA1Sgv5jPWDd_Ag,7357
538
+ langchain_agentx/tools/bash/command_allow_rules.py,sha256=aIXxnb4tD3fDWqADTKAgNaN5DP8TqbMeFw0NxfFtFQQ,7562
539
539
  langchain_agentx/tools/bash/cwd_reporter.py,sha256=mASbKWLb4MiX4zLKY3w1ocIdfhmwj5KRgX4OW_PcAns,2642
540
540
  langchain_agentx/tools/bash/events.py,sha256=xDpPA3zhne2cnlYTmiiPTsV423-h-Nw-VKDR_rlnbGE,6065
541
541
  langchain_agentx/tools/bash/l1_decision_reason.py,sha256=MOL9HBBpJEgypuTiYdNojQBl8eIsTwRge5CtGeYRJKI,5365
@@ -622,7 +622,7 @@ langchain_agentx/tools/skill/policy.py,sha256=SFlW627gyo_-wyIppAqoytBmrLPlSGw-mb
622
622
  langchain_agentx/tools/skill/prompt.py,sha256=tvSqvCGroVdloveiWIYxIPQmpESqzPAs5ZJztvHBdOI,1782
623
623
  langchain_agentx/tools/skill/registry_permission.py,sha256=ns_S6IBOdacrZcgHzCOj9rjlPOIecavF5hW-pHmalcY,3258
624
624
  langchain_agentx/tools/skill/repository_factory.py,sha256=7zDoPDZgxoR03CkmKdx9b0aUXwaH8E5LtBYQPGF26rA,1222
625
- langchain_agentx/tools/skill/source_paths.py,sha256=7qhErxCyDTBiGZc41i_EqMZi6aueCdY4kvMJ03g6z4s,2996
625
+ langchain_agentx/tools/skill/source_paths.py,sha256=2CeVYF37JONiXrKQcogdBs0Y31p9AAMIOgGXZKnBQfE,3651
626
626
  langchain_agentx/tools/skill/tool.py,sha256=vhiwjeyST9BhsMZmKk8-Vej3JId0AxTPrQ5ebFvguG4,19711
627
627
  langchain_agentx/tools/skill/bundled/__init__.py,sha256=gaCH_mROpv0lIgLjin1VIFu-8hbP2nY1PHoF7vZt2Ns,4516
628
628
  langchain_agentx/tools/skill/bundled/prompts.py,sha256=gcaTnNRlWfHNPgO3EfZxU9vMYbOapMrAduvgaVc-_Fc,4838
@@ -766,8 +766,8 @@ langchain_agentx/workspace/root_grant_manager.py,sha256=W3gy8HTevbERbXqIgRcjzOXO
766
766
  langchain_agentx/workspace/tool_boundary.py,sha256=UDwX6swpSLsx9HNkYuuRRiV5o7ZZG_Bru2Yn0c5kNX8,5724
767
767
  langchain_agentx/workspace/validators.py,sha256=tQt-6TOcL8Fw7Ig5ebA9S7vGWh1rby920eFW6x8Tk9E,1439
768
768
  langchain_agentx/workspace/view.py,sha256=PGasqTaqhlD03SXXazHuw4RHfV681AIdlsYqL70pEjc,4774
769
- langchain_agentx_python-2.3.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
770
- langchain_agentx_python-2.3.0.dist-info/METADATA,sha256=PGoShL7qCuKn4cToEl22oCzy1TD3bu1o7uYqnN9rpOk,24250
771
- langchain_agentx_python-2.3.0.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
772
- langchain_agentx_python-2.3.0.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
773
- langchain_agentx_python-2.3.0.dist-info/RECORD,,
769
+ langchain_agentx_python-2.3.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
770
+ langchain_agentx_python-2.3.2.dist-info/METADATA,sha256=kIbTWeDzgAZS7u3vcxnCjP_NGMr1C6S3fUvdo_Ervw8,23942
771
+ langchain_agentx_python-2.3.2.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
772
+ langchain_agentx_python-2.3.2.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
773
+ langchain_agentx_python-2.3.2.dist-info/RECORD,,