@aalis/schema-message 0.10.0 → 0.11.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.
@@ -1,3 +1,4 @@
1
+ import type { MessageAttachment } from './index.js';
1
2
  /** 附件 kind 显示名(中文,用作占位符前缀)。新增 kind 在此处加常量即可。 */
2
3
  export declare const AttachmentRefKind: {
3
4
  readonly Image: "图片";
@@ -6,6 +7,8 @@ export declare const AttachmentRefKind: {
6
7
  readonly File: "文件";
7
8
  };
8
9
  export type AttachmentRefKind = (typeof AttachmentRefKind)[keyof typeof AttachmentRefKind];
10
+ /** 附件的种类({@link MessageAttachment} 的 kind)→ 引用里写的种类。写引用与按种类认引用的各方都查这一份 */
11
+ export declare const ATTACHMENT_REF_KINDS: Readonly<Record<MessageAttachment['kind'], AttachmentRefKind>>;
9
12
  export interface AttachmentRef {
10
13
  kind: AttachmentRefKind;
11
14
  /** 可选语义描述(视觉概要 / 文件备注 / 音频转写片段等) */
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-ref.d.ts","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"AA0BA,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAK3F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAI5D;AAgBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAUjE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtF"}
1
+ {"version":3,"file":"attachment-ref.d.ts","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE3F,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAK/F,CAAC;AAKF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAI5D;AAgBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAUjE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtF"}
@@ -4,7 +4,7 @@
4
4
  // Aalis 在多个地方需要把附件(图片 / 音频 / 视频 / 文件)以可读、可解析的
5
5
  // 形式塞回 LLM 上下文里。依赖 `[图片: desc | ref:xxx]` 这种格式的调用点:
6
6
  // - plugin-adapter-onebot 入站构造附件占位
7
- // - plugin-image-sender 出站归档自己刚发的图
7
+ // - plugin-message-archive 把发出的附件记进会话历史(outboundMediaMessage)
8
8
  // - plugin-media 到达识别写入描述(service.ts),以及按 ref 匹配并重写
9
9
  // 历史描述(tools.ts,另有一处本地正则提取 ref)
10
10
  // 任何一处格式漂移都会让其它调用点的解析悄悄断链。
@@ -30,6 +30,13 @@ export const AttachmentRefKind = {
30
30
  Video: '视频',
31
31
  File: '文件',
32
32
  };
33
+ /** 附件的种类({@link MessageAttachment} 的 kind)→ 引用里写的种类。写引用与按种类认引用的各方都查这一份 */
34
+ export const ATTACHMENT_REF_KINDS = {
35
+ image: AttachmentRefKind.Image,
36
+ audio: AttachmentRefKind.Audio,
37
+ video: AttachmentRefKind.Video,
38
+ file: AttachmentRefKind.File,
39
+ };
33
40
  /** 所有 kind 显示名的联合,供正则构造时迭代。 */
34
41
  const ALL_KINDS = Object.values(AttachmentRefKind);
35
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-ref.js","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment-ref.js","sourceRoot":"","sources":["../src/attachment-ref.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,11 @@ export declare function getSenderLabel(nickname?: string, userId?: string): stri
20
20
  * 有标签时返回 `[label]: content`,无标签时原样返回 content。
21
21
  */
22
22
  export declare function prefixSender(content: string, nickname?: string, userId?: string): string;
23
+ /**
24
+ * 归档正文由 prefixSender 烘进了发送者前缀;重排给模型或界面看时身份另有标注,按归档时记下的同一个标签(元数据的
25
+ * SenderLabel 键)去掉这一层,正文自己以 [..]: 开头的不动。content 以 `[label]: ` 开头时去掉这一段,没有标签时原样返回
26
+ */
27
+ export declare function stripSenderPrefix(content: string, label: string | undefined): string;
23
28
  /**
24
29
  * 获取适用于 Message.name / OpenAI API name 字段的安全标识符。
25
30
  * 使用 userId(稳定不变)而非 nickname(可变)。
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE"}
package/dist/identity.js CHANGED
@@ -28,6 +28,14 @@ export function prefixSender(content, nickname, userId) {
28
28
  const label = getSenderLabel(nickname, userId);
29
29
  return label ? `[${label}]: ${content}` : content;
30
30
  }
31
+ /**
32
+ * 归档正文由 prefixSender 烘进了发送者前缀;重排给模型或界面看时身份另有标注,按归档时记下的同一个标签(元数据的
33
+ * SenderLabel 键)去掉这一层,正文自己以 [..]: 开头的不动。content 以 `[label]: ` 开头时去掉这一段,没有标签时原样返回
34
+ */
35
+ export function stripSenderPrefix(content, label) {
36
+ const prefix = `[${label}]: `;
37
+ return label && content.startsWith(prefix) ? content.slice(prefix.length) : content;
38
+ }
31
39
  /**
32
40
  * 获取适用于 Message.name / OpenAI API name 字段的安全标识符。
33
41
  * 使用 userId(稳定不变)而非 nickname(可变)。
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB,EAAE,MAAe;IAC/D,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC;IAChD,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAiB,EAAE,MAAe;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB,EAAE,MAAe;IAC/D,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC;IAChD,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAiB,EAAE,MAAe;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAAyB;IAC1E,MAAM,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC;IAC9B,OAAO,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
@@ -1,7 +1,12 @@
1
- import type { IncomingMessage } from './index.js';
1
+ import type { ForwardedChat, IncomingMessage } from './index.js';
2
+ /** 正文里一段转发所在位置的占位:适配器写进 content,归档文本由 {@link withForwards} 换成展开 */
3
+ export declare function forwardPlaceholder(id: string): string;
4
+ /** 正文里的转发占位换成对应的展开;没有对应展开的占位原样留着 */
5
+ export declare function withForwards(content: string, forwards: readonly ForwardedChat[] | undefined): string;
2
6
  /**
3
- * 入站消息 → 归档文本:多用户平台加发送者前缀,引用回复与附件描述(`_attachmentDescriptions`)
4
- * 追加在末尾。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
7
+ * 入站消息 → 归档文本:转发的展开换回正文里占位的位置({@link withForwards});给了说话人(speaker)就加发送者前缀
8
+ * (getSenderLabel 的写法),不给不加;引用回复与附件描述(`_attachmentDescriptions`)追加在末尾。谁算说话人由调用方定
9
+ * (参考规则是 api-message-archive 的 speakerOf),本函数不看平台。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
5
10
  */
6
- export declare function buildIncomingContent(incoming: IncomingMessage): string;
11
+ export declare function buildIncomingContent(incoming: IncomingMessage, speaker?: Pick<IncomingMessage, 'nickname' | 'userId'>): string;
7
12
  //# sourceMappingURL=incoming-content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"incoming-content.d.ts","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAwBtE"}
1
+ {"version":3,"file":"incoming-content.d.ts","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,oCAAoC;AACpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,GAAG,MAAM,CAOpG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,QAAQ,CAAC,GACrD,MAAM,CAwBR"}
@@ -5,17 +5,27 @@
5
5
  // 共用同一份拼法;两边各写一份会让判定时看到的当前消息与历史里存下的那条逐字漂移。
6
6
  // ============================================================
7
7
  import { getSenderLabel, prefixSender } from './identity.js';
8
- /** 单用户平台:无需发送者前缀(不存在多人说话歧义) */
9
- const SINGLE_USER_PLATFORMS = new Set(['webui', 'cli']);
8
+ /** 正文里一段转发所在位置的占位:适配器写进 content,归档文本由 {@link withForwards} 换成展开 */
9
+ export function forwardPlaceholder(id) {
10
+ return `<forward id="${id}">[合并转发消息]</forward>`;
11
+ }
12
+ /** 正文里的转发占位换成对应的展开;没有对应展开的占位原样留着 */
13
+ export function withForwards(content, forwards) {
14
+ if (!forwards?.length)
15
+ return content;
16
+ const expanded = new Map(forwards.map(forward => [forward.id, forward.content]));
17
+ return content.replace(/<forward id="([^"]+)">\[合并转发消息\]<\/forward>/g, (raw, id) => expanded.get(id) ?? raw);
18
+ }
10
19
  /**
11
- * 入站消息 → 归档文本:多用户平台加发送者前缀,引用回复与附件描述(`_attachmentDescriptions`)
12
- * 追加在末尾。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
20
+ * 入站消息 → 归档文本:转发的展开换回正文里占位的位置({@link withForwards});给了说话人(speaker)就加发送者前缀
21
+ * (getSenderLabel 的写法),不给不加;引用回复与附件描述(`_attachmentDescriptions`)追加在末尾。谁算说话人由调用方定
22
+ * (参考规则是 api-message-archive 的 speakerOf),本函数不看平台。附件描述须已写好(识别由 plugin-media 负责,本函数只拼接)。
13
23
  */
