dsh-plugin-om 0.0.6 → 0.0.9

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.
@@ -1,8 +1,21 @@
1
1
  /**
2
- * 会话日志索引:消息索引(message_id → 消息事件,recall 按 message_id 定位区间),
2
+ * 会话日志索引:完整消息索引(index 定位完整消息,recall 与摘要共用同一套编号),
3
3
  * 以及表层节点定位辅助。事件日志仅追加(被遮蔽的事件仍可读,recall 依赖此性质)。
4
+ *
5
+ * 完整消息是摘要日志与 recall 共用的定位单位,分三类:
6
+ * - user:用户消息(user/message)占一条;
7
+ * - assistant:AI 文本(assistant/message 中的文本块)占一条;
8
+ * - toolcall:单个工具调用及其结果占一条(同一条 AI 消息里的文本与工具调用拆开,
9
+ * tool/result 按 source.callId 匹配其 tool-call)。
10
+ * 插件自产消息(<om-history>、运行时快照等 source.kind === 'plugin')不占 index。
11
+ * index 从 0 起、按日志顺序递增、只追加不重排 → 会话内全局稳定,
12
+ * 压缩后旧摘要条目引用的 index 仍然有效。
4
13
  */
5
- import type { MessageIndex, Session, SessionEvent } from './types.ts';
14
+ import type { CompleteMessage, MessageIndex, Session, SessionEvent } from './types.ts';
15
+ /** 工具结果裁剪器结构(tool-result-pruner;超大结果渲染前裁剪)。 */
16
+ export type PrunerLike = {
17
+ pruneContent?: (blocks: readonly unknown[]) => unknown[] | null;
18
+ };
6
19
  /**
7
20
  * 查找 seq 在表层节点序列中的下标(不在则返回 -1)。
8
21
  * 表层节点按日志顺序排列,用于压缩边界定位与遮蔽范围计算。
@@ -12,4 +25,16 @@ export declare function surfaceIndexOf(nodes: readonly number[], seq: number): n
12
25
  export declare function messageIdOfEvent(event: SessionEvent | undefined): string | undefined;
13
26
  /** 消息索引:按日志顺序列出全部消息事件,并按 message_id 定位其在消息序列中的下标。 */
14
27
  export declare function indexMessages(session: Session): MessageIndex;
28
+ /**
29
+ * 完整消息索引:按日志顺序把消息事件折叠为完整消息序列(三类,见文件头)。
30
+ * 工具调用结果按 source.callId 匹配其 tool-call 并入该条;未匹配的 result 独立成条(防御)。
31
+ */
32
+ export declare function indexCompleteMessages(session: Session): CompleteMessage[];
33
+ /**
34
+ * 渲染一条完整消息的文本(recall 输出 / new 模式输入共用):
35
+ * - user:消息原文;
36
+ * - assistant:仅文本块;
37
+ * - toolcall:调用块(工具名 + 参数)+ 结果文本(pruner 裁剪超大结果)。
38
+ */
39
+ export declare function renderCompleteMessage(session: Session, cm: CompleteMessage, pruner?: PrunerLike): string;
15
40
  //# sourceMappingURL=log-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"log-index.d.ts","sourceRoot":"","sources":["../src/log-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAe,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF;;;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"}
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;;;GAGG;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"}
package/dist/recall.d.ts CHANGED
@@ -1,20 +1,22 @@
1
1
  /**
2
- * recall 工具:按 message_id 回看原始会话(start_id/end_id 为消息 idoffset 为相对
3
- * start_id 的消息步数)。recall 自身不设输出上限:超大的工具结果由 tool-result-pruner
4
- * 裁剪(pruneContent),输出 token pruner 配置控制。
2
+ * recall 工具:按「完整消息」序号(index)回看原始会话(start/end 为完整消息 index
3
+ * offset 为相对 start 的完整消息步数)。完整消息分三类(用户消息 / AI 文本 / 单个工具
4
+ * 调用及其结果),各占一个 index(从 0 起、会话内全局稳定),与摘要日志条目同一套编号。
5
+ * recall 自身不设输出上限:超大的工具结果由 tool-result-pruner 裁剪(pruneContent),
6
+ * 输出 token 由 pruner 配置控制。
5
7
  *
6
- * 参数由 zod schema(recallArgsSchema)在 execute 入口校验:start_id 必填且非空,
7
- * end_id/offset 至少提供一个;非法参数抛出可读错误。
8
+ * 参数由 zod schema(recallArgsSchema)在 execute 入口校验:start 必填(number),
9
+ * end/offset 至少提供一个;非法参数抛出可读错误。
8
10
  */
