@jjh32456/dsh-longlive 1.6.7 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +70 -1508
  2. package/LICENSE +1 -1
  3. package/QUICKSTART.md +34 -13
  4. package/README.en.md +18 -7
  5. package/README.md +34 -9
  6. package/SPEC.md +5 -5
  7. package/cordis.patch.yml +23 -9
  8. package/docs/ANSWER-GUARD.md +92 -0
  9. package/docs/ARCHITECTURE.md +4 -3
  10. package/docs/AUTO-RECALL-WIRING.md +1 -1
  11. package/docs/AUTO-RECALL.md +15 -9
  12. package/docs/CONFIG.md +168 -35
  13. package/docs/ERRORS.md +17 -5
  14. package/docs/FAQ.md +7 -7
  15. package/docs/FEATURES.md +96 -28
  16. package/docs/MIGRATION-1.6.0.md +2 -2
  17. package/docs/OPERATIONS.md +6 -6
  18. package/docs/PANEL-INTEGRATION.md +6 -0
  19. package/docs/PRIVACY.md +88 -0
  20. package/docs/QUICKSTART.md +5 -5
  21. package/docs/README.en.md +4 -2
  22. package/docs/RESIDENT-WATCHER.md +1 -1
  23. package/docs/SESSION-WATCH.md +6 -6
  24. package/docs/TROUBLESHOOTING.md +4 -4
  25. package/package.json +47 -117
  26. package/runbook.md +2 -2
  27. package/scripts/backfill-auto-cards.mjs +98 -0
  28. package/scripts/install-surgery-task.ps1 +5 -2
  29. package/scripts/lib/session-watch-fixture.mjs +1 -1
  30. package/scripts/longlive-doctor.mjs +6 -0
  31. package/scripts/migrate-180.mjs +163 -0
  32. package/scripts/recall-index-build.mjs +128 -0
  33. package/scripts/session-watch-drill.mjs +1 -1
  34. package/scripts/surgery-run.cmd +1 -1
  35. package/scripts/unattended-surgery.ps1 +5 -2
  36. package/scripts/verify-card-anchors.mjs +138 -0
  37. package/src/actions/audit.js +125 -0
  38. package/src/actions/evidence.js +122 -0
  39. package/src/actions/fs.js +162 -0
  40. package/src/activity/index.js +760 -0
  41. package/src/activity/model.js +351 -0
  42. package/src/activity/store.js +644 -0
  43. package/src/activity/thinking.js +176 -0
  44. package/src/adapters/constants.js +11 -0
  45. package/src/adapters/engram/data/aliases.json +51 -0
  46. package/src/adapters/engram/data/policy.json +8 -0
  47. package/src/adapters/engram/data/routing-rules.json +546 -0
  48. package/src/adapters/engram/index.js +235 -0
  49. package/src/adapters/registry.js +315 -0
  50. package/src/answer/audit.js +193 -0
  51. package/src/answer/evidence.js +30 -0
  52. package/src/answer/guard.js +1370 -0
  53. package/src/answer/index.js +1067 -0
  54. package/src/answer/query.js +111 -0
  55. package/src/answer/second-hop.mjs +101 -0
  56. package/src/auto-truncate.js +1 -1
  57. package/src/config.js +171 -47
  58. package/src/deps.js +6 -4
  59. package/src/features.js +182 -6
  60. package/src/heartbeat.js +156 -23
  61. package/src/identity/handover.js +52 -1
  62. package/src/identity/index.js +13 -5
  63. package/src/identity/inject-position.js +2 -2
  64. package/src/index.js +97 -7
  65. package/src/lifecycle/gap-clocks.js +328 -0
  66. package/src/lifecycle/index.js +269 -0
  67. package/src/live.js +22 -2
  68. package/src/memory/activity-capture.js +229 -0
  69. package/src/memory/anchors.js +194 -0
  70. package/src/memory/audit-records.js +222 -0
  71. package/src/memory/auto-cards.js +401 -0
  72. package/src/memory/capture.js +442 -0
  73. package/src/memory/card-anchors.js +203 -0
  74. package/src/memory/conflicts.js +106 -0
  75. package/src/memory/decay.js +311 -0
  76. package/src/memory/distill.js +471 -0
  77. package/src/memory/event-index.js +917 -0
  78. package/src/memory/evidence-chain.js +295 -0
  79. package/src/memory/evidence.js +145 -0
  80. package/src/memory/filter-runner.js +1 -1
  81. package/src/memory/filter.js +5 -1
  82. package/src/memory/forget-v2.js +410 -0
  83. package/src/memory/forget.js +71 -0
  84. package/src/memory/frames-activation.js +247 -0
  85. package/src/memory/fts-query.js +174 -0
  86. package/src/memory/governance.js +604 -0
  87. package/src/memory/index.js +1 -0
  88. package/src/memory/l2-gate.js +169 -0
  89. package/src/memory/lock.js +121 -0
  90. package/src/memory/migrate.js +139 -0
  91. package/src/memory/recall-v2.js +223 -0
  92. package/src/memory/recall.js +65 -2
  93. package/src/memory/records.js +425 -0
  94. package/src/memory/retention.js +128 -0
  95. package/src/memory/review.js +124 -0
  96. package/src/memory/trust.js +88 -0
  97. package/src/memory/version-chain.js +264 -0
  98. package/src/memory/wal.js +137 -0
  99. package/src/memory/working-frame.js +516 -0
  100. package/src/metrics/classify.mjs +5 -3
  101. package/src/metrics/index.mjs +21 -1
  102. package/src/metrics/prestep-latency.mjs +300 -0
  103. package/src/metrics/store.mjs +25 -0
  104. package/src/policy-profile.js +18 -3
  105. package/src/recall/anaphora.mjs +87 -0
  106. package/src/recall/cards.mjs +7 -0
  107. package/src/recall/embedding.mjs +8 -8
  108. package/src/recall/entities.mjs +112 -0
  109. package/src/recall/index.js +235 -19
  110. package/src/recall/inject-order.mjs +10 -8
  111. package/src/recall/privacy.mjs +105 -16
  112. package/src/recall/recall-core.mjs +116 -10
  113. package/src/recall/shared-visibility.js +302 -0
  114. package/src/recall/time-normalizer.mjs +196 -0
  115. package/src/role/activation.js +191 -0
  116. package/src/role/attention.js +318 -0
  117. package/src/role/base.js +36 -0
  118. package/src/role/channels.js +423 -0
  119. package/src/role/index.js +425 -0
  120. package/src/role/interfaces.js +115 -0
  121. package/src/role/personality.js +370 -0
  122. package/src/role/readers.js +151 -0
  123. package/src/role/relationships.js +477 -0
  124. package/src/role/store.js +202 -0
  125. package/src/role/writeprotect.js +373 -0
  126. package/src/router/aliases.json +176 -25
  127. package/src/router/background/agent-runner.mjs +1 -1
  128. package/src/router/background/anchor.mjs +1 -1
  129. package/src/router/background/audit.mjs +2 -2
  130. package/src/router/background/budget-ledger.mjs +2 -2
  131. package/src/router/background/host-sim.mjs +1 -1
  132. package/src/router/background/memory.mjs +4 -4
  133. package/src/router/background/queue.mjs +1 -1
  134. package/src/router/background/retry.mjs +1 -1
  135. package/src/router/background/router.mjs +1 -1
  136. package/src/router/background/stream.mjs +1 -1
  137. package/src/router/background/tool-policy.mjs +1 -1
  138. package/src/router/design-headings.json +5 -5
  139. package/src/router/face/config.mjs +1 -1
  140. package/src/router/face/identity.mjs +3 -3
  141. package/src/router/judge.mjs +8 -7
  142. package/src/router/policies/generic.json +21 -4
  143. package/src/router/route.js +109 -22
  144. package/src/router/router.mjs +10 -6
  145. package/src/router/routing-rules.json +260 -445
  146. package/src/router/run-sim.mjs +8 -8
  147. package/src/router/runtime.js +23 -12
  148. package/src/router/service/board.mjs +95 -15
  149. package/src/router/service/config.mjs +5 -5
  150. package/src/router/service/context.mjs +1 -1
  151. package/src/router/service/hint.mjs +14 -0
  152. package/src/router/service/queue.mjs +1 -1
  153. package/src/router/service/service.mjs +27 -11
  154. package/src/router/shadow.mjs +4 -3
  155. package/src/surgery-recovery.js +2 -2
  156. package/src/tool-output.js +2 -2
  157. package/src/tools.js +39 -7
  158. package/src/truncate-visible.js +2 -2
  159. package/src/ui/actions.js +1312 -0
  160. package/src/ui/panel-api.js +367 -0
  161. package/src/ui/panel-auth.js +251 -0
  162. package/src/ui/panel-integrity.js +243 -0
  163. package/src/ui/routes-readonly.js +695 -0
  164. package/src/ui/routes.js +3 -0
  165. package/docs/DEV.md +0 -279
  166. package/docs/PRESENCE-BUS-WIRING.md +0 -491
  167. package/docs/PRESENCE-BUS.md +0 -694
  168. package/docs/SURGERY.md +0 -186
  169. package/scripts/mark-core-cards.mjs +0 -289
  170. package/scripts/pack.mjs +0 -392
  171. package/scripts/router-proposals.mjs +0 -386
  172. package/src/router/fixtures/M1.json +0 -16
  173. package/src/router/fixtures/M2.json +0 -16
  174. package/src/router/fixtures/M3.json +0 -20
  175. package/src/router/fixtures/M4.json +0 -20
  176. package/src/router/fixtures/M5.json +0 -45
  177. package/src/router/fixtures/M6.json +0 -53
  178. package/src/router/fixtures/M7.json +0 -46
  179. package/src/router/fixtures/S1.json +0 -20
  180. package/src/router/fixtures/S2.json +0 -23
  181. package/src/router/fixtures/S3.json +0 -20
  182. package/src/router/fixtures/S4.json +0 -34
  183. package/src/router/fixtures/S5.json +0 -43
  184. package/src/router/fixtures/S6.json +0 -47
  185. package/src/router/fixtures/T1.json +0 -23
  186. package/src/router/fixtures/T2.json +0 -16
  187. package/src/router/fixtures/T3.json +0 -19
  188. package/src/router/fixtures/T4.json +0 -16
  189. package/src/router/fixtures/X1.json +0 -17
  190. package/src/router/fixtures/X2.json +0 -20
  191. package/src/router/gen-design-headings.mjs +0 -107
  192. package/src/router/policies/owner-rulings-2026-11-03.json +0 -62
  193. package/test/auto-recall.test.mjs +0 -474
  194. package/test/auto-truncate.test.mjs +0 -931
  195. package/test/autobind.test.mjs +0 -385
  196. package/test/bus.test.mjs +0 -1572
  197. package/test/cli-guard.test.mjs +0 -198
  198. package/test/conclusion.test.mjs +0 -408
  199. package/test/config-schema.test.mjs +0 -204
  200. package/test/d6-output.test.mjs +0 -194
  201. package/test/d6.test.mjs +0 -395
  202. package/test/deps.test.mjs +0 -342
  203. package/test/doctor-setup.test.mjs +0 -297
  204. package/test/embedding-recall.test.mjs +0 -347
  205. package/test/feature-flags.test.mjs +0 -568
  206. package/test/filter-shadow.test.mjs +0 -170
  207. package/test/fixtures/baseline-0.8.0-registration.json +0 -556
  208. package/test/fixtures/d6-header-tools.json +0 -1
  209. package/test/fixtures/lock-child.mjs +0 -67
  210. package/test/fixtures/pre-step-container.mjs +0 -100
  211. package/test/fixtures/privacy-memory/topics/pii-unmarked.md +0 -9
  212. package/test/fixtures/privacy-memory/topics/secret-local-only.md +0 -11
  213. package/test/fixtures/profile-session-longlive-config.json +0 -20
  214. package/test/fixtures/proposal-cas-child.mjs +0 -66
  215. package/test/host-engine-status.test.mjs +0 -307
  216. package/test/hot-truncate.test.mjs +0 -1349
  217. package/test/identity-card-marker.test.mjs +0 -307
  218. package/test/identity-router/run.mjs +0 -721
  219. package/test/integration-pre-step.test.mjs +0 -553
  220. package/test/live.test.mjs +0 -1020
  221. package/test/maintenance-schedule.test.mjs +0 -538
  222. package/test/memory.test.mjs +0 -2828
  223. package/test/metrics.test.mjs +0 -478
  224. package/test/orchestrator.test.mjs +0 -266
  225. package/test/p1_probe.mjs +0 -97
  226. package/test/packaging.test.mjs +0 -182
  227. package/test/portability.test.mjs +0 -343
  228. package/test/rc4-regressions.test.mjs +0 -562
  229. package/test/rc5-regressions.test.mjs +0 -197
  230. package/test/rc6-chinese.test.mjs +0 -394
  231. package/test/router-1100/apply-off.test.mjs +0 -175
  232. package/test/router-1100/budget-reconcile.test.mjs +0 -215
  233. package/test/router-1100/config-context.test.mjs +0 -211
  234. package/test/router-1100/helpers.mjs +0 -129
  235. package/test/router-1100/hint-envelope.test.mjs +0 -150
  236. package/test/router-1100/lock-crossproc.test.mjs +0 -206
  237. package/test/router-1100/proposal-cas-crossproc.test.mjs +0 -184
  238. package/test/router-1100/router-apply.test.mjs +0 -372
  239. package/test/router-1100/router-fixb.test.mjs +0 -602
  240. package/test/router-1100/router-proposals.test.mjs +0 -405
  241. package/test/router-1100/router-queue-lease-wal.test.mjs +0 -355
  242. package/test/router-1100/router-security-cr.test.mjs +0 -333
  243. package/test/router-1100/service-lifecycle.test.mjs +0 -220
  244. package/test/router-1100/tools-contract.test.mjs +0 -164
  245. package/test/router-1100/turn-reflect-tick.test.mjs +0 -89
  246. package/test/router-1100/v6-contract.test.mjs +0 -158
  247. package/test/router-1100/v6b-contract.test.mjs +0 -293
  248. package/test/router-1100/v6c-contract.test.mjs +0 -249
  249. package/test/router-1100/wal-rotation.test.mjs +0 -375
  250. package/test/router-1100/wp1-config.test.mjs +0 -170
  251. package/test/router-1100/wp1-default-off.test.mjs +0 -77
  252. package/test/router-1100/wp1-model-status.test.mjs +0 -90
  253. package/test/router-1100/wp1-status.test.mjs +0 -220
  254. package/test/router-1100/wp1-tools.test.mjs +0 -146
  255. package/test/router-1100/wp5-cli.test.mjs +0 -240
  256. package/test/router-1100/wp5-model-auto.test.mjs +0 -418
  257. package/test/router-1100/wp6-merge.test.mjs +0 -386
  258. package/test/router-1100/wp6-wake.test.mjs +0 -502
  259. package/test/router-background/audit.test.mjs +0 -37
  260. package/test/router-background/budget-ledger.test.mjs +0 -330
  261. package/test/router-background/cross-process.test.mjs +0 -222
  262. package/test/router-background/fixtures/cross-child.mjs +0 -85
  263. package/test/router-background/fixtures/real-shapes.mjs +0 -239
  264. package/test/router-background/router.test.mjs +0 -1044
  265. package/test/router-background/stream-retry.test.mjs +0 -358
  266. package/test/router-background/tool-agent.test.mjs +0 -384
  267. package/test/router-face/bridge.test.mjs +0 -169
  268. package/test/router-face/face.test.mjs +0 -316
  269. package/test/router-failclosed.test.mjs +0 -466
  270. package/test/router-identity.test.mjs +0 -384
  271. package/test/router-l1-l2.contract.test.mjs +0 -1075
  272. package/test/router-memory-tools.test.mjs +0 -262
  273. package/test/router-policy.test.mjs +0 -225
  274. package/test/router-runtime.test.mjs +0 -438
  275. package/test/router-shadow.test.mjs +0 -287
  276. package/test/router.test.mjs +0 -903
  277. package/test/run-rc.mjs +0 -299
  278. package/test/run.mjs +0 -2469
  279. package/test/safety-defaults.test.mjs +0 -179
  280. package/test/seeded-load.test.mjs +0 -436
  281. package/test/session-original.test.mjs +0 -338
  282. package/test/surgery-recovery.test.mjs +0 -936
  283. package/test/t7_drive.mjs +0 -151
  284. package/test/tool-output.test.mjs +0 -393
  285. package/test/tool-schema.test.mjs +0 -177
  286. package/test/tools_contract.test.mjs +0 -716
  287. package/test/truncate-visible.test.mjs +0 -1150
  288. package/test/ui-flags.test.mjs +0 -477
  289. package/test/v4-hardening.test.mjs +0 -427