14
- export function buildIncomingContent(incoming) {
15
- const useSenderPrefix = !SINGLE_USER_PLATFORMS.has(incoming.platform);
16
- let content = useSenderPrefix ? prefixSender(incoming.content, incoming.nickname, incoming.userId) : incoming.content;
24
+ export function buildIncomingContent(incoming, speaker) {
25
+ const body = withForwards(incoming.content, incoming.forwards);
26
+ let content = speaker ? prefixSender(body, speaker.nickname, speaker.userId) : body;
17
27
  // 引用回复:把被引用消息的标签 + 内容拼到末尾,作为不可分割的上下文
18
- // 与图片描述、forward 摘要相同处理逻辑——把"非当前指令"的素材烘焙进归档文本,
28
+ // 与附件描述相同处理逻辑——把"非当前指令"的素材烘焙进归档文本,
19
29
  // 这样下一轮从 memory 拉历史时仍能看到引用关系。
20
30
  if (incoming.replyTo?.content) {
21
31
  const replyLabel = getSenderLabel(incoming.replyTo.nickname, incoming.replyTo.userId) ?? '?';
@@ -1 +1 @@
1
- {"version":3,"file":"incoming-content.js","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,EAAE;AACF,2DAA2D;AAC3D,2CAA2C;AAC3C,+DAA+D;AAE/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7D,+BAA+B;AAC/B,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAyB;IAC5D,MAAM,eAAe,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IAEtH,qCAAqC;IACrC,8CAA8C;IAC9C,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAC7F,OAAO,IAAI,SAAS,UAAU,SAAS,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC;IACrE,CAAC;IAED,iEAAiE;IACjE,oEAAoE;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,CAAC;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"incoming-content.js","sourceRoot":"","sources":["../src/incoming-content.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,EAAE;AACF,2DAA2D;AAC3D,2CAA2C;AAC3C,+DAA+D;AAE/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7D,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,gBAAgB,EAAE,sBAAsB,CAAC;AAClD,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAA8C;IAC1F,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,OAAO,CAAC,OAAO,CACpB,8CAA8C,EAC9C,CAAC,GAAG,EAAE,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAC7C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAyB,EACzB,OAAsD;IAEtD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpF,qCAAqC;IACrC,mCAAmC;IACnC,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAC7F,OAAO,IAAI,SAAS,UAAU,SAAS,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC;IACrE,CAAC;IAED,iEAAiE;IACjE,oEAAoE;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,CAAC;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { TextRef } from '@aalis/schema-i18n';
1
2
  /**
2
3
  * OpenAI/DeepSeek chat completions 中 assistant 消息携带的工具调用载荷。
3
4
  * 与 Message 同源同生命周期,故所属本包。
@@ -66,7 +67,8 @@ export interface Message {
66
67
  * - `'cross-session-delegation'` :notice 子类——系统代发的任务指令(triggerType 为 proactive,如 workflow 的 agent 节点)。
67
68
  * - `'host-notice'` :notice 子类——宿主撰写的事件通知(入站消息带 hostNotice)。
68
69
  * - `'outbound-image'` :assistant 子类——agent 已发出的图片。
69
- * - notice 的平台事件类型 :`'poke' | 'group_recall' | 'group_increase' | ...`(取自 OneBot 等适配器)。
70
+ * - 平台事件类型 :`'poke' | 'group_recall' | 'group_increase' | ...`(取自 OneBot 等适配器)。平台通知
71
+ * 落成 notice;转成入站的(如戳一戳、群文件上传)仍是 user,kind 取 {@link IncomingMessage}.noticeType。
70
72
  *
71
73
  * 第三方插件可定义自己的 kind 字符串,但请避开 `WellKnownKinds` 中已有的语义。
72
74
  */
@@ -110,20 +112,31 @@ export interface MessageAttachment {
110
112
  /** 时长秒(仅音视频,如已知) */
111
113
  durationSec?: number;
112
114
  /**
113
- * 出站附件:文本描述(vision/asr 结果)。由生产者(如 send_attachment)填充,
114
- * 供全局出站归档写入 `[类型: desc | ref:xxx]` 标记,让 memory_recall 能命中。
115
+ * 出站附件:文本描述(识图、转写的结果),生产者已有时填上。出站记进会话历史时写进占位符的描述位
116
+ * (`[类型: desc | ref:xxx]`,见 api-message-archive 的 recordOutbound),memory_recall 据此命中
115
117
  */
116
118
  description?: string;
117
119
  /**
118
- * 出站附件:稳定引用标识(http(s) url / storage uri)。用于出站归档与历史回放;
119
- * 缺省时全局归档回退用 data。与平台落盘后改写的 data 解耦,避免归档到临时/不可访问路径。
120
+ * 稳定的地址(网址或存储地址)。出站:记进会话历史时用它,没有时取 data 里的地址(见 api-message-archive 的
121
+ * outboundAddress),与平台落盘后改写的 data 无关。入站:预处理器把附件落了盘或换掉 data 时写的地址(媒体识别落盘上传的
122
+ * 图片、文件读取换成文件引用前的地址),存档的附件清单在 data 不是地址时按它记;适配器不填
120
123
  */
121
124
  ref?: string;
122
- /**
123
- * 出站附件:跳过全局归档。用于 history_ref 重发等场景(同一媒体已在档,
124
- * 避免向量库膨胀与重复入档)。缺省 false。
125
- */
126
- skipArchive?: boolean;
125
+ }
126
+ /** 一轮的事实(见 {@link IncomingMessage.fromTurn}) */
127
+ export interface FromTurn {
128
+ platform: string;
129
+ /** 物理发言者(同 {@link IncomingMessage.userId},没有时不设,如定时任务那一轮) */
130
+ userId?: string;
131
+ /** 参与者:那次调用的参与者(按 api-authority 的 originTurnOf 算,批过的是批的人) */
132
+ participants: readonly {
133
+ platform: string;
134
+ userId: string;
135
+ }[];
136
+ /** 那一轮的来源(同 {@link IncomingMessage.source},人亲手发来的没有) */
137
+ source?: string;
138
+ /** 那一轮自己的起它的那一轮 */
139
+ fromTurn?: FromTurn;
127
140
  }
128
141
  export interface IncomingMessage {
129
142
  content: string;
@@ -149,8 +162,10 @@ export interface IncomingMessage {
149
162
  */
150
163
  _attachmentDescriptions?: Array<string | undefined>;
151
164
  /**
152
- * 平台类型名:适配器在 PlatformAdapter.sessionTypes 里声明的类型之一(如 OneBot 的 group、private、channel)。
153
- * 不带时,平台声明了多方类型的按多方,没声明或只有一对一类型的按 private、一对一(api-platform 的 resolveSessionType)
165
+ * 平台类型名:适配器在 PlatformAdapter.sessionTypes 里声明的类型之一(如 OneBot 的 group、private、channel)。会话管理在
166
+ * IM 房间建档时按它记下聊天窗口;判是不是多方读会话记录的 originChat.multiParty(子会话取根会话的),不看消息上的它。
167
+ * 不带时,平台声明了多方类型的按其中第一个、多方,只声明了一对一类型的按第一个,没声明的按 private、一对一
168
+ * (api-platform 的 resolveSessionType)
154
169
  */
155
170
  sessionType?: string;
156
171
  /** 收到这条消息的机器人账号(平台给出时由适配器填,如 OneBot 的 self_id) */
@@ -158,9 +173,21 @@ export interface IncomingMessage {
158
173
  /**
159
174
  * 系统侧注入者的来源标识(如 'idle-trigger'、'scheduler'、'workflow:<id>')。
160
175
  * 平台适配器投递真人消息**不设置**此字段:带 source 的消息被视为内部注入——不经触发策略、
161
- * 不过回复后冷却(禁言与限速照常生效)。同时用于并发隔离:同一 session 不同来源互不打断。
176
+ * 不过回复后冷却(禁言与限速照常生效),也不过指令解析(声明了 {@link IncomingMessage.ownerApproved} 的除外),
177
+ * 不进长期记忆(向量记忆,档案的旁观计数与事实提取)。
178
+ * 带来源的输入各自成一轮,不与别的输入叠加;注入方的来源应当标识发送方。
162
179
  */
163
180
  source?: string;
181
+ /**
182
+ * 到达序号:网关在入站相位之前给每条入站消息打的,这次运行内递增(网关重载后从头计)。只用于日志关联(见
183
+ * {@link arrivalTag}),不落库、不进模型;没经网关进来的没有
184
+ */
185
+ arrival?: number;
186
+ /**
187
+ * 注入方的声明:这段文字在建立时经 owner 过目过原文(owner 自己写下,或每次由 owner 审批),算作 owner 亲手写的。
188
+ * 注入方必须同时设 source;只给经 owner 过目原文的文字设,第一方的设置方在仓内守卫里登记
189
+ */
190
+ ownerApproved?: boolean;
164
191
  /** 群名称(仅群聊时可用) */
165
192
  groupName?: string;
166
193
  /** 多方聊天窗口的 id,由适配器填(如 OneBot 的群号,频道为 `<guild>:<channel>`) */
@@ -186,19 +213,34 @@ export interface IncomingMessage {
186
213
  userId?: string;
187
214
  nickname?: string;
188
215
  };
189
- /** 通知子类型(如 poke、group_upload 等非消息事件) */
216
+ /**
217
+ * 随这条消息转发来的聊天记录(如 OneBot 的合并转发),按在正文里出现的先后,不是发言人自己写的话。适配器在 content 里它所在的
218
+ * 位置写 {@link forwardPlaceholder}(id)(转发 id 不含双引号;用户手打的同样写法先转义,同 {@link AT_SELF_PATTERN}),给模型的
219
+ * 展开写在 content、给界面的事实写在 facts;适配器必须在 content 里写占位,漏写的展开不进归档文本。归档文本
220
+ * ({@link buildIncomingContent})把占位换回展开,模型看到的与展开写在正文里一样;发言人的话(content、存档的 SpokenContent)、
221
+ * 点名、禁言关键词与 @ 的账号只看 content;存档另记成 {@link WellKnownMetadataKeys}.Forwards。别的平台有转发照这条接:渲染成
222
+ * 占位、展开放这里、转义手打的写法;存档、会话服务、WebUI、点名与画像都不认平台
223
+ */
224
+ forwards?: ForwardedChat[];
225
+ /** 通知子类型(如 poke、group_upload 等非消息事件);存档记成消息的 kind */
190
226
  noticeType?: string;
191
227
  /** 通知动作是否指向机器人;poke 为 false 时按未点名互动判断,省略沿用戳机器人的语义。 */
192
228
  noticeTargetIsSelf?: boolean;
229
+ /**
230
+ * 平台事件合成或转成的入站(如好友申请、入群邀请、戳一戳、群文件上传)给人看的那句(文字对象):content 是写给模型的
231
+ * (有的带处理办法与工具用法),界面显示这一句,按读者的语言渲染。适配器写,真人发言不设;不进模型的上下文,也不参与触发与
232
+ * 回复的判定,存档按 {@link WellKnownMetadataKeys}.Text 记下
233
+ */
234
+ text?: TextRef;
193
235
  /**
194
236
  * 触发类型(下游插件可据此区分主发言者语义)。真人消息由 inbound:trigger 相位生效的触发插件写入
195
237
  * (immediate / interval),平台适配器不设置;内部注入由注入方自带(idle、proactive)。flow 相位对
196
- * immediate 不查回复后冷却与限速,所以不经触发插件改写时(作用域外、没装触发插件),入站消息上预设的
238
+ * immediate 不查回复后冷却与限速,所以不经触发插件改写时(生效范围外、没装触发插件),入站消息上预设的
197
239
  * immediate 会原样生效。
198
240
  * - 'direct' 私聊或单一用户直连(默认语义:userId 是主发言者)
199
241
  * - 'immediate' 群聊中被 @/名字主动触发(userId 是主发言者)
200
- * - 'interval' 群聊中因消息频率/活跃度被动触发(无明确主发言者,userId 仅为最后一条消息发送者)
201
- * - 'idle' 空闲自动触发(无 userId / 无主发言者)
242
+ * - 'interval' 群聊中没点名、因消息频率/活跃度被挑中(提示词按无明确主发言者写;授权身份照旧是发言者)
243
+ * - 'idle' 空闲自动触发(无 userId / 无主发言者);存档不落档,agent 以 system 指令块交给模型
202
244
  * - 'proactive' 系统代发给 agent 的任务指令,如 workflow 的 agent 节点(content 是任务描述而非用户消息)
203
245
  * 未设置时下游插件按 'direct' 兼容处理。
204
246
  */
@@ -209,26 +251,32 @@ export interface IncomingMessage {
209
251
  *
210
252
  * 与 platform/userId 的区别:
211
253
  * - platform/userId 表示消息的物理来源(路由+发言者标识),写归档、做用户档案/关系;
212
- * - actor 表示授权身份,agent 构造 ToolCallContext 时优先使用 actor,
254
+ * - actor 表示授权身份,agent 算这一轮的参与者时优先使用 actor(api-authority 的 originTurnOf),
213
255
  * 从而让 authority 守卫按 actor 的 (platform, userId) 查权限等级。
214
256
  *
215
257
  * 触发器(如 scheduler)应在创建任务时 snapshot 调用者身份,触发时回填此字段;
216
258
  * 不能由 LLM/AI 在工具入参中自由指定,避免提权。
217
259
  *
218
- * AI 自发回合(无主发言者,如群聊 'interval' 触发)没有可代之人:触发器应回填
219
- * {@link selfInitiatedActor}(userId 为空串 = 无主体),authority 按默认等级裁决、
220
- * 永不视为 owner。'idle' 合成消息本就不带 userId,天然无主体,无需回填。
260
+ * 没有人的注入(不延续调用的宿主通知等)没有可代之人:注入方回填 {@link selfInitiatedActor}(userId 为空串 = 无主体),
261
+ * authority 按默认等级裁决、永不视为 owner。'idle' 合成消息本就不带 userId,天然无主体,无需回填。
262
+ * 带 {@link IncomingMessage.fromTurn} 的消息不设此字段,授权身份取它的参与者。
221
263
  */
222
264
  actor?: {
223
265
  platform: string;
224
266
  userId: string;
225
267
  };
268
+ /**
269
+ * 起它的那一轮:续做(如后台任务的结束通知)与子任务(任务消息与追问)的消息带着起它的那次调用所在那一轮的事实,权限服务
270
+ * 按那一轮判续做与子任务这一轮的类别与主体,这一轮的参与者取它的参与者(agent 经 api-authority 的 originTurnOf
271
+ * 拼工具调用上下文)。只由登记的注入方填(`test/architecture/host-notice-identity.test.ts`),只在那次调用在入站回合里时填,
272
+ * 不由模型给;不进归档与提示词钩子
273
+ */
274
+ fromTurn?: FromTurn;
226
275
  /**
227
276
  * 宿主撰写的事件通知(不是任何人的发言)。带这个字段的消息:
228
277
  * - 注入方必须同时设 `source`;不设 userId、nickname、sessionType、triggerType;
229
- * - actor:不延续某次调用的通知用 {@link selfInitiatedActor}、不设 `callerUserId`;延续某次工具调用的(如后台任务
230
- * 结束通知),platform 同那次调用,actor 取那次调用的有效授权身份 `actor ?? { platform, userId }`(都没有时仍为
231
- * selfInitiatedActor),并设 `callerUserId`。延续身份的注入方要在 `test/architecture/host-notice-identity.test.ts` 登记;
278
+ * - 身份:不延续某次调用的通知的 actor 用 {@link selfInitiatedActor};延续某次工具调用的(如后台任务结束通知)不设
279
+ * actor,改带 {@link IncomingMessage.fromTurn}(那次调用所在那一轮),platform 同那一轮;
232
280
  * - agent 渲染为 system 通知,归档为 role 'notice'、kind {@link WellKnownKinds}.HostNotice;
233
281
  * - 不进向量记忆、抽取与记忆扩窗。
234
282
  *
@@ -250,12 +298,6 @@ export interface IncomingMessage {
250
298
  * 需要 Agent 后续行动的通知不设置此项。
251
299
  */
252
300
  reportOnly?: boolean;
253
- /**
254
- * 通知延续某次工具调用时,那次调用的 ToolCallContext.userId。plugin-agent 只用它填本轮工具调用上下文的 userId
255
- * (工具眼里是谁在调)与 inbound.callerUserId(执行守卫据此判这一轮是不是 owner 链的延续),并让这位发言者在同一会话的
256
- * 消息打断这一轮;不当作发言者:归档、用户档案、关系与提示词钩子都不看它。须与 actor 取自同一次调用;不延续某次调用的通知不设。
257
- */
258
- callerUserId?: string;
259
301
  /**
260
302
  * 回复这条通知时引用哪条消息:平台消息 id,取自起那次调用的入站消息(ToolCallContext.inbound.messageId)。
261
303
  * plugin-agent 回复时把它带进出站消息的 {@link OutgoingMessage.replyTo};入站消息没有平台消息 id 的不设
@@ -266,15 +308,16 @@ export interface IncomingMessage {
266
308
  * 写给模型的 content 不给人看;不进模型的上下文,存档按 {@link WellKnownMetadataKeys}.HostNoticeFacts 记下
267
309
  */
268
310
  facts?: Record<string, string | number>;
311
+ /**
312
+ * 给人看的那句话(文字对象):content 是写给模型的,界面显示这一句,按读者的语言渲染。不进模型的上下文,
313
+ * 存档按 {@link WellKnownMetadataKeys}.Text 记下
314
+ */
315
+ text?: TextRef;
269
316
  };
270
317
  }
271
318
  /**
272
- * AI 自发回合的授权身份:无主体。
273
- *
274
- * 'interval' 触发复用的是恰好撞上频率阈值的那条真人消息,若不回填 actor,授权轴会经
275
- * `actor ?? {platform, userId}` 回退到「最后发言者」——绝大多数回合按陌生人 0 级判权
276
- * (自发回合工具全挂),而 owner 恰好最后发言时整轮(含群内任何提示注入)以 owner 等级
277
- * 执行。契约(triggerType 注释)与 prompt 侧特判都把 interval 当无主发言者,授权轴应一致。
319
+ * 没有人的注入的授权身份:无主体。只给没有人的注入(不延续调用的宿主通知等)用;人发来的话(含群里没点名、被频率触发挑中的)
320
+ * 按说话的人算,不用它。
278
321
  *
279
322
  * userId 取空串而非缺省:`actor?.userId ?? userId` 回退链遇空串不回退(?? 只认 null/undefined),
280
323
  * 由此派生的定时任务/子任务保持匿名,不会漂回物理发言者;authority 的等级查表以空
@@ -284,26 +327,59 @@ export declare function selfInitiatedActor(platform: string): {
284
327
  platform: string;
285
328
  userId: string;
286
329
  };
330
+ /**
331
+ * 一轮的各条输入是不是同一位物理发言者说的(平台与账号都相同):会话语义的发言者(工具调用上下文的 userId、人设的说话人
332
+ * 事实)只在这时有
333
+ */
334
+ export declare function oneSpeaker(inputs: readonly Pick<IncomingMessage, 'platform' | 'userId'>[]): boolean;
335
+ /**
336
+ * 这条输入点名了她:真人输入(不带 source)的触发类型为 direct 或 immediate,没有触发类型的(没经触发判定)按 direct 算。带来源的
337
+ * 注入(定时任务、编排、各种通知)不是谁在跟她说话,不算点名。焦点指引、排着开的一轮的说明、档案与关系子图都按它判
338
+ */
339
+ export declare function wasAddressed({ source, triggerType, }: Pick<IncomingMessage, 'source' | 'triggerType'>): boolean;
340
+ /**
341
+ * 对她的 @:适配器按机器人账号写下的 `<at self …>…</at>` 标记,读的一方只认这个结构化标记,不按文字猜。文法与读它的几处见
342
+ * docs/concepts/message-llm-pipeline.md
343
+ */
344
+ export declare const AT_SELF_PATTERN: RegExp;
345
+ /**
346
+ * 一段文字 @ 了哪些账号:适配器写下的 `<at id="…">` 与 `<at self id="…">` 标记里的账号,按出现先后去重;@全体不是账号,
347
+ * 不算:入站写作 `<at>all</at>`(不带 id),她的回复里写作 `<at id="all">`(出站按这个发成 @全体)。文法见
348
+ * {@link AT_SELF_PATTERN}。存档按它从发言人自己写的话里抽,记成元数据的 {@link WellKnownMetadataKeys}.Mentions
349
+ */
350
+ export declare function extractMentions(text: string): string[];
287
351
  /**
288
352
  * 传输端确认已接受消息,不代表收件人已阅读;失败也 resolve,避免无人等待时产生拒绝。
289
- * 失败分支的 unconfirmed 表示请求已经发出、只是没等到平台确认(如 OneBot 文件上传超时),消息可能已经送达:
290
- * 发起方不得自动重发,也不得劝模型重发。没有这个标记的失败才是确定没送达。
353
+ * 成功分支的 messageIds 是正文送达时平台给出的消息 id(分条发出的各一个,按发送顺序;与入站 replyTo.messageId 同一写法,
354
+ * 引用回复据此认出被引用的是哪一条),平台不给时没有。
355
+ * 失败分支的 error 是给人看的原因,可以是文字对象(@aalis/schema-i18n 的 TextRef,按读者语言显示);交给模型与写日志的
356
+ * 一方取 toSource。unconfirmed 表示有请求已经发出、只是没等到平台确认(如 OneBot 发消息或上传文件超时、等回执时断线),那部分
357
+ * 可能已经送达:发起方不得自动重发,也不得劝模型重发。没有这个标记的失败才是确定没送达。
358
+ * sentPieces 是逐条发出(分条的正文与各自成一条的附件)停在中途时已经发出的条数:前 sentPieces 条平台已经收下,之后的没收下
359
+ * 或结果未知,补发只补后面的;一条都没发出时没有。
291
360
  */
292
361
  export type OutboundDeliveryResult = {
293
362
  ok: true;
363
+ messageIds?: string[];
294
364
  } | {
295
365
  ok: false;
296
- error: string;
366
+ error: string | TextRef;
297
367
  unconfirmed?: true;
368
+ sentPieces?: number;
298
369
  };
299
370
  /**
300
- * 发起方等待传输确认的上限。适配器自身的重试窗口可能更长(如 OneBot 单个附件最坏约 150 秒),
371
+ * 发起方等待传输确认的上限。适配器自身的发送可能更久(如 OneBot 先下载附件落盘、再逐条发出,下载与每条的回执各等 30 秒),
301
372
  * 超过上限时发起方应报「未确认、请勿重发」而不是失败;上限只为不带回合中止信号的调用方
302
373
  * (mcp-server、workflow)不至于一等两三分钟。
303
374
  */
304
375
  export declare const DELIVERY_WAIT_MS = 90000;
305
376
  /**
306
- * 等 {@link OutgoingMessage.delivery} 结算;signal 中止(回合 latest-wins、手动 abort、插件停机)或到 timeoutMs
377
+ * 日志行里一条输入的到达序号,接在动作之后:` #<序号>`(带前导空格),没经网关进来的为空串。日志行据此串起同一条输入,
378
+ * 不记正文与昵称
379
+ */
380
+ export declare function arrivalTag({ arrival }: Pick<IncomingMessage, 'arrival'>): string;
381
+ /**
382
+ * 等 {@link OutgoingMessage.delivery} 结算;signal 中止(回合被停下、插件停机)或到 timeoutMs
307
383
  * (缺省 {@link DELIVERY_WAIT_MS})时不再等,返回 undefined。适配器的发送不随之取消,所以 undefined 只能当
308
384
  * 「未确认」,不能当「未发送」。
309
385
  */
@@ -311,6 +387,12 @@ export declare function awaitDelivery<T>(delivery: Promise<T>, signal?: AbortSig
311
387
  /** 发往平台的回复:只带要发出去的正文与附件。思考与工具时间线在存档的 Message 上,客户端经会话协议拿 */
312
388
  export interface OutgoingMessage {
313
389
  content: string;
390
+ /**
391
+ * 正文是要翻译的文字时,它的文字对象:发起方同时写 content(`toSource(text)`,按原文渲染的整句)。经网关派发时,网关按
392
+ * 这条消息所在会话的语言把它渲染进 content(i18n 缺席或渲染抛错时按原文);按连接显示的出口(会话协议的时间线、WebUI
393
+ * 会话的历史)另按各自的读者渲染它,其余照旧读 content
394
+ */
395
+ text?: TextRef;
314
396
  sessionId: string;
315
397
  platform?: string;
316
398
  /**
@@ -332,14 +414,24 @@ export interface OutgoingMessage {
332
414
  /**
333
415
  * 助手要附带发送的多模态附件(图片/音频/视频/文件)。
334
416
  * 适配器(OneBot / WebUI 等)应优先发结构化 attachments,把远程 URL 主动下载为本地文件后用 file:// 形式发送。
335
- * 若 attachments 为空但 content 内含 `<image url="...">` 标记,则由适配器解析嵌入式发图(旧路径,仍兼容)。
336
417
  */
337
418
  attachments?: MessageAttachment[];
338
- /** 消息来源:agent = AI 回复(可分条延迟发送),其他来源默认立即整条发送 */
419
+ /**
420
+ * 正文含平台标记、要解析:有标记语法的适配器(如 OneBot 的 `<at>`、`<image|record|video url>`、`<reply>`)把它们解析成
421
+ * @、媒体与引用,并可分条延迟发送;不设的正文按纯文字原样整条发出,不解析、不分条。要发平台标记的出站自己设它;
422
+ * attachments 不受它影响。媒体标记的地址不是网址的(本机路径、存储地址、data URI 等),适配器不得自己读取,也不交给实现端,
423
+ * 一律去掉并报投递失败:存储里的媒体由 plugin-image-sender 在派发前过媒体判据转成附件,留在正文里的存储地址是没转成的(过
424
+ * 不了判据、读不出、不是对应媒体,或没装它)。正文里的媒体标记怎么发,见 docs/services/media.md
425
+ */
426
+ markup?: boolean;
427
+ /** 消息来源:agent = AI 发出的(回复与经工具发的附件),system = 宿主提示,command = 指令回复 */
339
428
  source?: 'agent' | 'system' | 'command';
340
429
  /** 由工具调用发出的消息:那次调用的 id(ToolCallContext.callId),会话的客户端据此把消息挂到对应的工具卡上 */
341
430
  callId?: string;
342
- /** agent 一轮的回复:这一轮的 id。适配器记投递失败时带上它,回看历史时据此标出这一轮的回复没发出 */
431
+ /**
432
+ * 这一轮发出的消息(她的回复、[错误] 等提示与经工具发出的):这一轮的 id。适配器记回复的投递失败时带上它,回看历史时据此标出
433
+ * 这一轮的回复没发出;出站记进会话历史的各条同样记下(api-message-archive 的 recordOutbound)
434
+ */
343
435
  turnId?: string;
344
436
  /**
345
437
  * 本条回复的 LLM 元数据(agent 存档时同一份写进这条 assistant 消息元数据的 {@link WellKnownMetadataKeys}.ModelInfo),
@@ -401,7 +493,11 @@ declare module '@aalis/core' {
401
493
  archivedMessage: Message;
402
494
  }];
403
495
  'outbound:message': [message: OutgoingMessage];
404
- /** 传输端确认后的消息快照;attachments 只包含成功的附件,供归档等旁观者使用。 */
496
+ /**
497
+ * 送达之后的消息快照,给存档与旁观者用:content 只在文字送达时有,attachments 只包含成功的附件。认领回执的适配器在送达后对
498
+ * 每条消息都发,只有文字的也发,存档据此记进会话历史;送达本身就是写进会话历史的适配器(如 WebUI)不发,改为调 api-message-archive
499
+ * 的 recordOutbound 并等它兑现。
500
+ */
405
501
  'outbound:delivered': [message: OutgoingMessage];
406
502
  'outbound:stream': [chunk: StreamChunkMessage];
407
503
  }
@@ -409,16 +505,21 @@ declare module '@aalis/core' {
409
505
  /**
410
506
  * 已知的 Message.kind 语义常量。第三方插件可使用新值;本表仅作为框架内的契约。
411
507
  *
412
- * - `EventMarker`:纯 UI/控制标记(如对话压缩分隔条)。LLM 出口与抽取均应排除。
508
+ * - `EventMarker`:纯 UI/控制标记(如对话压缩分隔条、不是她回复的出站文字)。LLM 出口与抽取均应排除。
413
509
  * - `CrossSessionDelegation`:代发任务——triggerType 为 proactive 的入站消息(如 workflow 的 agent 节点)归档时标的 kind。
414
- * - `OutboundImage`:assistant 已发出的图片占位(content 为 attachment ref 标签)。
415
- * - `OutboundAudio`:assistant 已发出的音频占位。
416
- * - `OutboundVideo`:assistant 已发出的视频占位。
417
- * - `OutboundFile`:assistant 已发出的文件占位(描述位是文件名)。
510
+ * - `OutboundImage`:发出的图片占位(content 为 attachment ref 标签,记法见 {@link outboundMediaMessage})。
511
+ * - `OutboundAudio`:发出的音频占位。
512
+ * - `OutboundVideo`:发出的视频占位。
513
+ * - `OutboundFile`:发出的文件占位(描述位是文件名)。
418
514
  * - `HostNotice`:宿主撰写的事件通知——带 `hostNotice` 的入站消息归档时标的 kind(role 为 notice)。
515
+ * - `IdlePrompt`:空闲开话题的提示——triggerType 为 idle 的入站交给模型时那条指令块的 injector。它不落档,没有这个 kind 的
516
+ * 归档消息。
419
517
  * - `OutboundDeliveryFailed`:平台适配器记下的投递失败(role 为 system):她发出的消息平台没收下或结果未知,进下一轮的上下文,
420
518
  * 让她知道刚才那条没送达。metadata 带 {@link WellKnownMetadataKeys} 的 `DeliveryError`(与投递结果同一句原因),以及那条
421
- * 消息的 `TurnId`(一轮的回复)或 `CallId`(经工具发出的)。
519
+ * 消息的 `TurnId`(一轮的回复)或 `CallId`(经工具发出的);逐条发出停在中途时另带 `SentPieces`。
520
+ * - `TurnStopped`:agent 记下的停下标记(role 为 system):一轮在回复之前被停下、会话历史里已有这一轮的输入或工具调用时写,
521
+ * 进下一轮的上下文,让她知道那一轮停下了、没说完的话没有留下;有停下的人时写是谁。metadata 带这一轮的 `TurnId`;回合记录
522
+ * 照旧另落事件标记,这一条不带 `TurnRecord`。
422
523
  */
423
524
  export declare const WellKnownKinds: {
424
525
  readonly EventMarker: "event-marker";
@@ -428,63 +529,128 @@ export declare const WellKnownKinds: {
428
529
  readonly OutboundVideo: "outbound-video";
429
530
  readonly OutboundFile: "outbound-file";
430
531
  readonly HostNotice: "host-notice";
532
+ readonly IdlePrompt: "idle-prompt";
431
533
  readonly OutboundDeliveryFailed: "outbound-delivery-failed";
534
+ readonly TurnStopped: "turn-stopped";
432
535
  };
433
536
  export type WellKnownKind = (typeof WellKnownKinds)[keyof typeof WellKnownKinds];
434
537
  /**
435
- * 发出的图片、音频、视频与文件在会话历史里的记法:一条 assistant 消息,kind 为 OutboundImage / OutboundAudio /
436
- * OutboundVideo / OutboundFile,正文是附件引用占位符({@link formatAttachmentRef})。归档方一律用它,memory_recall 与
437
- * 会话服务回看历史才能按同一格式命中、还原。文件的 desc 记文件名。时间戳与 metadata 由调用方补上。
538
+ * 发出的图片、音频、视频与文件在会话历史里的记法:kind 为 OutboundImage / OutboundAudio / OutboundVideo / OutboundFile,
539
+ * 正文是附件引用占位符({@link formatAttachmentRef})。出站的 source 是 agent 的是她发的,role 为 assistant;其余是插件发的,
540
+ * role 为 notice(进模型时是一条系统通知,不算她的发言)。归档方一律用它,memory_recall 与会话服务回看历史才能按同一格式命中、
541
+ * 还原。文件的 desc 记文件名。时间戳与 metadata 由调用方补上。
542
+ */
543
+ export declare function outboundMediaMessage(kind: MessageAttachment['kind'], ref: string, { desc, source }?: {
544
+ desc?: string;
545
+ source?: OutgoingMessage['source'];
546
+ }): Message & {
547
+ content: string;
548
+ };
549
+ /**
550
+ * 不是她回复的出站文字(`source` 不是 agent,如指令的回复、宿主提示)在会话历史里的记法:一条事件标记,不进模型的上下文,
551
+ * 正文是 `content`,元数据记文字对象({@link WellKnownMetadataKeys} 的 `Text`,有才记),会话服务据此还原成通知。她的回复
552
+ * (agent 存档)与空文字不记,回 undefined。归档方一律用它;时间戳与出站的 `Source`、`TurnId`、`CallId` 由调用方补上(与
553
+ * {@link outboundMediaMessage} 记的附件同一条规则,见 api-message-archive 的 recordOutbound)
438
554
  */
439
- export declare function outboundMediaMessage(kind: MessageAttachment['kind'], ref: string, desc?: string): Message;
555
+ export declare function outboundMarkerMessage(msg: OutgoingMessage): Message | undefined;
440
556
  /** 存档里提问带的一个附件({@link WellKnownMetadataKeys}.Attachments 的一项) */
441
557
  export interface ArchivedAttachment {
442
558
  kind: MessageAttachment['kind'];
443
559
  /** 入站附件带的文件名 */
444
560
  name?: string;
445
- /** 地址:存储地址(`<根>:/路径`)或网址;入站附件的 data 不是地址(内联数据、本机路径、预处理器的私有引用)、预处理器也没给出引用的没有 */
561
+ /** 地址:存储地址(`<根>:/路径`)或网址;入站附件的 data 不是地址(内联数据、本机路径、预处理器的私有引用)、预处理器也没在它的 ref 上写地址的没有 */
446
562
  ref?: string;
447
563
  }
564
+ /** 一段转发给界面的事实({@link ForwardedChat.facts}):适配器展开成功时有 */
565
+ export interface ForwardFacts {
566
+ /** 顶层的条数 */
567
+ count: number;
568
+ /** 参与的人,最多前 8 个(写法由适配器定,如 OneBot 的「昵称(账号)」) */
569
+ participants: string[];
570
+ /** 没列出的人数;都列出了时没有 */
571
+ unlisted?: number;
572
+ /** 转发的文字:有摘要时是摘要,没有时是原文(可能截断) */
573
+ text: string;
574
+ /** 原文被截断时为 true */
575
+ cutOff?: true;
576
+ }
577
+ /** 随入站消息转发来的一段聊天记录({@link IncomingMessage.forwards} 的一项) */
578
+ export interface ForwardedChat {
579
+ /** 平台给的转发 id:正文里它的占位({@link forwardPlaceholder})按它对位 */
580
+ id: string;
581
+ /** 给模型看的展开,归档文本把它换进占位的位置(OneBot 的信封;拉不到时写原因;适配器关掉展开时就是占位本身) */
582
+ content: string;
583
+ /** 给界面的事实;拉不到内容、展开出错与关掉展开时没有 */
584
+ facts?: ForwardFacts;
585
+ }
586
+ /** 存档记下的一段转发({@link WellKnownMetadataKeys}.Forwards 的一项):展开已按原位置拼进归档正文,不另存 */
587
+ export type ArchivedForward = Omit<ForwardedChat, 'content'>;
448
588
  /**
449
589
  * 跨插件约定的 `Message.metadata` 键。metadata 是开放字典,本表登记由一方写入、另一方读取的键:写方与读方都引用这里的
450
590
  * 常量,第三方的 agent、存档与适配器照着写,读历史与记忆的一方(会话服务回看历史、向量记忆、用户档案与关系等)才还原得出
451
591
  * 说话人、群、文件、回复的模型与 token、工具卡的归组。
452
592
  *
453
593
  * - `VisibleContent`:assistant 消息的可见正文(字符串)。回复经结构化输出(persona 的 outputFormat)
454
- * 时,`content` 存整串 JSON 信封(保持历史 few-shot 的格式),用户实际看到的是其中的回复字段。
594
+ * 时,`content` 存整串 JSON 信封(存档原文),用户实际看到的是其中的回复字段;agent 交给模型的历史取这个键。
455
595
  * agent 落库时把解码后的正文写进这个键,只在它与 `content` 不同时写入;缺省即 `content` 本身就是
456
596
  * 可见正文。检索、摘要等按语义消费历史的一方应优先读它,读不到再退回 `content`。
457
597
  * - `SpokenContent`:提问里发言人自己写的话(字符串,可以是空串),即入站消息的 `content`。存档的 `content` 是给模型看的
458
- * 归档文本({@link buildIncomingContent}:发送者前缀、引用与附件描述),存档只在两者不同时写这个键;缺省即 `content`。
459
- * 会话服务据此给出提问条目的正文。
598
+ * 归档文本({@link buildIncomingContent}:发送者前缀、转发的展开、引用与附件描述),存档只在两者不同时写这个键;缺省即
599
+ * `content`。合并转发的展开不在里面,只有它的占位。会话服务据此给出提问条目的正文,用户档案据此核对原话。
460
600
  * - `Attachments`:提问带的附件清单({@link ArchivedAttachment} 的数组,按入站顺序),存档写;会话服务据此把文件还原成卡片、
461
601
  * 图片等按地址显示。没有附件时不写。
602
+ * - `Forwards`:提问随附的转发({@link ArchivedForward} 的数组:入站消息 forwards 的 id 与事实,不存展开),存档在有时写;
603
+ * 会话服务据此把转发画成单独的块。
604
+ * - `SenderLabel`:归档文本发送者前缀里的标签(字符串,{@link getSenderLabel} 的写法),存档只在加了前缀时写。把归档文本重排给
605
+ * 模型或界面看的一方(向量记忆的召回片段、撤回通知的摘录、引用反查)按它用 {@link stripSenderPrefix} 去掉这一层,没有这个键
606
+ * 的不去。
607
+ * - `Mentions`:提问里发言人自己写的话 @ 了哪些账号(字符串数组,{@link extractMentions} 从入站消息的 `content` 抽,引用、
608
+ * 附件描述与转发里的不算),存档在有时写;向量记忆据此给被 @ 的人加权,关系图的提取据此认被 @ 的人。
462
609
  * - `Platform`、`UserId`、`Nickname`:说话人的平台、用户 id 与昵称(字符串)。存档写入站消息的;agent 给她自己的回复写
463
610
  * 这一轮的平台与她在那里的账号、昵称。会话服务据此标出说话人与是不是 owner,向量记忆、用户档案与关系等也读。
464
611
  * - `GroupId`、`GroupName`、`SessionType`:说话所在的群号、群名与会话类型(字符串,即入站消息的 `groupId`、`groupName`、
465
- * `sessionType`)。存档写入站消息的,agent 给她自己的回复写这一轮的;向量记忆与最近消息据此写出说话的位置,关系插件据此
466
- * 判断是不是群聊。
612
+ * `sessionType`)。存档写入站消息的,agent 给她自己的回复写这一轮的;向量记忆与最近消息据此写出说话的位置,只用于显示:
613
+ * 判是不是多方读会话记录的 originChat.multiParty(子会话取根会话的)。
467
614
  * - `MessageId`:平台侧的消息 id(字符串,即入站消息的 `messageId`),存档写;存档按它反查被引用的原文,关系插件据此把
468
615
  * 引用与回复对回消息。
469
- * - `Source`:这条记录的来源(字符串):入站消息是它的 `source`(内部注入的来源,真人发言没有);插件自己写的记录(发出的
470
- * 附件、投递失败)写插件的名字。会话服务据此标出提问是不是内部注入的。
616
+ * - `Source`:这条记录的来源(字符串):入站消息是它的 `source`(内部注入的来源,真人发言没有);出站消息记进历史的各条
617
+ * (文字的事件标记与发出的附件)是出站的 `source`(如指令回复的 command);插件自己写的其余记录(投递失败)写插件的名字。
618
+ * 会话服务据此标出提问是不是内部注入的、认出指令的回复。
471
619
  * - `HostNoticeKind`、`HostNoticeId`、`HostNoticeFacts`:宿主通知的子类(`hostNotice.kind`)、id(`hostNotice.id`)与给界面的
472
620
  * 事实(`hostNotice.facts`),存档写;会话服务据此给出通知条目的种类、id 与事实。
473
- * - `TurnId`:所在回合的 id(字符串)。agent 写在这一轮落库的回复与工具结果上,平台适配器写在一轮回复的投递失败记录上;
474
- * 会话服务据此把存档归回回合、标出哪一轮的回复没发出。
621
+ * - `TurnId`:所在回合的 id(字符串)。进了一轮的输入由存档按 agent 归档时交来的回合记下,agent 写在这一轮落库的回复、工具
622
+ * 结果与停下标记上,平台适配器写在一轮回复的投递失败记录上,出站记进历史的各条由写方按出站消息的 turnId 记下(有才记);
623
+ * 会话服务据此把存档归回回合、标出哪一轮的回复没发出,连对话回滚据此只删这一轮的消息。
624
+ * - `TurnEntry`:输入怎么进的这一轮(字符串):`opened` 是开轮的,`joined` 是插进在跑的一轮的。与 `TurnId` 一起由存档记下。
625
+ * - `TriggerType`:入站消息的触发类型(字符串,即 {@link IncomingMessage}.triggerType),存档写;会话服务据此标出被点名与插话。
626
+ * - `TurnRecord`:一轮的结局与来源({@link TurnRecord})。agent 记在这一轮最后落库的那条回复上,没有落库回复的一轮另落一条只带
627
+ * `TurnId` 与它的事件标记(role system、kind EventMarker、正文为空,属于 {@link CONTROL_KINDS});会话服务据此在历史里还原
628
+ * 这一轮的结局。
475
629
  * - `CallId`:工具调用的 id(字符串,即 `ToolCallContext.callId`)。agent 写在工具结果上,平台适配器写在经工具发出的
476
- * 消息的投递失败记录上;会话服务据此把历史里的工具卡对回实时推送。
630
+ * 消息的投递失败记录上,出站记进历史的各条由写方按出站消息的 callId 记下(有才记);会话服务据此把历史里的工具卡对回实时推送。
477
631
  * - `ModelInfo`:一轮回复的模型与这一轮的 token,与 {@link OutgoingMessage}.modelInfo 同形;agent 写在这一轮最后的回复上,
478
632
  * 会话服务标在回复条目上。
479
633
  * - `SentRef`、`SentName`:发出的附件(`outboundMediaMessage` 记的那条)原样的地址与文件名(字符串):占位符里的地址遇到
480
- * 「]」会截断、描述位的「]」「|」换成了全角。归档发出附件的一方写,会话服务优先取它们还原附件。
481
- * - `DeliveryError`:投递失败记录({@link WellKnownKinds}.OutboundDeliveryFailed)里与投递结果同一句的原因(字符串),平台
482
- * 适配器写;会话服务据此写出回复为什么没发出。
634
+ * 「]」会截断、描述位的「]」「|」换成了全角。记出站的一方写(api-message-archive 的 recordOutbound),会话服务优先取它们
635
+ * 还原附件。
636
+ * - `DeliveryError`:投递失败记录({@link WellKnownKinds}.OutboundDeliveryFailed)里与投递结果同一句的原因(字符串或文字对象),
637
+ * 平台适配器写;会话服务据此按读者语言写出回复为什么没发出。
638
+ * - `SentPieces`:投递失败记录里与投递结果同一个已发出条数(数字,{@link OutboundDeliveryResult} 的 sentPieces),平台适配器在
639
+ * 逐条发出停在中途时写;会话服务据此写出回复只发出了前几条。
640
+ * - `Unconfirmed`:投递失败记录里已经发出、没等到平台确认的各项(字符串数组,如「消息(第 2 条)」「文件 a.html」),平台适配器写;
641
+ * 会话服务据此写出回复可能已经发出。
642
+ * - `Text`:通知与事件标记给人看的文字(@aalis/schema-i18n 的文字对象),`content` 是写给模型的话或它按原文渲染的整句。
643
+ * 宿主通知的 `hostNotice.text`、平台通知的文字、平台事件合成的入站的 {@link IncomingMessage}.text、不是她回复的出站按
644
+ * {@link outboundMarkerMessage} 记成事件标记时的 {@link OutgoingMessage}.text 由写方记下,没有地址的出站附件记成的事件标记、
645
+ * 压缩分隔线同样;会话服务据此按读者语言显示(合成的入站画成通知),没有时显示 `content`。
483
646
  */
484
647
  export declare const WellKnownMetadataKeys: {
485
648
  readonly VisibleContent: "visibleContent";
486
649
  readonly SpokenContent: "spokenContent";
487
650
  readonly Attachments: "attachments";
651
+ readonly Forwards: "forwards";
652
+ readonly SenderLabel: "senderLabel";
653
+ readonly Mentions: "mentions";
488
654
  readonly Platform: "platform";
489
655
  readonly UserId: "userId";
490
656
  readonly Nickname: "nickname";
@@ -497,12 +663,23 @@ export declare const WellKnownMetadataKeys: {
497
663
  readonly HostNoticeId: "hostNoticeId";
498
664
  readonly HostNoticeFacts: "hostNoticeFacts";
499
665
  readonly TurnId: "turnId";
666
+ readonly TurnEntry: "turnEntry";
667
+ readonly TriggerType: "triggerType";
668
+ readonly TurnRecord: "turnRecord";
500
669
  readonly CallId: "callId";
501
670
  readonly ModelInfo: "modelInfo";
502
671
  readonly SentRef: "ref";
503
672
  readonly SentName: "name";
504
673
  readonly DeliveryError: "error";
674
+ readonly SentPieces: "sentPieces";
675
+ readonly Unconfirmed: "unconfirmed";
676
+ readonly Text: "text";
505
677
  };
678
+ /** 一轮的回合记录({@link WellKnownMetadataKeys} 的 `TurnRecord`):结局,与这一轮的来源(输入的 source,真人消息开的没有) */
679
+ export interface TurnRecord {
680
+ outcome: 'replied' | 'silent' | 'aborted' | 'error';
681
+ source?: string;
682
+ }
506
683
  /**
507
684
  * 平台无关的 well-known `noticeType` 值。
508
685
  *
@@ -526,7 +703,8 @@ export declare const CONTROL_KINDS: ReadonlyArray<string>;
526
703
  /**
527
704
  * 宿主或系统撰写、不是任何人发言的指令类 kind。
528
705
  * - 归档消息的 kind 属于它:抽取(用户事实、指令、关系)与记忆扩窗一律跳过;
529
- * - 请求期消息的 metadata.injector 属于它:是本轮的指令块(turn-context、turn-hint 落在它之前;DeepSeek 不把它改成 user)。
706
+ * - 请求期消息的 metadata.injector 属于它:是本轮的指令块(turn-context、turn-hint 落在它之前;agent 裁剪时不缩不删;DeepSeek
707
+ * 不把它改成 user)。
530
708
  */
531
709
  export declare const DIRECTIVE_KINDS: ReadonlyArray<string>;
532
710
  /**
@@ -548,7 +726,8 @@ export declare function toLLMRole(role: MessageRole): WellKnownRole;
548
726
  * 不修改原对象;返回新数组与必要时的消息浅拷贝。
549
727
  */
550
728
  export declare function prepareLLMMessages<T extends Pick<Message, 'role' | 'content' | 'kind'> & Pick<Message, 'images' | 'toolCallId'>>(messages: T[]): T[];
551
- export { type AttachmentRef, AttachmentRefKind, buildAttachmentRefMatcher, formatAttachmentRef, parseAttachmentRefs, } from './attachment-ref.js';
552
- export { getMessageName, getSenderLabel, prefixSender } from './identity.js';
553
- export { buildIncomingContent } from './incoming-content.js';
729
+ export { ATTACHMENT_REF_KINDS, type AttachmentRef, AttachmentRefKind, buildAttachmentRefMatcher, formatAttachmentRef, parseAttachmentRefs, } from './attachment-ref.js';
730
+ export { getMessageName, getSenderLabel, prefixSender, stripSenderPrefix } from './identity.js';
731
+ export { buildIncomingContent, forwardPlaceholder, withForwards } from './incoming-content.js';
732
+ export { groupToolCalls, type MessageUnit } from './tool-call-groups.js';
554
733
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,17 +20,14 @@
20
20
  // - 'outbound:message'
21
21
  // - 'outbound:stream'
22
22
  //
23
- // 依赖:@aalis/core(类型锚点)+ @aalis/util-text-normalize(prepareLLMMessages 的 UTF-16 规整)。
23
+ // 依赖:@aalis/core(类型锚点)+ @aalis/util-text-normalize(prepareLLMMessages 的 UTF-16 规整)+ @aalis/schema-i18n
24
+ // (给人看的文字对象,只用类型)。
24
25
  // ============================================================
25
26
  import { toWellFormedText } from '@aalis/util-text-normalize';
26
- import { AttachmentRefKind, formatAttachmentRef } from './attachment-ref.js';
27
+ import { ATTACHMENT_REF_KINDS, formatAttachmentRef } from './attachment-ref.js';
27
28
  /**
28
- * AI 自发回合的授权身份:无主体。
29
- *
30
- * 'interval' 触发复用的是恰好撞上频率阈值的那条真人消息,若不回填 actor,授权轴会经
31
- * `actor ?? {platform, userId}` 回退到「最后发言者」——绝大多数回合按陌生人 0 级判权
32
- * (自发回合工具全挂),而 owner 恰好最后发言时整轮(含群内任何提示注入)以 owner 等级
33
- * 执行。契约(triggerType 注释)与 prompt 侧特判都把 interval 当无主发言者,授权轴应一致。
29
+ * 没有人的注入的授权身份:无主体。只给没有人的注入(不延续调用的宿主通知等)用;人发来的话(含群里没点名、被频率触发挑中的)
30
+ * 按说话的人算,不用它。
34
31
  *
35
32
  * userId 取空串而非缺省:`actor?.userId ?? userId` 回退链遇空串不回退(?? 只认 null/undefined),
36
33
  * 由此派生的定时任务/子任务保持匿名,不会漂回物理发言者;authority 的等级查表以空
@@ -40,13 +37,48 @@ export function selfInitiatedActor(platform) {
40
37
  return { platform, userId: '' };
41
38
  }
42
39
  /**
43
- * 发起方等待传输确认的上限。适配器自身的重试窗口可能更长(如 OneBot 单个附件最坏约 150 秒),
40
+ * 一轮的各条输入是不是同一位物理发言者说的(平台与账号都相同):会话语义的发言者(工具调用上下文的 userId、人设的说话人
41
+ * 事实)只在这时有
42
+ */
43
+ export function oneSpeaker(inputs) {
44
+ return inputs.every(m => m.platform === inputs[0].platform && m.userId === inputs[0].userId);
45
+ }
46
+ /**
47
+ * 这条输入点名了她:真人输入(不带 source)的触发类型为 direct 或 immediate,没有触发类型的(没经触发判定)按 direct 算。带来源的
48
+ * 注入(定时任务、编排、各种通知)不是谁在跟她说话,不算点名。焦点指引、排着开的一轮的说明、档案与关系子图都按它判
49
+ */
50
+ export function wasAddressed({ source, triggerType = 'direct', }) {
51
+ return !source && (triggerType === 'direct' || triggerType === 'immediate');
52
+ }
53
+ /**
54
+ * 对她的 @:适配器按机器人账号写下的 `<at self …>…</at>` 标记,读的一方只认这个结构化标记,不按文字猜。文法与读它的几处见
55
+ * docs/concepts/message-llm-pipeline.md
56
+ */
57
+ export const AT_SELF_PATTERN = /<at self[\s>][\s\S]*?<\/at>/;
58
+ /**
59
+ * 一段文字 @ 了哪些账号:适配器写下的 `<at id="…">` 与 `<at self id="…">` 标记里的账号,按出现先后去重;@全体不是账号,
60
+ * 不算:入站写作 `<at>all</at>`(不带 id),她的回复里写作 `<at id="all">`(出站按这个发成 @全体)。文法见
61
+ * {@link AT_SELF_PATTERN}。存档按它从发言人自己写的话里抽,记成元数据的 {@link WellKnownMetadataKeys}.Mentions
62
+ */
63
+ export function extractMentions(text) {
64
+ const ids = Array.from(text.matchAll(/<at(?:\s+self)?\s+id="([^"]+)">/g), match => match[1]);
65
+ return [...new Set(ids.filter(id => id !== 'all'))];
66
+ }
67
+ /**
68
+ * 发起方等待传输确认的上限。适配器自身的发送可能更久(如 OneBot 先下载附件落盘、再逐条发出,下载与每条的回执各等 30 秒),
44
69
  * 超过上限时发起方应报「未确认、请勿重发」而不是失败;上限只为不带回合中止信号的调用方
45
70
  * (mcp-server、workflow)不至于一等两三分钟。
46
71
  */
47
72
  export const DELIVERY_WAIT_MS = 90_000;
48
73
  /**
49
- * 等 {@link OutgoingMessage.delivery} 结算;signal 中止(回合 latest-wins、手动 abort、插件停机)或到 timeoutMs
74
+ * 日志行里一条输入的到达序号,接在动作之后:` #<序号>`(带前导空格),没经网关进来的为空串。日志行据此串起同一条输入,
75
+ * 不记正文与昵称
76
+ */
77
+ export function arrivalTag({ arrival }) {
78
+ return arrival === undefined ? '' : ` #${arrival}`;
79
+ }
80
+ /**
81
+ * 等 {@link OutgoingMessage.delivery} 结算;signal 中止(回合被停下、插件停机)或到 timeoutMs
50
82
  * (缺省 {@link DELIVERY_WAIT_MS})时不再等,返回 undefined。适配器的发送不随之取消,所以 undefined 只能当
51
83
  * 「未确认」,不能当「未发送」。
52
84
  */
@@ -71,16 +103,21 @@ export function awaitDelivery(delivery, signal, timeoutMs = DELIVERY_WAIT_MS) {
71
103
  /**
72
104
  * 已知的 Message.kind 语义常量。第三方插件可使用新值;本表仅作为框架内的契约。
73
105
  *
74
- * - `EventMarker`:纯 UI/控制标记(如对话压缩分隔条)。LLM 出口与抽取均应排除。
106
+ * - `EventMarker`:纯 UI/控制标记(如对话压缩分隔条、不是她回复的出站文字)。LLM 出口与抽取均应排除。
75
107
  * - `CrossSessionDelegation`:代发任务——triggerType 为 proactive 的入站消息(如 workflow 的 agent 节点)归档时标的 kind。
76
- * - `OutboundImage`:assistant 已发出的图片占位(content 为 attachment ref 标签)。
77
- * - `OutboundAudio`:assistant 已发出的音频占位。
78
- * - `OutboundVideo`:assistant 已发出的视频占位。
79
- * - `OutboundFile`:assistant 已发出的文件占位(描述位是文件名)。
108
+ * - `OutboundImage`:发出的图片占位(content 为 attachment ref 标签,记法见 {@link outboundMediaMessage})。
109
+ * - `OutboundAudio`:发出的音频占位。
110
+ * - `OutboundVideo`:发出的视频占位。
111
+ * - `OutboundFile`:发出的文件占位(描述位是文件名)。
80
112
  * - `HostNotice`:宿主撰写的事件通知——带 `hostNotice` 的入站消息归档时标的 kind(role 为 notice)。
113
+ * - `IdlePrompt`:空闲开话题的提示——triggerType 为 idle 的入站交给模型时那条指令块的 injector。它不落档,没有这个 kind 的
114
+ * 归档消息。
81
115
  * - `OutboundDeliveryFailed`:平台适配器记下的投递失败(role 为 system):她发出的消息平台没收下或结果未知,进下一轮的上下文,
82
116
  * 让她知道刚才那条没送达。metadata 带 {@link WellKnownMetadataKeys} 的 `DeliveryError`(与投递结果同一句原因),以及那条
83
- * 消息的 `TurnId`(一轮的回复)或 `CallId`(经工具发出的)。
117
+ * 消息的 `TurnId`(一轮的回复)或 `CallId`(经工具发出的);逐条发出停在中途时另带 `SentPieces`。
118
+ * - `TurnStopped`:agent 记下的停下标记(role 为 system):一轮在回复之前被停下、会话历史里已有这一轮的输入或工具调用时写,
119
+ * 进下一轮的上下文,让她知道那一轮停下了、没说完的话没有留下;有停下的人时写是谁。metadata 带这一轮的 `TurnId`;回合记录
120
+ * 照旧另落事件标记,这一条不带 `TurnRecord`。
84
121
  */
85
122
  export const WellKnownKinds = {
86
123
  EventMarker: 'event-marker',
@@ -90,23 +127,45 @@ export const WellKnownKinds = {
90
127
  OutboundVideo: 'outbound-video',
91
128
  OutboundFile: 'outbound-file',
92
129
  HostNotice: 'host-notice',
130
+ IdlePrompt: 'idle-prompt',
93
131
  OutboundDeliveryFailed: 'outbound-delivery-failed',
132
+ TurnStopped: 'turn-stopped',
94
133
  };
95
- /** 出站附件归档时的消息 kind 与占位符 kind */
134
+ /** 出站附件归档时的消息 kind(占位符的 kind 取 {@link ATTACHMENT_REF_KINDS}) */
96
135
  const OUTBOUND_MEDIA = {
97
- image: { kind: WellKnownKinds.OutboundImage, ref: AttachmentRefKind.Image },
98
- audio: { kind: WellKnownKinds.OutboundAudio, ref: AttachmentRefKind.Audio },
99
- video: { kind: WellKnownKinds.OutboundVideo, ref: AttachmentRefKind.Video },
100
- file: { kind: WellKnownKinds.OutboundFile, ref: AttachmentRefKind.File },
136
+ image: WellKnownKinds.OutboundImage,
137
+ audio: WellKnownKinds.OutboundAudio,
138
+ video: WellKnownKinds.OutboundVideo,
139
+ file: WellKnownKinds.OutboundFile,
101
140
  };
102
141
  /**
103
- * 发出的图片、音频、视频与文件在会话历史里的记法:一条 assistant 消息,kind 为 OutboundImage / OutboundAudio /
104
- * OutboundVideo / OutboundFile,正文是附件引用占位符({@link formatAttachmentRef})。归档方一律用它,memory_recall 与
105
- * 会话服务回看历史才能按同一格式命中、还原。文件的 desc 记文件名。时间戳与 metadata 由调用方补上。
142
+ * 发出的图片、音频、视频与文件在会话历史里的记法:kind 为 OutboundImage / OutboundAudio / OutboundVideo / OutboundFile,
143
+ * 正文是附件引用占位符({@link formatAttachmentRef})。出站的 source 是 agent 的是她发的,role 为 assistant;其余是插件发的,
144
+ * role 为 notice(进模型时是一条系统通知,不算她的发言)。归档方一律用它,memory_recall 与会话服务回看历史才能按同一格式命中、
145
+ * 还原。文件的 desc 记文件名。时间戳与 metadata 由调用方补上。
106
146
  */
107
- export function outboundMediaMessage(kind, ref, desc) {
108
- const media = OUTBOUND_MEDIA[kind];
109
- return { role: 'assistant', kind: media.kind, content: formatAttachmentRef({ kind: media.ref, desc, ref }) };
147
+ export function outboundMediaMessage(kind, ref, { desc, source } = {}) {
148
+ return {
149
+ role: source === 'agent' ? 'assistant' : 'notice',
150
+ kind: OUTBOUND_MEDIA[kind],
151
+ content: formatAttachmentRef({ kind: ATTACHMENT_REF_KINDS[kind], desc, ref }),
152
+ };
153
+ }
154
+ /**
155
+ * 不是她回复的出站文字(`source` 不是 agent,如指令的回复、宿主提示)在会话历史里的记法:一条事件标记,不进模型的上下文,
156
+ * 正文是 `content`,元数据记文字对象({@link WellKnownMetadataKeys} 的 `Text`,有才记),会话服务据此还原成通知。她的回复
157
+ * (agent 存档)与空文字不记,回 undefined。归档方一律用它;时间戳与出站的 `Source`、`TurnId`、`CallId` 由调用方补上(与
158
+ * {@link outboundMediaMessage} 记的附件同一条规则,见 api-message-archive 的 recordOutbound)
159
+ */
160
+ export function outboundMarkerMessage(msg) {
161
+ if (msg.source === 'agent' || !msg.content.trim())
162
+ return undefined;
163
+ return {
164
+ role: 'system',
165
+ kind: WellKnownKinds.EventMarker,
166
+ content: msg.content,
167
+ ...(msg.text ? { metadata: { [WellKnownMetadataKeys.Text]: msg.text } } : {}),
168
+ };
110
169
  }
111
170
  /**
112
171
  * 跨插件约定的 `Message.metadata` 键。metadata 是开放字典,本表登记由一方写入、另一方读取的键:写方与读方都引用这里的
@@ -114,40 +173,66 @@ export function outboundMediaMessage(kind, ref, desc) {
114
173
  * 说话人、群、文件、回复的模型与 token、工具卡的归组。
115
174
  *
116
175
  * - `VisibleContent`:assistant 消息的可见正文(字符串)。回复经结构化输出(persona 的 outputFormat)
117
- * 时,`content` 存整串 JSON 信封(保持历史 few-shot 的格式),用户实际看到的是其中的回复字段。
176
+ * 时,`content` 存整串 JSON 信封(存档原文),用户实际看到的是其中的回复字段;agent 交给模型的历史取这个键。
118
177
  * agent 落库时把解码后的正文写进这个键,只在它与 `content` 不同时写入;缺省即 `content` 本身就是
119
178
  * 可见正文。检索、摘要等按语义消费历史的一方应优先读它,读不到再退回 `content`。
120
179
  * - `SpokenContent`:提问里发言人自己写的话(字符串,可以是空串),即入站消息的 `content`。存档的 `content` 是给模型看的
121
- * 归档文本({@link buildIncomingContent}:发送者前缀、引用与附件描述),存档只在两者不同时写这个键;缺省即 `content`。
122
- * 会话服务据此给出提问条目的正文。
180
+ * 归档文本({@link buildIncomingContent}:发送者前缀、转发的展开、引用与附件描述),存档只在两者不同时写这个键;缺省即
181
+ * `content`。合并转发的展开不在里面,只有它的占位。会话服务据此给出提问条目的正文,用户档案据此核对原话。
123
182
  * - `Attachments`:提问带的附件清单({@link ArchivedAttachment} 的数组,按入站顺序),存档写;会话服务据此把文件还原成卡片、
124
183
  * 图片等按地址显示。没有附件时不写。
184
+ * - `Forwards`:提问随附的转发({@link ArchivedForward} 的数组:入站消息 forwards 的 id 与事实,不存展开),存档在有时写;
185
+ * 会话服务据此把转发画成单独的块。
186
+ * - `SenderLabel`:归档文本发送者前缀里的标签(字符串,{@link getSenderLabel} 的写法),存档只在加了前缀时写。把归档文本重排给
187
+ * 模型或界面看的一方(向量记忆的召回片段、撤回通知的摘录、引用反查)按它用 {@link stripSenderPrefix} 去掉这一层,没有这个键
188
+ * 的不去。
189
+ * - `Mentions`:提问里发言人自己写的话 @ 了哪些账号(字符串数组,{@link extractMentions} 从入站消息的 `content` 抽,引用、
190
+ * 附件描述与转发里的不算),存档在有时写;向量记忆据此给被 @ 的人加权,关系图的提取据此认被 @ 的人。
125
191
  * - `Platform`、`UserId`、`Nickname`:说话人的平台、用户 id 与昵称(字符串)。存档写入站消息的;agent 给她自己的回复写
126
192
  * 这一轮的平台与她在那里的账号、昵称。会话服务据此标出说话人与是不是 owner,向量记忆、用户档案与关系等也读。
127
193
  * - `GroupId`、`GroupName`、`SessionType`:说话所在的群号、群名与会话类型(字符串,即入站消息的 `groupId`、`groupName`、
128
- * `sessionType`)。存档写入站消息的,agent 给她自己的回复写这一轮的;向量记忆与最近消息据此写出说话的位置,关系插件据此
129
- * 判断是不是群聊。
194
+ * `sessionType`)。存档写入站消息的,agent 给她自己的回复写这一轮的;向量记忆与最近消息据此写出说话的位置,只用于显示:
195
+ * 判是不是多方读会话记录的 originChat.multiParty(子会话取根会话的)。
130
196
  * - `MessageId`:平台侧的消息 id(字符串,即入站消息的 `messageId`),存档写;存档按它反查被引用的原文,关系插件据此把
131
197
  * 引用与回复对回消息。
132
- * - `Source`:这条记录的来源(字符串):入站消息是它的 `source`(内部注入的来源,真人发言没有);插件自己写的记录(发出的
133
- * 附件、投递失败)写插件的名字。会话服务据此标出提问是不是内部注入的。
198
+ * - `Source`:这条记录的来源(字符串):入站消息是它的 `source`(内部注入的来源,真人发言没有);出站消息记进历史的各条
199
+ * (文字的事件标记与发出的附件)是出站的 `source`(如指令回复的 command);插件自己写的其余记录(投递失败)写插件的名字。
200
+ * 会话服务据此标出提问是不是内部注入的、认出指令的回复。
134
201
  * - `HostNoticeKind`、`HostNoticeId`、`HostNoticeFacts`:宿主通知的子类(`hostNotice.kind`)、id(`hostNotice.id`)与给界面的
135
202
  * 事实(`hostNotice.facts`),存档写;会话服务据此给出通知条目的种类、id 与事实。
136
- * - `TurnId`:所在回合的 id(字符串)。agent 写在这一轮落库的回复与工具结果上,平台适配器写在一轮回复的投递失败记录上;
137
- * 会话服务据此把存档归回回合、标出哪一轮的回复没发出。
203
+ * - `TurnId`:所在回合的 id(字符串)。进了一轮的输入由存档按 agent 归档时交来的回合记下,agent 写在这一轮落库的回复、工具
204
+ * 结果与停下标记上,平台适配器写在一轮回复的投递失败记录上,出站记进历史的各条由写方按出站消息的 turnId 记下(有才记);
205
+ * 会话服务据此把存档归回回合、标出哪一轮的回复没发出,连对话回滚据此只删这一轮的消息。
206
+ * - `TurnEntry`:输入怎么进的这一轮(字符串):`opened` 是开轮的,`joined` 是插进在跑的一轮的。与 `TurnId` 一起由存档记下。
207
+ * - `TriggerType`:入站消息的触发类型(字符串,即 {@link IncomingMessage}.triggerType),存档写;会话服务据此标出被点名与插话。
208
+ * - `TurnRecord`:一轮的结局与来源({@link TurnRecord})。agent 记在这一轮最后落库的那条回复上,没有落库回复的一轮另落一条只带
209
+ * `TurnId` 与它的事件标记(role system、kind EventMarker、正文为空,属于 {@link CONTROL_KINDS});会话服务据此在历史里还原
210
+ * 这一轮的结局。
138
211
  * - `CallId`:工具调用的 id(字符串,即 `ToolCallContext.callId`)。agent 写在工具结果上,平台适配器写在经工具发出的
139
- * 消息的投递失败记录上;会话服务据此把历史里的工具卡对回实时推送。
212
+ * 消息的投递失败记录上,出站记进历史的各条由写方按出站消息的 callId 记下(有才记);会话服务据此把历史里的工具卡对回实时推送。
140
213
  * - `ModelInfo`:一轮回复的模型与这一轮的 token,与 {@link OutgoingMessage}.modelInfo 同形;agent 写在这一轮最后的回复上,
141
214
  * 会话服务标在回复条目上。
142
215
  * - `SentRef`、`SentName`:发出的附件(`outboundMediaMessage` 记的那条)原样的地址与文件名(字符串):占位符里的地址遇到
143
- * 「]」会截断、描述位的「]」「|」换成了全角。归档发出附件的一方写,会话服务优先取它们还原附件。
144
- * - `DeliveryError`:投递失败记录({@link WellKnownKinds}.OutboundDeliveryFailed)里与投递结果同一句的原因(字符串),平台
145
- * 适配器写;会话服务据此写出回复为什么没发出。
216
+ * 「]」会截断、描述位的「]」「|」换成了全角。记出站的一方写(api-message-archive 的 recordOutbound),会话服务优先取它们
217
+ * 还原附件。
218
+ * - `DeliveryError`:投递失败记录({@link WellKnownKinds}.OutboundDeliveryFailed)里与投递结果同一句的原因(字符串或文字对象),
219
+ * 平台适配器写;会话服务据此按读者语言写出回复为什么没发出。
220
+ * - `SentPieces`:投递失败记录里与投递结果同一个已发出条数(数字,{@link OutboundDeliveryResult} 的 sentPieces),平台适配器在
221
+ * 逐条发出停在中途时写;会话服务据此写出回复只发出了前几条。
222
+ * - `Unconfirmed`:投递失败记录里已经发出、没等到平台确认的各项(字符串数组,如「消息(第 2 条)」「文件 a.html」),平台适配器写;
223
+ * 会话服务据此写出回复可能已经发出。
224
+ * - `Text`:通知与事件标记给人看的文字(@aalis/schema-i18n 的文字对象),`content` 是写给模型的话或它按原文渲染的整句。
225
+ * 宿主通知的 `hostNotice.text`、平台通知的文字、平台事件合成的入站的 {@link IncomingMessage}.text、不是她回复的出站按
226
+ * {@link outboundMarkerMessage} 记成事件标记时的 {@link OutgoingMessage}.text 由写方记下,没有地址的出站附件记成的事件标记、
227
+ * 压缩分隔线同样;会话服务据此按读者语言显示(合成的入站画成通知),没有时显示 `content`。
146
228
  */
147
229
  export const WellKnownMetadataKeys = {
148
230
  VisibleContent: 'visibleContent',
149
231
  SpokenContent: 'spokenContent',
150
232
  Attachments: 'attachments',
233
+ Forwards: 'forwards',
234
+ SenderLabel: 'senderLabel',
235
+ Mentions: 'mentions',
151
236
  Platform: 'platform',
152
237
  UserId: 'userId',
153
238
  Nickname: 'nickname',
@@ -160,11 +245,17 @@ export const WellKnownMetadataKeys = {
160
245
  HostNoticeId: 'hostNoticeId',
161
246
  HostNoticeFacts: 'hostNoticeFacts',
162
247
  TurnId: 'turnId',
248
+ TurnEntry: 'turnEntry',
249
+ TriggerType: 'triggerType',
250
+ TurnRecord: 'turnRecord',
163
251
  CallId: 'callId',
164
252
  ModelInfo: 'modelInfo',
165
253
  SentRef: 'ref',
166
254
  SentName: 'name',
167
255
  DeliveryError: 'error',
256
+ SentPieces: 'sentPieces',
257
+ Unconfirmed: 'unconfirmed',
258
+ Text: 'text',
168
259
  };
169
260
  /**
170
261
  * 平台无关的 well-known `noticeType` 值。
@@ -188,11 +279,13 @@ export const CONTROL_KINDS = [WellKnownKinds.EventMarker];
188
279
  /**
189
280
  * 宿主或系统撰写、不是任何人发言的指令类 kind。
190
281
  * - 归档消息的 kind 属于它:抽取(用户事实、指令、关系)与记忆扩窗一律跳过;
191
- * - 请求期消息的 metadata.injector 属于它:是本轮的指令块(turn-context、turn-hint 落在它之前;DeepSeek 不把它改成 user)。
282
+ * - 请求期消息的 metadata.injector 属于它:是本轮的指令块(turn-context、turn-hint 落在它之前;agent 裁剪时不缩不删;DeepSeek
283
+ * 不把它改成 user)。
192
284
  */
193
285
  export const DIRECTIVE_KINDS = [
194
286
  WellKnownKinds.CrossSessionDelegation,
195
287
  WellKnownKinds.HostNotice,
288
+ WellKnownKinds.IdlePrompt,
196
289
  ];
197
290
  /** 自定义 role 转译为 LLM 接受的 WellKnownRole 的默认映射。 */
198
291
  const CUSTOM_ROLE_MAP = {
@@ -286,9 +379,11 @@ function normalizeForLLM(m) {
286
379
  const newContent = needsPrefix ? `${prefix} ${content}` : (content ?? null);
287
380
  return { ...m, role: llmRole, content: newContent };
288
381
  }
289
- export { AttachmentRefKind, buildAttachmentRefMatcher, formatAttachmentRef, parseAttachmentRefs, } from './attachment-ref.js';
382
+ export { ATTACHMENT_REF_KINDS, AttachmentRefKind, buildAttachmentRefMatcher, formatAttachmentRef, parseAttachmentRefs, } from './attachment-ref.js';
290
383
  // ----- 身份标识工具(cleanup-9 从 core 迁入) -----
291
- export { getMessageName, getSenderLabel, prefixSender } from './identity.js';
384
+ export { getMessageName, getSenderLabel, prefixSender, stripSenderPrefix } from './identity.js';
292
385
  // ----- 入站消息的归档文本(归档与触发判定共用) -----
293
- export { buildIncomingContent } from './incoming-content.js';
386
+ export { buildIncomingContent, forwardPlaceholder, withForwards } from './incoming-content.js';
387
+ // ----- 历史里的工具调用组(读历史的各方共用) -----
388
+ export { groupToolCalls } from './tool-call-groups.js';
294
389
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Message } from './index.js';
2
+ /** 历史里的一块:一组工具调用,或单独一条消息 */
3
+ export interface MessageUnit {
4
+ /** 各条在原列表里的下标:工具组是调用在前,各条结果按找到的先后;单独一条的只有它 */
5
+ readonly at: readonly number[];
6
+ /**
7
+ * complete 是结果找齐了的工具组(调用的每个 id 恰有一条结果),partial 是没找齐的,loose 是不在任何组里的工具结果,single 是
8
+ * 别的单独一条
9
+ */
10
+ readonly shape: 'complete' | 'partial' | 'loose' | 'single';
11
+ }
12
+ /**
13
+ * 按工具调用归组,次序是挪过之后的:从带工具调用的 assistant 往后找 toolCallId 对得上的结果,结果找齐、遇到下一次工具调用或
14
+ * 对不上、重复的结果就停;其间别的消息挪到这组之后,保持各自先后
15
+ */
16
+ export declare function groupToolCalls(messages: readonly Pick<Message, 'role' | 'toolCalls' | 'toolCallId'>[]): MessageUnit[];
17
+ //# sourceMappingURL=tool-call-groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call-groups.d.ts","sourceRoot":"","sources":["../src/tool-call-groups.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC,EAAE,GAAG,WAAW,EAAE,CA4BrH"}
@@ -0,0 +1,45 @@
1
+ // ============================================================
2
+ // tool-call-groups.ts — 历史里的工具调用组
3
+ //
4
+ // 读历史的各方(agent 装载历史、会话服务的时间线、记忆摘要的归档)按同一个归组认工具调用组:组的结果按 T0+1…T0+N 记时间戳,
5
+ // 按时间戳读历史的存储(Mongo、sqlite)会把组写入期间归档的别的消息(插进来的输入、被触发判定或流控吞掉的影子归档、随后的
6
+ // 回复)排进调用与结果之间,按相邻认组就会把组拆开。
7
+ // ============================================================
8
+ /**
9
+ * 按工具调用归组,次序是挪过之后的:从带工具调用的 assistant 往后找 toolCallId 对得上的结果,结果找齐、遇到下一次工具调用或
10
+ * 对不上、重复的结果就停;其间别的消息挪到这组之后,保持各自先后
11
+ */
12
+ export function groupToolCalls(messages) {
13
+ const units = [];
14
+ for (let i = 0; i < messages.length; i++) {
15
+ const head = messages[i];
16
+ const ids = new Set(head.role === 'assistant' ? head.toolCalls?.map(call => call.id) : undefined);
17
+ if (ids.size === 0) {
18
+ units.push({ at: [i], shape: head.role === 'tool' ? 'loose' : 'single' });
19
+ continue;
20
+ }
21
+ const results = [];
22
+ const between = [];
23
+ let j = i + 1;
24
+ for (; j < messages.length && ids.size > 0; j++) {
25
+ const next = messages[j];
26
+ if (next.role === 'tool') {
27
+ if (!next.toolCallId || !ids.delete(next.toolCallId))
28
+ break;
29
+ results.push(j);
30
+ }
31
+ else if (next.toolCalls?.length) {
32
+ break;
33
+ }
34
+ else {
35
+ between.push(j);
36
+ }
37
+ }
38
+ units.push({ at: [i, ...results], shape: ids.size === 0 ? 'complete' : 'partial' });
39
+ for (const k of between)
40
+ units.push({ at: [k], shape: 'single' });
41
+ i = j - 1;
42
+ }
43
+ return units;
44
+ }
45
+ //# sourceMappingURL=tool-call-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call-groups.js","sourceRoot":"","sources":["../src/tool-call-groups.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,EAAE;AACF,wEAAwE;AACxE,oEAAoE;AACpE,4BAA4B;AAC5B,+DAA+D;AAe/D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAuE;IACpG,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;oBAAE,MAAM;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBAClC,MAAM;YACR,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACpF,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aalis/schema-message",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,15 +19,16 @@
19
19
  "dist"
20
20
  ],
21
21
  "dependencies": {
22
- "@aalis/util-text-normalize": ">=0.5.2 <1.0.0"
22
+ "@aalis/schema-i18n": ">=0.1.0 <1.0.0",
23
+ "@aalis/util-text-normalize": ">=0.6.0 <1.0.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@types/node": "^22.0.0",
26
27
  "typescript": "^5.7.0",
27
- "@aalis/core": "0.20.0"
28
+ "@aalis/core": "0.21.0"
28
29
  },
29
30
  "peerDependencies": {
30
- "@aalis/core": ">=0.20.0 <1.0.0"
31
+ "@aalis/core": ">=0.21.0 <1.0.0"
31
32
  },
32
33
  "keywords": [
33
34
  "aalis",