ai_co_discuss 0.2.27 → 0.2.28

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.
package/docs/runner.md CHANGED
@@ -219,7 +219,7 @@ codiscuss launch start --file 本次启动.json
219
219
  | 软件 | 项目 / cwd 的实际处理 |
220
220
  | --- | --- |
221
221
  | Codex App | 按真实已保存项目 ID、名称和目录唯一匹配后创建;目录必须已加入 App。均省略时新建无项目聊天。现有绑定不能通过改提示迁移到另一目录。 |
222
- | Claude Code CLI | 进程以 cwd 启动,后续按实际 session ID `--resume`。未指定目录时使用本场独立草稿目录;项目名仅作接入元数据,不声称关联 Claude 桌面 App 的项目分组。从 Claude Code 会话内启动接入程序或服务时,会去掉宿主会话注入的 `CLAUDECODE`、`CLAUDE_CODE_*` 等变量,Windows 上再读回用户与系统保存的 `ANTHROPIC_*`/`CLAUDE*` 变量(如 `claude setup-token` 的 `CLAUDE_CODE_OAUTH_TOKEN`),保证子进程使用自己的登录。 |
222
+ | Claude Code CLI | 进程以 cwd 启动,后续按实际 session ID `--resume`。未指定目录时使用本场独立草稿目录;项目名仅作接入元数据,不声称关联 Claude 桌面 App 的项目分组。从 Claude Code 会话内启动接入程序或服务时,会去掉宿主会话注入的 `CLAUDECODE`、`CLAUDE_CODE_*` 等变量,Windows 上再读回用户与系统保存的 `ANTHROPIC_*`/`CLAUDE*` 变量(如 `claude setup-token` 的 `CLAUDE_CODE_OAUTH_TOKEN`),保证子进程使用自己的登录。停止或打断时,Windows 上用 `taskkill /T /F` 结束整个进程树,否则 Claude 已启动的 PowerShell / Bash 工具命令会在停止后继续运行;其他系统和 `taskkill` 不可用时回退为普通结束。已知边界:Codex 0.163.0 的同类实测未复现,Antigravity CLI 未验证,超时与完成后清理路径未单独验证。 |
223
223
  | Antigravity App | 显式 setup-sidecar 将 Sidecar 绑定到实际项目,核对其资源目录及 App 返回的项目 ID;均省略时使用 Outside of Project。使用 App 2.23 当前配置版本,升级后须复核兼容性。 |
224
224
 
225
225
  cwd 是工作目录,不等于操作系统沙箱或权限提升。讨论材料在用户指定的 cwd,回答草稿只放任务中的 `draft_directory`;CLI 与凭据是显式的工具路径。路径和项目配置仅保存在本机,不进入公开事件。
@@ -362,6 +362,8 @@ codiscuss service --help
362
362
 
363
363
  `codiscuss service shortcut` 在 Windows 桌面创建「AI CoDiscuss 讨论服务」快捷方式:双击即启动后台服务(已运行则复用),并用默认浏览器打开已登记的讨论网站。`codiscuss service autostart on|off` 在当前用户的启动文件夹添加或删除登录自启快捷方式,默认不开启。登记表、锁、`status.json` 与 `service.log` 位于用户目录的 `~/.codiscuss`(Windows 为 `%USERPROFILE%\.codiscuss`),不随 npm 包升级变化,可用 `DISCUSS_SERVICE_HOME` 改变。旧版本的 `%LOCALAPPDATA%/ai-codiscuss/service`(其他系统 `~/.local/state/ai-codiscuss/service`)在新目录不存在、且旧目录的讨论服务与本机网站都已停止时,由下一次命令整体移入新目录,并把 `rooms.json`、`launches/` 等 JSON 及已登记外部房间配置中指向旧目录的绝对路径改写为新路径,运行目录的草稿随之改名;旧服务仍在运行,或命令在会重定向 AppData 的 MSIX 应用内执行时,继续使用旧目录(须从普通终端完成迁移),执行 `codiscuss local stop`(独立服务另需 `service stop`)后再运行命令即可迁移。各房间的游标、收件箱与会话绑定仍在各自数据目录。
364
364
 
365
+ `service.log` 除房间状态变化外,还按房间记录全自动讨论的派发(事件、参与者、角色)、每次投递失败(次数、是否确认未送出)、执行失败原因和因运行代次变化被撤销的过期事件,用于排查“重启后原安排又回到暂停”。
366
+
365
367
  ## Antigravity Sidecar
366
368
 
367
369
  ```sh
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai_co_discuss",
3
- "version": "0.2.27",
3
+ "version": "0.2.28",
4
4
  "bin": {
5
5
  "codiscuss": "runner/codiscuss.mjs"
6
6
  },
@@ -240,6 +240,19 @@ export function claude_permissions(config, task) {
240
240
  ...commands, ...writable.map(directory => `Edit(${claude_rule_path(directory)}/**)`), ...(config.allowed_tools || [])];
241
241
  }
242
242
 
243
+ /**
244
+ * Windows leaves a killed process's descendants running, so a stopped Claude turn kept its tool commands working.
245
+ * End the whole tree there; elsewhere, or when taskkill cannot run, use the plain kill.
246
+ */
247
+ export function kill_process_tree(child, plain_kill, platform = process.platform, run = spawnSync) {
248
+ if (platform === 'win32' && child.pid && child.exitCode === null && child.signalCode === null) {
249
+ try {
250
+ if (run('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, timeout: CALL_TIMEOUT_MS }).status === 0) return true;
251
+ } catch { /* Fall through to the plain kill. */ }
252
+ }
253
+ return plain_kill();
254
+ }
255
+
243
256
  async function claude_delivery(config, binding, task, spawn_process = spawn) {
244
257
  const session_id = binding.session_id || randomUUID();
245
258
  try { bind_access(task.access_path, session_id); }
@@ -253,6 +266,10 @@ async function claude_delivery(config, binding, task, spawn_process = spawn) {
253
266
  env: standalone_claude_env(),
254
267
  });
255
268
  } catch (error) { throw not_sent(error); }
269
+ if (typeof child.kill === 'function') {
270
+ const plain_kill = child.kill.bind(child);
271
+ child.kill = () => kill_process_tree(child, plain_kill);
272
+ }
256
273
  let spawned = false;
257
274
  const log_path = resolve(task.directory, `claude-${task.id}.log`);
258
275
  let output = '';