9
11
  import { z } from 'zod';
10
12
  import type { ToolDefinition } from './types.ts';
11
13
  /**
12
- * recall 工具参数 schema:start_id 必填且非空;end_id 与 offset 至少提供一个
13
- * (二者同时给出时 end_id 优先,与 execute 语义一致);未知键自动剥离。
14
+ * recall 工具参数 schema:start 必填(number);end 与 offset 至少提供一个
15
+ * (二者同时给出时 end 优先,与 execute 语义一致);未知键自动剥离。
14
16
  */
15
17
  export declare const recallArgsSchema: z.ZodObject<{
16
- start_id: z.ZodString;
17
- end_id: z.ZodOptional<z.ZodString>;
18
+ start: z.ZodNumber;
19
+ end: z.ZodOptional<z.ZodNumber>;
18
20
  offset: z.ZodOptional<z.ZodNumber>;
19
21
  }, z.core.$strip>;
20
22
  /** recall 工具调用参数(由 recallArgsSchema 推断)。 */
@@ -25,7 +27,7 @@ export type RecallArgs = z.infer<typeof recallArgsSchema>;
25
27
  */
26
28
  export declare function parseRecallArgs(raw: unknown): RecallArgs;
27
29
  /**
28
- * 构建 recall 工具定义:按 start_id/end_id/offset 定位消息区间并渲染原始内容。
30
+ * 构建 recall 工具定义:按 start/end/offset 定位完整消息区间并渲染原始内容(标 index)。
29
31
  * getPruner 返回 tool-result-pruner(可选),用于裁剪超大工具结果。
30
32
  */
31
33
  export declare function buildRecallTool(getPruner?: () => unknown): ToolDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAW,cAAc,EAAkB,MAAM,YAAY,CAAC;AAG1E;;;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,CAiGzE"}
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,50 +1,50 @@
1
1
  /**
2
- * recall-semantic 工具:按自然语言 query 对会话全部消息日志(含被压缩/遮蔽的
3
- * user/assistant/tool-result 事件)做语义检索,返回最匹配的完整消息与匹配说明。
2
+ * recall-semantic 工具:按自然语言 query 对会话全部完整消息(含被压缩/遮蔽的)做语义
3
+ * 检索,返回最匹配的完整消息与匹配说明。
4
4
  *
5
- * - 参数:query 必填;top_k(默认 3,1-10);start_id/end_id/offset 限定检索区间
6
- * (意义同 recall:start_id 为基准边界,end_id 与 offset 二选一;end_id 优先)。
7
- * - 区间缺省(start_id 未提供)→ 检索全部消息;区间不合法(id 不存在等)→
5
+ * - 参数:query 必填;top_k(默认 3,1-10);start/end/offset 限定检索区间
6
+ * (意义同 recall:start 为基准边界,end 与 offset 二选一;end 优先)。
7
+ * - 区间缺省(start 未提供)→ 检索全部消息;区间不合法(start/end 越界等)→
8
8
  * 不报错,回退全量检索并在输出中明确告知(模型可见)。
9
9
  * - 向量:本地 ONNX embedding(embedding.ts,懒加载 + 批量);相似度 = cosine。
10
- * - 输出:命中消息的 message_id/seq/类型 + 完整渲染文本 + 匹配说明(相似度、
10
+ * - 输出:命中消息的 index/类型(toolcall 附调用 id)+ 完整渲染文本 + 匹配说明(相似度、
11
11
  * 命中的关键词);超大结果由 tool-result-pruner 裁剪(同 recall)。
12
12
  * - 仅主会话可用(subagent 拒绝,与 recall 一致)。
13
13
  */
