@zhushanwen/pi-base-tool-enhance 0.5.3 → 0.5.5
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/README.md +2 -2
- package/package.json +4 -4
- package/skills/base-tool-enhance-ext-config/SKILL.md +3 -3
- package/src/__tests__/background-lifecycle.test.ts +4 -4
- package/src/__tests__/notify.test.ts +1 -1
- package/src/__tests__/pending-reconcile.test.ts +1 -1
- package/src/__tests__/registry.test.ts +1 -1
- package/src/__tests__/subagent-guard.test.ts +5 -5
- package/src/background/output-tail.ts +1 -1
- package/src/background/pending-reconcile.ts +2 -2
- package/src/background/poller.ts +1 -1
- package/src/background/process-exit-guard.ts +3 -3
- package/src/background/registry.ts +5 -5
- package/src/background/spawn-background.ts +1 -1
- package/src/background/subagent-guard.ts +1 -1
- package/src/background/task-store.ts +2 -2
- package/src/background/types.ts +4 -4
- package/src/bash-kill-tool.ts +4 -4
- package/src/bash-output-tool.ts +1 -1
- package/src/index.ts +2 -2
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @zhushanwen/pi-base-tool-enhance
|
|
2
2
|
|
|
3
|
-
同名 override pi 内置 bash 工具的增强层:前台行为 100% 委托 pi 官方工厂(`createBashToolDefinition`),增量提供 background
|
|
3
|
+
同名 override pi 内置 bash 工具的增强层:前台行为 100% 委托 pi 官方工厂(`createBashToolDefinition`),增量提供 background 模式、强制后台白名单与双模式可配置超时。能力面:测试类命令 force-test 白名单命中自动转后台(模式登记于 force-patterns.ts)、网络类挂死保护(可配置前台默认超时)、工具报错审计(tool_error 审计 hook,entry customType 为 `unified-hooks:tool-error`)。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
设计决策沉淀在包内源码注释与本文档。
|
|
6
6
|
|
|
7
7
|
## 配置
|
|
8
8
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhushanwen/pi-base-tool-enhance",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"description": "Base tool enhancement - override builtin bash tool: foreground delegates to pi official factory, incremental background mode (design decisions documented in source comments)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
|
-
"
|
|
7
|
+
"taiji": {
|
|
8
8
|
"role": "universal"
|
|
9
9
|
},
|
|
10
10
|
"pi": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"skills/"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@
|
|
31
|
+
"@zhushanwen/extension-protocol": "0.11.0",
|
|
32
32
|
"@zhushanwen/pi-ext-guards": "0.4.0",
|
|
33
33
|
"@zhushanwen/pi-extension-logger": "0.6.0",
|
|
34
34
|
"@zhushanwen/pi-file-lock": "0.4.0",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"@earendil-works/pi-coding-agent": "^0.84.4",
|
|
43
43
|
"typebox": "*",
|
|
44
|
-
"@zhushanwen/pi-pending-notifications": "0.7.
|
|
44
|
+
"@zhushanwen/pi-pending-notifications": "0.7.4"
|
|
45
45
|
},
|
|
46
46
|
"peerDependenciesMeta": {
|
|
47
47
|
"@zhushanwen/pi-pending-notifications": {
|
|
@@ -16,10 +16,10 @@ description: "使用或排查 @zhushanwen/pi-base-tool-enhance 的 bash 后台/
|
|
|
16
16
|
| 环境 | 路径 |
|
|
17
17
|
|------|------|
|
|
18
18
|
| 独立 pi CLI | `~/.pi/agent/config/base-tool-enhance-ext-config.json` |
|
|
19
|
-
|
|
|
20
|
-
|
|
|
19
|
+
| taiji dev | `~/.taiji-dev/agent/config/base-tool-enhance-ext-config.json` |
|
|
20
|
+
| taiji prod | `~/.taiji/agent/config/base-tool-enhance-ext-config.json` |
|
|
21
21
|
|
|
22
|
-
**动态推导(推荐)**:agentDir 由 pi 核心 `getAgentDir()` 决定(读 `PI_CODING_AGENT_DIR`,默认 `~/.pi/agent`);
|
|
22
|
+
**动态推导(推荐)**:agentDir 由 pi 核心 `getAgentDir()` 决定(读 `PI_CODING_AGENT_DIR`,默认 `~/.pi/agent`);taiji 通过 `TAIJI_AGENT_DATA_DIR` 隔离数据目录。排查时先查这两个 env 组合出实际路径,不要假设单一环境——写错环境的配置文件改了也不生效。
|
|
23
23
|
|
|
24
24
|
文件不存在 / JSON 解析失败 → 全默认值继续工作(工具不报错,warn 落扩展日志)。单键类型错/非法值 → **仅该键**回退默认 + warn,不整体拒载;未知键忽略(前向兼容)。
|
|
25
25
|
|
|
@@ -20,9 +20,9 @@ vi.mock("@earendil-works/pi-coding-agent", () => ({
|
|
|
20
20
|
// 进程原语(ext-simplify-13 后单点在 protocol 子出口)转发真实杀 + 记录调用
|
|
21
21
|
//(timeout 分支断言 killProcessTree 被调)
|
|
22
22
|
const { killTreeCalls } = vi.hoisted(() => ({ killTreeCalls: [] as number[] }));
|
|
23
|
-
vi.mock("@
|
|
23
|
+
vi.mock("@zhushanwen/extension-protocol/background-task", async (importOriginal) => {
|
|
24
24
|
const orig = await importOriginal<
|
|
25
|
-
typeof import("@
|
|
25
|
+
typeof import("@zhushanwen/extension-protocol/background-task")
|
|
26
26
|
>();
|
|
27
27
|
return {
|
|
28
28
|
...orig,
|
|
@@ -33,7 +33,7 @@ vi.mock("@xyz-agent/extension-protocol/background-task", async (importOriginal)
|
|
|
33
33
|
};
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
import { isPidAlive } from "@
|
|
36
|
+
import { isPidAlive } from "@zhushanwen/extension-protocol/background-task";
|
|
37
37
|
|
|
38
38
|
import { createBashKillToolDefinition } from "../bash-kill-tool.ts";
|
|
39
39
|
import { createBashOutputToolDefinition } from "../bash-output-tool.ts";
|
|
@@ -406,7 +406,7 @@ describe("bash_kill tool (killing intent, single-point finalization)", () => {
|
|
|
406
406
|
expect(result.killed).toBe(false);
|
|
407
407
|
expect(result.reason).toBe("cross-process running task owned by another pi process");
|
|
408
408
|
// 收殓已下沉 runtime(u-bte-remove):hint 指向 runtime 收殓而非 reaper
|
|
409
|
-
expect(result.hint).toContain("
|
|
409
|
+
expect(result.hint).toContain("taiji runtime");
|
|
410
410
|
expect(killTreeCalls).not.toContain(foreignPid); // 未发 kill 信号
|
|
411
411
|
});
|
|
412
412
|
|
|
@@ -8,7 +8,7 @@ import { join } from "node:path";
|
|
|
8
8
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
9
9
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
10
10
|
|
|
11
|
-
import { killProcessTree } from "@
|
|
11
|
+
import { killProcessTree } from "@zhushanwen/extension-protocol/background-task";
|
|
12
12
|
import {
|
|
13
13
|
BACKGROUND_BASH_CUSTOM_TYPE,
|
|
14
14
|
buildNotificationContent,
|
|
@@ -5,7 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
|
|
6
6
|
import { afterEach, describe, expect, it } from "vitest";
|
|
7
7
|
|
|
8
|
-
import { MAX_TERMINAL_REGISTRY_ENTRIES } from "@
|
|
8
|
+
import { MAX_TERMINAL_REGISTRY_ENTRIES } from "@zhushanwen/extension-protocol";
|
|
9
9
|
|
|
10
10
|
import {
|
|
11
11
|
getRegistryPath,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/__tests__/subagent-guard.test.ts
|
|
2
2
|
//
|
|
3
3
|
// subagent-guard 判据钉值(ext-simplify-17 D4 重锚定后):
|
|
4
|
-
// -
|
|
4
|
+
// - TAIJI_AGENT_SUBAGENT === "1" 命中(引擎 spawn 链恒注入的现行标记)
|
|
5
5
|
// - 其他值 / 缺失不命中(顶层会话不误降级,background 正常后台化)
|
|
6
6
|
//
|
|
7
7
|
// [HISTORICAL] 对照(D4 重锚前的旧行为):旧判据查 PI_SUBAGENT_* 身份键族两枚、
|
|
@@ -14,13 +14,13 @@ import { describe, expect, it } from "vitest";
|
|
|
14
14
|
import { isSubagentProcess } from "../background/subagent-guard.ts";
|
|
15
15
|
|
|
16
16
|
describe("isSubagentProcess(subagent-guard,D4 重锚后)", () => {
|
|
17
|
-
it("
|
|
18
|
-
expect(isSubagentProcess({
|
|
17
|
+
it("TAIJI_AGENT_SUBAGENT=1 命中(引擎链 subagent → D14 background 降级前提恢复)", () => {
|
|
18
|
+
expect(isSubagentProcess({ TAIJI_AGENT_SUBAGENT: "1" })).toBe(true);
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
it("值非 \"1\" 不命中", () => {
|
|
22
|
-
expect(isSubagentProcess({
|
|
23
|
-
expect(isSubagentProcess({
|
|
22
|
+
expect(isSubagentProcess({ TAIJI_AGENT_SUBAGENT: "0" })).toBe(false);
|
|
23
|
+
expect(isSubagentProcess({ TAIJI_AGENT_SUBAGENT: "" })).toBe(false);
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
it("缺失不命中(顶层会话 → background 正常后台化,guard 不误命中)", () => {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* - readTailSummary:exit 边沿的 tail 摘要(存条目 / M3 通知用)
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { readOutputTail as readOutputTailPrimitive } from "@
|
|
11
|
+
import { readOutputTail as readOutputTailPrimitive } from "@zhushanwen/extension-protocol/background-task";
|
|
12
12
|
|
|
13
13
|
/** pi 内置 bash 同款截断上限(last 2000 lines / 50KB = 51200 bytes,先到为准)。 */
|
|
14
14
|
export const TAIL_MAX_LINES = 2000;
|
|
@@ -35,8 +35,8 @@ import {
|
|
|
35
35
|
BACKGROUND_TASK_ID_PREFIX,
|
|
36
36
|
collectActivePendingIds,
|
|
37
37
|
mapReasonToStatus,
|
|
38
|
-
} from "@
|
|
39
|
-
import { isPidAlive } from "@
|
|
38
|
+
} from "@zhushanwen/extension-protocol";
|
|
39
|
+
import { isPidAlive } from "@zhushanwen/extension-protocol/background-task";
|
|
40
40
|
import { toErrorMessage } from "@zhushanwen/pi-ext-guards";
|
|
41
41
|
import { getLogger } from "@zhushanwen/pi-extension-logger";
|
|
42
42
|
|
package/src/background/poller.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* 可查、对账可补),不加同步握手。
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { isPidAlive } from "@
|
|
16
|
+
import { isPidAlive } from "@zhushanwen/extension-protocol/background-task";
|
|
17
17
|
|
|
18
18
|
import { readTailSummary } from "./output-tail.ts";
|
|
19
19
|
import { readRegistry, taskToRegistryEntry, writeRegistryEntry } from "./registry.ts";
|
|
@@ -18,16 +18,16 @@
|
|
|
18
18
|
* 挂起进程,pi 的 ignore 语义完全失效
|
|
19
19
|
* - rpc/print 模式 Ctrl+C:pi 无 SIGINT listener(dist 全量 grep 唯一注册点在 TUI
|
|
20
20
|
* 挂起态)→ 默认处置进程即死。探针实测:无 listener 的信号默认终止**不触发
|
|
21
|
-
* exit 事件**,同步收殓在该路径本就不可达;孤儿由
|
|
21
|
+
* exit 事件**,同步收殓在该路径本就不可达;孤儿由 taiji runtime 收殓器按
|
|
22
22
|
* 属主判定收殓(u-bte-remove 下沉后;与 SIGKILL 强杀同类,设计内兜底)
|
|
23
23
|
* - cleanup-only listener 更不可取:注册即抑制默认终止,rpc 前台 Ctrl+C 后 pi 变
|
|
24
24
|
* 成杀不死的僵尸进程
|
|
25
25
|
*
|
|
26
|
-
* 子进程死后 registry 目录由
|
|
26
|
+
* 子进程死后 registry 目录由 taiji runtime 启动期兜底扫描覆盖(收殓下沉)——
|
|
27
27
|
* 本单元不管。
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
import { killProcessTree } from "@
|
|
30
|
+
import { killProcessTree } from "@zhushanwen/extension-protocol/background-task";
|
|
31
31
|
import { toErrorMessage } from "@zhushanwen/pi-ext-guards";
|
|
32
32
|
import { getLogger } from "@zhushanwen/pi-extension-logger";
|
|
33
33
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 路径:<dataDir>/base-tool-enhance/<sessionId>/registry.json(dataDir = pi
|
|
5
5
|
* getAgentDir() 同源路径,由调用方解析传入)。条目记 ownerPiPid——收殓侧属主
|
|
6
|
-
* 判定依据(u-bte-remove 后 =
|
|
6
|
+
* 判定依据(u-bte-remove 后 = taiji runtime background-task-reaper),M2 只负责
|
|
7
7
|
* 写入。
|
|
8
8
|
*
|
|
9
9
|
* 行为原语单点(ext-simplify-13):解析防御 / corrupt 隔离 / 原子写 / 序列化 /
|
|
10
|
-
* 终态 LRU 裁剪自 @
|
|
10
|
+
* 终态 LRU 裁剪自 @zhushanwen/extension-protocol background-task 子出口引入——此前
|
|
11
11
|
* 本地实现与 runtime 侧逐字同构、靠注释对齐;本模块只保留 bte 形态薄壳:Map 投影
|
|
12
12
|
* readRegistry 与锁内 RMW 写壳。
|
|
13
13
|
*
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* warn 等)经 onLog 注入本包 logger,落盘通道不变
|
|
18
18
|
* - 锁内 RMW(@zhushanwen/pi-file-lock withFileLockSync)——同 sessionId 目录可能
|
|
19
19
|
* 被桌面端 ephemeral 附着进程与发起进程并发写,跨进程互斥只依赖同一 lockfile
|
|
20
|
-
* (runtime 收殓器写终态用
|
|
20
|
+
* (runtime 收殓器写终态用 taiji 统一锁,与该 lockfile 互斥)
|
|
21
21
|
* - 锁获取失败不降级无锁写:返回 {success:false},条目停留 running 由 runtime
|
|
22
22
|
* 收殓兜底(§3.5「registry/entry 写不进则条目停留 running」)
|
|
23
23
|
*/
|
|
@@ -26,14 +26,14 @@ import { join } from "node:path";
|
|
|
26
26
|
|
|
27
27
|
// 契约常量(LRU 上限)走 index 出口(background-task.ts 契约面);行为原语走
|
|
28
28
|
// background-task 子出口(含 node 内建依赖,不进 index——renderer/core 零触达)
|
|
29
|
-
import { MAX_TERMINAL_REGISTRY_ENTRIES } from "@
|
|
29
|
+
import { MAX_TERMINAL_REGISTRY_ENTRIES } from "@zhushanwen/extension-protocol";
|
|
30
30
|
import {
|
|
31
31
|
atomicWriteRegistry,
|
|
32
32
|
readRegistry as readRegistryEntries,
|
|
33
33
|
serializeRegistryFile,
|
|
34
34
|
trimTerminalEntries,
|
|
35
35
|
type RegistryFileLogFn,
|
|
36
|
-
} from "@
|
|
36
|
+
} from "@zhushanwen/extension-protocol/background-task";
|
|
37
37
|
import { toErrorMessage } from "@zhushanwen/pi-ext-guards";
|
|
38
38
|
import { getLogger } from "@zhushanwen/pi-extension-logger";
|
|
39
39
|
import { withFileLockSync } from "@zhushanwen/pi-file-lock";
|
|
@@ -17,7 +17,7 @@ import { mkdirSync, openSync, closeSync, accessSync, constants } from "node:fs";
|
|
|
17
17
|
import { dirname, join } from "node:path";
|
|
18
18
|
import { randomBytes } from "node:crypto";
|
|
19
19
|
|
|
20
|
-
import { getProcessStartTimeSec, killProcessTree, pidStartMatchesRegistered } from "@
|
|
20
|
+
import { getProcessStartTimeSec, killProcessTree, pidStartMatchesRegistered } from "@zhushanwen/extension-protocol/background-task";
|
|
21
21
|
import { toErrorMessage } from "@zhushanwen/pi-ext-guards";
|
|
22
22
|
import { getLogger } from "@zhushanwen/pi-extension-logger";
|
|
23
23
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* subagent 进程识别(bte background 降级判据——生命周期设计 D14 项,commit 8599abd0c)。
|
|
3
3
|
*
|
|
4
|
-
* 判据收敛于 ext-guards isSubagentProcess(`
|
|
4
|
+
* 判据收敛于 ext-guards isSubagentProcess(`TAIJI_AGENT_SUBAGENT === "1"`——引擎
|
|
5
5
|
* spawn 链恒注入的统一标记,ext-simplify-17 D4 重锚定)。命中 = 当前 pi 进程是
|
|
6
6
|
* 引擎链上的真 subagent → 本扩展降级:background:true 被忽略走前台同步语义。
|
|
7
7
|
*
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* 条目唯一来源 = 本进程 execute 的 spawn(registerSpawnedTask 全仓唯一调用点 =
|
|
9
9
|
* spawn-background.ts)。他进程 / 历史 session 的 running 条目**永不进表**——
|
|
10
|
-
* 零恢复零接管,孤儿处置权统一归收殓侧(u-bte-remove 后 =
|
|
10
|
+
* 零恢复零接管,孤儿处置权统一归收殓侧(u-bte-remove 后 = taiji runtime)
|
|
11
11
|
* 按属主裁决;终态条目可从 registry 读,仅供 bash_output 查历史。
|
|
12
12
|
*
|
|
13
13
|
* 终态条目 LRU 上限 MAX_TERMINAL_ENTRIES(与 registry 对称),淘汰后 bash_output
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* 未来新增写路径(如 maintenance 类)必须保持该顺序,违反即 intent 可丢失。
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
import { trimTerminalEntries } from "@
|
|
31
|
+
import { trimTerminalEntries } from "@zhushanwen/extension-protocol/background-task";
|
|
32
32
|
|
|
33
33
|
import {
|
|
34
34
|
isActiveState,
|
package/src/background/types.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 条目记 ownerPiPid(M2 只负责写入)
|
|
9
9
|
*
|
|
10
10
|
* 契约改引(u-bte-remove):registry 持久化形状(RegistryEntry / 状态机 / reason
|
|
11
|
-
* 枚举 / active·terminal 判定)与 @
|
|
11
|
+
* 枚举 / active·terminal 判定)与 @zhushanwen/extension-protocol background-task.ts
|
|
12
12
|
* 契约逐字段一致(契约文档头声明基线即本文件 + registry.ts),本地副本已删除、
|
|
13
13
|
* 此处 re-export 并保留包内短名——消费方 import 路径与字段语义零变化。运行时
|
|
14
14
|
* 对象类型(BackgroundTask / KillingIntent)不在契约内(剥离非持久字段前的形状),
|
|
@@ -19,18 +19,18 @@ import type { ChildProcess } from "node:child_process";
|
|
|
19
19
|
import type {
|
|
20
20
|
BackgroundTaskEndReason as ContractEndReason,
|
|
21
21
|
BackgroundTaskState as ContractState,
|
|
22
|
-
} from "@
|
|
22
|
+
} from "@zhushanwen/extension-protocol";
|
|
23
23
|
|
|
24
24
|
/** 状态机与 reason 枚举 / 持久化条目 / active·terminal 判定:契约 SSOT re-export。 */
|
|
25
25
|
export type {
|
|
26
26
|
BackgroundTaskRegistryEntry as RegistryEntry,
|
|
27
27
|
BackgroundTaskState,
|
|
28
28
|
BackgroundTaskEndReason,
|
|
29
|
-
} from "@
|
|
29
|
+
} from "@zhushanwen/extension-protocol";
|
|
30
30
|
export {
|
|
31
31
|
isActiveBackgroundTaskState as isActiveState,
|
|
32
32
|
isTerminalBackgroundTaskState as isTerminalState,
|
|
33
|
-
} from "@
|
|
33
|
+
} from "@zhushanwen/extension-protocol";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* killing intent:bash_kill / 后台 timeout 已发令、轮询器 exit 边沿未确认的瞬态标记。
|
package/src/bash-kill-tool.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* kill 目标归属(§3.5):**限定本进程单例表条目**;registry 回落限定终态条目
|
|
12
12
|
* (exited/orphaned → already exited)——registry 中他进程的 running/killing 条目
|
|
13
|
-
* **不可 kill**(跨进程边界:处置权归发起进程;孤儿收殓已下沉
|
|
13
|
+
* **不可 kill**(跨进程边界:处置权归发起进程;孤儿收殓已下沉 taiji runtime,
|
|
14
14
|
* u-bte-remove 后由 background-task-reaper 按 ownerPiPid 属主判定处置)。
|
|
15
15
|
* kill 前校验 pid 判活 + start time 匹配(防陈旧条目遇 pid 复用误杀无关进程,
|
|
16
16
|
* 宁不杀勿误杀,§3.6 收殓侧同原则)。
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import type { AgentToolResult, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
20
20
|
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
21
|
-
import { getProcessStartTimeSec, isPidAlive, killProcessTree } from "@
|
|
21
|
+
import { getProcessStartTimeSec, isPidAlive, killProcessTree } from "@zhushanwen/extension-protocol/background-task";
|
|
22
22
|
import { Type } from "typebox";
|
|
23
23
|
|
|
24
24
|
import { toErrorMessage } from "@zhushanwen/pi-ext-guards";
|
|
@@ -81,7 +81,7 @@ export function createBashKillToolDefinition() {
|
|
|
81
81
|
);
|
|
82
82
|
}
|
|
83
83
|
// registry-only 活跃条目 = 他进程任务(本进程活跃任务必在单例表)——跨进程
|
|
84
|
-
// 不可 kill:处置权归发起进程;属主若已死,孤儿由
|
|
84
|
+
// 不可 kill:处置权归发起进程;属主若已死,孤儿由 taiji runtime 在
|
|
85
85
|
// session 销毁时或启动期兜底扫描时收殓(属主判定,u-bte-remove 下沉;
|
|
86
86
|
// 纯 CLI 独立安装无 runtime 收殓兜底,孤儿自然退出或手动杀——E11 已
|
|
87
87
|
// 接受边界,hint 按形态分流,不写死 runtime 承诺)
|
|
@@ -89,7 +89,7 @@ export function createBashKillToolDefinition() {
|
|
|
89
89
|
"cross-process running task owned by another pi process",
|
|
90
90
|
"the task is managed by the pi process that started it (bash_kill from that session); " +
|
|
91
91
|
"if that process is gone, the orphan keeps running until it exits on its own; " +
|
|
92
|
-
"inside the
|
|
92
|
+
"inside the taiji runtime it is collected when the owner's session ends or on app restart; " +
|
|
93
93
|
"standalone pi: kill the process group manually (kill -- -<pgid>; the registered task pid is the pgid) if it lingers",
|
|
94
94
|
);
|
|
95
95
|
}
|
package/src/bash-output-tool.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import type { AgentToolResult, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
16
16
|
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
17
|
-
import { readOutputTail } from "@
|
|
17
|
+
import { readOutputTail } from "@zhushanwen/extension-protocol/background-task";
|
|
18
18
|
import { Type } from "typebox";
|
|
19
19
|
|
|
20
20
|
import { TAIL_MAX_BYTES, TAIL_MAX_LINES } from "./background/output-tail.ts";
|
package/src/index.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* M3:pending-notifications 通知接入——load 时刷新轮询器通知通路的 pi 引用(D17
|
|
8
8
|
* session 替换接管)+ 挂 exit 边沿通知回调(unregister emit + sendMessage steer)+
|
|
9
9
|
* session_start 对账(appendEntry 权威路径兜底 pending 收尾)。
|
|
10
|
-
* 收殓下沉(u-bte-remove):M5 孤儿收殓已移交
|
|
10
|
+
* 收殓下沉(u-bte-remove):M5 孤儿收殓已移交 taiji runtime(background-task-
|
|
11
11
|
* reaper 双触发面——session 销毁时 + 启动期兜底扫描,设计 file-lock-unification-
|
|
12
12
|
* and-reaper-sink.md §3.2 D2),extension 不再做全局扫描/全局锁;session_start
|
|
13
13
|
* 维护链仅剩 M3 对账(session 级豁免类,每 session_start 执行,D3 粒度段)。
|
|
@@ -72,7 +72,7 @@ export default function baseToolEnhanceExtension(pi: ExtensionAPI): void {
|
|
|
72
72
|
* flag 后目标 session 的对账将永远被跳过(M3 对账在主链路被禁用,此处是唯一执行点)。
|
|
73
73
|
*
|
|
74
74
|
* 入口无条件 debug 日志(S6 观测通道):每次 handler 派发都打,含 reason——
|
|
75
|
-
*
|
|
75
|
+
* TAIJI_AGENT_DEBUG=1 时落 extension 日志(默认 no-op),供「factory 二调下维护链
|
|
76
76
|
* 行为」验收观测派发次数。变更登记(u-bte-remove):reap 下沉 runtime 后本链
|
|
77
77
|
* 不再含全局扫描/全局锁,原 reapSkipped 字段随 reap 调用一并移除——对应 S6
|
|
78
78
|
* 场景「批 2 后 reap 类操作不再执行」。
|