@shgroup/dsh-serenity-hooks 1.113.0 → 1.113.1
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/dsh.plugin.json +1 -1
- package/lib/{contract-DJSTR5Up.js → contract-DdI7euZI.js} +4 -2
- package/lib/index.js +3 -3
- package/lib/{observation-BKsS1Qke.js → observation-Cgmm6EKE.js} +1 -1
- package/lib/{service-Cfv1byRk.js → service-BgkK71X9.js} +1 -1
- package/lib/tools/msm/service.d.ts +1 -1
- package/lib/trajectory/user-quotes.d.ts +12 -6
- package/package.json +1 -1
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.113.
|
|
3
|
+
"version": "1.113.1",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"description": "宁静号 ACC harness(Native Cordis 插件):给 DSH 装一个「AI 工作区」——12 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/localstore/container_admin;另两个 im-bridge/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(三档,deepseek-ai/deepseek-harness)。",
|
|
6
6
|
"engines": {
|
|
@@ -480,8 +480,10 @@ CCC 级微信个人号接入(iLink 协议):dsh 一进程多 CCC,每 CCC
|
|
|
480
480
|
▸ **"对谁" = 按轨迹**(Q1),取绑定真相源(\`current.dsh_session_bind\`);未绑定 ⇒ \`null\` 但**照常记**。
|
|
481
481
|
▸ **全文**(Q3):一字不改,不做摘要;\`chars\` 是**码点数**不是 UTF-16 单元数。
|
|
482
482
|
▸ 两个**冒充 \`kind:'user'\`** 的生产者(载体开场白/rebuild 锚点)按各自标记排除。
|
|
483
|
-
▸ IM
|
|
484
|
-
\`plugin:dsh-serenity-hooks\`(已取证,非推演)。⇒ 台账 = **界面直话**。
|
|
483
|
+
▸ IM 入站(**微信与飞书都算**)**不会混进来**:两者共用一个投递出口 \`deliverToTrajectory\`,
|
|
484
|
+
kind 是 \`plugin:dsh-serenity-hooks\`(已取证,非推演)。⇒ 台账 = **界面直话**。
|
|
485
|
+
⚠️ 两条边界:① 这是当前实现的属性、**不是协议保证**(IM 若改回 kind:'user' 就会开始收录,
|
|
486
|
+
那时要重新裁决);② \`_im-logs/<channel>/\` 仍是 IM 原话的唯一真相源 —— 不收录 ≠ 丢了。
|
|
485
487
|
▸ 采集失败只 warn、**不阻断 step**(台账是旁路观测,不是被观测对象的组成部分)。
|
|
486
488
|
判据全文(含取证与变异检验设计)⇒ \`src/trajectory/user-quotes.ts\` 头注释。
|
|
487
489
|
`;
|
package/lib/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { _ as resolveInside, a as findSerenityRoot$1, d as readCccName, h as rea
|
|
|
4
4
|
import { A as useSession, C as resolveSessionByTitle, D as showSession, E as setActiveSessionInfo, F as isoLocal, I as localFileStamp, M as TRAJECTORY_LEGACY_FILENAMES, O as summarize, S as readTrajectoryUid, T as sessionsRoot, _ as listSessions, b as parseTrajectoryCode, c as UID_FILENAME, d as createSession, f as extractSessionMdPathFromText, j as TRAJECTORY_FILENAME, k as trajectoryDescOf, l as archiveSession, m as getActiveSessionInfo, o as COGNITIVE_TRAJECTORY_ACTIONS, p as findSession, u as clearActiveSessionInfo, v as namingTitleFor, w as sessionEvents, y as parseSessionContextFromEvents } from "./bind-file-B0TuOP89.js";
|
|
5
5
|
import { n as checkLocalstoreGitCompliance, o as readStore, s as runLocalStore, t as LOCALSTORE_SCOPES } from "./service-Dv-8E2bI.js";
|
|
6
6
|
import { d as findPackageRoot, i as constraintSystemPromptSource, l as resolveConstraintSystemPrompt, r as constraintCognitiveTrajectory, t as TRAJECTORY_CONSTRAINT_HINT, u as ACC_VERSION } from "./rules-DKlpuFN_.js";
|
|
7
|
-
import { C as docsPointer, E as setWeixinSendEndpoint, S as runMsmAsync, T as renderDocsIndex, _ as CCC_CONFIG_REFERENCE, a as setSafeMode, b as loadMsmEntries, d as forgetNonCccToolVisibility, g as ACC_CATALOG, h as forgetToolVisibility, i as readDshVersion, m as syncToolVisibility, n as summarizeHostContract, o as listOpencodeSkillDirs, p as registerGuards, r as getStatus, s as loadOpencodeSkill, t as hostContractReport, w as findDocsChapter, x as runMsm, y as findEntry } from "./contract-
|
|
7
|
+
import { C as docsPointer, E as setWeixinSendEndpoint, S as runMsmAsync, T as renderDocsIndex, _ as CCC_CONFIG_REFERENCE, a as setSafeMode, b as loadMsmEntries, d as forgetNonCccToolVisibility, g as ACC_CATALOG, h as forgetToolVisibility, i as readDshVersion, m as syncToolVisibility, n as summarizeHostContract, o as listOpencodeSkillDirs, p as registerGuards, r as getStatus, s as loadOpencodeSkill, t as hostContractReport, w as findDocsChapter, x as runMsm, y as findEntry } from "./contract-DdI7euZI.js";
|
|
8
8
|
import { c as replacesDefaultIdentity, i as listTrajectoryConstraints, l as trajectoryCodeForSession, n as findDirNameByCode, o as readTrajectoryConstraintAt, r as isTrajectoryConstrained, s as readTrajectoryConstraintByCode, t as TRAJECTORY_CONSTRAINT_FILENAME } from "./profile-Djqz4Noy.js";
|
|
9
9
|
import { A as truncateContent, C as verifyTotpCode, D as buildResourceIndex, E as SKILL_ONTOLOGY_FILE, M as hasTrajectoryPrompt, O as buildResourceNameSuffix, S as MECHANISM_PORTS, T as REFERENCE_DIR, _ as projectKnownWorkspaces, a as trajectoryConstraintFor, b as verifyPassword, c as trajectoryWorkspaceMdPath, d as splitModel, f as registerCognitiveTrajectorySkillSection, g as migrateLegacyLocalstore, h as applyWirePatch, i as getTrajectoryAgent, j as TRAJECTORY_PROMPT_FILENAME, k as isSafeSkillName, l as unregisterTrajectorySession, m as registerEntrySkillSectionGlobal, n as deliverToTrajectory, o as trajectoryConstraintMsmGate, p as registerEntrySkillSection, r as ensureWorkspacePromptSection, s as trajectoryConstraintParticipates, t as createTrajectoryAgent, u as workspaceCognitiveTrajectoryLine, v as readAdvancedSettings, w as recordToolUsage, x as FACE_PORTS, y as toWire } from "./session-C7-l8Kzs.js";
|
|
10
10
|
import { a as findTrajectoryOfSession, c as resolveSessionCognitiveTrajectoryLabel, n as PLUGIN_SOURCE, r as appendBound, s as readLastBound, t as ACC_MESSAGE_KIND } from "./message-source-DLei3MqR.js";
|
|
@@ -516,7 +516,7 @@ const KIT_ACTIONS = [
|
|
|
516
516
|
async function runKit(root, args, hostCtx) {
|
|
517
517
|
switch (args.action) {
|
|
518
518
|
case "health": {
|
|
519
|
-
const { containerStatus } = await import("./observation-
|
|
519
|
+
const { containerStatus } = await import("./observation-Cgmm6EKE.js");
|
|
520
520
|
const s = containerStatus({
|
|
521
521
|
root,
|
|
522
522
|
hostCtx
|
|
@@ -562,7 +562,7 @@ async function runKit(root, args, hostCtx) {
|
|
|
562
562
|
}
|
|
563
563
|
case "diag": {
|
|
564
564
|
if (hostCtx === void 0) throw new Error("diag requires the plugin context (live session data unavailable without it)");
|
|
565
|
-
const { runDiag, renderDiag } = await import("./service-
|
|
565
|
+
const { runDiag, renderDiag } = await import("./service-BgkK71X9.js");
|
|
566
566
|
return renderDiag(await runDiag(hostCtx, root ?? ""));
|
|
567
567
|
}
|
|
568
568
|
default: throw new Error(`Unknown action: ${args.action}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { d as readCccName, i as findGitRoot, l as pathInside, s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-x94FCzOv.js";
|
|
2
2
|
import { u as ACC_VERSION } from "./rules-DKlpuFN_.js";
|
|
3
|
-
import { i as readDshVersion, t as hostContractReport, v as checkRegistryQuality } from "./contract-
|
|
3
|
+
import { i as readDshVersion, t as hostContractReport, v as checkRegistryQuality } from "./contract-DdI7euZI.js";
|
|
4
4
|
import { _ as listWakes, i as wakeSchedulerState } from "./scheduler-CB06u0Qc.js";
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
6
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
@@ -4,7 +4,7 @@ import { F as isoLocal, w as sessionEvents } from "./bind-file-B0TuOP89.js";
|
|
|
4
4
|
import { h as WAKE_CATCH_UP_MS, p as listCroCognitiveTrajectories } from "./scheduler-CB06u0Qc.js";
|
|
5
5
|
import { n as readSimpleSettings } from "./settings-DibHCfEU.js";
|
|
6
6
|
import { i as subscriptionStats, r as subscriptionEval } from "./subscriptions-D05XffxT.js";
|
|
7
|
-
import { containerClocks, containerWakes } from "./observation-
|
|
7
|
+
import { containerClocks, containerWakes } from "./observation-Cgmm6EKE.js";
|
|
8
8
|
//#region src/trajectory/live.ts
|
|
9
9
|
/**
|
|
10
10
|
* trajectory/live.ts — 进程内 live 会话取数 + 精简诊断
|
|
@@ -25,7 +25,7 @@ export declare const MSM_GUIDE = "MSM Development Manual (Mech & Semi-Mech frame
|
|
|
25
25
|
* 🔴 **2026-10-19 起导出**:`container_admin config docs config` 的两层菜单把它作为
|
|
26
26
|
* 「config」章正文返回。**不另写一份**——同一段说明有第二份副本就会漂(本轨反复踩过)。
|
|
27
27
|
*/
|
|
28
|
-
export declare const CCC_CONFIG_REFERENCE = "\u2550\u2550\u2550 CCC Configuration Reference \u2550\u2550\u2550\n\nCCC-level features are configured in .opencode/serenity.json.\nBelow are all available configuration sections.\n\n\u2500\u2500 1. sessionKeeper.threshold / sessionKeeper.sessionMdMaxKB \u2500\u2500\ncognitive-trajectory-assistant\uFF08COGNITIVE-TRAJECTORY-ASSISTANT \u00B7 CHECKPOINT\uFF09\u63D0\u9192\u673A\u5236\u7684\u79EF\u5206\u9608\u503C\uFF08\u975E headless \u4E3B agent\uFF09\u3002\n\u6309\u5DE5\u5177\u8C03\u7528\u52A0\u6743 + \u8017\u65F6\u8BA1\u5206\uFF1B\u8FBE\u5230\u9608\u503C\u6CE8\u5165\u63D0\u9192\uFF0C\u8981\u6C42\u6A21\u578B\u56DE\u590D ACK \u7801\u3002\n\n Config:\n { \"sessionKeeper\": { \"threshold\": 150, \"sessionMdMaxKB\": 100 } }\n\n \u8BA1\u5206\uFF1Awrite/edit = 3\uFF0Ctask = 10\uFF0Cread/grep/glob/msm \u7B49 = 1\uFF0C\u65F6\u95F4 = 1/\u5206\u949F\n \u9ED8\u8BA4\uFF1A150\n\n \u25B8 sessionMdMaxKB\uFF08v1.31.1 \u65B0\u589E\uFF1Bv1.31.2 100\u2192200\uFF1B\uD83D\uDD34 v1.84.0 200\u2192100\uFF09\uFF1A\n **\u6D3B\u8DC3 SESSION.md \u4F53\u79EF\u4E0A\u9650\uFF08KB\uFF0C\u7F3A\u7701 100\uFF1B0 = \u5173\u95ED\uFF09**\u3002\n \u8D85\u8FC7 \u2192 \u6CE8\u5165 [COGNITIVE-TRAJECTORY-ASSISTANT \u00B7 LOGBOOK COMPACTION] \u63D0\u9192\uFF1A\u6682\u505C\u5F53\u524D\u5DE5\u4F5C \u2192\n \u52A0\u8F7D eap\uFF08praxis eap\uFF09\u2192 **\u6309 EAP \u91CD\u6784\u6574\u4E2A SESSION.md**\uFF08v1.84.0 \u8D77\uFF1B\u65E7\u7248\u662F\u56DB\u6761\u91CD\u5199\u539F\u5219\uFF09\u3002\n \u5224\u636E = EAP \u4E09\u4E2A\u53D8\u91CF\uFF1AE\u2191 \u53D8\u91CF/\u8FB9\u754C/\u6709\u5411\u5173\u7CFB\u5168\u663E\u5F0F \uFF5C R\u2193 \u5E26\u7406\u7531\u4E0E\u88AB\u5426\u9879\uFF0C\u957F\u8BC1\u636E\u94FE\u5916\u79FB\u5230\n references/*.md\uFF08SESSION.md \u7559\u94FE\u63A5\uFF09\uFF5C S\u2191 \u7ED3\u6784\u6BCF\u6B21\u540C\u6837\u91CD\u5EFA\uFF0C\u4E0D\u662F\u65F6\u95F4\u6D41\u6C34\u8D26\u3002\n \u4E24\u6761\u786C\u7EA6\u675F\u968F\u63D0\u9192\u7ED9\u51FA\uFF1A\u4FDD\u7559\u56FA\u5B9A\u6BB5\u843D\u7684**\u987A\u5E8F\u4E0E\u6807\u9898**\uFF08\u4E0E\u7CFB\u7EDF\u63D0\u793A\u8BCD\u5BF9\u9F50\uFF09+ \u4FDD\u7559\u9876\u90E8 frontmatter\u3002\n \u8D85\u9650\u540E\u6BCF\u6B21\u5DE5\u5177\u8C03\u7528\u90FD\u63D0\u9192\uFF1B\u8FDE\u7EED 3 \u6B21\u672A\u91CD\u5199 \u2192 \u5347\u7EA7\u5F3A\u5236\u8BED\u6C14\uFF1B\n \u6587\u4EF6\u56DE\u5230\u9650\u5185 \u2192 \u81EA\u52A8\u505C\u6B62\uFF08\u81EA\u6108\uFF09\u3002\u8F68\u8FF9\u63D0\u9192**\u4E0D\u673A\u68B0\u963B\u65AD\u5DE5\u4F5C**\uFF08\u4E0E rebuild \u63D0\u9192\u540C\u65CF\uFF09\u3002\n\n\u2500\u2500 2. localstore.gitTrack \u2500\u2500\nlocalstore.json \u7684 git \u7B56\u7565\uFF1Aallow \u53EF\u63D0\u4EA4 / deny \u7981\u63D0\u4EA4\uFF08\u9ED8\u8BA4 deny\uFF09\u3002\ndeny \u65F6\u5199\u5165\u81EA\u52A8\u786E\u4FDD .gitignore \u542B\u8BE5\u6587\u4EF6\uFF08\u7269\u7406\u4FDD\u8BC1\uFF09\uFF0Ccontainer_git commit \u4F1A\u68C0\u67E5\u62D2\u7EDD\u3002\n\n Config:\n { \"localstore\": { \"gitTrack\": \"allow\" } }\n\n\u2500\u2500 3. hooks.autoRestoreSession \u2500\u2500\n\u4F1A\u8BDD\u81EA\u52A8\u6062\u590D\uFF08\u9ED8\u8BA4 true\uFF1B\u53D7 events \u95E8\u63A7\u2014\u2014\u4EC5\u6839\u4F1A\u8BDD + \u5DF2\u6709\u5BF9\u8BDD\u5386\u53F2\u624D\u6062\u590D\uFF09\u3002\n\n Config:\n { \"hooks\": { \"autoRestoreSession\": false } }\n\n\u2500\u2500 4. safeMode\uFF08\u9ED1\u540D\u5355 \uFF0B \u5F00\u542F\u671F\u95F4\u9690\u85CF\u7684\u5DE5\u5177\uFF09\u2500\u2500\nsafe-mode \u7531 WebUI \u5F00\u5173\u63A7\u5236\uFF08\u5199 .serenity-safe-on \u6807\u8BB0\uFF09\uFF1B\u9ED1\u540D\u5355\u8DEF\u5F84\u53D7 guards seam \u62E6\u622A\u3002\n\n \u25B8 blacklist\uFF1A\u5199\u8DEF\u5F84\u9ED1\u540D\u5355\uFF08\u540C\u4E0B Config\uFF09\u3002\n \u25B8 hiddenTools\uFF08v1.51.4\uFF0Cowner 2026-10-09 \u4EE4\uFF09\uFF1A**\u4EC5\u5728\u5B89\u5168\u6A21\u5F0F\u5F00\u542F\u671F\u95F4**\u989D\u5916\u4ECE\u6A21\u578B\u5DE5\u5177\n \u6E05\u5355\u9690\u85CF\u7684\u5DE5\u5177\uFF08ACC \u57FA\u7840\u8868\u6052\u9690 bash\uFF09\u3002\u6253\u5F00 safe-mode \u751F\u6548\u3001**\u5173\u6389\u5373\u5168\u90E8\u6062\u590D**\uFF1B\n \u6539\u672C\u952E**\u70ED\u751F\u6548**\uFF08\u4E0B\u4E00\u4E2A pre-step \u91CD\u7B97\uFF0C\u65E0\u9700\u91CD\u542F\uFF09\u3002\u58F0\u660E\u5728 CCC\uFF08D23\uFF09\u2014\u2014ACC \u4EE3\u7801\u91CC\n \u4E0D\u51FA\u73B0\u4EFB\u4F55\u5177\u4F53\u5DE5\u5177\u540D\u3002\n \u26A0\uFE0F \u5199\u4E00\u4E2A**\u672C CCC \u672A\u6CE8\u518C**\u7684\u540D\u5B57\u4F1A\u8BA9**\u6574\u6B21 restrict \u5931\u8D25**\uFF08DSH \u5951\u7EA6\u9010\u5B57\uFF1A\"unknown\n names \u2026 fail\"\uFF09\u21D2 \u6B64\u65F6**\u9000\u5316\u4E3A\u53EA\u9690\u85CF\u57FA\u7840\u8868**\u5E76\u5728\u65E5\u5FD7\u54CD\u4EAE\u62A5\u9519\uFF08\u7EDD\u4E0D\u56E0\u4E00\u4E2A\u9519\u540D\u4E22\u6389\n safe-mode \u7684\u6838\u5FC3\u9690\u85CF\uFF09\u3002\u8BCA\u65AD\uFF1A`AGENT_SESSIONS/.restrict-diag.json` \u7684 `denyByKey`\u3002\n \u26A0\uFE0F \u9690\u85CF = **\u4ECE schema \u79FB\u9664**\uFF08agent \u6839\u672C\u770B\u4E0D\u5230\u8BE5\u5DE5\u5177\uFF09\u21D2 \u522B\u628A skill/\u6587\u6863\u8FD8\u5728\u6559\u7684\u5DE5\u5177\u5199\u8FDB\u6765\u3002\n\n Config:\n { \"safeMode\": { \"blacklist\": [\".secrets/\"], \"hiddenTools\": [\"workflow\", \"job_kill\"] } }\n\n\u2500\u2500 5. \u8F68\u8FF9\u7EA6\u675F.roles\uFF08F4 \u8BA4\u77E5\u5B50\u96C6\u89D2\u8272\uFF09\u2500\u2500\n\u8F68\u8FF9\u7EA6\u675F\u89D2\u8272 = \u5168\u77E5\u5168\u80FD cognitive trajectory \u7684\u4EFB\u610F\u5B50\u96C6\uFF08CCC \u5B9A\u4E49\uFF09\u3002\u6BCF\u89D2\u8272\u72EC\u7ACB\u6A21\u578B + \u53CC\u767D\u540D\u5355\n\uFF08MSM \u767D\u540D\u5355 msms[] \u4E0E\u975E MSM \u5DE5\u5177\u767D\u540D\u5355 tools[]\uFF0C\u767D\u540D\u5355\u5916\u5168\u9690\u85CF\uFF1Bskill \u52A0\u8F7D\u6052\u53EF\u7528\uFF09\u3002\ncognitive trajectory \u7EAA\u5F8B\u5B50\u96C6\uFF08session/keeper/rebuild \u53C2\u4E0E\u9879\uFF09\u9ED8\u8BA4\u5168\u5173 = \u5B8C\u5168\u72EC\u7ACB\u3002\nsystemPrompt \u5185\u8054 \u6216 systemPromptFile\uFF08.md \u5F15\u7528\uFF0C\u63A8\u8350\uFF09\u2014\u2014\u89D2\u8272\u4F1A\u8BDD\u7684\u5B8C\u6574\u4EBA\u683C/\u8FB9\u754C\u63D0\u793A\u8BCD\u3002\nvalidate \u6821\u9A8C / apply \u751F\u6548 / list \u67E5\u770B\uFF1Acontainer_admin config <guide|validate|apply|list>\uFF08\u539F role \u57DF\u5DF2\u5E76\u5165 config\uFF0C\u65E7\u540D\u4F5C\u8FC7\u6E21\u522B\u540D\u4ECD\u53EF\u7528\uFF09\u3002\n\n Config:\n { \"\u8F68\u8FF9\u7EA6\u675F\": { \"roles\": {\n \"qa\": {\n \"model\": \"provider/model\",\n \"msms\": [\"web-search\", \"vlm-describe\"],\n \"tools\": [\"read\", \"grep\", \"glob\"],\n \"systemPromptFile\": \".opencode/skiff/qa.md\"\n } } } }\n\n\u2500\u2500 6. cognitive_trajectory\uFF08\u8F68\u8FF9 + \u5524\u9192\u6CE8\u518C\u8868\uFF0CD58\uFF09\u2500\u2500\nCCC \u7684\u4E00\u6761 cognitive trajectory = \u6301\u4E45\u8EAB\u4F53\uFF08SESSION.md\uFF09+ \u65F6\u95F4\u8F74\uFF08AGENT_SESSIONS/ \u76EE\u5F55 + \u5524\u9192\u6CE8\u518C\u8868\uFF09\u3002\n\u4E00\u4E2A CCC \u5185\u53EF\u591A\u6761\u5E76\u884C\uFF1B\u6761\u76EE\u5168\u90E8\u7531\u4EBA\u7C7B/agent \u663E\u5F0F\u767B\u8BB0\u3002\n\u26A0\uFE0F ACC \u4E0D\u518D\u63D0\u4F9B**\u5468\u671F\u81EA\u5524\u9192**\uFF08\u539F autopilot\uFF0C2026-09-15 \u6574\u6BB5\u9000\u573A\uFF1A\u673A\u5236/\u65F6\u949F/container_admin autopilot\n\u57DF/\u9762\u677F\u533A\u5757\u4E00\u5E76\u5220\u9664\uFF09\u3002\u81EA\u4E3B\u5DE1\u822A\u6539\u7531 CCC \u81EA\u5DF1\u9A71\u52A8\uFF08home-serenity \u4FA7 msm autopilot-round \u6BCF\u8F6E\u81EA\u6392\u4E0B\u4E00\u8F6E\uFF0C\n\u771F\u76F8\u6E90 = S151 SESSION.md \u00A71/\u00A71b/\u00A71c\uFF09\u3002**\u672C\u8F6E\u7684 cognitiveTrajectory.autopilot \u914D\u7F6E\u6BB5\u4FDD\u7559**\uFF08\u89C1\u4E0B\u8868\uFF09\u2014\u2014\n\u5B83\u73B0\u7531 **CCC \u4FA7\u811A\u672C**\u8BFB\u53D6\uFF0CACC \u4E0D\u518D\u6D88\u8D39\u8BE5\u6BB5\u3002\n\u5524\u9192\u6CE8\u518C\u8868\uFF08cognitive_trajectory send-later\uFF09\uFF1A\u5524\u9192 = \u672A\u6765\u65F6\u523B + \u4E00\u6761 message\uFF0C\u53EF\u5524\u9192\u81EA\u5DF1\u6216\u522B\u7684 cognitive trajectory\uFF1B\n\u843D\u70B9 AGENT_SESSIONS/wake-registry.json\uFF0C\u4E2D\u5FC3\u8C03\u5EA6\u5668\u5230\u70B9\u6295\u9012\uFF08fire-and-forget\uFF1B\u65E0\u56DE\u6267\u3001\u65E0\u56DE\u6536\uFF09\u3002\n\u8FD0\u884C\u6001\u8BCA\u65AD\uFF08ACC \u8D1F\u8D23\u4EBA\u4E13\u7528\uFF09\uFF1Aacc-diag\uFF08\u2460 live \u8FD0\u884C\u6001 / \u2460b \u5524\u9192\u65F6\u949F / \u2462 \u5524\u9192\u6CE8\u518C\u8868\uFF09\u3002\n\n\u25B8 cognitiveTrajectory.skills\uFF08v1.44.0\uFF0C**CCC \u7EA7 skill \u4F9B\u7ED9**\uFF1Bowner \u4EE4 2026-09-20\u300C\u8981\u6C42\u5B9E\u73B0\u6211\u7684\u8BC9\u6C42\u2026\u2026\n \u6CE8\u5165\u662F\u52A8\u6001\u6CE8\u5165\u5C31\u884C\uFF1Bcreate \u5148\u4E0D\u89E6\u53D1\u5427\uFF1B**\u8F68\u8FF9\u7EA6\u675F\u4E5F\u652F\u6301**\u300D\uFF09\uFF1A\n **\u672C CCC \u7684\u6BCF\u6761\u8F68\u8FF9\u90FD\u5E26\u8FD9\u4E9B skill**\u2014\u2014\u58F0\u660E\u7684 skill \u5168\u6587\u5728\u8BE5\u8F68\u8FF9**\u88AB\u7ED1\u5B9A\u671F\u95F4**\u6CE8\u5165\u7CFB\u7EDF\u63D0\u793A\u8BCD\n \uFF08**\u52A8\u6001\u6CE8\u5165**\uFF1A\u6BCF\u8BF7\u6C42\u91CD\u65B0\u6C42\u503C\u3001\u4E0D\u7F13\u5B58 \u21D2 \u6539\u914D\u7F6E\u6216\u6539 frontmatter **\u5373\u65F6\u751F\u6548**\uFF0C\u65E0\u9700\u91CD\u65B0 use\u3001\u65E0\u9700\u91CD\u542F\uFF09\u3002\n \u4E24\u6761\u58F0\u660E\u6765\u6E90**\u5E76\u96C6**\uFF08\u4E0D\u662F\u4E8C\u9009\u4E00\uFF09\uFF1A\u672C\u952E **cognitiveTrajectory.skills**\uFF08\u5BB9\u5668\u7ED9\u7684\u5E95\u5EA7\uFF0C**\u5728\u524D**\uFF09\n \uFF0B \u8F68\u8FF9\u81EA\u5DF1 SESSION.md \u9876\u90E8 frontmatter \u7684 skills:\uFF08\u8FD9\u6761\u8F68\u8FF9\u989D\u5916\u7684\uFF0C**\u8FFD\u52A0**\uFF1B\u540C\u540D\u53BB\u91CD\uFF09\u3002\n \u2705 **\u542B \u8F68\u8FF9\u7EA6\u675F\u89D2\u8272\u4F1A\u8BDD**\uFF08\u65C1\u8DEF\u7684\u662F ACC \u8EAB\u4EFD\u4E0E\u7EAA\u5F8B\uFF1Bskill \u662F\"\u5DE5\u4F5C\u8D44\u6599\"\uFF0C\u7167\u7ED9\uFF09\u3002\n \u5B88\u536B\uFF1A\u540D\u5B57\u5148\u8FC7\u5B89\u5168\u6821\u9A8C\u624D\u7528\u4E8E\u62FC\u8DEF\u5F84\uFF08\u9632\u7A7F\u8D8A\uFF09\uFF5C**\u5408\u5E76\u540E**\u7EDF\u4E00 32 KB \u4E0A\u9650\u622A\u65AD\uFF5C\u627E\u4E0D\u5230\u54CD\u4EAE\u5199 [\u7F3A\u5931]\u3002\n \u26A0\uFE0F \u4E0E create **\u65E0\u5173**\uFF08create \u523B\u610F\u4E0D\u593A\u7ED1\u5B9A\uFF0CU6\uFF09\u21D2 \u6CE8\u5165\u7684\u95E8\u662F\"**\u5B58\u5728\u7ED1\u5B9A**\"\uFF08cognitive_trajectory use\uFF09\u3002\n \u5931\u8D25\u8BED\u4E49\uFF1A\u672A\u914D\u7F6E / \u5B57\u6BB5\u7F3A\u5931 / \u914D\u7F6E\u635F\u574F \u21D2 **\u7A7A\u6570\u7EC4**\uFF08= \u65E0 CCC \u7EA7\u4F9B\u7ED9\uFF1B\u8F68\u8FF9\u7EA7\u58F0\u660E\u7167\u65E7\u751F\u6548\uFF09\u3002\n \u5F52\u5C5E\uFF08D23\uFF09\uFF1A**\u673A\u5236\u5728 ACC**\uFF08\u8BFB\u53D6 + \u5408\u5E76 + \u6CE8\u5165 + \u5B88\u536B\uFF09\uFF0C**\u58F0\u660E\u5728 CCC**\uFF08\u672C\u952E\uFF09\u3002\n\n Config:\n { \"cognitiveTrajectory\": {\n \"skills\": [\"acc-session\", \"cce\"], // v1.44.0\uFF1A\u672C CCC \u7684\u6BCF\u6761\u8F68\u8FF9\u90FD\u5E26\uFF08\u542B \u8F68\u8FF9\u7EA6\u675F\u4F1A\u8BDD\uFF09\n \"autopilot\": { // \u539F autopilotTrajectory \u6BB5\uFF0C\u5B57\u6BB5\u4E0D\u53D8\uFF08\u65E7\u952E\u4ECD\u56DE\u9000\u8BFB\uFF09\n \"enabled\": true,\n \"intervalHours\": 2,\n \"session\": \"S151\",\n \"biasProvider\": \"autopilot-bias.ts\",\n \"topPrompt\": \"\u672C\u8F68\u8FF9\u6838\u5FC3\u76EE\u6807/\u7EAA\u5F8B/\u8D28\u91CF\u8981\u6C42\uFF08CCC \u81EA\u586B\uFF0C\u9632\u6F02\u79FB\uFF09\",\n \"avoidWakeHours\": { \"start\": 8, \"end\": 18 }\n } } }\n\n\u2500\u2500 7. weixin\uFF08\u5FAE\u4FE1\u6865 F4c-3\uFF0C\u542B\u6D88\u606F\u8BB0\u5F55 hook\uFF09\u2500\u2500\nCCC \u7EA7\u5FAE\u4FE1\u4E2A\u4EBA\u53F7\u63A5\u5165\uFF08iLink \u534F\u8BAE\uFF09\uFF1Adsh \u4E00\u8FDB\u7A0B\u591A CCC\uFF0C\u6BCF CCC \u72EC\u7ACB\u5BF9\u63A5\u5FAE\u4FE1\u6865\u3002\n\u8D26\u53F7/\u8DEF\u7531/\u5F00\u5173\u5728\u6B64\u6587\u4EF6\uFF1B**bot_token \u51ED\u636E\u5728 CCC localstore credential scope**\n\uFF08\u626B\u7801\u7ED1\u5B9A\u540E\u81EA\u52A8\u5199\u5165\uFF0C\u6C38\u4E0D\u8FDB git \u660E\u6587\u9762\uFF09\u3002\n\u8DEF\u7531 user \u2192 role\uFF1Aexact \u4F18\u5148\uFF0C* \u901A\u914D\u515C\u5E95\uFF1Brole \u5FC5\u987B \u2208 \u8BE5 CCC \u8F68\u8FF9\u7EA6\u675F.roles\u3002\n\u9762\u677F\uFF08WebUI \u8BBE\u7F6E \u2192 \u5FAE\u4FE1\u6865\uFF09\u53EF\u626B\u7801\u7ED1\u5B9A/\u79FB\u9664\u8D26\u53F7/\u7F16\u8F91\u8DEF\u7531\uFF1Bmsm(\"weixin-doctor\", [\"status\"|\"diag\"|\"verify\"|\"guide\"]) \u6392\u67E5 + \u5927\u800C\u5168\u6307\u5357\u3002\u51ED\u636E\u4E3B\u52A8\u67E5\u770B\uFF1Alocalstore get WEIXIN_<ACCOUNT>_TOKEN\u3002\n \u25B8 \u4E3B\u52A8\u53D1\u9001\uFF08v1.31.0\uFF1A**ACC \u5DE5\u5177 im-bridge**\uFF09\uFF1A\u8C03\n im-bridge({channel:\"weixin\", action:\"send\", user:\"<\u522B\u540D|id>\", text:\"<\u6587\u672C>\"}) \u7ED9\u7528\u6237\u53D1\u6D88\u606F\u2014\u2014\n **\u5DE5\u5177\u53EA\u80FD\u64CD\u4F5C\u672C\u4F1A\u8BDD CCC**\uFF08\u65E0 ccc \u53C2\u6570\uFF0C\u9632\u8BEF\u53D1\u4ED6\u5BB9\u5668\uFF09\u2192 weixin-bridge.sendProactiveText \u2192\n \u6210\u529F\u540E\u89E6\u53D1 outgoing hook\uFF08source=\"proactive\"\uFF09\u3002\u6587\u4EF6\u7528 action:\"send-file\" + file:\"<CCC \u5185\u8DEF\u5F84>\"\n \uFF08\u9003\u9038/\u7F3A\u5931/\u8D85 20MB \u62D2\u7EDD\uFF09+ \u53EF\u9009 caption\u3002**\u53EF\u89C1\u6027**\uFF1A\u672C CCC \u914D\u7F6E\u4E86 IM \u901A\u9053\n \uFF08weixin.enabled=true\uFF09\u624D\u51FA\u73B0\u5728\u6A21\u578B\u5DE5\u5177\u6E05\u5355\u91CC\uFF1B\u672A\u914D\u7F6E \u2192 \u7531 guards \u9010 agent\n tools.restrict({deny:['im-bridge']}) \u79FB\u9664\uFF08\u4E0D\u662F\"\u770B\u5F97\u5230\u4F46\u88AB\u62D2\"\uFF09\u3002\u8F68\u8FF9\u7EA6\u675F\u89D2\u8272\u53E6\u9700\u5728\n roles.<role>.tools \u767D\u540D\u5355\u5217\u51FA im-bridge\u3002\n \u5386\u53F2\uFF08v1.30.9~v1.30.x\uFF09\uFF1ACCC \u4FA7 MSM weixin-send\uFF08\u8D70 loopback HTTP \u5165\u53E3 3082\uFF09\u2014\u2014\n v1.31.0 \u5DF2\u9000\u5F79\uFF08\u811A\u672C\u5220\u9664 + \u6CE8\u518C\u8868\u6CE8\u9500\uFF09\uFF1B3082 \u5165\u53E3\u4FDD\u7559\u7ED9**\u975E agent \u8C03\u7528\u8005**\u3002\n\n \u25B8 \uD83D\uDD34\uD83D\uDD34 **\u51FA\u7AD9\u53EA\u6709\u4E00\u6761\u8DEF\uFF1Aagent \u81EA\u5DF1\u8C03 im-bridge**\uFF082026-10-24 \u8D77\uFF0Cowner \u4EE4\uFF09\u3002\n \u6865**\u6C38\u4E0D**\u66FF\u4F60\u56DE\u53D1\u6700\u7EC8\u6587\u672C \u2014\u2014 \u4F60\u8BF4\u4EC0\u4E48\u3001\u8BF4\u51E0\u6761\u3001\u4EC0\u4E48\u65F6\u5019\u8BF4\u3001\u8981\u4E0D\u8981\u4E0D\u8BF4\uFF0C\u5168\u7531\u4F60\u51B3\u5B9A\u3002\n \u26D4 \u4E0D\u8981\u6307\u671B\"\u6211\u628A\u8BDD\u5199\u8FDB\u56DE\u7B54\u91CC\u5C31\u4F1A\u81EA\u52A8\u53D1\u51FA\u53BB\"\uFF1A**\u4E0D\u4F1A**\u3002\u5FC5\u987B\u771F\u7684\u8C03\u5DE5\u5177\u3002\n \u21D2 \u6BCF\u8F6E\u7528\u6237\u6D88\u606F\u672B\u5C3E\u90FD\u4F1A\u9644\u4E00\u884C**\u5DF2\u586B\u597D\u53C2\u6570**\u7684 im-bridge \u8C03\u7528\u6A21\u677F\uFF08\u673A\u5236\u6807\u8BB0\n [serenity:weixin-manual-output]\uFF09\uFF0C\u7167\u5B83\u6539 text \u5373\u53EF\u3002\n \u21D2 \u672C\u8F6E\u7ED3\u675F\u4ECD\u672A\u6210\u529F\u8C03\u7528\uFF08send / send-file\uFF09\u2192 \u4F60\u4F1A\u88AB\u6253\u56DE\uFF08\u22642 \u6B21\uFF0C\u63D0\u793A = \u6807\u8BB0 + \u4E8B\u5B9E\uFF09\uFF1B\n \u8FBE\u4E0A\u9650\u540E**\u7528\u6237\u5C06\u6536\u4E0D\u5230\u4EFB\u4F55\u6D88\u606F**\uFF08\u6CA1\u6709\u4EFB\u4F55\u515C\u5E95\u8F6C\u53D1\uFF09\u3002\n \u21D2 \u6210\u529F\u8C03\u7528\u624D\u7B97\u9001\u8FBE\uFF1B\u5931\u8D25\u8C03\u7528\u4E0D\u7B97\uFF08\u4E0D\u4F1A\u88AB\u5F53\u6210\u672C\u8F6E\u5DF2\u53D1\u9001\uFF09\u3002\n \u26A0\uFE0F **\u524D\u63D0**\uFF1A\u672C\u8F68\u8FF9\u5FC5\u987B\u5728 `.opencode/serenity.json` \u7684 `im.routes` \u91CC\u88AB\u70B9\u540D\uFF0C\u5426\u5219 `im-bridge`\n \u5BF9\u4F60\u4E0D**\u53EF\u89C1**\u2014\u2014\u90A3\u79CD\u60C5\u51B5\u4E0B\u95F8\u95E8\u4E0D\u4F1A\u6253\u56DE\u4F60\uFF08\u6539\u6210\u4E00\u6761\u54CD\u4EAE\u544A\u8B66\uFF0C\u6307\u660E\"\u8BE5\u8F68\u8FF9\u65E0\u53D1\u9001\u6743\"\uFF09\uFF0C\n \u56E0\u4E3A\u6253\u56DE\u4E00\u4E2A\u4F60\u6839\u672C\u6EE1\u8DB3\u4E0D\u4E86\u7684\u8981\u6C42\u53EA\u4F1A\u7A7A\u8F6C\u3002\n\n \u25B8 **\u5DF2\u9000\u5F79\uFF08\u4E0D\u8981\u518D\u914D\uFF0C\u914D\u4E86\u4E5F\u4E0D\u751F\u6548\uFF09**\uFF1A\n \u00B7 `weixin.autoReplyWithLastMessage`\uFF08v1.30.10~2026-10-24\uFF09= \u6865\u66FF agent \u56DE\u53D1\u6700\u7EC8\u6587\u672C\u3002\n **\u88AB\u5426\u7406\u7531**\uFF08owner \u539F\u8BDD\uFF09\uFF1A\u300CautoReply \u5E76\u4E0D\u5408\u9002\uFF0C\u4E3B\u52A8\u6027\u7684 imBridge \u4ECD\u7136\u662F\u66F4\u597D\u7684\u300D\u2014\u2014\n \u5B83\u8BA9 agent \u5931\u53BB\"\u8BF4\u51E0\u6761/\u4F55\u65F6\u8BF4/\u8981\u4E0D\u8981\u4E0D\u8BF4\"\u7684\u51B3\u5B9A\u6743\uFF0C\u800C\u90A3\u6B63\u662F\u4E3B\u52A8\u53D1\u9001\u7684\u4EF7\u503C\u3002\n \u00B7 `weixin.fallbackOnNoSend`\uFF08v1.30.17~2026-10-24\uFF09= \u624B\u52A8\u6A21\u5F0F\u4E0B agent \u6CA1\u53D1\u6210\u529F\u65F6\u6865\u515C\u5E95\u8F6C\u53D1\u3002\n \u5B83\u53EA\u5728\u4E0A\u9762\u90A3\u4E2A\u5F00\u5173 =false \u65F6\u624D\u6709\u610F\u4E49 \u21D2 \u4E00\u8D77\u9000\u5F79\u3002\n \u26A0\uFE0F \u65E7\u914D\u7F6E\u91CC\u6B8B\u7559\u8FD9\u4E24\u4E2A\u952E**\u9759\u9ED8\u5FFD\u7565**\uFF08\u4E0D\u4F1A\u62A5\u9519\uFF0C\u4E5F\u4E0D\u4F1A\u751F\u6548\uFF09\u3002\n\n Config:\n { \"weixin\": {\n \"enabled\": true,\n \"hook\": \"scripts/weixin-message-hook.ts\",\n \"accounts\": [{ \"accountId\": \"wechat-1\", \"name\": \"\u5BB6\u5EAD\u52A9\u624B\", \"enabled\": true }],\n \"routes\": [{ \"user\": \"*\", \"role\": \"my-role\" }]\n } }\n\n \u25B8 weixin.hook\uFF08\u6D88\u606F\u8BB0\u5F55 hook\uFF0Cv1.27.13\uFF09\uFF1A\n \u5FAE\u4FE1\u6865\u6BCF\u6536/\u53D1\u4E00\u6761\u6D88\u606F\u89E6\u53D1\u4E00\u6B21 CCC \u81EA\u5199\u811A\u672C\uFF0C\u7531 CCC \u81EA\u884C\u6301\u4E45\u5316\u4FDD\u5B58\uFF08\u5B58\u54EA/\u5B58\u6210\u4EC0\u4E48\n /\u662F\u5426\u5165\u5E93\u5168\u5F52 CCC\u2014\u2014ACC \u4E0D\u7ED1\u5B9A\u5B58\u50A8\uFF09\u3002\u672A\u914D\u7F6E hook \u2192 \u96F6\u53D8\u5316\uFF08\u4E0D\u89E6\u53D1\uFF09\u3002\n\n \u89E6\u53D1\uFF08\u53CC\u5411\uFF09\uFF1A\n incoming = \u7528\u6237 \u2192 bot\uFF1A\u8DEF\u7531\u547D\u4E2D\u540E\u3001\u5A92\u4F53\u843D\u76D8\u540E\u89E6\u53D1\uFF08\u6587\u672C\u542B\u8BED\u97F3\u8F6C\u5199\uFF1B\u5A92\u4F53\u5E26\u843D\u76D8 relPath\uFF09\n outgoing = bot \u2192 \u7528\u6237\uFF1A\u53D1\u9001\u6210\u529F\u540E\u89E6\u53D1\uFF08reply = \u7528\u6237\u5B9E\u9645\u6536\u5230\u7684\u7EAF\u6587\u672C\uFF0C\u5DF2\u5265\u79BB think\uFF09\n \u00B7 source=\"proactive\" = agent \u7ECF im-bridge \u4E3B\u52A8\u53D1\u8D77\uFF08**2026-10-24 \u8D77\u8FD9\u662F\u552F\u4E00\u503C**\uFF09\n \u00B7 \u5386\u53F2\u503C reply / reply-fallback\uFF08\u6865\u81EA\u52A8\u56DE\u53D1 / \u6865\u515C\u5E95\u8F6C\u53D1\uFF09\u5DF2\u968F\u4E24\u4E2A\u5F00\u5173\u4E00\u8D77\u9000\u5F79\uFF1B\n \u5B58\u91CF\u65E5\u5FD7\u91CC\u4ECD\u80FD\u770B\u5230\u5B83\u4EEC\uFF0C\u90A3\u662F\u5386\u53F2\u4E8B\u5B9E\uFF0C\u4E0D\u662F\u5F53\u524D\u884C\u4E3A\n \u00B7 file\uFF08\u4EC5 send-file \u8865\u8BB0\uFF09\uFF1A{ \"name\": \"\u62A5\u544A.pdf\", \"size\": 12345, \"caption\": \"\u53EF\u9009\" }\n\n \u811A\u672C\u7EA6\u5B9A\uFF08\u4E8B\u4EF6 JSON \u5355\u884C\u7ECF stdin \u4F20\u5165\uFF1Bbun \u4F18\u5148 node \u515C\u5E95\uFF09\uFF1A\n #!/usr/bin/env bun \u6216 node script.js \u2014\u2014 \u8BFB process.stdin \u6574\u6BB5 JSON.parse\n const ev = JSON.parse(await new Response(process.stdin).text())\n ev.event === 'incoming' | 'outgoing'\n\n \u4E8B\u4EF6 schema\uFF08**\u4E0D\u542B\u4EFB\u4F55\u4F1A\u8BDD\u51ED\u636E**\u2014\u2014context_token/bot_token/token/aes_key \u5747\u4E0D\u51FA\u73B0\uFF09\uFF1A\n { \"event\": \"incoming\", \"ts\": 1788359941488, \"cccRoot\": \"/path/ccc\",\n \"accountId\": \"wechat-1\", \"userId\": \"u1@im.wechat\",\n \"sessionId\": \"skiff-weixin-xxx\", \"role\": \"my-role\",\n \"message\": { \"text\": \"\u4F60\u597D\", \"media\": [{ \"kind\": \"image\", \"relPath\": \"_tmp/weixin-inbound/<hash>/img_x.jpg\" }] } }\n { \"event\": \"outgoing\", \"ts\": ..., \"cccRoot\": ..., \"accountId\": ...,\n \"userId\": ..., \"sessionId\": ..., \"role\": ...,\n \"reply\": \"\u5DF2\u8BB0\u5F55\uFF08\u7EAF\u6587\u672C\uFF09\", \"source\": \"proactive\" }\n\n \u793A\u4F8B\u811A\u672C\uFF08\u8FFD\u52A0\u5230\u6309\u65E5\u6587\u4EF6\u2014\u2014\u6301\u4E45\u5316\u5F52 CCC \u81EA\u9009\uFF1A\u6587\u4EF6/DB/\u8FDC\u7AEF\u5747\u53EF\uFF09\uFF1A\n const fs = require('node:fs'); const p = '/path/ccc/AGENT_SESSIONS/_weixin-log.jsonl';\n fs.appendFileSync(p, JSON.stringify(ev) + '\\n');\n\n \u6267\u884C\u8BED\u4E49\uFF08\u65C1\u8DEF\u5BB9\u5FCD\uFF09\uFF1A\u5F02\u6B65 fire-and-forget + 15s \u8D85\u65F6 kill + \u5931\u8D25\u4EC5\u65E5\u5FD7\u2014\u2014\n \u5FAE\u4FE1\u6865\u6D88\u606F\u5904\u7406/\u56DE\u590D\u4E0D\u53D7 hook \u5F71\u54CD\uFF1B\u811A\u672C\u987B\u5728 CCC \u6839\u5185\uFF08\u8DEF\u5F84\u9003\u9038\u62D2\u7EDD\uFF09\u3002\n \u5A92\u4F53 relPath \u6307\u5411 _tmp/weixin-inbound/\uFF08\u4E34\u65F6\u76EE\u5F55\uFF09\u2014\u2014\u9700\u6301\u4E45\u4FDD\u5B58\u5A92\u4F53\u6587\u4EF6\u8BF7\u81EA\u884C copy\u3002\n\n\u2500\u2500 8. \uFF08\u5DF2\u5220\u9664\uFF09exclusiveTools\uFF08\u4E13\u5C5E\u5DE5\u5177\u58F0\u660E\uFF0Cv1.33 \u2192 v1.106.0 \u5220\u9664\uFF09\u2500\u2500\n\uD83D\uDD34 **\u672C\u952E\u5DF2\u4E0D\u5B58\u5728**\uFF08owner 2026-11-01 \u88C1\u300C\u673A\u5236\u6574\u4F53\u5220\u300D\uFF09\u3002\n\u539F\u8BED\u4E49\uFF1AACC \u6CE8\u518C\u4F46\u9ED8\u8BA4\u5BF9\u6240\u6709 CCC \u9690\u85CF\u7684\u5DE5\u5177\uFF0C\u53EA\u6709\u5728 CCC \u914D\u7F6E\u91CC\u70B9\u540D\u624D\u53EF\u89C1\uFF08fail-closed\uFF09\u3002\n**\u5220\u9664\u7406\u7531**\uFF1A\u90A3\u5F20\u8868\u6C38\u8FDC\u53EA\u6709\u4E00\u4E2A\u6210\u5458 acc-diag\uFF0C\u800C\u5B83\u5DF2\u5E76\u5165**\u5E38\u9A7B**\u7684 dashboard \u7684 diag \u52A8\u4F5C\u3002\n\u8868\u7A7A\u4E4B\u540E\u90A3\u4E2A filter \u6052\u56DE\u7A7A\u6570\u7EC4 \u21D2 \u673A\u5236**\u9759\u9ED8\u7A7A\u8F6C\u3001\u4E14\u4EFB\u4F55\u6D4B\u8BD5\u90FD\u8BC1\u4F2A\u4E0D\u4E86\u5B83**\n\uFF08\u4E00\u4E2A\u9A8C\u4E0D\u51FA\u6B7B\u6D3B\u7684\u673A\u5236\u6BD4\u6CA1\u6709\u5B83\u66F4\u574F\uFF1A\u5B83\u63D0\u4F9B\"\u8FD9\u91CC\u8FD8\u6709\u4E00\u5C42\u4FDD\u62A4\"\u7684\u9519\u89C9\uFF09\u3002\n\n \u25B8 \u8981\u8FD0\u884C\u6001\u8BCA\u65AD \u21D2 \u76F4\u63A5\u7528 dashboard \u7684 diag \u52A8\u4F5C\uFF08**\u65E0\u9700\u4EFB\u4F55\u58F0\u660E\uFF0C\u6240\u6709\u8F68\u8FF9\u53EF\u89C1**\uFF09\u3002\n \u25B8 \u65E7\u914D\u7F6E\u91CC\u6B8B\u7559 exclusiveTools \u21D2 **\u9759\u9ED8\u5FFD\u7565**\uFF08schemastery \u975E strict\uFF09\uFF0C\u4E0D\u5F71\u54CD\u52A0\u8F7D\u3002\n \u25B8 \u26A0\uFE0F \u8FDE\u5E26\u540E\u679C\uFF08owner \u5DF2\u77E5\u5E76\u786E\u8BA4\uFF09\uFF1Adashboard \u662F\u5E38\u9A7B\u5DE5\u5177 \u21D2 diag \u6BB5\u5BF9**\u6240\u6709\u8F68\u8FF9**\u53EF\u89C1\uFF0C\n \u800C\u5B83\u7684 live \u4F1A\u8BDD\u6E05\u5355\u662F**\u5168\u90E8 CCC** \u7684\uFF08\u8DE8\u5BB9\u5668\uFF09\u3002\u8FD9\u662F\u300C\u65B9\u6848 C\u300D\u7684\u65E2\u5B9A\u4EE3\u4EF7\uFF0C\u4E0D\u662F\u7F3A\u9677\u3002\n\n\u2500\u2500 9. userQuotes.enabled\uFF08\u7528\u6237\u8BED\u5F55\u53F0\u8D26\uFF0Cv1.113.0\uFF09\u2500\u2500\n**\u628A\u7528\u6237\u76F4\u63A5\u8BF4\u7684\u8BDD\u6309\u5929\u3001\u6309\u8F68\u8FF9\u5B58\u4E0B\u6765**\uFF0C\u4F9B\u4E4B\u540E\u53CD\u5411\u5206\u6790\u7528\u6237\u3002owner \u539F\u8BDD\uFF1A\n\u300C\u6211\u9700\u8981\u4E00\u4E2A\u53EF\u5F00\u542F\u5173\u95ED\u7684\u529F\u80FD\uFF0C\u5C31\u662F\u8BB0\u5F55\u7528\u6237\u76F4\u63A5\u5BF9\u8C01\u8BF4\u8FC7\u4EC0\u4E48\uFF0C\u5BF9\u8C01\u662F\u6307\u5BF9\u5177\u4F53\u7684\u67D0\u4E2A\u8F68\u8FF9\u2026\u2026\n\u8FD9\u4E2A\u529F\u80FD\u5982\u679C\u5F00\u542F\uFF0C\u5219\u9ED8\u8BA4\u5199\u5230\u4E00\u4E2A\u6307\u5B9A\u76EE\u5F55\u5185\uFF0C\u6309\u5929\u8FDB\u884C\u8BB0\u5F55\u3002\u8FD9\u4E2A\u529F\u80FD\u662F\u7528\u4E8E\u5177\u4F53\u7684\u5B81\u9759\u53F7CCC\u53CD\u5411\u6765\u5206\u6790\u7528\u6237\u7684\u300D\u3002\n\n Config:\n { \"userQuotes\": { \"enabled\": true } }\n\n \u9ED8\u8BA4\uFF1A**\u5173**\u3002\uD83D\uDD34 \u5224\u636E\u662F `enabled === true`\uFF0C\u26D4 \u4E0D\u662F\"\u952E\u5B58\u5728\"\u2014\u2014\n \u5199\u6210 \"true\" / 1 / \u53EA\u5199 userQuotes: {} \u4E00\u5F8B\u5F53**\u5173**\u3002\u7406\u7531\uFF1A\u8FD9\u662F\u628A\u7528\u6237\u539F\u8BDD\u539F\u6587**\u957F\u671F\u7559\u5B58**\uFF0C\n \u542B\u7CCA\u7684\u914D\u7F6E\u5FC5\u987B\u843D\u5230\"\u4E0D\u5199\"\u90A3\u4E00\u4FA7\uFF08fail-closed\uFF1B\u4E0E\u8BA2\u9605\u8868\u7684 fail-open \u65B9\u5411\u76F8\u53CD\uFF0C\n \u56E0\u4E3A\u8FD9\u91CC\u7684\u5371\u9669\u65B9\u5411\u662F**\u591A\u5199**\uFF09\u3002\n\n \u843D\u70B9\uFF1A`AGENT_SESSIONS/_user-quotes/<YYYY-MM-DD>.jsonl`\uFF08\u6309\u5929\uFF0C\u4E00\u884C\u4E00\u6761\uFF09\uFF1A\n {\"ts\":\"\u2026+08:00\",\"trajectory\":\"<\u8F68\u8FF9\u76EE\u5F55\u540D \u6216 null>\",\"sessionId\":\"\u2026\",\"messageId\":\"\u2026\",\"text\":\"\uFF08\u539F\u8BDD\uFF0C\u4E00\u5B57\u4E0D\u6539\uFF09\",\"chars\":88}\n\n \u25B8 **\u91C7\u96C6\u70B9** = `agent/pre-step` \u7684 `payload.messages`\uFF08\u672C step \u4ECE inbox \u53D6\u51FA\u3001\u5373\u5C06\u8FDB\u672C\u6B65\u7684\u6D88\u606F\uFF09\u3002\n \u25B8 **\u5224\u522B\u9762 = `source.kind === 'user'`**\uFF08\u7ED3\u6784\u6027\uFF0C\u26D4 \u4E0D\u9760\u63AA\u8F9E\u9ED1\u540D\u5355\uFF09\u3002\n \u25B8 **\"\u5BF9\u8C01\" = \u6309\u8F68\u8FF9**\uFF08Q1\uFF09\uFF0C\u53D6\u7ED1\u5B9A\u771F\u76F8\u6E90\uFF08`current.dsh_session_bind`\uFF09\uFF1B\u672A\u7ED1\u5B9A \u21D2 `null` \u4F46**\u7167\u5E38\u8BB0**\u3002\n \u25B8 **\u5168\u6587**\uFF08Q3\uFF09\uFF1A\u4E00\u5B57\u4E0D\u6539\uFF0C\u4E0D\u505A\u6458\u8981\uFF1B`chars` \u662F**\u7801\u70B9\u6570**\u4E0D\u662F UTF-16 \u5355\u5143\u6570\u3002\n \u25B8 \u4E24\u4E2A**\u5192\u5145 `kind:'user'`** \u7684\u751F\u4EA7\u8005\uFF08\u8F7D\u4F53\u5F00\u573A\u767D\uFF0Frebuild \u951A\u70B9\uFF09\u6309\u5404\u81EA\u6807\u8BB0\u6392\u9664\u3002\n \u25B8 IM \u5165\u7AD9\uFF08\u5FAE\u4FE1/\u98DE\u4E66\uFF09**\u4E0D\u4F1A\u6DF7\u8FDB\u6765**\uFF1A\u5B83\u8D70 `deliverToTrajectory`\uFF0Ckind \u662F\n `plugin:dsh-serenity-hooks`\uFF08\u5DF2\u53D6\u8BC1\uFF0C\u975E\u63A8\u6F14\uFF09\u3002\u21D2 \u53F0\u8D26 = **\u754C\u9762\u76F4\u8BDD**\u3002\n \u25B8 \u91C7\u96C6\u5931\u8D25\u53EA warn\u3001**\u4E0D\u963B\u65AD step**\uFF08\u53F0\u8D26\u662F\u65C1\u8DEF\u89C2\u6D4B\uFF0C\u4E0D\u662F\u88AB\u89C2\u6D4B\u5BF9\u8C61\u7684\u7EC4\u6210\u90E8\u5206\uFF09\u3002\n \u5224\u636E\u5168\u6587\uFF08\u542B\u53D6\u8BC1\u4E0E\u53D8\u5F02\u68C0\u9A8C\u8BBE\u8BA1\uFF09\u21D2 `src/trajectory/user-quotes.ts` \u5934\u6CE8\u91CA\u3002\n";
|
|
28
|
+
export declare const CCC_CONFIG_REFERENCE = "\u2550\u2550\u2550 CCC Configuration Reference \u2550\u2550\u2550\n\nCCC-level features are configured in .opencode/serenity.json.\nBelow are all available configuration sections.\n\n\u2500\u2500 1. sessionKeeper.threshold / sessionKeeper.sessionMdMaxKB \u2500\u2500\ncognitive-trajectory-assistant\uFF08COGNITIVE-TRAJECTORY-ASSISTANT \u00B7 CHECKPOINT\uFF09\u63D0\u9192\u673A\u5236\u7684\u79EF\u5206\u9608\u503C\uFF08\u975E headless \u4E3B agent\uFF09\u3002\n\u6309\u5DE5\u5177\u8C03\u7528\u52A0\u6743 + \u8017\u65F6\u8BA1\u5206\uFF1B\u8FBE\u5230\u9608\u503C\u6CE8\u5165\u63D0\u9192\uFF0C\u8981\u6C42\u6A21\u578B\u56DE\u590D ACK \u7801\u3002\n\n Config:\n { \"sessionKeeper\": { \"threshold\": 150, \"sessionMdMaxKB\": 100 } }\n\n \u8BA1\u5206\uFF1Awrite/edit = 3\uFF0Ctask = 10\uFF0Cread/grep/glob/msm \u7B49 = 1\uFF0C\u65F6\u95F4 = 1/\u5206\u949F\n \u9ED8\u8BA4\uFF1A150\n\n \u25B8 sessionMdMaxKB\uFF08v1.31.1 \u65B0\u589E\uFF1Bv1.31.2 100\u2192200\uFF1B\uD83D\uDD34 v1.84.0 200\u2192100\uFF09\uFF1A\n **\u6D3B\u8DC3 SESSION.md \u4F53\u79EF\u4E0A\u9650\uFF08KB\uFF0C\u7F3A\u7701 100\uFF1B0 = \u5173\u95ED\uFF09**\u3002\n \u8D85\u8FC7 \u2192 \u6CE8\u5165 [COGNITIVE-TRAJECTORY-ASSISTANT \u00B7 LOGBOOK COMPACTION] \u63D0\u9192\uFF1A\u6682\u505C\u5F53\u524D\u5DE5\u4F5C \u2192\n \u52A0\u8F7D eap\uFF08praxis eap\uFF09\u2192 **\u6309 EAP \u91CD\u6784\u6574\u4E2A SESSION.md**\uFF08v1.84.0 \u8D77\uFF1B\u65E7\u7248\u662F\u56DB\u6761\u91CD\u5199\u539F\u5219\uFF09\u3002\n \u5224\u636E = EAP \u4E09\u4E2A\u53D8\u91CF\uFF1AE\u2191 \u53D8\u91CF/\u8FB9\u754C/\u6709\u5411\u5173\u7CFB\u5168\u663E\u5F0F \uFF5C R\u2193 \u5E26\u7406\u7531\u4E0E\u88AB\u5426\u9879\uFF0C\u957F\u8BC1\u636E\u94FE\u5916\u79FB\u5230\n references/*.md\uFF08SESSION.md \u7559\u94FE\u63A5\uFF09\uFF5C S\u2191 \u7ED3\u6784\u6BCF\u6B21\u540C\u6837\u91CD\u5EFA\uFF0C\u4E0D\u662F\u65F6\u95F4\u6D41\u6C34\u8D26\u3002\n \u4E24\u6761\u786C\u7EA6\u675F\u968F\u63D0\u9192\u7ED9\u51FA\uFF1A\u4FDD\u7559\u56FA\u5B9A\u6BB5\u843D\u7684**\u987A\u5E8F\u4E0E\u6807\u9898**\uFF08\u4E0E\u7CFB\u7EDF\u63D0\u793A\u8BCD\u5BF9\u9F50\uFF09+ \u4FDD\u7559\u9876\u90E8 frontmatter\u3002\n \u8D85\u9650\u540E\u6BCF\u6B21\u5DE5\u5177\u8C03\u7528\u90FD\u63D0\u9192\uFF1B\u8FDE\u7EED 3 \u6B21\u672A\u91CD\u5199 \u2192 \u5347\u7EA7\u5F3A\u5236\u8BED\u6C14\uFF1B\n \u6587\u4EF6\u56DE\u5230\u9650\u5185 \u2192 \u81EA\u52A8\u505C\u6B62\uFF08\u81EA\u6108\uFF09\u3002\u8F68\u8FF9\u63D0\u9192**\u4E0D\u673A\u68B0\u963B\u65AD\u5DE5\u4F5C**\uFF08\u4E0E rebuild \u63D0\u9192\u540C\u65CF\uFF09\u3002\n\n\u2500\u2500 2. localstore.gitTrack \u2500\u2500\nlocalstore.json \u7684 git \u7B56\u7565\uFF1Aallow \u53EF\u63D0\u4EA4 / deny \u7981\u63D0\u4EA4\uFF08\u9ED8\u8BA4 deny\uFF09\u3002\ndeny \u65F6\u5199\u5165\u81EA\u52A8\u786E\u4FDD .gitignore \u542B\u8BE5\u6587\u4EF6\uFF08\u7269\u7406\u4FDD\u8BC1\uFF09\uFF0Ccontainer_git commit \u4F1A\u68C0\u67E5\u62D2\u7EDD\u3002\n\n Config:\n { \"localstore\": { \"gitTrack\": \"allow\" } }\n\n\u2500\u2500 3. hooks.autoRestoreSession \u2500\u2500\n\u4F1A\u8BDD\u81EA\u52A8\u6062\u590D\uFF08\u9ED8\u8BA4 true\uFF1B\u53D7 events \u95E8\u63A7\u2014\u2014\u4EC5\u6839\u4F1A\u8BDD + \u5DF2\u6709\u5BF9\u8BDD\u5386\u53F2\u624D\u6062\u590D\uFF09\u3002\n\n Config:\n { \"hooks\": { \"autoRestoreSession\": false } }\n\n\u2500\u2500 4. safeMode\uFF08\u9ED1\u540D\u5355 \uFF0B \u5F00\u542F\u671F\u95F4\u9690\u85CF\u7684\u5DE5\u5177\uFF09\u2500\u2500\nsafe-mode \u7531 WebUI \u5F00\u5173\u63A7\u5236\uFF08\u5199 .serenity-safe-on \u6807\u8BB0\uFF09\uFF1B\u9ED1\u540D\u5355\u8DEF\u5F84\u53D7 guards seam \u62E6\u622A\u3002\n\n \u25B8 blacklist\uFF1A\u5199\u8DEF\u5F84\u9ED1\u540D\u5355\uFF08\u540C\u4E0B Config\uFF09\u3002\n \u25B8 hiddenTools\uFF08v1.51.4\uFF0Cowner 2026-10-09 \u4EE4\uFF09\uFF1A**\u4EC5\u5728\u5B89\u5168\u6A21\u5F0F\u5F00\u542F\u671F\u95F4**\u989D\u5916\u4ECE\u6A21\u578B\u5DE5\u5177\n \u6E05\u5355\u9690\u85CF\u7684\u5DE5\u5177\uFF08ACC \u57FA\u7840\u8868\u6052\u9690 bash\uFF09\u3002\u6253\u5F00 safe-mode \u751F\u6548\u3001**\u5173\u6389\u5373\u5168\u90E8\u6062\u590D**\uFF1B\n \u6539\u672C\u952E**\u70ED\u751F\u6548**\uFF08\u4E0B\u4E00\u4E2A pre-step \u91CD\u7B97\uFF0C\u65E0\u9700\u91CD\u542F\uFF09\u3002\u58F0\u660E\u5728 CCC\uFF08D23\uFF09\u2014\u2014ACC \u4EE3\u7801\u91CC\n \u4E0D\u51FA\u73B0\u4EFB\u4F55\u5177\u4F53\u5DE5\u5177\u540D\u3002\n \u26A0\uFE0F \u5199\u4E00\u4E2A**\u672C CCC \u672A\u6CE8\u518C**\u7684\u540D\u5B57\u4F1A\u8BA9**\u6574\u6B21 restrict \u5931\u8D25**\uFF08DSH \u5951\u7EA6\u9010\u5B57\uFF1A\"unknown\n names \u2026 fail\"\uFF09\u21D2 \u6B64\u65F6**\u9000\u5316\u4E3A\u53EA\u9690\u85CF\u57FA\u7840\u8868**\u5E76\u5728\u65E5\u5FD7\u54CD\u4EAE\u62A5\u9519\uFF08\u7EDD\u4E0D\u56E0\u4E00\u4E2A\u9519\u540D\u4E22\u6389\n safe-mode \u7684\u6838\u5FC3\u9690\u85CF\uFF09\u3002\u8BCA\u65AD\uFF1A`AGENT_SESSIONS/.restrict-diag.json` \u7684 `denyByKey`\u3002\n \u26A0\uFE0F \u9690\u85CF = **\u4ECE schema \u79FB\u9664**\uFF08agent \u6839\u672C\u770B\u4E0D\u5230\u8BE5\u5DE5\u5177\uFF09\u21D2 \u522B\u628A skill/\u6587\u6863\u8FD8\u5728\u6559\u7684\u5DE5\u5177\u5199\u8FDB\u6765\u3002\n\n Config:\n { \"safeMode\": { \"blacklist\": [\".secrets/\"], \"hiddenTools\": [\"workflow\", \"job_kill\"] } }\n\n\u2500\u2500 5. \u8F68\u8FF9\u7EA6\u675F.roles\uFF08F4 \u8BA4\u77E5\u5B50\u96C6\u89D2\u8272\uFF09\u2500\u2500\n\u8F68\u8FF9\u7EA6\u675F\u89D2\u8272 = \u5168\u77E5\u5168\u80FD cognitive trajectory \u7684\u4EFB\u610F\u5B50\u96C6\uFF08CCC \u5B9A\u4E49\uFF09\u3002\u6BCF\u89D2\u8272\u72EC\u7ACB\u6A21\u578B + \u53CC\u767D\u540D\u5355\n\uFF08MSM \u767D\u540D\u5355 msms[] \u4E0E\u975E MSM \u5DE5\u5177\u767D\u540D\u5355 tools[]\uFF0C\u767D\u540D\u5355\u5916\u5168\u9690\u85CF\uFF1Bskill \u52A0\u8F7D\u6052\u53EF\u7528\uFF09\u3002\ncognitive trajectory \u7EAA\u5F8B\u5B50\u96C6\uFF08session/keeper/rebuild \u53C2\u4E0E\u9879\uFF09\u9ED8\u8BA4\u5168\u5173 = \u5B8C\u5168\u72EC\u7ACB\u3002\nsystemPrompt \u5185\u8054 \u6216 systemPromptFile\uFF08.md \u5F15\u7528\uFF0C\u63A8\u8350\uFF09\u2014\u2014\u89D2\u8272\u4F1A\u8BDD\u7684\u5B8C\u6574\u4EBA\u683C/\u8FB9\u754C\u63D0\u793A\u8BCD\u3002\nvalidate \u6821\u9A8C / apply \u751F\u6548 / list \u67E5\u770B\uFF1Acontainer_admin config <guide|validate|apply|list>\uFF08\u539F role \u57DF\u5DF2\u5E76\u5165 config\uFF0C\u65E7\u540D\u4F5C\u8FC7\u6E21\u522B\u540D\u4ECD\u53EF\u7528\uFF09\u3002\n\n Config:\n { \"\u8F68\u8FF9\u7EA6\u675F\": { \"roles\": {\n \"qa\": {\n \"model\": \"provider/model\",\n \"msms\": [\"web-search\", \"vlm-describe\"],\n \"tools\": [\"read\", \"grep\", \"glob\"],\n \"systemPromptFile\": \".opencode/skiff/qa.md\"\n } } } }\n\n\u2500\u2500 6. cognitive_trajectory\uFF08\u8F68\u8FF9 + \u5524\u9192\u6CE8\u518C\u8868\uFF0CD58\uFF09\u2500\u2500\nCCC \u7684\u4E00\u6761 cognitive trajectory = \u6301\u4E45\u8EAB\u4F53\uFF08SESSION.md\uFF09+ \u65F6\u95F4\u8F74\uFF08AGENT_SESSIONS/ \u76EE\u5F55 + \u5524\u9192\u6CE8\u518C\u8868\uFF09\u3002\n\u4E00\u4E2A CCC \u5185\u53EF\u591A\u6761\u5E76\u884C\uFF1B\u6761\u76EE\u5168\u90E8\u7531\u4EBA\u7C7B/agent \u663E\u5F0F\u767B\u8BB0\u3002\n\u26A0\uFE0F ACC \u4E0D\u518D\u63D0\u4F9B**\u5468\u671F\u81EA\u5524\u9192**\uFF08\u539F autopilot\uFF0C2026-09-15 \u6574\u6BB5\u9000\u573A\uFF1A\u673A\u5236/\u65F6\u949F/container_admin autopilot\n\u57DF/\u9762\u677F\u533A\u5757\u4E00\u5E76\u5220\u9664\uFF09\u3002\u81EA\u4E3B\u5DE1\u822A\u6539\u7531 CCC \u81EA\u5DF1\u9A71\u52A8\uFF08home-serenity \u4FA7 msm autopilot-round \u6BCF\u8F6E\u81EA\u6392\u4E0B\u4E00\u8F6E\uFF0C\n\u771F\u76F8\u6E90 = S151 SESSION.md \u00A71/\u00A71b/\u00A71c\uFF09\u3002**\u672C\u8F6E\u7684 cognitiveTrajectory.autopilot \u914D\u7F6E\u6BB5\u4FDD\u7559**\uFF08\u89C1\u4E0B\u8868\uFF09\u2014\u2014\n\u5B83\u73B0\u7531 **CCC \u4FA7\u811A\u672C**\u8BFB\u53D6\uFF0CACC \u4E0D\u518D\u6D88\u8D39\u8BE5\u6BB5\u3002\n\u5524\u9192\u6CE8\u518C\u8868\uFF08cognitive_trajectory send-later\uFF09\uFF1A\u5524\u9192 = \u672A\u6765\u65F6\u523B + \u4E00\u6761 message\uFF0C\u53EF\u5524\u9192\u81EA\u5DF1\u6216\u522B\u7684 cognitive trajectory\uFF1B\n\u843D\u70B9 AGENT_SESSIONS/wake-registry.json\uFF0C\u4E2D\u5FC3\u8C03\u5EA6\u5668\u5230\u70B9\u6295\u9012\uFF08fire-and-forget\uFF1B\u65E0\u56DE\u6267\u3001\u65E0\u56DE\u6536\uFF09\u3002\n\u8FD0\u884C\u6001\u8BCA\u65AD\uFF08ACC \u8D1F\u8D23\u4EBA\u4E13\u7528\uFF09\uFF1Aacc-diag\uFF08\u2460 live \u8FD0\u884C\u6001 / \u2460b \u5524\u9192\u65F6\u949F / \u2462 \u5524\u9192\u6CE8\u518C\u8868\uFF09\u3002\n\n\u25B8 cognitiveTrajectory.skills\uFF08v1.44.0\uFF0C**CCC \u7EA7 skill \u4F9B\u7ED9**\uFF1Bowner \u4EE4 2026-09-20\u300C\u8981\u6C42\u5B9E\u73B0\u6211\u7684\u8BC9\u6C42\u2026\u2026\n \u6CE8\u5165\u662F\u52A8\u6001\u6CE8\u5165\u5C31\u884C\uFF1Bcreate \u5148\u4E0D\u89E6\u53D1\u5427\uFF1B**\u8F68\u8FF9\u7EA6\u675F\u4E5F\u652F\u6301**\u300D\uFF09\uFF1A\n **\u672C CCC \u7684\u6BCF\u6761\u8F68\u8FF9\u90FD\u5E26\u8FD9\u4E9B skill**\u2014\u2014\u58F0\u660E\u7684 skill \u5168\u6587\u5728\u8BE5\u8F68\u8FF9**\u88AB\u7ED1\u5B9A\u671F\u95F4**\u6CE8\u5165\u7CFB\u7EDF\u63D0\u793A\u8BCD\n \uFF08**\u52A8\u6001\u6CE8\u5165**\uFF1A\u6BCF\u8BF7\u6C42\u91CD\u65B0\u6C42\u503C\u3001\u4E0D\u7F13\u5B58 \u21D2 \u6539\u914D\u7F6E\u6216\u6539 frontmatter **\u5373\u65F6\u751F\u6548**\uFF0C\u65E0\u9700\u91CD\u65B0 use\u3001\u65E0\u9700\u91CD\u542F\uFF09\u3002\n \u4E24\u6761\u58F0\u660E\u6765\u6E90**\u5E76\u96C6**\uFF08\u4E0D\u662F\u4E8C\u9009\u4E00\uFF09\uFF1A\u672C\u952E **cognitiveTrajectory.skills**\uFF08\u5BB9\u5668\u7ED9\u7684\u5E95\u5EA7\uFF0C**\u5728\u524D**\uFF09\n \uFF0B \u8F68\u8FF9\u81EA\u5DF1 SESSION.md \u9876\u90E8 frontmatter \u7684 skills:\uFF08\u8FD9\u6761\u8F68\u8FF9\u989D\u5916\u7684\uFF0C**\u8FFD\u52A0**\uFF1B\u540C\u540D\u53BB\u91CD\uFF09\u3002\n \u2705 **\u542B \u8F68\u8FF9\u7EA6\u675F\u89D2\u8272\u4F1A\u8BDD**\uFF08\u65C1\u8DEF\u7684\u662F ACC \u8EAB\u4EFD\u4E0E\u7EAA\u5F8B\uFF1Bskill \u662F\"\u5DE5\u4F5C\u8D44\u6599\"\uFF0C\u7167\u7ED9\uFF09\u3002\n \u5B88\u536B\uFF1A\u540D\u5B57\u5148\u8FC7\u5B89\u5168\u6821\u9A8C\u624D\u7528\u4E8E\u62FC\u8DEF\u5F84\uFF08\u9632\u7A7F\u8D8A\uFF09\uFF5C**\u5408\u5E76\u540E**\u7EDF\u4E00 32 KB \u4E0A\u9650\u622A\u65AD\uFF5C\u627E\u4E0D\u5230\u54CD\u4EAE\u5199 [\u7F3A\u5931]\u3002\n \u26A0\uFE0F \u4E0E create **\u65E0\u5173**\uFF08create \u523B\u610F\u4E0D\u593A\u7ED1\u5B9A\uFF0CU6\uFF09\u21D2 \u6CE8\u5165\u7684\u95E8\u662F\"**\u5B58\u5728\u7ED1\u5B9A**\"\uFF08cognitive_trajectory use\uFF09\u3002\n \u5931\u8D25\u8BED\u4E49\uFF1A\u672A\u914D\u7F6E / \u5B57\u6BB5\u7F3A\u5931 / \u914D\u7F6E\u635F\u574F \u21D2 **\u7A7A\u6570\u7EC4**\uFF08= \u65E0 CCC \u7EA7\u4F9B\u7ED9\uFF1B\u8F68\u8FF9\u7EA7\u58F0\u660E\u7167\u65E7\u751F\u6548\uFF09\u3002\n \u5F52\u5C5E\uFF08D23\uFF09\uFF1A**\u673A\u5236\u5728 ACC**\uFF08\u8BFB\u53D6 + \u5408\u5E76 + \u6CE8\u5165 + \u5B88\u536B\uFF09\uFF0C**\u58F0\u660E\u5728 CCC**\uFF08\u672C\u952E\uFF09\u3002\n\n Config:\n { \"cognitiveTrajectory\": {\n \"skills\": [\"acc-session\", \"cce\"], // v1.44.0\uFF1A\u672C CCC \u7684\u6BCF\u6761\u8F68\u8FF9\u90FD\u5E26\uFF08\u542B \u8F68\u8FF9\u7EA6\u675F\u4F1A\u8BDD\uFF09\n \"autopilot\": { // \u539F autopilotTrajectory \u6BB5\uFF0C\u5B57\u6BB5\u4E0D\u53D8\uFF08\u65E7\u952E\u4ECD\u56DE\u9000\u8BFB\uFF09\n \"enabled\": true,\n \"intervalHours\": 2,\n \"session\": \"S151\",\n \"biasProvider\": \"autopilot-bias.ts\",\n \"topPrompt\": \"\u672C\u8F68\u8FF9\u6838\u5FC3\u76EE\u6807/\u7EAA\u5F8B/\u8D28\u91CF\u8981\u6C42\uFF08CCC \u81EA\u586B\uFF0C\u9632\u6F02\u79FB\uFF09\",\n \"avoidWakeHours\": { \"start\": 8, \"end\": 18 }\n } } }\n\n\u2500\u2500 7. weixin\uFF08\u5FAE\u4FE1\u6865 F4c-3\uFF0C\u542B\u6D88\u606F\u8BB0\u5F55 hook\uFF09\u2500\u2500\nCCC \u7EA7\u5FAE\u4FE1\u4E2A\u4EBA\u53F7\u63A5\u5165\uFF08iLink \u534F\u8BAE\uFF09\uFF1Adsh \u4E00\u8FDB\u7A0B\u591A CCC\uFF0C\u6BCF CCC \u72EC\u7ACB\u5BF9\u63A5\u5FAE\u4FE1\u6865\u3002\n\u8D26\u53F7/\u8DEF\u7531/\u5F00\u5173\u5728\u6B64\u6587\u4EF6\uFF1B**bot_token \u51ED\u636E\u5728 CCC localstore credential scope**\n\uFF08\u626B\u7801\u7ED1\u5B9A\u540E\u81EA\u52A8\u5199\u5165\uFF0C\u6C38\u4E0D\u8FDB git \u660E\u6587\u9762\uFF09\u3002\n\u8DEF\u7531 user \u2192 role\uFF1Aexact \u4F18\u5148\uFF0C* \u901A\u914D\u515C\u5E95\uFF1Brole \u5FC5\u987B \u2208 \u8BE5 CCC \u8F68\u8FF9\u7EA6\u675F.roles\u3002\n\u9762\u677F\uFF08WebUI \u8BBE\u7F6E \u2192 \u5FAE\u4FE1\u6865\uFF09\u53EF\u626B\u7801\u7ED1\u5B9A/\u79FB\u9664\u8D26\u53F7/\u7F16\u8F91\u8DEF\u7531\uFF1Bmsm(\"weixin-doctor\", [\"status\"|\"diag\"|\"verify\"|\"guide\"]) \u6392\u67E5 + \u5927\u800C\u5168\u6307\u5357\u3002\u51ED\u636E\u4E3B\u52A8\u67E5\u770B\uFF1Alocalstore get WEIXIN_<ACCOUNT>_TOKEN\u3002\n \u25B8 \u4E3B\u52A8\u53D1\u9001\uFF08v1.31.0\uFF1A**ACC \u5DE5\u5177 im-bridge**\uFF09\uFF1A\u8C03\n im-bridge({channel:\"weixin\", action:\"send\", user:\"<\u522B\u540D|id>\", text:\"<\u6587\u672C>\"}) \u7ED9\u7528\u6237\u53D1\u6D88\u606F\u2014\u2014\n **\u5DE5\u5177\u53EA\u80FD\u64CD\u4F5C\u672C\u4F1A\u8BDD CCC**\uFF08\u65E0 ccc \u53C2\u6570\uFF0C\u9632\u8BEF\u53D1\u4ED6\u5BB9\u5668\uFF09\u2192 weixin-bridge.sendProactiveText \u2192\n \u6210\u529F\u540E\u89E6\u53D1 outgoing hook\uFF08source=\"proactive\"\uFF09\u3002\u6587\u4EF6\u7528 action:\"send-file\" + file:\"<CCC \u5185\u8DEF\u5F84>\"\n \uFF08\u9003\u9038/\u7F3A\u5931/\u8D85 20MB \u62D2\u7EDD\uFF09+ \u53EF\u9009 caption\u3002**\u53EF\u89C1\u6027**\uFF1A\u672C CCC \u914D\u7F6E\u4E86 IM \u901A\u9053\n \uFF08weixin.enabled=true\uFF09\u624D\u51FA\u73B0\u5728\u6A21\u578B\u5DE5\u5177\u6E05\u5355\u91CC\uFF1B\u672A\u914D\u7F6E \u2192 \u7531 guards \u9010 agent\n tools.restrict({deny:['im-bridge']}) \u79FB\u9664\uFF08\u4E0D\u662F\"\u770B\u5F97\u5230\u4F46\u88AB\u62D2\"\uFF09\u3002\u8F68\u8FF9\u7EA6\u675F\u89D2\u8272\u53E6\u9700\u5728\n roles.<role>.tools \u767D\u540D\u5355\u5217\u51FA im-bridge\u3002\n \u5386\u53F2\uFF08v1.30.9~v1.30.x\uFF09\uFF1ACCC \u4FA7 MSM weixin-send\uFF08\u8D70 loopback HTTP \u5165\u53E3 3082\uFF09\u2014\u2014\n v1.31.0 \u5DF2\u9000\u5F79\uFF08\u811A\u672C\u5220\u9664 + \u6CE8\u518C\u8868\u6CE8\u9500\uFF09\uFF1B3082 \u5165\u53E3\u4FDD\u7559\u7ED9**\u975E agent \u8C03\u7528\u8005**\u3002\n\n \u25B8 \uD83D\uDD34\uD83D\uDD34 **\u51FA\u7AD9\u53EA\u6709\u4E00\u6761\u8DEF\uFF1Aagent \u81EA\u5DF1\u8C03 im-bridge**\uFF082026-10-24 \u8D77\uFF0Cowner \u4EE4\uFF09\u3002\n \u6865**\u6C38\u4E0D**\u66FF\u4F60\u56DE\u53D1\u6700\u7EC8\u6587\u672C \u2014\u2014 \u4F60\u8BF4\u4EC0\u4E48\u3001\u8BF4\u51E0\u6761\u3001\u4EC0\u4E48\u65F6\u5019\u8BF4\u3001\u8981\u4E0D\u8981\u4E0D\u8BF4\uFF0C\u5168\u7531\u4F60\u51B3\u5B9A\u3002\n \u26D4 \u4E0D\u8981\u6307\u671B\"\u6211\u628A\u8BDD\u5199\u8FDB\u56DE\u7B54\u91CC\u5C31\u4F1A\u81EA\u52A8\u53D1\u51FA\u53BB\"\uFF1A**\u4E0D\u4F1A**\u3002\u5FC5\u987B\u771F\u7684\u8C03\u5DE5\u5177\u3002\n \u21D2 \u6BCF\u8F6E\u7528\u6237\u6D88\u606F\u672B\u5C3E\u90FD\u4F1A\u9644\u4E00\u884C**\u5DF2\u586B\u597D\u53C2\u6570**\u7684 im-bridge \u8C03\u7528\u6A21\u677F\uFF08\u673A\u5236\u6807\u8BB0\n [serenity:weixin-manual-output]\uFF09\uFF0C\u7167\u5B83\u6539 text \u5373\u53EF\u3002\n \u21D2 \u672C\u8F6E\u7ED3\u675F\u4ECD\u672A\u6210\u529F\u8C03\u7528\uFF08send / send-file\uFF09\u2192 \u4F60\u4F1A\u88AB\u6253\u56DE\uFF08\u22642 \u6B21\uFF0C\u63D0\u793A = \u6807\u8BB0 + \u4E8B\u5B9E\uFF09\uFF1B\n \u8FBE\u4E0A\u9650\u540E**\u7528\u6237\u5C06\u6536\u4E0D\u5230\u4EFB\u4F55\u6D88\u606F**\uFF08\u6CA1\u6709\u4EFB\u4F55\u515C\u5E95\u8F6C\u53D1\uFF09\u3002\n \u21D2 \u6210\u529F\u8C03\u7528\u624D\u7B97\u9001\u8FBE\uFF1B\u5931\u8D25\u8C03\u7528\u4E0D\u7B97\uFF08\u4E0D\u4F1A\u88AB\u5F53\u6210\u672C\u8F6E\u5DF2\u53D1\u9001\uFF09\u3002\n \u26A0\uFE0F **\u524D\u63D0**\uFF1A\u672C\u8F68\u8FF9\u5FC5\u987B\u5728 `.opencode/serenity.json` \u7684 `im.routes` \u91CC\u88AB\u70B9\u540D\uFF0C\u5426\u5219 `im-bridge`\n \u5BF9\u4F60\u4E0D**\u53EF\u89C1**\u2014\u2014\u90A3\u79CD\u60C5\u51B5\u4E0B\u95F8\u95E8\u4E0D\u4F1A\u6253\u56DE\u4F60\uFF08\u6539\u6210\u4E00\u6761\u54CD\u4EAE\u544A\u8B66\uFF0C\u6307\u660E\"\u8BE5\u8F68\u8FF9\u65E0\u53D1\u9001\u6743\"\uFF09\uFF0C\n \u56E0\u4E3A\u6253\u56DE\u4E00\u4E2A\u4F60\u6839\u672C\u6EE1\u8DB3\u4E0D\u4E86\u7684\u8981\u6C42\u53EA\u4F1A\u7A7A\u8F6C\u3002\n\n \u25B8 **\u5DF2\u9000\u5F79\uFF08\u4E0D\u8981\u518D\u914D\uFF0C\u914D\u4E86\u4E5F\u4E0D\u751F\u6548\uFF09**\uFF1A\n \u00B7 `weixin.autoReplyWithLastMessage`\uFF08v1.30.10~2026-10-24\uFF09= \u6865\u66FF agent \u56DE\u53D1\u6700\u7EC8\u6587\u672C\u3002\n **\u88AB\u5426\u7406\u7531**\uFF08owner \u539F\u8BDD\uFF09\uFF1A\u300CautoReply \u5E76\u4E0D\u5408\u9002\uFF0C\u4E3B\u52A8\u6027\u7684 imBridge \u4ECD\u7136\u662F\u66F4\u597D\u7684\u300D\u2014\u2014\n \u5B83\u8BA9 agent \u5931\u53BB\"\u8BF4\u51E0\u6761/\u4F55\u65F6\u8BF4/\u8981\u4E0D\u8981\u4E0D\u8BF4\"\u7684\u51B3\u5B9A\u6743\uFF0C\u800C\u90A3\u6B63\u662F\u4E3B\u52A8\u53D1\u9001\u7684\u4EF7\u503C\u3002\n \u00B7 `weixin.fallbackOnNoSend`\uFF08v1.30.17~2026-10-24\uFF09= \u624B\u52A8\u6A21\u5F0F\u4E0B agent \u6CA1\u53D1\u6210\u529F\u65F6\u6865\u515C\u5E95\u8F6C\u53D1\u3002\n \u5B83\u53EA\u5728\u4E0A\u9762\u90A3\u4E2A\u5F00\u5173 =false \u65F6\u624D\u6709\u610F\u4E49 \u21D2 \u4E00\u8D77\u9000\u5F79\u3002\n \u26A0\uFE0F \u65E7\u914D\u7F6E\u91CC\u6B8B\u7559\u8FD9\u4E24\u4E2A\u952E**\u9759\u9ED8\u5FFD\u7565**\uFF08\u4E0D\u4F1A\u62A5\u9519\uFF0C\u4E5F\u4E0D\u4F1A\u751F\u6548\uFF09\u3002\n\n Config:\n { \"weixin\": {\n \"enabled\": true,\n \"hook\": \"scripts/weixin-message-hook.ts\",\n \"accounts\": [{ \"accountId\": \"wechat-1\", \"name\": \"\u5BB6\u5EAD\u52A9\u624B\", \"enabled\": true }],\n \"routes\": [{ \"user\": \"*\", \"role\": \"my-role\" }]\n } }\n\n \u25B8 weixin.hook\uFF08\u6D88\u606F\u8BB0\u5F55 hook\uFF0Cv1.27.13\uFF09\uFF1A\n \u5FAE\u4FE1\u6865\u6BCF\u6536/\u53D1\u4E00\u6761\u6D88\u606F\u89E6\u53D1\u4E00\u6B21 CCC \u81EA\u5199\u811A\u672C\uFF0C\u7531 CCC \u81EA\u884C\u6301\u4E45\u5316\u4FDD\u5B58\uFF08\u5B58\u54EA/\u5B58\u6210\u4EC0\u4E48\n /\u662F\u5426\u5165\u5E93\u5168\u5F52 CCC\u2014\u2014ACC \u4E0D\u7ED1\u5B9A\u5B58\u50A8\uFF09\u3002\u672A\u914D\u7F6E hook \u2192 \u96F6\u53D8\u5316\uFF08\u4E0D\u89E6\u53D1\uFF09\u3002\n\n \u89E6\u53D1\uFF08\u53CC\u5411\uFF09\uFF1A\n incoming = \u7528\u6237 \u2192 bot\uFF1A\u8DEF\u7531\u547D\u4E2D\u540E\u3001\u5A92\u4F53\u843D\u76D8\u540E\u89E6\u53D1\uFF08\u6587\u672C\u542B\u8BED\u97F3\u8F6C\u5199\uFF1B\u5A92\u4F53\u5E26\u843D\u76D8 relPath\uFF09\n outgoing = bot \u2192 \u7528\u6237\uFF1A\u53D1\u9001\u6210\u529F\u540E\u89E6\u53D1\uFF08reply = \u7528\u6237\u5B9E\u9645\u6536\u5230\u7684\u7EAF\u6587\u672C\uFF0C\u5DF2\u5265\u79BB think\uFF09\n \u00B7 source=\"proactive\" = agent \u7ECF im-bridge \u4E3B\u52A8\u53D1\u8D77\uFF08**2026-10-24 \u8D77\u8FD9\u662F\u552F\u4E00\u503C**\uFF09\n \u00B7 \u5386\u53F2\u503C reply / reply-fallback\uFF08\u6865\u81EA\u52A8\u56DE\u53D1 / \u6865\u515C\u5E95\u8F6C\u53D1\uFF09\u5DF2\u968F\u4E24\u4E2A\u5F00\u5173\u4E00\u8D77\u9000\u5F79\uFF1B\n \u5B58\u91CF\u65E5\u5FD7\u91CC\u4ECD\u80FD\u770B\u5230\u5B83\u4EEC\uFF0C\u90A3\u662F\u5386\u53F2\u4E8B\u5B9E\uFF0C\u4E0D\u662F\u5F53\u524D\u884C\u4E3A\n \u00B7 file\uFF08\u4EC5 send-file \u8865\u8BB0\uFF09\uFF1A{ \"name\": \"\u62A5\u544A.pdf\", \"size\": 12345, \"caption\": \"\u53EF\u9009\" }\n\n \u811A\u672C\u7EA6\u5B9A\uFF08\u4E8B\u4EF6 JSON \u5355\u884C\u7ECF stdin \u4F20\u5165\uFF1Bbun \u4F18\u5148 node \u515C\u5E95\uFF09\uFF1A\n #!/usr/bin/env bun \u6216 node script.js \u2014\u2014 \u8BFB process.stdin \u6574\u6BB5 JSON.parse\n const ev = JSON.parse(await new Response(process.stdin).text())\n ev.event === 'incoming' | 'outgoing'\n\n \u4E8B\u4EF6 schema\uFF08**\u4E0D\u542B\u4EFB\u4F55\u4F1A\u8BDD\u51ED\u636E**\u2014\u2014context_token/bot_token/token/aes_key \u5747\u4E0D\u51FA\u73B0\uFF09\uFF1A\n { \"event\": \"incoming\", \"ts\": 1788359941488, \"cccRoot\": \"/path/ccc\",\n \"accountId\": \"wechat-1\", \"userId\": \"u1@im.wechat\",\n \"sessionId\": \"skiff-weixin-xxx\", \"role\": \"my-role\",\n \"message\": { \"text\": \"\u4F60\u597D\", \"media\": [{ \"kind\": \"image\", \"relPath\": \"_tmp/weixin-inbound/<hash>/img_x.jpg\" }] } }\n { \"event\": \"outgoing\", \"ts\": ..., \"cccRoot\": ..., \"accountId\": ...,\n \"userId\": ..., \"sessionId\": ..., \"role\": ...,\n \"reply\": \"\u5DF2\u8BB0\u5F55\uFF08\u7EAF\u6587\u672C\uFF09\", \"source\": \"proactive\" }\n\n \u793A\u4F8B\u811A\u672C\uFF08\u8FFD\u52A0\u5230\u6309\u65E5\u6587\u4EF6\u2014\u2014\u6301\u4E45\u5316\u5F52 CCC \u81EA\u9009\uFF1A\u6587\u4EF6/DB/\u8FDC\u7AEF\u5747\u53EF\uFF09\uFF1A\n const fs = require('node:fs'); const p = '/path/ccc/AGENT_SESSIONS/_weixin-log.jsonl';\n fs.appendFileSync(p, JSON.stringify(ev) + '\\n');\n\n \u6267\u884C\u8BED\u4E49\uFF08\u65C1\u8DEF\u5BB9\u5FCD\uFF09\uFF1A\u5F02\u6B65 fire-and-forget + 15s \u8D85\u65F6 kill + \u5931\u8D25\u4EC5\u65E5\u5FD7\u2014\u2014\n \u5FAE\u4FE1\u6865\u6D88\u606F\u5904\u7406/\u56DE\u590D\u4E0D\u53D7 hook \u5F71\u54CD\uFF1B\u811A\u672C\u987B\u5728 CCC \u6839\u5185\uFF08\u8DEF\u5F84\u9003\u9038\u62D2\u7EDD\uFF09\u3002\n \u5A92\u4F53 relPath \u6307\u5411 _tmp/weixin-inbound/\uFF08\u4E34\u65F6\u76EE\u5F55\uFF09\u2014\u2014\u9700\u6301\u4E45\u4FDD\u5B58\u5A92\u4F53\u6587\u4EF6\u8BF7\u81EA\u884C copy\u3002\n\n\u2500\u2500 8. \uFF08\u5DF2\u5220\u9664\uFF09exclusiveTools\uFF08\u4E13\u5C5E\u5DE5\u5177\u58F0\u660E\uFF0Cv1.33 \u2192 v1.106.0 \u5220\u9664\uFF09\u2500\u2500\n\uD83D\uDD34 **\u672C\u952E\u5DF2\u4E0D\u5B58\u5728**\uFF08owner 2026-11-01 \u88C1\u300C\u673A\u5236\u6574\u4F53\u5220\u300D\uFF09\u3002\n\u539F\u8BED\u4E49\uFF1AACC \u6CE8\u518C\u4F46\u9ED8\u8BA4\u5BF9\u6240\u6709 CCC \u9690\u85CF\u7684\u5DE5\u5177\uFF0C\u53EA\u6709\u5728 CCC \u914D\u7F6E\u91CC\u70B9\u540D\u624D\u53EF\u89C1\uFF08fail-closed\uFF09\u3002\n**\u5220\u9664\u7406\u7531**\uFF1A\u90A3\u5F20\u8868\u6C38\u8FDC\u53EA\u6709\u4E00\u4E2A\u6210\u5458 acc-diag\uFF0C\u800C\u5B83\u5DF2\u5E76\u5165**\u5E38\u9A7B**\u7684 dashboard \u7684 diag \u52A8\u4F5C\u3002\n\u8868\u7A7A\u4E4B\u540E\u90A3\u4E2A filter \u6052\u56DE\u7A7A\u6570\u7EC4 \u21D2 \u673A\u5236**\u9759\u9ED8\u7A7A\u8F6C\u3001\u4E14\u4EFB\u4F55\u6D4B\u8BD5\u90FD\u8BC1\u4F2A\u4E0D\u4E86\u5B83**\n\uFF08\u4E00\u4E2A\u9A8C\u4E0D\u51FA\u6B7B\u6D3B\u7684\u673A\u5236\u6BD4\u6CA1\u6709\u5B83\u66F4\u574F\uFF1A\u5B83\u63D0\u4F9B\"\u8FD9\u91CC\u8FD8\u6709\u4E00\u5C42\u4FDD\u62A4\"\u7684\u9519\u89C9\uFF09\u3002\n\n \u25B8 \u8981\u8FD0\u884C\u6001\u8BCA\u65AD \u21D2 \u76F4\u63A5\u7528 dashboard \u7684 diag \u52A8\u4F5C\uFF08**\u65E0\u9700\u4EFB\u4F55\u58F0\u660E\uFF0C\u6240\u6709\u8F68\u8FF9\u53EF\u89C1**\uFF09\u3002\n \u25B8 \u65E7\u914D\u7F6E\u91CC\u6B8B\u7559 exclusiveTools \u21D2 **\u9759\u9ED8\u5FFD\u7565**\uFF08schemastery \u975E strict\uFF09\uFF0C\u4E0D\u5F71\u54CD\u52A0\u8F7D\u3002\n \u25B8 \u26A0\uFE0F \u8FDE\u5E26\u540E\u679C\uFF08owner \u5DF2\u77E5\u5E76\u786E\u8BA4\uFF09\uFF1Adashboard \u662F\u5E38\u9A7B\u5DE5\u5177 \u21D2 diag \u6BB5\u5BF9**\u6240\u6709\u8F68\u8FF9**\u53EF\u89C1\uFF0C\n \u800C\u5B83\u7684 live \u4F1A\u8BDD\u6E05\u5355\u662F**\u5168\u90E8 CCC** \u7684\uFF08\u8DE8\u5BB9\u5668\uFF09\u3002\u8FD9\u662F\u300C\u65B9\u6848 C\u300D\u7684\u65E2\u5B9A\u4EE3\u4EF7\uFF0C\u4E0D\u662F\u7F3A\u9677\u3002\n\n\u2500\u2500 9. userQuotes.enabled\uFF08\u7528\u6237\u8BED\u5F55\u53F0\u8D26\uFF0Cv1.113.0\uFF09\u2500\u2500\n**\u628A\u7528\u6237\u76F4\u63A5\u8BF4\u7684\u8BDD\u6309\u5929\u3001\u6309\u8F68\u8FF9\u5B58\u4E0B\u6765**\uFF0C\u4F9B\u4E4B\u540E\u53CD\u5411\u5206\u6790\u7528\u6237\u3002owner \u539F\u8BDD\uFF1A\n\u300C\u6211\u9700\u8981\u4E00\u4E2A\u53EF\u5F00\u542F\u5173\u95ED\u7684\u529F\u80FD\uFF0C\u5C31\u662F\u8BB0\u5F55\u7528\u6237\u76F4\u63A5\u5BF9\u8C01\u8BF4\u8FC7\u4EC0\u4E48\uFF0C\u5BF9\u8C01\u662F\u6307\u5BF9\u5177\u4F53\u7684\u67D0\u4E2A\u8F68\u8FF9\u2026\u2026\n\u8FD9\u4E2A\u529F\u80FD\u5982\u679C\u5F00\u542F\uFF0C\u5219\u9ED8\u8BA4\u5199\u5230\u4E00\u4E2A\u6307\u5B9A\u76EE\u5F55\u5185\uFF0C\u6309\u5929\u8FDB\u884C\u8BB0\u5F55\u3002\u8FD9\u4E2A\u529F\u80FD\u662F\u7528\u4E8E\u5177\u4F53\u7684\u5B81\u9759\u53F7CCC\u53CD\u5411\u6765\u5206\u6790\u7528\u6237\u7684\u300D\u3002\n\n Config:\n { \"userQuotes\": { \"enabled\": true } }\n\n \u9ED8\u8BA4\uFF1A**\u5173**\u3002\uD83D\uDD34 \u5224\u636E\u662F `enabled === true`\uFF0C\u26D4 \u4E0D\u662F\"\u952E\u5B58\u5728\"\u2014\u2014\n \u5199\u6210 \"true\" / 1 / \u53EA\u5199 userQuotes: {} \u4E00\u5F8B\u5F53**\u5173**\u3002\u7406\u7531\uFF1A\u8FD9\u662F\u628A\u7528\u6237\u539F\u8BDD\u539F\u6587**\u957F\u671F\u7559\u5B58**\uFF0C\n \u542B\u7CCA\u7684\u914D\u7F6E\u5FC5\u987B\u843D\u5230\"\u4E0D\u5199\"\u90A3\u4E00\u4FA7\uFF08fail-closed\uFF1B\u4E0E\u8BA2\u9605\u8868\u7684 fail-open \u65B9\u5411\u76F8\u53CD\uFF0C\n \u56E0\u4E3A\u8FD9\u91CC\u7684\u5371\u9669\u65B9\u5411\u662F**\u591A\u5199**\uFF09\u3002\n\n \u843D\u70B9\uFF1A`AGENT_SESSIONS/_user-quotes/<YYYY-MM-DD>.jsonl`\uFF08\u6309\u5929\uFF0C\u4E00\u884C\u4E00\u6761\uFF09\uFF1A\n {\"ts\":\"\u2026+08:00\",\"trajectory\":\"<\u8F68\u8FF9\u76EE\u5F55\u540D \u6216 null>\",\"sessionId\":\"\u2026\",\"messageId\":\"\u2026\",\"text\":\"\uFF08\u539F\u8BDD\uFF0C\u4E00\u5B57\u4E0D\u6539\uFF09\",\"chars\":88}\n\n \u25B8 **\u91C7\u96C6\u70B9** = `agent/pre-step` \u7684 `payload.messages`\uFF08\u672C step \u4ECE inbox \u53D6\u51FA\u3001\u5373\u5C06\u8FDB\u672C\u6B65\u7684\u6D88\u606F\uFF09\u3002\n \u25B8 **\u5224\u522B\u9762 = `source.kind === 'user'`**\uFF08\u7ED3\u6784\u6027\uFF0C\u26D4 \u4E0D\u9760\u63AA\u8F9E\u9ED1\u540D\u5355\uFF09\u3002\n \u25B8 **\"\u5BF9\u8C01\" = \u6309\u8F68\u8FF9**\uFF08Q1\uFF09\uFF0C\u53D6\u7ED1\u5B9A\u771F\u76F8\u6E90\uFF08`current.dsh_session_bind`\uFF09\uFF1B\u672A\u7ED1\u5B9A \u21D2 `null` \u4F46**\u7167\u5E38\u8BB0**\u3002\n \u25B8 **\u5168\u6587**\uFF08Q3\uFF09\uFF1A\u4E00\u5B57\u4E0D\u6539\uFF0C\u4E0D\u505A\u6458\u8981\uFF1B`chars` \u662F**\u7801\u70B9\u6570**\u4E0D\u662F UTF-16 \u5355\u5143\u6570\u3002\n \u25B8 \u4E24\u4E2A**\u5192\u5145 `kind:'user'`** \u7684\u751F\u4EA7\u8005\uFF08\u8F7D\u4F53\u5F00\u573A\u767D\uFF0Frebuild \u951A\u70B9\uFF09\u6309\u5404\u81EA\u6807\u8BB0\u6392\u9664\u3002\n \u25B8 IM \u5165\u7AD9\uFF08**\u5FAE\u4FE1\u4E0E\u98DE\u4E66\u90FD\u7B97**\uFF09**\u4E0D\u4F1A\u6DF7\u8FDB\u6765**\uFF1A\u4E24\u8005\u5171\u7528\u4E00\u4E2A\u6295\u9012\u51FA\u53E3 `deliverToTrajectory`\uFF0C\n kind \u662F `plugin:dsh-serenity-hooks`\uFF08\u5DF2\u53D6\u8BC1\uFF0C\u975E\u63A8\u6F14\uFF09\u3002\u21D2 \u53F0\u8D26 = **\u754C\u9762\u76F4\u8BDD**\u3002\n \u26A0\uFE0F \u4E24\u6761\u8FB9\u754C\uFF1A\u2460 \u8FD9\u662F\u5F53\u524D\u5B9E\u73B0\u7684\u5C5E\u6027\u3001**\u4E0D\u662F\u534F\u8BAE\u4FDD\u8BC1**\uFF08IM \u82E5\u6539\u56DE kind:'user' \u5C31\u4F1A\u5F00\u59CB\u6536\u5F55\uFF0C\n \u90A3\u65F6\u8981\u91CD\u65B0\u88C1\u51B3\uFF09\uFF1B\u2461 `_im-logs/<channel>/` \u4ECD\u662F IM \u539F\u8BDD\u7684\u552F\u4E00\u771F\u76F8\u6E90 \u2014\u2014 \u4E0D\u6536\u5F55 \u2260 \u4E22\u4E86\u3002\n \u25B8 \u91C7\u96C6\u5931\u8D25\u53EA warn\u3001**\u4E0D\u963B\u65AD step**\uFF08\u53F0\u8D26\u662F\u65C1\u8DEF\u89C2\u6D4B\uFF0C\u4E0D\u662F\u88AB\u89C2\u6D4B\u5BF9\u8C61\u7684\u7EC4\u6210\u90E8\u5206\uFF09\u3002\n \u5224\u636E\u5168\u6587\uFF08\u542B\u53D6\u8BC1\u4E0E\u53D8\u5F02\u68C0\u9A8C\u8BBE\u8BA1\uFF09\u21D2 `src/trajectory/user-quotes.ts` \u5934\u6CE8\u91CA\u3002\n";
|
|
29
29
|
interface MsmFlag {
|
|
30
30
|
name: string;
|
|
31
31
|
type?: string;
|
|
@@ -50,15 +50,21 @@
|
|
|
50
50
|
* 本模块立项时留过一个开放项:「IM 消息是否也走 `agent/pre-step`、是否同为 `kind:'user'`,
|
|
51
51
|
* 会与界面直话混在一起」。**已取证,答案是不会混** —— 因为 IM 入站**根本不是** `kind:'user'`:
|
|
52
52
|
*
|
|
53
|
-
* -
|
|
54
|
-
*
|
|
55
|
-
*
|
|
53
|
+
* - 代码面:**两个 IM 渠道共用一个入站投递出口** `deliverToTrajectory`
|
|
54
|
+
* (`trajectory/session.ts:655`)—— 微信从 `im/bridge.ts` 进来、飞书从 `im/feishu-account.ts` 进来,
|
|
55
|
+
* 两者各自造"中立事件"后**都调到同一个** `handleInboundEvent`。该出口构造消息用的是
|
|
56
|
+
* `createUserMessage({ …, source: PLUGIN_SOURCE })` ⇒ **`kind:'plugin:dsh-serenity-hooks'`**。
|
|
57
|
+
* 🔴 判据落在**那个共用的投递函数**上,**不在渠道上** ⇒ 微信与飞书同结论,不是只讲微信。
|
|
58
|
+
* - 日志面(`dsh-session corpus raw --session skiff-weixin-…`,同一会话两种并存真读):
|
|
56
59
|
* 微信那条 = `{"kind":"plugin:dsh-serenity-hooks",…}`,正文含 `[serenity:weixin-manual-output]` 标记;
|
|
57
60
|
* 界面那条 = `{"kind":"user","rpcId":…,"clientTimeZone":…}`。
|
|
58
61
|
*
|
|
59
|
-
* ⇒ **按 `kind === 'user'` 过滤,天然只收界面直话,IM
|
|
60
|
-
* ⚠️
|
|
61
|
-
*
|
|
62
|
+
* ⇒ **按 `kind === 'user'` 过滤,天然只收界面直话,IM(微信/飞书)一条都进不来。**
|
|
63
|
+
* ⚠️ **两条边界,别替本模块说满**:
|
|
64
|
+
* ① 这是**当前实现的属性,不是协议保证**——宿主只承诺"user 位置上可有任意生产者的 kind",
|
|
65
|
+
* 没有任何东西保证 IM 永远是 `plugin:…`。若哪天 IM 改回 `kind:'user'`,本模块会**开始**收录它;
|
|
66
|
+
* 那时 `channel` 判别需 owner 重新裁决(那是 Q1 的范围问题,⛔ 不由本函数自己猜)。
|
|
67
|
+
* ② **`_im-logs/<channel>/` 仍是 IM 原话的唯一真相源**。本台账不收录 IM ≠ 那些话丢了。
|
|
62
68
|
*
|
|
63
69
|
* ## 🔴 两个「冒充 user」的生产者(结构性分不开,只能靠标记排除)
|
|
64
70
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shgroup/dsh-serenity-hooks",
|
|
3
|
-
"version": "1.113.
|
|
3
|
+
"version": "1.113.1",
|
|
4
4
|
"description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:12 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/localstore/container_admin;另两个 im-bridge/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": {
|