pi-shadow-mind 0.1.9 → 0.1.11

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/DESIGN.md CHANGED
@@ -65,7 +65,7 @@ Shadow 的 Markdown 定义持久存在,但运行实例不保留长期记忆。
65
65
 
66
66
  `config.json` 保存默认 Shadow 模型、`default_thinking_level`、`heartbeat_probability`、`max_parallel_shadows`、`default_shadow_timeout_seconds` 和 `result_batch_window_ms` 等全局调度配置。`default_shadow_model` 省略时,插件使用激活时的当前 Main 模型;用户也可以配置一个固定默认模型。`default_thinking_level` 的内置默认值为 `low`。
67
67
 
68
- 每次 Main `turn_end` 进行 heartbeat 判断前,插件检查并重新加载发生变化的 `config.json`。新配置只影响后续调度和新建实例;已经运行的 Shadow 继续使用启动时取得的配置快照。
68
+ 每次符合调度条件的 Main `turn_end` 进行 heartbeat 判断前,插件检查并重新加载发生变化的 `config.json`。纯文本轮次不会进入 heartbeat。新配置只影响后续调度和新建实例;已经运行的 Shadow 继续使用启动时取得的配置快照。
69
69
 
70
70
  `config.json` 使用 last-known-good 策略。解析失败或字段无效时,插件继续使用最后一次有效配置,在界面及 `/shadow status` 中持续显示错误和当前实际生效值。只有首次加载就不存在有效配置时才使用内置默认值;插件不会自动用默认内容覆盖用户的无效文件。
71
71
 
@@ -155,13 +155,13 @@ Pi 的通用 `ToolDefinition` 没有可供插件查询的只读属性,因此
155
155
  report_to_main({ content: "..." })
156
156
  ```
157
157
 
158
- 插件提供默认运行超时,第一版默认值为 `60s`。单个 Shadow 可以通过 `timeout_seconds` 覆盖。超时后插件终止该运行实例、释放并发槽位,并丢弃未完成结果,不向 Main 注入消息。
158
+ 插件提供默认运行超时,内置默认值为 `300s`。单个 Shadow 可以通过 `timeout_seconds` 覆盖。超时后插件终止该运行实例、释放并发槽位,并丢弃未完成结果,不向 Main 注入消息。
159
159
 
160
160
  第一版不设置单次 model call 数或工具调用次数上限。运行资源只通过 heartbeat 概率、Shadow 激活概率、最大并发数和时间超时控制。
161
161
 
162
162
  所有 Shadow 都记录轻量运行事件,包括激活、沉默、上报、超时、中止、耗时、执行模型以及工具使用摘要。工具摘要只记录工具名、调用次数和成功/失败统计,不保存参数或结果。事件作为自定义 entries 写入当前 Main Session,随会话持久化和恢复,但不参与 Main 的模型上下文。
163
163
 
164
- 每次 Main `turn_end` heartbeat 判断都会写入一条轻量调度事件:先记录 heartbeat 随机值与是否触发;触发后再记录候选 Shadow、各自随机值、概率命中项、模型过滤、运行中排除、并发槽位裁剪和最终激活项。事件不保存 Main 或 Shadow 上下文,用于完整复盘调度决策。
164
+ 每次 Main `turn_end` 都会写入一条轻量调度事件。没有工具活动的纯文本轮次记录为跳过;符合条件的轮次记录 heartbeat 随机值与是否触发,触发后再记录候选 Shadow、各自随机值、概率命中项、模型过滤、运行中排除、并发槽位裁剪和最终激活项。事件不保存 Main 或 Shadow 上下文,用于完整复盘调度决策。
165
165
 
166
166
  `/shadow` 打开统一状态面板,展示当前 Session 的暂停状态、有效与无效 Shadow、正在运行的实例、最近事件和实际生效配置;`/shadow status` 提供对应的摘要视图。第一版面板以观察为主,不内置完整 Markdown 编辑器。
167
167
 
@@ -282,18 +282,18 @@ shell({ command: "npm test" }) · 失败,12 项通过、2 项失败
282
282
 
283
283
  第一版不识别 plan change、uncertainty、risk 等语义事件,也不使用 Gate Model。
284
284
 
285
- 每次 Main model call 完成后,按插件配置 `heartbeat_probability` 独立判断是否产生 heartbeat。默认值为 `1/3`:
285
+ Main model call 完成后,只有该 `turn_end` 至少包含一个已完成的工具调用,才按插件配置 `heartbeat_probability` 独立判断是否产生 heartbeat。默认值为 `1/3`:
286
286
 
287
287
  ```text
