dsh-plugin-om 0.0.14 → 0.0.16

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 CHANGED
@@ -83,13 +83,14 @@ dsh的"预设"分为两层,`dsh web`等同于`dsh --profile web`,调用的
83
83
  ### 压缩日志块结构
84
84
 
85
85
  - 观察压缩只精确替换被压缩的新消息区间:旧 <history> 块保留为独立消息,新观察日志作为新块追加在其后(多块并存按序排列),历史不会随压缩次数膨胀;反思合并时才把多个块合并为一条更紧凑的摘要
86
- - 压缩边界:消息列表中最后一个合法的 <history> 块(source 为插件)之后的消息视为未压缩;其前(含自身)视为已压缩,不重复压缩、不计入观察阈值
87
- - 观察输入经 `@xmldom/xmldom` 构建为合法 <history> 块(用户消息文本/assistant 文本/reasoning 特殊字符自动转义,图片/文件以注释补充;assistant 文本与 toolcall&result 原样)
86
+ - 压缩边界:消息列表中最后一个合法的 <history> 块(source 为插件,plugin 为插件标识 `dsh-plugin-om`;兼容旧日志的宿主 checkpoint 标记 `compact`)之后的消息视为未压缩;其前(含自身)视为已压缩,不重复压缩、不计入观察阈值
87
+ - 观察输入经 `@xmldom/xmldom` 构建为合法 <history> 块(用户消息文本/assistant 文本/reasoning 特殊字符自动转义,图片/文件以注释补充;assistant 文本与 toolcall&result 原样;系统消息——user_message 中 source.kind 非 user 的部分,如宿主注入的上下文——渲染为 <sys type="KIND" index="N"></sys> 空块,内容不进入压缩输入)
88
88
  - 输出经 `@xmldom/xmldom` 解析校验:结构合法(标签匹配/闭合/单块)、不含 <reasoning>、index/start/end 连续(与预期覆盖区间一致),失败按 `compressRetryCount` 重试
89
89
  - 块开标签带 `tip` 属性(对 AI 的提醒:"当前块是历史消息的压缩产物,不要复述");块顶为构成逻辑注释(完整消息定义串 + 条目标签语义),消息正文不再附加前缀句
90
90
 
91
91
  ### 注意
92
92
 
93
+ - 未压缩消息的 token 统计排除系统消息(user_message 中 source.kind 非 user 的部分,如宿主注入的上下文;宿主注入的提醒不计入观察阈值的触发量)
93
94
  - recall 不截断,建议保留 `tool-result-pruner`
94
95
  - recall-semantic 使用本地多语言嵌入模型(paraphrase-multilingual-MiniLM-L12-v2),
95
96
 
@@ -153,18 +154,18 @@ src/
153
154
  │ └─ ctx.on('agent/pre-step') → compress.ts # maybeCompress:两级压缩阻塞串行(先反思后观察;turn 中间即可触发)
154
155
  │ ├─ reflectPass → summarize.ts # 全部 <history> 块总长 ≥ 窗口 × historyMergeRatio:多块拼接 + 共享提示词合并整个块区段
155
156
  │ ├─ observePass → summarize.ts # 未压缩消息 ≥ 窗口 × thresholdRatio:渲染 <history> 输入 → 观察日志 → 追加 + 替换
156
- │ └─ 提交 → compress.ts # compaction/start → summary → 替换消息(checkpoint) → end;usage 归入主会话
157
+ │ └─ 提交 → compress.ts # compaction/start → summary → 替换消息(source 插件标识 + compactionId) → end;usage 归入主会话
157
158
  ├── constants.ts # 共享常量(PLUGIN_LABEL / HISTORY_TAG / HISTORY_TIP / COMPLETE_MESSAGE_DEFINITION / COMPACT_CHECKPOINT_PLUGIN)
158
159
  ├── types.ts # type-only:宿主类型再导出 + 领域类型(MessageNode / MessageIndex)
159
160
  ├── config.ts # 配置默认值 / 宽松合并(缺省、null、空串回退默认值;未知键忽略、非法值回退默认;数值键/布尔键/omEnabled/modelDir)
160
161
  ├── utils.ts # 零依赖工具函数(配置校验 / 文本渲染 / 主会话判定 / 路由解析)
161
- ├── log-index.ts # 完整消息索引(index 定位 user/assistant/具有result的toolcall;未闭合 tool-call 不占位;recall 与摘要共用)
162
+ ├── log-index.ts # 完整消息索引(index 定位 user/sys/assistant/具有result的toolcall;user_message 按 source.kind 分类:kind:user 为用户消息、其余为系统消息;本插件自产压缩日志消息不占位;未闭合 tool-call 不占位;recall 与摘要共用)
162
163
  ├── embedding.ts # 本地 ONNX 嵌入(@huggingface/transformers + 本地模型;共享目录解析 / 小文件补齐 / 运行时按需下载编排 / 懒加载 / 批量 / cosine)
163
164
  ├── model-download.ts # 模型下载原语(modelSourceUrl / needsDownload / 原子落盘 / 开始结束日志与失败镜像建议;运行时与 dev CLI 共用)
164
- ├── summarize.ts # 共享提示词 buildHistoryPrompt(观察/反思同一套)+ renderMessages(@xmldom/xmldom 构建 <history> 块输入,自动转义)+ 直连 ctx.llm.stream() 摘要(new 方式:指令作 system、输入为渲染消息;extractSummaryLog 提取校验:XML 结构合法 / 无 reasoning / index 连续 / 覆盖区间;重试与流式 usage 归入主会话)
165
+ ├── summarize.ts # 共享提示词 buildHistoryPrompt(观察/反思同一套)+ renderMessages(@xmldom/xmldom 构建 <history> 块输入:用户消息原样、系统消息渲染为 <sys> 空块、自动转义)+ 直连 ctx.llm.stream() 摘要(new 方式:指令作 system、输入为渲染消息;extractSummaryLog 提取校验:XML 结构合法 / 无 reasoning / index 连续 / 覆盖区间;重试与流式 usage 归入主会话)
165
166
  ├── recall.ts # recall 工具
166
167
  ├── semantic-recall.ts # recall-semantic 工具(query 语义检索 + 区间限定 + 回退全量 + 匹配说明)
167
- └── compress.ts # 两级自动压缩(测量 / mid-turn 区间计算 / 配对平衡回退 / source 标记判定摘要消息 / compaction/* 生命周期事件 + checkpoint 替换)
168
+ └── compress.ts # 两级自动压缩(测量 / mid-turn 区间计算 / 配对平衡回退 / source 标记判定摘要消息 / compaction/* 生命周期事件 + 替换消息 source 插件标识)
168
169
  models/
