fix: isolate project mode per agent instance
This commit is contained in:
1 parent
3f6fb9c63b
commit
9d99e9fc74
3 files changed
+15
-48
No files matched your search
+5
-39
@@ -6,11 +6,7 @@
|
||||
由模型按 L1 中的指针与线索(行数/大小)自行判断是否用 file 工具读取。
|
||||
利用 messages 是 list 引用的事实,直接 mutate 即反映到真正发给 LLM 的内容。
|
||||
|
||||
激活态载体 = 文件锚 temp/.active_project.<宿主pid>(存当前项目名)。PID 键控:
|
||||
- 锚只对写它的那个 GA 进程有效 → 多开 GA 各自激活不同项目,互不可见
|
||||
- GA 关闭即自动失活(重启后 pid 变,旧锚作废);重新激活需经用户确认(SOP 指示)
|
||||
- 进入:agent 读 project_mode_sop,经用户确认后写锚(code_run 中 os.getppid() 即宿主 pid)
|
||||
- 退出:删除该文件。插件加载时清扫旧版无后缀锚与自己 pid 的前世残留(不碰他进程的锚)
|
||||
激活态保存在当前 GenericAgent 实例的 _ga_project_mode_name;各会话互不干扰。
|
||||
|
||||
目录约定:
|
||||
temp/projects/<项目名>/project_memory.md 单文件全文注入的项目记忆
|
||||
@@ -21,43 +17,13 @@ import plugins.hooks as hooks
|
||||
|
||||
_PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
_TEMP = os.path.join(_PROJECT_ROOT, 'temp')
|
||||
_ANCHOR = os.path.join(_TEMP, f'.active_project.{os.getpid()}')
|
||||
|
||||
|
||||
def _cleanup_stale_anchors():
|
||||
"""清扫无主锚:仅删两类能纯靠文件名判定的——旧版无后缀的、自己 pid 的(刚启动
|
||||
不可能写过锚,必是 pid 复用的前世残留)。他进程的锚一律不碰:故意不做存活探测,
|
||||
os.kill(pid, 0) 在 Windows 上语义是终止进程而非探活,任何平台分支都不值得为
|
||||
删除无害残留文件引入杀进程风险(激活判定只认自己 pid 的锚,残留不影响行为)。"""
|
||||
import glob
|
||||
for path in glob.glob(os.path.join(_TEMP, '.active_project*')):
|
||||
pid = path.rsplit('.', 1)[-1]
|
||||
if path != _ANCHOR and pid.isdigit():
|
||||
continue # 他进程的锚(含已死进程的),不碰
|
||||
try: os.remove(path)
|
||||
except OSError: pass
|
||||
|
||||
|
||||
_cleanup_stale_anchors()
|
||||
|
||||
|
||||
def _active_project(ctx=None):
|
||||
"""返回当前激活的项目名;未激活返回 None。
|
||||
|
||||
兼容策略:
|
||||
- 新 TUI 多会话可在当前 GenericAgent 实例上设置 _ga_project_mode_name。
|
||||
只要该属性存在,就以它为准;值为 None/空串表示该 agent 普通模式。
|
||||
- 其它 UI / 旧 SOP 不设置该属性,继续读取 pid 键控文件锚。
|
||||
异常不在此捕获——hooks.trigger 统一捕获并打印,保持可观测。"""
|
||||
parent = None
|
||||
if isinstance(ctx, dict):
|
||||
handler = ctx.get('handler')
|
||||
parent = getattr(handler, 'parent', None)
|
||||
if parent is not None and hasattr(parent, '_ga_project_mode_name'):
|
||||
return getattr(parent, '_ga_project_mode_name', None) or None
|
||||
if not os.path.isfile(_ANCHOR):
|
||||
return None
|
||||
return open(_ANCHOR, encoding='utf-8').read().strip() or None
|
||||
"""返回当前 Agent 实例激活的项目名;未激活返回 None。"""
|
||||
handler = ctx.get('handler') if isinstance(ctx, dict) else None
|
||||
parent = getattr(handler, 'parent', None)
|
||||
return getattr(parent, '_ga_project_mode_name', None) or None
|
||||
|
||||
|
||||
def _project_dir(name):
|
||||
|
||||
Reference in new issue
Block a user