14
14
  import { z } from 'zod';
15
15
  import { type EmbedFn, type ModelStatus } from './embedding.ts';
16
- import type { MessageIndex, ToolDefinition } from './types.ts';
16
+ import type { ToolDefinition } from './types.ts';
17
17
  /** recall-semantic 工具参数 schema:query 必填;top_k 默认 3(1-10);区间参数均可选。 */
18
18
  export declare const semanticRecallArgsSchema: z.ZodObject<{
19
19
  query: z.ZodString;
20
20
  top_k: z.ZodOptional<z.ZodNumber>;
21
- start_id: z.ZodOptional<z.ZodString>;
22
- end_id: z.ZodOptional<z.ZodString>;
21
+ start: z.ZodOptional<z.ZodNumber>;
22
+ end: z.ZodOptional<z.ZodNumber>;
23
23
  offset: z.ZodOptional<z.ZodNumber>;
24
24
  }, z.core.$strip>;
25
25
  /** recall-semantic 工具调用参数(由 semanticRecallArgsSchema 推断)。 */
26
26
  export type SemanticRecallArgs = z.infer<typeof semanticRecallArgsSchema>;
27
27
  /** 解析并校验参数:失败时抛出可读错误(普通 Error 而非 ZodError)。 */
28
28
  export declare function parseSemanticRecallArgs(raw: unknown): SemanticRecallArgs;
29
- /** 区间解析结果:lo/hi 为消息序列下标(含);fallback=true 表示区间无效已回退全量。 */
29
+ /** 区间解析结果:lo/hi 为完整消息 index(含);fallback=true 表示区间无效已回退全量。 */
30
30
  export type RangeResult = {
31
31
  lo: number;
32
32
  hi: number;
33
33
  fallback: boolean;
34
34
  };
35
35
  /**
36
- * 解析检索区间(消息序列下标,含端点)。
37
- * - start_id 未提供 → 全量(fallback=false)。
38
- * - start_id 提供:end_id/offset 计算终点(语义同 recall,end_id 优先);
39
- * start_id/end_id 不存在或区间为空 → fallback=true(全量 + 提示)。
36
+ * 解析检索区间(完整消息 index,含端点)。
37
+ * - start 未提供 → 全量(fallback=false)。
38
+ * - start 提供:end/offset 计算终点(语义同 recall,end 优先);
39
+ * start/end 越界或区间为空 → fallback=true(全量 + 提示)。
40
40
  */
41
- export declare function resolveSemanticRange(index: MessageIndex, args: Pick<SemanticRecallArgs, 'start_id' | 'end_id' | 'offset'>): RangeResult;
41
+ export declare function resolveSemanticRange(total: number, args: Pick<SemanticRecallArgs, 'start' | 'end' | 'offset'>): RangeResult;
42
42
  /** 简易分词:按非字母数字切分为小写词元(匹配要点用,非检索核心)。 */
43
43
  export declare function tokenize(text: string): Set<string>;
44
44
  /** 命中消息的匹配说明行:相似度 + 与 query 共有的关键词(最多 8 个)。 */
45
45
  export declare function matchExplanation(query: string, text: string, score: number): string;
46
46
  /** 模型未就绪时返回给模型的文案(告知即可;下载完成后无需另行通知,直接再次调用)。 */