288
- P(heartbeat after model call) = heartbeat_probability
288
+ P(heartbeat after eligible tool-bearing turn) = heartbeat_probability
289
289
  default heartbeat_probability = 1 / 3
290
290
  ```
291
291
 
292
- 实现上以 Main Agent 的每次 `turn_end` 作为一次 model call 边界。带工具调用的中间轮次与不带工具调用的最终回复轮次都参与判断;Shadow AgentSession 自己的 `turn_end` 不参与 Main heartbeat。
292
+ 纯文本轮次直接跳过,不消耗随机数,也不启动 Shadow。这会压制普通问答、方案讨论和 Shadow 报告后的纯文本回应产生的无效唤醒。带工具调用的中间轮次仍参与判断,因此 Main 一旦开始读取、验证或修改项目,Shadow 仍可并行介入。Shadow AgentSession 自己的 `turn_end` 不参与 Main heartbeat。
293
293
 
294
- 由 `shadow-report` 触发的 Main 补充或修正也属于正常 Main 工作链,其 `turn_end` 继续参与 heartbeat。第一版不限制 Shadow 介入链的深度,允许后续 Shadow 再次检查 Main 的修正;概率、并发上限、超时和结果聚合共同承担节流。
294
+ 由 `shadow-report` 触发的 Main 补充或修正只有在实际调用工具时才重新获得 heartbeat 机会,避免纯文本报告与回应形成递归唤醒链。
295
295
 
296
- 默认情况下,相邻 heartbeat 的期望间隔为 3 次 model call,但实际间隔保持随机:可能连续发生,也可能较长时间不发生。
296
+ 默认情况下,相邻 heartbeat 的期望间隔为 3 个符合条件的工具轮次,但实际间隔保持随机:可能连续发生,也可能较长时间不发生。
297
297
 
298
298
  第一版直接使用运行时随机数,不提供或持久化随机 seed,也不承诺重放同一调度序列。实际抽样值通过轻量调度事件保留,供事后分析。
299
299
 
@@ -318,13 +318,13 @@ available_slots = max_parallel_shadows - running_shadow_count
318
318
 
319
319
  命中数量超过剩余槽位时,未被随机选中的 Shadow 直接跳过,不进入等待队列,也不保留本次轨迹快照。后续 heartbeat 会基于届时的最新上下文重新判断。
320
320
 
321
- `activation_probability` 表示 heartbeat 已经发生之后,该 Shadow 被选中的基础概率。因此某个 Shadow 在单次 Main model call 后获得激活机会的基础概率为:
321
+ `activation_probability` 表示 heartbeat 已经发生之后,该 Shadow 被选中的基础概率。因此某个 Shadow 在单次符合条件的 Main 工具轮次后获得激活机会的基础概率为:
322
322
 
323
323
  ```text
324
324
  P(activation) = heartbeat_probability × activation_probability
