@shgroup/dsh-serenity-hooks 1.103.0 → 1.104.0

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.
Files changed (33) hide show
  1. package/README.md +1 -2
  2. package/dsh.plugin.json +2 -3
  3. package/lib/{ccc-CyYJL4F2.js → ccc-B-h_A7uc.js} +17 -36
  4. package/lib/{ccc-roots-WfktvbN8.js → ccc-roots-BIdg0EyM.js} +8 -12
  5. package/lib/{channels-CuCsUfcY.js → channels-BItMJUO8.js} +2 -2
  6. package/lib/client.js +1 -6
  7. package/lib/cro/guide.d.ts +1 -1
  8. package/lib/guard/seam.d.ts +2 -1
  9. package/lib/host/access.d.ts +10 -42
  10. package/lib/host/contract.d.ts +3 -2
  11. package/lib/index.js +64 -375
  12. package/lib/invariant.js +0 -1
  13. package/lib/kernel/ccc-roots.d.ts +4 -3
  14. package/lib/kernel/ccc.d.ts +12 -30
  15. package/lib/kernel/invariant.d.ts +1 -1
  16. package/lib/{message-source-BAxZk9Dn.js → message-source-CKJPJCzc.js} +3 -3
  17. package/lib/{profile-zxakCNXy.js → profile-Dpg3wYO5.js} +1 -1
  18. package/lib/{route-DxIKWeN9.js → route-CmEoKp9w.js} +2 -2
  19. package/lib/seams/context.d.ts +5 -2
  20. package/lib/{service-DDmHSglV.js → service-Cndtf7q4.js} +6 -6
  21. package/lib/{session-DWmIqApm.js → session-CaNqSHVB.js} +25 -139
  22. package/lib/surface/status.d.ts +1 -2
  23. package/lib/tools/localstore/service.d.ts +1 -1
  24. package/lib/tools/msm/service.d.ts +2 -2
  25. package/lib/tools/trajectory-constraint-admin.d.ts +1 -1
  26. package/lib/trajectory/carrier.d.ts +5 -4
  27. package/lib/trajectory/model-runtime.d.ts +5 -3
  28. package/lib/trajectory/model-string.d.ts +26 -0
  29. package/lib/trajectory/policy/profile.d.ts +1 -1
  30. package/package.json +2 -2
  31. package/lib/tools/cheap-worker.d.ts +0 -21
  32. package/lib/trajectory/delegate/core.d.ts +0 -55
  33. package/lib/trajectory/delegate/preset.d.ts +0 -42
@@ -3,15 +3,16 @@
3
3
  *
4
4
  * ## 为什么在 `trajectory/` 而不是某个委派子域(S14,2026-10-19,轨迹中心重构)
5
5
  *
6
- * 它的两个消费者分属**不同的层**:`trajectory/session.ts`(轨迹的载体管理)与
7
- * `cheap-worker`(轨迹 × 轨迹的委派)。⇒ 它**不是哪一家的私有件**,
6
+ * 它的消费者在**别的层**:`trajectory/session.ts`(轨迹的载体管理)。⇒ 它**不是哪一家的私有件**,
8
7
  * 而是"载体这一轮跑完没有"这个问题的**公共原语**——凡与载体打交道的地方都可能在用。
8
+ * (原第二个消费者 `cheap-worker` 已于 2026-10-28 整条下线;本模块留住是因为它服务的是
9
+ * **载体语义**,不是某个工具。)
9
10
  *
10
11
  * 🔴 名字从 `idle` 改为 `carrier`:`idle` 描述的是**状态**(宿主 agent 空闲),
11
12
  * 而本模块回答的是**关于载体的问题**(它空闲了/它被销毁了/会话先没了)。
12
13
  * 三个结算条件(见下)里有两条与"空闲"无关 —— 名字取窄了会误导调用方以为只需等 idle。
13
14
  *