169
170
  └── paraphrase-multilingual-MiniLM-L12-v2/ # 嵌入模型目录(小文件随包分发;onnx 二进制不随包分发、由运行时按需下载到跨版本共享目录,不进 git)
170
171
  scripts/ # release-archive.mjs(CHANGELOG 归档)/ download-model.mjs(开发手动预下载 CLI)
@@ -9,6 +9,7 @@ export type TokenEstimator = {
9
9
  /**
10
10
  * 未压缩消息 token 估算:最后一个 <history> 块之后的表层节点合计
11
11
  * (其前含自身视为已压缩,不计入观察阈值衡量对象;无压缩日志时计全部)。
12
+ * 系统消息(user/message 中非 kind:user 的部分,如宿主注入的上下文)不计入阈值。
12
13
  */
13
14
  export declare function measureUncompressedTokens(session: Session, meter: TokenEstimator): number;
14
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EACV,KAAK,EAEL,OAAO,EACP,YAAY,EACZ,OAAO,EAIR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAgB,KAAK,YAAY,EAAsB,MAAM,YAAY,CAAC;AAEjF,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAyCD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG;IAAE,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,CAkBzF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAc1E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CA8BpE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG;IAChD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAaA;AA4FD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA2Gf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAkIf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAwCf"}
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EACV,KAAK,EAEL,OAAO,EACP,YAAY,EACZ,OAAO,EAIR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAgB,KAAK,YAAY,EAAsB,MAAM,YAAY,CAAC;AAEjF,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAwCD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG;IAAE,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,CAyBzF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAc1E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CA8BpE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG;IAChD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAaA;AA4FD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA2Gf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAkIf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAwCf"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 共享常量:集中定义插件级魔法字符串与事件名,避免散落各模块。
3
3
  */
4
- /** 插件标识:压缩消息 source.plugin 取值与日志前缀。 */
4
+ /** 插件标识:压缩消息 source.plugin 取值(注入压缩日志的来源标记)与日志前缀。 */
5
5
  export declare const PLUGIN_LABEL = "dsh-plugin-om";
6
6
  /** 压缩日志标签名:<history>...</history> 包裹观察/反思日志块(输入与输出均为合法 history 块)。 */
7
7
  export declare const HISTORY_TAG = "history";
@@ -10,8 +10,15 @@ export declare const HISTORY_TIP = "\u5F53\u524D\u5757\u662F\u5386\u53F2\u6D88\u
10
10
  /**
11
11
  * 「完整消息」定义(提示词 / recall 工具描述 / 块顶注释共用同一字符串)。
12
12
  * 完整消息是摘要日志与 recall 共用的定位单位;首条 index 为 0,按会话顺序递增、全局稳定。
13
+ * 用户消息指 user_message 中 source.kind 为 user 的部分;其余部分(宿主注入的上下文等)
14
+ * 为系统消息,同样是一条完整消息。
13
15
  */
14
- export declare const COMPLETE_MESSAGE_DEFINITION = "`\u7528\u6237\u6D88\u606F`\uFF0C`\u6A21\u578B\u8F93\u51FA\u6587\u672C`\u548C`\u5177\u6709result\u7684toolcall`\u88AB\u89C6\u4F5C`\u5B8C\u6574\u6D88\u606F`\u3002\u9996\u6761`\u5B8C\u6574\u6D88\u606F`\u7684index\u662F0\uFF0C\u540E\u7EED\u7684index\u9012\u589E\u3002";
15
- /** 宿主压缩 checkpoint 标记的 plugin 名(dsh-compaction-basic COMPACT_CHECKPOINT_MARKER.plugin)。 */
16
+ export declare const COMPLETE_MESSAGE_DEFINITION = "`\u7528\u6237\u6D88\u606F`\uFF08user_message \u4E2D kind \u4E3A user \u7684\u90E8\u5206\uFF09\uFF0C`\u7CFB\u7EDF\u6D88\u606F`\uFF08user_message \u4E2D\u5176\u4F59 kind \u7684\u90E8\u5206\uFF09\uFF0C`\u6A21\u578B\u8F93\u51FA\u6587\u672C`\u548C`\u5177\u6709result\u7684toolcall`\u88AB\u89C6\u4F5C`\u5B8C\u6574\u6D88\u606F`\u3002\u9996\u6761`\u5B8C\u6574\u6D88\u606F`\u7684index\u662F0\uFF0C\u540E\u7EED\u7684index\u9012\u589E\u3002";
17
+ /** 判定 user/message source 是否为本插件自产(压缩日志机制消息;含兼容旧宿主 checkpoint 标记 'compact')。这类消息不占完整消息 index。 */
18
+ export declare function isPluginOwnedSource(source: {
19
+ kind?: string;
20
+ plugin?: string;
21
+ } | undefined): boolean;
22
+ /** 旧日志压缩消息的宿主 checkpoint 标记 plugin 名(dsh-compaction-basic 的 COMPACT_CHECKPOINT_MARKER.plugin;历史兼容识别用)。 */
16
23
  export declare const COMPACT_CHECKPOINT_PLUGIN = "compact";
17
24
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,uCAAuC;AACvC,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,sEAAsE;AACtE,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,kDAAkD;AAClD,eAAO,MAAM,WAAW,iHAAuB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,2BAA2B,4QACqC,CAAC;AAE9E,6FAA6F;AAC7F,eAAO,MAAM,yBAAyB,YAAY,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oDAAoD;AACpD,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,sEAAsE;AACtE,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,kDAAkD;AAClD,eAAO,MAAM,WAAW,iHAAuB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,kbACuG,CAAC;AAEhJ,mGAAmG;AACnG,wBAAgB,mBAAmB,CACjC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACrD,OAAO,CAGT;AAED,0GAA0G;AAC1G,eAAO,MAAM,yBAAyB,YAAY,CAAC"}
package/dist/index.mjs CHANGED
@@ -10,7 +10,7 @@ var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).expor
10
10
  /**
11
11
  * 共享常量:集中定义插件级魔法字符串与事件名,避免散落各模块。
12
12
  */
13
- /** 插件标识:压缩消息 source.plugin 取值与日志前缀。 */
13
+ /** 插件标识:压缩消息 source.plugin 取值(注入压缩日志的来源标记)与日志前缀。 */
14
14
  const PLUGIN_LABEL = "dsh-plugin-om";
15
15
  /** 压缩日志标签名:<history>...</history> 包裹观察/反思日志块(输入与输出均为合法 history 块)。 */
16
16
  const HISTORY_TAG = "history";
