@deepseek-ai/dsh-hook-protocol 0.1.5-rc.2 → 0.1.6-alpha.2

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.i18n.yaml CHANGED
@@ -3,4 +3,4 @@
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/hooks/hook-protocol/README.md
5
5
  README.md: 383a75c6943817d8e6b84e62564cbdd5dcd511e5
6
- README.zh.md: a2c66510f274ba3a89989fd67adc67f0dba2d813
6
+ README.zh.md: f3b6a7a03ee8c7f350c2d0f14a747fdb7d889a5c
package/README.zh.md CHANGED
@@ -38,7 +38,7 @@ kind: "package-library"
38
38
  - **附加上下文**——钩子可以返回额外文本,模型会在下一次请求中看到。
39
39
  - **在选定时刻运行**——钩子配置按名称或 pattern 选择触发的事件;缺失、空或 `'*'` pattern 表示该类的每个事件。
40
40
  - **失败不停止运行**——除 2 以外的任何退出码都是非阻塞失败:操作继续,失败被记录;完全无法启动的钩子按同样方式处理。
41
- - **请求运行停止**——钩子可以请求运行暂停(`{"continue": false}`);该请求会被记录,但没有运行级效果(见已知限制)。
41
+ - **请求运行停止**——钩子可以请求运行停止(`{"continue": false}`);该请求会被记录,但没有运行级效果(见已知限制)。
42
42
 
43
43
  ### 钩子运行时你会看到什么
44
44
 
@@ -60,20 +60,20 @@ kind: "package-library"
60
60
 
61
61
  ### 处理流水线
62
62
 
63
- 本库是一串单一用途的步骤,每个步骤一个函数:校验 matcher pattern、通过 `dsh-shell` 执行器运行命令、解码结果、把每个匹配 hook 的结果合并为最严格的一个结果,并记录持久的 `hook/*` 事件对。matcher 的 `mode` 参数是两个方言唯一的差异轴——`claude-code` 把 pattern 解释为字面量备选或正则,`codex` 始终解释为未锚定正则。每个步骤都会降级为受控结果而不是抛异常,因此钩子永远不会使调用轮次崩溃:无效正则是运行时的不匹配,执行器拒绝会变成没有退出码的 `HookOutput`,退出码 2 以 stderr 作为原因阻塞,其他失败均不阻塞。合并应用 `deny > ask > allow` 优先级,保持首个 `continue: false` 停止的粘性,并按 hook 顺序累积上下文。脱离运行会被跟踪,因此 `fiber.dispose()` 能达到完全停稳;不变式伴生插件会拒绝未开启轮次外的 `hook/*` 记录。这些步骤位于 [`src/matcher.ts`](src/matcher.ts)、[`src/runner.ts`](src/runner.ts)、[`src/codec.ts`](src/codec.ts)、[`src/merge.ts`](src/merge.ts)、[`src/events.ts`](src/events.ts)、[`src/detached.ts`](src/detached.ts) 与 [`src/invariant.ts`](src/invariant.ts)。
63
+ 本库是一串单一用途的步骤,每个步骤一个函数:校验 matcher pattern、通过 `dsh-shell` 执行器运行命令、解码结果、把每个匹配 hook 的结果合并为最严格的一个结果,并记录持久的 `hook/*` 事件对。matcher 的 `mode` 参数是两个方言唯一的差异轴——`claude-code` 把 pattern 解释为字面量备选或正则,`codex` 始终解释为未锚定正则。每个步骤都会降级为受控结果而不是抛异常,因此钩子永远不会使调用轮次崩溃:无效正则是运行时的不匹配,执行器拒绝会变成没有退出码的 `HookOutput`,退出码 2 以 stderr 作为原因阻塞,其他失败均不阻塞。合并应用 `deny > ask > allow` 优先级,保持首个 `continue: false` 停止的粘性,并按 hook 顺序累积上下文。脱离运行会被跟踪,因此 `fiber.dispose()` 能达到完全停稳;不变式伴生插件会拒绝位于尚未结束的轮次之外的 `hook/*` 记录。这些步骤位于 [`src/matcher.ts`](src/matcher.ts)、[`src/runner.ts`](src/runner.ts)、[`src/codec.ts`](src/codec.ts)、[`src/merge.ts`](src/merge.ts)、[`src/events.ts`](src/events.ts)、[`src/detached.ts`](src/detached.ts) 与 [`src/invariant.ts`](src/invariant.ts)。
64
64
 
65
65
  ### `hook/*` 会话事件
66
66
 
67
67
  `hook/invoked` 与 `hook/result` 事件通过 declaration merging 合并进 `SessionEventMap`,作为仅日志记录:与 `compaction/*` 相同,它们不是 surface 事件,也不携带 `surfaceOp`。`hook/result` 按 `handlerId` 与其 `hook/invoked` 配对,决策规则由 `appendHookResult` 负责。载荷与逐事件 JSDoc 位于生成的[持久化日志事件目录](../../../docs/persistence-catalog.zh.md)中。
68
68
 
