Skip to content

fix: 兼容旧宿主的 Bash 注册与会话 cwd,纠正激活假阳性 - #28

Closed
KouzakiUmi wants to merge 1 commit into
KannaKuron:mainfrom
KouzakiUmi:codex/fix-working-directory-compat
Closed

KouzakiUmi wants to merge 1 commit into
KannaKuron:mainfrom
KouzakiUmi:codex/fix-working-directory-compat

Conversation

@KouzakiUmi

Copy link
Copy Markdown
Contributor

问题与修复结果

Fixes #27。

在没有 workingDirectory 服务的 Desktop/Core 上,自有 Bash 模块把该服务声明为硬 inject,Cordis 会让 fiber 静默 INACTIVE。await fiber 仍返回,包装层打印 activated,但 Bash 从未注册。执行入口也缺少旧宿主的会话 cwd 接缝。

本 PR 移除该硬依赖,新增 resolveSessionCwd 统一读取目录:

  • 新宿主(alpha.2 基线):每次调用通过 ctx.get('workingDirectory') 读取真实服务并调用官方 ensure(agent, signal),保留当前目录、验证、恢复及取消语义。服务存在但验证失败时原样报错,不退回旧目录。
  • 缺服务的旧宿主:使用旧官方 policy.workspaceRoot ?? session.header.cwd 接缝;默认目录取该值,相对 workdir 按它解析,绝对 workdir 保留。无 Agent 的调用维持原有执行器默认行为。
  • 激活日志:只有模块 apply() 已执行并且 Bash 在实际工具面可见,才打印 activated。静默 INACTIVE/未注册明确报告 activation failed,并释放 agent scope。

例如会话目录为 D:/session-project 时,缺服务宿主的默认 Bash cwd 为该目录,workdir: scripts 为 D:/session-project/scripts;若真实服务报告 E:/current-project,则仍使用后者。

依赖与范围

直接补装官方 alpha.2 工作目录包不足以兼容旧宿主:该包依赖 fs/sessionProjections/systemPrompt,旧 systemPrompt 缺少 WORKING_DIRECTORY 排序项,会在初始化时拒绝非有限 order。相关源码核查及隔离反证已记入 CHANGELOG。因此本修复适配执行目录读取,不安装或注册另一份 Core 工作目录服务。

本 PR 独立基于上游 main,可独立评审,不依赖开放中的 兼容边界 PR或实验 native PR。实验 native 后续可复用同一目录读取适配器。官方 root PowerShell、既有沙箱行为和版本号保持不变。

验证

环境:Windows / Node 24.13.0 / 实际安装 Core 0.2.1-alpha.2。

  • npm test:159/159,exit0,无 skip/cancel。
  • npm run test:preview:17/17,exit0,无 skip/cancel。
  • 新增回归覆盖旧 policy/header 接缝、缺服务时 Bash 注册、默认/相对/绝对 cwd、policy 优先级、后台 cwd、静默 INACTIVE 失败日志及 scope 释放。
  • 新宿主验证覆盖逐调用目录变化、原 Agent/signal 透传、目录验证失败零 spawn、取消与异常不降级。
  • syntax、diff 检查及 npm pack --dry-run 通过。

preview 使用实际 ToolRuntime/Cordis/私有执行器,命令 provider 与 Jobs admission 为内存桩。旧宿主以缺服务及旧契约形状验证,尚未在 Desktop 0.2.0-rc.2 安装本体或生产 GUI 复验。 报告者的本机补丁验收证据归属原 issue,不作为本 PR 的独立真机验收。

KannaKuron added a commit that referenced this pull request Oct 13, 2026
…pe (absorb PR #28's shape)

Reviewing KouzakiUmi's PR #28 (an independent #27 fix opened in parallel with v0.39.3) against the shipped fix: semantics were identical, but the PR disposed the half-mounted agent scope on a registration miss instead of leaking it, and gated success on an applied+read-back pair. This absorbs the throw-and-dispose shape; the PR is closed with credit.
@KannaKuron

Copy link
Copy Markdown
Owner

感谢这份 PR——它和 v0.39.3 是并行撞车的独立修复(你 22:54 开 PR,维护者同晚基于 #27 报告独立实现并于 00:20 发布 ba09867,review 窗口没有先对上彼此在修同一件事,这是维护侧的流程疏漏)。

对照结论:两个实现的语义完全一致——inject 最小化、ctx.get('workingDirectory') 可选读取、旧宿主退回 policy.workspaceRoot ?? session.header.cwd 接缝、ensure() 失败不吞、激活成功必须经工具面回读确认。其中你对「alpha.2 工作目录包不可直接补装」的分析(旧 systemPrompt 缺 WORKING_DIRECTORY 排序项会拒绝非有限 order)是重要的补充事实,已补进 #27 的回复。

对照中你的实现有两处更优,已吸收进 main(114dcde,将随下个版本发布):

  1. 失败即抛 + 释放 scope:注册未命中时 throw 走 activation failed 日志,finally 释放这个半挂载的 agent scope——v0.39.3 原实现只打日志不清理,scope 会泄漏到 agent 生命周期结束;
  2. success 门控顺序:retained = true(scope 所有权)只在回读通过后才设置,失败路径不占座。

因此本 PR 关闭(Fixes #27 的目标已由 v0.39.3 + 本提交达成),贡献在 CHANGELOG 与源码注释中署名。#26(实验 RFC)上见——那是真正需要你继续的战场。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[v0.39.2] Windows 自有 bash 工具永不注册:模块硬 inject 了宿主不存在的 workingDirectory(cordis 静默 INACTIVE + 假阳性日志)

2 participants