@akasha-book/session 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -35
- package/cordis.patch.yml +5 -1
- package/lib/index.js +7 -0
- package/package.json +9 -14
package/README.md
CHANGED
|
@@ -1,41 +1,31 @@
|
|
|
1
|
-
# @akasha-book/session
|
|
2
|
-
|
|
3
|
-
阿卡夏之书**会话层**插件 —— **自动增量索引 + 压缩事件行 + 节奏条 + 循环观测 P0(dry 干跑)**。
|
|
4
|
-
核心逻辑归 `core/session.mjs` 与 `core/loop-detect.mjs`(本插件只做调度与注入;降级只留痕,不炸宿主)。
|
|
5
|
-
|
|
6
|
-
- **触发**:`session/event → turn/end`(按会话去抖 `minIndexIntervalMs`,默认 30s)→ 增量索引(水位 + 指纹双幂等);`agent/status → idle` 追平;`ctx.interval` 兜底。
|
|
7
|
-
- **压缩事件行**:`session/event → compaction/end`(成功压缩)→ 先强制补索引(绕过去抖/背压)→ 观测线(带 `indexed`/`reason`)+ 节奏条点名。**只有补索引确认成功才说「已收入」**;失败时改说「可能未进会话层」并给回退(原始会话档案 / `session index`),同会话后续索引成功即改口(wave1 · B1)。
|
|
8
|
-
- **循环观测 P0**:**dry 干跑——只观测、只写观测线;绝不干预**。流环=`agent/assistant-stream` 帧按 attemptId 累积(每 480 字符对尾 8K 跑 `detectLoops`);turn 环=事件流缓存全文兜底;命中与帧类型探针写 `logs/hooks.jsonl`。汇总 CLI:`node akasha.mjs session loopwatch`。
|
|
9
|
-
- **节奏条**:`systemPrompt.context`(`akasha:session`,order 134)——段数 / 会话数 + 回看提示;无数据静默。
|
|
10
|
-
- **索引观测线**:`session-index`(added / skipped / parseFails / ms / **lagMs**=事件循环延迟采样)/ `session-index-skip` / `session-index-error` / **`session-index-slow`**(单次索引 >1.5s 告警,含 lagMs)。
|
|
11
|
-
- 配置:`akashaDir`(核心库位置)/ `sessionsRoot`(宿主会话档案目录)/ `storeFile` / `metaFile` / `log`;默认见 `lib/index.js` 的 DEFAULTS。
|
|
12
|
-
- 自测:`node selftest.mjs`(桩 ctx 端到端;临时目录,不碰真实数据;需与本包 `core/` 并列)。
|
|
1
|
+
# @akasha-book/session
|
|
13
2
|
|
|
14
|
-
|
|
15
|
-
- **观测语义(worker 化后)**:`session-index` 新增 `via`(worker/inline)与 `hostMs`(宿主投递耗时);**`session-index-slow` 的含义变为「后台耗时 >1.5s」**——宿主卡顿请看 `hostMs` / `lagMs`。
|
|
3
|
+
阿卡夏之书会话层插件 v0.2.3 —— **自动增量索引 + 压缩事件行 + 节奏条 + 循环观测 P0(dry 干跑)**(核心逻辑归 `<AKASHA_DIR>/session.mjs` 与 `akasha\loop-detect.mjs`;手动用法 `node akasha.mjs session …` 与 `node akasha.mjs session loopwatch`)。
|
|
16
4
|
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
- **触发**:`session/event → turn/end`(按会话去抖 `minIndexIntervalMs`,默认 30s)→ `indexSession` 增量(水位 + 指纹双幂等);`agent/status → idle` 追平;`ctx.interval` 兜底(`timerCheckMs`,默认 4 分钟——timer 属混入服务,必须 `inject:['timer']`,否则 apply 整段失败且零日志)。
|
|
6
|
+
- **压缩事件行**:`session/event → compaction/end`(**成功**压缩,`data.error` 空才记;2026-10-07 复查:旧写法 `agent/created source==='compact'` 是错的——该事件的 source 只有 startup/resume)→ `session-compact` 线 + 节奏条点名(「被折叠历史的细节优先查会话层」)。
|
|
7
|
+
- **循环观测 P0(2026-10-07 起,受控解冻第十六次)**:**dry 干跑——只观测、只写观测线;绝不 steer / cancel / 注入**。流环:**现役格式=`agent/assistant-stream` 帧**(`{type:'start'|'chunk'|'end', attemptId, revision, index, chunk}`——真值对 `dsh-agent-loop` 的 `AssistantStreamAttempt` 与 `dsh-headless` 消费口径三方核实;**chunk 帧不带 turn/step,由 start 帧缓存补全**;`assistant/chunk` 为 **V0 遗物**,仅兼容保留),按 `${sid}:{attemptId}:{index}:{stream}` 累积 delta(`reasoning-delta`/`text-delta`),每 `watchCheckEvery`(480)字符对尾 8K 跑 `loop-detect.detectLoops`;turn 环:`agent/turn-stopping` + `turn/end` 兜底,取数=**事件流缓存的最新 assistant/message**(2026-10-07 复查:官方 Session 无 `.events` 属性、同步读者已被弃用——插件不得伸手进日志)。命中 → `loop-watch{phase:'stream'|'turn', hit:{type:exact|variant|punct, excerpt≤60}}`;每会话前 8 个新帧/chunk 类型记 `loop-watch-probe`(防真值漂移;**满 8 即停为设计上限**)。汇总:`node akasha.mjs session loopwatch`。
|
|
8
|
+
- **节奏条**:`systemPrompt.context`(`akasha:session`,order 134)——段数 / 会话数 + 回看提示;无数据静默(`null`,不说话)。
|
|
9
|
+
- **降级**:核心库不可用 / 日志不可写 / 档案缺失 / 空会话 id(静默跳过)→ 只留痕(`session-index-error`),不炸、不失活(sleep v1.5 同款范式)。背压:**统一失败窗口 5 分钟**(未命中 / 链接 / 执行失败均静默退避;链接类错误附加「疑似宿主模块代缓存」提示——重启桌面端恢复);stat 快照只在**成功**索引后记账(失败可重试)。
|
|
10
|
+
- **性能边界(诚实注记)**:正常触发为全量重读(重解压 + 重解析 + 扫 `sessionsRoot`),基线约 0.32s / 4.7MB;两道减负:档案 size+mtime 未变 → stat 快路跳过;>16MB → 节流 ×4。30s 去抖 + 空闲 / 定时触发下当前规模可接受,再大(>40MB 常态)需改成增量帧读取。循环观测的流式检测为节流检查(每 480 字符一次 8K 尾窗),实测开销可忽略。
|
|
11
|
+
- 观测线:`session-armed` / `session-index`(added / skipped / parseFails / ms / lagMs)/ `session-index-skip` / `session-index-error` / `session-index-slow`(>1.5s 告警,含事件循环延迟)/ `session-compact` / `loop-watch` / `loop-watch-probe`,全部写 `akasha\logs\hooks.jsonl`。
|
|
12
|
+
- 自测:`node selftest.mjs`(桩 ctx 端到端;临时目录,不碰真库;当前 **18/18**)。节流以**单调 seen 计数**(缓冲 20K 截尾不影响——复核 F1 修复:饱和后尾段仍继续检查)。
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
兼容声明见 manifest 的 `dsh.compatibility.dshReleases`:**0.2.0-rc.2 = compatible**(本机实测运行),
|
|
22
|
-
`0.2.1-alpha.1` / `0.2.1-alpha.2` 尚未实测 ⇒ 按契约如实写 `unknown`(不猜、不吹)。
|
|
14
|
+
## 打包 / 安装
|
|
23
15
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
| 真实 Profile 运行 | **verified(本机)** | 桌面端 0.2.0-rc.2 实跑;**他人机器 unverified**(未做外部验收) |
|
|
30
|
-
| 独立安全审计 / 公开分发(E5) | **unverified** | 未做独立审计;分发前应重评 |
|
|
16
|
+
```powershell
|
|
17
|
+
cd <LOCAL_PATH>
|
|
18
|
+
npm pack
|
|
19
|
+
# 然后:plugin_manager install_bundle <tgz 绝对路径>(本 profile 为启动型:装载/替换以重启生效,以安装返回为准)
|
|
20
|
+
```
|
|
31
21
|
|
|
32
|
-
|
|
33
|
-
② 提交 DSH STORE 上架申请(monorepo 子路径:`tree/main/plugins/<name>`)并跟进机器人预检。
|
|
34
|
-
若任一版本复测失败,该版本标注为 `blocked`(不兼容)并保持其余版本声明不动。
|
|
22
|
+
## v0.3.0(2026-10-10)—— 索引 worker 化(会话层计划里的 v0.4 队列项)
|
|
35
23
|
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
-
|
|
24
|
+
- **架构**:宿主回调只投递(`postMessage`,µs 级返回);常驻 worker 线程 `lib/index-worker.mjs`(apply 即预热)串行执行索引、同会话排队去重;重活不再占用宿主事件循环。
|
|
25
|
+
- **观测语义**:`session-index` 新增 `via`(worker/inline)与 `hostMs`(宿主投递耗时);**`session-index-slow` 此后表示「后台耗时 >1.5s」——宿主卡顿请看 `hostMs` / `lagMs`**。
|
|
26
|
+
- **降级链**:`indexMode: 'worker' | 'inline'`(默认 worker);worker **连续** 3 次失败(任何成功即回零)自动降级 inline,落 `session-worker degraded-inline` 线。
|
|
27
|
+
- **跨进程锁**:`indexSession` 以 `session-meta.json.lock` 串行化「读水位 → 追加 → 记账」(复用 `lib.withFileLock`;陈锁 30s 夺取、等待上限 5s)——worker 与 CLI `session index` 互斥。
|
|
28
|
+
- **退出协议**:dispose → `{type:'quit'}` → drain → 关闭;5s 未退强杀。
|
|
29
|
+
- **实测**:热路径 `hostMs=0`;2.1MB 档案 inline 宿主阻塞 161ms → 投递 0.06ms;真实 17.53MB 档案 1267ms → 0.37ms;部署后首个真活 `via=worker ms=840 hostMs=0 lagMs=10`。
|
|
30
|
+
- **测试**:`node selftest.mjs` **22/22**(含 2 条 worker 用例);OSS 版同套 22/22。
|
|
31
|
+
- 回滚:备份 `_rollback-20261010-session-v04\`;或 `indexMode: 'inline'` 即回旧路径。
|
package/cordis.patch.yml
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
- id: akasha-session
|
|
3
3
|
name: '@akasha-book/session'
|
|
4
4
|
config:
|
|
5
|
-
|
|
5
|
+
log: '<AKASHA_DIR>/logs\hooks.jsonl'
|
|
6
|
+
akashaDir: '<AKASHA_DIR>'
|
|
7
|
+
sessionsRoot: '<LOCAL_PATH>'
|
|
8
|
+
storeFile: '<AKASHA_DIR>/data\session.jsonl'
|
|
9
|
+
metaFile: '<AKASHA_DIR>/data\session-meta.json'
|
|
6
10
|
contextOrder: 134
|
|
7
11
|
minIndexIntervalMs: 30000
|
package/lib/index.js
CHANGED
|
@@ -108,6 +108,13 @@ export function summarizeWatch(result, stream, atChars, hitSet, phase = 'stream'
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
export function apply(ctx, config = {}) {
|
|
111
|
+
|
|
112
|
+
// A/B 实验开关(2026-10-10 用户解冻,见 docs/ab-experiment-design.md §6):
|
|
113
|
+
// abOff=true ⇒ **关闭臂**——本插件不注册任何守卫/注入/工具,只记一行观测;库文件与日志照旧(便于事后复盘)。
|
|
114
|
+
if (config.abOff === true) {
|
|
115
|
+
try { (ctx.logger?.info ?? (() => {}))('session: abOff=true(A/B 关闭臂)——本插件不注册任何面'); } catch { /* 静默 */ }
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
111
118
|
const cfg = { ...DEFAULTS, ...config };
|
|
112
119
|
const require_ = createRequire(import.meta.url);
|
|
113
120
|
const core = () => require_(join(cfg.akashaDir, 'session.mjs'));
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akasha-book/session",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
"version": "0.3.2",
|
|
4
|
+
"engines": {
|
|
5
|
+
"node": ">=22.15.0"
|
|
6
|
+
},
|
|
7
7
|
"type": "module",
|
|
8
|
-
"description": "
|
|
8
|
+
"description": "阿卡夏之书会话层插件 v0.4:索引 worker 化(宿主只投递 + 常驻 worker 线程串行索引)+ 自动增量索引(turn/end 去抖)+ 压缩事件行 + 每回合节奏条 + 循环观测 P0(dry 干跑——只观测不干预;核心逻辑归 akasha\\session.mjs,可手动 node akasha.mjs session …)",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": "./lib/index.js"
|
|
11
11
|
},
|
|
@@ -15,17 +15,12 @@
|
|
|
15
15
|
"cordis.patch.yml",
|
|
16
16
|
"README.md"
|
|
17
17
|
],
|
|
18
|
-
"scripts": { "test": "node selftest.test.mjs" },
|
|
19
18
|
"dsh": {
|
|
20
19
|
"bundle": {
|
|
21
20
|
"patch": "./cordis.patch.yml"
|
|
22
|
-
},
|
|
23
|
-
"compatibility": {
|
|
24
|
-
"dshReleases": {
|
|
25
|
-
"0.2.0-rc.2": "compatible",
|
|
26
|
-
"0.2.1-alpha.1": "compatible",
|
|
27
|
-
"0.2.1-alpha.2": "compatible"
|
|
28
|
-
}
|
|
29
21
|
}
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
30
25
|
}
|
|
31
|
-
}
|
|
26
|
+
}
|