69
- 调用与结果记录必须位于尚未结束的轮次内:`UserPromptSubmit`、`PreToolUse`、`PostToolUse` 与 `Stop` 按构造满足该关系,而 `SessionStart` 在轮次 1 之前运行、没有 `hook/*` 记录——改为投递其注入的上下文。不变式伴生插件注册到 `ctx.invariants`,拒绝在未开启轮次外追加的 `hook/*` 事件、没有匹配 invoked 的结果、未知方言或非有限时长。
69
+ 调用与结果记录必须位于尚未结束的轮次内:`UserPromptSubmit`、`PreToolUse`、`PostToolUse` 与 `Stop` 按构造满足该关系,而 `SessionStart` 在轮次 1 之前运行、没有 `hook/*` 记录——改为投递其注入的上下文。不变式伴生插件注册到 `ctx.invariants`,拒绝在尚未结束的轮次之外追加的 `hook/*` 事件、没有匹配 invoked 的结果、未知方言或非有限时长。
70
70
 
71
71
  ### 设计理念
72
72
 
73
73
  - **把唯一差异轴收拢进 `mode`。** 两个方言只在 matcher pattern 的解读方式上不同,因此 matcher 把 mode 作为参数,而不是复制引擎。
74
74
  - **执行器拥有进程控制。** 命令通过 `dsh-shell` 执行器运行,而非自建 spawn:执行器已经提供了协议所需的已清理但可覆盖的环境、进程组取消与超时。
75
75
  - **绝不向循环抛异常。** 每种失败模式——格式错误的 JSON、无效正则、执行器拒绝——都会降级为受控的结果或不匹配,因此钩子永远不能使调用轮次崩溃。
76
- - **仅日志、轮次内的事件。** `hook/*` 记录是「运行了什么、决定了什么」的持久证据;它们不是 surface 事件,不变式伴生插件会拒绝未开启轮次外的记录。
76
+ - **仅日志、轮次内的事件。** `hook/*` 记录是「运行了什么、决定了什么」的持久证据;它们不是 surface 事件,不变式伴生插件会拒绝尚未结束的轮次之外的记录。
77
77
 
78
78
  [hook-protocol-lib Agent Note](../../../.agents/notes/archived/feature/2026-06-30-hook-protocol-lib.md) 记录了共享与逐方言的划分以及备选方案。
79
79
 
@@ -124,7 +124,7 @@ kind: "package-library"
124
124
 
125
125
  这些限制描述钩子目前还无法通过共享引擎做到的事情。它们是当前包约束,而非任务积压。
126
126
 
127
- - **`HookOutput.updatedInput` 会被解析但不会应用**——输入改写是已延期的设计一致性问题(见 [pre-tool-input-rewrite Agent Note](../../../.agents/notes/proposed/feature/2026-06-30-pre-tool-input-rewrite.zh.md));当 hook 设置它时,桥接会记录并警告。
127
+ - **`HookOutput.updatedInput` 会被解析但不会应用**——输入改写是已延期的一致性设计问题(见 [pre-tool-input-rewrite Agent Note](../../../.agents/notes/proposed/feature/2026-06-30-pre-tool-input-rewrite.zh.md));当 hook 设置它时,桥接会记录并警告。
128
128
  - **折叠出的停止没有运行级效果**——`mergeHookOutputs` 把 `continue: false` 折叠为粘性 `stop`,但拦截点没有硬停止原语,因此桥接只记录该停止并保留 hook 的逐点效果。
129
129
  - **只有 command 形态会运行**——协议只执行 `{ type: 'command', command, timeout? }`;桥接会解析并跳过其方言定义的其他形态(`http`、`mcp_tool`、`prompt`、`agent`)。
130
130
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-hook-protocol",
3
3
  "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events",
4
- "version": "0.1.5-rc.2",
4
+ "version": "0.1.6-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -32,15 +32,15 @@
32
32
  ],
33
33
  "license": "MIT",
34
34
  "peerDependencies": {
35
- "@deepseek-ai/dsh-shell": "^0.1.5-rc.2",
36
- "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
37
- "@deepseek-ai/dsh-invariants": "^0.1.5-rc.2",
38
- "@deepseek-ai/cordis": "^4.0.2"
35
+ "@deepseek-ai/dsh-shell": "^0.1.6-alpha.2",
36
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
37
+ "@deepseek-ai/cordis": "^4.0.2",
38
+ "@deepseek-ai/dsh-invariants": "^0.1.6-alpha.2"
39
39
  },
40
40
  "devDependencies": {
41
- "@deepseek-ai/dsh-shell": "^0.1.5-rc.2",
42
- "@deepseek-ai/dsh-invariants": "^0.1.5-rc.2",
43
- "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
41
+ "@deepseek-ai/dsh-invariants": "^0.1.6-alpha.2",
42
+ "@deepseek-ai/dsh-shell": "^0.1.6-alpha.2",
43
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
44
44
  "@deepseek-ai/cordis": "^4.0.2"
45
45
  }
46
46
  }