47
- export declare const SEMANTIC_MODEL_NOT_READY_MESSAGE = "\u8BED\u4E49\u68C0\u7D22\u6682\u4E0D\u53EF\u7528\uFF1A\u672C\u5730\u5D4C\u5165\u6A21\u578B\u5C1A\u672A\u5C31\u7EEA\uFF08\u6B63\u5728\u540E\u53F0\u4E0B\u8F7D\u7EA6 113MB\uFF1B\u4E0B\u8F7D\u5B8C\u6210\u540E\u65E0\u9700\u63D0\u793A\uFF0C\u76F4\u63A5\u518D\u6B21\u8C03\u7528\u672C\u5DE5\u5177\u5373\u53EF\u3002\u82E5\u4E0B\u8F7D\u5931\u8D25\uFF0C\u4E0B\u6B21\u8C03\u7528\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF09\u3002\u53EF\u7A0D\u540E\u91CD\u8BD5\uFF0C\u6216\u5148\u7528 recall \u5DE5\u5177\u6309 message_id \u7CBE\u786E\u68C0\u7D22\u3002";
47
+ export declare const SEMANTIC_MODEL_NOT_READY_MESSAGE = "\u8BED\u4E49\u68C0\u7D22\u6682\u4E0D\u53EF\u7528\uFF1A\u672C\u5730\u5D4C\u5165\u6A21\u578B\u5C1A\u672A\u5C31\u7EEA\uFF08\u6B63\u5728\u540E\u53F0\u4E0B\u8F7D\u7EA6 113MB\uFF1B\u4E0B\u8F7D\u5B8C\u6210\u540E\u65E0\u9700\u63D0\u793A\uFF0C\u76F4\u63A5\u518D\u6B21\u8C03\u7528\u672C\u5DE5\u5177\u5373\u53EF\u3002\u82E5\u4E0B\u8F7D\u5931\u8D25\uFF0C\u4E0B\u6B21\u8C03\u7528\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF09\u3002\u53EF\u7A0D\u540E\u91CD\u8BD5\uFF0C\u6216\u5148\u7528 recall \u5DE5\u5177\u6309\u5B8C\u6574\u6D88\u606F index \u7CBE\u786E\u68C0\u7D22\u3002";
48
48
  /** 构建 recall-semantic 工具定义(embedder/modelStatus 可注入,测试传替身;缺省用本地模型)。 */