package/docs/CONFIG.md CHANGED
@@ -1,6 +1,6 @@
1
- # CONFIG.md — @jjh32456/dsh-longlive(久视)配置手册
1
+ # CONFIG.md — @jjh32456/dsh-longlive(久视)配置手册
2
2
 
3
- 适用版本:**1.6.5**(以包内 `package.json` 的 `version` 为准)。所有默认值以该源码树为准。
3
+ 适用版本:**1.8.0**(以包内 `package.json` 的 `version` 为准)。所有默认值以该源码树为准。
4
4
  读者:会改 YAML、会看日志,但没参与开发的人。
5
5
 
6
6
  ---
@@ -21,6 +21,40 @@ YAML 路径建议一律用正斜杠(例如 `<memory-root>/topics` 这种写法
21
21
 
22
22
  ---
23
23
 
24
+ ## 0.5 1.8.0 默认值总览(全部功能默认开;显式 false 才关)
25
+
26
+ 1.8.0 起 `FEATURE_DEFAULTS` 与 `Config({})` 的默认值是“功能默认开”。任何 `enabled` 开关都遵循同一语义:
27
+ **未写 → true;只有字面 `false` 才关闭**(旧版“缺省为 false、写 true 才开”的写法全部作废)。安全/灰度类除外,见下表。
28
+
29
+ | 默认开(opt-out 写法) | 默认值 | 关闭 |
30
+ |---|---|---|
31
+ | `autoRecall.enabled` | `true` | `autoRecall: { enabled: false }` |
32
+ | `identityCard.enabled` | `true` | `identityCard: { enabled: false }` |
33
+ | `presenceBus.enabled` | `true` | `presenceBus: { enabled: false }` |
34
+ | `sharedBrain.activity.enabled` | `true` | `sharedBrain.activity: { enabled: false }` |
35
+ | `sharedBrain.thinkingInjection` | `true` | `sharedBrain: { thinkingInjection: false }` |
36
+ | `autoMaintenance.enabled` | `true` | `autoMaintenance: { enabled: false }` |
37
+ | `autoConclusion` | `true` | `autoConclusion: false` |
38
+ | `memoryV2.enabled` / `role.enabled` / `answerGuard.enabled` | `true`(1.8.0 既有) | 各自 `enabled: false` |
39
+ | `d2.enabled` / `d6.enabled` | `true` | `d2: { enabled: false }` / `d6: { enabled: false }` |
40
+ | `routerFace.enabled` | `true` | `routerFace: { enabled: false }` |
41
+ | `routerEnabled` / `routerSharedBoard` / `routerWakeEnabled` | `true` | 对应键 `false` |
42
+ | `workers.enabled` | `true` | `workers: { enabled: false }` |
43
+ | `autoTruncate.enabled` | `true`(仍默认 `mode: dryrun`,不直接切) | `autoTruncate: { enabled: false }` |
44
+ | `embedding.enabled` | `true`(本地模型缺失时静默退关键词召回) | `embedding: { enabled: false }` |
45
+
46
+ **保持原默认值的清单(安全/灰度,刻意不翻)**:`answerGuard.gate.enabled=false`(信心闸灰度;审计与注入仍随 answerGuard 开)、`routerApplyEnabled=false`(批准后写工作区的第三道闸)、`strictMemoryRoot=false`(兼容宿主路径推导)、`routerRuntime='off'`(1.6.0 安全默认;显式 `shadow`/`on` 才记录/拦截)、`d6.dryRun=false` 之外的工具面细节不变、`autoTruncate.mode='dryrun'`。
47
+
48
+ ```yaml
49
+ # 例:保留默认全开,只关掉两个不想要的
50
+ session-longlive:
51
+ config:
52
+ autoRecall: { enabled: false }
53
+ workers: { enabled: false }
54
+ ```
55
+
56
+ ---
57
+
24
58
  ## 1. 配置键总表
25
59
 
26
60
  ### 1.1 记忆库与路径
@@ -44,7 +78,7 @@ autoTruncate:
44
78
 
45
79
  | 键 | 类型 | 默认值 | 合法值 / 范围 | 改了要重启? | 风险与说明 |
46
80
  |---|---|---|---|---|---|
47
- | `enabled` | boolean | `false` | `true` / `false` | 是 | 1.6.0 起默认关闭。`false` 时 `evaluate` 在写日志之前就早退(`disabled`),连日志行都没有(`src/auto-truncate.js:390-443` 的早退分支) |
81
+ | `enabled` | boolean | `true` | `true` / `false` | 是 | 1.8.0 起默认开启(仍默认 `mode: dryrun`,只规划不直接切会话);显式 `false` 时 `evaluate` 在写日志之前就早退(`disabled`) |
48
82
  | `mode` | string | `dryrun` | `log` \| `dryrun` \| `request` | 是 | 1.6.0 起默认 `dryrun`(只规划不写会话)。**没有 `on`**。写 `on` → `AUTO_BAD_MODE`,整条 entry 不激活。旧值 `apply` 会被改写成 `request` 并记 `modeAlias:"apply->request"`(`src/auto-truncate.js:64,117-125`) |
49
83
  | `tokensThreshold` | integer | `300000` | ≥ 1 | 是 | 阈值比较是 `estimate.tokens >= tokensThreshold`(`src/auto-truncate.js:435`)。`tokens` 是**启发式估算**:对 `MESSAGE_TYPES` 事件的 data JSON 取字符数 ÷ 4(`src/truncate-visible.js:80`),不是宿主计费 token,两者偏差**待核实**。阈值压到几千只适合演练 |
50
84
  | `minTurns` | integer | `12` | ≥ 1 | 是 | 条件对 turn 数是**严格大于**:`estimate.turns > minTurns`(同 435 行)。`minTurns: 1` 表示第 2 个 turn 起才可能触发 |
@@ -56,10 +90,7 @@ autoTruncate:
56
90
 
57
91
  补充:
58
92
 
59
- - **发布默认值(1.4.0 起,1.6.0 收紧代码默认)**:包内 `cordis.patch.yml` 的
60
- `session-longlive.config` 显式写了 `autoTruncate: { enabled: false, mode: dryrun }`;1.6.0
61
- 起 `src/auto-truncate.js` 的代码回退默认也改为 `enabled: false` / `mode: dryrun`。所以无论
62
- 是发布配置还是手写配置漏掉该块,自动截断都默认关闭;想开启必须显式写 `enabled: true`。
93
+ - **发布默认值(1.8.0 起)**:包内 `cordis.patch.yml` 显式写 `autoTruncate: { enabled: true, mode: dryrun }`,代码回退默认也是 `enabled: true` / `mode: dryrun`。所以缺省即开启,但仍只 dryrun、不改会话;要关显式写 `enabled: false`。
63
94
  - `mode: request` 只写 `<memoryRoot>/.longlive/logs/auto-truncate.request.json`,**不碰会话日志**;
64
95
  真正改写会话的是宿主外的 `scripts/auto-truncate-run.ps1` + `scripts/truncate-cli.mjs`。
65
96
  - `mode: dryrun` 会真的跑一遍 `truncateVisibleSession({dryRun:true})`(读+规划+报告),但不写盘;
@@ -81,7 +112,7 @@ autoTruncate:
81
112
  |---|---|---|---|---|---|
82
113
  | `keepEvents` | integer | `20000` | ≥ 1 | 是 | 只作为 `session_truncate` 的默认 `keepEvents`(`src/index.js:199`)。切点还会被"第一条可见消息"夹住,见 `planTruncation` `src/truncate.js:103-152` |
83
114
  | `recentWriteWindowMs` | integer | `60000` | ≥ 0 | 是 | 最近写窗口;窗口内拒绝截断(`SESSION_RECENT_WRITE`)。runner 走 CLI 时显式传 0,因为它假定宿主已退出 |
84
- | `heartbeatMs` | integer | `15000` | 有限正数;`0` 关闭自动写 | 是 | 只影响 live 注册表心跳,**不影响**自动截断:`onTurnEnd` 在 `enabled` 门之前触发(`src/heartbeat.js:169`)。给 1 这种极小值 = 高频写盘,别这么干;无上限校验 |
115
+ | `heartbeatMs` | integer | `15000` | 有限正数;`0` 只关定时心跳与工具调用触发的写 | 是 | `0` **不关 turn 边界状态机**:turn/start 与 turn/end 仍维护 live 行 state/turn;也不影响自动截断:`onTurnEnd` 在 `enabled` 门之前触发(`src/heartbeat.js:169`)。给 1 这种极小值 = 高频写盘,别这么干;无上限校验 |
85
116
  | `recoverOnStart` | boolean | `true` | `true` / `false` | 是 | 启动时扫 `.truncate-visible-inflight.json` 并收尾/回滚(`src/index.js:230-236` + `sweepInflight`)。只有排障时才建议关 |
86
117
  | `originalFetchMaxBytes` | integer | `65536` | 1024..4194304(超范围夹回) | 否 | 仅 `session_original` 的单次返回上限(UTF-8 字节);超出按 `offset` 分页。隐私门先扫全量,调大它不会绕过隐私拦截 |
87
118
  | `touchLiveSession` / `now` / `defineTool` | 内部 | — | — | 是 | 测试注入缝(`src/index.js:160,193-195,205`),不是给部署用的稳定配置;**待核实**未来版本是否保留 |
@@ -129,14 +160,14 @@ patch 关掉,引擎加载失败时 `entry.js` 自动回退 stock,`/compact`
129
160
  剩余上下文。1.6.3 的 30k 触发 + 6 轮保留在长对话里几乎每轮一刀;1.6.4 改成 300k 触发 +
130
161
  保留 4 轮,切刀间隔拉长到十几轮,缓存命中率上去、账单下来。
131
162
 
132
- ### 1.4b D2 工具输出裁剪 `d2`(默认关闭)
163
+ ### 1.4b D2 工具输出裁剪 `d2`(默认开启)
133
164
 
134
- 配置形态是嵌套对象;只有 `d2.enabled: true` 才挂 `tools/post-execute`,默认整段不存在时
165
+ 配置形态是嵌套对象;1.8.0 起默认开启(缺省即挂 `tools/post-execute`);只有显式 `d2.enabled: false` 才不挂。
135
166
  一切保持原样。
136
167
 
137
168
  ```yaml
138
169
  d2:
139
- enabled: false
170
+ enabled: true
140
171
  maxInlineChars: 4096
141
172
  ```
142
173
 
@@ -160,14 +191,14 @@ d2:
160
191
  - **回退**:`d2.enabled: false`(或删除整个 `d2` 块)后重启;已归档文件不动会话,可保留
161
192
  取证或手工删除。
162
193
 
163
- ### 1.4c D6 工具面裁剪 v1 `d6`(默认关闭)
194
+ ### 1.4c D6 工具面裁剪 v1 `d6`(默认开启)
164
195
 
165
- 只有 `d6.enabled: true` 才注册 `tool_search` 与两个 listener;默认整段不存在时工具面与
196
+ 1.8.0 起默认开启:缺省即注册 `tool_search` 与两个 listener;只有显式 `d6.enabled: false` 时工具面与
166
197
  1.4.0 完全一致。
167
198
 
168
199
  ```yaml
169
200
  d6:
170
- enabled: false
201
+ enabled: true
171
202
  dryRun: false
172
203
  log: true
173
204
  keepTools: []
@@ -200,7 +231,7 @@ d6:
200
231
  - **回退**:`d6.enabled: false`(或删除整个 `d6` 块)后重启;没有数据迁移。运行中选择、
201
232
  `restrict()` 或组装任一步抛错、或裁剪后工具集为空,也一律回到全量工具面,不阻断会话。
202
233
 
203
- ### 1.5 面板(@jjh32456/dsh-longlive-panel@0.2.5,独立可选插件)
234
+ ### 1.5 面板(@jjh32456/dsh-longlive-panel@1.8.0,独立可选插件)
204
235
 
205
236
  面板的配置**不继承**上面插件的 `memoryRoot`,它有自己的两个键(`src/server.js:2103-2109`):
206
237
 
@@ -209,7 +240,7 @@ d6:
209
240
  | `memoryRoot` | string | `~/.dsh/longlive-memory` | 目录 | 是 | 面板只读这个目录。插件配了显式根(本机示例 `<memory-root>`)而面板没配 → **面板显示 0 卡**(它读的是默认空目录),不是记忆丢了 |
210
241
  | `sessionsRoot` | string | `~/.dsh/sessions` | 目录 | 是 | "截断记录"页读这里的 `<会话目录>/truncate.json`、`truncate-visible.json`(宿主可见对话截断账本)和 `backups.json`(并 stat 账本里记的备份文件);两份截断账合并后按时间倒序列出。指错 → 该页空白 |
211
242
 
212
- 面板也可以用环境变量 `DSH_LONGLIVE_MEMORY_ROOT` / `DSH_MEM` 覆盖 `memoryRoot`。0.2.5 是配套本版的文案与 G1/G2/G4 修复版;本机 `desktop` profile 此前装的是 0.2.4(profile `package.json` 的 `@jjh32456/dsh-longlive-panel` 依赖 + bundles 列表,`node_modules` 有 0.2.4),升级到 0.2.5 的装法/验证/卸载见包内 `INSTALL.md`,装完或改配置后必须重启宿主。
243
+ 面板也可以用环境变量 `DSH_LONGLIVE_MEMORY_ROOT` / `DSH_MEM` 覆盖 `memoryRoot`。1.8.0 是配套本版的「六层视图活体行排序 + 已归档折叠(按需物化)」与外部评审 v1 回执修复版;本机 `desktop` profile 之前装的是旧版面板,升级到 1.8.0 的装法/验证/卸载见包内 `INSTALL.md`,装完或改配置后必须重启宿主。
213
244
 
214
245
  **1.6.0 新增:插件自带的设置页伴侣**(不是上面的面板包)。`package.json` 的 `./client` +
215
246
  `src/ui/*` 在宿主设置页的插件行注册 `plugins.row.config`,标题「久视 · 功能开关」,提供 7 个
@@ -219,14 +250,67 @@ slot key 为 `@jjh32456/dsh-longlive#session-longlive`(包名已改,row id
219
250
  的 profile 不注册 `/api/longlive/flags`,插件照常加载。`workers.enabled` 不在 7 个面板开关里,
220
251
  需要直接改配置。
221
252
 
222
- ### 1.6 Router 1.1.0(默认关闭,50 键)
253
+ ### 1.5b 共享大脑活动流 `sharedBrain.activity`(默认开启)
254
+
255
+ ```yaml
256
+ sharedBrain:
257
+ activity:
258
+ enabled: true # 默认开启;显式 false 关闭(opt-out);与 presenceBus 无关
259
+ injectMaxChars: 300 # 每轮注入总字符上限(含固定头尾,60–2000)
260
+ maxItems: 5 # 每轮最多注入条数(1–10)
261
+ ```
262
+
263
+ | 键 | 类型 | 默认值 | 合法值 / 范围 | 改了要重启? | 风险与说明 |
264
+ |---|---|---|---|---|---|
265
+ | `enabled` | boolean | `true` | `true` / `false` | 是 | 默认开启(1.8.0 产品默认):按事件写活动行(同 key ≤1 条/10s 节流)到 `<memoryRoot>/.longlive/board/activity.jsonl`;`agent/pre-step` 只注入 `seq > lastSeenSeq` 的其他会话活动。显式 `false` 关闭,关闭时不写盘、不注入。失败静默,不影响 turn |
266
+ | `injectMaxChars` | number | `300` | 60–2000 | 是 | 渲染后的整条提示(含 `【共享大脑活动】` 头与 `【活动结束】` 尾)不超过此值;预算不够时先裁条目标题、再少注入几条 |
267
+ | `maxItems` | number | `5` | 1–10 | 是 | 最多条数;blocked 优先 |
268
+
269
+ - 判重:同会话最近 10 条内 `key` 相同或文本相似度 ≥0.8 → 合并,`count+1`、`last_at` 更新、正文保留首条。
270
+ - 蒸馏:同 key 连续 3 次(`count`)或累计 10 次 → 旧行 `archived:true`,新增一条
271
+ `阶段:<key>(N 次,最近 …)`。500 条窗口外的最旧行归档到 `activity-YYYYMM.jsonl`。
272
+ - 每会话游标:`<memoryRoot>/.longlive/bridge/<sessionId>.activity.json`(`lastSeenSeq`)。
273
+ 与 A1 结论桥的 `<sessionId>.json` 分开,互不覆盖;删掉该文件只会让该会话下次重新看到最近 5 条。
274
+ - 隐私门:写盘前与注入前都调 `src/recall/privacy.mjs`;`local_only` 的活动不写、不注入。
275
+ - 关闭方法(opt-out):`sharedBrain.activity.enabled: false` 并重启;关闭时不注册
276
+ `session/event` / `agent/pre-step` 两个 hook、不建活动板、不注入,行为等同 1.7.4 的共享大脑关闭态。
277
+ 已写文件保留,可手动删除。默认开启但数据只写本地 `<memoryRoot>/.longlive/board/`,不发网络。
278
+ - 面板:活动流的「谁在干什么」页不在旧版面板(0.2.6)内(由面板侧后续版本提供);
279
+ longlive 包只负责写盘与增量注入。
280
+
281
+ ### 1.5c 共享大脑 thinking 摘要注入 `sharedBrain.thinkingInjection`(默认开启,1.8.0)
282
+
283
+ ```yaml
284
+ sharedBrain:
285
+ activity:
286
+ enabled: true # 活动流默认开启;thinking 摘要依赖活动流写侧
287
+ thinkingInjection: true # 1.8.0 起默认开启;显式 false 关闭
288
+ ```
289
+
290
+ | 键 | 类型 | 默认值 | 合法值 / 范围 | 改了要重启? | 风险与说明 |
291
+ |---|---|---|---|---|---|
292
+ | `thinkingInjection` | boolean | `true` | `true` / `false` | 是 | 默认开启(1.8.0 产品默认):开启后写侧把本会话 assistant 的可见 `reasoning`/`thinking` 段压成一行摘要(首句或 ≤200 字符,确定性规则,不新增模型调用),写为活动板 `kind:"thinking"` 行;每会话每 turn 最多 1 条。注入侧给其他会话加「【共享大脑 · 最近在思考(已有,新会话别重复)】」段,每事件一行「第 N 轮:<摘要>」,单次最多 5 行、每行 ≤200 字符,只带未消费(`seq > lastSeenSeq`)的新增。 |
293
+
294
+ - opt-out 语义(thinking 自身):`thinkingInjection=false` 时**不写 thinking 行、不注入 thinking 段**;
295
+ 活动流本体仍按 1.8.0 默认开启(普通活动写/注入不受影响)。1.8.0 起默认 `true`;要关就显式写 false 并重启。
296
+ `thinkingInjection=true` 但 `activity.enabled=false` 时启动仅 warn 并跳过(thinking 依赖活动流写侧)。
297
+ - 不泄原文:只落摘要(首句/≤200 字符),不保存、不回写原始 thinking 全文,也不改会话日志;
298
+ 摘要为空(无可见 reasoning)时不写行。
299
+ - 安全:写盘前与注入前都过现有隐私门;注入前再做 payload-safety 检查(空/超 200/控制字符/
300
+ 伪造固定围栏标记的摘要直接丢弃),并沿用活动流的 `neutralizeEnvelope` 防围栏逃逸。
301
+ - 游标:复用活动流的 `<memoryRoot>/.longlive/bridge/<sessionId>.activity.json`(`lastSeenSeq`),
302
+ 注入成功后推进;同一条 thinking 不会重复注入,本会话自己的思考不回灌(自回声抑制)。
303
+ - 回退:`sharedBrain.thinkingInjection: false` 并重启;已写 thinking 行保留在活动板,可手动删除,
304
+ 不设开关也不影响已有活动流。
305
+
306
+ ### 1.6 Router 1.1.0(默认开启,50 键)
223
307
 
224
308
  全部键都在插件 `config` 里,`routerEnabled` 只认字面 `true`;改完重启宿主才生效。
225
309
  `false` 时 22 个工具不变、不建 `.longlive/router/`;打开后先多 4 个 `router_*`
226
310
  (22→26),再开 `routerProposalEnabled` 多 3 个(26→29)。
227
311
 
228
312
  ```yaml
229
- routerEnabled: false # 总开关;字面 true 才生效
313
+ routerEnabled: true # 1.8.0 默认开启;显式 false 才关
230
314
  routerProvider: deepseek-official
231
315
  routerModel: auto # 显式 id / 宿主 currentSelection / listModels 首个非 preview
232
316
  routerTickMs: 60000
@@ -246,7 +330,7 @@ routerVaultDir: '' # 空 = <memoryRoot>/.longlive/router;
246
330
  routerAgentTimeoutMs: 15000
247
331
  routerDisposeTimeoutMs: 2000
248
332
  routerFlowSlice: 1200
249
- routerSharedBoard: false
333
+ routerSharedBoard: true
250
334
  routerHintScope: root # root | all
251
335
  routerHintTokens: 700 # clamp 到 200–700
252
336
  routerReflectHintTokens: 150 # clamp 到 50–150
@@ -256,9 +340,9 @@ routerInjectMaxPerSessionPerDay: 24
256
340
  routerInjectMaxTotalTokens: 12000
257
341
  routerLiveRowsMax: 128
258
342
  routerBoardMaxSessions: 5
259
- routerProposalEnabled: false # 第二档:提案三工具
343
+ routerProposalEnabled: true # 第二档:提案三工具(默认开启)
260
344
  routerApplyEnabled: false # 第三道闸:真正写盘
261
- routerL4MergeEnabled: false # 相邻小写合并
345
+ routerL4MergeEnabled: true # 相邻小写合并(默认开启)
262
346
  routerProposalMaxChars: 4000
263
347
  routerProposalsPerSessionHour: 6 # 子代理固定 3/h,不读此键
264
348
  routerMaxProposals: 200
@@ -267,7 +351,7 @@ routerLeaseRenewMax: 2 # maxHold = ttl + renewals × ttl/2 = 24
267
351
  routerLeaseWaitTimeoutMs: 300000
268
352
  routerBlockedOnUserTtlMs: 86400000
269
353
  routerProposalTtlH: 72
270
- routerWakeEnabled: false
354
+ routerWakeEnabled: true
271
355
  routerWakeCooldownMs: 600000
272
356
  routerWakeDailyQuota: 20
273
357
  routerWakeLogMaxBytes: 33554432
@@ -313,7 +397,7 @@ routerSnapshotKeepDays: 30
313
397
  只读读取用 `node scripts/metrics-read.mjs --memory-root <root>`,或直接读文件;
314
398
  `router_status` 的 `ledger` 字段是同一份汇总。
315
399
 
316
- ### 1.8 语义召回 `embedding`(默认关闭)
400
+ ### 1.8 语义召回 `embedding`(默认开启;模型缺失静默退关键词)
317
401
 
318
402
  `autoRecall` 的顶层开关之外,另有一个 `embedding` 对象;它不属于三块 feature flag,
319
403
  只在 `autoRecall.enabled: true` 且 `config.embedding` 是对象时透传给 auto-recall。
@@ -331,13 +415,13 @@ routerSnapshotKeepDays: 30
331
415
  `autoRecall.budgetTokens` 的硬上限是 2000(超出会被夹回),保证单轮注入不超过 2K token。
332
416
  完整行为与 recall-log 行格式见 [AUTO-RECALL.md](AUTO-RECALL.md)。
333
417
 
334
- ### 1.9 routerFace(v1 后台面,默认关闭,8 键)
418
+ ### 1.9 routerFace(v1 后台面,默认开启,8 键)
335
419
 
336
420
  嵌套对象。`enabled` 只认字面 `true`;关闭时零定时器、零目录、零 IO。
337
421
 
338
422
  ```yaml
339
423
  routerFace:
340
- enabled: false # 总开关;还需 routerEnabled + routerSharedBoard 才能把留话递到前台
424
+ enabled: true # 默认开启;还需 routerEnabled + routerSharedBoard 才能把留话递到前台;显式 false 关闭
341
425
  tickMs: 60000 # 30000–900000
342
426
  dryRun: true # true = 只写 journal,不调 LLM、不写 outbox
343
427
  dailyTokenBudget: 50000 # input+output;超了自动停(state=stopped, reason=daily-budget)
@@ -349,7 +433,7 @@ routerFace:
349
433
 
350
434
  | 键 | 类型 | 默认值 | 合法值 / 范围 | 风险与说明 |
351
435
  |---|---|---|---|---|
352
- | `enabled` | boolean | `false` | `true` / `false` | false 时 `createRouterFace` 都不调用;改完重启宿主才生效 |
436
+ | `enabled` | boolean | `true` | `true` / `false` | 默认开启;显式 false 时 `createRouterFace` 不调用;改完重启宿主才生效 |
353
437
  | `tickMs` | integer | `60000` | 30000–900000 | 同一窗口内 journal 按 `tickKey` 幂等;窗口过短会提高调用频率 |
354
438
  | `dryRun` | boolean | `true` | `true` / `false` | 首次上真机建议先跑 dry-run 看上下文和 journal,再关掉 |
355
439
  | `dailyTokenBudget` | integer | `50000` | 1000–5000000 | 只记 LLM usage,不估算上下文;超预算停到当天结束 |
@@ -363,26 +447,75 @@ routerFace:
363
447
  `<memoryRoot>/IDENTITY.md` 是前后台共用身份文件(只读,缺省用内置默认),
364
448
  不要在 hint 里改它;bridge 文件是 `.longlive/bridge/router-outbox.jsonl`。
365
449
 
366
- ### 1.10 子会话扇出 `workers`(默认关闭)
450
+ ### 1.10 子会话扇出 `workers`(默认开启)
367
451
 
368
- `worker_spawn` / `worker_status` / `worker_kill` 仍在 22 个默认工具里,但 1.6.0 起每次调用
369
- 先看 `workers.enabled`:缺省或 `false` 时直接返回
370
- `{ ok:false, status:"unavailable", available:false, message:"unavailable: worker_* 默认关闭…" }`,
371
- 不会派发任何子会话。只有显式打开才走宿主 `subagents` 服务。
452
+ `worker_spawn` / `worker_status` / `worker_kill` 仍在 22 个默认工具里。1.8.0 起默认开启,缺省即走宿主 `subagents` 服务;只有显式 `workers.enabled: false` 时返回 unavailable、不派发子会话。
372
453
 
373
454
  ```yaml
374
455
  config:
375
456
  workers:
376
- enabled: true # 默认 false;打开后才能派子会话
457
+ enabled: true # 1.8.0 默认开启;显式 false 关闭后才能派子会话
377
458
  ```
378
459
 
379
460
  | 键 | 类型 | 默认值 | 合法值 | 说明 |
380
461
  |---|---|---|---|---|
381
- | `workers.enabled` | boolean | `false` | `true` / `false` | 关闭时三个 worker 工具都返回 unavailable;打开后仍受宿主 `subagents` 服务是否存在约束 |
462
+ | `workers.enabled` | boolean | `true` | `true` / `false` | 默认开启;显式关闭时三个 worker 工具都返回 unavailable;开启后仍受宿主 `subagents` 服务是否存在约束 |
382
463
 
383
- 整块不在 `src/config.js` 的 Config schema 里(保持 schema 面不变),属于透传配置;Cordis
464
+ 整块不在 `src/config.js` 的 90 节点 Config schema 里(1.6.0 为 80;1.6.4 的 `hotTruncate`
465
+ 块 +5,本次活动流 `sharedBrain.activity` 再 +5;透传键保持 schema 面稳定),属于透传配置;Cordis
384
466
  的 schema 校验保留未知键,运行时由 `src/tools.js` 的注册包装读取。
385
467
 
468
+ ### 1.11b AutoCard / sidecar 签名与信任边界(1.8.0)
469
+
470
+ AutoCard(`.longlive/index/cards.jsonl`)与精卡回链 sidecar(`.longlive/index/card-anchors.jsonl`)
471
+ 写入时用宿主 key 做逐行 HMAC;读取时:无 key、签名不符、链断、重放/删行/插行、重复 rel
472
+ 一律 fail-closed(不进入 recall,并写 `card-audit.jsonl`)。
473
+
474
+ key 解析顺序(写入与读取一致):
475
+
476
+ 1. 宿主注入环境变量 `DSH_LONGLIVE_AUDIT_KEY`(推荐,不落盘);
477
+ 2. 宿主注入的 `auditKey`;
478
+ 3. fallback `<memoryRoot>/.longlive/.hostkey`(首启生成,权限 0600,**明文**)。
479
+
480
+ **信任根 = L0 会话日志 + 宿主 key**。`events.db` 是派生索引、本身不签名;AutoCard 的
481
+ `anchor.digest` 用 `turnDigest` 与 L0 校活,`scripts/verify-card-anchors.mjs` 可离线复核
482
+ live/stale/missing。AutoCard 注入的 title/terms 在读取时从 events.db 的 EventRecord **重新派生**,
483
+ 不信任卡片文件内容;人工精卡保留原文。
484
+
485
+ **残余风险(如实说明)**:同 OS 用户能读 `.hostkey`,因此本机同用户恶意程序可以伪造签名;
486
+ HMAC 只能防跨进程误写、意外损坏和未持 key 的伪造,**不防本用户裸 fs 攻击**。需要更强隔离时
487
+ 用环境变量注入 key,并把记忆根放到受限账户/独立主机。
488
+
489
+ **信任根与轮换**:信任根 = 宿主进程写入的 `events.db` + L0 会话日志 + 宿主 key;`events.db`
490
+ 本身不签名,同用户直接改写 DB/L0 属 OS 级边界,不宣称防裸 fs。轮换 key 后旧卡签名失效,
491
+ 需运行 `node scripts/backfill-auto-cards.mjs --resign` 重签并重跑 sidecar 回填;不重签时旧卡
492
+ 一律 untrusted、不进入 recall。
493
+
494
+ ### 1.11 身份与隐私(1.8.0)
495
+
496
+ **身份默认中性**:1.8.0 起内置身份不含任何人名/角色/称呼;身份由 `<memoryRoot>/IDENTITY.md`
497
+ (只读)定义,文件不存在时使用中性默认文本,不自动创建、不自动改写。蒸馏的 `who` 字段默认空,
498
+ 由用户显式配置注入,不再把内置称呼当默认值。
499
+
500
+ | 键 | 类型 | 默认值 | 合法值 | 说明 |
501
+ |---|---|---|---|---|
502
+ | `identityCard.path` | string | `<memoryRoot>/IDENTITY.md` | 相对/绝对路径;支持 `<memoryRoot>` 占位 | 前后台共用的身份文件;只读 |
503
+ | `identityCard.maxChars` | integer | `800` | 120–4000 | 开机卡注入上限;不改文件内容 |
504
+
505
+ ```yaml
506
+ config:
507
+ identityCard:
508
+ path: <memoryRoot>/IDENTITY.md # 默认值;按需要改
509
+ maxChars: 800
510
+ ```
511
+
512
+ - **隐私门**:发布包不含个人姓名、本机绝对路径、记忆库或会话日志;打包时
513
+ 仓库内发版门脚本(**npm 包不含**)`scripts/scan-abs-paths.mjs` 扫描 blocker(绝对路径/个人目录名等),**计数必须为 0 才发版**。
514
+ - **共享大脑 thinking**:1.8.0 默认开启(显式 false 关闭);开启后只注入其他会话摘要、不写原文、不进日志,
515
+ `local_only` 内容不写不注入。配置键与开关以本文档「共享大脑 thinking」段为准
516
+ (1.8.0 同步补入;未补入前以发布说明为准)。
517
+ - 用户侧说明与升级注意见 [PRIVACY.md](PRIVACY.md)。
518
+
386
519
  ---
387
520
 
388
521
  ## 2. 环境变量
@@ -471,7 +604,7 @@ config:
471
604
  ```
472
605
 
473
606
  门禁:先按 `OPERATIONS.md` 的 `dryrun → request` 验收;连续三次真实 runner 执行都通过
474
- `verify-truncation.mjs` 的 `VIOLATIONS=0` 后,才谈下一步。
607
+ 按 OPERATIONS 的人工验收完成(`verify-truncation.mjs` 已移除)后,才谈下一步。
475
608
 
476
609
  ### 4.3 激进:自动切 + 路由拒绝(只在有验收证据后用)
477
610
 
package/docs/ERRORS.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  @jjh32456/dsh-longlive 的所有工具失败时都会返回 `{ ok: false, code, message }`(同步抛出的则是带 `code` 的 `Error`)。这张表按出错的位置分组:**先找你的 `code`,照最后一列做**。
4
4
 
5
- > 版本:1.5.0。码表与源码同步;新增码时必须同时改本文件(`test/portability.test.mjs` 会检查本文件随包发布)。
5
+ > 版本:1.8.0。码表与源码同步;新增码时必须同时改本文件(`test/portability.test.mjs` 会检查本文件随包发布)。
6
6
 
7
7
  ## 插件整条没加载(一个工具都没有)
8
8
 
@@ -217,7 +217,7 @@ R1 主脑决策层的错误码。**这一层的语义是 fail-closed**:`route(
217
217
  | `E_ROUTE_ALIASES_INVALID` | 别名表 JSON 损坏、`actions` 结构不对、`canonical` 重复 | 按 `version/actions[{canonical,legacy,aliases}]` 修 |
218
218
  | `E_ROUTE_RULE_FIELD` | 某条规则缺字段或字段类型错(id/priority/match/decision/before/after/level/writeScope 形状) | 错误里带 `ruleId`,按提示补字段;**整表拒收,不会只丢这一条** |
219
219
  | `E_ROUTE_RULE_UNKNOWN` | 某条规则的 `kind` / `action` / `target` 不在白名单 | 改用 `route.js` 里 `KINDS/TARGETS/aliases.json` 的合法值;**不许静默丢弃该规则后继续** |
220
- | `E_ROUTE_AMBIGUOUS` | 最高优先级上有 ≥2 条规则同时命中(`errors[].rules` 列出全部竞争 ruleId) | 交人裁决:收紧关键词/ctx,或给规则排出明确优先级;**不许按文件顺序选中** |
220
+ | `E_ROUTE_AMBIGUOUS` | 最高优先级上有 ≥2 条规则同时命中(`errors[].rules` 列出全部竞争 ruleId) | 人工决定:收紧关键词/ctx,或给规则排出明确优先级;**不许按文件顺序选中** |
221
221
  | `E_ROUTE_CTX_MISSING` | 规则的关键词命中了,但 `ctx` 缺它门控要的字段 | 补 `ctx.tokens/activeWorkers/openRows/zone`;**不许当成「条件不满足」静默跳过** |
222
222
  | `E_ROUTE_CTX_TYPE` | `ctx` 字段类型错(如 `activeWorkers: "2"`)或 `ctx` 不是对象 | 按 schema 传有限数字/字符串;类型错不是「没命中」 |
223
223
  | `E_ROUTE_OVERRIDE_UNJUSTIFIED` | override 缺 `ruleId` 或 `reason` | 补理由;该 override 被丢弃,原判定保留 |
@@ -236,10 +236,10 @@ R1 主脑决策层的错误码。**这一层的语义是 fail-closed**:`route(
236
236
  | `E_ROUTE_HUMAN` | 该交人的决定没标 `needsHuman` | 在规则模板里写 `needsHuman: true` |
237
237
  | `E_ROUTE_POLICY` | 规则的 `policyRef` 在设计文档里解析不到 | 核对 `policyRef` 与 `R1-DESIGN.md` 的章节锚点 |
238
238
  | `E_ROUTE_LEVEL` | 规则的 level 不在 X/D/H,或与设计矩阵不符 | 按 `LEVEL_MATRIX` 改 |
239
- | `E_ROUTE_FORBIDDEN` | 命中设计里的禁止行为(如按文件顺序裁决) | 改规则/代码,不许绕过 |
239
+ | `E_ROUTE_FORBIDDEN` | 命中设计里的禁止行为(如按文件顺序判定) | 改规则/代码,不许绕过 |
240
240
  | `E_ROUTE_BRIEF` | `worker_spawn` 的 `args.brief` 缺五要素或验收/产物路径 | 按 judge 的 brief 模板补齐 |
241
241
 
242
- ### J8 身份同意(`route.js` / `judge.mjs` J9)
242
+ ### 身份同意(`route.js` / `judge.mjs`)
243
243
 
244
244
  这两个码**不套 `E_ROUTE_` 前缀**:它们说的不是「路由层坏了」,而是「身份变更被正确地挡下了」,
245
245
  属于正常判定结果,不是 fail-closed 故障。
@@ -247,11 +247,23 @@ R1 主脑决策层的错误码。**这一层的语义是 fail-closed**:`route(
247
247
  | 码 | 什么时候出现 | 你该怎么做 |
248
248
  | --- | --- | --- |
249
249
  | `E_IDENTITY_CONSENT_REQUIRED` | 用户单方面要求改名/改画像/改自称,但没有当前会话助手本人的同意记录(`consent.holder === "assistant"` 且带 `at` 与 `quote`) | 回 `identity.hold`,把「谁有权」说清楚;**不许把用户的「我同意/你改吧」当成同意**,也不许先改再补记录 |
250
- | `E_SELF_CONSENT` | judge J9:判定里出现了 `engram.profile.edit` 画像/名字写入,但同意记录不是当前会话助手本人给的(或 `satisfied !== true`、缺 `at`/`quote`) | 改回 `identity.hold`;只有当前会话助手本人带时间戳与原话的同意记录才能写 `engram:profile`,且必须 `keepHistory: true` |
250
+ | `E_SELF_CONSENT` | 身份同意判官:判定里出现了 `engram.profile.edit` 画像/名字写入,但同意记录不是当前会话助手本人给的(或 `satisfied !== true`、缺 `at`/`quote`) | 改回 `identity.hold`;只有当前会话助手本人带时间戳与原话的同意记录才能写 `engram:profile`,且必须 `keepHistory: true` |
251
251
 
252
252
  本规则与被判断的 agent 具体叫什么无关:判定只看 `consent.holder === "assistant"` 以及 `at`/`quote` 是否齐全,
253
253
  不看 agent 的名字、自称或头像;换一个 agent 装上这套路由器,同意权同样归它自己,用户单方面要求同样不算同意。
254
254
 
255
+ ## 1.8.0 版本/安装集/迁移(v2.8.5 §16.1/§16.6)
256
+
257
+ 安装集是三件(longlive / panel / answer-guard)同版本发布;这四个码只在「版本/安装集/迁移」这条路径上出现。
258
+ 码表与源码同步(R9 实测:登记前 grep=0)。
259
+
260
+ | 码 | 什么时候出现 | HTTP / 退出码 | 载荷字段 | 测试落点 |
261
+ | --- | --- | --- | --- | --- |
262
+ | `E_VERSION_MISSING` | 安装集清单或迁移记录缺版本号(三件任一没写 `version`,或 `install-set-*.json` 缺 `members[].version`) | HTTP 409;CLI 退出码 5 | `{code,message,details:{member,expected,actual,missing}}` | `test/version-set.test.mjs`(缺 version 用例)、`test/gate4-installset.test.mjs`(仓库测试,npm 包不含) |
263
+ | `E_VERSION_SET` | 三件版本不一致(longlive 1.8.0 + panel 1.7.x 混装)或面板/核心版本集合校验失败 | HTTP 400;CLI 退出码 5 | `{code,message,details:{versions:{longlive,panel,answerGuard},reason}}` | `test/version-set.test.mjs`(混装用例) |
264
+ | `E_VERSION_HASH` | 安装集 `*.sha256` manifest 与实文件哈希不符(下载损坏 / 被替换) | HTTP 409;CLI 退出码 5 | `{code,message,details:{file,expected,actual}}` | `test/version-set.test.mjs`、`test/gate4-installset.test.mjs`(仓库测试,npm 包不含)(哈希篡改用例) |
265
+ | `E_MIGRATE_INCOMPLETE` | `scripts/migrate-180.mjs --apply` 迁移后条数不一致或存在无法映射的旧记录(`countMatched=false`) | CLI 退出码 1(默认 dry-run 不写、不报此码) | `{code,message,receipt:{recordsTotal,mapped,unmapped,afterClaims,countMatched}}` | `test/recall-v2/gov-migration.test.mjs`(apply/幂等/计数一致用例) |
266
+
255
267
  ## 这些不是错误码
256
268
 
257
269
  - `DSH_MEM`、`DSH_LONGLIVE_MEMORY_ROOT`、`DSH_LONGLIVE_STRICT_MEMORY_ROOT`、`DSH_HOST_VERSION`:环境变量名,出现在提示文案里。
package/docs/FAQ.md CHANGED
@@ -1,4 +1,4 @@
1
- # 常见问题(FAQ)
1
+ # 常见问题(FAQ)
2
2
 
3
3
  **读完你会得到什么**:装完没反应、侧栏不见了、401/404、剪完变少、换电脑、断电、卸载这些最常见的情况,能自己判断「是正常、是没装好,还是该回滚」。
4
4
 
@@ -8,13 +8,13 @@
8
8
 
9
9
  大概率是正常的。这个插件**没有自带界面**,默认 `mode: "log"` 也只会在后台写一行评估日志,不会弹窗、不会剪东西。
10
10
 
11
- 按顺序确认:`dsh plugin --profile desktop list --depth 0` 有 `@jjh32456/dsh-longlive@1.6.5`;doctor 没有硬错误(退出码 0,或只有 engram 缺失导致的 1);重启后新会话里能数到 22 个工具;聊到超过阈值后,`%USERPROFILE%\.dsh\longlive-memory\.longlive\logs\auto-truncate.log` 才出现评估行(默认阈值 300000,所以短时间内没有是正常的)。
11
+ 按顺序确认:`dsh plugin --profile desktop list --depth 0` 有 `@jjh32456/dsh-longlive@1.8.0`;doctor 没有硬错误(退出码 0,或只有 engram 缺失导致的 1);重启后新会话里能数到 22 个工具;聊到超过阈值后,`%USERPROFILE%\.dsh\longlive-memory\.longlive\logs\auto-truncate.log` 才出现评估行(默认阈值 300000,所以短时间内没有是正常的)。
12
12
 
13
13
  如果这四样都没有,先看宿主启动 stderr 有没有 `1 entry did not activate`。
14
14
 
15
15
  ## 2. 侧栏没有「潜望镜」?
16
16
 
17
- 「潜望镜」不是 longlive 本体自带的,它来自独立可选包 `@jjh32456/dsh-longlive-panel@0.2.5`。不装那个包,就永远不会有这个侧栏——这不是故障。
17
+ 「潜望镜」不是 longlive 本体自带的,它来自独立可选包 `@jjh32456/dsh-longlive-panel@1.8.0`。不装那个包,就永远不会有这个侧栏——这不是故障。1.8.0 面板侧 `GET /api/longlive-panel/v2/state` 返回 27 条路由 / 18 个动作;「本轮想起」审计入口读 `.longlive/recall-log.jsonl`。
18
18
 
19
19
  装了还没有,按顺序查:
20
20
 
@@ -28,7 +28,7 @@
28
28
  22 是 longlive 自己注册的数量,不是「整个会话只有 22 个工具」。先确认你看的是**新会话**,且是装插件的那个 profile。
29
29
 
30
30
  - 一个都没有 → 插件没激活,看 stderr 的 `1 entry did not activate` 和紧随其后的错误。
31
- - 少几个 → 可能被 profile 的工具过滤挡住,或版本不是 1.5.0。
31
+ - 少几个 → 可能被 profile 的工具过滤挡住,或版本不是 1.8.0。
32
32
  - 只有 `engram_*` 缺失 → 那是可选依赖没装,和 22 个工具无关。
33
33
 
34
34
  ## 4. 401 和 404 到底差在哪?
@@ -66,7 +66,7 @@
66
66
  能,但要重新装,不能直接复制 profile。
67
67
 
68
68
  - 包是便携的,没有写死盘符;把 `.tgz` 拷过去,在新机器上重新 `plugin add`。
69
- - profile 里的 `file:C:/...` 是**那台机器**的绝对路径;换机后必须改成新路径,否则装不上。
69
+ - profile 里的 `file:<path>` 是**那台机器**的绝对路径;换机后必须改成新路径,否则装不上。
70
70
  - `memoryRoot` 默认跟着 DSH home 走(Windows 是 `%USERPROFILE%\.dsh\longlive-memory`);如果你显式配了路径,**那个目录必须已经存在**,插件不会替你创建。
71
71
  - 会话根目录默认 `%USERPROFILE%\.dsh\sessions`,设了 `DSH_HOME` 就以它为准。
72
72
  - `request` 模式的 runner 目前只支持 Windows;换到 Linux/macOS 就用 `log` / `dryrun`,或完全退出宿主后手动跑 `truncate-cli.mjs`。
@@ -86,13 +86,13 @@
86
86
  & $DSH plugin --profile desktop remove @jjh32456/dsh-longlive
87
87
  ```
88
88
 
89
- 然后重启宿主,`list` 里不再出现即成功。卸载**不会**删 `longlive-memory`、会话的 `.bak-YYYYMMDD`、`session.v4.jsonl.zstd.archive/` 和 `.longlive/` 状态文件;要清就自己确认后手动删。面板是独立可选包 `@jjh32456/dsh-longlive-panel@0.2.5`,得单独 `remove @jjh32456/dsh-longlive-panel`。
89
+ 然后重启宿主,`list` 里不再出现即成功。卸载**不会**删 `longlive-memory`、会话的 `.bak-YYYYMMDD`、`session.v4.jsonl.zstd.archive/` 和 `.longlive/` 状态文件;要清就自己确认后手动删。面板是独立可选包 `@jjh32456/dsh-longlive-panel@1.8.0`,得单独 `remove @jjh32456/dsh-longlive-panel`。
90
90
 
91
91
  ## 10. 怎么确认它真的生效了,而不是「装了个寂寞」?
92
92
 
93
93
  四个独立证据,至少看到两个:
94
94
 
95
- 1. `plugin list` 显示 `@1.6.5`;
95
+ 1. `plugin list` 显示 `@1.8.0`;
96
96
  2. doctor 没有硬错误(0,或只有 engram 缺失导致的 1);
97
97
  3. 新会话能调用 `session_health`,返回里有 `sessionPath` / `events` / `visibleMessages`;
98
98
  4. 聊到超过阈值后,`auto-truncate.log` 出现评估行(`action` 是 `planned` / `dryrun-planned` / `none` 都算插件在评估)。