325
325
  ```
326
326
 
327
- `activation_probability` 省略时使用默认值 `0.3`。在默认 heartbeat 概率 `1/3` 下,且不考虑并发槽位竞争时,该 Shadow 每次 Main `turn_end` 的基础激活概率约为 `10%`。
327
+ `activation_probability` 省略时使用默认值 `0.3`。在默认 heartbeat 概率 `1/3` 下,且不考虑并发槽位竞争时,该 Shadow 每次符合条件的 Main `turn_end` 的基础激活概率约为 `10%`;纯文本轮次为 `0%`。
328
328
 
329
329
  当一次 heartbeat 的命中数量超过剩余并发槽位时,并发上限会进一步降低每个命中项的最终激活概率。
330
330
 
@@ -417,7 +417,7 @@ Shadow 的临时 AgentSession 不跨激活复用,也不写回记忆。
417
417
 
418
418
  轻量事件属于运行观测数据,不参与任何 Agent 的上下文。`debug: true` 产生的完整 Session 日志也只用于调试,不会成为后续 Shadow 的记忆。
419
419
 
420
- 插件提供 `/shadow pause` `/shadow resume`,只控制当前 Main Session 是否继续产生 heartbeat,不修改全局 Shadow Markdown。执行 pause 时立即中止当前 Session 已运行的 Shadow、清空尚未发送的聚合结果并释放并发槽位;resume 后从后续 Main `turn_end` 恢复概率判断。
420
+ 插件提供 `Alt+S` 快捷键以及 `/shadow toggle`、`/shadow pause`、`/shadow resume` 命令,只控制当前 Main Session 是否继续产生 heartbeat,不修改全局 Shadow Markdown。执行 pause 时立即中止当前 Session 已运行的 Shadow、清空尚未发送的聚合结果并释放并发槽位;resume 后从后续 Main `turn_end` 恢复概率判断。暂停时底部状态固定显示 `🐙 Paused`,不展示恒为零的运行数量。
421
421
 
422
422
  同一个 Shadow 在前一次实例仍运行时不重复激活;不同 Shadow 可以并行运行。
423
423
 
@@ -436,6 +436,7 @@ Shadow 的临时 AgentSession 不跨激活复用,也不写回记忆。
436
436
  - AI 写入全局 Shadow registry 前取得用户确认;
437
437
  - 按 Main 模型筛选 Shadow;
438
438
  - 为每个 Shadow 配置执行模型,并支持插件级默认模型;
439
+ - 纯文本 Main 轮次跳过 heartbeat,只在完成工具调用的轮次参与调度;
439
440
  - 通过 `heartbeat_probability` 配置随机 heartbeat,默认概率为 `1/3`;
440
441
  - 每个 Shadow 按自己的概率参与 heartbeat;
441
442
  - 通过 `max_parallel_shadows` 配置最大并行数量;
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 liuzhengdongfortest
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,36 +1,93 @@
1
1
  # Pi Shadow Mind
2
2
 
3
- Shadow Mind is a Pi extension that occasionally starts independent, temporary agent sessions beside the main agent. Each Shadow Mind is a Markdown entity with its own responsibility, model filter, activation probability, tools, model, thinking level, timeout, and optional debug log.
3
+ ![Pi Shadow Mind the main agent builds while Shadow Minds review, verify, and maintain](./assets/shadow-mind-hero-v2.png)
4
4
 
5
- The first version activates on each main-agent `turn_end`: the heartbeat fires with probability `1/3`, eligible Shadow Minds roll independently (default `0.3`), and at most two run concurrently. Shadow sessions inherit the unchanged main system prompt. Their compacted visible trajectory is flattened into plain text: assistant thinking is removed, and each tool call is followed by a deterministic result summary.
5
+ **Configurable cognitive cores for Pi.**
6
6
 
7
- ## Install for development
7
+ **为 Pi 配置多个独立的认知核心。**
8
8
 
9
- ```powershell
10
- npm install
11
- pi -e ./src/index.ts
12
- ```
9
+ [English](#english) · [中文](#中文)
13
10
 
14
- Pi also discovers this package when installed as a Pi package because `package.json` declares `pi.extensions`.
11
+ ## English
15
12
 
16
- ## Build and distribute
13
+ Pi Shadow Mind runs specialized agents alongside the main agent. Each Shadow Mind owns a persistent responsibility—architecture, correctness, documentation, project grounding, or anything else you define.
17
14
 
18
- ```powershell
19
- npm run build
20
- npm pack
15
+ While the main agent implements, other minds can independently review decisions, verify claims, maintain related files, and intervene before mistakes become expensive to undo.
16
+
17
+ > Build and review in the same pass.
18
+
19
+ ### One agent, multiple responsibilities
20
+
21
+ The main agent keeps moving. Shadow Minds independently protect the parts of the work that matter to you.
22
+
23
+ | Cognitive core | Responsibility |
24
+ |---|---|
25
+ | Architecture review | Detect growing god components, misplaced responsibilities, missing module boundaries, and fragile extension points while code is being written |
26
+ | Project grounding | Check claims against the actual repository and catch invented APIs, files, constraints, or implementation details |
27
+ | Documentation maintenance | Track implementation changes and keep architecture notes, decisions, and usage documentation aligned |
28
+ | Completion review | Independently verify that the result satisfies the task before the main agent declares it finished |
29
+
30
+ These are not temporary tasks delegated by the main agent. They are persistent, user-defined cognitive roles that decide independently when to inspect, act, or report.
31
+
32
+ ### Shadows can review—or work
33
+
34
+ A Shadow Mind may remain read-only and report findings to the main agent, or receive additional tools and own a parallel line of work.
35
+
36
+ While the main agent writes code, another Shadow can maintain documentation, update architectural decisions, or work on a separate file. Tool access is configured per Shadow, so each cognitive core receives only the capabilities its responsibility requires.
37
+
38
+ ```text
39
+ Main Agent Architecture Shadow
40
+ implements feature reviews module boundaries
41
+
42
+ Main Agent Documentation Shadow
43
+ writes code maintains design documentation
21
44
  ```
