@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.
- package/CHANGELOG.md +70 -1508
- package/LICENSE +1 -1
- package/QUICKSTART.md +34 -13
- package/README.en.md +18 -7
- package/README.md +34 -9
- package/SPEC.md +5 -5
- package/cordis.patch.yml +23 -9
- package/docs/ANSWER-GUARD.md +92 -0
- package/docs/ARCHITECTURE.md +4 -3
- package/docs/AUTO-RECALL-WIRING.md +1 -1
- package/docs/AUTO-RECALL.md +15 -9
- package/docs/CONFIG.md +168 -35
- package/docs/ERRORS.md +17 -5
- package/docs/FAQ.md +7 -7
- package/docs/FEATURES.md +96 -28
- package/docs/MIGRATION-1.6.0.md +2 -2
- package/docs/OPERATIONS.md +6 -6
- package/docs/PANEL-INTEGRATION.md +6 -0
- package/docs/PRIVACY.md +88 -0
- package/docs/QUICKSTART.md +5 -5
- package/docs/README.en.md +4 -2
- package/docs/RESIDENT-WATCHER.md +1 -1
- package/docs/SESSION-WATCH.md +6 -6
- package/docs/TROUBLESHOOTING.md +4 -4
- package/package.json +47 -117
- package/runbook.md +2 -2
- package/scripts/backfill-auto-cards.mjs +98 -0
- package/scripts/install-surgery-task.ps1 +5 -2
- package/scripts/lib/session-watch-fixture.mjs +1 -1
- package/scripts/longlive-doctor.mjs +6 -0
- package/scripts/migrate-180.mjs +163 -0
- package/scripts/recall-index-build.mjs +128 -0
- package/scripts/session-watch-drill.mjs +1 -1
- package/scripts/surgery-run.cmd +1 -1
- package/scripts/unattended-surgery.ps1 +5 -2
- package/scripts/verify-card-anchors.mjs +138 -0
- package/src/actions/audit.js +125 -0
- package/src/actions/evidence.js +122 -0
- package/src/actions/fs.js +162 -0
- package/src/activity/index.js +760 -0
- package/src/activity/model.js +351 -0
- package/src/activity/store.js +644 -0
- package/src/activity/thinking.js +176 -0
- package/src/adapters/constants.js +11 -0
- package/src/adapters/engram/data/aliases.json +51 -0
- package/src/adapters/engram/data/policy.json +8 -0
- package/src/adapters/engram/data/routing-rules.json +546 -0
- package/src/adapters/engram/index.js +235 -0
- package/src/adapters/registry.js +315 -0
- package/src/answer/audit.js +193 -0
- package/src/answer/evidence.js +30 -0
- package/src/answer/guard.js +1370 -0
- package/src/answer/index.js +1067 -0
- package/src/answer/query.js +111 -0
- package/src/answer/second-hop.mjs +101 -0
- package/src/auto-truncate.js +1 -1
- package/src/config.js +171 -47
- package/src/deps.js +6 -4
- package/src/features.js +182 -6
- package/src/heartbeat.js +156 -23
- package/src/identity/handover.js +52 -1
- package/src/identity/index.js +13 -5
- package/src/identity/inject-position.js +2 -2
- package/src/index.js +97 -7
- package/src/lifecycle/gap-clocks.js +328 -0
- package/src/lifecycle/index.js +269 -0
- package/src/live.js +22 -2
- package/src/memory/activity-capture.js +229 -0
- package/src/memory/anchors.js +194 -0
- package/src/memory/audit-records.js +222 -0
- package/src/memory/auto-cards.js +401 -0
- package/src/memory/capture.js +442 -0
- package/src/memory/card-anchors.js +203 -0
- package/src/memory/conflicts.js +106 -0
- package/src/memory/decay.js +311 -0
- package/src/memory/distill.js +471 -0
- package/src/memory/event-index.js +917 -0
- package/src/memory/evidence-chain.js +295 -0
- package/src/memory/evidence.js +145 -0
- package/src/memory/filter-runner.js +1 -1
- package/src/memory/filter.js +5 -1
- package/src/memory/forget-v2.js +410 -0
- package/src/memory/forget.js +71 -0
- package/src/memory/frames-activation.js +247 -0
- package/src/memory/fts-query.js +174 -0
- package/src/memory/governance.js +604 -0
- package/src/memory/index.js +1 -0
- package/src/memory/l2-gate.js +169 -0
- package/src/memory/lock.js +121 -0
- package/src/memory/migrate.js +139 -0
- package/src/memory/recall-v2.js +223 -0
- package/src/memory/recall.js +65 -2
- package/src/memory/records.js +425 -0
- package/src/memory/retention.js +128 -0
- package/src/memory/review.js +124 -0
- package/src/memory/trust.js +88 -0
- package/src/memory/version-chain.js +264 -0
- package/src/memory/wal.js +137 -0
- package/src/memory/working-frame.js +516 -0
- package/src/metrics/classify.mjs +5 -3
- package/src/metrics/index.mjs +21 -1
- package/src/metrics/prestep-latency.mjs +300 -0
- package/src/metrics/store.mjs +25 -0
- package/src/policy-profile.js +18 -3
- package/src/recall/anaphora.mjs +87 -0
- package/src/recall/cards.mjs +7 -0
- package/src/recall/embedding.mjs +8 -8
- package/src/recall/entities.mjs +112 -0
- package/src/recall/index.js +235 -19
- package/src/recall/inject-order.mjs +10 -8
- package/src/recall/privacy.mjs +105 -16
- package/src/recall/recall-core.mjs +116 -10
- package/src/recall/shared-visibility.js +302 -0
- package/src/recall/time-normalizer.mjs +196 -0
- package/src/role/activation.js +191 -0
- package/src/role/attention.js +318 -0
- package/src/role/base.js +36 -0
- package/src/role/channels.js +423 -0
- package/src/role/index.js +425 -0
- package/src/role/interfaces.js +115 -0
- package/src/role/personality.js +370 -0
- package/src/role/readers.js +151 -0
- package/src/role/relationships.js +477 -0
- package/src/role/store.js +202 -0
- package/src/role/writeprotect.js +373 -0
- package/src/router/aliases.json +176 -25
- package/src/router/background/agent-runner.mjs +1 -1
- package/src/router/background/anchor.mjs +1 -1
- package/src/router/background/audit.mjs +2 -2
- package/src/router/background/budget-ledger.mjs +2 -2
- package/src/router/background/host-sim.mjs +1 -1
- package/src/router/background/memory.mjs +4 -4
- package/src/router/background/queue.mjs +1 -1
- package/src/router/background/retry.mjs +1 -1
- package/src/router/background/router.mjs +1 -1
- package/src/router/background/stream.mjs +1 -1
- package/src/router/background/tool-policy.mjs +1 -1
- package/src/router/design-headings.json +5 -5
- package/src/router/face/config.mjs +1 -1
- package/src/router/face/identity.mjs +3 -3
- package/src/router/judge.mjs +8 -7
- package/src/router/policies/generic.json +21 -4
- package/src/router/route.js +109 -22
- package/src/router/router.mjs +10 -6
- package/src/router/routing-rules.json +260 -445
- package/src/router/run-sim.mjs +8 -8
- package/src/router/runtime.js +23 -12
- package/src/router/service/board.mjs +95 -15
- package/src/router/service/config.mjs +5 -5
- package/src/router/service/context.mjs +1 -1
- package/src/router/service/hint.mjs +14 -0
- package/src/router/service/queue.mjs +1 -1
- package/src/router/service/service.mjs +27 -11
- package/src/router/shadow.mjs +4 -3
- package/src/surgery-recovery.js +2 -2
- package/src/tool-output.js +2 -2
- package/src/tools.js +39 -7
- package/src/truncate-visible.js +2 -2
- package/src/ui/actions.js +1312 -0
- package/src/ui/panel-api.js +367 -0
- package/src/ui/panel-auth.js +251 -0
- package/src/ui/panel-integrity.js +243 -0
- package/src/ui/routes-readonly.js +695 -0
- package/src/ui/routes.js +3 -0
- package/docs/DEV.md +0 -279
- package/docs/PRESENCE-BUS-WIRING.md +0 -491
- package/docs/PRESENCE-BUS.md +0 -694
- package/docs/SURGERY.md +0 -186
- package/scripts/mark-core-cards.mjs +0 -289
- package/scripts/pack.mjs +0 -392
- package/scripts/router-proposals.mjs +0 -386
- package/src/router/fixtures/M1.json +0 -16
- package/src/router/fixtures/M2.json +0 -16
- package/src/router/fixtures/M3.json +0 -20
- package/src/router/fixtures/M4.json +0 -20
- package/src/router/fixtures/M5.json +0 -45
- package/src/router/fixtures/M6.json +0 -53
- package/src/router/fixtures/M7.json +0 -46
- package/src/router/fixtures/S1.json +0 -20
- package/src/router/fixtures/S2.json +0 -23
- package/src/router/fixtures/S3.json +0 -20
- package/src/router/fixtures/S4.json +0 -34
- package/src/router/fixtures/S5.json +0 -43
- package/src/router/fixtures/S6.json +0 -47
- package/src/router/fixtures/T1.json +0 -23
- package/src/router/fixtures/T2.json +0 -16
- package/src/router/fixtures/T3.json +0 -19
- package/src/router/fixtures/T4.json +0 -16
- package/src/router/fixtures/X1.json +0 -17
- package/src/router/fixtures/X2.json +0 -20
- package/src/router/gen-design-headings.mjs +0 -107
- package/src/router/policies/owner-rulings-2026-11-03.json +0 -62
- package/test/auto-recall.test.mjs +0 -474
- package/test/auto-truncate.test.mjs +0 -931
- package/test/autobind.test.mjs +0 -385
- package/test/bus.test.mjs +0 -1572
- package/test/cli-guard.test.mjs +0 -198
- package/test/conclusion.test.mjs +0 -408
- package/test/config-schema.test.mjs +0 -204
- package/test/d6-output.test.mjs +0 -194
- package/test/d6.test.mjs +0 -395
- package/test/deps.test.mjs +0 -342
- package/test/doctor-setup.test.mjs +0 -297
- package/test/embedding-recall.test.mjs +0 -347
- package/test/feature-flags.test.mjs +0 -568
- package/test/filter-shadow.test.mjs +0 -170
- package/test/fixtures/baseline-0.8.0-registration.json +0 -556
- package/test/fixtures/d6-header-tools.json +0 -1
- package/test/fixtures/lock-child.mjs +0 -67
- package/test/fixtures/pre-step-container.mjs +0 -100
- package/test/fixtures/privacy-memory/topics/pii-unmarked.md +0 -9
- package/test/fixtures/privacy-memory/topics/secret-local-only.md +0 -11
- package/test/fixtures/profile-session-longlive-config.json +0 -20
- package/test/fixtures/proposal-cas-child.mjs +0 -66
- package/test/host-engine-status.test.mjs +0 -307
- package/test/hot-truncate.test.mjs +0 -1349
- package/test/identity-card-marker.test.mjs +0 -307
- package/test/identity-router/run.mjs +0 -721
- package/test/integration-pre-step.test.mjs +0 -553
- package/test/live.test.mjs +0 -1020
- package/test/maintenance-schedule.test.mjs +0 -538
- package/test/memory.test.mjs +0 -2828
- package/test/metrics.test.mjs +0 -478
- package/test/orchestrator.test.mjs +0 -266
- package/test/p1_probe.mjs +0 -97
- package/test/packaging.test.mjs +0 -182
- package/test/portability.test.mjs +0 -343
- package/test/rc4-regressions.test.mjs +0 -562
- package/test/rc5-regressions.test.mjs +0 -197
- package/test/rc6-chinese.test.mjs +0 -394
- package/test/router-1100/apply-off.test.mjs +0 -175
- package/test/router-1100/budget-reconcile.test.mjs +0 -215
- package/test/router-1100/config-context.test.mjs +0 -211
- package/test/router-1100/helpers.mjs +0 -129
- package/test/router-1100/hint-envelope.test.mjs +0 -150
- package/test/router-1100/lock-crossproc.test.mjs +0 -206
- package/test/router-1100/proposal-cas-crossproc.test.mjs +0 -184
- package/test/router-1100/router-apply.test.mjs +0 -372
- package/test/router-1100/router-fixb.test.mjs +0 -602
- package/test/router-1100/router-proposals.test.mjs +0 -405
- package/test/router-1100/router-queue-lease-wal.test.mjs +0 -355
- package/test/router-1100/router-security-cr.test.mjs +0 -333
- package/test/router-1100/service-lifecycle.test.mjs +0 -220
- package/test/router-1100/tools-contract.test.mjs +0 -164
- package/test/router-1100/turn-reflect-tick.test.mjs +0 -89
- package/test/router-1100/v6-contract.test.mjs +0 -158
- package/test/router-1100/v6b-contract.test.mjs +0 -293
- package/test/router-1100/v6c-contract.test.mjs +0 -249
- package/test/router-1100/wal-rotation.test.mjs +0 -375
- package/test/router-1100/wp1-config.test.mjs +0 -170
- package/test/router-1100/wp1-default-off.test.mjs +0 -77
- package/test/router-1100/wp1-model-status.test.mjs +0 -90
- package/test/router-1100/wp1-status.test.mjs +0 -220
- package/test/router-1100/wp1-tools.test.mjs +0 -146
- package/test/router-1100/wp5-cli.test.mjs +0 -240
- package/test/router-1100/wp5-model-auto.test.mjs +0 -418
- package/test/router-1100/wp6-merge.test.mjs +0 -386
- package/test/router-1100/wp6-wake.test.mjs +0 -502
- package/test/router-background/audit.test.mjs +0 -37
- package/test/router-background/budget-ledger.test.mjs +0 -330
- package/test/router-background/cross-process.test.mjs +0 -222
- package/test/router-background/fixtures/cross-child.mjs +0 -85
- package/test/router-background/fixtures/real-shapes.mjs +0 -239
- package/test/router-background/router.test.mjs +0 -1044
- package/test/router-background/stream-retry.test.mjs +0 -358
- package/test/router-background/tool-agent.test.mjs +0 -384
- package/test/router-face/bridge.test.mjs +0 -169
- package/test/router-face/face.test.mjs +0 -316
- package/test/router-failclosed.test.mjs +0 -466
- package/test/router-identity.test.mjs +0 -384
- package/test/router-l1-l2.contract.test.mjs +0 -1075
- package/test/router-memory-tools.test.mjs +0 -262
- package/test/router-policy.test.mjs +0 -225
- package/test/router-runtime.test.mjs +0 -438
- package/test/router-shadow.test.mjs +0 -287
- package/test/router.test.mjs +0 -903
- package/test/run-rc.mjs +0 -299
- package/test/run.mjs +0 -2469
- package/test/safety-defaults.test.mjs +0 -179
- package/test/seeded-load.test.mjs +0 -436
- package/test/session-original.test.mjs +0 -338
- package/test/surgery-recovery.test.mjs +0 -936
- package/test/t7_drive.mjs +0 -151
- package/test/tool-output.test.mjs +0 -393
- package/test/tool-schema.test.mjs +0 -177
- package/test/tools_contract.test.mjs +0 -716
- package/test/truncate-visible.test.mjs +0 -1150
- package/test/ui-flags.test.mjs +0 -477
- package/test/v4-hardening.test.mjs +0 -427
package/LICENSE
CHANGED
package/QUICKSTART.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# QUICKSTART — 五步跑通(1.8.0)
|
|
2
2
|
|
|
3
3
|
目标:在一台新机器上,5 步内让 `@jjh32456/dsh-longlive` 装好、能用、能回滚、能卸干净。
|
|
4
4
|
完整背景见 [README.md](README.md),逐码排错见 [docs/ERRORS.md](docs/ERRORS.md),
|
|
@@ -42,7 +42,7 @@ $DSH = '<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd'
|
|
|
42
42
|
先把包放到固定目录,核对 sha256,再装进一个**新 profile**:
|
|
43
43
|
|
|
44
44
|
```powershell
|
|
45
|
-
$TGZ = '
|
|
45
|
+
$TGZ = '<path-to>\jjh32456-dsh-longlive-1.8.0.tgz'
|
|
46
46
|
Get-FileHash -Algorithm SHA256 $TGZ # 对照同目录的 .tgz.sha256
|
|
47
47
|
|
|
48
48
|
$LLPROFILE = 'fresh0723b'
|
|
@@ -54,7 +54,7 @@ $LLPROFILE = 'fresh0723b'
|
|
|
54
54
|
& $DSH plugin --profile $LLPROFILE list --depth 0
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
`list` 应出现 `@jjh32456/dsh-longlive@1.
|
|
57
|
+
`list` 应出现 `@jjh32456/dsh-longlive@1.8.0`。`dsh plugin --profile <新名字> add` 自己也会初始化
|
|
58
58
|
profile,但那样只带 `@deepseek-ai/dsh-base`;要网页 UI 和与本文一致的验证,先用
|
|
59
59
|
`--from-default-profile web` 建模板 profile。
|
|
60
60
|
|
|
@@ -67,11 +67,11 @@ profile,但那样只带 `@deepseek-ai/dsh-base`;要网页 UI 和与本文一
|
|
|
67
67
|
```powershell
|
|
68
68
|
Set-Location <仓库根目录>
|
|
69
69
|
& $NODE test\run.mjs
|
|
70
|
-
& $NODE scripts\pack.mjs --expect-version 1.
|
|
71
|
-
# 产物:dist\jjh32456-dsh-longlive-1.
|
|
70
|
+
# 仓库内开发脚本(npm 包不含)\n& $NODE scripts\pack.mjs --expect-version 1.8.0
|
|
71
|
+
# 产物:dist\jjh32456-dsh-longlive-1.8.0.tgz(+ .sha256)
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
`pack.mjs
|
|
74
|
+
`pack.mjs`(仓库内开发脚本,npm 包不含)只负责打包,不跑测试;`--expect-version` 会在版本不匹配时拒绝出包。
|
|
75
75
|
发布前还要跑带真机 T7 的发布闸门(见 [runbook.md](runbook.md) §1.7)。
|
|
76
76
|
|
|
77
77
|
### 1C. 在会话里用 plugin_manager
|
|
@@ -79,13 +79,13 @@ Set-Location <仓库根目录>
|
|
|
79
79
|
宿主正在跑、且当前 profile 就是目标 profile 时:
|
|
80
80
|
|
|
81
81
|
```
|
|
82
|
-
plugin_manager action=install_bundle target="file
|
|
82
|
+
plugin_manager action=install_bundle target="file:<path-to>/jjh32456-dsh-longlive-1.8.0.tgz"
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
目标必须是**绝对路径**,且需要上面说的权限。装完按宿主提示重载(或重启该 profile)。
|
|
86
86
|
|
|
87
87
|
> 不要用 `npm install` 当安装方式:本包未发布到 npm registry;`file:` 必须指向刚打出来的
|
|
88
|
-
> **1.
|
|
88
|
+
> **1.8.0 tgz**,指向旧版 tgz 会装回旧行为。
|
|
89
89
|
|
|
90
90
|
### 1D. 装完第一件事:可选依赖自检与 `--setup`
|
|
91
91
|
|
|
@@ -182,7 +182,7 @@ R1 的判断依据默认只加载**通用策略**(`src/router/policies/generic
|
|
|
182
182
|
config:
|
|
183
183
|
memoryRoot: <memory-root>
|
|
184
184
|
routerPolicyProfile: generic # 默认;不写等价于它
|
|
185
|
-
# routerPolicyProfile:
|
|
185
|
+
# routerPolicyProfile: <profile-name> # 可选:自定义规则 profile
|
|
186
186
|
```
|
|
187
187
|
|
|
188
188
|
三条硬规则:
|
|
@@ -231,7 +231,7 @@ dsh: warning: 1 entry did not activate
|
|
|
231
231
|
session-longlive (dsh-session-longlive): Error: cannot get property "version" without inject
|
|
232
232
|
```
|
|
233
233
|
|
|
234
|
-
说明跑的是 0.7.3 的旧代码(19 个工具都不会注册);升级到 1.
|
|
234
|
+
说明跑的是 0.7.3 的旧代码(19 个工具都不会注册);升级到 1.8.0,或按第 4 步回滚到 0.6.0。
|
|
235
235
|
|
|
236
236
|
> **新 profile 要启动两次再下结论。** 新建 profile 的第一次启动会做一次准备性加载,
|
|
237
237
|
> 可能不进入 Cordis runtime,从而掩盖这个错误;第二次启动才是稳定状态。两次 stderr 都干净才算过。
|
|
@@ -274,7 +274,7 @@ Copy-Item "<session-dir>\session.v4.jsonl.zstd.bak-YYYYMMDD" "<session-dir>\sess
|
|
|
274
274
|
回滚**插件版本**:
|
|
275
275
|
|
|
276
276
|
```powershell
|
|
277
|
-
$OLD = '
|
|
277
|
+
$OLD = '<path-to>\dsh-session-longlive-0.6.0.tgz'
|
|
278
278
|
Get-FileHash -Algorithm SHA256 $OLD
|
|
279
279
|
& $DSH plugin --profile $LLPROFILE add "file:$OLD"
|
|
280
280
|
& $DSH plugin --profile $LLPROFILE list --depth 0 # 应显示 @0.6.0
|
|
@@ -326,17 +326,38 @@ Remove-Item -Recurse -Force $profileDir
|
|
|
326
326
|
|
|
327
327
|
---
|
|
328
328
|
|
|
329
|
+
## 1.8.0 身份与隐私(第一次用先看这条)
|
|
330
|
+
|
|
331
|
+
- **默认中性身份**:1.8.0 不内置人名/角色;想用你自己的身份,在记忆根下新建
|
|
332
|
+
`<memoryRoot>/IDENTITY.md`(默认 `%USERPROFILE%\.dsh\longlive-memory\IDENTITY.md`,按 `memoryRoot` 走),
|
|
333
|
+
写短一点、别放敏感信息;不建就用中性默认,不会自动创建或改写。
|
|
334
|
+
- **蒸馏 who 默认空**:写入/蒸馏不会再带入内置个人称呼,who 需要你在自己的配置里显式注入。
|
|
335
|
+
- **共享大脑活动流默认开启(1.8.0 起)**:写侧(turn/end 记活动)+ 实时注入(只注入其他会话新增,≤5 条 / 整条 ≤300 字);数据只在本机 `memoryRoot`、不上传。不想开就设 `sharedBrain.activity.enabled: false` 后重启(回到 1.6.8 默认)。
|
|
336
|
+
- **共享大脑 thinking 默认开启(1.8.0 起,摘要级)**:只注入其他会话的**摘要**,不写原文、不进日志,`local_only` 内容不写不注入;不想要设 `sharedBrain.thinkingInjection.enabled: false` 后重启(细节见 [docs/CONFIG.md](docs/CONFIG.md))。
|
|
337
|
+
- **发布包隐私门**:打包时仓库内脚本 `scripts/scan-abs-paths.mjs`(npm 包不含)扫绝对路径/个人目录名,blocker=0 才发版;
|
|
338
|
+
包内不含记忆库、会话日志、本机路径(说明见 [docs/PRIVACY.md](docs/PRIVACY.md))。
|
|
339
|
+
- **可移植**:node 走 `process.execPath`,不依赖 PATH;干净 `DSH_HOME` 可 install/运行(Gate-4)。
|
|
340
|
+
|
|
341
|
+
### 创建自己的身份(可选,3 行)
|
|
342
|
+
|
|
343
|
+
在 `<memoryRoot>/IDENTITY.md` 写三行即可(不建就用中性默认,不会出现任何具体名字):
|
|
344
|
+
|
|
345
|
+
```markdown
|
|
346
|
+
名字:<你的名字>
|
|
347
|
+
称呼:<你希望被怎么称呼>
|
|
348
|
+
规则 / 说话方式:<可选,一句>
|
|
349
|
+
```
|
|
329
350
|
## 排错速查
|
|
330
351
|
|
|
331
352
|
| 现象 | 大概率原因 | 处理 |
|
|
332
353
|
| --- | --- | --- |
|
|
333
|
-
| `dsh: warning: 1 entry did not activate` + `cannot get property "version" without inject` | 0.7.3 的激活回归 | 升级到 1.6.
|
|
354
|
+
| `dsh: warning: 1 entry did not activate` + `cannot get property "version" without inject` | 0.7.3 的激活回归 | 升级到 1.6.8,或回滚 0.6.0(第 4 步) |
|
|
334
355
|
| `--dump-config` 里两条同 id 的 `session-longlive` | 在 profile 层照抄了 `- insert:` | 改成 `- id: session-longlive` + `config:`(第 2 步) |
|
|
335
356
|
| `E_MEMORY_ROOT_MISSING` | 显式 `memoryRoot` 目录不存在 | 先建目录,或改用默认根(第 2 步) |
|
|
336
357
|
| `plugin_manager` 安装/卸载被自动拒绝 | 缺少 danger-full-access 或审批 | 用 CLI,或对本次调用批准(第 0 步) |
|
|
337
358
|
| `node` 不是内部或外部命令 | 干净机器 PATH 没有 Node | 用 `$NODE`(第 0 步) |
|
|
338
359
|
| 起会话报 `MISSING_CREDENTIAL` / `ACCOUNT_SIGN_IN_REQUIRED` | 新 profile 没有模型凭据 | 用 3A/3B 验证;这是环境问题,不是插件 |
|
|
339
|
-
| 设置页找不到「久视 · 功能开关」 | 1.6.0 起才有设置页伴侣;旧宿主或没有 webServer 的 profile 不注册路由 | 确认装的是 1.
|
|
360
|
+
| 设置页找不到「久视 · 功能开关」 | 1.6.0 起才有设置页伴侣;旧宿主或没有 webServer 的 profile 不注册路由 | 确认装的是 1.8.0 且宿主 Web GUI 可用;没有路由时直接改 `cordis.patch.yml` |
|
|
340
361
|
|
|
341
362
|
出问题先看 [docs/ERRORS.md](docs/ERRORS.md);Windows 专属部分(PowerShell 探测、`request` 模式、
|
|
342
363
|
`Stop-Process` 硬杀关闭)在非 Windows 上会降级而不是崩溃。
|
package/README.en.md
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
# @jjh32456/dsh-longlive (Longlive)
|
|
2
2
|
|
|
3
3
|
A DeepSeek Harness plugin that keeps a long session healthy: **inspect it, back it up, and shrink it safely** before the context window fills up. No standalone UI; no network requests or telemetry in the default configuration (Router / RouterFace / embedding call the provider you configure, only after you enable them).
|
|
4
4
|
## What you get
|
|
5
5
|
|
|
6
|
-
- **22 tools** for session health/backup/compaction/truncation, on-demand original-text fetch, memory cards, workers (fan-out is
|
|
6
|
+
- **22 tools** for session health/backup/compaction/truncation, on-demand original-text fetch, memory cards, workers (fan-out is on by default since 1.8.0; set `workers.enabled: false` to disable), and the live-session registry.
|
|
7
7
|
- A memory store at `<DSH home>/longlive-memory` (on Windows: `%USERPROFILE%\.dsh\longlive-memory`), created on first start.
|
|
8
|
-
- Optional: the separate read-only panel `@jjh32456/dsh-longlive-panel@
|
|
9
|
-
-
|
|
8
|
+
- Optional: the separate read-only panel `@jjh32456/dsh-longlive-panel@1.8.0` adds a sidebar named **潜望镜 (Periscope)**. The plugin itself ships no UI.
|
|
9
|
+
- **On by default since 1.8.0** (write side + real-time injection; added in 1.6.8): `sharedBrain.activity` writes activity rows from events (throttled to one row per key per 10 s, plus a conclusion row per turn/end) to `.longlive/board/activity.jsonl` and injects only unseen rows from other sessions (max 5 rows / 300 chars, zero tokens when nothing is new). It is independent of `presenceBus`; opt out with `sharedBrain.activity.enabled: false` and restart. All data stays in the local memoryRoot and is never uploaded.
|
|
10
|
+
- **On by default since 1.8.0** (set `false` to disable): `d2.enabled` trims oversized tool output (the full text is archived), `d6.enabled` freezes a per-task tool allowlist and registers `tool_search`. See [docs/FEATURES.md](docs/FEATURES.md) and [docs/CONFIG.md](docs/CONFIG.md) for enabling, budget and rollback.
|
|
10
11
|
|
|
11
12
|
## Install (3 commands)
|
|
12
13
|
|
|
13
14
|
```powershell
|
|
14
15
|
$DSH = '<DSH install>\resources\runtime\cli\bin\dsh.cmd'
|
|
15
16
|
$NODE = '<DSH install>\resources\runtime\primary-runtime\dependencies\node\bin\node.exe'
|
|
16
|
-
& $DSH plugin --profile desktop add "file
|
|
17
|
+
& $DSH plugin --profile desktop add "file:<path>/jjh32456-dsh-longlive-1.8.0.tgz"
|
|
17
18
|
& $DSH plugin --profile desktop list --depth 0
|
|
18
19
|
& $NODE "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\@jjh32456\dsh-longlive\scripts\longlive-doctor.mjs" --profile desktop
|
|
19
20
|
```
|
|
@@ -24,7 +25,7 @@ Fully quit and restart the host afterwards. Install from the local tgz with `plu
|
|
|
24
25
|
|
|
25
26
|
## First run
|
|
26
27
|
|
|
27
|
-
1.
|
|
28
|
+
1. Watch it: `autoTruncate` is on by default since 1.8.0; set `mode: "log"` and watch `<memoryRoot>/.longlive/logs/auto-truncate.log`; entries appear only after the threshold (default 300000) is exceeded.
|
|
28
29
|
2. Switch to `mode: "dryrun"` with `tokensThreshold: 5000`, `minTurns: 2`, and watch one planned cut (`"action":"dryrun-planned"`).
|
|
29
30
|
3. Switch to `mode: "request"`, wait for `auto-truncate.request.json`, then run `scripts/auto-truncate-run.ps1` **only when you are not using the app** (it closes and reopens the host).
|
|
30
31
|
4. Restore production values: `tokensThreshold: 300000`, `minTurns: 12`, `cooldownMinutes: 60`, `keepTurns: 12`, `keepTokens: 80000`.
|
|
@@ -36,8 +37,18 @@ Fully quit and restart the host afterwards. Install from the local tgz with `plu
|
|
|
36
37
|
- [FAQ.md](docs/FAQ.md) — 401/404, power loss, uninstall, moving machines.
|
|
37
38
|
- [README.md](README.md) — full Chinese introduction.
|
|
38
39
|
|
|
40
|
+
## Privacy & identity (1.8.0)
|
|
41
|
+
|
|
42
|
+
- Built-in identity is **neutral by default** in 1.8.0: no personal names or roles ship in the release. Define your own identity in `<memoryRoot>/IDENTITY.md`; when absent, a neutral default is used. Distillation's `who` defaults to empty and is injected only from your configuration.
|
|
43
|
+
- Shared-brain activity is **on by default since 1.8.0**: it writes and injects only inside your local memoryRoot and uploads nothing; opt out with `sharedBrain.activity.enabled: false` and restart.
|
|
44
|
+
- Shared-brain thinking is **on by default since 1.8.0, summary-level**: it injects summaries from other sessions only (no raw text, no logs), and reuses the privacy gate (`local_only` content is never written or injected); set `sharedBrain.thinkingInjection.enabled: false` to disable.
|
|
45
|
+
- The release package carries no memory store, session logs or machine paths; packaging runs an absolute-path/privacy scan and **0 blockers is a release gate**.
|
|
46
|
+
- Details: [docs/PRIVACY.md](docs/PRIVACY.md).
|
|
47
|
+
|
|
39
48
|
## Boundaries
|
|
40
49
|
|
|
41
50
|
- It never rewrites memory prose or deletes sessions/cards. `memory_reinforce` updates frontmatter counters and appends a use note; prose is byte-verified unchanged. `memory_forget` archives by default.
|
|
42
|
-
- Backup, both truncations, and forget default to `dryRun` and need their confirm word; `session_compact` is controlled by `dryRun` only. Auto-truncation
|
|
51
|
+
- Backup, both truncations, and forget default to `dryRun` and need their confirm word; `session_compact` is controlled by `dryRun` only. Auto-truncation, router features and other plugin features default to on in 1.8.0 (explicit `false` disables); the confidence gate (`answerGuard.gate`) and a few safety/gray switches default to off.
|
|
43
52
|
- `request` mode (close/cut/verify/restart) is Windows-only; on Linux/macOS use `log` or `dryrun`.
|
|
53
|
+
- **Portability**: node is resolved through `process.execPath`, no absolute machine paths are baked in, and a clean `DSH_HOME` can install and run the package (Gate-4).
|
|
54
|
+
- **Quality gate**: Gate-3 uses the human-mechanism-calibrated criteria `GATE3-CRITERIA-V2` (v2.1, sha256 `40A2C62D2CD07DA1D36C6B9211427A9496A0BD525F4E0862ED21AE94BA318D6D`, (criteria file archived with release evidence, not shipped)); the old criteria remain as a dual-caliber comparison.
|
package/README.md
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
# @jjh32456/dsh-longlive(久视)
|
|
2
2
|
|
|
3
3
|
> 1.6.0 起包名由 `dsh-session-longlive` 改为 `dsh-longlive`;1.6.4 起发布名改为 scoped 包
|
|
4
4
|
> `@jjh32456/dsh-longlive`(npm 包名),显示名仍是「久视」(英文 Longlive);
|
|
5
5
|
> 1.6.3 在 1.6.0 基线上新增**热截断**(cut-only 压缩引擎,见下文「版本与边界」),这一项是 1.5.0
|
|
6
6
|
> 没有的能力;1.6.4 把热截断默认值收到 **300k 触发 / 保留 4 轮**,并修复 D6 重启后首轮冻结
|
|
7
7
|
> (G3)与可移植性收口。升级步骤见 [docs/MIGRATION-1.6.0.md](docs/MIGRATION-1.6.0.md)。
|
|
8
|
+
>
|
|
9
|
+
> 1.6.8 在 1.6.7 之上并入**共享大脑活动流**(`sharedBrain.activity`,1.6.8 时默认关闭、1.8.0 起默认开启,与
|
|
10
|
+
> `presenceBus` 解耦,见 [docs/FEATURES.md](docs/FEATURES.md))与共享板状态诚实性修复
|
|
11
|
+
> (running 计数、焦点新鲜度、turn 状态、开机卡时效);热截断行为不变。
|
|
12
|
+
>
|
|
13
|
+
> **1.8.0**:有据才答的注入修复 + 来源闸(信心闸默认关)、**插件功能默认开启**(共享大脑活动流/thinking/presenceBus/autoRecall/identityCard/autoMaintenance/D2/D6/router/workers/embedding/autoTruncate 等,显式 `false` 可关;安全/灰度项仍默认关)、**身份默认中性**(身份由你的 `IDENTITY.md` 定义,
|
|
14
|
+
> 见 [docs/PRIVACY.md](docs/PRIVACY.md))、可移植性加固。质量门改用 Gate-3 V2
|
|
15
|
+
> 人类机制校准版,见 (判据文件随发布证据归档,不随发布包)。
|
|
8
16
|
|
|
9
17
|
**一句话**:一个大脑,多双手脚——把「我」从会话里搬出来,让人格与记忆长久化。
|
|
10
18
|
|
|
@@ -45,7 +53,7 @@ longlive 的做法,是把「我」从会话里搬出来,做成一个**共享
|
|
|
45
53
|
|
|
46
54
|
## 自动截断:会话长了怎么办
|
|
47
55
|
|
|
48
|
-
|
|
56
|
+
一个会话聊久了,上下文会越来越长:模型变慢、成本上升,最早说过的话被挤出可见窗口。自动截断就是给单个会话减负的部件——**1.8.0 起默认开启**(显式 `autoTruncate.enabled: false` 关闭);开启时它盯着会话大小,超过你设的阈值(默认 30 万 token)就动手:
|
|
49
57
|
|
|
50
58
|
- 先体检,再把整份会话文件备份一份;
|
|
51
59
|
- 然后收缩:要么只删不可见的历史事件(可见对话尽量一字不变),要么按轮次和预算只保留最近几轮,把更早的部分折叠压缩;
|
|
@@ -58,10 +66,18 @@ longlive 的做法,是把「我」从会话里搬出来,做成一个**共享
|
|
|
58
66
|
|
|
59
67
|
- **不改写记忆正文**。`memory_reinforce` 只改卡片头部的计数、日期,并追加一行使用记录,正文逐字节校验不变;`memory_forget` 只归档,不删文件。
|
|
60
68
|
- **默认配置不联网、不上传**。源码里没有网络请求,没有遥测;截断、备份、检索都在本机完成。但打开 `routerEnabled` / `routerFace.enabled` / 语义召回(embedding)后,插件会通过宿主调用你配置的模型 API——这是你显式开启后的行为。
|
|
61
|
-
- **不替你做决定**。备份、两个截断、遗忘默认 `dryRun: true`,真要写必须给对应的 `confirm` 词;`session_compact` 只受 `dryRun` 控制(没有 confirm
|
|
69
|
+
- **不替你做决定**。备份、两个截断、遗忘默认 `dryRun: true`,真要写必须给对应的 `confirm` 词;`session_compact` 只受 `dryRun` 控制(没有 confirm 词)。自动截断、路由判定、`worker_*` 扇出在 1.8.0 起默认开启(显式 `false` 可关);`answerGuard.gate`、`routerApplyEnabled`、`routerRuntime` 等安全/灰度项仍默认关。
|
|
62
70
|
- **默认不自动杀进程**。插件本体不关应用;只有你手动运行 `auto-truncate-run.ps1`,或装了看门并切到 request 模式时,它才会关宿主、剪完再打开。
|
|
63
71
|
- **不修已经损坏的会话**,也不恢复你手动删掉的消息。
|
|
64
72
|
|
|
73
|
+
## 隐私与身份(1.8.0)
|
|
74
|
+
|
|
75
|
+
- **默认中性身份**:1.8.0 起发布包与内置提示不含具体人名/角色;身份由你在记忆根下的 `IDENTITY.md` 定义(不建文件时使用中性默认)。蒸馏的 who 字段默认空,由你显式配置注入。
|
|
76
|
+
- **发布包隐私扫描**:打包时扫绝对路径/个人目录名等 blocker,计数必须为 0 才允许发版(发版门);包内不含记忆库、会话日志或本机路径。
|
|
77
|
+
- **共享大脑活动流默认开启(1.8.0 起,写侧 + 实时注入)**:数据只在本机 `memoryRoot`、不上传;不想要就设 `sharedBrain.activity.enabled: false` 后重启(回到 1.6.8 默认行为)。
|
|
78
|
+
- **共享大脑 thinking 默认开启(1.8.0 起,摘要级)**:只注入其他会话的**摘要**,不写原文、不进日志;写入/注入前复用隐私门(`local_only` 不写不注入);不想要设 `sharedBrain.thinkingInjection.enabled: false` 后重启。
|
|
79
|
+
- 细节与操作步骤见 [docs/PRIVACY.md](docs/PRIVACY.md)。
|
|
80
|
+
|
|
65
81
|
## 装之前
|
|
66
82
|
|
|
67
83
|
- **不用另装 Node**:DSH 自带运行时,`package.json` 要求 Node **>= 20.0.0**;下面用 `$NODE` 指向它。
|
|
@@ -81,7 +97,7 @@ $NODE = '<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\node\
|
|
|
81
97
|
|
|
82
98
|
```powershell
|
|
83
99
|
# 1. 安装本地 tgz(用 plugin add,不要用 npm install)
|
|
84
|
-
& $DSH plugin --profile desktop add "file
|
|
100
|
+
& $DSH plugin --profile desktop add "file:<path>/jjh32456-dsh-longlive-1.8.0.tgz"
|
|
85
101
|
|
|
86
102
|
# 2. 确认版本
|
|
87
103
|
& $DSH plugin --profile desktop list --depth 0
|
|
@@ -101,16 +117,16 @@ $NODE = '<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\node\
|
|
|
101
117
|
- 记忆:`session_wake`、`memory_index`、`memory_consolidate`、`memory_reinforce`、`memory_forget`、`memory_procedure`、`memory_recall`
|
|
102
118
|
- 协作:`worker_spawn`、`worker_status`、`worker_kill`、`lease_acquire`、`lease_release`
|
|
103
119
|
- 活体巡检:`session_live_update`、`session_live_list`、`session_live_get`、`session_live_prune`
|
|
104
|
-
- **Router 1.1.0
|
|
120
|
+
- **Router 1.1.0 默认开启(1.8.0 起)**:`routerEnabled` 不写或给 `true` 时起后台服务(上面仍是 22 个工具);写 `false` 关闭、不建
|
|
105
121
|
`.longlive/router/`、不起定时器。显式打开后先多 4 个 `router_*`(22→26);再开
|
|
106
122
|
`routerProposalEnabled` 多 3 个(26→29)。开关与默认值见 [docs/FEATURES.md](docs/FEATURES.md)
|
|
107
123
|
和 [docs/CONFIG.md](docs/CONFIG.md),建议先只开 `routerEnabled` 观察。
|
|
108
|
-
- **D2/D6
|
|
124
|
+
- **D2/D6 默认开启(1.8.0 起,显式 `false` 可关)**:`d2.enabled` 做工具输出裁剪(超长结果落盘、正文只留头尾),
|
|
109
125
|
`d6.enabled` 打开工具面裁剪(默认仍是 22 个工具,打开后多一个 `tool_search` 用来找回
|
|
110
126
|
被裁掉的工具)。打开方式、预算与回退见 [docs/FEATURES.md](docs/FEATURES.md) 和
|
|
111
127
|
[docs/CONFIG.md](docs/CONFIG.md)。
|
|
112
128
|
- 默认记忆目录:`%USERPROFILE%\.dsh\longlive-memory`(首次启动自动创建)。
|
|
113
|
-
- **没有自带界面**。另装可选的只读面板 `@jjh32456/dsh-longlive-panel@
|
|
129
|
+
- **没有自带界面**。另装可选的只读面板 `@jjh32456/dsh-longlive-panel@1.8.0` 后,侧栏才会出现「潜望镜」,里面有七个页签:六层视图、截断记录、过滤器决策、影子记录、常驻 Router、本轮想起(另有「使用说明」)。面板是独立可选包,不装就没有这个侧栏。
|
|
114
130
|
|
|
115
131
|
## 第一次使用
|
|
116
132
|
|
|
@@ -125,12 +141,21 @@ $NODE = '<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\node\
|
|
|
125
141
|
| [FAQ.md](docs/FAQ.md) | 装完没反应、401/404、断电、卸载、换电脑 |
|
|
126
142
|
| [README.en.md](README.en.md) | 给英文读者的一页版 |
|
|
127
143
|
|
|
128
|
-
开发、打包与回滚细节见 [docs/DEV.md](docs/DEV.md)
|
|
144
|
+
开发、打包与回滚细节见 [docs/DEV.md](https://github.com/jjh32456/dsh-longlive/blob/main/docs/DEV.md)(仓库内文档,npm 包不含)。
|
|
129
145
|
|
|
130
146
|
## 版本与边界
|
|
131
147
|
|
|
132
|
-
- 本套文档对应 **1.
|
|
148
|
+
- 本套文档对应 **1.8.0** 的本地 tgz(1.6.0 起包名由 `dsh-session-longlive` 改为 `dsh-longlive`;
|
|
133
149
|
1.6.4 起发布名改为 scoped 包 `@jjh32456/dsh-longlive`)。
|
|
150
|
+
**1.8.0 变更**:有据才答注入修复 + 来源闸(默认关闭的信心闸、证据投递修复,见
|
|
151
|
+
[docs/ANSWER-GUARD.md](docs/ANSWER-GUARD.md))、共享大脑 thinking(默认开启,仅摘要)、
|
|
152
|
+
身份默认中性([docs/PRIVACY.md](docs/PRIVACY.md))、可移植加固(node 走 `process.execPath`、
|
|
153
|
+
无绝对机器路径、干净 `DSH_HOME` 可 install/运行,Gate-4)。
|
|
154
|
+
**质量门**:Gate-3 采用人类机制校准版 `GATE3-CRITERIA-V2`(v2.1,sha256
|
|
155
|
+
`40A2C62D2CD07DA1D36C6B9211427A9496A0BD525F4E0862ED21AE94BA318D6D`,文件
|
|
156
|
+
(判据文件随发布证据归档,不随发布包));旧口径保留为双口径对照。
|
|
157
|
+
**共享大脑活动流**:`sharedBrain.activity`(1.8.0 起默认开启,写侧 + 实时注入;事件级活动写入 +
|
|
158
|
+
只注入其他会话新增、整条 ≤300 字;写盘跨进程锁、失败静默),与热截断互不影响。
|
|
134
159
|
**1.6.3 起新增热截断**:一个不调 LLM 的 cut-only 压缩引擎,通过 bundle patch 关掉宿主 stock
|
|
135
160
|
`compaction-basic` 行并插入 `compaction-hot-truncate`;只切「已完成、且早于保留窗口(默认 4 轮 /
|
|
136
161
|
8000 token)」的整轮,切前先把原文归档到 `<memoryRoot>/.longlive/hot-truncate/`,再用一条覆盖率指针
|
package/SPEC.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
# 插件规格:@jjh32456/dsh-longlive(久视)
|
|
2
2
|
|
|
3
3
|
> 命名(2026-11-06 改):发布包名 **@jjh32456/dsh-longlive**(1.6.4 起 scoped 发布名;
|
|
4
4
|
> 1.6.0–1.6.3 为 `dsh-longlive`),显示名「久视」(英文 Longlive)。原名
|
|
5
5
|
> `dsh-session-longlive`(2026-10-30 定),1.6.0 起迁移;拼写是 longlive,不是 longevity。
|
|
6
6
|
>
|
|
7
|
-
> 当前版本:**1.
|
|
8
|
-
>
|
|
7
|
+
> 当前版本:**1.8.0**(1.6.0 改名基座 + 1.6.3 热截断 + 1.6.4 的 300k 触发 / 保留 4 轮 + 1.6.7 热截断加固 + 1.8.0 有据才答/默认全开 +
|
|
8
|
+
> 1.8.0 共享大脑活动流与共享板状态诚实性;D2/D6 等插件功能 1.8.0 起默认开启(显式 false 关闭);安装包 `jjh32456-dsh-longlive-1.8.0.tgz`)。
|
|
9
9
|
|
|
10
10
|
## 零、安全性承诺(2026-10-30 要求:不能出错,出错就死了)
|
|
11
11
|
|
|
@@ -150,7 +150,7 @@ DSH 的 compaction 从不删事件:它追加一条 `compaction/summary` 和一
|
|
|
150
150
|
|
|
151
151
|
## 九、记忆层与可移植性说明(0.4.0 / 0.7.4 → 0.8.0)
|
|
152
152
|
|
|
153
|
-
> 0.4.0 建立了记忆层;0.7.4 修了 0.7.3 的宿主版本探测激活回归,并补齐 Node 引擎声明;0.7.7 把归档卡的路径抽取改成线性扫描(见 CHANGELOG 0.7.7)。本节以 0.8.0 的行为为准。0.8.0-rc.1 新增程序性记忆并补齐 consolidate 情绪标记/去重与 forget 归档;0.8.0-rc.2 把 R1 主脑决策层补齐并进包——契约 `decisions[] / needsHuman
|
|
153
|
+
> 0.4.0 建立了记忆层;0.7.4 修了 0.7.3 的宿主版本探测激活回归,并补齐 Node 引擎声明;0.7.7 把归档卡的路径抽取改成线性扫描(见 CHANGELOG 0.7.7)。本节以 0.8.0 的行为为准。0.8.0-rc.1 新增程序性记忆并补齐 consolidate 情绪标记/去重与 forget 归档;0.8.0-rc.2 把 R1 主脑决策层补齐并进包——契约 `decisions[] / needsHuman`、决策判官、override 审计、14 条 fixtures 与 `--check / --explain / run-sim` 双跑(见 CHANGELOG 0.8.0-rc.2);0.8.0-rc.3 把 六条判定编码进 R1——休息/本地备忘/删记忆/改旧结论/含糊指令/改画像各一条规则与夹具,新增 身份同意判官与 `E_IDENTITY_CONSENT_REQUIRED` / `E_SELF_CONSENT`(见 CHANGELOG 0.8.0-rc.3);0.8.0-rc.4 把策略拆成「通用默认 + 可选家规」——`src/router/policies/generic.json` 与 `src/policy-profile.js` 加载器、配置项 `routerPolicyProfile`、`E_ROUTE_PROFILE_UNKNOWN` / `E_ROUTE_POLICY_INVALID`(见 CHANGELOG 0.8.0-rc.4);0.8.0-rc.6 把 consolidate 的 A 组提取修复移植进包——`scope` 路由词表与 IDF 覆盖率打分、`contentTokens()` 分词、结论句路由、强制原文 `quote`、排期/低覆盖弃权,以及 `paragraphUnits()` 的 `startLine` 与 opt-in entry 切分(F6 默认关闭,见 CHANGELOG 0.8.0-rc.6);0.8.0-rc.7 把 R1 运行时影子接缝接进插件——`routerRuntime: off|shadow|on`(默认 off)、`src/router/runtime.js` 适配器、`src/tools.js` 的 `execute` 包裹与 `ctx.tools.guard`、`src/index.js` 构造注入,`on` 只拒绝高风险写入(见 CHANGELOG 0.8.0-rc.7);0.8.0-rc.8 增加可选 peer `@kenz1117/dsh-engram`、`src/deps.js` 启动自检与 `scripts/longlive-doctor.mjs`(只读 / `--json` / `--apply`),缺包只警告、不阻塞加载(见 CHANGELOG 0.8.0-rc.8);0.8.0-rc.9 把安装入口改成 `--setup` 向导——先打印缺失包/版本约束/目标 profile/确切命令/重启提示,输入大写 `YES` 才逐个执行 `dsh plugin add`,取消零副作用;新增 `--yes` 无人值守、`<DSH home>/longlive-doctor-audit.log` 审计行(consent/result/exitCode)与启动时一行 `--setup` 指引(见 CHANGELOG 0.8.0-rc.9)。
|
|
154
154
|
> 逐码排错见 `docs/ERRORS.md`;安装/回滚/卸载见 `QUICKSTART.md`。
|
|
155
155
|
|
|
156
156
|
### 9.1 配置与边界
|
|
@@ -200,5 +200,5 @@ src/memory/
|
|
|
200
200
|
|
|
201
201
|
`test/memory.test.mjs` 提供 6 个用例,挂在 `test/run.mjs` 的 P6 之前:M1 索引 dry-run/完整性/幂等/人工内容保留;M2 巩固只读;M3 加固 +1/封顶/备份/正文逐字节一致;M4 遗忘 dry-run 零写入、confirm 门、记忆切片行数=移动数;M5 六条越界路径全部 `E_PATH_OUTSIDE_ROOT`;M6 严格模式下 `memoryRoot` 未配置时四个工具全部 `E_MEMORY_ROOT_UNSET`(默认根行为由 `PORT1`–`PORT3` 覆盖)。`test/portability.test.mjs` 另提供 PORT1–PORT5:默认根创建、优先级链、严格/缺失语义、宿主版本区间、随包代码与脚本零本机路径(PORT5 递归扫描 `src/**`(按 `files` 白名单)、`scripts/`、`test/`,并扫描根目录随包文件与 `docs/ERRORS.md`;其余 `docs/` 不在扫描清单内,其中标注「本机示例」的示例路径不算违规)。`TOOLS` 注册数为 22。
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
打包(仓库内开发脚本,npm 包不含):`node scripts/pack.mjs` 产出 `dist/jjh32456-dsh-longlive-<version>.tgz`;是否发布到 npm registry 由维护者决定
|
|
204
204
|
(当前 registry 上查无此包,安装请用本地 tarball,见 `QUICKSTART.md`)。
|
package/cordis.patch.yml
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Defaults are intentionally complete: the plugin works with this file as-is.
|
|
1
|
+
# Defaults are intentionally complete: the plugin works with this file as-is.
|
|
2
2
|
# The memory root defaults to <DSH home>/longlive-memory (created on first use)
|
|
3
3
|
# and can be overridden here, or by DSH_LONGLIVE_MEMORY_ROOT / legacy DSH_MEM.
|
|
4
4
|
# Uncomment and edit only if you want a specific location:
|
|
5
|
-
# memoryRoot:
|
|
5
|
+
# memoryRoot: <memory-root>
|
|
6
6
|
# Router policy defaults to the generic profile (no personal house rules).
|
|
7
7
|
# Override with a name from src/router/policies/<name>.json:
|
|
8
8
|
# routerPolicyProfile: owner-rulings-2026-11-03
|
|
9
9
|
#
|
|
10
|
-
#
|
|
10
|
+
# 1.8.0 product default: features are all enabled here. Explicit false opts out; enabling one never enables
|
|
11
11
|
# another. When several are on, message order is [user, boot, runtime, auto]:
|
|
12
12
|
# boot is the identity open card (agent/pre-step, prepend:true) and auto is
|
|
13
13
|
# recall (agent/pre-step, prepend:false). TurnNavigator / firstUserText locates
|
|
@@ -52,13 +52,13 @@
|
|
|
52
52
|
# but every worker_spawn/worker_status/worker_kill call returns
|
|
53
53
|
# "unavailable" until this is true.
|
|
54
54
|
workers:
|
|
55
|
-
enabled:
|
|
55
|
+
enabled: true
|
|
56
56
|
# 1.6.0 release default: automatic visible truncation is OFF in the
|
|
57
|
-
# plugin code as well as here (enabled:
|
|
57
|
+
# plugin code as well as here (enabled:true / mode:dryrun). To opt out,
|
|
58
58
|
# set enabled:true and pick mode log|dryrun|request; request mode also
|
|
59
59
|
# needs the out-of-app runner/watchdog to act.
|
|
60
60
|
autoTruncate:
|
|
61
|
-
enabled:
|
|
61
|
+
enabled: true
|
|
62
62
|
mode: dryrun
|
|
63
63
|
# 1.2.0: passive observers are ON by default so the panel shows live
|
|
64
64
|
# data out of the box. Both are fail-open and never call an LLM.
|
|
@@ -69,13 +69,27 @@
|
|
|
69
69
|
filterEnabled: true
|
|
70
70
|
shadowEnabled: true
|
|
71
71
|
autoRecall:
|
|
72
|
-
enabled:
|
|
72
|
+
enabled: true
|
|
73
73
|
topK: 3
|
|
74
74
|
budgetTokens: 2000
|
|
75
75
|
everyNTurns: 6
|
|
76
76
|
identityCard:
|
|
77
|
-
enabled:
|
|
77
|
+
enabled: true
|
|
78
78
|
path: '<memoryRoot>/STATE.md'
|
|
79
79
|
presenceBus:
|
|
80
|
-
enabled:
|
|
80
|
+
enabled: true
|
|
81
81
|
pollMs: 3000
|
|
82
|
+
# 1.6.8: shared-brain activity stream (event-level writes, merged from the
|
|
83
|
+
# 1.6.1-rc.1 batch). On by default in 1.8.0; independent of presenceBus. When on,
|
|
84
|
+
# activity events append rows to <memoryRoot>/.longlive/board/activity.jsonl
|
|
85
|
+
# and agent/pre-step injects only rows newer than this session's lastSeenSeq. On by default in 1.8.0.
|
|
86
|
+
sharedBrain:
|
|
87
|
+
activity:
|
|
88
|
+
enabled: true
|
|
89
|
+
injectMaxChars: 300
|
|
90
|
+
maxItems: 5
|
|
91
|
+
# 1.6.9: memory/recall/forget v2 panel API (M2-F 16 read-only routes +
|
|
92
|
+
# M2-G 16 actions + HMAC audit + panel integrity). On by default; when
|
|
93
|
+
# off, NO route is registered and no v2 file is created (behaviour = 1.6.8). On by default in 1.8.0.
|
|
94
|
+
memoryV2:
|
|
95
|
+
enabled: true
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# ANSWER-GUARD(有据才答)· 1.8.0
|
|
2
|
+
|
|
3
|
+
本文件说明 1.8.0 合并进 longlive 的有据才答层(answer-guard)的来源、开关、接线、评测入口与打包边界。
|
|
4
|
+
|
|
5
|
+
## 1. 来源与版本
|
|
6
|
+
|
|
7
|
+
- 上游:`<answer-guard-repo>`(answer-guard 1.6.5-rc.1;冻结见 `eval/gate3/frozen-fix-2/FROZEN-MANIFEST.json`)。
|
|
8
|
+
- 1.8.0 合并:`src/answer/` 六类文件(语义拆分,实现单源在 `guard.js`):
|
|
9
|
+
- `guard.js` ← 上游 `core.mjs`(规则/证据检索/数字与轮号检测/审计行计算,纯函数单源);
|
|
10
|
+
- `evidence.js` ← 证据注入面(`retrieveEvidence` / `renderEvidencePacket` / 无证据标记等语义导出,转发 `guard.js`);
|
|
11
|
+
- `second-hop.mjs` ← B4 证据包字段覆盖不足时的第二跳补读(最多 1 跳);
|
|
12
|
+
- `audit.js` ← 上游 `store.js`(生成后审计落盘/轮转/读回)+ 审计纯函数转发;
|
|
13
|
+
- `query.js` ← 上游 `tool.js`(只读工具 `answer_audit`);
|
|
14
|
+
- `index.js` ← 上游 `index.js`(`registerAnswerGuard`:pre-step 证据注入、systemPrompt 规则 section、session/event turn/end 审计、只读面板路由)。
|
|
15
|
+
- 历史修复随合并带入:`HISTORY_CUE_RE` 的「上一次/上回/上上轮」族 + 审计上下文尾部保留/显式截断(`contextTruncated` 可机读)。
|
|
16
|
+
- 1.8.0 新增:**M1 信心闸(审计级)**、**M1.5 文本层硬规则**、**R1 检索断链修复**(见 §2、§3)。
|
|
17
|
+
|
|
18
|
+
## 2. 开关(1.8.0 默认 ON)
|
|
19
|
+
|
|
20
|
+
- `answerGuard.enabled` 默认 `true`(`src/config.js` schema;`resolveActivationSwitches` 的 `answerGuardEnabled` 为运行期统一门)。
|
|
21
|
+
- 独立 kill switch:`answerGuard.enabled: false`,或环境变量 `DSH_LONGLIVE_DISABLE_ANSWER_GUARD=1`。
|
|
22
|
+
- 关闭时行为:零 hook、零系统提示 section、零审计 IO(`registerAnswerGuard` 不注册,`src/index.js` 不创建 `answer_audit` 工具)。
|
|
23
|
+
- 其他子开关(默认值):`audit=true`、`auditMaxBytes=2 MiB`、`auditContextChars=40000`、`systemPromptSection=true`、`injectRule=true`、`panel=true`、`maxEvidenceTurns=3`、`evidenceMinScore=1.8`、`evidenceMaxChars=4000`、`maxHistoryTurns=80`。
|
|
24
|
+
- **信心闸(M1)默认关闭**:`answerGuard.gate.enabled=false`;这不是 answer-guard 总开关,关闭时审计与注入仍按 1.8.0 原行为运行,系统提示逐字节不变。
|
|
25
|
+
|
|
26
|
+
### 2.1 信心闸(M1 / M1.5)配置
|
|
27
|
+
|
|
28
|
+
| 键 | 默认值 | 说明 |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `answerGuard.gate.enabled` | `false` | M1 灰度开关。只有 `true` 时 `auditTurn` 才做三态判定并写 `gate` 字段;默认关=保持 1.8.0 现状。 |
|
|
31
|
+
| `answerGuard.gate.minCoverage` | `0.6` | 有事实断言的句子中,带轮号引用或 `【推断】` 标注的最低比例。低于此值判 `degraded`。 |
|
|
32
|
+
| `answerGuard.gate.requireReadable` | `true` | 草稿引用的轮号必须在本轮证据包轮次内且 excerpt 非空;不可回读时判 `abstain`。 |
|
|
33
|
+
| `answerGuard.gate.conflictPolicy` | `degrade` | 证据冲突策略:`degrade`(降级,默认)或 `abstain`(弃答)。 |
|
|
34
|
+
|
|
35
|
+
- 开启方式(profile 的插件 config,YAML 示例):
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
- id: session-longlive
|
|
39
|
+
config:
|
|
40
|
+
answerGuard:
|
|
41
|
+
enabled: true # 1.8.0 默认已是 true;显式保留便于审计
|
|
42
|
+
gate:
|
|
43
|
+
enabled: true # M1 信心闸灰度开关(默认 false)
|
|
44
|
+
minCoverage: 0.6
|
|
45
|
+
requireReadable: true
|
|
46
|
+
conflictPolicy: degrade
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- `gate` 目前**只有配置开关,没有独立环境变量**;整个 answer-guard 的 kill switch 仍是 `DSH_LONGLIVE_DISABLE_ANSWER_GUARD=1`(或 `answerGuard.enabled=false`)。
|
|
50
|
+
- M1 是**审计级**:`auditTurn` 产出三态 `gate.mode`(`answer`/`degraded`/`abstain`)、`gate.reasons`、`gate.signals`、`gate.assertions`,并写入审计行 `gateVersion=1`;不直接改写助手正文。开启后若模型应弃答却输出事实断言,记 `GATE_ABSTAIN_VIOLATION`;应降级但首句没有「不确定」标注,记 `GATE_DEGRADED_MISSING`。
|
|
51
|
+
- M1.5 是**文本层硬规则**:`gate.enabled=true` 时,系统提示追加 `GATE_RULE_TEXT`(无证据不许作答、只用白名单轮号、每个事实句带引用、数字必须能在 excerpt 找到、未标注推断=幻觉等);`gate.enabled=false` 时只注入原 `RULE_TEXT`,不改变既有行为。
|
|
52
|
+
- 回退:把 `answerGuard.gate.enabled` 改回 `false`(或删除 `gate` 块)即可一键回到 M1 之前的现状,无需卸载/重启以外的其他操作。
|
|
53
|
+
|
|
54
|
+
## 3. 检索断链修复(R1)
|
|
55
|
+
|
|
56
|
+
- `evidenceMaxChars` 默认值 **1200 → 4000**:证据包总预算扩大,避免主证据被截掉。
|
|
57
|
+
- `renderEvidencePacket` 的助手 excerpt 窗口 **300 → 800**:答案点落在第 300–800 字区间时不再「注入了但看不到答案」。
|
|
58
|
+
- `HISTORY_CUE_RE` 新增 **「当时 / 那时 / 那次 / 当天」**:这些说法现在也触发历史检索与轮号引用规则;`HISTORY_CLAIM_RE` 同步覆盖对应的历史断言。
|
|
59
|
+
- 检索层仍只读、fail-open;证据不足/通道读不到时不会伪装成「零命中」逼模型弃答(沿用 1.8.0 原语义)。
|
|
60
|
+
- 相关评测:`test/answer-history-cue.test.mjs` 覆盖 cue 触发;`test/answer-evidence-context.test.mjs` 覆盖证据上下文/数字可回读边界。
|
|
61
|
+
|
|
62
|
+
## 4. 接线位置
|
|
63
|
+
|
|
64
|
+
- `src/index.js`:`registerFeatures(...)` 之后,按 `resolveActivationSwitches().answerGuardEnabled` 调用 `registerAnswerGuard(ctx, config, { memoryRoot, home, now, knownTools })`;同时把 `createAnswerTools(memoryRoot)` 作为 `answerTools` 传给 `registerTools`(基线 22 工具 + `answer_audit`)。
|
|
65
|
+
- `agent/pre-step`(最外层,`prepend:true`):历史类问题先检索会话历史,注入证据包(`EVIDENCE_MARK`)或无证据标记(`NO_EVIDENCE_MARK`)。
|
|
66
|
+
- `ctx.systemPrompt.section`:静态短规则(order 9500);宿主无该能力时用隐藏消息兜底(`injectRule`);gate 开启时追加 M1.5 硬规则。
|
|
67
|
+
- `session/event`:逐轮收集助手正文/tool calls/工具结果,`turn/end` 写生成后审计(含 gate 字段)。
|
|
68
|
+
- 审计文件:`<memoryRoot>/.longlive/answer-audit/audit.jsonl`(一行一轮,只追加;超 `auditMaxBytes` 轮转到同目录 `audit.1.jsonl`;坏行只计数不抛)。
|
|
69
|
+
- 面板:`GET /api/longlive/answer-audit` 与 `answer_audit` 工具同源(只读)。
|
|
70
|
+
- 所有路径 fail-open:注册/注入/审计失败只 warn,pre-step 永远返回原 decision;gate 判定异常只置空 `gate`,不改原 flags。
|
|
71
|
+
|
|
72
|
+
## 5. 评测入口(dev-only,不随包发布)
|
|
73
|
+
|
|
74
|
+
- 仓库内评测脚本(**npm 包不含**):`scripts/answer-eval/run-eval.mjs`:100 题确定性评测(**不调模型/不用 VM**,只跑证据层与检测器),支持 `--json --fixture <fixture-100.jsonl> --out <dir>`。
|
|
75
|
+
- 仓库内评测脚本(**npm 包不含**):`scripts/answer-eval/score-real.mjs` / `score-extras.mjs`:真实模型 run 的评分/聚合(Gate-3/5 用;输入需 `--run/--audit/--plan`)。
|
|
76
|
+
- fixture:`test/fixtures/answer-guard/fixture-100.jsonl`(dev-only,不进 npm 包)。
|
|
77
|
+
- 关键测试:`test/answer-guard.test.mjs`、`test/answer-history-cue.test.mjs`、`test/answer-evidence-context.test.mjs`;gate 的 dev-only 回归以 M1 合入测试为准(不进入 npm 包)。
|
|
78
|
+
|
|
79
|
+
## 6. 打包边界
|
|
80
|
+
|
|
81
|
+
- npm `files` 白名单包含 `src/answer/*.js`、显式的 `src/answer/second-hop.mjs` 与 `docs/ANSWER-GUARD.md`。
|
|
82
|
+
- `scripts/answer-eval/`、`test/fixtures/answer-guard/`、`eval/` 均不进入 npm 包(dev-only),避免评测数据/私有路径进包。
|
|
83
|
+
- src 内无本机私有绝对路径;memoryRoot/路径均运行时解析(`process.execPath` 仅用于测试脚本 spawn,非硬编码路径)。
|
|
84
|
+
- 发布前用只读 `tar -tf <tgz>` 核对包内 answer 文件齐全;不要在文档任务里执行 `npm pack`(打包归 release-check)。
|
|
85
|
+
|
|
86
|
+
## 7. 验证命令
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
$NODE = "<node-exe>" # PATH 中的 node,或本机 Node 绝对路径(不随包)
|
|
90
|
+
$NODE --test test/answer-guard.test.mjs test/answer-history-cue.test.mjs test/answer-evidence-context.test.mjs
|
|
91
|
+
# 仓库内评测脚本(npm 包不含)\n$NODE scripts/answer-eval/run-eval.mjs --json --fixture test/fixtures/answer-guard/fixture-100.jsonl --out $env:TEMP\answer-eval-out
|
|
92
|
+
```
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ARCHITECTURE.md — 结构、边界与数据流(1.
|
|
1
|
+
# ARCHITECTURE.md — 结构、边界与数据流(1.8.0,≤150 行)
|
|
2
2
|
|
|
3
3
|
读者:要知道"谁在什么时候写哪个文件、为什么不能都在宿主里做"的运维/排障人员。
|
|
4
4
|
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
| 压缩分析 | `src/compaction.js` | `shadowedEvents` / `stillStored` / `reclaimed`(磁盘回读才算) | 宿主内(只读) |
|
|
59
59
|
| live 保护 | `src/live-target.js` | 三路判定"会话是否还在跑";`SESSION_IS_RUNNING`(工具层只 import 其中的 id 辅助函数,不做三路探测) | 宿主内(仅 id 判定)+ CLI |
|
|
60
60
|
| live 注册表 | `src/live.js` | 行读写、effectiveState、prune | 宿主内 |
|
|
61
|
-
| 心跳 | `src/heartbeat.js` | turn
|
|
61
|
+
| 心跳 | `src/heartbeat.js` | turn 边界状态机维护 state/turn + 15s 定时/tool touch 刷新已绑定行;`0` 只关定时与 touch | 宿主内 |
|
|
62
62
|
| 记忆存储 | `src/memory/*.js` | 卡片、索引、巩固、遗忘、程序卡、检索 | 宿主内 |
|
|
63
63
|
| 路径解析 | `src/memory/paths.js` | memoryRoot 五级优先、越界检查、严格模式 | 宿主内 |
|
|
64
64
|
| R1 运行时 | `src/router/runtime.js` | off/shadow/on;只拦 4 个 memory 工具;fail-closed | 宿主内 |
|
|
@@ -66,7 +66,8 @@
|
|
|
66
66
|
| runner | `scripts/auto-truncate-run.ps1` | 校验→关应用→切→验证→重启;退出码 0/2/3/4/5/6 | **宿主外** |
|
|
67
67
|
| CLI | `scripts/truncate-cli.mjs` | 无工具层的最小切口;自带 live 拒绝 | **宿主外** |
|
|
68
68
|
| doctor | `scripts/longlive-doctor.mjs` | 可选依赖/版本/安装计划;默认只读 | **宿主外** |
|
|
69
|
-
| 面板 | `@jjh32456/dsh-longlive-panel@
|
|
69
|
+
| 面板 | `@jjh32456/dsh-longlive-panel@1.8.0` | 六层视图/截断记录/过滤器决策(未并入,显示样例)/影子记录/常驻 Router,只读 | 独立可选插件 |
|
|
70
|
+
| 共享大脑活动流 | `src/activity/*`(`sharedBrain.activity`,1.8.0 起默认开启) | 事件级写活动行(同 key ≤1 条/10s;turn/end 写结论行)到 `.longlive/board/activity.jsonl`;agent/pre-step 只注入其他会话的增量(判重/蒸馏/500 条窗口);与 `presenceBus` 解耦 | 宿主内(只写记忆根) |
|
|
70
71
|
| 校验器 | `<tools-dir>\ops\tools\verify-truncation.mjs`(本机示例,不在包内) | V1–V7 结构验收;不写不修 | **宿主外** |
|
|
71
72
|
|
|
72
73
|
---
|
|
@@ -49,7 +49,7 @@ fixture 见 `test/fixtures/pre-step-container.mjs`:`PreStepBus.waterfall()`
|
|
|
49
49
|
|
|
50
50
|
`assertInjectionSource()` 会拒绝任何别的形状。宿主据此把消息投影为 **context
|
|
51
51
|
节点**,`isVisibleChatNode()` 返回 false:聊天里看不到,但 `deriveMessages` 仍
|
|
52
|
-
|
|
52
|
+
含正文。审计入口是**潜望镜**面板(1.8.0:`GET /api/longlive-panel/v2/state` 返回 27 条路由 / 18 个动作;「本轮想起」读 `.longlive/recall-log.jsonl`),不是聊天气泡。这也是“回忆不可见”的实现基础。
|
|
53
53
|
|
|
54
54
|
## 顺序合并
|
|
55
55
|
|
package/docs/AUTO-RECALL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 自动想起(auto-recall)
|
|
2
2
|
|
|
3
|
-
0.9.0-rc.1 把 auto-recall
|
|
3
|
+
0.9.0-rc.1 把 auto-recall 作为可选能力收进主包。**1.8.0 起默认开启**(未显式给则 `true`,仅字面 `false` 关闭);开启时它在本轮
|
|
4
4
|
`agent/pre-step` 的 waterfall 末端读取 memoryRoot 下的卡片,挑与当前用户消息
|
|
5
5
|
最相关的几段,作为一条合成 user 消息并入本轮上下文。
|
|
6
6
|
|
|
@@ -15,12 +15,12 @@ config:
|
|
|
15
15
|
everyNTurns: 6
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
默认值:`enabled:
|
|
19
|
-
`enabled: false`
|
|
18
|
+
默认值:`enabled: true`(1.8.0 起)、`topK: 3`、`budgetTokens: 2000`、`everyNTurns: 6`。
|
|
19
|
+
显式 `enabled: false` 时零注入,行为与无此能力时一致。
|
|
20
20
|
|
|
21
|
-
## 语义召回(embedding
|
|
21
|
+
## 语义召回(embedding,1.8.0 起默认开启;模型缺失静默退关键词)
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
在关键词之外,可以再挂一个**本地**向量召回(1.8.0 起默认开;模型缺失时静默走关键词)。它和 `autoRecall` 是两个独立的开关:
|
|
24
24
|
`embedding.enabled` 只决定“有没有向量”,`autoRecall.enabled` 决定“要不要自动注入”。
|
|
25
25
|
|
|
26
26
|
```yaml
|
|
@@ -67,6 +67,12 @@ config:
|
|
|
67
67
|
- 隐私过滤先过 gate(`DSH_PRIVACY_GATE` 指向的外部 gate 或本地 PII 规则),
|
|
68
68
|
命中私密片段就不注入。
|
|
69
69
|
|
|
70
|
+
### 卡片层与链接(1.8.0)
|
|
71
|
+
|
|
72
|
+
- **AutoCard**:每个 EventRecord 一条派生索引卡(`.longlive/index/cards.jsonl`,`eventId` 幂等),带 `anchor {sessionId,turn,seqStart,seqEnd,digest}`;逐行 HMAC 签名,`anchor.digest` 用 `turnDigest` 与 L0 校活,注入时带 `[原文 sessionId#turn]`。
|
|
73
|
+
- **精卡 sidecar 回链**:`.longlive/index/card-anchors.jsonl` 记录人工 `topics/` 卡到源文件的锚点;`legacy:true` = 无可用锚点,**不计入「已链接」**(本机基线 25 张 → linked 7 / legacy 18)。
|
|
74
|
+
- **自动蒸馏/自动结论**:`autoConclusion` 1.8.0 起默认开启(显式 `false` 关闭);蒸馏/遗忘口径见 `M2D-FORGETTING.md`,签名与信任边界见 `CONFIG.md` §1.11b。
|
|
75
|
+
|
|
70
76
|
## 什么时候想、什么时候安静
|
|
71
77
|
|
|
72
78
|
- 只在 `payload.step === 1` 触发;同一轮后续 step 不重复注入。
|
|
@@ -114,10 +120,10 @@ id 的字典序。
|
|
|
114
120
|
|
|
115
121
|
## 测试
|
|
116
122
|
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
-
|
|
123
|
+
- 仓库测试(npm 包不含):`test/auto-recall.test.mjs`
|
|
124
|
+
- 仓库测试(npm 包不含):`test/embedding-recall.test.mjs`(tokenizer / 增量缓存 / 融合 / recall-log)
|
|
125
|
+
- 仓库测试(npm 包不含):`test/integration-pre-step.test.mjs`
|
|
120
126
|
- `test/v4-hardening.test.mjs`
|
|
121
|
-
- `test/feature-flags.test.mjs
|
|
127
|
+
- `test/feature-flags.test.mjs`(默认值与单开关隔离)
|
|
122
128
|
|
|
123
129
|
统一入口:`node test/run-rc.mjs`。
|