49
49
  export declare function buildSemanticRecallTool(options?: {
50
50
  getPruner?: () => unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-recall.d.ts","sourceRoot":"","sources":["../src/semantic-recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAoB,KAAK,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO,KAAK,EAAW,YAAY,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAGxF,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,yDAAyD;AACzD,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,YAAY,EACnB,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAC/D,WAAW,CA4Bb;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,uhBACqE,CAAC;AAEnH,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,CA0IjB"}
1
+ {"version":3,"file":"semantic-recall.d.ts","sourceRoot":"","sources":["../src/semantic-recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;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"}
@@ -9,23 +9,21 @@
9
9
  * - disable:关闭自动压缩(compress.ts 早退,不发起摘要调用)。
10
10
  *
11
11
  * 提示词不内嵌消息全文(fork 模式完整历史随请求传入;new 模式由 compress.ts 渲染
12
- * 区间传入);message_id 对照表与中断标记由插件从日志计算后内嵌(id 非原文,保留关键 id
13
- * recall 检索)。token usage 从流式响应的 usage chunk 提取,归入主会话记录。
14
- * 仅主会话生效(index.ts 守卫)。
12
+ * 区间传入);新消息起始 index 由插件从日志计算后内嵌——AI 按「完整消息」的
13
+ * index 编号(三类定义见 log-index.ts),recall 用同一套编号定位。token usage 从流式
14
+ * 响应的 usage chunk 提取,归入主会话记录。仅主会话生效(index.ts 守卫)。
15
15
  */
16
16
  import type { SummaryMode } from './config.ts';
17
17
  import type { Agent, Context, Session, TokenUsage } from './types.ts';
18
18
  import { type RoutedTarget } from './utils.ts';
19
19
  /** 观察者 persona:只针对未压缩消息产出观察日志,不用工具、不展示思考。 */
20
- export declare const OBSERVER_PERSONA = "\u4F60\u662F dsh-plugin-om \u7684\u4E0A\u4E0B\u6587\u89C2\u5BDF\u8005\uFF08Observer\uFF0C\u673A\u5236\u53C2\u8003 Mastra Observational Memory\uFF09\uFF1A\u628A\u4F1A\u8BDD\u4E2D\u5C1A\u672A\u538B\u7F29\u7684\u6D88\u606F\u538B\u7F29\u4E3A\u4E00\u4EFD\u89C2\u5BDF\u65E5\u5FD7\u3002\u4E0D\u7528\u5DE5\u5177\u3001\u4E0D\u5C55\u793A\u601D\u8003\u3001\u4E0D\u8BC4\u4EF7\u4EE3\u7801\u3001\u4E0D\u8F93\u51FA\u591A\u4F59\u6587\u5B57\u3002";
20
+ export declare const OBSERVER_PERSONA = "\u628A\u4F1A\u8BDD\u4E2D\u5C1A\u672A\u538B\u7F29\u7684\u6D88\u606F\u538B\u7F29\u4E3A\u4E00\u4EFD\u89C2\u5BDF\u65E5\u5FD7\u3002\u4E0D\u7528\u5DE5\u5177\u3001\u4E0D\u5C55\u793A\u601D\u8003\u3001\u4E0D\u8BC4\u4EF7\u4EE3\u7801\u3001\u4E0D\u8F93\u51FA\u591A\u4F59\u6587\u5B57\u3002";
21
21
  /** 反思者 persona:只精简合并当前摘要,不用工具、不展示思考。 */
22
- export declare const REFLECTOR_PERSONA = "\u4F60\u662F dsh-plugin-om \u7684\u4E0A\u4E0B\u6587\u53CD\u601D\u8005\uFF08Reflector\uFF0C\u673A\u5236\u53C2\u8003 Mastra Observational Memory\uFF09\uFF1A\u628A\u5F53\u524D <om-history> \u538B\u7F29\u65E5\u5FD7\u7CBE\u7B80\u5408\u5E76\u4E3A\u4E00\u4EFD\u66F4\u7D27\u51D1\u7684\u65E5\u5FD7\u3002\u4E0D\u7528\u5DE5\u5177\u3001\u4E0D\u5C55\u793A\u601D\u8003\u3001\u4E0D\u8F93\u51FA\u591A\u4F59\u6587\u5B57\u3002";
23
- /** 观察提示词参数(对照表/中断标记由 compress.ts 从日志计算后传入)。 */
22
+ export declare const REFLECTOR_PERSONA = "\u628A\u5F53\u524D <om-history> \u538B\u7F29\u65E5\u5FD7\u7CBE\u7B80\u5408\u5E76\u4E3A\u4E00\u4EFD\u66F4\u7D27\u51D1\u7684\u65E5\u5FD7\u3002\u4E0D\u7528\u5DE5\u5177\u3001\u4E0D\u5C55\u793A\u601D\u8003\u3001\u4E0D\u8F93\u51FA\u591A\u4F59\u6587\u5B57\u3002";
23
+ /** 观察提示词参数(起始 index 由 compress.ts 从日志计算后传入)。 */
24
24
  export type ObservePromptOptions = {
25
- /** message_id 对照表行(按序对应消息记录中的未压缩消息)。 */
26
- table: string[];
27
- /** 中断标记行(aborted/interrupted 轮次)。 */
28
- interruptions: string[];
25
+ /** 本次要压缩的新消息起始完整消息 index(AI 从该序号开始编号)。 */
26
+ startIndex: number;
29
27
  /** 是否存在旧摘要(决定「追加到上次产物末尾」的表述)。 */
30
28
  hasOldHistory: boolean;
31
29
  /** 摘要模式:fork=完整历史随请求传入;new=被压缩消息渲染为输入。 */
@@ -34,10 +32,10 @@ export type ObservePromptOptions = {
34
32
  /**
35
33
  * 构建观察指令主体:任务声明(fork:停止任务/禁止工具;new:说明总结日志)+ 模式相关
36
34
  * 的上下文定位与压缩范围(fork:上方完整会话记录——尾部已在输入中实际截断,提示词不含
37
- * 尾部规则;new:下方消息即压缩对象)+ 规则(用户消息完整保留原文 / AI 消息模块化压缩
38
- * ——工具调用按目的聚合——不限于 run_code / 倾向于新消息 / 中断标注 / 未完成写进度与
39
- * 下一步)+ 输出格式(合法 XML)+ 对照表 + 中断标记 + 追加说明。persona 由调用方拼接
40
- * 到指令开头。
35
+ * 尾部规则;new:下方消息即压缩对象)+ 完整消息与 index 定义(三类合并规则、起始编号)+
36
+ * 规则(用户消息完整保留原文 / AI 消息按模块压缩 / 本指令不入日志 / index/start/end 连续 /
37
+ * 倾向于新消息 / 未完成写进度与下一步)+ 输出格式(合法 XML)+ 追加说明。
38
+ * persona 由调用方拼接到指令开头。
41
39
  */
42
40
  export declare function buildObservePrompt(options: ObservePromptOptions): string;
43
41
  /** 构建反思指令主体:任务声明(fork:停止任务/禁止工具;new:说明总结日志)+ 精简合并
@@ -52,17 +50,16 @@ export type SummarySubagentResult = {
52
50
  usage?: TokenUsage;
53
51
  };
54
52
  /**
55
- * 渲染表层消息记录(new 模式输入):按表层顺序分组为合法 XML——
56
- * - 用户消息 → <user_message id="(message_id)">(原文)</user_message>;
57
- * - 连续 AI 消息(assistant/message 与其后的 tool/result)聚合为一个
58
- * <assistant last_id="(组内最后一条消息的 message_id)">(各消息文本)</assistant>。
59
- * 组内文本沿用 role 头 + message_id + 文本(tool-call 展开参数、tool-result 取文本)。
53
+ * 渲染完整消息记录(new 模式输入):按完整消息渲染为合法 XML,每条带绝对 index——
54
+ * - user → <user_message index="N">(原文)</user_message>;
55
+ * - assistant / toolcall → <assistant index="N">(文本 / 调用参数+结果)</assistant>。
56
+ * 仅渲染 seqs 全部落在给定集合内的完整消息(插件自产消息天然不占位)。
60
57
  */
61
58
  export declare function renderMessages(session: Session, seqs: readonly number[]): string;
62
59
  /** 日志最小有效长度:<om-history> 中间内容小于该长度视为不合法(C 段校验)。 */
63
60
  export declare const MIN_HISTORY_LENGTH = 10;
64
61
  /** 产出日志后插入首个 <om-history> 后的格式说明(XML 注释,避免被误读为日志条目)。 */
65
- export declare const HISTORY_FORMAT_NOTE = "<!-- <user_message>\u5757\u5185\u5305\u542B\u4E86\u7528\u6237\u7684\u539F\u6587 id\u8868\u793A\u8BE5\u6D88\u606F\u7684id\uFF1B<assistant>\u5757\u662F\u591A\u6761ai\u8FDE\u7EED\u6D88\u606F\u7684\u805A\u5408\uFF0Clast_id\u6307\u5411\u6700\u540E\u4E00\u6761\u6D88\u606F -->";
62
+ export declare const HISTORY_FORMAT_NOTE = "<!-- \u5B8C\u6574\u6D88\u606F\u5206\u4E09\u7C7B\uFF08\u7528\u6237\u6D88\u606F / AI \u6587\u672C / \u5355\u4E2A\u5DE5\u5177\u8C03\u7528\u53CA\u5176\u7ED3\u679C\uFF09\uFF0C\u5404\u5360\u4E00\u4E2A index\uFF08\u4ECE 0 \u8D77\u3001\u4F1A\u8BDD\u5185\u5168\u5C40\u7A33\u5B9A\uFF09\uFF1B<user_message index=\"N\"> \u4E0E <assistant index=\"N\"> \u8868\u793A\u5355\u6761\u5B8C\u6574\u6D88\u606F\uFF0C<assistant start=\"A\" end=\"B\"> \u8868\u793A\u591A\u6761\u5B8C\u6574\u6D88\u606F\uFF0Cstart/end\u662F\u9996\u5C3E\u6D88\u606F\u7684index -->";
66
63
  /**
67
64
  * 从 AI 摘要输出中提取合法日志(不信任 AI 的总结结果):
68
65
  * - 取首个 <om-history> 到最后一个 </om-history>(含两个首尾)切为日志;
@@ -1 +1 @@
1
- {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../src/summarize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,KAAK,YAAY,EAA2B,MAAM,YAAY,CAAC;AAExE,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,kbACyF,CAAC;AAEvH,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,6ZACiG,CAAC;AAEhI,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,wCAAwC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qCAAqC;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,0CAA0C;IAC1C,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAuDxE;AAED;qEACqE;AACrE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAuC5D;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AA4CF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAoChF;AA4DD,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,mRACyD,CAAC;AAE1F;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB5D;AAED,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAKtC;;;;;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,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CA+EvC"}
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../src/summarize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,YAAY,CAAC;AAErD,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,yRACqB,CAAC;AAEnD,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,mQAC4B,CAAC;AAE3D,gDAAgD;AAChD,MAAM,MAAM,oBAAoB,GAAG;IACjC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,0CAA0C;IAC1C,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAuDxE;AAED;qEACqE;AACrE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA+C5D;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AA4CF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAehF;AA4DD,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,4hBAC+J,CAAC;AAEhM;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB5D;AAED,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAKtC;;;;;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,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CA+EvC"}
package/dist/types.d.ts CHANGED
@@ -24,7 +24,7 @@ export type { PluginConfig } from './config.ts';
24
24
  export type { Agent, CompactionId, Context, EventOptions, Events, Message, Session, SessionEvent, SubagentResult, SubagentRun, SubagentStartRequest, SystemPrompt, TokenMeter, TokenUsage, ToolDefinition, ToolResultPruner, ToolRunContext, UserMessage, };
25
25
  /**
26
26
  * 一条消息事件(user/assistant/tool-result),带稳定 message_id;
27
- * recall 按 message_id 定位消息序列下标。
27
+ * 消息级索引(indexMessages)的节点,按 message_id 定位消息序列下标。
28
28
  */
29
29
  export type MessageNode = {
30
30
  /** 事件在日志中的 seq。 */
@@ -41,4 +41,20 @@ export type MessageIndex = {
41
41
  /** message_id → messages 数组下标。 */
42
42
  byId: Map<string, number>;
43
43
  };
44
+ /**
45
+ * 一条完整消息:摘要日志与 recall 共用的定位单位,分三类——
46
+ * user(用户消息)、assistant(AI 文本)、toolcall(单个工具调用及其结果)。
47
+ * index 从 0 起、按日志顺序递增、只追加不重排 → 会话内全局稳定
48
+ * (压缩后旧摘要条目引用的 index 仍然有效);插件自产消息不占位。
49
+ */
50
+ export type CompleteMessage = {
51
+ /** 完整消息序号(0 起,全局稳定)。 */
52
+ index: number;
53
+ /** 类别:user=用户消息;assistant=AI 文本;toolcall=单个工具调用及其结果。 */
54
+ type: 'user' | 'assistant' | 'toolcall';
55
+ /** 关联的消息事件 seq(user/assistant=1 个;toolcall=assistant 消息 + 结果)。 */
56
+ seqs: number[];
57
+ /** 工具调用 id(仅 toolcall 类;关联 tool/result 用)。 */
58
+ callId?: string;
59
+ };
44
60
  //# sourceMappingURL=types.d.ts.map
@@ -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"}
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,wDAAwD;IACxD,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-om",
3
- "version": "0.0.6",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",
@@ -23,6 +23,7 @@
23
23
  "files": [
24
24
  "dist",
25
25
  "models",
26
+ "!models/*/onnx/*.onnx",
26
27
  "cordis.patch.yml",
27
28
  "README.md"
28
29
  ],
@@ -41,7 +42,7 @@
41
42
  "build": "tsdown && tsc -p tsconfig.build.json",
42
43
  "download:model": "node scripts/download-model.mjs",
43
44
  "check": "pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build",
44
- "release": "pnpm format && npm version patch && node scripts/release-archive.mjs && git push && git push --tags",
45
+ "release": "pnpm check && pnpm format && npm version patch && node scripts/release-archive.mjs && git push && git push --tags",
45
46
  "typecheck": "tsc --noEmit",
46
47
  "test": "vitest run",
47
48
  "build:types": "tsc -p tsconfig.build.json",