22
45
 
23
- The generated `pi-shadow-mind-<version>.tgz` contains the compiled `dist/` extension. Publish it to npm for normal Pi installation, or unpack the standalone ZIP release and install that directory:
46
+ Review is only one possible responsibility. A Shadow Mind can observe, verify, maintain, or build.
24
47
 
25
- ```powershell
26
- pi install npm:pi-shadow-mind@0.1.9
27
- # or, after unpacking the ZIP
28
- pi install ./pi-shadow-mind-0.1.0
48
+ ### Start with an Architecture Shadow
49
+
50
+ Create `~/.pi/agent/shadow-minds/architecture-review.md`:
51
+
52
+ ```markdown
53
+ ---
54
+ id: architecture-review
55
+ name: Architecture review
56
+ activation_probability: 0.3
57
+ active_for_models: ["*"]
58
+ tools: [read, grep]
59
+ ---
60
+
61
+ Review the main agent's current implementation for architectural drift.
62
+
63
+ Check whether responsibilities have clear owners, modules have coherent
64
+ boundaries, and new behavior uses appropriate extension points. Detect growing
65
+ god components, unrelated state or methods accumulating in one module, and
66
+ business differences implemented as expanding conditionals.
67
+
68
+ Report only concrete, actionable issues grounded in the visible trajectory or
69
+ repository. If the current work is unrelated, do not intervene.
29
70
  ```
30
71
 
31
- ## Global files
72
+ This Shadow is read-only. It reviews the implementation in parallel and reports concrete architectural concerns without taking control of the main task.
73
+
74
+ ### How it works
32
75
 
33
- On first session start, the extension creates:
76
+ After a main-agent `turn_end` that completed at least one tool call, the extension evaluates a heartbeat. Pure text-only conversation turns are skipped, so ordinary discussion does not wake Shadows. By default, eligible turns fire a heartbeat with probability `1/3`; Shadow Minds then roll independently using their own activation probabilities, with at most two running concurrently.
77
+
78
+ Each activation starts a fresh temporary session. It inherits the main agent's unchanged system prompt but receives only a sanitized plain-text trajectory: assistant thinking is removed, while tool calls retain compact, deterministic result summaries.
79
+
80
+ A Shadow first decides whether the trajectory is relevant to its responsibility. If unrelated, it exits without calling tools or `report_to_main`. When the main agent should receive a concrete result, the Shadow calls `report_to_main`, which immediately ends that run.
81
+
82
+ Shadow definitions are ordinary Markdown files. They can be created and adjusted by the user or managed by the agent through the extension's tools. Model filters and activation probabilities allow different models to receive different supporting minds.
83
+
84
+ ### Installation
85
+
86
+ ```bash
87
+ pi install npm:pi-shadow-mind@0.1.11
88
+ ```
89
+
90
+ On the first session start, the extension creates:
34
91
 
35
92
  ```text
36
93
  ~/.pi/agent/shadow-minds/
