@aalis/plugin-agent 0.15.2 → 0.17.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.
- package/dist/helpers.d.ts +59 -26
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +150 -78
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1317 -1350
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts +58 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +58 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/prompt-assembly.d.ts +6 -6
- package/dist/prompt-assembly.d.ts.map +1 -1
- package/dist/prompt-assembly.js +36 -21
- package/dist/prompt-assembly.js.map +1 -1
- package/dist/session-queue.d.ts +86 -0
- package/dist/session-queue.d.ts.map +1 -0
- package/dist/session-queue.js +194 -0
- package/dist/session-queue.js.map +1 -0
- package/dist/texts.d.ts +115 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +62 -0
- package/dist/texts.js.map +1 -0
- package/package.json +28 -21
package/dist/prompt-assembly.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// middleware 的逐轮重查行为一致。回合中途新注册的贡献(如 load_skill
|
|
11
11
|
// 激活新技能)在下一轮被增量物化。
|
|
12
12
|
// ============================================================
|
|
13
|
-
import {
|
|
13
|
+
import { DIRECTIVE_KINDS } from '@aalis/schema-message';
|
|
14
14
|
/** 锚位排布次序(同一轮组装内生效;语义见 agent-api 的 PromptAnchor 文档) */
|
|
15
15
|
const ANCHOR_ORDER = ['identity', 'knowledge', 'context', 'turn-context', 'turn-hint'];
|
|
16
16
|
/**
|
|
@@ -59,6 +59,14 @@ async function buildWithTimeout(logger, key, run, timeoutMs, parentSignal) {
|
|
|
59
59
|
signal.removeEventListener('abort', onAbort);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* 是不是本轮指令块(proactive 任务块、宿主通知块、空闲开话题的提示)。
|
|
64
|
+
* 这类回合没有当前 user 消息,历史里却有旧 user 消息。
|
|
65
|
+
*/
|
|
66
|
+
function isDirective(m) {
|
|
67
|
+
const injector = m.metadata?.injector;
|
|
68
|
+
return typeof injector === 'string' && DIRECTIVE_KINDS.includes(injector);
|
|
69
|
+
}
|
|
62
70
|
/** 各锚位在 messages 中的插入位置;返回 -1 = 本轮弃置该槽 */
|
|
63
71
|
function anchorInsertAt(anchor, messages) {
|
|
64
72
|
switch (anchor) {
|
|
@@ -68,32 +76,33 @@ function anchorInsertAt(anchor, messages) {
|
|
|
68
76
|
}
|
|
69
77
|
case 'knowledge':
|
|
70
78
|
case 'context': {
|
|
71
|
-
// 头部 system
|
|
72
|
-
// context
|
|
73
|
-
|
|
79
|
+
// 头部 system 区末尾:第一条非 system 或第一条本轮块(易变块、指令块)之前,历史为空时
|
|
80
|
+
// 也落在本轮诸块之前。顺序靠 ANCHOR_ORDER 串行插入保证:knowledge 先落位,context 再
|
|
81
|
+
// 定位时自然排在其后。
|
|
82
|
+
const idx = messages.findIndex(m => m.role !== 'system' || m.metadata?.injector === VOLATILE_INJECTOR || isDirective(m));
|
|
74
83
|
return idx === -1 ? messages.length : idx;
|
|
75
84
|
}
|
|
76
85
|
case 'turn-context': {
|
|
77
86
|
// 每轮取材的背景材料:落在历史结束处(缓存断点之后)、当前轮诸块之前。
|
|
78
87
|
// 三级定位,取首个命中:
|
|
79
|
-
// 1.
|
|
80
|
-
// 旧 user 消息;若按「最后一条 user」定位会把材料 splice 进历史
|
|
81
|
-
// **内部**,既割裂转录又在 append-only 区制造新的缓存断点。
|
|
82
|
-
// 2. 易变块(persona-volatile)之前——普通轮的历史/当前轮分界线。
|
|
88
|
+
// 1. 易变块(persona-volatile)之前——普通轮与空闲开话题那一轮的历史/当前轮分界线。
|
|
83
89
|
// 材料在此刻事实(时间/状态)之前、focus 与 turn-hint 之前:焦点
|
|
84
|
-
//
|
|
85
|
-
//
|
|
90
|
+
// 指引与平台提示(「本轮上下文中的群聊历史记录」)保持先行语邻接,
|
|
91
|
+
// 不被整批材料隔断。
|
|
92
|
+
// 2. 指令块(proactive 任务块、宿主通知块)之前——这类回合没有易变块与
|
|
93
|
+
// 当前 user 消息,历史里却有旧 user 消息;若按「最后一条 user」定位会把
|
|
94
|
+
// 材料 splice 进历史**内部**,既割裂转录又在 append-only 区制造新的缓存断点。
|
|
86
95
|
// 3. 兜底:最后一条 user 之前;全列表无 user(空历史特殊形状)落尾。
|
|
87
96
|
//
|
|
88
97
|
// 注意 ANCHOR_ORDER 的「turn-context 先于 turn-hint」只在**同一次组装
|
|
89
98
|
// 内**成立:工具循环第二轮才物化的迟到材料按当轮规则重新定位,与首轮
|
|
90
99
|
// 已物化块的相对次序不保证。
|
|
91
|
-
const delegation = messages.findIndex(m => m.metadata?.injector === WellKnownKinds.CrossSessionDelegation);
|
|
92
|
-
if (delegation >= 0)
|
|
93
|
-
return delegation;
|
|
94
100
|
const volatileIdx = messages.findIndex(m => m.metadata?.injector === VOLATILE_INJECTOR);
|
|
95
101
|
if (volatileIdx >= 0)
|
|
96
102
|
return volatileIdx;
|
|
103
|
+
const directive = messages.findIndex(isDirective);
|
|
104
|
+
if (directive >= 0)
|
|
105
|
+
return directive;
|
|
97
106
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
98
107
|
if (messages[i].role === 'user')
|
|
99
108
|
return i;
|
|
@@ -101,6 +110,11 @@ function anchorInsertAt(anchor, messages) {
|
|
|
101
110
|
return messages.length;
|
|
102
111
|
}
|
|
103
112
|
case 'turn-hint': {
|
|
113
|
+
// 指令块之前(理由同 turn-context 第 2 级;同一次组装内 turn-context 已先落在它之前,
|
|
114
|
+
// hint 因此紧贴指令块);没有指令块时落在最后一条 user 之前
|
|
115
|
+
const directive = messages.findIndex(isDirective);
|
|
116
|
+
if (directive >= 0)
|
|
117
|
+
return directive;
|
|
104
118
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
105
119
|
if (messages[i].role === 'user')
|
|
106
120
|
return i;
|
|
@@ -118,9 +132,11 @@ function anchorInsertAt(anchor, messages) {
|
|
|
118
132
|
* - 物化形态与旧手搓注入一致:`{role:'system', content, metadata:{injector: 全局键}}`,
|
|
119
133
|
* trim / token 统计 / WebUI 零改动。
|
|
120
134
|
*/
|
|
121
|
-
export async function assemblePromptContributions(caps, data,
|
|
135
|
+
export async function assemblePromptContributions(caps, data,
|
|
136
|
+
/** 这一轮的输入(视图的 inputs):不在回合里的估算(token:request 的快照)给空数组 */
|
|
137
|
+
inputs, opts) {
|
|
122
138
|
opts?.signal?.throwIfAborted();
|
|
123
|
-
const entries = caps.contributions.collect('agent:prompt');
|
|
139
|
+
const entries = caps.contributions.use.collect('agent:prompt');
|
|
124
140
|
if (entries.length === 0)
|
|
125
141
|
return;
|
|
126
142
|
const { messages } = data;
|
|
@@ -129,9 +145,8 @@ export async function assemblePromptContributions(caps, data, opts) {
|
|
|
129
145
|
return;
|
|
130
146
|
const view = {
|
|
131
147
|
sessionId: data.sessionId,
|
|
132
|
-
userId: data.userId,
|
|
133
148
|
platform: data.platform,
|
|
134
|
-
|
|
149
|
+
inputs,
|
|
135
150
|
dryRun: data.dryRun === true,
|
|
136
151
|
// 浅拷贝快照:build 是并行执行的,把活数组递进去,某个 build 若强转
|
|
137
152
|
// readonly 去 splice 会与其他 build 的读跨 await 竞态(旧串行中间件无此
|
|
@@ -141,7 +156,7 @@ export async function assemblePromptContributions(caps, data, opts) {
|
|
|
141
156
|
const timeoutMs = opts?.buildTimeoutMs;
|
|
142
157
|
const built = (await Promise.all(pending.map(async ({ key, spec }) => {
|
|
143
158
|
try {
|
|
144
|
-
const out = await buildWithTimeout(caps.logger, key, signal => spec.build({ ...view, signal }), timeoutMs, opts?.signal);
|
|
159
|
+
const out = await buildWithTimeout(caps.logger.use, key, signal => spec.build({ ...view, signal }), timeoutMs, opts?.signal);
|
|
145
160
|
if (out == null)
|
|
146
161
|
return null;
|
|
147
162
|
const blocks = (typeof out === 'string' ? [out] : out).filter(b => b.length > 0);
|
|
@@ -149,7 +164,7 @@ export async function assemblePromptContributions(caps, data, opts) {
|
|
|
149
164
|
}
|
|
150
165
|
catch (err) {
|
|
151
166
|
opts?.signal?.throwIfAborted();
|
|
152
|
-
caps.logger.warn(`agent:prompt 贡献 "${key}" 构建失败(本轮缺席):`, err);
|
|
167
|
+
caps.logger.use.warn(`agent:prompt 贡献 "${key}" 构建失败(本轮缺席):`, err);
|
|
153
168
|
return null;
|
|
154
169
|
}
|
|
155
170
|
}))).filter(r => r !== null);
|
|
@@ -161,7 +176,7 @@ export async function assemblePromptContributions(caps, data, opts) {
|
|
|
161
176
|
continue;
|
|
162
177
|
const insertAt = anchorInsertAt(anchor, messages);
|
|
163
178
|
if (insertAt < 0) {
|
|
164
|
-
caps.logger.debug(`agent:prompt 锚位 "${anchor}" 本轮无落点,弃置 ${group.length} 份贡献`);
|
|
179
|
+
caps.logger.use.debug(`agent:prompt 锚位 "${anchor}" 本轮无落点,弃置 ${group.length} 份贡献`);
|
|
165
180
|
continue;
|
|
166
181
|
}
|
|
167
182
|
messages.splice(insertAt, 0, ...group.flatMap(({ key, blocks }) => blocks.map((content) => ({ role: 'system', content, metadata: { injector: key } }))));
|
|
@@ -170,7 +185,7 @@ export async function assemblePromptContributions(caps, data, opts) {
|
|
|
170
185
|
// 蒸发:既不物化、键也不落,下一轮还会重跑 build。点名报出,别让它静默。
|
|
171
186
|
const stray = built.filter(r => !ANCHOR_ORDER.includes(r.anchor));
|
|
172
187
|
for (const r of stray) {
|
|
173
|
-
caps.logger.warn(`agent:prompt 贡献 "${r.key}" 的 anchor "${r.anchor}" 不是合法锚位,本轮产物已丢弃`);
|
|
188
|
+
caps.logger.use.warn(`agent:prompt 贡献 "${r.key}" 的 anchor "${r.anchor}" 不是合法锚位,本轮产物已丢弃`);
|
|
174
189
|
}
|
|
175
190
|
}
|
|
176
191
|
//# sourceMappingURL=prompt-assembly.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-assembly.js","sourceRoot":"","sources":["../src/prompt-assembly.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mDAAmD;AACnD,EAAE;AACF,gEAAgE;AAChE,yCAAyC;AACzC,EAAE;AACF,4CAA4C;AAC5C,oDAAoD;AACpD,yCAAyC;AACzC,+CAA+C;AAC/C,mBAAmB;AACnB,+DAA+D;AAK/D,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt-assembly.js","sourceRoot":"","sources":["../src/prompt-assembly.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mDAAmD;AACnD,EAAE;AACF,gEAAgE;AAChE,yCAAyC;AACzC,EAAE;AACF,4CAA4C;AAC5C,oDAAoD;AACpD,yCAAyC;AACzC,+CAA+C;AAC/C,mBAAmB;AACnB,+DAA+D;AAK/D,OAAO,EAAE,eAAe,EAAgB,MAAM,uBAAuB,CAAC;AAEtE,uDAAuD;AACvD,MAAM,YAAY,GAA4B,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;AAWhH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,GAAW,EACX,GAAqE,EACrE,SAAkB,EAClB,YAA0B;IAE1B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IACrG,IAAI,KAAgD,CAAC;IACrD,IAAI,OAAiC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACnD,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,IAAI,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,gCAAgC,SAAS,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;YACpG,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1C,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,EAAE,cAAc,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,UAAU,SAAS,oBAAoB,CAAC,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,OAAO;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,CAAU;IAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACtC,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5E,CAAC;AAED,0CAA0C;AAC1C,SAAS,cAAc,CAAC,MAAoB,EAAE,QAA4B;IACxE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACzD,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,qDAAqD;YACrD,4DAA4D;YAC5D,aAAa;YACb,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAC5B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,iBAAiB,IAAI,WAAW,CAAC,CAAC,CAAC,CACzF,CAAC;YACF,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5C,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,qCAAqC;YACrC,cAAc;YACd,sDAAsD;YACtD,8CAA8C;YAC9C,sCAAsC;YACtC,eAAe;YACf,4CAA4C;YAC5C,iDAAiD;YACjD,wDAAwD;YACxD,2CAA2C;YAC3C,EAAE;YACF,wDAAwD;YACxD,qCAAqC;YACrC,gBAAgB;YAChB,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,iBAAiB,CAAC,CAAC;YACxF,IAAI,WAAW,IAAI,CAAC;gBAAE,OAAO,WAAW,CAAC;YACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,SAAS,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,4DAA4D;YAC5D,qCAAqC;YACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,SAAS,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe;QAC5B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAwB,EACxB,IAKC;AACD,yDAAyD;AACzD,MAAwC,EACxC,IAUC;IAED,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,IAAI,GAA2B;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM;QACN,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;QAC5B,0CAA0C;QAC1C,qDAAqD;QACrD,sCAAsC;QACtC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;KACxB,CAAC;IAGF,MAAM,SAAS,GAAG,IAAI,EAAE,cAAc,CAAC;IACvC,MAAM,KAAK,GAAG,CACZ,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAyB,EAAE;QACzD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,IAAI,CAAC,MAAM,CAAC,GAAG,EACf,GAAG,EACH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EACzC,SAAS,EACT,IAAI,EAAE,MAAM,CACb,CAAC;YACF,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CACH,CACF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE1B,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,uCAAuC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,MAAM,cAAc,KAAK,CAAC,MAAM,MAAM,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CACb,QAAQ,EACR,CAAC,EACD,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CACnC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAC7F,CACF,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,yCAAyC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { IncomingMessage } from '@aalis/schema-message';
|
|
2
|
+
/** 在跑的一轮 */
|
|
3
|
+
export interface Turn {
|
|
4
|
+
readonly sessionId: string;
|
|
5
|
+
readonly turnId: string;
|
|
6
|
+
readonly controller: AbortController;
|
|
7
|
+
/** 由真人消息开:只有这样的一轮收插进来的真人消息 */
|
|
8
|
+
readonly human: boolean;
|
|
9
|
+
/** 由排着的输入开(它们是上一轮进行期间到的) */
|
|
10
|
+
readonly queued: boolean;
|
|
11
|
+
/** 开轮的这一批,按入队先后 */
|
|
12
|
+
readonly batch: readonly IncomingMessage[];
|
|
13
|
+
/** 停下它的原因,只给日志 */
|
|
14
|
+
reason?: string;
|
|
15
|
+
/** 停下它的人:有人停时才有 */
|
|
16
|
+
stoppedBy?: StoppedBy;
|
|
17
|
+
}
|
|
18
|
+
/** 停下一轮的人,与入站的授权身份同一形状 */
|
|
19
|
+
export type StoppedBy = NonNullable<IncomingMessage['actor']>;
|
|
20
|
+
/** 一条输入交给通道之后去哪:开轮、待插入、排队,或放掉(已关闭时,要归档) */
|
|
21
|
+
export type Placement = {
|
|
22
|
+
route: 'open';
|
|
23
|
+
turn: Turn;
|
|
24
|
+
} | {
|
|
25
|
+
route: 'join' | 'queue';
|
|
26
|
+
ready: Promise<Turn | undefined>;
|
|
27
|
+
} | {
|
|
28
|
+
route: 'drop';
|
|
29
|
+
};
|
|
30
|
+
export declare class SessionQueues {
|
|
31
|
+
#private;
|
|
32
|
+
private readonly onWaiting;
|
|
33
|
+
constructor(onWaiting: (sessionId: string, waiting: readonly IncomingMessage[]) => void);
|
|
34
|
+
/**
|
|
35
|
+
* 按住这些会话(不给即全部会话),直到调用返回的函数:这期间要交给通道的输入在 {@link held} 等着,放开之后再交。清消息历史
|
|
36
|
+
* 用它:停下在跑的一轮到清完之间到的输入不开轮、不被清掉,清完照常处理
|
|
37
|
+
*/
|
|
38
|
+
hold(sessionIds?: readonly string[]): () => void;
|
|
39
|
+
/** 这个会话被按住时等到放开(几处同时按住的等到都放开);没按住的立即落定 */
|
|
40
|
+
held(sessionId: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* 交一条已过逐条处理的输入。已关闭时放掉(要归档);会话空闲时由这次调用开轮;在跑的一轮由真人消息开、还收输入,这条也是
|
|
43
|
+
* 真人消息时待插入;其余排队。待插入与排队的 ready 在它所在的一轮结束、或被放掉时交出 undefined,轮到它开轮时交出那一轮
|
|
44
|
+
*/
|
|
45
|
+
place(message: IncomingMessage): Placement;
|
|
46
|
+
/** 取这一轮待插入的输入(按入队先后),它们随之进了这一轮;不收输入时为空 */
|
|
47
|
+
take(turn: Turn): IncomingMessage[];
|
|
48
|
+
/** 这一轮不再收输入:还没插进去的转为排队,排在队首 */
|
|
49
|
+
close(turn: Turn): void;
|
|
50
|
+
/**
|
|
51
|
+
* 停下这个会话在跑的一轮(turnId 给了而对不上时什么也不停):它不再收输入,待插入的转为排队、之后到的排队,开下一轮;queued
|
|
52
|
+
* 为真时连同排队与待插入的一起放掉,archive 定放掉的要不要归档;by 是停下它的人。返回是否停下了在跑的一轮
|
|
53
|
+
*/
|
|
54
|
+
stop(sessionId: string, { turnId, queued, reason, by, archive, }: {
|
|
55
|
+
turnId?: string;
|
|
56
|
+
queued?: boolean;
|
|
57
|
+
reason?: string;
|
|
58
|
+
by?: StoppedBy;
|
|
59
|
+
archive: boolean;
|
|
60
|
+
}): boolean;
|
|
61
|
+
/** 这个会话在跑、还停得下的那一轮里的输入(开轮的与插进来的,按进入先后;排队与待插入的不算);没有这样的一轮时没有 */
|
|
62
|
+
inputs(sessionId: string): IncomingMessage[] | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* 这一轮收尾:不再收输入、不再停得下。返回这期间放掉的(按先后),agent 处理完一条(要归档的先归档)调它的 settle,处理
|
|
65
|
+
* 期间又放掉的下一次再取,取空了再 {@link release}
|
|
66
|
+
*/
|
|
67
|
+
drain(turn: Turn): Array<{
|
|
68
|
+
message: IncomingMessage;
|
|
69
|
+
archive: boolean;
|
|
70
|
+
settle: () => void;
|
|
71
|
+
}>;
|
|
72
|
+
/** 这一轮落定:进了这一轮的输入随之落定,取下一批开下一轮(交给这一批里入队最早那条的调用) */
|
|
73
|
+
release(turn: Turn): void;
|
|
74
|
+
/** 这个会话此刻在跑的那一轮落定时落定;没有在跑的立即落定 */
|
|
75
|
+
settled(sessionId: string): Promise<void>;
|
|
76
|
+
/** 停下这些会话在跑的一轮、放掉排队与待插入的,返回它们都落定的 Promise */
|
|
77
|
+
stopAll(sessionIds: readonly string[], options: {
|
|
78
|
+
archive: boolean;
|
|
79
|
+
reason: string;
|
|
80
|
+
}): Promise<void>;
|
|
81
|
+
/** 关闭(停机):之后入队的一律放掉;停下全部在跑的一轮、放掉全部排队项(都归档),返回它们都落定的 Promise */
|
|
82
|
+
shutdown(): Promise<void>;
|
|
83
|
+
/** 有在跑的一轮的会话(排着输入的会话一定有在跑的一轮:一轮落定时当场交出下一批) */
|
|
84
|
+
sessions(): string[];
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=session-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-queue.d.ts","sourceRoot":"","sources":["../src/session-queue.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAW7D,YAAY;AACZ,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,mBAAmB;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,0BAA0B;AAC1B,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AA2B9D,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC7B;IAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAA;CAAE,GAC7D;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAItB,qBAAa,aAAa;;IAOZ,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI;IAExG;;;OAGG;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,IAAI;IAUhD,0CAA0C;IACpC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS;IAc1C,0CAA0C;IAC1C,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,EAAE;IAUnC,+BAA+B;IAC/B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQvB;;;OAGG;IACH,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,EACE,MAAM,EACN,MAAM,EACN,MAAM,EACN,EAAE,EACF,OAAO,GACR,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAC1F,OAAO;IAkBV,+DAA+D;IAC/D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,SAAS;IAIxD;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAW5F,mDAAmD;IACnD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAmBzB,kCAAkC;IAClC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,6CAA6C;IAC7C,OAAO,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpG,+DAA+D;IAC/D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,8CAA8C;IAC9C,QAAQ,IAAI,MAAM,EAAE;CA0CrB"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// session-queue.ts — 通道:每个会话同一时刻最多一轮在跑,新消息从不打断它
|
|
3
|
+
//
|
|
4
|
+
// 真人消息(不带 source)插进由真人消息开、还收输入的那一轮(这一轮在每次调用模型之前取走待插入的),插不进的排队;一轮结束
|
|
5
|
+
// 后取队首:队首是真人消息时队里的真人消息一起开下一轮,队首是带来源的注入时只开它。开下一轮的是这一批里入队最早那条的调用,
|
|
6
|
+
// 回合跑在它的异步上下文里(注入方据此认出自己那一轮),其余各条等这一轮结束。停一轮可以连同排队与待插入的一起放掉;放掉的
|
|
7
|
+
// 在这个会话在跑的一轮落定之后由 agent 按先后归档(要归档的才归档),agent 在一个会话里的写入因此不交错。一轮被停下即不再收
|
|
8
|
+
// 输入。关闭(停机)之后入队的以放掉落定(要归档)。按住的会话(清消息历史期间)要交给通道的输入等放开再交。等候的集合(排队
|
|
9
|
+
// 与待插入的)变了时报给 onWaiting。
|
|
10
|
+
// ============================================================
|
|
11
|
+
const bySeq = (a, b) => a.seq - b.seq;
|
|
12
|
+
export class SessionQueues {
|
|
13
|
+
onWaiting;
|
|
14
|
+
#channels = new Map();
|
|
15
|
+
/** 按住的范围:sessions 不给即全部会话,放开时 released 落定 */
|
|
16
|
+
#holds = new Set();
|
|
17
|
+
#seq = 0;
|
|
18
|
+
#closed = false;
|
|
19
|
+
constructor(onWaiting) {
|
|
20
|
+
this.onWaiting = onWaiting;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 按住这些会话(不给即全部会话),直到调用返回的函数:这期间要交给通道的输入在 {@link held} 等着,放开之后再交。清消息历史
|
|
24
|
+
* 用它:停下在跑的一轮到清完之间到的输入不开轮、不被清掉,清完照常处理
|
|
25
|
+
*/
|
|
26
|
+
hold(sessionIds) {
|
|
27
|
+
let release;
|
|
28
|
+
const hold = { sessions: sessionIds && new Set(sessionIds), released: new Promise(r => (release = r)) };
|
|
29
|
+
this.#holds.add(hold);
|
|
30
|
+
return () => {
|
|
31
|
+
this.#holds.delete(hold);
|
|
32
|
+
release();
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** 这个会话被按住时等到放开(几处同时按住的等到都放开);没按住的立即落定 */
|
|
36
|
+
async held(sessionId) {
|
|
37
|
+
const covering = () => [...this.#holds].find(({ sessions }) => !sessions || sessions.has(sessionId));
|
|
38
|
+
for (let hold = covering(); hold; hold = covering())
|
|
39
|
+
await hold.released;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 交一条已过逐条处理的输入。已关闭时放掉(要归档);会话空闲时由这次调用开轮;在跑的一轮由真人消息开、还收输入,这条也是
|
|
43
|
+
* 真人消息时待插入;其余排队。待插入与排队的 ready 在它所在的一轮结束、或被放掉时交出 undefined,轮到它开轮时交出那一轮
|
|
44
|
+
*/
|
|
45
|
+
place(message) {
|
|
46
|
+
if (this.#closed)
|
|
47
|
+
return { route: 'drop' };
|
|
48
|
+
const channel = this.#channelOf(message.sessionId);
|
|
49
|
+
let wake;
|
|
50
|
+
const ready = new Promise(resolve => (wake = resolve));
|
|
51
|
+
const entry = { message, seq: ++this.#seq, wake };
|
|
52
|
+
const { running } = channel;
|
|
53
|
+
if (!running)
|
|
54
|
+
return { route: 'open', turn: this.#open(channel, [entry], false) };
|
|
55
|
+
const route = running.turn.human && running.accepting && !message.source ? 'join' : 'queue';
|
|
56
|
+
(route === 'join' ? channel.joining : channel.queue).push(entry);
|
|
57
|
+
this.#report(message.sessionId, channel);
|
|
58
|
+
return { route, ready };
|
|
59
|
+
}
|
|
60
|
+
/** 取这一轮待插入的输入(按入队先后),它们随之进了这一轮;不收输入时为空 */
|
|
61
|
+
take(turn) {
|
|
62
|
+
const channel = this.#channels.get(turn.sessionId);
|
|
63
|
+
const running = channel?.running;
|
|
64
|
+
if (!channel || running?.turn !== turn || !running.accepting || channel.joining.length === 0)
|
|
65
|
+
return [];
|
|
66
|
+
const taken = channel.joining.splice(0).sort(bySeq);
|
|
67
|
+
running.members.push(...taken);
|
|
68
|
+
this.#report(turn.sessionId, channel);
|
|
69
|
+
return taken.map(entry => entry.message);
|
|
70
|
+
}
|
|
71
|
+
/** 这一轮不再收输入:还没插进去的转为排队,排在队首 */
|
|
72
|
+
close(turn) {
|
|
73
|
+
const channel = this.#channels.get(turn.sessionId);
|
|
74
|
+
const running = channel?.running;
|
|
75
|
+
if (!channel || running?.turn !== turn || !running.accepting)
|
|
76
|
+
return;
|
|
77
|
+
running.accepting = false;
|
|
78
|
+
channel.queue.unshift(...channel.joining.splice(0).sort(bySeq));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 停下这个会话在跑的一轮(turnId 给了而对不上时什么也不停):它不再收输入,待插入的转为排队、之后到的排队,开下一轮;queued
|
|
82
|
+
* 为真时连同排队与待插入的一起放掉,archive 定放掉的要不要归档;by 是停下它的人。返回是否停下了在跑的一轮
|
|
83
|
+
*/
|
|
84
|
+
stop(sessionId, { turnId, queued, reason, by, archive, }) {
|
|
85
|
+
const channel = this.#channels.get(sessionId);
|
|
86
|
+
if (turnId !== undefined && channel?.running?.turn.turnId !== turnId)
|
|
87
|
+
return false;
|
|
88
|
+
const running = this.#stoppable(sessionId);
|
|
89
|
+
if (running) {
|
|
90
|
+
running.turn.reason = reason;
|
|
91
|
+
running.turn.stoppedBy = by;
|
|
92
|
+
running.turn.controller.abort();
|
|
93
|
+
this.close(running.turn);
|
|
94
|
+
}
|
|
95
|
+
if (queued && channel && channel.queue.length + channel.joining.length > 0) {
|
|
96
|
+
const waiting = [...channel.queue.splice(0), ...channel.joining.splice(0)].sort(bySeq);
|
|
97
|
+
channel.dropped.push(...waiting.map(entry => ({ entry, archive })));
|
|
98
|
+
this.#report(sessionId, channel);
|
|
99
|
+
}
|
|
100
|
+
return running !== undefined;
|
|
101
|
+
}
|
|
102
|
+
/** 这个会话在跑、还停得下的那一轮里的输入(开轮的与插进来的,按进入先后;排队与待插入的不算);没有这样的一轮时没有 */
|
|
103
|
+
inputs(sessionId) {
|
|
104
|
+
return this.#stoppable(sessionId)?.members.map(entry => entry.message);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 这一轮收尾:不再收输入、不再停得下。返回这期间放掉的(按先后),agent 处理完一条(要归档的先归档)调它的 settle,处理
|
|
108
|
+
* 期间又放掉的下一次再取,取空了再 {@link release}
|
|
109
|
+
*/
|
|
110
|
+
drain(turn) {
|
|
111
|
+
const channel = this.#channels.get(turn.sessionId);
|
|
112
|
+
const running = channel?.running;
|
|
113
|
+
if (!channel || running?.turn !== turn)
|
|
114
|
+
return [];
|
|
115
|
+
this.close(turn);
|
|
116
|
+
running.ended = true;
|
|
117
|
+
return channel.dropped
|
|
118
|
+
.splice(0)
|
|
119
|
+
.map(({ entry, archive }) => ({ message: entry.message, archive, settle: () => entry.wake(undefined) }));
|
|
120
|
+
}
|
|
121
|
+
/** 这一轮落定:进了这一轮的输入随之落定,取下一批开下一轮(交给这一批里入队最早那条的调用) */
|
|
122
|
+
release(turn) {
|
|
123
|
+
const channel = this.#channels.get(turn.sessionId);
|
|
124
|
+
const running = channel?.running;
|
|
125
|
+
if (!channel || running?.turn !== turn)
|
|
126
|
+
return;
|
|
127
|
+
for (const entry of running.members)
|
|
128
|
+
entry.wake(undefined);
|
|
129
|
+
channel.running = undefined;
|
|
130
|
+
running.resolve();
|
|
131
|
+
const [head] = channel.queue;
|
|
132
|
+
if (!head) {
|
|
133
|
+
this.#channels.delete(turn.sessionId);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const batch = head.message.source ? [head] : channel.queue.filter(entry => !entry.message.source).sort(bySeq);
|
|
137
|
+
channel.queue = channel.queue.filter(entry => !batch.includes(entry));
|
|
138
|
+
const next = this.#open(channel, batch, true);
|
|
139
|
+
this.#report(turn.sessionId, channel);
|
|
140
|
+
batch[0].wake(next);
|
|
141
|
+
}
|
|
142
|
+
/** 这个会话此刻在跑的那一轮落定时落定;没有在跑的立即落定 */
|
|
143
|
+
settled(sessionId) {
|
|
144
|
+
return this.#channels.get(sessionId)?.running?.done ?? Promise.resolve();
|
|
145
|
+
}
|
|
146
|
+
/** 停下这些会话在跑的一轮、放掉排队与待插入的,返回它们都落定的 Promise */
|
|
147
|
+
stopAll(sessionIds, options) {
|
|
148
|
+
for (const sessionId of sessionIds)
|
|
149
|
+
this.stop(sessionId, { ...options, queued: true });
|
|
150
|
+
return Promise.all(sessionIds.map(sessionId => this.settled(sessionId))).then(() => undefined);
|
|
151
|
+
}
|
|
152
|
+
/** 关闭(停机):之后入队的一律放掉;停下全部在跑的一轮、放掉全部排队项(都归档),返回它们都落定的 Promise */
|
|
153
|
+
shutdown() {
|
|
154
|
+
this.#closed = true;
|
|
155
|
+
return this.stopAll(this.sessions(), { archive: true, reason: '停机' });
|
|
156
|
+
}
|
|
157
|
+
/** 有在跑的一轮的会话(排着输入的会话一定有在跑的一轮:一轮落定时当场交出下一批) */
|
|
158
|
+
sessions() {
|
|
159
|
+
return [...this.#channels.keys()];
|
|
160
|
+
}
|
|
161
|
+
/** 这个会话在跑、还没收尾也没被停下的那一轮 */
|
|
162
|
+
#stoppable(sessionId) {
|
|
163
|
+
const running = this.#channels.get(sessionId)?.running;
|
|
164
|
+
return running && !running.ended && !running.turn.controller.signal.aborted ? running : undefined;
|
|
165
|
+
}
|
|
166
|
+
#channelOf(sessionId) {
|
|
167
|
+
let channel = this.#channels.get(sessionId);
|
|
168
|
+
if (!channel) {
|
|
169
|
+
channel = { queue: [], joining: [], dropped: [] };
|
|
170
|
+
this.#channels.set(sessionId, channel);
|
|
171
|
+
}
|
|
172
|
+
return channel;
|
|
173
|
+
}
|
|
174
|
+
#open(channel, batch, queued) {
|
|
175
|
+
const [first] = batch;
|
|
176
|
+
const turn = {
|
|
177
|
+
sessionId: first.message.sessionId,
|
|
178
|
+
turnId: crypto.randomUUID(),
|
|
179
|
+
controller: new AbortController(),
|
|
180
|
+
human: !first.message.source,
|
|
181
|
+
queued,
|
|
182
|
+
batch: batch.map(entry => entry.message),
|
|
183
|
+
};
|
|
184
|
+
let resolve;
|
|
185
|
+
const done = new Promise(r => (resolve = r));
|
|
186
|
+
channel.running = { turn, members: [...batch], accepting: true, ended: false, done, resolve };
|
|
187
|
+
return turn;
|
|
188
|
+
}
|
|
189
|
+
/** 报这个会话等候的集合:排队与待插入的,按入队先后 */
|
|
190
|
+
#report(sessionId, channel) {
|
|
191
|
+
this.onWaiting(sessionId, [...channel.queue, ...channel.joining].sort(bySeq).map(entry => entry.message));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=session-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-queue.js","sourceRoot":"","sources":["../src/session-queue.ts"],"names":[],"mappings":"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"}
|
package/dist/texts.d.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
declare const SOURCE: {
|
|
2
|
+
readonly displayName: "默认 Agent";
|
|
3
|
+
readonly systemPromptLabel: "行为准则提示词";
|
|
4
|
+
readonly systemPromptDescription: "定义 Agent 的行为准则。当人设插件存在时,身份描述由人设提供,此处仅作为行为指令追加。";
|
|
5
|
+
readonly memoryTokenBudgetLabel: "长期记忆预留 Token";
|
|
6
|
+
readonly memoryTokenBudgetDescription: "注入的 system 消息(技能、摘要、记忆等)的 token 额度,只在硬裁剪丢完历史仍超预算时起作用:它们合计超过额度就按比例缩减,仍超时删除";
|
|
7
|
+
readonly promptBuildTimeoutMsLabel: "提示词贡献构建超时 (ms)";
|
|
8
|
+
readonly promptBuildTimeoutMsDescription: "单个 agent:prompt 贡献 build 的等待上限。挂死的构建(如网络检索卡住)超时后本轮缺席、其余照常,避免拖住每次 LLM 调用。0 表示不设限。";
|
|
9
|
+
readonly toolResultMaxRatioLabel: "工具结果最大比例";
|
|
10
|
+
readonly toolResultMaxRatioDescription: "单条工具结果占上下文窗口的最大比例 (0~1),超出则截断。例如 0.15 表示 15%";
|
|
11
|
+
readonly trimThresholdRatioLabel: "裁剪触发比例";
|
|
12
|
+
readonly trimThresholdRatioDescription: "裁剪预算 = 上下文长度 × 该比例 − 最大输出 token − 512 安全余量(下限 1024)。硬裁剪按它裁要发出的消息列表(只裁内存里的,不影响 DB):历史超过可用量(预算减去头部与四分之一预算)就成段丢,其余几步在估算超过预算时才做。默认 1.0 表示用满扣除输出预留后的可用窗口;调低可提前裁剪。压缩触发在会话设置里调:自动压缩线(摘要插件)与历史条数上限(本插件)。";
|
|
13
|
+
readonly systemNotice: "[系统] {why}";
|
|
14
|
+
readonly turnError: "[错误] {error}";
|
|
15
|
+
readonly llmNoneErrored: "未找到任何具备 chat 能力的 LLM —— 以下 LLM 插件激活失败:{plugins, list}。可用 /doctor 查看原因(需要相应权限)。";
|
|
16
|
+
readonly llmNone: "未找到任何具备 chat 能力的 LLM —— 请确认已安装并启用至少一个 LLM 提供者插件(如 @aalis/plugin-llm-deepseek)。";
|
|
17
|
+
readonly llmNotFound: "配置指向的模型不存在:{wanted}。当前可用:{models, list}{more}。";
|
|
18
|
+
readonly llmMore: " 等 {count, number} 个(用 /model 查看全部)";
|
|
19
|
+
readonly llmUnresolved: "LLM 解析失败:能力过滤后有 {count, number} 个可用 entry,但解析时一个都没取到(服务可能正在装卸中,稍后重试)。";
|
|
20
|
+
readonly partHistory: "历史消息";
|
|
21
|
+
readonly partToolResults: "工具结果";
|
|
22
|
+
readonly partToolDefs: "工具定义";
|
|
23
|
+
readonly partPersona: "人设";
|
|
24
|
+
readonly partMemorySummary: "对话摘要";
|
|
25
|
+
readonly partMemoryVector: "向量记忆";
|
|
26
|
+
readonly partSkills: "技能";
|
|
27
|
+
readonly partPlatform: "平台提示";
|
|
28
|
+
readonly partSubtask: "子任务";
|
|
29
|
+
readonly partSystemOther: "其余系统提示";
|
|
30
|
+
readonly llmLabel: "模型";
|
|
31
|
+
readonly llmDescription: "这个会话用的对话模型。没设时跟随服务偏好:给本插件设了 llm 的服务偏好时用它,否则用全局偏好,都没有时用第一个可用的对话模型";
|
|
32
|
+
readonly llmUnset: "跟随服务偏好";
|
|
33
|
+
readonly thinkLabel: "深度思考";
|
|
34
|
+
readonly thinkDescription: "可选的档位随所用的模型;没设或当前模型没有这一档时按模型的默认档";
|
|
35
|
+
readonly thinkUnset: "按模型的默认档";
|
|
36
|
+
readonly maxToolIterationsLabel: "最大工具迭代";
|
|
37
|
+
readonly maxToolIterationsDescription: "一轮里工具调用循环的最大次数;没设即不限,卡在工具调用里的一轮只能手动停下";
|
|
38
|
+
readonly maxToolIterationsUnset: "不限";
|
|
39
|
+
readonly historyLimitLabel: "历史条数上限";
|
|
40
|
+
readonly historyLimitDescription: "发给模型的会话历史不超过这么多条:超过时一次丢掉最早的一半,之后照常累积到这个条数再丢一段;丢掉的只是这一轮发给模型的,会话历史本身保留,压缩时照样进摘要。装了摘要插件时,会话的消息到这个条数就压缩。0 表示不按条数:发全部活跃历史,只按自动压缩线压缩";
|
|
41
|
+
readonly stopDescription: "停下本会话在跑的一轮;排着的消息照常开下一轮。参与这一轮的人和 owner 能停";
|
|
42
|
+
readonly stopped: "已停下这一轮";
|
|
43
|
+
readonly stopIdle: "没有在跑的一轮";
|
|
44
|
+
readonly stopDenied: "只有参与这一轮的人和 owner 能停";
|
|
45
|
+
readonly modelDescription: "列出/搜索可用对话模型。分页显示,-p 翻页;如 /model grok";
|
|
46
|
+
readonly personaDescription: "列出/搜索可用人设(分页,-p 翻页)";
|
|
47
|
+
readonly pageOptionDescription: "页码(默认 1)";
|
|
48
|
+
readonly modelsLabel: "可用模型";
|
|
49
|
+
readonly personasLabel: "可用人设";
|
|
50
|
+
readonly pagedNoMatch: "无匹配 \"{keyword}\" 的{label}";
|
|
51
|
+
readonly pagedNone: "(无{label})";
|
|
52
|
+
readonly pagedHeader: "{label}(共 {count, number} · 第 {page, number}/{pages, number} 页):";
|
|
53
|
+
readonly pagedHeaderMatching: "{label}(含\"{keyword}\" 共 {count, number} · 第 {page, number}/{pages, number} 页):";
|
|
54
|
+
readonly pagedHint: "—— 翻页:{command} -p {next} 搜索:{command} <关键词>";
|
|
55
|
+
readonly pagedHintMatching: "—— 翻页:{command} {keyword} -p {next}";
|
|
56
|
+
};
|
|
57
|
+
export type Source = typeof SOURCE;
|
|
58
|
+
export declare const t: import("@aalis/schema-i18n").TextFactory<{
|
|
59
|
+
readonly displayName: "默认 Agent";
|
|
60
|
+
readonly systemPromptLabel: "行为准则提示词";
|
|
61
|
+
readonly systemPromptDescription: "定义 Agent 的行为准则。当人设插件存在时,身份描述由人设提供,此处仅作为行为指令追加。";
|
|
62
|
+
readonly memoryTokenBudgetLabel: "长期记忆预留 Token";
|
|
63
|
+
readonly memoryTokenBudgetDescription: "注入的 system 消息(技能、摘要、记忆等)的 token 额度,只在硬裁剪丢完历史仍超预算时起作用:它们合计超过额度就按比例缩减,仍超时删除";
|
|
64
|
+
readonly promptBuildTimeoutMsLabel: "提示词贡献构建超时 (ms)";
|
|
65
|
+
readonly promptBuildTimeoutMsDescription: "单个 agent:prompt 贡献 build 的等待上限。挂死的构建(如网络检索卡住)超时后本轮缺席、其余照常,避免拖住每次 LLM 调用。0 表示不设限。";
|
|
66
|
+
readonly toolResultMaxRatioLabel: "工具结果最大比例";
|
|
67
|
+
readonly toolResultMaxRatioDescription: "单条工具结果占上下文窗口的最大比例 (0~1),超出则截断。例如 0.15 表示 15%";
|
|
68
|
+
readonly trimThresholdRatioLabel: "裁剪触发比例";
|
|
69
|
+
readonly trimThresholdRatioDescription: "裁剪预算 = 上下文长度 × 该比例 − 最大输出 token − 512 安全余量(下限 1024)。硬裁剪按它裁要发出的消息列表(只裁内存里的,不影响 DB):历史超过可用量(预算减去头部与四分之一预算)就成段丢,其余几步在估算超过预算时才做。默认 1.0 表示用满扣除输出预留后的可用窗口;调低可提前裁剪。压缩触发在会话设置里调:自动压缩线(摘要插件)与历史条数上限(本插件)。";
|
|
70
|
+
readonly systemNotice: "[系统] {why}";
|
|
71
|
+
readonly turnError: "[错误] {error}";
|
|
72
|
+
readonly llmNoneErrored: "未找到任何具备 chat 能力的 LLM —— 以下 LLM 插件激活失败:{plugins, list}。可用 /doctor 查看原因(需要相应权限)。";
|
|
73
|
+
readonly llmNone: "未找到任何具备 chat 能力的 LLM —— 请确认已安装并启用至少一个 LLM 提供者插件(如 @aalis/plugin-llm-deepseek)。";
|
|
74
|
+
readonly llmNotFound: "配置指向的模型不存在:{wanted}。当前可用:{models, list}{more}。";
|
|
75
|
+
readonly llmMore: " 等 {count, number} 个(用 /model 查看全部)";
|
|
76
|
+
readonly llmUnresolved: "LLM 解析失败:能力过滤后有 {count, number} 个可用 entry,但解析时一个都没取到(服务可能正在装卸中,稍后重试)。";
|
|
77
|
+
readonly partHistory: "历史消息";
|
|
78
|
+
readonly partToolResults: "工具结果";
|
|
79
|
+
readonly partToolDefs: "工具定义";
|
|
80
|
+
readonly partPersona: "人设";
|
|
81
|
+
readonly partMemorySummary: "对话摘要";
|
|
82
|
+
readonly partMemoryVector: "向量记忆";
|
|
83
|
+
readonly partSkills: "技能";
|
|
84
|
+
readonly partPlatform: "平台提示";
|
|
85
|
+
readonly partSubtask: "子任务";
|
|
86
|
+
readonly partSystemOther: "其余系统提示";
|
|
87
|
+
readonly llmLabel: "模型";
|
|
88
|
+
readonly llmDescription: "这个会话用的对话模型。没设时跟随服务偏好:给本插件设了 llm 的服务偏好时用它,否则用全局偏好,都没有时用第一个可用的对话模型";
|
|
89
|
+
readonly llmUnset: "跟随服务偏好";
|
|
90
|
+
readonly thinkLabel: "深度思考";
|
|
91
|
+
readonly thinkDescription: "可选的档位随所用的模型;没设或当前模型没有这一档时按模型的默认档";
|
|
92
|
+
readonly thinkUnset: "按模型的默认档";
|
|
93
|
+
readonly maxToolIterationsLabel: "最大工具迭代";
|
|
94
|
+
readonly maxToolIterationsDescription: "一轮里工具调用循环的最大次数;没设即不限,卡在工具调用里的一轮只能手动停下";
|
|
95
|
+
readonly maxToolIterationsUnset: "不限";
|
|
96
|
+
readonly historyLimitLabel: "历史条数上限";
|
|
97
|
+
readonly historyLimitDescription: "发给模型的会话历史不超过这么多条:超过时一次丢掉最早的一半,之后照常累积到这个条数再丢一段;丢掉的只是这一轮发给模型的,会话历史本身保留,压缩时照样进摘要。装了摘要插件时,会话的消息到这个条数就压缩。0 表示不按条数:发全部活跃历史,只按自动压缩线压缩";
|
|
98
|
+
readonly stopDescription: "停下本会话在跑的一轮;排着的消息照常开下一轮。参与这一轮的人和 owner 能停";
|
|
99
|
+
readonly stopped: "已停下这一轮";
|
|
100
|
+
readonly stopIdle: "没有在跑的一轮";
|
|
101
|
+
readonly stopDenied: "只有参与这一轮的人和 owner 能停";
|
|
102
|
+
readonly modelDescription: "列出/搜索可用对话模型。分页显示,-p 翻页;如 /model grok";
|
|
103
|
+
readonly personaDescription: "列出/搜索可用人设(分页,-p 翻页)";
|
|
104
|
+
readonly pageOptionDescription: "页码(默认 1)";
|
|
105
|
+
readonly modelsLabel: "可用模型";
|
|
106
|
+
readonly personasLabel: "可用人设";
|
|
107
|
+
readonly pagedNoMatch: "无匹配 \"{keyword}\" 的{label}";
|
|
108
|
+
readonly pagedNone: "(无{label})";
|
|
109
|
+
readonly pagedHeader: "{label}(共 {count, number} · 第 {page, number}/{pages, number} 页):";
|
|
110
|
+
readonly pagedHeaderMatching: "{label}(含\"{keyword}\" 共 {count, number} · 第 {page, number}/{pages, number} 页):";
|
|
111
|
+
readonly pagedHint: "—— 翻页:{command} -p {next} 搜索:{command} <关键词>";
|
|
112
|
+
readonly pagedHintMatching: "—— 翻页:{command} {keyword} -p {next}";
|
|
113
|
+
}>;
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=texts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DF,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAEnC,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAiG,CAAC"}
|