@aalis/plugin-tools 0.9.0 → 0.10.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.
@@ -0,0 +1,605 @@
1
+ // ════════════════════════════════════════════════════════════
2
+ // 后台任务:可转后台的工具调用(RegisteredTool.background)在前台等满让出时限还没结束,就登记成后台任务、先回给模型。
3
+ // 做在执行器一层,所有声明了的工具一样。登记表即 backgroundTasks 服务:可查、可取输出、可停;变化发 background:changed,
4
+ // 状态变了写进插件数据。正常结束(含失败)时向起它的会话注入一条宿主通知,身份取起它的那次调用。
5
+ // ════════════════════════════════════════════════════════════
6
+ import { isStorageNotFound } from '@aalis/api-storage';
7
+ import { BACKGROUND_TASK_NOTICE, integerIn, toolFailed, } from '@aalis/api-tools';
8
+ import { truncateChars } from '@aalis/util-text-normalize';
9
+ /** 让出时限的缺省(秒),工具可以声明自己的 */
10
+ export const DEFAULT_YIELD_SECONDS = 30;
11
+ /** 两项上限的缺省,插件配置的默认值取这里 */
12
+ export const DEFAULT_LIMITS = { maxWaitSeconds: 600, maxPerSession: 4 };
13
+ /** 每次调用的输出缓冲只留末尾这么多字;一次调用推给界面的总量也不超过它 */
14
+ const OUTPUT_LIMIT = 64 * 1024;
15
+ /** 转后台时回给模型的已有输出的末尾 */
16
+ const YIELD_TAIL = 2000;
17
+ /** 找最后一行时只看输出的末尾这么多字 */
18
+ const LINE_SCAN = 1024;
19
+ /** 每个会话留最近多少条结束的 */
20
+ const MAX_ENDED_PER_SESSION = 20;
21
+ /** 停止后等落定的宽限:进程服务的中止契约在宽限后整组强制结束(2 秒),再留 1 秒收尾 */
22
+ const STOP_GRACE_MS = 3000;
23
+ /** 失败原因最多多少字 */
24
+ const REASON_MAX = 200;
25
+ const NOTICE_SOURCE_PREFIX = 'bg:';
26
+ /** 私有目录下的后台任务登记 */
27
+ const STORE = 'background-tasks.json';
28
+ const RESTART_REASON = 'Aalis 重启时还在跑';
29
+ const CLOSED_REASON = '工具注册表停用时还在跑';
30
+ const STATUSES = new Set([
31
+ 'running',
32
+ 'completed',
33
+ 'failed',
34
+ 'stopped',
35
+ 'aborted',
36
+ ]);
37
+ /** 调用的有效授权身份,与 authority 守卫同一口径。没有 actor 也没有 userId 时 userId 为空串,即无主体 */
38
+ function identityOf(ctx) {
39
+ return ctx.actor ?? { platform: ctx.platform ?? '', userId: ctx.userId ?? '' };
40
+ }
41
+ /** 对话回合里的调用:有 turnId 与 callId,转到后台后有可以通知的对话 */
42
+ export function inTurn(ctx) {
43
+ return ctx.turnId !== undefined && ctx.callId !== undefined;
44
+ }
45
+ /** text 的末尾 n 字,不从代理对中间切开 */
46
+ function tailOf(text, n) {
47
+ if (text.length <= n)
48
+ return text;
49
+ const cut = text.length - n;
50
+ const code = text.charCodeAt(cut);
51
+ return text.slice(code >= 0xdc00 && code <= 0xdfff ? cut + 1 : cut);
52
+ }
53
+ /** 用时:不到 1 秒、N 秒、M 分 S 秒、H 小时 M 分 */
54
+ function formatDuration(ms) {
55
+ const s = Math.floor(ms / 1000);
56
+ if (s < 1)
57
+ return '不到 1 秒';
58
+ if (s < 60)
59
+ return `${s} 秒`;
60
+ if (s < 3600)
61
+ return `${Math.floor(s / 60)} 分 ${s % 60} 秒`;
62
+ return `${Math.floor(s / 3600)} 小时 ${Math.floor((s % 3600) / 60)} 分`;
63
+ }
64
+ const iso = (at) => new Date(at).toISOString();
65
+ /** 给模型看的任务:时刻写成 ISO 字符串,不带参数与结果 */
66
+ export function viewOf(task) {
67
+ return {
68
+ taskId: task.id,
69
+ tool: task.label,
70
+ status: task.status,
71
+ startedAt: iso(task.startedAt),
72
+ ...(task.endedAt !== undefined ? { endedAt: iso(task.endedAt) } : {}),
73
+ ...(task.lastLine !== undefined ? { lastLine: task.lastLine } : {}),
74
+ ...(task.lastOutputAt !== undefined ? { lastOutputAt: iso(task.lastOutputAt) } : {}),
75
+ ...(task.reason !== undefined ? { reason: task.reason } : {}),
76
+ ...(task.exitCode !== undefined ? { exitCode: task.exitCode } : {}),
77
+ };
78
+ }
79
+ /** 一次调用的输出缓冲:只留末尾 OUTPUT_LIMIT 字,记至今的总字数、最后一行与最后输出的时刻 */
80
+ class OutputTail {
81
+ /** 输出的末尾:超出两倍上限才整段收回,免得每次写都复制整块缓冲 */
82
+ kept = '';
83
+ /** 还没收尾的那一行(末尾 LINE_SCAN 字) */
84
+ partial = '';
85
+ /** 至今的输出总字数 */
86
+ end = 0;
87
+ lastLine;
88
+ lastAt;
89
+ get text() {
90
+ return tailOf(this.kept, OUTPUT_LIMIT);
91
+ }
92
+ append(chunk, at) {
93
+ this.kept += chunk;
94
+ if (this.kept.length > 2 * OUTPUT_LIMIT)
95
+ this.kept = tailOf(this.kept, OUTPUT_LIMIT);
96
+ this.end += chunk.length;
97
+ this.lastAt = at;
98
+ // 进度条用回车改写同一行:回车与换行都算行尾
99
+ const lines = (this.partial + chunk).split(/[\r\n]/);
100
+ this.partial = tailOf(lines.pop() ?? '', LINE_SCAN);
101
+ const line = [...lines, this.partial]
102
+ .map(segment => tailOf(segment, LINE_SCAN).trim())
103
+ .filter(Boolean)
104
+ .at(-1);
105
+ if (line)
106
+ this.lastLine = line;
107
+ }
108
+ since(after = 0) {
109
+ const text = this.text;
110
+ const start = this.end - text.length;
111
+ const from = Math.min(after, this.end);
112
+ return { text: text.slice(Math.max(from - start, 0)), end: this.end, truncated: from < start };
113
+ }
114
+ }
115
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
116
+ const optionalOf = (value, type) => typeof value === type ? value : undefined;
117
+ /** 读回的一条:形状不对的没有 */
118
+ function parseStored(value) {
119
+ if (!isRecord(value))
120
+ return undefined;
121
+ const { id, sessionId, kind, label, call, status, startedAt } = value;
122
+ if (typeof id !== 'string' || typeof sessionId !== 'string' || kind !== 'tool-call' || typeof label !== 'string') {
123
+ return undefined;
124
+ }
125
+ if (!STATUSES.has(status) || typeof startedAt !== 'number')
126
+ return undefined;
127
+ if (!isRecord(call) ||
128
+ typeof call.tool !== 'string' ||
129
+ !isRecord(call.args) ||
130
+ typeof call.turnId !== 'string' ||
131
+ typeof call.callId !== 'string') {
132
+ return undefined;
133
+ }
134
+ const endedAt = optionalOf(value.endedAt, 'number');
135
+ const lastLine = optionalOf(value.lastLine, 'string');
136
+ const lastOutputAt = optionalOf(value.lastOutputAt, 'number');
137
+ const reason = optionalOf(value.reason, 'string');
138
+ const exitCode = Number.isInteger(value.exitCode) ? value.exitCode : undefined;
139
+ return {
140
+ id,
141
+ sessionId,
142
+ kind,
143
+ label,
144
+ call: { tool: call.tool, args: call.args, turnId: call.turnId, callId: call.callId },
145
+ status: status,
146
+ startedAt,
147
+ ...(endedAt !== undefined ? { endedAt } : {}),
148
+ ...(lastLine !== undefined ? { lastLine } : {}),
149
+ ...(lastOutputAt !== undefined ? { lastOutputAt } : {}),
150
+ ...(reason !== undefined ? { reason } : {}),
151
+ ...(exitCode !== undefined ? { exitCode } : {}),
152
+ };
153
+ }
154
+ /** 结果里的 error 写成一句原因;结果不是 JSON 对象或没有 error 时没有 */
155
+ function errorOf(content) {
156
+ try {
157
+ const error = Reflect.get(JSON.parse(content), 'error');
158
+ if (error === undefined)
159
+ return undefined;
160
+ return truncateChars(typeof error === 'string' ? error : JSON.stringify(error), REASON_MAX, '…');
161
+ }
162
+ catch {
163
+ return undefined;
164
+ }
165
+ }
166
+ /** 等 promise 落定,最多等 ms,中止信号到达即返回 */
167
+ function within(promise, ms, signal) {
168
+ return new Promise(resolve => {
169
+ const done = () => {
170
+ clearTimeout(timer);
171
+ signal?.removeEventListener('abort', done);
172
+ resolve();
173
+ };
174
+ const timer = setTimeout(done, ms);
175
+ signal?.addEventListener('abort', done, { once: true });
176
+ if (signal?.aborted)
177
+ done();
178
+ void promise.then(done);
179
+ });
180
+ }
181
+ /** 等调用落定,最多等 ms;中止信号到达后不再计时、只等落定:被中止的调用不转后台 */
182
+ function settleWithin(promise, ms, signal) {
183
+ return new Promise(resolve => {
184
+ const stopTimer = () => clearTimeout(timer);
185
+ const timer = setTimeout(() => {
186
+ signal.removeEventListener('abort', stopTimer);
187
+ resolve(undefined);
188
+ }, ms);
189
+ signal.addEventListener('abort', stopTimer, { once: true });
190
+ void promise.then(value => {
191
+ stopTimer();
192
+ signal.removeEventListener('abort', stopTimer);
193
+ resolve({ value });
194
+ });
195
+ });
196
+ }
197
+ /**
198
+ * 后台任务登记与可转后台调用的运行。执行器(ToolRegistry)经它占位置、跑调用、撤回;四个后台任务工具经它查、取输出、
199
+ * 等待与停止;插件把会话删除、停机、停用与存储接到它上面
200
+ */
201
+ export class BackgroundTasks {
202
+ limits;
203
+ logger;
204
+ events;
205
+ records = new Map();
206
+ /** 占着位置的可转后台调用:从过守卫之前到落定 */
207
+ calls = new Set();
208
+ /** 本次运行的标识:任务 id 带上它,与读回的旧 id 不撞号 */
209
+ runTag = crypto.randomUUID().slice(0, 6);
210
+ counter = 0;
211
+ /** 读回成功之后才写盘;读不出来时本次运行只记在内存里,不覆盖原文件 */
212
+ storage;
213
+ writing = Promise.resolve();
214
+ /** 已排上、还没开始的一次写:之后的变化由它一并写入 */
215
+ writeQueued = false;
216
+ /** 收到 app:stopping 之后:不再通知 */
217
+ shuttingDown = false;
218
+ constructor(deps) {
219
+ this.logger = deps.logger;
220
+ this.events = deps.events;
221
+ this.limits = deps.limits;
222
+ }
223
+ // ---- 服务 ----
224
+ list(filter) {
225
+ return [...this.records.values()]
226
+ .filter(record => filter?.sessionId === undefined || record.task.sessionId === filter.sessionId)
227
+ .map(record => ({ ...record.task }));
228
+ }
229
+ output(id, after) {
230
+ return this.records.get(id)?.output.since(after);
231
+ }
232
+ async stop(id) {
233
+ const record = this.records.get(id);
234
+ if (!record)
235
+ return undefined;
236
+ const call = record.call;
237
+ if (call) {
238
+ call.stopRequested = true;
239
+ call.controller.abort();
240
+ await within(record.ended, STOP_GRACE_MS);
241
+ }
242
+ return { ...record.task };
243
+ }
244
+ // ---- 后台任务工具 ----
245
+ /** 等这些任务都落定,最多等 ms,中止信号到达即返回 */
246
+ wait(ids, ms, signal) {
247
+ return within(Promise.all(ids.flatMap(id => this.records.get(id)?.ended ?? [])), ms, signal);
248
+ }
249
+ // ---- 执行器 ----
250
+ /** 不可转后台的调用的输出口:有 turnId 与 callId 时转成 tool:output */
251
+ outputFor(ctx) {
252
+ let sent = 0;
253
+ return text => {
254
+ this.stream(ctx, text, sent);
255
+ sent += text.length;
256
+ };
257
+ }
258
+ /**
259
+ * 占一个位置。同一会话里对话回合中在跑的可转后台调用(前台与后台一起数,等审批的也算)满了时,回拒绝的结果(JSON),
260
+ * 列出这个会话在跑的后台任务,不执行、不过守卫。不在回合里的调用不会转后台,不占名额、不受上限挡
261
+ */
262
+ admit(ctx, owner, plan) {
263
+ const counted = inTurn(ctx);
264
+ const inSession = [...this.calls].filter(call => call.inTurn && call.sessionId === ctx.sessionId);
265
+ if (counted && inSession.length >= this.limits.maxPerSession) {
266
+ return JSON.stringify({
267
+ error: `这个会话里已有 ${inSession.length} 个可转后台的工具调用在跑(上限 ${this.limits.maxPerSession},前台与后台一起数),` +
268
+ '先等待或停掉一个',
269
+ running: this.list({ sessionId: ctx.sessionId })
270
+ .filter(task => task.status === 'running')
271
+ .map(viewOf),
272
+ });
273
+ }
274
+ const call = {
275
+ sessionId: ctx.sessionId,
276
+ inTurn: counted,
277
+ owner,
278
+ plan,
279
+ controller: new AbortController(),
280
+ output: new OutputTail(),
281
+ };
282
+ this.calls.add(call);
283
+ return call;
284
+ }
285
+ /** 占了位置却没执行(守卫拒绝、回合已中止):放回去 */
286
+ release(call) {
287
+ this.calls.delete(call);
288
+ }
289
+ /**
290
+ * 跑一次占到位置、过了守卫的可转后台调用。让出时限从这里算起,前台时回合中止一并中止它。到时没结束或要求立即转后台:
291
+ * 对话回合里的调用登记成后台任务、摘掉与回合的联动,先回给模型任务 id 与已有输出的末尾;不在对话回合里的(没有 turnId 或 callId,
292
+ * 没有可通知的对话)中止并回报已有输出
293
+ */
294
+ async run(call, spec) {
295
+ const { ctx } = spec;
296
+ const { signal } = call.controller;
297
+ const onTurnAbort = () => call.controller.abort(ctx.signal?.reason);
298
+ ctx.signal?.addEventListener('abort', onTurnAbort, { once: true });
299
+ const unlink = () => ctx.signal?.removeEventListener('abort', onTurnAbort);
300
+ const startedAt = Date.now();
301
+ const settled = spec.invoke({ ...ctx, signal, output: text => this.write(call, ctx, text) });
302
+ void settled.then(() => this.calls.delete(call));
303
+ const { waitSeconds, immediate } = call.plan;
304
+ if (!immediate) {
305
+ const finished = await settleWithin(settled, waitSeconds * 1000, signal);
306
+ if (finished) {
307
+ unlink();
308
+ return finished.value;
309
+ }
310
+ }
311
+ unlink();
312
+ if (!inTurn(ctx)) {
313
+ call.controller.abort();
314
+ await within(settled, STOP_GRACE_MS);
315
+ return this.yielded(call, {
316
+ error: `${waitSeconds} 秒内没有结束,已中止;要多等就给 waitSeconds`,
317
+ });
318
+ }
319
+ const record = this.register(call, spec, { turnId: ctx.turnId, callId: ctx.callId, startedAt });
320
+ void settled.then(result => this.finish(record, result, spec.display));
321
+ return this.yielded(call, {
322
+ taskId: record.task.id,
323
+ status: 'running',
324
+ message: record.notice
325
+ ? '已转到后台,结束时会通知你;不必等它,可以先回复。'
326
+ : '已转到后台。这一轮由后台任务的结束通知开启,它结束时不再通知;用 background_wait 等它或用 background_output 查看。',
327
+ });
328
+ }
329
+ /** 工具撤回登记(所属插件停用):这个登记在跑的调用一并中止,后台的落成 aborted */
330
+ withdraw(owner, name) {
331
+ this.abortWhere(call => call.owner === owner, `工具 ${name} 已撤回登记`);
332
+ }
333
+ // ---- 插件接线 ----
334
+ /**
335
+ * 读回插件数据里的登记:还在跑的落成 aborted(重启时还在跑),每个会话留最近的结束的,与读回之前起的任务并存,之后状态
336
+ * 变了就写。文件不存在按没有记录起步;内容读不懂告警后同样起步,下次写盘时覆盖;读不出来(权限、存储不可用)告警,
337
+ * 本次运行只记在内存里,不覆盖它
338
+ */
339
+ async restore(storage) {
340
+ const where = storage.uri(STORE);
341
+ let text;
342
+ try {
343
+ text = String(await storage.readFile(STORE, 'utf8'));
344
+ }
345
+ catch (err) {
346
+ if (!isStorageNotFound(err)) {
347
+ this.logger.warn(`后台任务登记 ${where} 读不出来,本次运行只记在内存里,不覆盖它:`, err);
348
+ return;
349
+ }
350
+ }
351
+ this.storage = storage;
352
+ if (text !== undefined)
353
+ this.adopt(text, where);
354
+ this.persist();
355
+ }
356
+ /** 会话删除:停掉它的调用与任务、删掉登记,不通知 */
357
+ deleteSession(sessionId) {
358
+ for (const call of this.calls)
359
+ if (call.sessionId === sessionId)
360
+ call.controller.abort();
361
+ const records = [...this.records.values()].filter(record => record.task.sessionId === sessionId);
362
+ if (records.length === 0)
363
+ return;
364
+ for (const record of records)
365
+ this.remove(record);
366
+ this.logger.info(`会话 ${sessionId} 已删除,删掉它的 ${records.length} 个后台任务`);
367
+ this.persist();
368
+ }
369
+ /** 收到 app:stopping:此后结束的不通知 */
370
+ shutdown() {
371
+ this.shuttingDown = true;
372
+ }
373
+ /** 停用(收尾):在跑的调用一并中止,后台的落成 aborted,等写盘落定 */
374
+ async close() {
375
+ this.abortWhere(() => true, this.shuttingDown ? RESTART_REASON : CLOSED_REASON);
376
+ await this.writing;
377
+ }
378
+ // ---- 内部 ----
379
+ /**
380
+ * 推给界面:有 turnId 与 callId 时转成 tool:output。sent 是这次调用此前写过的字数,推出的总量不超过 OUTPUT_LIMIT:
381
+ * 界面按条目累加输出,前台最多要等 maxWaitSeconds,持续大量输出的命令不能把它撑满
382
+ */
383
+ stream(ctx, text, sent) {
384
+ const room = OUTPUT_LIMIT - sent;
385
+ if (room <= 0 || !inTurn(ctx))
386
+ return;
387
+ const chunk = truncateChars(text, room);
388
+ const { sessionId, turnId, callId } = ctx;
389
+ if (chunk)
390
+ void this.events.emit('tool:output', { sessionId, turnId, callId, text: chunk });
391
+ }
392
+ /** 可转后台的调用写输出:进缓冲;在前台时转成 tool:output,转后台之后更新任务的最后一行 */
393
+ write(call, ctx, text) {
394
+ if (!text)
395
+ return;
396
+ const sent = call.output.end;
397
+ call.output.append(text, Date.now());
398
+ const record = call.record;
399
+ if (!record) {
400
+ this.stream(ctx, text, sent);
401
+ return;
402
+ }
403
+ if (record.call !== call)
404
+ return;
405
+ record.task.lastLine = call.output.lastLine;
406
+ record.task.lastOutputAt = call.output.lastAt;
407
+ this.changed(record);
408
+ }
409
+ yielded(call, fields) {
410
+ const tail = tailOf(call.output.text, YIELD_TAIL);
411
+ return { content: JSON.stringify({ ...fields, ...(tail ? { output: tail } : {}) }) };
412
+ }
413
+ register(call, spec, at) {
414
+ const { ctx } = spec;
415
+ let markEnded = () => { };
416
+ const ended = new Promise(resolve => {
417
+ markEnded = resolve;
418
+ });
419
+ const chained = ctx.inbound?.source?.startsWith(NOTICE_SOURCE_PREFIX) === true;
420
+ const { lastLine, lastAt } = call.output;
421
+ const record = {
422
+ task: {
423
+ id: `bg_${this.runTag}_${++this.counter}`,
424
+ sessionId: ctx.sessionId,
425
+ kind: 'tool-call',
426
+ label: spec.tool,
427
+ call: { tool: spec.tool, args: spec.args, turnId: at.turnId, callId: at.callId },
428
+ status: 'running',
429
+ startedAt: at.startedAt,
430
+ ...(lastLine !== undefined ? { lastLine } : {}),
431
+ ...(lastAt !== undefined ? { lastOutputAt: lastAt } : {}),
432
+ },
433
+ output: call.output,
434
+ // 身份跟链源头:platform、actor 与 callerUserId 都取这次调用,通知回合的权限不高于它
435
+ ...(chained
436
+ ? {}
437
+ : {
438
+ notice: {
439
+ platform: ctx.platform ?? 'unknown',
440
+ actor: identityOf(ctx),
441
+ ...(ctx.userId !== undefined ? { callerUserId: ctx.userId } : {}),
442
+ ...(ctx.inbound?.messageId !== undefined ? { replyTo: ctx.inbound.messageId } : {}),
443
+ },
444
+ }),
445
+ call,
446
+ ended,
447
+ markEnded,
448
+ };
449
+ call.record = record;
450
+ this.records.set(record.task.id, record);
451
+ this.logger.debug(`工具 ${spec.tool} 的调用转到后台: ${record.task.id}`);
452
+ this.changed(record);
453
+ this.persist();
454
+ return record;
455
+ }
456
+ /**
457
+ * 后台任务的调用落定:按结局落成 completed、failed 或 stopped,记下结果与命令的退出码;失败的原因只取结果里的 error。
458
+ * 正常结束(含失败)的通知起它的会话
459
+ */
460
+ finish(record, result, display) {
461
+ const call = record.call;
462
+ // 已经落成 aborted(撤回、停用)或随会话删掉的不再改
463
+ if (!call || this.records.get(record.task.id) !== record)
464
+ return;
465
+ const exitCode = display?.kind === 'command' && display.result ? integerIn(result.content, display.result.exitCode) : undefined;
466
+ const ending = { result, ...(exitCode !== undefined ? { exitCode } : {}) };
467
+ if (call.stopRequested) {
468
+ this.land(record, 'stopped', ending);
469
+ return;
470
+ }
471
+ const status = toolFailed(result.content, exitCode) ? 'failed' : 'completed';
472
+ const reason = status === 'failed' ? errorOf(result.content) : undefined;
473
+ this.land(record, status, { ...ending, ...(reason !== undefined ? { reason } : {}) });
474
+ if (record.notice && !this.shuttingDown)
475
+ this.notify(record, status, record.notice);
476
+ }
477
+ land(record, status, fields) {
478
+ Object.assign(record.task, { status, endedAt: Date.now(), ...fields });
479
+ record.call = undefined;
480
+ record.markEnded();
481
+ this.changed(record);
482
+ this.prune(record.task.sessionId);
483
+ this.persist();
484
+ }
485
+ abortWhere(match, reason) {
486
+ for (const call of this.calls) {
487
+ if (!match(call))
488
+ continue;
489
+ call.controller.abort();
490
+ if (call.record?.call === call)
491
+ this.land(call.record, 'aborted', { reason });
492
+ }
493
+ }
494
+ remove(record) {
495
+ this.records.delete(record.task.id);
496
+ record.markEnded();
497
+ void this.events.emit('background:changed', { removed: record.task.id, sessionId: record.task.sessionId });
498
+ }
499
+ /** 每个会话留在跑的与最近 MAX_ENDED_PER_SESSION 条结束的 */
500
+ prune(sessionId) {
501
+ const ended = [...this.records.values()].filter(record => record.task.sessionId === sessionId && record.task.status !== 'running');
502
+ if (ended.length <= MAX_ENDED_PER_SESSION)
503
+ return;
504
+ ended.sort((a, b) => (a.task.endedAt ?? a.task.startedAt) - (b.task.endedAt ?? b.task.startedAt));
505
+ for (const record of ended.slice(0, ended.length - MAX_ENDED_PER_SESSION))
506
+ this.remove(record);
507
+ }
508
+ changed(record) {
509
+ void this.events.emit('background:changed', { task: { ...record.task } });
510
+ }
511
+ /**
512
+ * 结束通知只放宿主取得的事实:任务 id、工具名、结局与退出码、用时,正文写给模型,同样的事实另给界面。参数由模型写出
513
+ * (可能受过注入),输出与结果受外部内容左右,都不进通知(通知以 system 呈现且会归档);它们由模型用 background_output 取,
514
+ * 以 tool 角色进上下文。只有正常结束(completed、failed)的通知
515
+ */
516
+ notify({ task }, status, target) {
517
+ const durationMs = (task.endedAt ?? task.startedAt) - task.startedAt;
518
+ const { exitCode } = task;
519
+ const ending = status === 'completed'
520
+ ? '已完成'
521
+ : exitCode !== undefined && exitCode !== 0
522
+ ? `失败:退出码 ${exitCode}`
523
+ : '失败';
524
+ const facts = {
525
+ tool: task.label,
526
+ status,
527
+ durationMs,
528
+ ...(exitCode !== undefined ? { exitCode } : {}),
529
+ };
530
+ const message = {
531
+ content: `后台任务 ${task.id}(${task.label})${ending},用时 ${formatDuration(durationMs)}。结果与输出用 background_output 查看。`,
532
+ sessionId: task.sessionId,
533
+ platform: target.platform,
534
+ source: `${NOTICE_SOURCE_PREFIX}${task.id}`,
535
+ actor: target.actor,
536
+ hostNotice: {
537
+ kind: BACKGROUND_TASK_NOTICE,
538
+ id: task.id,
539
+ ...(target.callerUserId !== undefined ? { callerUserId: target.callerUserId } : {}),
540
+ ...(target.replyTo !== undefined ? { replyTo: target.replyTo } : {}),
541
+ facts,
542
+ },
543
+ };
544
+ this.logger.info(`后台任务 ${task.id} 已结束,结束通知注入会话 ${task.sessionId}`);
545
+ this.events.emit('inbound:message', message).catch(err => {
546
+ this.logger.warn(`后台任务 ${task.id} 的结束通知注入失败,不重试: ${err instanceof Error ? err.message : String(err)}`);
547
+ });
548
+ }
549
+ /** 并进读回的登记:读回之前起的任务照留,id 相同的以内存为准 */
550
+ adopt(text, where) {
551
+ let entries;
552
+ try {
553
+ const parsed = JSON.parse(text);
554
+ if (!isRecord(parsed) || !Array.isArray(parsed.tasks))
555
+ throw new Error('顶层不是 { tasks: [...] }');
556
+ entries = parsed.tasks;
557
+ }
558
+ catch (err) {
559
+ this.logger.warn(`后台任务登记 ${where} 读不懂,按没有记录起步,下次写盘时覆盖:`, err);
560
+ return;
561
+ }
562
+ let dropped = 0;
563
+ const sessions = new Set();
564
+ for (const entry of entries) {
565
+ const task = parseStored(entry);
566
+ if (!task || this.records.has(task.id)) {
567
+ dropped++;
568
+ continue;
569
+ }
570
+ if (task.status === 'running') {
571
+ Object.assign(task, {
572
+ status: 'aborted',
573
+ reason: RESTART_REASON,
574
+ endedAt: task.lastOutputAt ?? task.startedAt,
575
+ });
576
+ }
577
+ const record = { task, output: new OutputTail(), ended: Promise.resolve(), markEnded: () => { } };
578
+ this.records.set(task.id, record);
579
+ sessions.add(task.sessionId);
580
+ this.changed(record);
581
+ }
582
+ if (dropped > 0)
583
+ this.logger.warn(`后台任务登记 ${where} 里有 ${dropped} 条读不懂,已丢掉`);
584
+ for (const sessionId of sessions)
585
+ this.prune(sessionId);
586
+ }
587
+ /** 写盘排队:整份写入,只记字段,不记起它的身份、输出与结果;已排上、还没开始的那次写会带上之后的变化 */
588
+ persist() {
589
+ const storage = this.storage;
590
+ if (!storage || this.writeQueued)
591
+ return;
592
+ this.writeQueued = true;
593
+ this.writing = this.writing.then(async () => {
594
+ this.writeQueued = false;
595
+ const tasks = [...this.records.values()].map(({ task: { result: _result, ...fields } }) => fields);
596
+ try {
597
+ await storage.writeFile(STORE, JSON.stringify({ tasks }));
598
+ }
599
+ catch (err) {
600
+ this.logger.warn(`后台任务登记写入 ${storage.uri(STORE)} 失败,下次状态变了再写:`, err);
601
+ }
602
+ });
603
+ }
604
+ }
605
+ //# sourceMappingURL=background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background.js","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,14 @@
1
1
  declare const _default: import("@aalis/core").PluginDefinition<{
2
2
  logger: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Logger, import("@aalis/core").Logger>;
3
3
  provide: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Provide, import("@aalis/core").Provide>;
4
+ /** 后台任务的 tool:output、background:changed 与结束通知;会话删除与停机 */
5
+ events: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Events, import("@aalis/core").Events>;
6
+ lifecycle: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").LifecycleCap, import("@aalis/core").LifecycleCap>;
7
+ config: import("@aalis/core").ServiceDescriptor<(identity: symbol) => Readonly<Record<string, unknown>>, Readonly<Record<string, unknown>>>;
8
+ /** 会话设置项「工具分组」登记在会话管理上;没有会话管理时各会话只拿到不属于任何分组的工具 */
9
+ sessionManager: import("@aalis/core").OptionalUse<import("@aalis/api-session-manager").SessionManagerService, import("@aalis/api-session-manager").BoundSessionManager>;
10
+ /** 后台任务登记写进插件数据;没有时只记在内存里 */
11
+ storage: import("@aalis/core").OptionalUse<import("@aalis/api-storage").StorageService, import("@aalis/api-storage").BoundStorage>;
4
12
  }>;
5
13
  export default _default;
6
14
  //# sourceMappingURL=index.d.ts.map