14
- * 为什么单独成模块:`askTrajectory`(问答)与 `cheap-worker`(杂工循环)都要"等这一轮做完",
15
+ * 为什么单独成模块:`askTrajectory`(问答)与(已下线的)`cheap-worker`(杂工循环)都要"等这一轮做完",
15
16
  * 此前各自复制了一份只监听 `agent/status → idle` 的实现。该实现有一个静默挂死:
16
17
  * **agent 先被销毁(会话关闭/进程回收/显式 dispose)就永远不会再发 idle 事件**,
17
18
  * 等待方 Promise 永不结算 → 问答/杂工永久卡住(宿主的 disposal 语义:
@@ -22,7 +23,7 @@
22
23
  * ② `agent/disposed` 且是同一个 agent —— 销毁竞速(宿主 `runtime-types.ts:175`)
23
24
  * ③ `session/disposed` 且是同一会话 —— 会话先于 agent 消失(宿主 `core/session/src/index.ts:62`)
24
25
  *
25
- * 无超时:agent 工作多久等多久(cheap-worker 可永续)。订阅后再查一次 `agent.status`——
26
+ * 无超时:agent 工作多久等多久。订阅后再查一次 `agent.status`——
26
27
  * 宿主 `followup`/`steer` 会同步把 phase 置为 running(`agent.ts:181-201`),
27
28
  * 因此此刻读到 idle 只可能是"唤醒已在订阅前收敛",立即结算以避免漏事件挂死。
28
29
  *
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * `model` 的**唯一消费点**曾是 `createTrajectoryAgent` 建 agent 时,而它的**唯一调用方**是
11
11
  * IM 入站路由 ⇒ 对**已经存在的会话**(web 会话、`send-now` 冷启的载体……)**完全不生效**。
12
- * 而 `container_admin config list` 把它印成 `'(cheap-worker default)'`,看上去像个统一设定。
12
+ * 而 `container_admin config list` 把它印成一个统一默认值,看上去像"已经生效了"。
13
13
  * ⇒ **同一个字段在 A 入口生效、在 B 入口不生效** —— 正是 owner 要禁的形态。
14
14
  *
15
15
  * ## 修法:接宿主**自带**的原语,不复刻语义
@@ -32,8 +32,10 @@
32
32
  *
33
33
  * ## 三条硬边界(少一条就会重演 S196 的坑)
34
34
  *
35
- * 1. **未写 `model` ⇒ 不装这条缝**(`undefined` 原样返回)。⛔ **绝不回退 `cheap-worker.defaultModel`**
36
- * —— 那个回退把"我想声明自述"变成"我被降级到杂工模型",而用户完全不会预期到。
35
+ * 1. **未写 `model` ⇒ 不装这条缝**(`undefined` 原样返回)。⛔ **绝不回退到某个全局默认模型**
36
+ * —— 那种回退把"我想声明自述"变成"我被悄悄换了模型",而用户完全不会预期到。
37
+ * (历史形态:曾回退 `cheap-worker.defaultModel`;该配置段已随工具于 2026-10-28 删除,
38
+ * 但判据不变:**没写 = 不动**。)
37
39
  * 2. **切换会留下宿主的 `[model changed: …]` 提示**。这是**特性不是噪声**:
38
40
  * 否则模型不知道自己换了,它会照旧解释上方那些由**另一个模型**生成的回合。
39
41
  * 3. **模型名非法 ⇒ 不切 + 响亮告警**,绝不静默停在旧模型上("改了没生效"是最难查的一类)。
@@ -0,0 +1,26 @@
1
+ /**
2
+ * trajectory/model-string.ts — `provider/model` 串解析(**共用件**,不属于任何工具)
3
+ *
4
+ * ## 为什么单独成模块(2026-10-28,cheap-worker 下线时抽出)
5
+ *
6
+ * 它原本住在 `trajectory/delegate/core.ts`(cheap-worker 的纯逻辑层)。但 grep 调用点后发现
7
+ * **它有两个与 cheap-worker 无关的消费者**:
8
+ * - `trajectory/session.ts`(`agentOptions` 装配,IM 入站 / send-now 冷启都用)
9
+ * - `trajectory/model-runtime.ts`(`trajectory.json` 的 `model` 运行时热切换)
10
+ *
11
+ * ⇒ 若跟着 `delegate/` 一起删掉,**轨迹的模型热切换与载体装配会一起断**。
12
+ * ⇒ 判据(可外推):**删一个模块前,先核它的导出有没有"跨域消费者"** ——
13
+ * 目录归属(谁住在谁的目录里)不等于依赖归属(谁在用)。同族先例:`listWakes` 有完整诊断出口
14
+ * 却被误判成零调用点(续 337 ②b)。
15
+ */
16
+ /**
17
+ * 解析 model 字符串(`provider/model`)→ `{ provider, model }`。
18
+ *
19
+ * 无 `/` ⇒ 视为 **model-only**(`provider === undefined`),由调用方决定是否接受这种形态。
20
+ * ⚠️ 只按**第一个** `/` 切分:provider id 不含 `/`,但 model id 可能含(如 `p/ns/model-x`)
21
+ * ⇒ 取 `indexOf` 而非 `split('/')` 才是对的。
22
+ */
23
+ export declare function splitModel(model: string): {
24
+ provider: string | undefined;
25
+ model: string;
26
+ };
@@ -55,7 +55,7 @@ export interface TrajectoryConstraint {
55
55
  code: string;
56
56
  /** `trajectory-constraint.json` 的绝对路径 */
57
57
  path: string;
58
- /** 模型(`provider/model`);缺省 ⇒ 不改变会话当前模型(**不**回退 cheap-worker),见 D181 */
58
+ /** 模型(`provider/model`);缺省 ⇒ 不改变会话当前模型(**不**回退到任何别处),见 D181 */
59
59
  model?: string;
60
60
  /**
61
61
  * 非 MSM 工具白名单。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shgroup/dsh-serenity-hooks",
3
- "version": "1.103.0",
4
- "description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:14 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/cheap-worker/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/IM 桥/认知轨迹唤醒注册表。轨迹声明 = 轨迹目录下的 trajectory.json(约束面 + 旧标识 uid + CRO 机器绑定 cro.host;旧名 trajectory-constraint.json / skiff.json 仍在读取族里);轨迹提示词 = 轨迹目录下的 PROMPT.md(一条轨迹「是谁、按什么章程工作」,所有轨迹通用,追加在容器层与质量层之后,不替换它们)。适配 DSH 0.1.7-rc.1 / 0.2.0-rc.1 / 0.2.1-rc.1(三档)。",
3
+ "version": "1.104.0",
4
+ "description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:13 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/IM 桥/认知轨迹唤醒注册表。轨迹声明 = 轨迹目录下的 trajectory.json(约束面 + 旧标识 uid + CRO 机器绑定 cro.host;旧名 trajectory-constraint.json / skiff.json 仍在读取族里);轨迹提示词 = 轨迹目录下的 PROMPT.md(一条轨迹「是谁、按什么章程工作」,所有轨迹通用,追加在容器层与质量层之后,不替换它们)。适配 DSH 0.1.7-rc.1 / 0.2.0-rc.1 / 0.2.1-rc.1(三档)。",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -1,21 +0,0 @@
1
- /**
2
- * cheap-worker.ts — cheap-worker(杂工)真实 DSH 工具
3
- *
4
- * v1.24.0:loop(牛马)→ handyman(杂工);2026-10-14:handyman → cheap-worker。
5
- * 🆕 2026-10-14(owner 令「删除后台运行能力」):**background 模式整条退场** ——
6
- * 轮次循环 / stop-token 完成码 / 进度文件 / 重启计数 / maxRounds/maxParallel 全部删除。
7
- * 现存只有**前台委派**一种形态:宿主起子 agent、等它跑完、取回最终文本。
8
- *
9
- * 机制:走宿主**委派正门** `ctx.subagents.start('spawn', …)`(深度上限、子 agent 所有权、
10
- * `subagent/start|end` 事件、`dispose()` 收尾全部沿用宿主实现),模型经 `agentOptions` 注入。
11
- * 前置:`exec.agent` 必须存在(前台委派要有发起方)。
12
- *
13
- * 🔴 **模型不可由调用方指定**(owner 令):**没有 `model` 参数**,一律读 CCC 配置
14
- * `cheap-worker.models` / `cheap-worker.defaultModel`(单一真相源)。
15
- *
16
- * 递归防护:子 agent 的工具面 deny `cheap-worker` 本身(编排归主 agent,防无限嵌套)。
17
- */
18
- import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
19
- import type { Context } from 'cordis';
20
- /** 创建 cheap-worker 工具(闭包捕获插件 ctx → 可访问 ctx.subagents) */
21
- export declare function createCheapWorkerTool(ctx: Context): ToolDefinition;
@@ -1,55 +0,0 @@
1
- /**
2
- * trajectory/delegate/core.ts — cheap-worker(杂工)纯逻辑层(零 DSH 依赖,可独立单测)
3
- *
4
- * 🆕 2026-10-14(owner 令「删除后台运行能力」):**进度文件 / stop token / 轮次循环**整族已退场 ——
5
- * 它们**只**服务于 background 模式。本模块现存 = 前台委派真正需要的三件:
6
- * 模型串解析 / 白名单校验 / provider 可用性判读(+ 使用指引文本)。
7
- *
8
- * ## S14(2026-10-19,轨迹中心重构):此前位于 `role/worker/` 下(该目录已消失)
9
- *
10
- * 落点 = `trajectory/delegate/`。判据(判读表 §3.1):它是**轨迹 × 轨迹**那种合法形态 ——
11
- * 主语是「主轨迹把活交给子 agent」,既不是某一条轨迹的切面,也不是容器宪法。
12
- * ⚠️ 它**不属于** `policy/`:policy 管"这条轨迹允许什么",本模块管"一条轨迹怎么把活派出去"。
13
- */
14
- /** 解析 model 字符串(provider/model)→ {provider, model};无 / 视为 model-only */
15
- export declare function splitModel(model: string): {
16
- provider: string | undefined;
17
- model: string;
18
- };
19
- /** 校验模型在白名单内;不在 → 抛错(用户拍板:只能使用 CCC 配置的模型) */
20
- export declare function requireWhitelistedModel(model: string, models: string[]): void;
21
- /**
22
- * providerAvailabilityError — 判定「**本机有没有该 provider 的 adapter**」,并产出**可执行**的错误文本。
23
- * 返回 `null` = 全部可用(调用方照常继续)。
24
- *
25
- * 🔴 为什么需要它(S142 2026-09-25,owner 在 **Mac** 上实测):`cheap-worker` 的模型白名单写在
26
- * **CCC**(`.opencode/serenity.json`,**随 git 走**),而 provider adapter 由**每台机器的宿主**
27
- * 注册(profile 配置 / settings 命名空间)⇒ 同一份白名单在一台机器可用、在另一台必失败。
28
- * 实测症状:宿主抛 `no adapter registered for provider "<p>"`(`dsh-llm`,code `NO_ADAPTER`),
29
- * 而**前台路径的 `diagnostic` 是空的** ⇒ 调用方(LLM)拿到 `stopReason:"error"` 却**不知道为什么**,
30
- * 也就无法修正自己的配置 —— 本条把「沉默的失败」变成「可执行的错误」。
31
- *
32
- * 数据来源(宿主 `LlmRuntime`):`listProviders()` = **有 adapter 的路由**;
33
- * `listConfigurableProviders()` = **已声明但未必激活**的路由(含激活用的 settings 命名空间)。
34
- *
35
- * 判据边界:`model` 串里**没有 `/`** 时取不到 provider(沿用 agent 默认路由)⇒ **不判定**(跳过)。
36
- */
37
- export declare function providerAvailabilityError(models: readonly string[], facts: {
38
- registered: readonly {
39
- id: string;
40
- name?: string;
41
- }[];
42
- declared?: readonly {
43
- provider: string;
44
- displayName?: string;
45
- settingsNs?: string;
46
- }[];
47
- configPath?: string;
48
- }): string | null;
49
- /**
50
- * cheap-worker 规模化使用指引(guide 子命令输出)。
51
- *
52
- * 🆕 2026-10-14:**双模式段已整段退场**(owner 令「删除后台运行能力」)。本指引只描述现行机制:
53
- * 前台委派(单任务)/前台并行扇出(jobs)/白名单与 provider 预检。
54
- */
55
- export declare const CHEAP_WORKER_GUIDE = "# cheap-worker \u2014 Scale-Up Usage Guide (guide)\n\n## What it is\nOne delegation primitive: **foreground spawn**. The host starts child agent(s) through its delegation\nservice, awaits them, and returns their final text. There is no loop, no completion code, no progress\nfile, and no unattended/background run.\n\n| | single | parallel (jobs) |\n|---|---|---|\n| Call | cheap-worker(task, [label]) | cheap-worker(jobs=[{task, label?}, ...]) |\n| Behaviour | one child runs the task once | all children start at once, results keep your order |\n| Cap | \u2014 | **10 (fixed, hardcoded)** |\n| Model | CCC config (single source) | same |\n\n## \u26A0\uFE0F Before using: load eap and design the plan\nBefore calling cheap-worker, load eap (acc-eap skill) and design the \"scale-up cheap-worker plan\" based on the EAP framework.\n\n### 1. Task decomposition (E\u2191 Explicit)\n- Split large tasks into explicit subtasks: each subtask defines goal / input / boundaries (what to do, what not to do) / acceptance criteria\n- Make dependencies explicit: dependent tasks run serially, independent ones can run in parallel via `jobs`\n\n### 2. Prompt design (cheap-worker's task parameter)\n- task must be detailed, fixed, and EAP-compliant: clear goal, drawn boundaries, decidable acceptance criteria\n- the child does NOT share your conversation \u2014 restate everything it needs in task\n- Anti-example \"handle this file\" \u2014 ambiguous; good example \"read <path>, extract all rows of the\u300C\u5173\u952E\u51B3\u7B56\u300Dtable,\n output a JSON array (fields id/conclusion/evidence), do not modify the original file\"\n- Reading/curating or text-writing work (extracting from files, summarizing, writing docs, generating text, etc.):\n the cheap-worker-internal agent is also required to load eap and organize output per the EAP standard\n\n### 3. Model (CCC-configured, not selectable per call)\n- The model is read from .opencode/serenity.json \"cheap-worker.models\" \u2014 **the caller cannot pass one**\n (there is no \"model\" parameter). \"cheap-worker.defaultModel\" names which entry is used; it falls back to models[0].\n- The CCC is expected to point this whitelist at LOW-COST models: cheap-worker is the bulk-execution channel\n- A child's own recursive subagents inherit the child's model automatically (DSH native)\n\n### 3b. \uD83D\uDD34 Provider availability (per-machine \u2014 the whitelist is NOT enough)\n- The whitelist lives in the **CCC** (\"serenity.json\", it **travels with the repository**), but provider\n **adapters are registered per machine by the host** (profile config / settings namespace). An entry that\n works on one machine can fail on another with: \"no adapter registered for provider <p>\".\n- Before spawning, cheap-worker verifies the provider of the resolved model against the adapters registered\n **on this machine**; if it is missing it reports the requested model, where it is configured, **the\n providers that ARE available here**, any declared-but-dormant route (with its settings namespace), and the\n exact fix \u2014 delivered in the result's \"diagnostic\" field (never an opaque failure, never a created child).\n- \u21D2 If you see \"has no adapter registered on this machine\": edit \".opencode/serenity.json\" \"cheap-worker.models\"\n (and \"cheap-worker.defaultModel\") to a provider listed as available, or activate/register the provider on this\n machine. **Do not retry the same call unchanged** \u2014 it fails identically.\n\n### 4. Parallel strategy\n- Independent subtasks: cheap-worker(jobs=[{task,label?},...]) \u21D2 fan-out, **cap 10**, results come back\n **in the order you passed them** (label is only a display name).\n- For programmable pipeline/phase orchestration at scale, use the platform's workflow tool instead.\n\n## Completion criteria\n- The child's run settles; done=true only when stopReason=\"completed\" \u2014 otherwise read \"diagnostic\"\n (and \"output\" for whatever partial text was produced).\n";
@@ -1,42 +0,0 @@
1
- /**
2
- * trajectory/delegate/preset.ts — cheap-worker worker 的 preset 继承 + 工具面收窄(纯函数,可单测)
3
- *
4
- * v1.24.0:loop → cheap-worker 重命名。对齐 subagent 先例(applyChildComposition →
5
- * agentPresets.composeFrom):cheap-worker worker 在创建窗口内 join 发起方 agent 的 standing
6
- * preset 组合,从而获得 preset 层工具(read/write/edit 等)。
7
- *
8
- * **工具面收窄(用户拍板)**:worker 内部**不含 cheap-worker 工具本身**——递归编排归主
9
- * agent,worker 内部只走 subagent(模型继承 worker,同样低能)。实现:setup 钩子
10
- * composeFrom 后对子 scope `tools.restrict({ deny: ['cheap-worker'] })`(同 scope 注册的
11
- * 规则,最近 scope 胜出——worker 看不到 cheap-worker,主 agent 不受影响)。
12
- *
13
- * agentPresets 是可选服务(ctx.get 读取):
14
- * - 无该服务 / 父未 join preset → 返回空(worker 落全局工具层 + deny cheap-worker);
15
- * - 有且父已 join → 返回 preset id(写入 session meta 供重建)+ setup 钩子
16
- * (在 agent 未发布前执行 composeFrom + restrict,失败由创建事务回滚)。
17
- *
18
- * 仅依赖 cordis 的 Context 类型(type-only,运行时擦除)——保持可被 vitest
19
- * 直接加载(与 kernel/ccc.ts / trajectory/delegate/core.ts 同级的纯模块约定)。
20
- *
21
- * ## S14(2026-10-19,轨迹中心重构):此前位于 `role/worker/` 下(该目录已消失)
22
- *
23
- * 落点 = `trajectory/delegate/`,与 `./core.ts` 同域。这里的"preset 继承"是**委派关系**的
24
- * 一部分(子 agent join 父的 standing preset),主语仍是"主轨迹怎么把活派出去"。
25
- * 🔴 递归防护(`deny: ['cheap-worker']`)也住在这里 —— 它是委派**方向的守卫**,不是容器宪法:
26
- * 换一条轨迹,它照样生效,但它约束的是"派出去之后再派"这件事。
27
- */
28
- import type { Context } from 'cordis';
29
- /** 从父 agent ctx 解析 preset 继承的创建期组合。 */
30
- interface CheapWorkerPresetInheritance {
31
- /** 父 agent 的 preset id(写入子 session meta.agentPreset,供持久化重建);无则不写。 */
32
- readonly agentPreset?: string;
33
- /** 创建 setup 钩子:子 scope join 父的 standing preset + deny cheap-worker 工具;无 preset 继承时仅 deny。 */
34
- readonly setup?: (childCtx: Context) => void;
35
- }
36
- /**
37
- * 解析 cheap-worker worker 从父 agent 继承的 preset,并组装创建 setup 钩子。
38
- * @param parentCtx - 发起 cheap-worker 的 agent 的 scope ctx;无(headless/非 agent 上下文)时为 undefined。
39
- * @returns 继承结果:meta 用的 agentPreset 与创建 setup 钩子。
40
- */
41
- export declare function cheapWorkerPresetInheritance(parentCtx: Context | undefined): CheapWorkerPresetInheritance;
42
- export {};