@@ -19,10 +19,15 @@ const HISTORY_TIP = "当前块是历史消息的压缩产物,不要复述";
19
19
  /**
20
20
  * 「完整消息」定义(提示词 / recall 工具描述 / 块顶注释共用同一字符串)。
21
21
  * 完整消息是摘要日志与 recall 共用的定位单位;首条 index 为 0,按会话顺序递增、全局稳定。
22
+ * 用户消息指 user_message 中 source.kind 为 user 的部分;其余部分(宿主注入的上下文等)
23
+ * 为系统消息,同样是一条完整消息。
22
24
  */
23
- const COMPLETE_MESSAGE_DEFINITION = "`用户消息`,`模型输出文本`和`具有result的toolcall`被视作`完整消息`。首条`完整消息`的index是0,后续的index递增。";
24
- /** 宿主压缩 checkpoint 标记的 plugin 名(dsh-compaction-basic COMPACT_CHECKPOINT_MARKER.plugin)。 */
25
- const COMPACT_CHECKPOINT_PLUGIN = "compact";
25
+ const COMPLETE_MESSAGE_DEFINITION = "`用户消息`(user_message 中 kind 为 user 的部分),`系统消息`(user_message 中其余 kind 的部分),`模型输出文本`和`具有result的toolcall`被视作`完整消息`。首条`完整消息`的index是0,后续的index递增。";
26
+ /** 判定 user/message source 是否为本插件自产(压缩日志机制消息;含兼容旧宿主 checkpoint 标记 'compact')。这类消息不占完整消息 index。 */
27
+ function isPluginOwnedSource(source) {
28
+ if (source?.kind !== "plugin") return false;
29
+ return source.plugin === "dsh-plugin-om" || source.plugin === "compact";
30
+ }
26
31
  //#endregion
27
32
  //#region src/utils.ts
28
33
  /** 判断值是否为普通对象:typeof object 且非 null 且非数组(类型收窄用)。 */
