@aalis/plugin-persona 0.1.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/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @aalis/plugin-persona
2
+
3
+ 运行时插件
4
+
5
+ ## 角色
6
+
7
+ 运行时插件
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ pnpm add @aalis/plugin-persona
13
+ ```
14
+
15
+ ## 文档
16
+
17
+ 详见 [docs/plugins/plugin-persona.md](../../docs/plugins/plugin-persona.md)。
18
+
19
+ ## 许可
20
+
21
+ 见仓库根目录 LICENSE。
@@ -0,0 +1,21 @@
1
+ import type { ConfigSchema, Context } from '@aalis/core';
2
+ import '@aalis/plugin-agent-api';
3
+ import '@aalis/plugin-memory-api';
4
+ export type { OutputFormat, OutputFormatField, PersonaService, PersonaSessionOptions } from '@aalis/plugin-persona-api';
5
+ export declare const name = "@aalis/plugin-persona";
6
+ export declare const displayName = "\u4EBA\u8BBE\u7CFB\u7EDF";
7
+ export declare const subsystem = "persona";
8
+ export declare const provides: string[];
9
+ export declare const inject: {
10
+ optional: string[];
11
+ };
12
+ export declare const configSchema: ConfigSchema;
13
+ export declare const defaultConfig: {
14
+ persona: string;
15
+ personasDir: string;
16
+ statePersistence: boolean;
17
+ timeInjection: boolean;
18
+ timeZone: string;
19
+ };
20
+ export declare function apply(ctx: Context, config: Record<string, unknown>): Promise<void>;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOzD,OAAO,yBAAyB,CAAC;AACjC,OAAO,0BAA0B,CAAC;AAElC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAqBxH,eAAO,MAAM,IAAI,0BAA0B,CAAC;AAC5C,eAAO,MAAM,WAAW,6BAAS,CAAC;AAClC,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,QAAQ,UAAc,CAAC;AACpC,eAAO,MAAM,MAAM;;CAElB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAgC1B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;CAMzB,CAAC;AAsXF,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2axF"}
package/dist/index.js ADDED
@@ -0,0 +1,783 @@
1
+ import { getPlatformSelfIdentity } from '@aalis/plugin-platform-api';
2
+ import { createStorageGateway } from '@aalis/plugin-storage-api';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { extractJsonCandidate, tryParseJsonObject } from './json-repair.js';
5
+ import '@aalis/plugin-agent-api';
6
+ import '@aalis/plugin-memory-api';
7
+ // ===== 插件元数据 =====
8
+ export const name = '@aalis/plugin-persona';
9
+ export const displayName = '人设系统';
10
+ export const subsystem = 'persona';
11
+ export const provides = ['persona'];
12
+ export const inject = {
13
+ optional: ['platform'],
14
+ };
15
+ export const configSchema = {
16
+ persona: {
17
+ type: 'select',
18
+ label: '人设',
19
+ description: '人设文件名(不含后缀)',
20
+ default: 'default',
21
+ dynamicOptions: 'persona',
22
+ },
23
+ personasDir: {
24
+ type: 'string',
25
+ label: '人设目录',
26
+ description: '存放人设文件的目录路径(相对于项目根目录)',
27
+ default: 'data/personas',
28
+ },
29
+ statePersistence: {
30
+ type: 'boolean',
31
+ label: '状态持久化',
32
+ description: '启用后,角色状态(心情、当前行为等 outputFormat 字段)会在同一会话内延续并注入到下一轮提示中',
33
+ default: false,
34
+ },
35
+ timeInjection: {
36
+ type: 'boolean',
37
+ label: '时间注入',
38
+ description: '启用后,当前时间会自动注入到系统提示中',
39
+ default: true,
40
+ },
41
+ timeZone: {
42
+ type: 'string',
43
+ label: '时区 (IANA)',
44
+ description: '例如 Asia/Shanghai、Europe/London、America/New_York。留空使用系统本地时区。',
45
+ default: '',
46
+ },
47
+ };
48
+ export const defaultConfig = {
49
+ persona: 'default',
50
+ personasDir: 'data/personas',
51
+ statePersistence: false,
52
+ timeInjection: true,
53
+ timeZone: '',
54
+ };
55
+ // ===== 实现 =====
56
+ class PersonaServiceImpl {
57
+ card;
58
+ _outputFormat;
59
+ fileName;
60
+ statePersistence;
61
+ timeInjection;
62
+ timeZone;
63
+ /** 按名称缓存的角色卡(由启动扫描 + watch 预填) */
64
+ cardCache = new Map();
65
+ /** 按名称缓存的 OutputFormat */
66
+ formatCache = new Map();
67
+ /** 启动后扫描到的角色名称(用于 listModels,由启动 + watch 维护) */
68
+ knownNames = new Set();
69
+ /** 每个 session 的持久化状态 */
70
+ sessionStates = new Map();
71
+ /** 当前正在处理的 sessionId(由 agent:input:before 中间件设置) */
72
+ currentSessionId;
73
+ /** 当前平台 */
74
+ currentPlatform;
75
+ /** 当前会话类型 */
76
+ currentSessionType;
77
+ /** 当前平台上的自身账号 ID */
78
+ currentSelfId;
79
+ /** 当前平台上的自身账号昵称 */
80
+ currentSelfNickname;
81
+ /** 当前消息发送者 ID */
82
+ currentUserId;
83
+ /** 当前消息发送者昵称 */
84
+ currentNickname;
85
+ /** 当前群名称(仅群聊时可用) */
86
+ currentGroupName;
87
+ /** 当前群中 self 账号的角色(owner/admin/member),仅群聊有效 */
88
+ currentSelfRole;
89
+ /** 当前群中 self 账号的专属头衔,仅群聊有效 */
90
+ currentSelfTitle;
91
+ /** 当前群中消息发送者的角色,仅群聊有效 */
92
+ currentSenderRole;
93
+ /** 当前群中消息发送者的专属头衔,仅群聊有效 */
94
+ currentSenderTitle;
95
+ constructor(card, _searchUris, fileName, options) {
96
+ this.card = card;
97
+ this.fileName = fileName;
98
+ this.statePersistence = options.statePersistence;
99
+ this.timeInjection = options.timeInjection;
100
+ this.timeZone = options.timeZone;
101
+ // 解析基础 outputFormat
102
+ if (card.outputFormat) {
103
+ this._outputFormat = PersonaServiceImpl.parseRawOutputFormat(card.outputFormat, card.outputFormatRetries);
104
+ }
105
+ }
106
+ /** 给外部调用:启动时预填 cache(代替原 sync 按需读盘) */
107
+ setCardCacheEntry(name, card) {
108
+ if (card) {
109
+ this.cardCache.set(name, card);
110
+ this.knownNames.add(name);
111
+ }
112
+ else {
113
+ this.cardCache.set(name, null);
114
+ this.knownNames.delete(name);
115
+ }
116
+ this.formatCache.delete(name);
117
+ }
118
+ removeCardCacheEntry(name) {
119
+ this.cardCache.delete(name);
120
+ this.formatCache.delete(name);
121
+ this.knownNames.delete(name);
122
+ }
123
+ /** 重新加载“主角色卡”(fileName 对应的卡),供 watch 调用 */
124
+ reloadPrimaryCardFromCache() {
125
+ const refreshed = this.cardCache.get(this.fileName);
126
+ if (refreshed) {
127
+ this.card = refreshed;
128
+ this._outputFormat = refreshed.outputFormat
129
+ ? PersonaServiceImpl.parseRawOutputFormat(refreshed.outputFormat, refreshed.outputFormatRetries)
130
+ : undefined;
131
+ }
132
+ }
133
+ knownPersonaNames() {
134
+ return [...this.knownNames];
135
+ }
136
+ /** 解析原始 outputFormat 定义 → OutputFormat 结构 */
137
+ static parseRawOutputFormat(raw, retries) {
138
+ const fields = {};
139
+ let replyField;
140
+ for (const [key, def] of Object.entries(raw)) {
141
+ const type = (['string', 'number', 'boolean'].includes(def.type ?? '') ? def.type : 'string');
142
+ fields[key] = { description: def.description, type, reply: def.reply };
143
+ if (def.reply)
144
+ replyField = key;
145
+ }
146
+ if (!replyField)
147
+ return undefined;
148
+ const normalizedRetries = Number.isFinite(retries) && retries >= 0 ? Math.floor(retries) : 1;
149
+ return { fields, replyField, retries: normalizedRetries };
150
+ }
151
+ /** 保存会话状态 */
152
+ saveSessionState(sessionId, state) {
153
+ this.sessionStates.set(sessionId, state);
154
+ }
155
+ /** 读取会话状态(用于跨会话工具回报目标 agent 内心情况) */
156
+ getSessionState(sessionId) {
157
+ return this.sessionStates.get(sessionId);
158
+ }
159
+ /** 清除指定会话的状态 */
160
+ clearSessionState(sessionId) {
161
+ this.sessionStates.delete(sessionId);
162
+ }
163
+ /** 清除所有会话状态 */
164
+ clearAllStates() {
165
+ this.sessionStates.clear();
166
+ }
167
+ /** 根据 options 获取生效的角色卡(不查 session-manager,由调用方传入) */
168
+ getEffectiveCard(options) {
169
+ if (options?.persona && options.persona !== this.fileName) {
170
+ return this.loadCard(options.persona) ?? this.card;
171
+ }
172
+ return this.card;
173
+ }
174
+ /** 按名称动态加载角色卡(仅查 cache,启动时预填) */
175
+ loadCard(name) {
176
+ if (name === this.fileName)
177
+ return this.card;
178
+ const cached = this.cardCache.get(name);
179
+ return cached ?? undefined;
180
+ }
181
+ /** 获取指定角色卡的 OutputFormat(带缓存) */
182
+ getCardOutputFormat(card) {
183
+ if (card === this.card)
184
+ return this._outputFormat;
185
+ const key = card.name || '??';
186
+ if (this.formatCache.has(key))
187
+ return this.formatCache.get(key) ?? undefined;
188
+ const fmt = card.outputFormat
189
+ ? PersonaServiceImpl.parseRawOutputFormat(card.outputFormat, card.outputFormatRetries)
190
+ : undefined;
191
+ this.formatCache.set(key, fmt ?? null);
192
+ return fmt;
193
+ }
194
+ getSystemPrompt(options) {
195
+ const effectiveCard = this.getEffectiveCard(options);
196
+ let prompt = '';
197
+ // 时间注入
198
+ if (this.timeInjection) {
199
+ const now = new Date();
200
+ // 解析有效时区:配置 > 系统本地
201
+ let tz = this.timeZone?.trim() || Intl.DateTimeFormat().resolvedOptions().timeZone;
202
+ // 验证时区合法性,无效时回退到系统本地
203
+ try {
204
+ new Intl.DateTimeFormat('en-US', { timeZone: tz });
205
+ }
206
+ catch {
207
+ tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
208
+ }
209
+ // 计算 UTC 偏移(如 +08:00 / -05:00)用于消除歧义
210
+ const offsetParts = new Intl.DateTimeFormat('en-US', { timeZone: tz, timeZoneName: 'shortOffset' })
211
+ .formatToParts(now)
212
+ .find(p => p.type === 'timeZoneName')?.value ?? '';
213
+ const timeStr = now.toLocaleString('zh-CN', {
214
+ timeZone: tz,
215
+ year: 'numeric',
216
+ month: '2-digit',
217
+ day: '2-digit',
218
+ hour: '2-digit',
219
+ minute: '2-digit',
220
+ second: '2-digit',
221
+ weekday: 'short',
222
+ hour12: false,
223
+ });
224
+ prompt +=
225
+ '以下时间由系统实时注入,是你回答时间或日期相关问题时应直接使用的权威当前时间。不要质疑它,也不要调用工具再次获取时间。\n';
226
+ prompt += `当前时间:${timeStr}(${tz}${offsetParts ? ` ${offsetParts}` : ''})\n\n`;
227
+ }
228
+ if (effectiveCard.name) {
229
+ prompt += `你的名字是 ${effectiveCard.name}。`;
230
+ }
231
+ if (effectiveCard.description) {
232
+ prompt += `${effectiveCard.description}\n\n`;
233
+ }
234
+ if (effectiveCard.traits && effectiveCard.traits.length > 0) {
235
+ prompt += `性格特点: ${effectiveCard.traits.join('、')}\n\n`;
236
+ }
237
+ prompt += effectiveCard.prompt;
238
+ // 会话上下文注入
239
+ if (this.currentSessionId) {
240
+ prompt += '\n\n# 当前会话环境\n';
241
+ if (this.currentPlatform) {
242
+ prompt += `当前平台:${this.currentPlatform}\n`;
243
+ }
244
+ if (this.currentSelfId || this.currentSelfNickname) {
245
+ const selfLabel = this.currentSelfNickname
246
+ ? `${this.currentSelfNickname}${this.currentSelfId ? `(${this.currentSelfId})` : ''}`
247
+ : this.currentSelfId;
248
+ prompt += `你在当前平台的账号:${selfLabel}\n`;
249
+ }
250
+ if (this.currentSessionType === 'group') {
251
+ // 解析 sessionId 提取群号
252
+ const parts = this.currentSessionId.split(':');
253
+ const groupId = parts.length >= 4 ? parts.slice(3).join(':') : undefined;
254
+ prompt += '会话类型:群聊\n';
255
+ if (this.currentGroupName)
256
+ prompt += `群名称:${this.currentGroupName}\n`;
257
+ if (groupId)
258
+ prompt += `群号:${groupId}\n`;
259
+ // 自身群身份(关键:避免 LLM 误以为自己是普通群员)
260
+ if (this.currentSelfRole) {
261
+ const roleLabel = this.currentSelfRole === 'owner' ? '群主' : this.currentSelfRole === 'admin' ? '管理员' : '普通成员';
262
+ prompt += `你在该群的身份:${roleLabel}\n`;
263
+ }
264
+ if (this.currentSelfTitle) {
265
+ prompt += `你在该群的专属头衔:${this.currentSelfTitle}\n`;
266
+ }
267
+ }
268
+ else if (this.currentSessionType === 'private') {
269
+ prompt += '会话类型:私聊\n';
270
+ }
271
+ else if (this.currentSessionType === 'channel') {
272
+ prompt += '会话类型:频道\n';
273
+ }
274
+ if (this.currentUserId) {
275
+ prompt += `当前消息发送者 ID:${this.currentUserId}\n`;
276
+ }
277
+ if (this.currentNickname) {
278
+ prompt += `当前消息发送者昵称:${this.currentNickname}\n`;
279
+ }
280
+ if (this.currentSenderRole) {
281
+ const senderRoleLabel = this.currentSenderRole === 'owner' ? '群主' : this.currentSenderRole === 'admin' ? '管理员' : '普通成员';
282
+ prompt += `当前消息发送者群身份:${senderRoleLabel}\n`;
283
+ }
284
+ if (this.currentSenderTitle) {
285
+ prompt += `当前消息发送者群头衔:${this.currentSenderTitle}\n`;
286
+ }
287
+ prompt +=
288
+ '短期历史范围:上下文中的历史消息均来自当前会话,即上述群聊/私聊/频道;跨会话或跨群内容只会以长期记忆片段形式单独标注。\n';
289
+ }
290
+ // 状态持久化注入
291
+ if (this.statePersistence) {
292
+ const state = this.currentSessionId ? this.sessionStates.get(this.currentSessionId) : undefined;
293
+ if (state && Object.keys(state).length > 0) {
294
+ prompt += '\n\n# 你上一轮的状态\n';
295
+ prompt += '以下是你上一轮回复中的角色状态,请基于此状态继续,并根据本轮对话更新:\n';
296
+ for (const [k, v] of Object.entries(state)) {
297
+ prompt += `${k}: ${v}\n`;
298
+ }
299
+ }
300
+ }
301
+ // 追加结构化输出指令 — 尊重调用方传入的 disableOutputFormat
302
+ const effectiveFormat = options?.disableOutputFormat ? undefined : this.getCardOutputFormat(effectiveCard);
303
+ if (effectiveFormat) {
304
+ // 角色卡若提供 outputFormatPrompt,则用其替换默认 header/footer;
305
+ // schema 块仍由插件根据 fields 自动生成,避免与字段定义脱节。
306
+ const customPrompt = effectiveCard.outputFormatPrompt?.trim();
307
+ prompt += '\n\n';
308
+ if (customPrompt) {
309
+ prompt += `${customPrompt}\n`;
310
+ }
311
+ else {
312
+ prompt += '# 输出格式(必须严格遵守)\n';
313
+ prompt +=
314
+ '你的每一条文字回复都必须且只能是一个合法 JSON 对象。不得在 JSON 前后输出任何其他内容,不得使用 markdown 代码块包裹。\n\n';
315
+ }
316
+ prompt += '{\n';
317
+ const entries = Object.entries(effectiveFormat.fields);
318
+ entries.forEach(([key, field], i) => {
319
+ const comma = i < entries.length - 1 ? ',' : '';
320
+ let placeholder;
321
+ if (field.type === 'number')
322
+ placeholder = '0';
323
+ else if (field.type === 'boolean')
324
+ placeholder = 'true';
325
+ else
326
+ placeholder = '"..."';
327
+ prompt += ` "${key}": ${placeholder}${comma}\n`;
328
+ });
329
+ prompt += '}\n';
330
+ if (!customPrompt) {
331
+ // 单独输出字段说明,避免行内注释干扰 JSON 解析
332
+ prompt += '\n字段说明:\n';
333
+ entries.forEach(([key, field]) => {
334
+ prompt += `- ${key}:${field.description}${field.reply ? '(发送给用户的回复,不想说话则填空字符串)' : ''}\n`;
335
+ });
336
+ prompt += '\n调用工具时无需遵守此格式,正常使用工具即可。\n';
337
+ prompt += '工具全部调用完毕后,必须按上述 JSON 格式输出最终回复,不得输出纯文本。';
338
+ }
339
+ }
340
+ return prompt;
341
+ }
342
+ getPersonaName() {
343
+ return this.card.name || `${this.fileName},未设置名字`;
344
+ }
345
+ /** 该角色卡是否配置为客户端渲染 JSON */
346
+ isClientSideJsonRendering(options) {
347
+ if (options?.clientSideJsonRendering !== undefined) {
348
+ return options.clientSideJsonRendering;
349
+ }
350
+ const effectiveCard = this.getEffectiveCard(options);
351
+ return !!effectiveCard.clientSideJsonRendering;
352
+ }
353
+ getOutputFormat(options) {
354
+ if (options?.disableOutputFormat)
355
+ return undefined;
356
+ const effectiveCard = this.getEffectiveCard(options);
357
+ return this.getCardOutputFormat(effectiveCard);
358
+ }
359
+ getNickNames() {
360
+ return this.card.nick_name ?? [];
361
+ }
362
+ isTimeInjectionEnabled() {
363
+ return this.timeInjection;
364
+ }
365
+ getPersonaSkills(options) {
366
+ const effectiveCard = this.getEffectiveCard(options);
367
+ return effectiveCard.skills;
368
+ }
369
+ async listModels() {
370
+ return [...this.knownNames];
371
+ }
372
+ }
373
+ // ===== 插件入口 =====
374
+ export async function apply(ctx, config) {
375
+ const personaName = config.persona || 'default';
376
+ const personasDirRaw = config.personasDir || 'data/personas';
377
+ const statePersistence = config.statePersistence ?? false;
378
+ const timeInjection = config.timeInjection ?? false;
379
+ const timeZone = config.timeZone ?? '';
380
+ const storage = createStorageGateway(ctx);
381
+ // 把 "data/personas" / "abc:/path" 都规范化为 storage URI
382
+ function toStorageUri(input) {
383
+ if (input.includes(':/'))
384
+ return input;
385
+ const s = input.trim().replace(/^\.?\/+/, '');
386
+ const idx = s.indexOf('/');
387
+ return idx > 0 ? `${s.slice(0, idx)}:/${s.slice(idx + 1)}` : `${s}:/`;
388
+ }
389
+ // 候选目录:用户配置 + configDir/personas(若存在 configDir 根,则用 configDir 根;否则跳过)
390
+ const searchUris = [toStorageUri(personasDirRaw)];
391
+ const knownRoots = new Set(storage.listRoots().map(r => r.name));
392
+ if (knownRoots.has('configDir'))
393
+ searchUris.push('configDir:/personas');
394
+ async function tryLoadCardFromUri(uri) {
395
+ try {
396
+ const raw = (await storage.readFile(uri, 'utf-8'));
397
+ const parsed = parseYaml(raw);
398
+ return {
399
+ name: parsed.name ?? '',
400
+ description: parsed.description ?? '',
401
+ prompt: parsed.prompt ?? '',
402
+ traits: parsed.traits,
403
+ greeting: parsed.greeting,
404
+ outputFormat: parsed.outputFormat,
405
+ outputFormatPrompt: parsed.outputFormatPrompt,
406
+ nick_name: parsed.nick_name,
407
+ clientSideJsonRendering: parsed.clientSideJsonRendering,
408
+ skills: parsed.skills,
409
+ };
410
+ }
411
+ catch {
412
+ return undefined;
413
+ }
414
+ }
415
+ function joinUri(base, sub) {
416
+ const s = sub.replace(/^\/+/, '');
417
+ return base.endsWith('/') ? base + s : `${base}/${s}`;
418
+ }
419
+ async function findCard(name) {
420
+ for (const dir of searchUris) {
421
+ for (const ext of ['.yaml', '.yml']) {
422
+ const uri = joinUri(dir, `${name}${ext}`);
423
+ const card = await tryLoadCardFromUri(uri);
424
+ if (card)
425
+ return { card, uri };
426
+ }
427
+ }
428
+ return undefined;
429
+ }
430
+ /** 扫描所有 personas 目录,预填 cache。 */
431
+ async function scanAll(svc) {
432
+ const seenNames = new Set();
433
+ for (const dir of searchUris) {
434
+ let result;
435
+ try {
436
+ result = await storage.list(dir);
437
+ }
438
+ catch {
439
+ continue;
440
+ }
441
+ for (const entry of result.entries) {
442
+ if (entry.isDirectory)
443
+ continue;
444
+ const m = /^(.+)\.ya?ml$/i.exec(entry.name);
445
+ if (!m)
446
+ continue;
447
+ const cardName = m[1];
448
+ if (seenNames.has(cardName))
449
+ continue;
450
+ const card = await tryLoadCardFromUri(entry.uri);
451
+ if (card) {
452
+ svc.setCardCacheEntry(cardName, card);
453
+ seenNames.add(cardName);
454
+ }
455
+ }
456
+ }
457
+ return seenNames;
458
+ }
459
+ let card;
460
+ const found = await findCard(personaName);
461
+ if (found) {
462
+ card = found.card;
463
+ ctx.logger.info(`已加载角色卡: ${card.name} (${found.uri})`);
464
+ }
465
+ else {
466
+ card = {
467
+ name: 'Aalis',
468
+ description: '一个友好的 AI 助手',
469
+ prompt: '请友好、专业地与用户交流。',
470
+ };
471
+ ctx.logger.info(`未找到角色卡 "${personaName}",使用默认角色`);
472
+ }
473
+ const service = new PersonaServiceImpl(card, searchUris, personaName, {
474
+ statePersistence,
475
+ timeInjection,
476
+ timeZone,
477
+ });
478
+ ctx.provide('persona', service);
479
+ // 启动时一次性预扫所有 personas → cache(用于 listModels / 动态切换)+ 启动 watch
480
+ ctx.on('ready', async () => {
481
+ try {
482
+ const known = await scanAll(service);
483
+ // 删除 cache 里那些已不存在的
484
+ for (const n of service.knownPersonaNames()) {
485
+ if (!known.has(n) && n !== personaName)
486
+ service.removeCardCacheEntry(n);
487
+ }
488
+ service.reloadPrimaryCardFromCache();
489
+ ctx.logger.debug(`persona 启动扫描完成,已知 ${known.size} 张卡`);
490
+ }
491
+ catch (err) {
492
+ ctx.logger.warn(`persona 启动扫描失败:${err}`);
493
+ }
494
+ for (const dir of searchUris) {
495
+ try {
496
+ const unwatch = storage.watch?.(dir, async () => {
497
+ try {
498
+ const known = await scanAll(service);
499
+ for (const n of service.knownPersonaNames()) {
500
+ if (!known.has(n) && n !== personaName)
501
+ service.removeCardCacheEntry(n);
502
+ }
503
+ service.reloadPrimaryCardFromCache();
504
+ ctx.logger.debug(`persona 目录变化已重新加载(${dir})`);
505
+ }
506
+ catch (err) {
507
+ ctx.logger.warn(`persona 重扫失败:${err}`);
508
+ }
509
+ });
510
+ if (unwatch)
511
+ ctx.onDispose(unwatch);
512
+ }
513
+ catch (err) {
514
+ ctx.logger.warn(`persona 目录监听失败(${dir}):${err}`);
515
+ }
516
+ }
517
+ });
518
+ // 参与 memory:clear 清除当前会话的 persona 状态
519
+ ctx.middleware('memory:clear', async (data, next) => {
520
+ // 类型过滤:仅在清除 context/persona/全部 时参与
521
+ if (data.types && !data.types.includes('context') && !data.types.includes('persona')) {
522
+ await next();
523
+ return;
524
+ }
525
+ try {
526
+ if (data.scope === 'all') {
527
+ service.clearAllStates();
528
+ data.results.push({ source: 'persona', success: true, message: '所有会话角色状态已清空' });
529
+ }
530
+ else if (data.sessionId) {
531
+ service.clearSessionState(data.sessionId);
532
+ data.results.push({ source: 'persona', success: true, message: '当前会话角色状态已清空' });
533
+ }
534
+ }
535
+ catch (err) {
536
+ const msg = err instanceof Error ? err.message : String(err);
537
+ data.results.push({ source: 'persona', success: false, message: `角色状态清空失败: ${msg}` });
538
+ }
539
+ await next();
540
+ });
541
+ // 跟踪当前会话信息(始终启用,用于 session 上下文注入和状态持久化)
542
+ ctx.middleware('agent:input:before', async (data, next) => {
543
+ service.currentSessionId = data.message.sessionId;
544
+ service.currentPlatform = data.message.platform;
545
+ service.currentSessionType = data.message.sessionType;
546
+ const selfIdentity = getPlatformSelfIdentity(ctx, data.message.platform, data.message.sessionId);
547
+ service.currentSelfId = selfIdentity?.selfId;
548
+ service.currentSelfNickname = selfIdentity?.nickname;
549
+ service.currentUserId = data.message.userId;
550
+ service.currentNickname = data.message.nickname;
551
+ service.currentGroupName = data.message.groupName;
552
+ service.currentSelfRole = data.message.selfRole;
553
+ service.currentSelfTitle = data.message.selfTitle;
554
+ service.currentSenderRole = data.message.senderRole;
555
+ service.currentSenderTitle = data.message.senderTitle;
556
+ try {
557
+ await next();
558
+ }
559
+ finally {
560
+ // 清理运行时上下文,避免泄漏到下一次调用
561
+ service.currentSessionId = undefined;
562
+ service.currentPlatform = undefined;
563
+ service.currentSessionType = undefined;
564
+ service.currentSelfId = undefined;
565
+ service.currentSelfNickname = undefined;
566
+ service.currentUserId = undefined;
567
+ service.currentNickname = undefined;
568
+ service.currentGroupName = undefined;
569
+ service.currentSelfRole = undefined;
570
+ service.currentSelfTitle = undefined;
571
+ service.currentSenderRole = undefined;
572
+ service.currentSenderTitle = undefined;
573
+ }
574
+ });
575
+ // agent:reply:before 钩子:统一处理 JSON 解析
576
+ // 1. 有 outputFormat 时:结构化解析 + 状态持久化
577
+ // 2. 无 outputFormat 时:回退提取(模型意外用 JSON 包裹回复时自动解包)
578
+ const baseFormat = service.getOutputFormat();
579
+ if (baseFormat) {
580
+ ctx.logger.info(`角色卡启用结构化输出 (回复字段: ${baseFormat.replyField})`);
581
+ }
582
+ ctx.middleware('agent:reply:before', async (data, next) => {
583
+ await next();
584
+ // 从 session-manager 构造 PersonaSessionOptions,统一传给 service 方法
585
+ let personaOpts;
586
+ try {
587
+ const sm = ctx.getService('session-manager');
588
+ if (sm && data.sessionId) {
589
+ const resolved = sm.resolveConfig(data.sessionId, data.platform);
590
+ personaOpts = {
591
+ persona: resolved.persona,
592
+ disableOutputFormat: resolved.disableOutputFormat,
593
+ clientSideJsonRendering: resolved.clientSideJsonRendering,
594
+ };
595
+ }
596
+ }
597
+ catch {
598
+ /* session-manager 不可用,使用全局默认 */
599
+ }
600
+ const outputFormat = service.getOutputFormat(personaOpts);
601
+ // ===== 无 outputFormat:回退 JSON 提取 =====
602
+ // 当角色卡未定义 outputFormat 时,模型偶尔仍会用 JSON 包裹回复
603
+ // 此处自动解包,提取回复字段
604
+ if (!outputFormat) {
605
+ const trimmed = data.content.trim();
606
+ if (!trimmed.startsWith('{'))
607
+ return;
608
+ const { parsed: obj } = tryParseJsonObject(trimmed);
609
+ if (!obj)
610
+ return;
611
+ const replyKeys = ['response', 'reply', 'content', 'answer', 'text', 'msg', 'message'];
612
+ for (const key of replyKeys) {
613
+ if (typeof obj[key] === 'string') {
614
+ data.content = obj[key];
615
+ ctx.logger.debug(`JSON 回退提取: 使用字段 "${key}"`);
616
+ return;
617
+ }
618
+ }
619
+ return;
620
+ }
621
+ // ===== 有 outputFormat:结构化解析 =====
622
+ const clientRendered = service.isClientSideJsonRendering(personaOpts);
623
+ const persistStateFromParsed = (parsedObj, fmt) => {
624
+ const state = {};
625
+ for (const key of Object.keys(fmt.fields)) {
626
+ if (key !== fmt.replyField && parsedObj[key] !== undefined) {
627
+ const fieldType = fmt.fields[key].type ?? 'string';
628
+ let val = parsedObj[key];
629
+ if (fieldType === 'number') {
630
+ const n = Number(val);
631
+ val = Number.isNaN(n) ? val : n;
632
+ }
633
+ else if (fieldType === 'boolean') {
634
+ if (typeof val === 'string')
635
+ val = val === 'true';
636
+ else
637
+ val = Boolean(val);
638
+ }
639
+ else {
640
+ if (typeof val !== 'string')
641
+ val = String(val);
642
+ }
643
+ state[key] = val;
644
+ }
645
+ }
646
+ if (Object.keys(state).length > 0) {
647
+ service.saveSessionState(data.sessionId, state);
648
+ ctx.logger.debug(`状态已持久化 (session=${data.sessionId}): ${JSON.stringify(state)}`);
649
+ }
650
+ };
651
+ const jsonStr = extractJsonCandidate(data.content);
652
+ const { parsed, repairsApplied } = tryParseJsonObject(jsonStr);
653
+ if (parsed && repairsApplied.length > 0) {
654
+ ctx.logger.debug(`outputFormat JSON 自动修复成功:${repairsApplied.join(' → ')}`);
655
+ }
656
+ try {
657
+ if (!parsed)
658
+ throw new Error('JSON 解析失败');
659
+ let reply = parsed[outputFormat.replyField];
660
+ // 回退:模型可能使用了错误的字段名(如 response 代替 message)
661
+ if (typeof reply !== 'string') {
662
+ const aliases = ['response', 'reply', 'content', 'answer', 'text', 'msg'];
663
+ for (const alias of aliases) {
664
+ if (alias !== outputFormat.replyField && typeof parsed[alias] === 'string') {
665
+ reply = parsed[alias];
666
+ ctx.logger.debug(`outputFormat 回退:模型使用了 "${alias}" 而非 "${outputFormat.replyField}",已自动纠正`);
667
+ break;
668
+ }
669
+ }
670
+ }
671
+ // 仍未找到:若 JSON 中只有一个字符串字段,使用它
672
+ if (typeof reply !== 'string') {
673
+ const stringEntries = Object.entries(parsed).filter(([, v]) => typeof v === 'string');
674
+ if (stringEntries.length === 1) {
675
+ reply = stringEntries[0][1];
676
+ ctx.logger.debug(`outputFormat 回退:仅一个字符串字段 "${stringEntries[0][0]}",作为回复使用`);
677
+ }
678
+ }
679
+ if (typeof reply === 'string') {
680
+ if (parsed[outputFormat.replyField] !== reply) {
681
+ parsed[outputFormat.replyField] = reply;
682
+ }
683
+ // 严格字段校验:声明的所有字段都必须出现且类型正确,缺一不可 → 否则 retry。
684
+ // 这样可以避免模型养成省略 state/mood 等状态字段的坏习惯,让上下文信号始终完整。
685
+ const missing = [];
686
+ const typeMismatch = [];
687
+ for (const [key, def] of Object.entries(outputFormat.fields)) {
688
+ const val = parsed[key];
689
+ if (val === undefined || val === null) {
690
+ missing.push(key);
691
+ continue;
692
+ }
693
+ const expectedType = def.type ?? 'string';
694
+ const actualType = typeof val;
695
+ if (expectedType === 'number') {
696
+ if (actualType !== 'number' && !(actualType === 'string' && !Number.isNaN(Number(val)))) {
697
+ typeMismatch.push(`${key}(期望 number, 实际 ${actualType})`);
698
+ }
699
+ }
700
+ else if (expectedType === 'boolean') {
701
+ if (actualType !== 'boolean' && !(actualType === 'string' && (val === 'true' || val === 'false'))) {
702
+ typeMismatch.push(`${key}(期望 boolean, 实际 ${actualType})`);
703
+ }
704
+ }
705
+ else if (actualType !== 'string') {
706
+ typeMismatch.push(`${key}(期望 string, 实际 ${actualType})`);
707
+ }
708
+ }
709
+ if (missing.length > 0 || typeMismatch.length > 0) {
710
+ const parts = [];
711
+ if (missing.length > 0)
712
+ parts.push(`缺失字段: ${missing.join(',')}`);
713
+ if (typeMismatch.length > 0)
714
+ parts.push(`类型错误: ${typeMismatch.join(',')}`);
715
+ throw new Error(parts.join('; '));
716
+ }
717
+ data.archiveContent = JSON.stringify(parsed);
718
+ // 客户端渲染模式:保留完整 JSON 给前端,不提取回复字段
719
+ if (!clientRendered) {
720
+ data.content = reply;
721
+ }
722
+ // 输出所有字段概要
723
+ const fieldSummary = Object.entries(parsed)
724
+ .filter(([k]) => k !== outputFormat.replyField)
725
+ .map(([k, v]) => {
726
+ const s = typeof v === 'string' ? v : JSON.stringify(v);
727
+ return `${k}=${s.length > 60 ? `${s.slice(0, 60)}...` : s}`;
728
+ })
729
+ .join(', ');
730
+ if (reply.length > 0) {
731
+ ctx.logger.debug(`outputFormat 解码成功 [${fieldSummary}] → ${outputFormat.replyField}: ${reply.slice(0, 100)}`);
732
+ }
733
+ else {
734
+ ctx.logger.debug(`outputFormat 解码成功 [${fieldSummary}] → ${outputFormat.replyField}: (空,静默)`);
735
+ }
736
+ // 状态持久化:保存非回复字段(按 field type 强制类型)
737
+ if (statePersistence) {
738
+ persistStateFromParsed(parsed, outputFormat);
739
+ }
740
+ }
741
+ else {
742
+ // JSON 合法但找不到回复字段(无 replyField、无 alias、也不是单字符串字段)
743
+ // 视为模型违约 → 抛错让 catch 触发 retry,要求重新输出符合 outputFormat 的 JSON。
744
+ // 注意:agent 主动静默的合法表达是 reply 字段=空字符串(如 {"message":"","state":"..."}),
745
+ // 那种情况会走上面的 typeof reply === 'string' 分支并被识别为"(空,静默)"。
746
+ throw new Error(`JSON 合法但找不到回复字段 "${outputFormat.replyField}"(实际字段: ${Object.keys(parsed).join(',')})`);
747
+ }
748
+ }
749
+ catch (err) {
750
+ const message = err instanceof Error ? err.message : String(err);
751
+ const preview = jsonStr.length > 300 ? `${jsonStr.slice(0, 300)}...` : jsonStr;
752
+ const maxRetries = outputFormat.retries;
753
+ const attempt = data.attempt ?? 0;
754
+ // 把允许的重试次数透给 agent,agent 据此决定循环次数
755
+ data.maxRetries = maxRetries;
756
+ if (attempt < maxRetries) {
757
+ // 还有重试名额:要求模型严格按照 outputFormat 重新输出 JSON
758
+ ctx.logger.debug(`outputFormat 解码失败 (attempt=${attempt}/${maxRetries}),请求重试:${message}; json=${preview}`);
759
+ const fieldSpec = Object.entries(outputFormat.fields)
760
+ .map(([k, v]) => ` - "${k}"(${v.description ?? ''}${k === outputFormat.replyField ? ';最终回复内容写在这里' : ''})`)
761
+ .join('\n');
762
+ data.retryRequested = true;
763
+ data.retryFeedback =
764
+ '你的上一条回复没有按照规定的 JSON 输出格式返回(解析失败原因:' +
765
+ message +
766
+ ')。请严格按照以下字段输出一个合法 JSON 对象(不要包 markdown 代码块,所有声明的字段都必须出现,缺一不可):\n' +
767
+ fieldSpec +
768
+ '\n请勿输出任何 JSON 之外的文本。' +
769
+ '\n注意:如果你的本意只是"汇报已完成 / 不想再对外发送新内容",请把回复字段留空(空字符串),仅用其他状态字段说明情况——不要省略任何字段,也不要在回复字段里写汇报性文字,否则会被当作新消息发送到对方平台。';
770
+ }
771
+ else {
772
+ // 重试用尽:静默丢弃(避免原始 JSON 被当成回复发出)
773
+ // 同时通过 archiveContent 写入一条"系统提醒",让下一轮 LLM 看到自己上次因格式不符被丢弃
774
+ ctx.logger.warn(`outputFormat 解码连续 ${attempt + 1} 次失败(已用尽 ${maxRetries} 次重试),静默丢弃回复:${message}; json=${preview}`);
775
+ data.retryRequested = false;
776
+ data.retryFeedback = undefined;
777
+ data.content = '';
778
+ data.archiveContent = `(系统提示:上一条回复因不符合 outputFormat 规定被丢弃,原因:${message}。下次回复请严格按照 system prompt 中规定的 JSON 格式输出,所有声明的字段都必须出现。)`;
779
+ }
780
+ }
781
+ });
782
+ }
783
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { RepairResult } from '@aalis/util-json-repair';
2
+ export { extractJsonCandidate, parseLLMJsonObject, tryParseJsonObject } from '@aalis/util-json-repair';
3
+ //# sourceMappingURL=json-repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-repair.d.ts","sourceRoot":"","sources":["../src/json-repair.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // 此文件已迁移到 @aalis/util-json-repair(供多个 plugin 共享)。
2
+ // 保留 re-export 以兼容已有相对 import,新代码请直接 import @aalis/util-json-repair。
3
+ export { extractJsonCandidate, parseLLMJsonObject, tryParseJsonObject } from '@aalis/util-json-repair';
4
+ //# sourceMappingURL=json-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-repair.js","sourceRoot":"","sources":["../src/json-repair.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,qEAAqE;AAGrE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /** 输出格式中单个字段的定义 */
2
+ export interface OutputFormatField {
3
+ /** 字段用途描述(写入 system prompt 供 LLM 理解) */
4
+ description: string;
5
+ /** 字段类型(影响 system prompt 占位符和输出后的类型强制) */
6
+ type?: 'string' | 'number' | 'boolean';
7
+ /** 是否为发送给用户的回复字段(有且仅有一个) */
8
+ reply?: boolean;
9
+ }
10
+ /** 角色卡定义的结构化输出格式 */
11
+ export interface OutputFormat {
12
+ /** 字段定义表:key = JSON 字段名 */
13
+ fields: Record<string, OutputFormatField>;
14
+ /** 回复字段名(自动推断,取 reply: true 的那个 key) */
15
+ replyField: string;
16
+ }
17
+ /**
18
+ * 会话级选项,由调用方(如 agent-default)从 SessionConfig 构造后传入。
19
+ * PersonaService 本身不关心 session-manager,只根据传入的选项调整行为。
20
+ */
21
+ export interface PersonaSessionOptions {
22
+ /** 覆盖角色卡名称 */
23
+ persona?: string;
24
+ /** 禁用结构化输出格式 */
25
+ disableOutputFormat?: boolean;
26
+ /** 客户端渲染 JSON 覆盖 */
27
+ clientSideJsonRendering?: boolean;
28
+ }
29
+ export interface PersonaService {
30
+ getSystemPrompt(options?: PersonaSessionOptions): string;
31
+ getPersonaName(): string;
32
+ /** 获取角色卡定义的结构化输出格式,无定义时返回 undefined */
33
+ getOutputFormat?(options?: PersonaSessionOptions): OutputFormat | undefined;
34
+ /** 该角色卡是否配置为客户端渲染 JSON */
35
+ isClientSideJsonRendering?(options?: PersonaSessionOptions): boolean;
36
+ /** 列出可用的人设卡(用于前端下拉框) */
37
+ listModels?(): Promise<string[]>;
38
+ /** 获取角色卡定义的昵称列表(用于触发检测) */
39
+ getNickNames?(): string[];
40
+ /** 是否启用了时间注入(供其他插件判断是否需要注册时间相关工具) */
41
+ isTimeInjectionEnabled?(): boolean;
42
+ }
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACzD,cAAc,IAAI,MAAM,CAAC;IACzB,uCAAuC;IACvC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5E,0BAA0B;IAC1B,yBAAyB,CAAC,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACrE,wBAAwB;IACxB,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,2BAA2B;IAC3B,YAAY,CAAC,IAAI,MAAM,EAAE,CAAC;IAC1B,qCAAqC;IACrC,sBAAsB,CAAC,IAAI,OAAO,CAAC;CACpC"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // ----- 人格服务接口 -----
2
+ // 由 @aalis/plugin-persona 拥有并导出。消费者从本包 import type。
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,oDAAoD"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@aalis/plugin-persona",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "keywords": [
6
+ "aalis-plugin"
7
+ ],
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "yaml": "^2.7.0",
15
+ "@aalis/plugin-agent-api": "^0.1.0",
16
+ "@aalis/plugin-memory-api": "^0.1.0",
17
+ "@aalis/util-json-repair": "^0.1.0",
18
+ "@aalis/plugin-storage-api": "^0.1.0",
19
+ "@aalis/plugin-platform-api": "^0.1.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^22.0.0",
23
+ "typescript": "^5.7.0",
24
+ "@aalis/core": "0.1.0",
25
+ "@aalis/plugin-persona-api": "0.1.0",
26
+ "@aalis/plugin-webui-api": "0.1.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@aalis/core": "^0.1.0"
30
+ },
31
+ "aalis": {
32
+ "service": {
33
+ "optional": [
34
+ "platform"
35
+ ],
36
+ "provides": [
37
+ "persona"
38
+ ]
39
+ }
40
+ },
41
+ "scripts": {
42
+ "build": "tsc",
43
+ "dev": "tsc --watch"
44
+ }
45
+ }