@@ -39,20 +96,113 @@ On first session start, the extension creates:
39
96
  logs/<shadow-id>/*.jsonl # only when debug: true
40
97
  ```
41
98
 
42
- No default Shadow Mind is created. A minimal definition is:
99
+ No default Shadow Mind is created. The global runtime timeout defaults to 300 seconds, and individual Shadows may override it with `timeout_seconds`.
100
+
101
+ Press `Alt+S` to pause or resume Shadow Mind for the current session. The paused footer reads `🐙 Paused` without a redundant zero count. Use `/shadow` to toggle the status panel, `/shadow status` for a summary, or `/shadow toggle`, `/shadow pause`, and `/shadow resume` for command-based control. Management tools can list, create, update, enable, disable, and delete Shadow Minds, as well as read or update the global configuration. Every write requires user confirmation.
102
+
103
+ For development:
104
+
105
+ ```powershell
106
+ npm install
107
+ pi -e ./src/index.ts
108
+ ```
109
+
110
+ See [DESIGN.md](./DESIGN.md) for the behavioral contract and [BENCHMARK.md](./BENCHMARK.md) for benchmark methodology and lessons learned.
111
+
112
+ ## 中文
113
+
114
+ Pi Shadow Mind 让多个专业化认知核心与主 Agent 并行工作。每个 Shadow Mind 都拥有一项持续、稳定的职责,例如架构审阅、正确性检查、文档维护、项目事实核验,或任何由你定义的任务。
115
+
116
+ 主 Agent 负责持续推进,其他认知核心则独立审阅决策、核验事实、维护相关文件,并在错误产生高昂返工成本之前介入。
117
+
118
+ > 让实现与审阅发生在同一轮工作中。
119
+
120
+ ### 一个 Agent,多项独立职责
121
+
122
+ | 认知核心 | 职责 |
123
+ |---|---|
124
+ | 架构审阅 | 在编码过程中发现上帝组件、职责错位、模块边界缺失和脆弱的扩展点 |
125
+ | 项目事实核验 | 对照真实仓库检查结论,发现模型编造的 API、文件、约束和实现细节 |
126
+ | 文档维护 | 跟踪实现变化,让架构说明、设计决策和使用文档保持同步 |
127
+ | 完成度审阅 | 在主 Agent 宣布完成前,独立检查结果是否真正满足任务要求 |
128
+
129
+ 它们不是主 Agent 临时委派的任务,而是由用户定义、持续存在的认知职责,可以独立决定何时检查、行动或汇报。
130
+
131
+ ### Shadow 不只审阅,也可以工作
132
+
133
+ Shadow Mind 可以保持只读,只向主 Agent 汇报发现;也可以获得额外工具,独立负责另一条任务线。
134
+
135
+ 当主 Agent 编写代码时,另一个 Shadow 可以同步维护文档、更新架构决策,或处理独立文件。工具权限由每个 Shadow 单独配置,因此每个认知核心只获得其职责真正需要的能力。
136
+
137
+ ```text
138
+ 主 Agent Architecture Shadow
139
+ 实现功能 审阅模块边界
140
+
141
+ 主 Agent Documentation Shadow
142
+ 编写代码 维护设计文档
143
+ ```
144
+
145
+ 审阅只是一种职责。Shadow Mind 可以观察、核验、维护,也可以直接构建。
146
+
147
+ ### 从 Architecture Shadow 开始
148
+
149
+ 创建 `~/.pi/agent/shadow-minds/architecture-review.md`:
43
150
 
44
151
  ```markdown
45
152
  ---
46
- id: project-grounding
47
- name: Project grounding
153
+ id: architecture-review
154
+ name: Architecture review
48
155
  activation_probability: 0.3
49
- active_for_models: ["openai/gpt-5"]
156
+ active_for_models: ["*"]
50
157
  tools: [read, grep]
51
158
  ---
52
159
 
53
- Check whether the main agent is inventing project facts. Inspect the repository when needed and report only concrete discrepancies.
160
+ 审阅主 Agent 当前实现是否正在偏离合理架构。
161
+
162
+ 检查每项职责是否有明确所有者、模块边界是否内聚、新能力是否使用了合适的扩展点。
163
+ 发现不断膨胀的上帝组件、堆积在同一模块中的无关状态与方法,以及用持续增长的条件
164
+ 分支承载业务差异的实现。
165
+
166
+ 只报告能够从当前轨迹或仓库中得到证据、并且可以采取行动的问题。如果当前工作与该职责
167
+ 无关,不要介入。
168
+ ```
169
+
170
+ 这个 Shadow 默认只读。它会在实现过程中并行审阅架构,并向主 Agent 报告具体问题,但不会接管主任务。
171
+
172
+ ### 工作方式
173
+
174
+ 主 Agent 的一次 `turn_end` 只有在该轮至少完成过一个工具调用时,扩展才进行 heartbeat 判断。纯文本对话轮次会被跳过,因此普通讨论不会唤醒 Shadow。符合条件的轮次默认以 `1/3` 的概率触发 heartbeat,Shadow Minds 再按照各自的激活概率独立抽选,默认最多同时运行两个。
175
+
176
+ 每次激活都会创建一个全新的临时 Session。它继承主 Agent 原封不动的 system prompt,但只接收净化后的文本轨迹:思考内容会被移除,工具调用后仅保留简洁、确定性的结果概述。
177
+
178
+ Shadow 会先判断轨迹是否与自己的职责相关。无关时直接结束,不调用工具或 `report_to_main`;需要向主 Agent 提交具体结果时,通过 `report_to_main` 上报并立即结束本轮。
179
+
180
+ Shadow 定义只是普通 Markdown 文件,可以由用户创建和调整,也可以由 Agent 通过扩展工具管理。模型过滤和独立激活概率允许不同模型获得不同的辅助认知核心。
181
+
182
+ ### 安装
183
+
184
+ ```bash
185
+ pi install npm:pi-shadow-mind@0.1.11
54
186
  ```
55
187
 
56
- Use `/shadow` to toggle the compact status panel, `/shadow status` for a summary, and `/shadow pause` or `/shadow resume` for the current main session. The extension also exposes tools to list, create, update, enable, disable, and delete definitions, plus read/update the global config. Every write requires user confirmation.
188
+ 首次启动 Session 时,扩展会创建:
189
+
190
+ ```text
191
+ ~/.pi/agent/shadow-minds/
192
+ config.json
193
+ *.md
194
+ logs/<shadow-id>/*.jsonl # 仅在 debug: true 时生成
195
+ ```
196
+
197
+ 扩展不会默认创建 Shadow Mind。全局默认运行超时为 300 秒,单个 Shadow 可以通过 `timeout_seconds` 覆盖。
198
+
199
+ 按 `Alt+S` 可以暂停或恢复当前 Session 的 Shadow Mind。暂停时底部状态显示为 `🐙 Paused`,不再显示没有信息量的零计数。使用 `/shadow` 显示或隐藏状态面板,`/shadow status` 查看摘要,也可以通过 `/shadow toggle`、`/shadow pause` 和 `/shadow resume` 控制状态。管理工具可以查询、创建、更新、启用、禁用和删除 Shadow Mind,以及读取或修改全局配置。所有写操作都需要用户确认。
200
+
201
+ 开发模式:
202
+
203
+ ```powershell
204
+ npm install
205
+ pi -e ./src/index.ts
206
+ ```
57
207
 
58
- See [DESIGN.md](./DESIGN.md) for the complete behavioral contract.
208
+ 完整行为约定见 [DESIGN.md](./DESIGN.md),Benchmark 方法与经验见 [BENCHMARK.md](./BENCHMARK.md)。
package/dist/config.js CHANGED
@@ -4,7 +4,7 @@ import { inRange, isFiniteNumber, isNonEmptyString, isThinkingLevel } from "./va
4
4
  export const DEFAULT_CONFIG = {
5
5
  heartbeatProbability: 1 / 3,
6
6
  maxParallelShadows: 2,
7
- defaultShadowTimeoutSeconds: 60,
7
+ defaultShadowTimeoutSeconds: 300,
8
8
  headlessDrainTimeoutSeconds: 120,
9
9
  resultBatchWindowMs: 400,
10
10
  defaultThinkingLevel: "low",
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7391,7 +7391,7 @@ function isThinkingLevel(value) {
7391
7391
  var DEFAULT_CONFIG = {
7392
7392
  heartbeatProbability: 1 / 3,
7393
7393
  maxParallelShadows: 2,
7394
- defaultShadowTimeoutSeconds: 60,
7394
+ defaultShadowTimeoutSeconds: 300,
7395
7395
  headlessDrainTimeoutSeconds: 120,
7396
7396
  resultBatchWindowMs: 400,
7397
7397
  defaultThinkingLevel: "low"
@@ -7875,6 +7875,9 @@ function createRandom(seed) {
7875
7875
  }
7876
7876
 
7877
7877
  // src/scheduler.ts
7878
+ function shouldEvaluateHeartbeat(toolResults) {
7879
+ return toolResults.length > 0;
7880
+ }
7878
7881
  function decideHeartbeat(options) {
7879
7882
  const random = options.random ?? Math.random;
7880
7883
  const heartbeatRoll = random();
@@ -8382,8 +8385,12 @@ var ShadowMindRuntime = class {
8382
8385
  this.latestContext = ctx;
8383
8386
  this.modelCalls += 1;
8384
8387
  });
8385
- this.pi.on("turn_end", async (_event, ctx) => {
8388
+ this.pi.on("turn_end", async (event, ctx) => {
8386
8389
  this.latestContext = ctx;
8390
+ if (!shouldEvaluateHeartbeat(event.toolResults)) {
8391
+ this.record("heartbeat-skipped", { reason: "no-tool-activity", modelCalls: this.modelCalls });
8392
+ return;
8393
+ }
8387
8394
  await this.onHeartbeat(ctx);
8388
8395
  });
8389
8396
  this.pi.on("session_shutdown", async (event, ctx) => {
@@ -8400,18 +8407,23 @@ var ShadowMindRuntime = class {
8400
8407
  }
8401
8408
  registerUi() {
8402
8409
  this.pi.registerCommand("shadow", {
8403
- description: "Show Shadow Mind status, or pause/resume it",
8410
+ description: "Show Shadow Mind status, or toggle/pause/resume it",
8404
8411
  handler: async (args, ctx) => {
8405
8412
  this.latestContext = ctx;
8406
8413
  const command = args.trim().toLowerCase();
8407
8414
  if (command === "pause") {
8408
- this.paused = true;
8409
- this.abortAll("paused");
8410
- ctx.ui.notify("Shadow Mind paused", "info");
8411
- } else if (command === "resume") {
8412
- this.paused = false;
8413
- ctx.ui.notify("Shadow Mind resumed", "info");
8414
- } else if (command === "status") {
8415
+ this.setPaused(true, ctx);
8416
+ return;
8417
+ }
8418
+ if (command === "resume") {
8419
+ this.setPaused(false, ctx);
8420
+ return;
8421
+ }
8422
+ if (command === "toggle") {
8423
+ this.setPaused(!this.paused, ctx);
8424
+ return;
8425
+ }
8426
+ if (command === "status") {
8415
8427
  await this.refresh(ctx);
8416
8428
  ctx.ui.notify(this.statusLines().join("\n"), this.diagnostics.length ? "warning" : "info");
8417
8429
  } else if (command === "hide") {
@@ -8424,6 +8436,13 @@ var ShadowMindRuntime = class {
8424
8436
  this.updateStatus(ctx);
8425
8437
  }
8426
8438
  });
8439
+ this.pi.registerShortcut("alt+s", {
8440
+ description: "Pause or resume Shadow Mind",
8441
+ handler: (ctx) => {
8442
+ this.latestContext = ctx;
8443
+ this.setPaused(!this.paused, ctx);
8444
+ }
8445
+ });
8427
8446
  this.pi.registerMessageRenderer("shadow-report", (message, _options, theme) => {
8428
8447
  const content = typeof message.content === "string" ? message.content : "Shadow report";
8429
8448
  const prefix = theme.fg("accent", "\u{1F419} shadow \xB7 ");
@@ -8558,9 +8577,16 @@ var ShadowMindRuntime = class {
8558
8577
  if (this.recentEvents.length > 20) this.recentEvents.shift();
8559
8578
  this.sessionLifetime.run(() => this.pi.appendEntry("shadow-mind-event", event));
8560
8579
  }
8580
+ setPaused(paused, ctx) {
8581
+ this.paused = paused;
8582
+ if (paused) this.abortAll("paused");
8583
+ ctx.ui.notify(paused ? "Shadow Mind paused" : "Shadow Mind resumed", "info");
8584
+ this.updateStatus(ctx);
8585
+ }
8561
8586
  updateStatus(ctx) {
8562
8587
  this.sessionLifetime.run(() => {
8563
- ctx.ui.setStatus("shadow-mind", `\u{1F419} ${this.active.size}${this.paused ? " paused" : ""}${this.diagnostics.length || this.hasRecentRunErrors() ? " !" : ""}`);
8588
+ const warning = this.diagnostics.length || this.hasRecentRunErrors() ? " !" : "";
8589
+ ctx.ui.setStatus("shadow-mind", this.paused ? `\u{1F419} Paused${warning}` : `\u{1F419} ${this.active.size}${warning}`);
8564
8590
  if (this.panelVisible) ctx.ui.setWidget("shadow-mind-panel", this.statusLines(), { placement: "aboveEditor" });
8565
8591
  });
8566
8592
  }
@@ -8578,7 +8604,7 @@ var ShadowMindRuntime = class {
8578
8604
  const detail = failed ? ` ${event.data?.error ?? event.data?.reason}` : "";
8579
8605
  return `${event.at.slice(11, 19)} ${event.kind}${detail}`;
8580
8606
  }),
8581
- "Commands: /shadow pause | resume | status | hide"
8607
+ "Shortcut: Alt+S toggle \xB7 Commands: /shadow toggle | pause | resume | status | hide"
8582
8608
  ];
8583
8609
  }
8584
8610
  };