@aalis/schema-message 0.10.0 → 0.11.1

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/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.1",
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",