@shgroup/dsh-serenity-hooks 1.34.2 → 1.35.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.
- package/README.md +10 -12
- package/dsh.plugin.json +1 -1
- package/lib/client.js +1 -216
- package/lib/container-status.d.ts +20 -28
- package/lib/diag-ops.d.ts +28 -30
- package/lib/host/effect.d.ts +1 -1
- package/lib/index.js +361 -561
- package/lib/live-sessions.d.ts +54 -0
- package/lib/{settings-section-DTYZjwUs.js → settings-section-DMDUoQum.js} +0 -2
- package/lib/settings-section.d.ts +3 -8
- package/lib/tools/acc-diag.d.ts +4 -1
- package/lib/tools/container-admin.d.ts +3 -3
- package/lib/{trajectory-ops-mrXK0H0I.js → trajectory-bound-DETSEBpL.js} +188 -2
- package/lib/trajectory-ops.d.ts +2 -1
- package/lib/{wake-registry-CYxIb484.js → wake-registry-Cj2aSHME.js} +3 -2
- package/lib/wake-registry.d.ts +3 -2
- package/package.json +1 -1
- package/lib/autopilot-chain.d.ts +0 -76
- package/lib/autopilot-core-DCRkiWEe.js +0 -229
- package/lib/autopilot-core.d.ts +0 -132
- package/lib/autopilot-ops.d.ts +0 -48
- package/lib/autopilot-trajectory-D9Znxo75.js +0 -782
- package/lib/autopilot-trajectory.d.ts +0 -230
- package/lib/trajectory-bound-Cax1p9ut.js +0 -190
package/README.md
CHANGED
|
@@ -77,11 +77,11 @@ dsh plugin --profile web add link:$(pwd)/hooks/dsh-serenity-hooks
|
|
|
77
77
|
| `praxis` | 按需给 AI 注入三套"做事方法":输出自检(eap)、设计对齐(neat)、认知连续性(cce) | 要它把话说清楚 / 先对齐再动手时 |
|
|
78
78
|
| `handyman` | 杂工:派一个便宜模型的助手干活。**默认模式(foreground)**= 一次串行委派、拿回结果;**background 模式**= 循环干活直到完成(完成码校验 / 轮次上限 / 自动重启 / 进度文件),也可一次派多个并行 | 大批量、重复性的活(扫描几十个技能、逐用例回归) |
|
|
79
79
|
| `localstore` | 存密钥和配置(凭据、偏好两个命名空间) | API key、密码集中放一处,不进 git |
|
|
80
|
-
| `container_admin` |
|
|
80
|
+
| `container_admin` | 机务舱:管理子角色、管理小工具注册表、查看全部配置 | 定义"子角色"、注册新小工具、改配置时 |
|
|
81
81
|
| `im-bridge` | 给 IM 联系人发消息(目前是微信):发文本、发文件、查已配置联系人、查通道状态。每次成功发送自动进工作区的消息记录 | 想让 AI 主动给家人/同事发消息(见 §6.6)。**只在工作区配了微信桥时才出现**,且只能发本工作区的消息 |
|
|
82
|
-
| `acc-diag` | ACC
|
|
82
|
+
| `acc-diag` | ACC 运行态诊断:一次调用出全报告——当前有多少会话活着、各自属于哪个工作区、唤醒时钟的武装态与 tick 次数、唤醒登记表的每一条(含状态 / 投递结果 / 补跑窗口) | **ACC 维护者专用**。**默认对所有工作区隐藏**,只有在工作区配置里点名(`exclusiveTools`)才出现 |
|
|
83
83
|
|
|
84
|
-
> **改过名**(旧名已彻底停用,没有兼容别名):下面每组的箭头链是**逐个发布版本**的名字,**末项才是今名**——`cc_fs` → `container_fs` · `cc_git` → `container_git` · `session`+`session_rebuild` → `logbook`(v1.30/1.31)→ `trajectory`(v1.32)→ **`container_trajectory`**(v1.34,今名) · `acc_kit` → `dashboard` · `acc_msm` → `msm`(执行)+ `container_admin`(管理)· `eap`/`neat`/`cce` → `praxis` · `skiff_admin` → `container_admin role` · `autopilot-trajectory` → `trajectory`(v1.32)→ **`container_trajectory`**(v1.34
|
|
84
|
+
> **改过名**(旧名已彻底停用,没有兼容别名):下面每组的箭头链是**逐个发布版本**的名字,**末项才是今名**——`cc_fs` → `container_fs` · `cc_git` → `container_git` · `session`+`session_rebuild` → `logbook`(v1.30/1.31)→ `trajectory`(v1.32)→ **`container_trajectory`**(v1.34,今名) · `acc_kit` → `dashboard` · `acc_msm` → `msm`(执行)+ `container_admin`(管理)· `eap`/`neat`/`cce` → `praxis` · `skiff_admin` → `container_admin role` · `autopilot-trajectory` → `trajectory`(v1.32)→ **`container_trajectory`**(v1.34,今名)。老会话里看到旧名,**一律取所在那一组的末项**。
|
|
85
85
|
|
|
86
86
|
### 3.2 机械约束(AI 绕不过去)
|
|
87
87
|
|
|
@@ -264,19 +264,17 @@ DSH 一个进程可以同时带多个工作区,每个工作区各自对接自
|
|
|
264
264
|
- **只给答案**:响应里只有 answer / answer_html / sessionId——内部轨迹、工具结果、机制信息都不出去
|
|
265
265
|
- 默认只监听 127.0.0.1;要给别人用,怎么暴露(隧道/反代/端口映射)由你决定
|
|
266
266
|
|
|
267
|
-
### 6.5
|
|
267
|
+
### 6.5 轨迹与定时唤醒(trajectory)
|
|
268
268
|
|
|
269
|
-
`trajectory
|
|
269
|
+
`trajectory`(轨迹)是一等概念:一个工作区里可以有任意多条轨迹并行。
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
**定时唤醒**:用 `container_trajectory wake-later` 登记一条"唤醒" = 未来某时刻 + 一条消息——可以给自己预约,也可以唤醒别的轨迹;落在工作区内的 `AGENT_SESSIONS/wake-registry.json`(可读可审计),到点由中心调度器投递,**不阻塞、不等待、也不回执**。
|
|
272
272
|
|
|
273
|
-
-
|
|
274
|
-
-
|
|
275
|
-
- **多个工作区各自独立**:每个工作区自己的间隔/会话/焦点/窗口,互不干扰
|
|
276
|
-
- **有审计**:每次唤醒都记一笔,面板里能看到最近几次;失败会指数退避重试
|
|
277
|
-
- **还能预约未来某一刻**:用 `container_trajectory wake-later` 登记一条"唤醒"= 未来某时刻 + 一条消息——可以给自己预约,也可以唤醒别的轨迹;落在工作区内的 `AGENT_SESSIONS/wake-registry.json`(可读可审计),到点由中心调度器投递,不阻塞、不等待、也不回执
|
|
273
|
+
- **目标没打开也能唤醒**:会话不在内存里时先把它载入再投递(**冷唤醒**);载入不了则条目留在登记表里并记下原因,**不静默丢弃**
|
|
274
|
+
- **"周期"归工作区自己**:要一轮接一轮,就由**收到唤醒的那条轨迹**在每轮结束时再排一次下一轮——ACC 只提供"到点投递一条消息"这个原语,不替工作区决定节拍(焦点、节拍、偏见都由工作区自定;任意条轨迹并行、互不干扰)
|
|
278
275
|
- **轨迹可以自带 skill**:在它的 `SESSION.md` 顶部 frontmatter 写 `skills: [名字, …]`,这条轨迹**被绑定期间**的每个请求都会注入这些 skill 的全文(适合把某个领域的做事方法直接挂在轨迹上);skill 名来自工作区数据,**先过安全校验才会用于拼路径**,找不到会在提示里明说"缺失"而**不静默跳过**
|
|
279
|
-
|
|
276
|
+
|
|
277
|
+
> ⚠️ **历史(v1.35.0 起已退场)**:ACC 曾自带一套"**周期自唤醒 autopilot**"——插件内时钟 + 工作区配置里的 `topPrompt`/偏见脚本 + 面板「周期自唤醒」开关 + `container_admin autopilot` 三动作(status/init/generate-bias)。**v1.35.0 起整段删除**。理由:它相对 `wake-later` 只多两样——"周期节拍"与"提示词注入",而这两样**工作区自己就能做**(见上);且 `wake-later` 反而更强(**支持冷会话唤醒**,而 autopilot 要求目标会话已在内存里)。老会话 / 老文档里看到 `container_admin autopilot`、`autopilot-trajectory`、`--auto` 目录后缀、`[Autopilot Trajectory · 唤起]` 等字样,**均按本条理解**:那是已删除的机制。
|
|
280
278
|
|
|
281
279
|
### 6.6 安全模型
|
|
282
280
|
|
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.0",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——11 个工具(container_fs/container_trajectory/dashboard/container_git/msm/praxis/handyman/localstore/container_admin/im-bridge/acc-diag;后两个按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫)+ 轨迹日志与原地重建 + 网页登录入口/微信桥/子角色/对外问答页/trajectory 唤醒注册表。适配 DSH 0.1.5-rc.2(deepseek-ai/deepseek-harness)。",
|
|
6
6
|
"engines": {
|
package/lib/client.js
CHANGED
|
@@ -4735,23 +4735,6 @@ Instruction-following style:
|
|
|
4735
4735
|
})]
|
|
4736
4736
|
});
|
|
4737
4737
|
}
|
|
4738
|
-
/** 只读定义列表(dl/dt/dd 网格——v1.27.5 紧凑化:只读状态不再各占一行卡) */
|
|
4739
|
-
function DefList(props) {
|
|
4740
|
-
const { items } = props;
|
|
4741
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dl", {
|
|
4742
|
-
className: "ss-defList",
|
|
4743
|
-
children: items.map((it) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
4744
|
-
className: "ss-defItem",
|
|
4745
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
|
|
4746
|
-
className: "ss-defTerm",
|
|
4747
|
-
children: it.term
|
|
4748
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", {
|
|
4749
|
-
className: "ss-defValue",
|
|
4750
|
-
children: it.value
|
|
4751
|
-
})]
|
|
4752
|
-
}, it.term))
|
|
4753
|
-
});
|
|
4754
|
-
}
|
|
4755
4738
|
/** dsh 原生设置面板:serenity-hooks 配置页(官方 settings 设计语言,多级标题) */
|
|
4756
4739
|
function SettingsSection(props) {
|
|
4757
4740
|
const { scope } = props;
|
|
@@ -4788,14 +4771,12 @@ Instruction-following style:
|
|
|
4788
4771
|
const acpOn = value?.acpEnabled ?? false;
|
|
4789
4772
|
const acpPort = value?.acpHttpPort ?? 3100;
|
|
4790
4773
|
const publicAskOn = value?.publicAskEnabled ?? false;
|
|
4791
|
-
const autopilotOn = value?.autopilotWakeEnabled ?? value?.autopilotEnabled ?? false;
|
|
4792
4774
|
const wakeSchedOn = value?.wakeSchedulerEnabled ?? true;
|
|
4793
4775
|
const [openGateway, setOpenGateway] = (0, react.useState)(false);
|
|
4794
4776
|
const [openRebuild, setOpenRebuild] = (0, react.useState)(false);
|
|
4795
4777
|
const [openSkiff, setOpenSkiff] = (0, react.useState)(false);
|
|
4796
4778
|
const [openAcp, setOpenAcp] = (0, react.useState)(false);
|
|
4797
4779
|
const [openPublicAsk, setOpenPublicAsk] = (0, react.useState)(false);
|
|
4798
|
-
const [openAutopilot, setOpenAutopilot] = (0, react.useState)(false);
|
|
4799
4780
|
const [openWakeSched, setOpenWakeSched] = (0, react.useState)(false);
|
|
4800
4781
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
4801
4782
|
className: "ss-section",
|
|
@@ -4942,24 +4923,6 @@ Instruction-following style:
|
|
|
4942
4923
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PublicAskEditor, { publicAskOn })]
|
|
4943
4924
|
})
|
|
4944
4925
|
}) }),
|
|
4945
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
4946
|
-
title: "周期自唤醒(autopilot)",
|
|
4947
|
-
desc: "定时唤起 autopilot 轨迹(全局开关,默认关——只在指定电脑开启)",
|
|
4948
|
-
expandable: true,
|
|
4949
|
-
open: openAutopilot,
|
|
4950
|
-
onToggle: setOpenAutopilot,
|
|
4951
|
-
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Toggle, {
|
|
4952
|
-
checked: autopilotOn,
|
|
4953
|
-
onChange: (on) => toggle("autopilotWakeEnabled", on)
|
|
4954
|
-
}),
|
|
4955
|
-
detail: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
4956
|
-
className: "ss-detailStack",
|
|
4957
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
4958
|
-
className: "ss-detailIntro",
|
|
4959
|
-
children: "周期自唤醒全局闸(v1.34 更名收窄,原 Autopilot Trajectory 全局总开关):\n· 作用:控制本机(本 dsh 实例)是否运行**周期**自动巡航唤起\n· 语义边界:**只管周期自唤醒** —— 关掉它不影响一次性唤醒(wake-later,见下一行)\n· 默认关:未开启即使 CCC 配置 enabled=true 也不启动定时器\n· 定位:多台电脑装 dsp 时,只在指定电脑开启(其余默认关)\n· 双重门控:本开关 AND CCC 级 enabled 都满足才运行\n· CCC 级配置(interval/session/偏见脚本/焦点)不受影响"
|
|
4960
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AutopilotTrajectoryStatusBlock, { autopilotOn })]
|
|
4961
|
-
})
|
|
4962
|
-
}) }),
|
|
4963
4926
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
4964
4927
|
title: "唤醒调度器(wake-later)",
|
|
4965
4928
|
desc: "投递已登记的“未来时刻 + 一条 message”(全局开关,默认开)",
|
|
@@ -4974,7 +4937,7 @@ Instruction-following style:
|
|
|
4974
4937
|
className: "ss-detailStack",
|
|
4975
4938
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
4976
4939
|
className: "ss-detailIntro",
|
|
4977
|
-
children: "唤醒调度器全局闸(v1.34
|
|
4940
|
+
children: "唤醒调度器全局闸(v1.34 独立开关):\n· 作用:把 CCC 唤醒注册表(AGENT_SESSIONS/wake-registry.json)里到点的条目投递给目标轨迹\n· 条目来源:`container_trajectory wake-later`(对自己或别的 trajectory 预约未来时刻 + 一条 message)\n· 默认开:条目全部由人类/agent 显式登记,无环境自主性 ⇒ 不需要“默认关”的实验保护\n· 唯一性:ACC 现存的**唯一**轨迹调度时钟(原并列的周期自唤醒闸已随 ACC 侧 autopilot 退场删除)\n· 精度:5min tick;补跑窗口 2h(超窗判 missed 留痕);fire-and-forget 无回执"
|
|
4978
4941
|
})
|
|
4979
4942
|
})
|
|
4980
4943
|
}) })
|
|
@@ -5124,184 +5087,6 @@ Instruction-following style:
|
|
|
5124
5087
|
]
|
|
5125
5088
|
});
|
|
5126
5089
|
}
|
|
5127
|
-
/** 「Autopilot Trajectory」只读状态区块(v1.26.14;v1.27.4 多 CCC:显式 CCC 选择器——
|
|
5128
|
-
* GET/POST 带 ?ccc=/body.ccc——用户"两个 CCC 都设定了,但手工唤起只能唤起一个"修复):
|
|
5129
|
-
* 展示所选 CCC 的状态(配置摘要 + 目标会话 + 窗口/可唤起判定 + 审计);配置改走 CCC 配置文件
|
|
5130
|
-
* v1.29:autopilotOn prop(需求②——原折叠块并入开关行 detail,全局门控状态由外部行显示) */
|
|
5131
|
-
function AutopilotTrajectoryStatusBlock(props) {
|
|
5132
|
-
const [cccs, setCccs] = (0, react.useState)([]);
|
|
5133
|
-
const [selectedRoot, setSelectedRoot] = (0, react.useState)("");
|
|
5134
|
-
const [status, setStatus] = (0, react.useState)(null);
|
|
5135
|
-
const [wakes, setWakes] = (0, react.useState)([]);
|
|
5136
|
-
const [unavailable, setUnavailable] = (0, react.useState)(false);
|
|
5137
|
-
const [waking, setWaking] = (0, react.useState)(false);
|
|
5138
|
-
const [wakeResult, setWakeResult] = (0, react.useState)(null);
|
|
5139
|
-
(0, react.useEffect)(() => {
|
|
5140
|
-
let alive = true;
|
|
5141
|
-
(async () => {
|
|
5142
|
-
try {
|
|
5143
|
-
const res = await fetch("/serenity/cccs", { headers: { accept: "application/json" } });
|
|
5144
|
-
if (!res.ok) return;
|
|
5145
|
-
const body = await res.json();
|
|
5146
|
-
if (!alive || !Array.isArray(body.cccs)) return;
|
|
5147
|
-
setCccs(body.cccs);
|
|
5148
|
-
if (body.cccs.length > 0) setSelectedRoot((prev) => prev || body.cccs[0].root);
|
|
5149
|
-
else setUnavailable(true);
|
|
5150
|
-
} catch {}
|
|
5151
|
-
})();
|
|
5152
|
-
return () => {
|
|
5153
|
-
alive = false;
|
|
5154
|
-
};
|
|
5155
|
-
}, []);
|
|
5156
|
-
const refresh = (0, react.useCallback)(async () => {
|
|
5157
|
-
if (!selectedRoot) return;
|
|
5158
|
-
try {
|
|
5159
|
-
const res = await fetch(`/serenity/trajectory?ccc=${encodeURIComponent(selectedRoot)}`, { headers: { accept: "application/json" } });
|
|
5160
|
-
if (!res.ok) return;
|
|
5161
|
-
const body = await res.json();
|
|
5162
|
-
if (Array.isArray(body.wakes)) setWakes(body.wakes);
|
|
5163
|
-
if (body.status) {
|
|
5164
|
-
setStatus(body.status);
|
|
5165
|
-
setUnavailable(false);
|
|
5166
|
-
} else {
|
|
5167
|
-
setStatus(null);
|
|
5168
|
-
setUnavailable(true);
|
|
5169
|
-
}
|
|
5170
|
-
} catch {}
|
|
5171
|
-
}, [selectedRoot]);
|
|
5172
|
-
(0, react.useEffect)(() => {
|
|
5173
|
-
refresh();
|
|
5174
|
-
return () => {};
|
|
5175
|
-
}, [refresh]);
|
|
5176
|
-
const wakeNow = async () => {
|
|
5177
|
-
if (waking || !selectedRoot) return;
|
|
5178
|
-
setWaking(true);
|
|
5179
|
-
setWakeResult(null);
|
|
5180
|
-
try {
|
|
5181
|
-
const res = await fetch("/serenity/trajectory", {
|
|
5182
|
-
method: "POST",
|
|
5183
|
-
headers: {
|
|
5184
|
-
"content-type": "application/json",
|
|
5185
|
-
"x-serenity-ui": "1"
|
|
5186
|
-
},
|
|
5187
|
-
body: JSON.stringify({
|
|
5188
|
-
action: "wake",
|
|
5189
|
-
ccc: selectedRoot
|
|
5190
|
-
})
|
|
5191
|
-
});
|
|
5192
|
-
const body = await res.json();
|
|
5193
|
-
setWakeResult(body.detail ?? body.error ?? `HTTP ${res.status}`);
|
|
5194
|
-
refresh();
|
|
5195
|
-
} catch (err) {
|
|
5196
|
-
setWakeResult(err instanceof Error ? err.message : String(err));
|
|
5197
|
-
} finally {
|
|
5198
|
-
setWaking(false);
|
|
5199
|
-
}
|
|
5200
|
-
};
|
|
5201
|
-
if (unavailable && cccs.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
5202
|
-
className: "ss-rows",
|
|
5203
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
5204
|
-
title: "未激活",
|
|
5205
|
-
desc: "未发现候选 CCC(/serenity/cccs 为空)——先在工作区打开一个 CCC 会话",
|
|
5206
|
-
control: null
|
|
5207
|
-
}) })
|
|
5208
|
-
});
|
|
5209
|
-
if (!status) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
5210
|
-
className: "ss-rows",
|
|
5211
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
5212
|
-
title: "加载中…",
|
|
5213
|
-
desc: "读取 Autopilot Trajectory 状态",
|
|
5214
|
-
control: null
|
|
5215
|
-
}) })
|
|
5216
|
-
});
|
|
5217
|
-
const target = status.target;
|
|
5218
|
-
const { autopilotOn } = props;
|
|
5219
|
-
const stateText = !props.autopilotOn ? "全局开关关闭(在「外部能力」组开启后才运行)" : !status.configured ? "未配置(机制未开始)" : !status.enabled ? "已配置,未启用(enabled=false,零资源占用)" : "已启用 — 时钟唤起等待中";
|
|
5220
|
-
const targetText = target ? `${target.dirName}${target.autoFlag ? "(--auto ✓)" : "(无 --auto 标志)"} · 空闲 ${target.idleHours.toFixed(1)}h / 阈值 ${status.intervalHours}h` : status.session ? `会话 ${status.session} 未命中(AGENT_SESSIONS 无匹配)` : "未配置目标会话(不唤起)";
|
|
5221
|
-
const wakeReady = status.enabled && !!target && target.autoFlag;
|
|
5222
|
-
const lastWake = status.recentWakes[0];
|
|
5223
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
|
|
5224
|
-
className: "ss-rows",
|
|
5225
|
-
children: [
|
|
5226
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
5227
|
-
title: "目标 CCC",
|
|
5228
|
-
desc: "多 CCC 各自独立——选中哪个就查看/唤起哪个",
|
|
5229
|
-
help: "Autopilot Trajectory 目标认知容器:\n· 机制:dsh 一个进程可挂载多个 CCC,每个 CCC 的 autopilot 独立配置\n· 选择:下拉切换要查看/唤起的目标 CCC(各 CCC 时钟独立)\n· 配置:各 CCC 在自身 .opencode/serenity.json 定义 trajectory.autopilot(旧键 autopilotTrajectory 兼容)\n· 唤起:仅对选中 CCC 生效,互不干扰",
|
|
5230
|
-
control: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
5231
|
-
className: "ss-select",
|
|
5232
|
-
value: selectedRoot,
|
|
5233
|
-
onChange: (e) => {
|
|
5234
|
-
setSelectedRoot(e.target.value);
|
|
5235
|
-
setStatus(null);
|
|
5236
|
-
},
|
|
5237
|
-
children: [cccs.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
5238
|
-
value: "",
|
|
5239
|
-
children: "加载中…"
|
|
5240
|
-
}), cccs.map((c) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
5241
|
-
value: c.root,
|
|
5242
|
-
children: c.name || c.root
|
|
5243
|
-
}, c.root))]
|
|
5244
|
-
})
|
|
5245
|
-
}) }),
|
|
5246
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
5247
|
-
title: "运行状态",
|
|
5248
|
-
desc: stateText,
|
|
5249
|
-
help: "Autopilot Trajectory 运行状态含义:\n· 未配置:该 CCC 未定义 trajectory.autopilot(机制不开始)\n· 已配置未启用:enabled=false,零资源占用(不唤起不消耗)\n· 已启用:时钟驱动周期性自动唤起——无人类活动满间隔小时数后\n 启动一次前台 agent 轮(用户全程可见可介入)",
|
|
5250
|
-
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5251
|
-
className: "ss-value",
|
|
5252
|
-
children: status.enabled ? "● 运行中" : status.configured ? "○ 待启" : "—"
|
|
5253
|
-
})
|
|
5254
|
-
}) }),
|
|
5255
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5256
|
-
className: "ss-rowCard",
|
|
5257
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DefList, { items: [
|
|
5258
|
-
{
|
|
5259
|
-
term: "目标会话",
|
|
5260
|
-
value: targetText
|
|
5261
|
-
},
|
|
5262
|
-
{
|
|
5263
|
-
term: "唤起窗口",
|
|
5264
|
-
value: `北京 ${status.beijingHour} 点 — ${status.windowAllowed ? "允许" : `避开 ${status.avoidWakeHours.start}~${status.avoidWakeHours.end}`}`
|
|
5265
|
-
},
|
|
5266
|
-
{
|
|
5267
|
-
term: "偏见提供者",
|
|
5268
|
-
value: status.biasProvider
|
|
5269
|
-
},
|
|
5270
|
-
{
|
|
5271
|
-
term: "轨迹焦点",
|
|
5272
|
-
value: status.topPrompt ?? "未定义(CCC 应填写,防焦点丢失)"
|
|
5273
|
-
},
|
|
5274
|
-
{
|
|
5275
|
-
term: "最近唤起",
|
|
5276
|
-
value: lastWake ? `${new Date(lastWake.time).toLocaleString()} — ${lastWake.ok ? "✓" : "✗"} ${lastWake.detail}` : "尚无"
|
|
5277
|
-
}
|
|
5278
|
-
] })
|
|
5279
|
-
}) }),
|
|
5280
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5281
|
-
className: "ss-rowCard",
|
|
5282
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DefList, { items: [{
|
|
5283
|
-
term: "唤醒注册表",
|
|
5284
|
-
value: wakes.length === 0 ? "无条目(agent 用 container_trajectory wake-later 登记:未来时刻 + 一条 message)" : `${wakes.filter((w) => w.state === "pending").length} 条在办 / 共 ${wakes.length} 条`
|
|
5285
|
-
}, ...wakes.slice(0, 5).map((w) => ({
|
|
5286
|
-
term: w.state === "pending" ? "· 待唤醒" : `· ${w.state}`,
|
|
5287
|
-
value: `${new Date(w.at).toLocaleString()} → ${w.target}${w.lastResult ? `(${w.lastResult})` : ""}`
|
|
5288
|
-
}))] })
|
|
5289
|
-
}) }),
|
|
5290
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
|
|
5291
|
-
title: "立即唤起",
|
|
5292
|
-
desc: wakeResult ?? "调试:手动触发一次(跳过窗口/间隔,仍校验配置与偏见脚本)",
|
|
5293
|
-
help: "立即唤起(调试语义):\n· 用途:手动触发一次该 CCC 的自动唤起(不等时钟)\n· 跳过:唤起窗口(北京 8~18 点避开)/ 间隔\n· 保留校验:enabled、目标会话(--auto)、偏见脚本可运行\n· 场景:验证配置/偏见脚本是否就绪,或想立刻跑一轮",
|
|
5294
|
-
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5295
|
-
type: "button",
|
|
5296
|
-
className: "ss-wakeBtn",
|
|
5297
|
-
disabled: !wakeReady || waking,
|
|
5298
|
-
onClick: () => void wakeNow(),
|
|
5299
|
-
children: waking ? "唤起中…" : "立即唤起"
|
|
5300
|
-
})
|
|
5301
|
-
}) })
|
|
5302
|
-
]
|
|
5303
|
-
});
|
|
5304
|
-
}
|
|
5305
5090
|
//#endregion
|
|
5306
5091
|
//#region src/client/index.ts
|
|
5307
5092
|
const inject = [
|
|
@@ -15,20 +15,19 @@
|
|
|
15
15
|
* 其模块级运行时对象里,任何"重新推导"得到的都是与真实调度器不一致的假值。
|
|
16
16
|
*
|
|
17
17
|
* 依赖分层(为什么本模块"重"而 `kit-ops` / `status` 保持"轻"):
|
|
18
|
-
* {@link containerClocks} 必须读 `wake-scheduler`
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* {@link containerClocks} 必须读 `wake-scheduler` 的进程内快照,而该模块带 **@deepseek-ai 值依赖**
|
|
19
|
+
* (`dsh-llm` 的 `createUserMessage`)。故本模块**只能**被本就重型或异步的消费方使用:
|
|
20
|
+
* `diag-ops`(静态 import)、`api.ts` / `kit-ops`(`await import(...)`,与 `api.ts` 既有的
|
|
21
|
+
* "保持静态链纯净"约定一致)。**轻链模块不得静态 import 本模块**。
|
|
22
22
|
*
|
|
23
23
|
* 已有的单一真相源继续指向原处(**不复制**):
|
|
24
24
|
* L0 根解析 `ccc.ts findSerenityRoot`|L1/L2 根与枚举 `ccc-roots.ts`|宿主契约 `host/contract.ts`
|
|
25
|
-
* |CCC 配置 `ccc.ts loadSerenityConfig`|注册表 `msm-ops.ts`|时钟 `wake-scheduler.ts`
|
|
26
|
-
*
|
|
25
|
+
* |CCC 配置 `ccc.ts loadSerenityConfig`|注册表 `msm-ops.ts`|时钟 `wake-scheduler.ts`
|
|
26
|
+
* |唤醒注册表 `wake-registry.ts`。
|
|
27
27
|
*/
|
|
28
28
|
import { type HostContractReport } from './host/contract.js';
|
|
29
29
|
import { checkRegistryQuality, type RegistryQualityReport } from './msm-ops.js';
|
|
30
30
|
import { type WakeEntry } from './wake-registry.js';
|
|
31
|
-
import { autopilotClockState, getAutopilotStatus } from './autopilot-trajectory.js';
|
|
32
31
|
import { wakeSchedulerState } from './wake-scheduler.js';
|
|
33
32
|
import type { JsonValue } from './json.js';
|
|
34
33
|
export interface ContainerIdentity {
|
|
@@ -100,25 +99,21 @@ export declare function checkRegistryHealth(root: string): RegistryStructureRepo
|
|
|
100
99
|
export { checkRegistryQuality, type RegistryQualityReport };
|
|
101
100
|
/**
|
|
102
101
|
* 进程内时钟快照类型。
|
|
103
|
-
* ⚠️
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* 但类型上不是同一个。**不为了合并类型去改那两个模块的导出面**。
|
|
102
|
+
* ⚠️ 形状由**时钟模块自身**定义(`wake-scheduler.ts` 未导出的 `WakeSchedulerRuntime`)——故此处
|
|
103
|
+
* 直接取其返回类型。2026-09-15:原为「唤醒调度器 ∪ autopilot」联合(两者诊断字段同规格但类型
|
|
104
|
+
* 不同);autopilot 时钟随 ACC 侧 autopilot 退场删除后,**只剩一座钟**(唤醒调度器)。
|
|
107
105
|
*/
|
|
108
|
-
export type ClockSnapshot = ReturnType<typeof wakeSchedulerState
|
|
106
|
+
export type ClockSnapshot = ReturnType<typeof wakeSchedulerState>;
|
|
109
107
|
export interface ContainerClocks {
|
|
110
108
|
/** 唤醒调度器(一次性唤醒,5min tick)——**模块级快照**,不重算 */
|
|
111
109
|
wake: ClockSnapshot;
|
|
112
|
-
/** autopilot 时钟(周期自唤醒 tick)——**模块级快照**,不重算 */
|
|
113
|
-
autopilot: ClockSnapshot;
|
|
114
110
|
}
|
|
115
111
|
/**
|
|
116
|
-
*
|
|
112
|
+
* 时钟的进程内状态("为什么这轮没被唤起"的第一手判据)。
|
|
117
113
|
*
|
|
118
114
|
* 🔴 **只读快照,不重算**(设计红线):`armed`/`ticks`/`lastTickAt`/`lastSkipReason` 只存在于
|
|
119
|
-
* 调度器自己的模块级运行时对象里(`wake-scheduler.ts schedulerRuntime
|
|
120
|
-
*
|
|
121
|
-
* 调度器的状态不一致——那比没有可观测量更糟(会给出假的"一切正常")。
|
|
115
|
+
* 调度器自己的模块级运行时对象里(`wake-scheduler.ts schedulerRuntime`)。任何"从配置或文件
|
|
116
|
+
* 重新推导"得到的值都会与真实调度器的状态不一致——那比没有可观测量更糟(会给出假的"一切正常")。
|
|
122
117
|
*/
|
|
123
118
|
export declare function containerClocks(): ContainerClocks;
|
|
124
119
|
export interface ContainerWakes {
|
|
@@ -132,14 +127,10 @@ export interface ContainerWakes {
|
|
|
132
127
|
/** 唤醒注册表取数(文件 IO:每个渲染点自己决定是否要看它) */
|
|
133
128
|
export declare function containerWakes(root: string): ContainerWakes;
|
|
134
129
|
/**
|
|
135
|
-
* autopilot
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* 此处不为了转出而改动那个模块的导出面)。
|
|
130
|
+
* autopilot 目标状态取数(`getAutopilotStatus`)与 `AutopilotStatusSnapshot` 类型,
|
|
131
|
+
* 连同 ACC 侧 autopilot 机制于 2026-09-15 整体删除(所有者裁决 (a))——原消费方是设置面板
|
|
132
|
+
* 的「Autopilot Trajectory」区块与 `/serenity/trajectory` 端点,两者同批删除。
|
|
139
133
|
*/
|
|
140
|
-
export type AutopilotStatusSnapshot = ReturnType<typeof getAutopilotStatus>;
|
|
141
|
-
/** @returns CCC 根缺失(null)→ null */
|
|
142
|
-
export declare function containerAutopilot(root: string | null): AutopilotStatusSnapshot | null;
|
|
143
134
|
export interface ContainerStatus {
|
|
144
135
|
identity: ContainerIdentity;
|
|
145
136
|
principles: ContainerPrinciples;
|
|
@@ -176,8 +167,9 @@ export interface ContainerStatusOptions {
|
|
|
176
167
|
/**
|
|
177
168
|
* 核心段组装(`dashboard health` 的取数:身份 + 三原则 + 注册表两判据 + 配置 + 宿主契约)。
|
|
178
169
|
*
|
|
179
|
-
*
|
|
180
|
-
* (`acc-diag` /
|
|
181
|
-
* 需要时按名字调 {@link containerClocks} / {@link containerWakes}
|
|
170
|
+
* 时间轴两段(时钟/唤醒注册表)**不在本组装内**:它们是各自独立消费方的需要
|
|
171
|
+
* (`acc-diag` / 开发面诊断),硬塞进来会让只想看三原则的调用方付无谓的 IO。
|
|
172
|
+
* 需要时按名字调 {@link containerClocks} / {@link containerWakes}。
|
|
173
|
+
* (原第三段「autopilot 目标」及其取数函数 `containerAutopilot` 已随 ACC 侧 autopilot 退场删除。)
|
|
182
174
|
*/
|
|
183
175
|
export declare function containerStatus(opts?: ContainerStatusOptions): ContainerStatus;
|
package/lib/diag-ops.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* diag-ops.ts — `acc-diag` 报告装配(v1.33,S142 §32.11
|
|
2
|
+
* diag-ops.ts — `acc-diag` 报告装配(v1.33,S142 §32.11;2026-09-15 段数收缩)
|
|
3
3
|
*
|
|
4
4
|
* 为什么单独成模块(R↓):工具面(`tools/acc-diag.ts`)只做"取 CCC 根 + 渲染",
|
|
5
5
|
* 装配逻辑放这里 ⇒ 纯函数可单测、不依赖 DSH 工具注册。
|
|
@@ -7,40 +7,45 @@
|
|
|
7
7
|
* 为什么**无动作参数**:诊断是低频动作(§32.9 收敛取向),一次调用即出全报告,
|
|
8
8
|
* 不需要子命令面;动作越多,模型选择成本越高。
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* ①
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* ③
|
|
15
|
-
* ④ 唤起条件链 —— **进程内** {@link buildWakeChain}(⑥ C6a):逐条件值 + 阻断点 + 修复建议
|
|
16
|
-
* + 只有进程内能看到的三项事实(全局闸 / live 会话 / agent 可解析性)
|
|
10
|
+
* 三段内容(数据来源各自单一真相源,本模块只聚合不复制语义):
|
|
11
|
+
* ① live 运行态 —— 插件进程内 `diagLive(ctx)`(进程 cwd/CCC + live 会话清单)
|
|
12
|
+
* ——**独立进程看不到运行时**,这正是本工具存在的理由
|
|
13
|
+
* ①b 唤醒时钟 —— `containerClocks().wake`(唤醒调度器进程内快照:武装态/计数/上次跳过原因)
|
|
14
|
+
* ③ 唤醒注册表 —— `wake-registry.json` 全量条目(state / at / target / lastResult)+ 补跑窗口
|
|
17
15
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* ── 2026-09-15:段数由四降为三(S142「ACC 侧 autopilot 退场」§1 二阶裁定)─────────────
|
|
17
|
+
* ACC 侧 autopilot 整段退场后,报告里两段的**主语消失**,故删除(不是"暂时关掉"):
|
|
18
|
+
* · 原 ② 面板解析 —— `diagLive.panelResolved` 的来源是"哪个 CCC 配了 autopilot",
|
|
19
|
+
* 面板区块同批删除 ⇒ 主语不存在。
|
|
20
|
+
* · 原 ④ 唤起条件链 —— 整段都是 ACC autopilot 的唤起条件(`buildWakeChain` +
|
|
21
|
+
* `autopilotRuntimeFacts`),实现模块已删 ⇒ 不留第二份条件链、也不留半死的手写版。
|
|
22
|
+
* · 原 ① 段的 autopilot CCC 渲染(逐 CCC 目标命中 / agent 定位)同批删除。
|
|
21
23
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
24
|
+
* 🔴 **已知缺口(登记,不静默丢弃)**:④「为什么这轮没唤起」的诊断在 **CCC 自管理链**上归零。
|
|
25
|
+
* 新链的失败形态是"S151 漏了自排下一轮"或"调度器闸关/未 tick",而删掉 ④ 后这两种病因都不可见。
|
|
26
|
+
* 按所有者裁决本次**不补**(一句话可补,代价 = 一条新条件链:调度器 armed / 闸 / tick 在跑 /
|
|
27
|
+
* 条目到期 / 补跑窗口 / 目标可解析 / CCC 闸)。**不得**以"顺手保留 ④"的方式把它偷偷带回。
|
|
28
|
+
*
|
|
29
|
+
* C5「观察面归一」(2026-09-15):① 走 `diagLive`(那是**live 运行态**的独有取数,没有第二个
|
|
30
|
+
* 来源);①b 时钟与 ③ 注册表经 `container-status.ts` 取(唯一取数出口)——**投影仍在本文件**
|
|
31
|
+
* (诊断段不含 `message`,面板含;这是渲染差异,不是取数差异)。
|
|
26
32
|
*/
|
|
27
|
-
import { type DiagLiveReport } from './
|
|
33
|
+
import { type DiagLiveReport } from './live-sessions.js';
|
|
28
34
|
import { type ClockSnapshot } from './container-status.js';
|
|
29
35
|
import type { Context } from 'cordis';
|
|
30
|
-
/**
|
|
36
|
+
/** 进程内时钟状态(唤醒调度器;判据单一真相源 = `wake-scheduler.ts`) */
|
|
31
37
|
type ClockState = ClockSnapshot;
|
|
32
38
|
interface AccDiagReport {
|
|
33
39
|
/** 调用方会话所属 CCC 根(过程内诊断的目标) */
|
|
34
40
|
ccc: string;
|
|
35
41
|
live: DiagLiveReport;
|
|
36
42
|
/**
|
|
37
|
-
*
|
|
38
|
-
* 为什么必须有(R↓):此前"条目为何滞留在 pending"
|
|
39
|
-
*
|
|
43
|
+
* 唤醒调度器的进程内武装状态(2026-09-14 F 段缺陷**新暴露面**)。
|
|
44
|
+
* 为什么必须有(R↓):此前"条目为何滞留在 pending"无法从报告回答。有了它,
|
|
45
|
+
* "时钟根本没在跑"这一类故障一眼可判——这是 ACC 现存的**唯一**轨迹调度时钟。
|
|
40
46
|
*/
|
|
41
47
|
clocks: {
|
|
42
48
|
wake: ClockState;
|
|
43
|
-
autopilot: ClockState;
|
|
44
49
|
};
|
|
45
50
|
wakes: {
|
|
46
51
|
/** 注册表文件路径问题(读不到时非空——不得静默) */
|
|
@@ -56,21 +61,14 @@ interface AccDiagReport {
|
|
|
56
61
|
}>;
|
|
57
62
|
pending: number;
|
|
58
63
|
};
|
|
59
|
-
/**
|
|
60
|
-
* 唤起条件链(进程内算出的渲染文本,含逐条件值 + 阻断点 + 修复建议)。
|
|
61
|
-
* **不是**子进程输出——判据唯一实现见 `autopilot-chain.ts`。
|
|
62
|
-
*/
|
|
63
|
-
autopilotChain: string;
|
|
64
|
-
/** 条件链判决档(`ready`/`waiting`/`blocked`/`unknown`;供调用方/测试断言,不再解析文本) */
|
|
65
|
-
autopilotVerdict: string;
|
|
66
64
|
}
|
|
67
65
|
/**
|
|
68
66
|
* 装配报告(一次调用即全报告)。
|
|
69
67
|
* @param ctx 插件上下文(进程内读 sessions/agents)
|
|
70
|
-
* @param root 调用方 CCC
|
|
68
|
+
* @param root 调用方 CCC 根(唤醒注册表取数目标)
|
|
71
69
|
* @returns 结构化报告(渲染由 {@link renderAccDiag} 负责)
|
|
72
70
|
*/
|
|
73
71
|
export declare function runAccDiag(ctx: Context, root: string): Promise<AccDiagReport>;
|
|
74
|
-
/**
|
|
72
|
+
/** 人读渲染(三段;空段也要显式说明"无",避免"沉默 = 一切正常"的误读) */
|
|
75
73
|
export declare function renderAccDiag(r: AccDiagReport): string;
|
|
76
74
|
export {};
|
package/lib/host/effect.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - `ctx.effect` 是宿主成员,但**不可假定存在**(测试替身、极旧宿主、HMR 早期阶段)。
|
|
11
11
|
* 直接裸调会让 `apply` 抛错 = 整个 dsh 启动失败(app-boot "plugin(s) failed to load"),
|
|
12
12
|
* 这比"资源没拆卸"严重得多——所以缺失时**响亮降级**(记录 + 返回 false)。
|
|
13
|
-
* - 零依赖叶模块:gateway
|
|
13
|
+
* - 零依赖叶模块:gateway 等模块只引它,不会因此被拖进 skiff/rebuild 的依赖链。
|
|
14
14
|
*/
|
|
15
15
|
/** 测试辅助:重置"未装配"告警去重(生产零调用) */
|
|
16
16
|
export declare function __resetDisposerWarningsForTest(): void;
|