@@ -81,7 +86,22 @@ function routedTarget(session) {
81
86
  //#endregion
82
87
  //#region src/log-index.ts
83
88
  /**
84
- * 完整消息索引:按日志顺序把消息事件折叠为完整消息序列(三类,见文件头)。
89
+ * 会话日志索引:完整消息索引(index 定位完整消息,recall 与摘要共用同一套编号),
90
+ * 以及表层节点定位辅助。事件日志仅追加(被遮蔽的事件仍可读,recall 依赖此性质)。
91
+ *
92
+ * 完整消息是摘要日志与 recall 共用的定位单位,分四类:
93
+ * - user:用户消息(user/message 中 source.kind === 'user')占一条;
94
+ * - sys:系统消息(user/message 中其余 source.kind 的部分,如宿主注入的上下文)
95
+ * 占一条;压缩日志中以 <sys type="KIND" index="N"> 空块表示(内容不进入输入);
96
+ * - assistant:模型输出文本(assistant/message 中的文本块)占一条;
97
+ * - toolcall:单个工具调用及其结果占一条(同一条 AI 消息里的文本与工具调用拆开,
98
+ * tool/result 按 source.callId 匹配其 tool-call;未匹配的 result 独立成条,防御)。
99
+ * 本插件自产的压缩日志消息(source.kind === 'plugin' 且 plugin 为本插件标识)不占 index。
100
+ * index 从 0 起、按日志顺序递增、只追加不重排 → 会话内全局稳定,
101
+ * 压缩后旧摘要条目引用的 index 仍然有效。
102
+ */
103
+ /**
104
+ * 完整消息索引:按日志顺序把消息事件折叠为完整消息序列(四类,见文件头)。
85
105
  * 工具调用结果按 source.callId 匹配其 tool-call 并入该条;未匹配的 result 独立成条(防御)。
86
106
  * 插件在 agent/pre-step 触发压缩(日志 call-result 完备),因此压缩时不存在未闭合的
87
107
  * tool-call;索引对未闭合调用不设特殊处理。
@@ -98,12 +118,20 @@ function indexCompleteMessages(session) {
98
118
  const event = events[seq];
99
119
  if (!event) continue;
100
120
  if (event.type === "user/message") {
101
- if (event.data.source?.kind === "plugin") continue;
102
- cms.push({
121
+ /** 事件 source(区分用户消息与宿主注入/插件消息)。 */
122
+ const source = event.data.source;
123
+ if (isPluginOwnedSource(source)) continue;
124
+ if (source?.kind === "user") cms.push({
103
125
  index: cms.length,
104
126
  type: "user",
105
127
  seqs: [seq]
106
128
  });
129
+ else cms.push({
130
+ index: cms.length,
131
+ type: "sys",
132
+ seqs: [seq],
133
+ ...source?.kind === void 0 ? {} : { kind: source.kind }
134
+ });
107
135
  } else if (event.type === "assistant/message") {
108
136
  /** 助手消息(含文本与 tool-call 块)。 */
109
137
  const message = event.data.message;
@@ -155,13 +183,13 @@ function indexCompleteMessages(session) {
155
183
  }
156
184
  /**
157
185
  * 渲染一条完整消息的文本(recall 输出 / new 模式输入共用):
158
- * - user:消息原文;
186
+ * - user / sys:消息原文;
159
187
  * - assistant:仅文本块;
160
188
  * - toolcall:调用块(工具名 + 参数)+ 结果文本(pruner 裁剪超大结果)。
161
189
  */
162
190
  function renderCompleteMessage(session, cm, pruner) {
163
- if (cm.type === "user") {
164
- /** 用户消息事件(seq 缺失则无法渲染)。 */
191
+ if (cm.type === "user" || cm.type === "sys") {
192
+ /** 用户/系统消息事件(seq 缺失则无法渲染)。 */
165
193
  const seq = cm.seqs[0];
166
194
  const event = seq === void 0 ? void 0 : session.events[seq];
167
195
  /** 派生的消息对象。 */
@@ -7384,14 +7412,16 @@ function buildHistoryPrompt() {
7384
7412
  "- <history> 是历史消息的记录块:输入与输出都是合法的 <history> 块,块内条目是「模型消息 + index」的表达形式。",
7385
7413
  `- 完整消息:${COMPLETE_MESSAGE_DEFINITION}`,
7386
7414
  "- <user_message index=\"N\">:用户消息条目(N 为该条完整消息的 index;文本原样,图片/文件等以注释补充)。",
7415
+ "- <sys type=\"(kind)\" index=\"N\">:系统消息条目(user_message 中非 kind:user 的部分,如宿主注入的上下文),块中为空,内容不进入压缩输入。",
7387
7416
  "- <reasoning>:模型的思考过程,仅作压缩参考,产物中不要出现。",
7388
7417
  "- <assistant index=\"N\">:单条完整消息(模型输出文本,或 toolcall 及其 result)。",
7389
7418
  "- <assistant start=\"A\" end=\"B\">:多条连续完整消息聚合的模块(A/B 为模块首尾完整消息的 index)。",
7390
7419
  "",
7391
7420
  "【压缩要求】",
7392
7421
  "- 完整保留用户消息:<user_message> 条目逐条保留原文,不概括、不省略。",
7422
+ "- 完整保留系统消息:<sys> 条目逐条原样保留(type 与 index 不变),块中为空,不概括、不省略、不填充内容。",
7393
7423
  "- <reasoning> 只作参考,输出产物中不包含 <reasoning> 块。",
7394
- "- 将具有关联性的 <assistant> 消息按内在逻辑连贯性划分为连续模块,聚合为 <assistant start=\"\" end=\"\"> 块:块内描述模块的目的、行为与结果,最后一个模块额外给出`下一步计划`;涉及的具体文件保留在模块内容中,多个前缀相同的路径合并简写。",
7424
+ "- 将具有关联性的 <assistant> 消息按内在逻辑连贯性划分为连续模块,聚合为 <assistant start=\"\" end=\"\"> 块:块内描述模块的目的、行为与结果;涉及的具体文件保留在模块内容中,多个前缀相同的路径合并简写。",
7395
7425
  "- 单条重要的完整消息以 <assistant index=\"\"> 单独呈现,内容不受限制。",
7396
7426
  "- 条目按 index 顺序覆盖本次压缩的全部完整消息:index/start/end 必须连续(区间内 index 连续、相邻条目相接),不跳号、不重叠、不遗漏。",
7397
7427
  "- 条目内容为合法 XML 文本:特殊字符保持转义形式(如 & → &amp;、< → &lt;),用户消息原文的转义形式原样保留,不要反转义。",
@@ -7401,6 +7431,7 @@ function buildHistoryPrompt() {
7401
7431
  "<user_message index=\"(index)\">",
7402
7432
  "(user 消息原文)",
7403
7433
  "</user_message>",
7434
+ "<sys type=\"(kind)\" index=\"(index)\"></sys>",
7404
7435
  "<assistant start=\"(起始 index)\" end=\"(结束 index)\">",
7405
7436
  "(模块的目的、行为与结果摘要)",
7406
7437
  "</assistant>",
@@ -7446,11 +7477,12 @@ function renderUserEntry(doc, session, cm) {
7446
7477
  }
7447
7478
  /**
7448
7479
  * 渲染完整消息记录(观察输入,new 模式):输出一个合法的 <history> 块——
7449
- * - user → <user_message index="N">(文本原样 + 图片/文件注释);
7480
+ * - user → <user_message index="N">(文本原样;图片/文件注释);
7481
+ * - sys → <sys type="KIND" index="N"></sys>(系统消息空块,内容不进入压缩输入);
7450
7482
  * - 每条 assistant 消息的 reasoning → <reasoning>(参考条目,产物中没有);
7451
7483
  * - assistant / toolcall → <assistant index="N">(模型输出文本 / toolcall&result 原样)。
7452
7484
  * 文本经 XML 序列化自动转义(用户输入 / 文本 / reasoning 中的特殊字符不破坏 XML 合法性)。
7453
- * 仅渲染 seqs 全部落在给定集合内的完整消息(插件自产消息天然不占位)。
7485
+ * 仅渲染 seqs 全部落在给定集合内的完整消息(本插件自产消息天然不占位)。
7454
7486
  */
7455
7487
  function renderMessages(session, seqs) {
7456
7488
  /** 遮蔽 seq 集合。 */
@@ -7476,6 +7508,15 @@ function renderMessages(session, seqs) {
7476
7508
  const entries = [];
7477
7509
  for (const cm of indexCompleteMessages(session)) {
7478
7510
  if (!cm.seqs.every((seq) => shadowed.has(seq))) continue;
7511
+ if (cm.type === "sys") {
7512
+ /** sys 元素(type=source.kind,index=完整消息序号)。 */
7513
+ const sysEl = doc.createElement("sys");
7514
+ sysEl.setAttribute("type", cm.kind ?? "");
7515
+ sysEl.setAttribute("index", String(cm.index));
7516
+ sysEl.appendChild(doc.createTextNode(""));
7517
+ entries.push(sysEl);
7518
+ continue;
7519
+ }
7479
7520
  if (cm.type === "user") {
7480
7521
  /** 用户消息条目(无文本且无注释则跳过)。 */
7481
7522
  const rendered = renderUserEntry(doc, session, cm);
@@ -7574,7 +7615,7 @@ function buildSummaryOptions(session, instruction, contextText, maxTokens, targe
7574
7615
  };
7575
7616
  }
7576
7617
  /** 产出日志后插入首个 <history> 后的格式说明(XML 注释,完整消息定义 + 条目标签语义)。 */
7577
- const HISTORY_FORMAT_NOTE = `<!-- 完整消息:${COMPLETE_MESSAGE_DEFINITION} <user_message index="N"> 与 <assistant index="N"> 表示单条完整消息,<assistant start="A" end="B"> 表示连续模块,start/end 是首尾完整消息的 index -->`;
7618
+ const HISTORY_FORMAT_NOTE = `<!-- 完整消息:${COMPLETE_MESSAGE_DEFINITION} <user_message index="N"> 与 <assistant index="N"> 表示单条完整消息,<assistant start="A" end="B"> 表示连续模块,start/end 是首尾完整消息的 index;<sys type="KIND" index="N"> 表示系统消息,块中为空 -->`;
7578
7619
  /** 读取元素整数属性(非负整数;缺失 / 非数字返回 undefined)。 */
7579
7620
  function intAttr(el, name) {
7580
7621
  /** 属性原始值(缺失为 null)。 */
@@ -7587,7 +7628,7 @@ function intAttr(el, name) {
7587
7628
  * 用 XML 解析器解析一个 <history> 块(结构合法性校验):
7588
7629
  * - 非法 XML(标签不匹配 / 未闭合 / 多根等)→ null;
7589
7630
  * - 根节点必须是 <history>;
7590
- * - 顶层只允许 user_message / assistant 条目元素(其余元素类型视为不合法);
7631
+ * - 顶层只允许 user_message / assistant / sys 条目元素(其余元素类型视为不合法);
7591
7632
  * - 出现 <reasoning> 元素时标记 hasReasoning(产物不允许)。
7592
7633
  * 条目按文档顺序提取(index / start / end 属性缺失或不合法 → 不合法)。
7593
7634
  */
@@ -7628,6 +7669,14 @@ function parseHistoryBlock(xml) {
7628
7669
  kind: "user",
7629
7670
  index
7630
7671
  });
7672
+ } else if (tag === "sys") {
7673
+ /** index 属性(缺失/非法 → 不合法)。 */
7674
+ const index = intAttr(el, "index");
7675
+ if (index === void 0) return null;
7676
+ entries.push({
7677
+ kind: "sys",
7678
+ index
7679
+ });
7631
7680
  } else if (tag === "assistant") {
7632
7681
  /** 单条 index 或模块 start..end(二选一)。 */
7633
7682
  const index = intAttr(el, "index");
@@ -7815,7 +7864,7 @@ async function runSummarySubagent(ctx, agent, instruction, contextText, maxToken
7815
7864
  * 压缩结果写入宿主 compaction/* 生命周期事件(compaction/start → compaction/summary →
7816
7865
  * 替换 <history> 消息 → compaction/end),使消息记录(聊天视图压缩卡片)与轨迹视图
7817
7866
  * 可见;compaction/summary 同时承担影子价格认领(shadowedTokenCount),不再单独发
7818
- * compaction/prune。替换消息的 source 使用宿主 checkpoint 标记(plugin: 'compact' +
7867
+ * compaction/prune。替换消息的 source 使用插件标识(plugin: 'dsh-plugin-om' +
7819
7868
  * compactionId),UI 据此关联 summary 与替换消息。生命周期事件在摘要成功后才写入
7820
7869
  * (失败不产生任何日志变更)。
7821
7870
  *
@@ -7845,16 +7894,16 @@ function reflectExpectedEnd(contextText) {
7845
7894
  }
7846
7895
  /**
7847
7896
  * 判定消息是否为本插件的压缩日志消息并提取日志文本(不通过文本含标签判断,
7848
- * 改用 source 标记——plugin 为宿主 checkpoint 标记 'compact' 或插件标识 'dsh-plugin-om')。
7897
+ * 改用 source 标记——plugin 为插件标识 'dsh-plugin-om'(兼容旧日志的宿主 checkpoint
7898
+ * 标记 'compact')。
7849
7899
  * 仅当消息文本含 <history> 开标签(含带 tip 属性版本)时视为压缩日志,返回整段文本;
7850
7900
  * 其余消息返回 undefined(旧格式 <om-history> 块按「不兼容,干净切换」视为普通消息)。
7851
7901
  */
7852
7902
  function historyTextOf(event) {
7853
7903
  if (event?.type !== "user/message") return void 0;
7854
- /** 消息 source(插件自产消息的标记)。 */
7904
+ /** 消息 source(本插件自产消息的标记;含兼容旧宿主 checkpoint 标记)。 */
7855
7905
  const source = event.data.source;
7856
- if (source?.kind !== "plugin") return void 0;
7857
- if (source.plugin !== "compact" && source.plugin !== "dsh-plugin-om") return void 0;
7906
+ if (!isPluginOwnedSource(source)) return void 0;
7858
7907
  /** 消息纯文本。 */
7859
7908
  const text = blocksToText(event.data.content);
7860
7909
  /** 首个 <history 出现位置(无则非压缩日志)。 */
@@ -7868,6 +7917,7 @@ function historyTextOf(event) {
7868
7917
  /**
7869
7918
  * 未压缩消息 token 估算:最后一个 <history> 块之后的表层节点合计
7870
7919
  * (其前含自身视为已压缩,不计入观察阈值衡量对象;无压缩日志时计全部)。
7920
+ * 系统消息(user/message 中非 kind:user 的部分,如宿主注入的上下文)不计入阈值。
7871
7921
  */
7872
7922
  function measureUncompressedTokens(session, meter) {
7873
7923
  /** 压缩边界(最后一个 history 块的 seq;无则 undefined)。 */
@@ -7884,7 +7934,11 @@ function measureUncompressedTokens(session, meter) {
7884
7934
  /** 事件对应的消息(用于 token 估算)。 */
7885
7935
  const event = session.events[seq];
7886
7936
  const message = event ? session.deriveEventMessage(event) : null;
7887
- total += message ? meter.estimateMessage(message) : 0;
7937
+ if (!message) continue;
7938
+ if (event?.type === "user/message") {
7939
+ if (event.data.source?.kind !== "user") continue;
7940
+ }
7941
+ total += meter.estimateMessage(message);
7888
7942
  }
7889
7943
  return total;
7890
7944
  }
@@ -8014,10 +8068,10 @@ function appendCompactionEnd(session, lifecycle, error) {
8014
8068
  ...error === void 0 ? {} : { error }
8015
8069
  }).seq;
8016
8070
  }
8017
- /** 追加 <history> 压缩日志消息(surfaceOp 替换遮蔽区间,source 为宿主 checkpoint 标记)。 */
8071
+ /** 追加 <history> 压缩日志消息(surfaceOp 替换遮蔽区间,source 标记插件自产 + compactionId 关联压缩生命周期)。 */
8018
8072
  function appendHistoryMessage(session, content, sourceEventSeqs, surfaceOp, compactionId) {
8019
8073
  /** 压缩替换消息(内容即 <history> 标签块,不再附加前缀句;对 AI 的提醒在块开标签 tip 属性上;
8020
- * source 标记宿主 checkpoint 供 UI 关联)。 */
8074
+ * source 标记插件标识(plugin: 'dsh-plugin-om')+ compactionId 供 UI 关联)。 */
8021
8075
  const message = {
8022
8076
  id: uuid(),
8023
8077
  role: "user",
@@ -8027,7 +8081,7 @@ function appendHistoryMessage(session, content, sourceEventSeqs, surfaceOp, comp
8027
8081
  }],
8028
8082
  source: {
8029
8083
  kind: "plugin",
8030
- plugin: COMPACT_CHECKPOINT_PLUGIN,
8084
+ plugin: PLUGIN_LABEL,
8031
8085
  compactionId
8032
8086
  }
8033
8087
  };
@@ -8597,7 +8651,8 @@ function resolveConfig(raw) {
8597
8651
  //#region src/recall.ts
8598
8652
  /**
8599
8653
  * recall 工具:按「完整消息」序号(index)回看原始会话(start/end 为完整消息 index,
8600
- * offset 为相对 start 的完整消息步数)。完整消息即 `用户消息`,`模型输出文本`和`具有result的
8654
+ * offset 为相对 start 的完整消息步数)。完整消息即 `用户消息`(user_message 中 kind 为 user
8655
+ * 的部分)、`系统消息`(user_message 中其余 kind 的部分)、`模型输出文本`和`具有result的
8601
8656
  * toolcall`;首条完整消息的 index 为 0,后续递增、会话内全局稳定,与摘要日志条目同一套编号。
8602
8657
  * recall 自身不设输出上限:超大的工具结果由 tool-result-pruner 裁剪(pruneContent),
8603
8658
  * 输出 token 由 pruner 配置控制。
@@ -8631,7 +8686,7 @@ function parseRecallArgs(raw) {
8631
8686
  function buildRecallTool(getPruner) {
8632
8687
  return {
8633
8688
  name: "recall",
8634
- description: "根据完整消息序号(index),回看指定区间的过往消息。`用户消息`,`模型输出文本`和`具有result的toolcall`被视作`完整消息`。首条`完整消息`的index是0,后续的index递增。start 必须传入,是区间的基准;end 和 offset 二选一:end 指定另一个边界(含两端,与 start 的位置关系不影响结果),offset 指定区间包含的完整消息数量(正数向后、负数向前)。",
8689
+ description: `根据完整消息序号(index),回看指定区间的过往消息。${COMPLETE_MESSAGE_DEFINITION} start 必须传入,是区间的基准;end 和 offset 二选一:end 指定另一个边界(含两端,与 start 的位置关系不影响结果),offset 指定区间包含的完整消息数量(正数向后、负数向前)。`,
8635
8690
  parameters: {
8636
8691
  start: {
8637
8692
  type: "number",
@@ -8708,7 +8763,8 @@ function buildRecallTool(getPruner) {
8708
8763
  //#region src/semantic-recall.ts
8709
8764
  /**
8710
8765
  * recall-semantic 工具:按自然语言 query 对会话全部完整消息(含被压缩/遮蔽的)做语义
8711
- * 检索,返回最匹配的完整消息与匹配说明。完整消息即 `用户消息`,`模型输出文本`和`具有result的
8766
+ * 检索,返回最匹配的完整消息与匹配说明。完整消息即 `用户消息`(user_message 中 kind 为 user
8767
+ * 的部分)、`系统消息`(user_message 中其余 kind 的部分)、`模型输出文本`和`具有result的
8712
8768
  * toolcall`;首条完整消息的 index 为 0,后续递增、会话内全局稳定。
8713
8769
  *
8714
8770
  * - 参数:query 必填;top_k(默认 3,1-10);start/end/offset 限定检索区间
@@ -8820,7 +8876,7 @@ function buildSemanticRecallTool(options) {
8820
8876
  const embed = options?.embedder ?? ((texts) => getEmbedder().then((fn) => fn(texts)));
8821
8877
  return {
8822
8878
  name: "recall-semantic",
8823
- description: "按语义(自然语言含义)在会话全部完整消息中检索:`用户消息`,`模型输出文本`和`具有result的toolcall`被视作`完整消息`。首条`完整消息`的index是0,后续的index递增。用一句话描述你要找的内容(可混用中英文与代码术语)。返回最匹配的若干条完整消息、index 与匹配说明;如需精确定位某个 index 周边的消息,请再用 recall 工具。",
8879
+ description: `按语义(自然语言含义)在会话全部完整消息中检索:${COMPLETE_MESSAGE_DEFINITION} 用一句话描述你要找的内容(可混用中英文与代码术语)。返回最匹配的若干条完整消息、index 与匹配说明;如需精确定位某个 index 周边的消息,请再用 recall 工具。`,
8824
8880
  parameters: {
8825
8881
  query: {
8826
8882
  type: "string",
@@ -1,16 +1,3 @@
1
- /**
2
- * 会话日志索引:完整消息索引(index 定位完整消息,recall 与摘要共用同一套编号),
3
- * 以及表层节点定位辅助。事件日志仅追加(被遮蔽的事件仍可读,recall 依赖此性质)。
4
- *
5
- * 完整消息是摘要日志与 recall 共用的定位单位,分三类:
6
- * - user:用户消息(user/message)占一条;
7
- * - assistant:模型输出文本(assistant/message 中的文本块)占一条;
8
- * - toolcall:单个工具调用及其结果占一条(同一条 AI 消息里的文本与工具调用拆开,
9
- * tool/result 按 source.callId 匹配其 tool-call;未匹配的 result 独立成条,防御)。
10
- * 插件自产消息(<history>、运行时快照等 source.kind === 'plugin')不占 index。
11
- * index 从 0 起、按日志顺序递增、只追加不重排 → 会话内全局稳定,
12
- * 压缩后旧摘要条目引用的 index 仍然有效。
13
- */
14
1
  import type { CompleteMessage, MessageIndex, Session, SessionEvent } from './types.ts';
15
2
  /** 工具结果裁剪器结构(tool-result-pruner;超大结果渲染前裁剪)。 */
16
3
  export type PrunerLike = {
@@ -26,7 +13,7 @@ export declare function messageIdOfEvent(event: SessionEvent | undefined): strin
26
13
  /** 消息索引:按日志顺序列出全部消息事件,并按 message_id 定位其在消息序列中的下标。 */
27
14
  export declare function indexMessages(session: Session): MessageIndex;
28
15
  /**
29
- * 完整消息索引:按日志顺序把消息事件折叠为完整消息序列(三类,见文件头)。
16
+ * 完整消息索引:按日志顺序把消息事件折叠为完整消息序列(四类,见文件头)。
30
17
  * 工具调用结果按 source.callId 匹配其 tool-call 并入该条;未匹配的 result 独立成条(防御)。
31
18
  * 插件在 agent/pre-step 触发压缩(日志 call-result 完备),因此压缩时不存在未闭合的
32
19
  * tool-call;索引对未闭合调用不设特殊处理。
@@ -34,7 +21,7 @@ export declare function indexMessages(session: Session): MessageIndex;
34
21
  export declare function indexCompleteMessages(session: Session): CompleteMessage[];
35
22
  /**
36
23
  * 渲染一条完整消息的文本(recall 输出 / new 模式输入共用):
37
- * - user:消息原文;
24
+ * - user / sys:消息原文;
38
25
  * - assistant:仅文本块;
39
26
  * - toolcall:调用块(工具名 + 参数)+ 结果文本(pruner 裁剪超大结果)。
40
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"log-index.d.ts","sourceRoot":"","sources":["../src/log-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,eAAe,EAEf,YAAY,EAEZ,OAAO,EACP,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,+CAA+C;AAC/C,MAAM,MAAM,UAAU,GAAG;IAAE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAE7F;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMpF;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CA0B5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CAkEzE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,EACnB,MAAM,CAAC,EAAE,UAAU,GAClB,MAAM,CAgER"}
1
+ {"version":3,"file":"log-index.d.ts","sourceRoot":"","sources":["../src/log-index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,eAAe,EAEf,YAAY,EAEZ,OAAO,EACP,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,+CAA+C;AAC/C,MAAM,MAAM,UAAU,GAAG;IAAE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAE7F;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMpF;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CA0B5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CA2EzE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,EACnB,MAAM,CAAC,EAAE,UAAU,GAClB,MAAM,CAgER"}
package/dist/recall.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * recall 工具:按「完整消息」序号(index)回看原始会话(start/end 为完整消息 index,
3
- * offset 为相对 start 的完整消息步数)。完整消息即 `用户消息`,`模型输出文本`和`具有result的
3
+ * offset 为相对 start 的完整消息步数)。完整消息即 `用户消息`(user_message 中 kind 为 user
4
+ * 的部分)、`系统消息`(user_message 中其余 kind 的部分)、`模型输出文本`和`具有result的
4
5
  * toolcall`;首条完整消息的 index 为 0,后续递增、会话内全局稳定,与摘要日志条目同一套编号。
5
6
  * recall 自身不设输出上限:超大的工具结果由 tool-result-pruner 裁剪(pruneContent),
6
7
  * 输出 token 由 pruner 配置控制。
@@ -1 +1 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAGjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;iBAQzB,CAAC;AAEL,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAYxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,GAAG,cAAc,CAsFzE"}
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAGjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;iBAQzB,CAAC;AAEL,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAYxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,GAAG,cAAc,CAqFzE"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * recall-semantic 工具:按自然语言 query 对会话全部完整消息(含被压缩/遮蔽的)做语义
3
- * 检索,返回最匹配的完整消息与匹配说明。完整消息即 `用户消息`,`模型输出文本`和`具有result的
3
+ * 检索,返回最匹配的完整消息与匹配说明。完整消息即 `用户消息`(user_message 中 kind 为 user
4
+ * 的部分)、`系统消息`(user_message 中其余 kind 的部分)、`模型输出文本`和`具有result的
4
5
  * toolcall`;首条完整消息的 index 为 0,后续递增、会话内全局稳定。
5
6
  *
6
7
  * - 参数:query 必填;top_k(默认 3,1-10);start/end/offset 限定检索区间
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-recall.d.ts","sourceRoot":"","sources":["../src/semantic-recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAoB,KAAK,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO,KAAK,EAAmB,cAAc,EAAkB,MAAM,YAAY,CAAC;AAGlF,qEAAqE;AACrE,eAAO,MAAM,wBAAwB;;;;;;iBAUjC,CAAC;AAEL,6DAA6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,+CAA+C;AAC/C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAWxE;AAED,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,GACzD,WAAW,CA2Bb;AAED,uCAAuC;AACvC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAOlD;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcnF;AAED,+CAA+C;AAC/C,eAAO,MAAM,gCAAgC,0iBACoE,CAAC;AAElH,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAChD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACxD,GAAG,cAAc,CAuHjB"}
1
+ {"version":3,"file":"semantic-recall.d.ts","sourceRoot":"","sources":["../src/semantic-recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAoB,KAAK,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO,KAAK,EAAmB,cAAc,EAAkB,MAAM,YAAY,CAAC;AAGlF,qEAAqE;AACrE,eAAO,MAAM,wBAAwB;;;;;;iBAUjC,CAAC;AAEL,6DAA6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,+CAA+C;AAC/C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAWxE;AAED,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,GACzD,WAAW,CA2Bb;AAED,uCAAuC;AACvC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAOlD;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcnF;AAED,+CAA+C;AAC/C,eAAO,MAAM,gCAAgC,0iBACoE,CAAC;AAElH,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAChD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACxD,GAAG,cAAc,CAsHjB"}
@@ -5,8 +5,10 @@
5
5
  * 输入与输出都是合法的 <history> 块(模型消息 + index 的表达形式),先定义块、要求压缩、
6
6
  * 再给出数据源(下方 <history> 消息记录)。
7
7
  *
8
- * 观察输入由 renderMessages 渲染为 <history> 块:用户消息文本原样(图片/文件以注释补充)、
9
- * <reasoning> 参考条目(产物中没有)、assistant 文本与 toolcall&result 原样。
8
+ * 观察输入由 renderMessages 渲染为 <history> 块:用户消息文本原样(图片/文件以
9
+ * 注释补充)、系统消息(user_message 中非 kind:user 的部分)渲染为
10
+ * <sys type="KIND" index="N"> 空块(内容不进入输入)、<reasoning> 参考条目
11
+ * (产物中没有)、assistant 文本与 toolcall&result 原样。
10
12
  * 输出经 extractSummaryLog 校验:合法 <history> 块、不含 <reasoning>、index/start/end 连续
11
13
  * (与预期覆盖区间一致),失败按 config.compressRetryCount 重试。
12
14
  * token usage 从流式响应的 usage chunk 提取,归入主会话记录。仅主会话生效(index.ts 守卫)。
@@ -21,11 +23,12 @@ import { type RoutedTarget } from './utils.ts';
21
23
  export declare function buildHistoryPrompt(): string;
22
24
  /**
23
25
  * 渲染完整消息记录(观察输入,new 模式):输出一个合法的 <history> 块——
24
- * - user → <user_message index="N">(文本原样 + 图片/文件注释);
26
+ * - user → <user_message index="N">(文本原样;图片/文件注释);
27
+ * - sys → <sys type="KIND" index="N"></sys>(系统消息空块,内容不进入压缩输入);
25
28
  * - 每条 assistant 消息的 reasoning → <reasoning>(参考条目,产物中没有);
26
29
  * - assistant / toolcall → <assistant index="N">(模型输出文本 / toolcall&result 原样)。
27
30
  * 文本经 XML 序列化自动转义(用户输入 / 文本 / reasoning 中的特殊字符不破坏 XML 合法性)。
28
- * 仅渲染 seqs 全部落在给定集合内的完整消息(插件自产消息天然不占位)。
31
+ * 仅渲染 seqs 全部落在给定集合内的完整消息(本插件自产消息天然不占位)。
29
32
  */
30
33
  export declare function renderMessages(session: Session, seqs: readonly number[]): string;
31
34
  /** 摘要调用结果:文本 + 可选 token usage(摘要请求自身消耗,随 compaction/summary 归入主会话记录)。 */
@@ -36,10 +39,10 @@ export type SummarySubagentResult = {
36
39
  /** 日志最小有效长度:<history> 中间内容小于该长度视为不合法(C 段校验)。 */
37
40
  export declare const MIN_HISTORY_LENGTH = 10;
38
41
  /** 产出日志后插入首个 <history> 后的格式说明(XML 注释,完整消息定义 + 条目标签语义)。 */
39
- export declare const HISTORY_FORMAT_NOTE = "<!-- \u5B8C\u6574\u6D88\u606F\uFF1A`\u7528\u6237\u6D88\u606F`\uFF0C`\u6A21\u578B\u8F93\u51FA\u6587\u672C`\u548C`\u5177\u6709result\u7684toolcall`\u88AB\u89C6\u4F5C`\u5B8C\u6574\u6D88\u606F`\u3002\u9996\u6761`\u5B8C\u6574\u6D88\u606F`\u7684index\u662F0\uFF0C\u540E\u7EED\u7684index\u9012\u589E\u3002 <user_message index=\"N\"> \u4E0E <assistant index=\"N\"> \u8868\u793A\u5355\u6761\u5B8C\u6574\u6D88\u606F\uFF0C<assistant start=\"A\" end=\"B\"> \u8868\u793A\u8FDE\u7EED\u6A21\u5757\uFF0Cstart/end \u662F\u9996\u5C3E\u5B8C\u6574\u6D88\u606F\u7684 index -->";
42
+ export declare const HISTORY_FORMAT_NOTE = "<!-- \u5B8C\u6574\u6D88\u606F\uFF1A`\u7528\u6237\u6D88\u606F`\uFF08user_message \u4E2D kind \u4E3A user \u7684\u90E8\u5206\uFF09\uFF0C`\u7CFB\u7EDF\u6D88\u606F`\uFF08user_message \u4E2D\u5176\u4F59 kind \u7684\u90E8\u5206\uFF09\uFF0C`\u6A21\u578B\u8F93\u51FA\u6587\u672C`\u548C`\u5177\u6709result\u7684toolcall`\u88AB\u89C6\u4F5C`\u5B8C\u6574\u6D88\u606F`\u3002\u9996\u6761`\u5B8C\u6574\u6D88\u606F`\u7684index\u662F0\uFF0C\u540E\u7EED\u7684index\u9012\u589E\u3002 <user_message index=\"N\"> \u4E0E <assistant index=\"N\"> \u8868\u793A\u5355\u6761\u5B8C\u6574\u6D88\u606F\uFF0C<assistant start=\"A\" end=\"B\"> \u8868\u793A\u8FDE\u7EED\u6A21\u5757\uFF0Cstart/end \u662F\u9996\u5C3E\u5B8C\u6574\u6D88\u606F\u7684 index\uFF1B<sys type=\"KIND\" index=\"N\"> \u8868\u793A\u7CFB\u7EDF\u6D88\u606F\uFF0C\u5757\u4E2D\u4E3A\u7A7A -->";
40
43
  /** history 块内条目(单条 index 或模块 start/end)。 */
41
44
  export type HistoryEntryRange = {
42
- kind: 'user' | 'assistant';
45
+ kind: 'user' | 'assistant' | 'sys';
43
46
  index?: number;
44
47
  start?: number;
45
48
  end?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../src/summarize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,KAAK,EAAmB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,YAAY,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAmC3C;AAyCD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CA2DhF;AAED,yEAAyE;AACzE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AA8EF,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,gjBAAyK,CAAC;AAE1M,4CAA4C;AAC5C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AA8EF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAYrE;AACD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,iBAAiB,EAAE,GAC3B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuBvC;AAED,sCAAsC;AACtC,MAAM,MAAM,sBAAsB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAiC/F;AACD,iFAAiF;AACjF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAK/C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;CAAE,GACpE,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CA+EvC"}
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../src/summarize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,KAAK,EAAE,KAAK,EAAmB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,YAAY,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAsC3C;AA0CD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAqEhF;AAED,yEAAyE;AACzE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AA8EF,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,8zBAAiN,CAAC;AAElP,4CAA4C;AAC5C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAoFF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAYrE;AACD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,iBAAiB,EAAE,GAC3B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuBvC;AAED,sCAAsC;AACtC,MAAM,MAAM,sBAAsB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAiC/F;AACD,iFAAiF;AACjF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAK/C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;CAAE,GACpE,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CA+EvC"}
package/dist/types.d.ts CHANGED
@@ -42,17 +42,24 @@ export type MessageIndex = {
42
42
  byId: Map<string, number>;
43
43
  };
44
44
  /**
45
- * 一条完整消息:摘要日志与 recall 共用的定位单位,分三类——
46
- * user(用户消息)、assistant(模型输出文本)、toolcall(单个工具调用及其结果)。
45
+ * 一条完整消息:摘要日志与 recall 共用的定位单位,分四类——
46
+ * user(用户消息,user_message 中 source.kind === 'user')、
47
+ * sys(系统消息,user_message 中其余 source.kind 的部分,如宿主注入的上下文)、
48
+ * assistant(模型输出文本)、toolcall(单个工具调用及其结果)。
47
49
  * index 从 0 起、按日志顺序递增、只追加不重排 → 会话内全局稳定
48
- * (压缩后旧摘要条目引用的 index 仍然有效);插件自产消息不占位。
50
+ * (压缩后旧摘要条目引用的 index 仍然有效);本插件自产的压缩日志消息不占位。
49
51
  */
50
52
  export type CompleteMessage = {
51
53
  /** 完整消息序号(0 起,全局稳定)。 */
52
54
  index: number;
53
- /** 类别:user=用户消息;assistant=模型输出文本;toolcall=单个工具调用及其结果。 */
54
- type: 'user' | 'assistant' | 'toolcall';
55
- /** 关联的消息事件 seq(user/assistant=1 个;toolcall=assistant 消息 + 结果)。 */
55
+ /**
56
+ * 类别:user=用户消息;sys=系统消息(压缩日志中以 <sys type="KIND" index="N"> 空块
57
+ * 表示);assistant=模型输出文本;toolcall=单个工具调用及其结果。
58
+ */
59
+ type: 'user' | 'sys' | 'assistant' | 'toolcall';
60
+ /** 系统消息的 source.kind(仅 sys 类;如 agent-instructions / skill-catalog)。 */
61
+ kind?: string;
62
+ /** 关联的消息事件 seq(user/sys/assistant=1 个;toolcall=assistant 消息 + 结果)。 */
56
63
  seqs: number[];
57
64
  /** 工具调用 id(仅 toolcall 类;关联 tool/result 用)。 */
58
65
  callId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7E,gDAAgD;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,YAAY,EACV,KAAK,EACL,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,mBAAmB;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,aAAa,CAAC;CAC5D,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IACzB,oBAAoB;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,kCAAkC;IAClC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IACxC,kEAAkE;IAClE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7E,gDAAgD;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,YAAY,EACV,KAAK,EACL,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,mBAAmB;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,aAAa,CAAC;CAC5D,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IACzB,oBAAoB;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,kCAAkC;IAClC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;IAChD,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-om",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "type": "module",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",