@aalis/plugin-session-manager 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-session-manager
2
+
3
+ 运行时插件
4
+
5
+ ## 角色
6
+
7
+ 运行时插件
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ pnpm add @aalis/plugin-session-manager
13
+ ```
14
+
15
+ ## 文档
16
+
17
+ 详见 [docs/plugins/plugin-session-manager.md](../../docs/plugins/plugin-session-manager.md)。
18
+
19
+ ## 许可
20
+
21
+ 见仓库根目录 LICENSE。
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { I18nResources } from '@aalis/core';
2
+ export declare const i18n: I18nResources;
3
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,IAAI,EAAE,aASlB,CAAC"}
package/dist/i18n.js ADDED
@@ -0,0 +1,11 @@
1
+ export const i18n = {
2
+ 'zh-CN': {
3
+ 'plugin.sessionManager.displayName': '会话管理',
4
+ 'webui.sessions.page': '会话管理',
5
+ },
6
+ 'en-US': {
7
+ 'plugin.sessionManager.displayName': 'Session Manager',
8
+ 'webui.sessions.page': 'Sessions',
9
+ },
10
+ };
11
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAkB;IACjC,OAAO,EAAE;QACP,mCAAmC,EAAE,MAAM;QAC3C,qBAAqB,EAAE,MAAM;KAC9B;IACD,OAAO,EAAE;QACP,mCAAmC,EAAE,iBAAiB;QACtD,qBAAqB,EAAE,UAAU;KAClC;CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ConfigSchema, Context, PluginModule } from '@aalis/core';
2
+ import '@aalis/plugin-agent-api';
3
+ export type { PlatformProfile, SessionConfig, SessionInfo, SessionManagerCapability, SessionManagerCapabilityRegistry, SessionManagerService, SessionTreeNode, } from '@aalis/plugin-session-manager-api';
4
+ export { SessionManagerCapabilities } from '@aalis/plugin-session-manager-api';
5
+ export declare const name = "@aalis/plugin-session-manager";
6
+ export declare const displayName = "\u4F1A\u8BDD\u7BA1\u7406";
7
+ export declare const subsystem = "session";
8
+ export declare const inject: {
9
+ required: readonly ["memory"];
10
+ optional: readonly ["agent", "platform", "persona", "llm"];
11
+ };
12
+ export declare const provides: string[];
13
+ export declare const configSchema: ConfigSchema;
14
+ export declare const defaultConfig: {
15
+ defaults: {};
16
+ platformProfiles: never[];
17
+ };
18
+ export declare const actions: PluginModule['actions'];
19
+ export declare function apply(ctx: Context, config: Record<string, unknown>): Promise<void>;
20
+ //# 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,YAAY,EAAE,MAAM,aAAa,CAAC;AAGvE,OAAO,yBAAyB,CAAC;AAiBjC,YAAY,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,wBAAwB,EACxB,gCAAgC,EAChC,qBAAqB,EACrB,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAM/E,eAAO,MAAM,IAAI,kCAAkC,CAAC;AACpD,eAAO,MAAM,WAAW,6BAAS,CAAC;AAClC,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AACF,eAAO,MAAM,QAAQ,UAAsB,CAAC;AAE5C,eAAO,MAAM,YAAY,EAAE,YA2D1B,CAAC;AAEF,eAAO,MAAM,aAAa;;;CAGzB,CAAC;AA4BF,eAAO,MAAM,OAAO,EAAE,YAAY,CAAC,SAAS,CAsP3C,CAAC;AAsjBF,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGxF"}
package/dist/index.js ADDED
@@ -0,0 +1,950 @@
1
+ // 副作用导入:注入 agent:turn:after 等 agent 域钩子到 HookContextMap(declaration merging),
2
+ // 使 ctx.middleware('agent:turn:after', ...) 的类型可见。
3
+ import '@aalis/plugin-agent-api';
4
+ import { resolveLLMModel } from '@aalis/plugin-llm-api';
5
+ import { useWebuiService } from '@aalis/plugin-webui-api';
6
+ export { SessionManagerCapabilities } from '@aalis/plugin-session-manager-api';
7
+ import { SessionManagerCapabilities } from '@aalis/plugin-session-manager-api';
8
+ // ===== 插件元数据 =====
9
+ export const name = '@aalis/plugin-session-manager';
10
+ export const displayName = '会话管理';
11
+ export const subsystem = 'session';
12
+ export const inject = {
13
+ required: ['memory'],
14
+ optional: ['agent', 'platform', 'persona', 'llm'],
15
+ };
16
+ export const provides = ['session-manager'];
17
+ export const configSchema = {
18
+ defaults: {
19
+ label: '全局默认配置',
20
+ description: '所有平台共享的最低层默认配置(platform profile 之下的 fallback)。LLM 默认模型由各 agent 插件通过 ServicePreference 锁定,不再在此配置;本节仅保留 persona 等通用默认。',
21
+ fields: {
22
+ persona: {
23
+ type: 'select',
24
+ label: '默认人设',
25
+ dynamicOptions: 'persona',
26
+ allowCustom: true,
27
+ description: '所有平台未单独指定时使用的默认人设',
28
+ },
29
+ },
30
+ },
31
+ platformProfiles: {
32
+ type: 'array',
33
+ label: '平台默认配置',
34
+ description: '为每个平台设置默认的会话配置模板。新会话创建时自动应用对应平台的模板。',
35
+ items: {
36
+ platform: {
37
+ type: 'string',
38
+ label: '平台标识',
39
+ required: true,
40
+ description: '平台名(如 onebot、webui、cli)',
41
+ },
42
+ persona: {
43
+ type: 'select',
44
+ label: '人设文件',
45
+ dynamicOptions: 'persona',
46
+ allowCustom: true,
47
+ description: '该平台默认使用的人设文件名(不含后缀)',
48
+ },
49
+ llm: {
50
+ type: 'llm-ref',
51
+ label: '默认模型',
52
+ description: '该平台新会话的默认 LLM (provider + model)。留空则沿用 ServicePreference 锁定的全局默认。',
53
+ },
54
+ enabledToolGroups: {
55
+ type: 'multiselect',
56
+ label: '工具分组',
57
+ dynamicOptions: 'toolGroups',
58
+ allowCustom: true,
59
+ description: '该平台启用的工具分组',
60
+ },
61
+ disableOutputFormat: {
62
+ type: 'boolean',
63
+ label: '禁用结构化输出',
64
+ default: false,
65
+ description: '禁用 JSON 结构化输出,回复纯文本',
66
+ },
67
+ clientSideJsonRendering: {
68
+ type: 'boolean',
69
+ label: '客户端渲染 JSON',
70
+ default: false,
71
+ description: '保留完整 JSON 给前端渲染,不提取回复字段',
72
+ },
73
+ },
74
+ },
75
+ };
76
+ export const defaultConfig = {
77
+ defaults: {},
78
+ platformProfiles: [],
79
+ };
80
+ // ===== 常量 =====
81
+ const METADATA_NAMESPACE = 'sessions';
82
+ // ===== WebuiPages(声明式 UI) =====
83
+ const webuiPages = [
84
+ {
85
+ key: 'sessions',
86
+ label: '会话管理',
87
+ icon: '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/><path d="M8 10h8M8 14h4"/></svg>',
88
+ order: 6,
89
+ renderer: 'sessions',
90
+ },
91
+ ];
92
+ // ===== Actions =====
93
+ export const actions = {
94
+ async listSessions(ctx) {
95
+ const sm = ctx.getService('session-manager');
96
+ if (!sm)
97
+ return [];
98
+ const sessions = sm.listSessions();
99
+ return sessions.map(s => ({
100
+ ...s,
101
+ displayTitle: s.title || s.name,
102
+ configSummary: formatConfigSummary(s.config),
103
+ childCount: s.children.length,
104
+ }));
105
+ },
106
+ async createSession(ctx, args) {
107
+ const sm = ctx.getService('session-manager');
108
+ if (!sm)
109
+ throw new Error('session-manager 服务不可用');
110
+ const parentId = args.parentId || undefined;
111
+ // 新建会话时复制当前生效配置,而非留空继承
112
+ let config = args.config || {};
113
+ if (Object.keys(config).length === 0) {
114
+ if (parentId) {
115
+ // 子会话:复制父会话的 resolved config
116
+ config = { ...sm.resolveConfig(parentId, 'webui') };
117
+ }
118
+ else {
119
+ // 根会话:复制 webui 平台 profile 作为初始配置
120
+ const profiles = sm.getPlatformProfiles();
121
+ if (profiles.webui)
122
+ config = { ...profiles.webui };
123
+ }
124
+ }
125
+ const session = await sm.createSession({
126
+ name: args.name ||
127
+ `会话 ${new Date().toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}`,
128
+ parentId,
129
+ config,
130
+ createdBy: 'user',
131
+ // 新建的空会话尚未发生任何对话,初始为 'waiting'(等待中)而非 'active'(进行中)。
132
+ // 否则侧栏新建的会话会一直显示"进行中"——直到首条消息触发 inbound→active→turn:after→completed。
133
+ status: 'waiting',
134
+ });
135
+ return session;
136
+ },
137
+ async deleteSession(ctx, args) {
138
+ const sm = ctx.getService('session-manager');
139
+ if (!sm)
140
+ throw new Error('session-manager 服务不可用');
141
+ const id = args.id;
142
+ if (!id)
143
+ throw new Error('缺少会话 ID');
144
+ await sm.deleteSession(id);
145
+ return { success: true };
146
+ },
147
+ async updateSessionConfig(ctx, args) {
148
+ const sm = ctx.getService('session-manager');
149
+ if (!sm)
150
+ throw new Error('session-manager 服务不可用');
151
+ const id = args.id;
152
+ if (!id)
153
+ throw new Error('缺少会话 ID');
154
+ const config = args.config;
155
+ if (!config)
156
+ throw new Error('缺少配置');
157
+ const session = await sm.updateSession(id, { config: config });
158
+ return session;
159
+ },
160
+ async getSessionHistory(ctx, args) {
161
+ const memory = ctx.getService('memory');
162
+ if (!memory)
163
+ throw new Error('memory 服务不可用');
164
+ const sessionId = args.sessionId;
165
+ if (!sessionId)
166
+ throw new Error('缺少 sessionId');
167
+ const limit = args.limit || 100;
168
+ const history = await memory.getHistory(sessionId, limit);
169
+ return { sessionId, messages: history };
170
+ },
171
+ /** 批量归档会话 */
172
+ async batchArchive(ctx, args) {
173
+ const sm = ctx.getService('session-manager');
174
+ if (!sm)
175
+ throw new Error('session-manager 服务不可用');
176
+ const ids = args.ids;
177
+ if (!Array.isArray(ids) || ids.length === 0)
178
+ throw new Error('缺少会话 ID 列表');
179
+ let count = 0;
180
+ for (const id of ids) {
181
+ try {
182
+ await sm.updateSession(id, { status: 'archived' });
183
+ count++;
184
+ }
185
+ catch {
186
+ /* skip */
187
+ }
188
+ }
189
+ return { success: true, count };
190
+ },
191
+ /** 批量删除会话 */
192
+ async batchDelete(ctx, args) {
193
+ const sm = ctx.getService('session-manager');
194
+ if (!sm)
195
+ throw new Error('session-manager 服务不可用');
196
+ const ids = args.ids;
197
+ if (!Array.isArray(ids) || ids.length === 0)
198
+ throw new Error('缺少会话 ID 列表');
199
+ let count = 0;
200
+ for (const id of ids) {
201
+ try {
202
+ await sm.deleteSession(id);
203
+ count++;
204
+ }
205
+ catch {
206
+ /* skip */
207
+ }
208
+ }
209
+ return { success: true, count };
210
+ },
211
+ async getSessionTree(ctx) {
212
+ const sm = ctx.getService('session-manager');
213
+ if (!sm)
214
+ return [];
215
+ return sm.getTree();
216
+ },
217
+ /** 获取可选项列表(供前端下拉框使用) */
218
+ async getConfigOptions(ctx) {
219
+ // 可用人设列表
220
+ const persona = ctx.getService('persona');
221
+ const personas = persona?.listModels ? await persona.listModels() : [];
222
+ // 可用 LLM 模型列表(枚举所有 chat-capable entry)
223
+ let models = [];
224
+ try {
225
+ const entries = ctx.getAllServices('llm', ['chat']);
226
+ models = entries.map(e => ({
227
+ id: e.instance.id,
228
+ capabilities: e.capabilities,
229
+ provider: e.instance.providerId,
230
+ contextId: e.contextId,
231
+ }));
232
+ }
233
+ catch {
234
+ /* llm 服务不可用 */
235
+ }
236
+ // 工具分组列表
237
+ let toolGroups = [];
238
+ try {
239
+ const tools = ctx.getService('tools');
240
+ if (tools)
241
+ toolGroups = tools.getGroups().map(g => ({ name: g.name, label: g.label }));
242
+ }
243
+ catch {
244
+ /* tools 服务不可用 */
245
+ }
246
+ // 已注册平台列表
247
+ const platforms = [];
248
+ try {
249
+ const allPlatforms = ctx.getAllServices('platform');
250
+ for (const p of allPlatforms) {
251
+ if (p.instance.platform && !platforms.includes(p.instance.platform)) {
252
+ platforms.push(p.instance.platform);
253
+ }
254
+ }
255
+ }
256
+ catch {
257
+ /* platform 服务不可用 */
258
+ }
259
+ // 平台 profiles
260
+ const sm = ctx.getService('session-manager');
261
+ const profiles = sm?.getPlatformProfiles() ?? {};
262
+ return { personas, models, toolGroups, platforms, profiles };
263
+ },
264
+ /** 获取指定会话的最终生效配置(合并所有层级后的结果) */
265
+ async getResolvedConfig(ctx, args) {
266
+ const sm = ctx.getService('session-manager');
267
+ if (!sm)
268
+ throw new Error('session-manager 服务不可用');
269
+ const sessionId = args.sessionId;
270
+ if (!sessionId)
271
+ throw new Error('缺少 sessionId');
272
+ const platform = args.platform;
273
+ return sm.resolveConfig(sessionId, platform);
274
+ },
275
+ /**
276
+ * 获取「继承默认」——不含 session 自身 config,只算 platform profile + 父 sessionDefaults。
277
+ * WebUI 「继承 (xxx)」提示用这个,避免显示用户自己的覆盖值。
278
+ */
279
+ async getInheritedDefaults(ctx, args) {
280
+ const sm = ctx.getService('session-manager');
281
+ if (!sm)
282
+ throw new Error('session-manager 服务不可用');
283
+ const sessionId = args.sessionId;
284
+ if (!sessionId)
285
+ throw new Error('缺少 sessionId');
286
+ const platform = args.platform;
287
+ return sm.resolveInheritedDefaults(sessionId, platform);
288
+ },
289
+ /** 更新平台 profile */
290
+ async updatePlatformProfile(ctx, args) {
291
+ const sm = ctx.getService('session-manager');
292
+ if (!sm)
293
+ throw new Error('session-manager 服务不可用');
294
+ const platform = args.platform;
295
+ if (!platform)
296
+ throw new Error('缺少 platform');
297
+ const profile = args.profile;
298
+ if (!profile)
299
+ throw new Error('缺少 profile');
300
+ sm.setPlatformProfile(platform, profile);
301
+ return { success: true };
302
+ },
303
+ /** 获取会话详情(含完整消息历史,包括已归档消息) */
304
+ async getSessionDetail(ctx, args) {
305
+ const sm = ctx.getService('session-manager');
306
+ const memory = ctx.getService('memory');
307
+ if (!sm || !memory)
308
+ throw new Error('服务不可用');
309
+ const id = args.id;
310
+ if (!id)
311
+ throw new Error('缺少会话 ID');
312
+ const session = sm.getSession(id);
313
+ if (!session)
314
+ throw new Error(`会话不存在: ${id}`);
315
+ const limit = args.limit || 200;
316
+ // 优先使用 getFullHistory(含已归档消息),确保 UI 能看到完整对话
317
+ const messages = memory.getFullHistory
318
+ ? await memory.getFullHistory(id, limit)
319
+ : await memory.getHistory(id, limit);
320
+ return { session, messages };
321
+ },
322
+ /** 手动重命名会话标题 */
323
+ async renameSession(ctx, args) {
324
+ const sm = ctx.getService('session-manager');
325
+ if (!sm)
326
+ throw new Error('session-manager 服务不可用');
327
+ const id = args.id;
328
+ const title = args.title;
329
+ if (!id || !title)
330
+ throw new Error('缺少 id 或 title');
331
+ await sm.updateSessionTitle(id, title);
332
+ return { success: true };
333
+ },
334
+ /** 归档子会话(父已不再需要) */
335
+ async archiveSession(ctx, args) {
336
+ const sm = ctx.getService('session-manager');
337
+ if (!sm)
338
+ throw new Error('session-manager 服务不可用');
339
+ const id = args.id;
340
+ if (!id)
341
+ throw new Error('缺少会话 ID');
342
+ // 递归归档:先归档所有子会话
343
+ const session = sm.getSession(id);
344
+ if (session) {
345
+ for (const childId of session.children) {
346
+ const child = sm.getSession(childId);
347
+ if (child && child.status !== 'archived') {
348
+ await this.archiveSession(ctx, { id: childId });
349
+ }
350
+ }
351
+ }
352
+ await sm.updateSession(id, { status: 'archived' });
353
+ return { success: true };
354
+ },
355
+ };
356
+ // ===== 辅助函数 =====
357
+ function formatConfigSummary(config) {
358
+ const parts = [];
359
+ if (config.llm?.model)
360
+ parts.push(`${config.llm.provider}/${config.llm.model}`);
361
+ if (config.enabledToolGroups?.length)
362
+ parts.push(`tools:${config.enabledToolGroups.length}组`);
363
+ if (config.persona)
364
+ parts.push(`persona:${config.persona}`);
365
+ return parts.join(', ') || '(默认)';
366
+ }
367
+ // ===== SessionManager 实现 =====
368
+ class SessionManager {
369
+ sessions = new Map();
370
+ ctx;
371
+ persistTimer = null;
372
+ dirty = false;
373
+ /** 平台 → 默认 SessionConfig 模板 */
374
+ platformProfiles = new Map();
375
+ /** 全局默认配置(platform profile 之下的最低层 fallback) */
376
+ defaults = {};
377
+ constructor(ctx) {
378
+ this.ctx = ctx;
379
+ }
380
+ /**
381
+ * memory provider 每次惰性查询:ServiceRegistry.get 返回的是裸 entry.instance,
382
+ * 缓存到 field 在 provider 重载后会失效。每次调用走 getService 让 provider 切换
383
+ * 后自然跟随,无需级联 bounce 本插件。
384
+ */
385
+ get memory() {
386
+ const m = this.ctx.getService('memory');
387
+ if (!m)
388
+ throw new Error('session-manager 需要 memory 服务');
389
+ return m;
390
+ }
391
+ /** 从 memory 元数据加载持久化会话列表 */
392
+ async load() {
393
+ if (!this.memory.listMetadata) {
394
+ this.ctx.logger.debug('memory 服务不支持 metadata,会话列表仅保存在内存中');
395
+ return;
396
+ }
397
+ try {
398
+ const entries = await this.memory.listMetadata(METADATA_NAMESPACE);
399
+ for (const { key, data } of entries) {
400
+ const info = data;
401
+ if (info && info.id === key) {
402
+ this.sessions.set(key, info);
403
+ }
404
+ }
405
+ this.ctx.logger.info(`已加载 ${this.sessions.size} 个会话`);
406
+ }
407
+ catch (err) {
408
+ this.ctx.logger.warn('加载会话数据失败:', err);
409
+ }
410
+ }
411
+ /** 标记需要持久化并延迟刷盘 */
412
+ markDirty() {
413
+ this.dirty = true;
414
+ if (!this.persistTimer) {
415
+ this.persistTimer = setTimeout(() => {
416
+ this.persistTimer = null;
417
+ this.persist().catch(err => this.ctx.logger.warn('持久化会话失败:', err));
418
+ }, 1000);
419
+ }
420
+ }
421
+ /** 持久化到 memory metadata */
422
+ async persist() {
423
+ if (!this.dirty || !this.memory.saveMetadata)
424
+ return;
425
+ this.dirty = false;
426
+ // 保存每个会话
427
+ for (const [id, info] of this.sessions) {
428
+ await this.memory.saveMetadata(METADATA_NAMESPACE, id, info);
429
+ }
430
+ // 清理已删除的会话(元数据中存在但内存中不存在的;含旧版本残留的 __active__ 指针)
431
+ if (this.memory.listMetadata) {
432
+ const existing = await this.memory.listMetadata(METADATA_NAMESPACE);
433
+ for (const { key } of existing) {
434
+ if (!this.sessions.has(key) && this.memory.deleteMetadata) {
435
+ await this.memory.deleteMetadata(METADATA_NAMESPACE, key);
436
+ }
437
+ }
438
+ }
439
+ }
440
+ /** 直接注入一个完整的会话对象(用于默认会话等特殊场景) */
441
+ injectSession(session) {
442
+ this.sessions.set(session.id, session);
443
+ this.markDirty();
444
+ }
445
+ // ---- CRUD ----
446
+ async createSession(opts) {
447
+ const id = opts?.parentId
448
+ ? `${opts.parentId}::${crypto.randomUUID().slice(0, 8)}`
449
+ : `session-${crypto.randomUUID().slice(0, 8)}`;
450
+ const now = Date.now();
451
+ const session = {
452
+ id,
453
+ name: opts?.name ||
454
+ `会话 ${new Date().toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}`,
455
+ title: opts?.metadata?.title,
456
+ parentId: opts?.parentId,
457
+ children: [],
458
+ status: opts?.status || 'active',
459
+ config: opts?.config || {},
460
+ createdAt: now,
461
+ updatedAt: now,
462
+ createdBy: opts?.createdBy || 'user',
463
+ inputContext: opts?.metadata?.inputContext,
464
+ metadata: opts?.metadata,
465
+ };
466
+ this.sessions.set(id, session);
467
+ // 如果有父会话,更新父会话的 children
468
+ if (session.parentId) {
469
+ const parent = this.sessions.get(session.parentId);
470
+ if (parent) {
471
+ parent.children.push(id);
472
+ parent.updatedAt = now;
473
+ }
474
+ }
475
+ this.markDirty();
476
+ await this.ctx.emit('session:created', session);
477
+ this.ctx.logger.info(`会话创建: ${session.name} (${id})`);
478
+ return session;
479
+ }
480
+ getSession(id) {
481
+ return this.sessions.get(id);
482
+ }
483
+ listSessions(filter) {
484
+ let result = [...this.sessions.values()];
485
+ if (filter) {
486
+ if (filter.parentId !== undefined) {
487
+ if (filter.parentId === null) {
488
+ result = result.filter(s => !s.parentId);
489
+ }
490
+ else {
491
+ result = result.filter(s => s.parentId === filter.parentId);
492
+ }
493
+ }
494
+ if (filter.status) {
495
+ result = result.filter(s => s.status === filter.status);
496
+ }
497
+ }
498
+ return result.sort((a, b) => b.updatedAt - a.updatedAt);
499
+ }
500
+ async updateSession(id, updates) {
501
+ const session = this.sessions.get(id);
502
+ if (!session)
503
+ throw new Error(`会话不存在: ${id}`);
504
+ if (updates.name !== undefined)
505
+ session.name = updates.name;
506
+ if (updates.status !== undefined)
507
+ session.status = updates.status;
508
+ if (updates.metadata !== undefined)
509
+ session.metadata = { ...session.metadata, ...updates.metadata };
510
+ if (updates.config !== undefined) {
511
+ // 合并配置而不是替换
512
+ const merged = { ...session.config, ...updates.config };
513
+ // 兼容性归一化:早期 WebUI(SessionsPage 老版编辑器)只发 flat `model: string`
514
+ // 而不发 provider;agent 只读 `llm: {provider,model}`。这里**真折叠**——
515
+ // 若 legacyProvider 缺失,用 ctx 已注册的 llm entries 反查 model.id 推断
516
+ // provider。**legacy 字段代表用户最近一次的 UI 意图**,应覆盖 merged.llm。
517
+ // (之前曾在此 delete 但不折叠,导致用户切模型 100% 静默失败。)
518
+ const legacyModel = typeof merged.model === 'string' ? merged.model : undefined;
519
+ const legacyProvider = typeof merged.llmProvider === 'string' ? merged.llmProvider : undefined;
520
+ if (legacyModel || legacyProvider) {
521
+ let provider = legacyProvider;
522
+ if (!provider && legacyModel) {
523
+ const candidates = this.ctx.getAllServices('llm').filter(e => e.instance.id === legacyModel);
524
+ if (candidates.length === 1) {
525
+ provider = candidates[0].instance.providerId;
526
+ }
527
+ else if (candidates.length > 1) {
528
+ const existing = merged.llm?.provider;
529
+ const hit = existing ? candidates.find(c => c.instance.providerId === existing) : undefined;
530
+ provider = (hit ?? candidates[0]).instance.providerId;
531
+ this.ctx.logger?.warn(`[session ${id}] legacy model=${legacyModel} 在 ${candidates.length} 个 provider 下同名,回退选择 ${provider}`);
532
+ }
533
+ }
534
+ if (legacyModel && provider) {
535
+ merged.llm = { provider, model: legacyModel };
536
+ this.ctx.logger?.info(`[session ${id}] 折叠 legacy 字段 → llm={${provider}, ${legacyModel}}`);
537
+ }
538
+ else {
539
+ this.ctx.logger?.warn(`[session ${id}] 无法折叠 legacy 字段 model=${legacyModel ?? '?'} provider=${legacyProvider ?? '?'}:未找到匹配 LLM provider`);
540
+ }
541
+ delete merged.model;
542
+ delete merged.llmProvider;
543
+ }
544
+ session.config = merged;
545
+ }
546
+ session.updatedAt = Date.now();
547
+ this.markDirty();
548
+ await this.ctx.emit('session:updated', session);
549
+ return session;
550
+ }
551
+ async deleteSession(id) {
552
+ const session = this.sessions.get(id);
553
+ if (!session)
554
+ return;
555
+ // 递归删除所有子会话(含活跃子会话)
556
+ for (const childId of [...session.children]) {
557
+ await this.deleteSession(childId);
558
+ }
559
+ // 从父会话的 children 中移除
560
+ if (session.parentId) {
561
+ const parent = this.sessions.get(session.parentId);
562
+ if (parent) {
563
+ parent.children = parent.children.filter(c => c !== id);
564
+ parent.updatedAt = Date.now();
565
+ }
566
+ }
567
+ this.sessions.delete(id);
568
+ await this.clearDeletedSessionData(id);
569
+ this.markDirty();
570
+ await this.ctx.emit('session:deleted', id);
571
+ this.ctx.logger.info(`会话删除: ${session.name} (${id})`);
572
+ }
573
+ async clearDeletedSessionData(id) {
574
+ const clearData = {
575
+ scope: 'session',
576
+ sessionId: id,
577
+ results: [],
578
+ rollbacks: [],
579
+ };
580
+ await this.ctx.hooks.run('memory:clear', clearData, async () => {
581
+ try {
582
+ await this.memory.clearSession(id);
583
+ clearData.results.push({ source: 'memory', success: true, message: '会话消息历史已清空' });
584
+ }
585
+ catch (err) {
586
+ const msg = err instanceof Error ? err.message : String(err);
587
+ clearData.results.push({ source: 'memory', success: false, message: `会话消息历史清空失败: ${msg}` });
588
+ }
589
+ });
590
+ const failed = clearData.results.filter(r => !r.success);
591
+ if (failed.length > 0) {
592
+ this.ctx.logger.warn(`会话数据清理存在失败项 [${id}]: ${failed.map(r => `${r.source}: ${r.message}`).join('; ')}`);
593
+ }
594
+ }
595
+ // ---- 树形操作 ----
596
+ async createChildSession(parentId, opts) {
597
+ const parent = this.sessions.get(parentId);
598
+ if (!parent)
599
+ throw new Error(`父会话不存在: ${parentId}`);
600
+ return this.createSession({
601
+ ...opts,
602
+ parentId,
603
+ createdBy: opts?.createdBy || 'agent',
604
+ });
605
+ }
606
+ getChildren(parentId) {
607
+ return this.listSessions({ parentId });
608
+ }
609
+ getTree(rootId) {
610
+ const buildNode = (session) => ({
611
+ session,
612
+ children: session.children
613
+ .map(cid => this.sessions.get(cid))
614
+ .filter((s) => !!s)
615
+ .map(buildNode),
616
+ });
617
+ if (rootId) {
618
+ const root = this.sessions.get(rootId);
619
+ if (!root)
620
+ return [];
621
+ return [buildNode(root)];
622
+ }
623
+ // 返回所有根会话的树
624
+ return this.listSessions({ parentId: null }).map(buildNode);
625
+ }
626
+ // ---- 生命周期 ----
627
+ async completeSession(id, result) {
628
+ const session = this.sessions.get(id);
629
+ if (!session)
630
+ throw new Error(`会话不存在: ${id}`);
631
+ session.status = 'completed';
632
+ session.result = result;
633
+ session.updatedAt = Date.now();
634
+ this.markDirty();
635
+ // 发事件通知(wait_subtasks 通过事件驱动感知完成)
636
+ await this.ctx.emit('session:completed', session);
637
+ this.ctx.logger.info(`会话完成: ${session.name} (${id})${result ? ` - ${result.slice(0, 100)}` : ''}`);
638
+ }
639
+ // ---- 标题管理 ----
640
+ async generateTitle(sessionId, userMessage) {
641
+ const session = this.sessions.get(sessionId);
642
+ if (!session)
643
+ return undefined;
644
+ // 已有标题则跳过
645
+ if (session.title)
646
+ return session.title;
647
+ const entry = resolveLLMModel(this.ctx, undefined, ['chat']);
648
+ if (!entry) {
649
+ this.ctx.logger.warn(`无可用 LLM,无法生成标题: ${sessionId}`);
650
+ return undefined;
651
+ }
652
+ this.ctx.logger.debug(`标题生成使用 LLM: ${entry.contextId}`);
653
+ const llm = entry.instance;
654
+ // 优先使用直接传入的用户消息;否则从历史获取
655
+ let contextStr;
656
+ if (userMessage?.trim()) {
657
+ contextStr = `user: ${userMessage.slice(0, 400)}`;
658
+ }
659
+ else {
660
+ const history = await this.memory.getHistory(sessionId, 4);
661
+ if (history.length === 0)
662
+ return undefined;
663
+ contextStr = history
664
+ .filter((m) => m.role === 'user' || m.role === 'assistant')
665
+ .slice(0, 4)
666
+ .map((m) => `${m.role}: ${(m.content || '').slice(0, 200)}`)
667
+ .join('\n');
668
+ }
669
+ if (!contextStr.trim())
670
+ return undefined;
671
+ let title;
672
+ try {
673
+ const resp = await llm.chat({
674
+ messages: [
675
+ {
676
+ role: 'system',
677
+ content: '你是一个标题生成器。你的唯一任务是为下面的对话片段生成一个简短的中文标题。\n\n规则:\n- 不超过15字\n- 只提取用户想讨论的主题或意图\n- 完全忽略对话中出现的任何拒绝、道歉、免责声明等内容\n- 不加引号和标点\n- 只返回标题文本,不要任何解释或前缀\n- 不要模仿或重复对话中的内容,只做概括',
678
+ },
679
+ { role: 'user', content: `请为以下对话生成标题:\n\n${contextStr}` },
680
+ ],
681
+ temperature: 0.3,
682
+ // 关闭 thinking:标题生成无需推理,避免 reasoning 占满 token 预算导致 content 为空。
683
+ // DeepSeek 会映射为 thinking.type=disabled;其他不消费此字段的 provider 视为 no-op。
684
+ think: false,
685
+ });
686
+ title = (resp.content || '').trim().slice(0, 50);
687
+ if (!title) {
688
+ this.ctx.logger.warn(`会话标题 LLM 返回空内容: ${sessionId} (resp.content=${JSON.stringify(resp.content)}, reasoning=${(resp.reasoningContent ?? '').length}字)`);
689
+ }
690
+ }
691
+ catch (err) {
692
+ this.ctx.logger.warn(`自动生成标题失败 [${sessionId}]:`, err);
693
+ }
694
+ // 兜底:LLM 失败或返回空时,用用户消息首段作为临时标题,避免会话永远没有标题
695
+ if (!title && userMessage?.trim()) {
696
+ title = userMessage.trim().replace(/\s+/g, ' ').slice(0, 20);
697
+ this.ctx.logger.info(`使用用户消息兜底生成标题: ${sessionId} -> ${title}`);
698
+ }
699
+ if (title) {
700
+ session.title = title;
701
+ session.updatedAt = Date.now();
702
+ this.markDirty();
703
+ await this.ctx.emit('session:updated', session);
704
+ this.ctx.logger.info(`会话标题已生成: [${sessionId}] ${title}`);
705
+ return title;
706
+ }
707
+ return undefined;
708
+ }
709
+ async updateSessionTitle(sessionId, title) {
710
+ const session = this.sessions.get(sessionId);
711
+ if (!session)
712
+ throw new Error(`会话不存在: ${sessionId}`);
713
+ session.title = title;
714
+ session.updatedAt = Date.now();
715
+ this.markDirty();
716
+ await this.ctx.emit('session:updated', session);
717
+ }
718
+ // ---- 配置解析 ----
719
+ /**
720
+ * 解析指定会话的最终生效配置
721
+ *
722
+ * 合并优先级(从高到低):
723
+ * 1. 会话自身 config
724
+ * 2. 父会话的 sessionDefaults
725
+ * 3. 平台 profile
726
+ * 4. 全局 defaults(最低)
727
+ */
728
+ resolveConfig(sessionId, platform) {
729
+ const session = this.sessions.get(sessionId);
730
+ const result = {};
731
+ // 4. 全局 defaults(最低优先级)
732
+ Object.assign(result, stripUndefined(this.defaults));
733
+ // 3. 平台 profile —— 无论 session 是否存在都应用
734
+ if (platform) {
735
+ const profile = this.platformProfiles.get(platform);
736
+ if (profile)
737
+ Object.assign(result, stripDefaults(profile));
738
+ }
739
+ if (!session)
740
+ return result;
741
+ // 2. 父会话 sessionDefaults
742
+ if (session.parentId) {
743
+ const parent = this.sessions.get(session.parentId);
744
+ if (parent?.config?.sessionDefaults) {
745
+ Object.assign(result, stripUndefined(parent.config.sessionDefaults));
746
+ }
747
+ }
748
+ // 1. 会话自身 config(最高优先级)
749
+ Object.assign(result, stripUndefined(session.config));
750
+ // 移除 sessionDefaults(不传递到消费方)
751
+ delete result.sessionDefaults;
752
+ return result;
753
+ }
754
+ /**
755
+ * 解析「继承默认」:不含 session 自身 config,只算 defaults + platform profile + 父 sessionDefaults。
756
+ *
757
+ * WebUI 「继承 (xxx)」提示应该用这个值,否则会显示用户自己的覆盖值。
758
+ */
759
+ resolveInheritedDefaults(sessionId, platform) {
760
+ const result = {};
761
+ // 3. 全局 defaults(最低)
762
+ Object.assign(result, stripUndefined(this.defaults));
763
+ // 2. 平台 profile
764
+ if (platform) {
765
+ const profile = this.platformProfiles.get(platform);
766
+ if (profile)
767
+ Object.assign(result, stripDefaults(profile));
768
+ }
769
+ // 1. 父会话 sessionDefaults(最高,覆盖 profile/defaults)
770
+ const session = this.sessions.get(sessionId);
771
+ if (session?.parentId) {
772
+ const parent = this.sessions.get(session.parentId);
773
+ if (parent?.config?.sessionDefaults) {
774
+ Object.assign(result, stripUndefined(parent.config.sessionDefaults));
775
+ }
776
+ }
777
+ delete result.sessionDefaults;
778
+ return result;
779
+ }
780
+ getDefaults() {
781
+ return { ...this.defaults };
782
+ }
783
+ /** 从配置加载全局 defaults */
784
+ loadDefaults(raw) {
785
+ if (!raw || typeof raw !== 'object')
786
+ return;
787
+ const r = raw;
788
+ const next = {};
789
+ if (typeof r.persona === 'string' && r.persona)
790
+ next.persona = r.persona;
791
+ this.defaults = next;
792
+ if (Object.keys(next).length > 0) {
793
+ this.ctx.logger.info(`已加载全局 defaults: ${Object.keys(next).join(', ')}`);
794
+ }
795
+ }
796
+ getPlatformProfiles() {
797
+ const result = {};
798
+ for (const [platform, profile] of this.platformProfiles) {
799
+ result[platform] = { ...profile };
800
+ }
801
+ return result;
802
+ }
803
+ setPlatformProfile(platform, profile) {
804
+ this.platformProfiles.set(platform, profile);
805
+ this.markDirty();
806
+ this.ctx.logger.info(`平台 profile 已更新: ${platform}`);
807
+ }
808
+ /** 从配置加载平台 profiles */
809
+ loadPlatformProfiles(raw) {
810
+ if (!Array.isArray(raw))
811
+ return;
812
+ for (const entry of raw) {
813
+ if (!entry || typeof entry !== 'object' || typeof entry.platform !== 'string')
814
+ continue;
815
+ const profile = {};
816
+ if (entry.persona)
817
+ profile.persona = entry.persona;
818
+ if (entry.llm && typeof entry.llm === 'object' && entry.llm.provider && entry.llm.model) {
819
+ profile.llm = { provider: String(entry.llm.provider), model: String(entry.llm.model) };
820
+ }
821
+ if (Array.isArray(entry.enabledToolGroups))
822
+ profile.enabledToolGroups = entry.enabledToolGroups;
823
+ if (entry.disableOutputFormat !== undefined)
824
+ profile.disableOutputFormat = !!entry.disableOutputFormat;
825
+ if (entry.clientSideJsonRendering !== undefined)
826
+ profile.clientSideJsonRendering = !!entry.clientSideJsonRendering;
827
+ this.platformProfiles.set(entry.platform, profile);
828
+ }
829
+ if (this.platformProfiles.size > 0) {
830
+ this.ctx.logger.info(`已加载 ${this.platformProfiles.size} 个平台配置模板: ${[...this.platformProfiles.keys()].join(', ')}`);
831
+ }
832
+ }
833
+ /** 强制持久化并清理定时器 */
834
+ async shutdown() {
835
+ if (this.persistTimer) {
836
+ clearTimeout(this.persistTimer);
837
+ this.persistTimer = null;
838
+ }
839
+ this.dirty = true;
840
+ await this.persist();
841
+ }
842
+ }
843
+ // ===== 工具函数 =====
844
+ /** 移除值为 undefined 的键 */
845
+ function stripUndefined(obj) {
846
+ if (!obj)
847
+ return {};
848
+ const result = {};
849
+ for (const [key, value] of Object.entries(obj)) {
850
+ if (value !== undefined)
851
+ result[key] = value;
852
+ }
853
+ return result;
854
+ }
855
+ /** stripDefaults 与 stripUndefined 功能相同 —— 只保留有值的字段 */
856
+ const stripDefaults = stripUndefined;
857
+ // ===== 插件入口 =====
858
+ export async function apply(ctx, config) {
859
+ // 注册 WebUI 页面
860
+ const webui = useWebuiService(ctx);
861
+ for (const page of webuiPages)
862
+ webui.registerPage(page);
863
+ if (!ctx.hasService('memory')) {
864
+ ctx.logger.error('memory 服务不可用,会话管理无法启动');
865
+ return;
866
+ }
867
+ const manager = new SessionManager(ctx);
868
+ // 从持久化存储加载
869
+ await manager.load();
870
+ // 加载平台 profiles
871
+ manager.loadPlatformProfiles(config.platformProfiles);
872
+ // 加载全局 defaults
873
+ manager.loadDefaults(config.defaults);
874
+ // 注册服务
875
+ ctx.provide('session-manager', manager, {
876
+ capabilities: [SessionManagerCapabilities.SessionCrud, SessionManagerCapabilities.SessionTree],
877
+ label: '会话管理',
878
+ });
879
+ // ===== 会话状态自治管理 =====
880
+ // 监听消息事件,自动维护会话状态(从 Agent 职责中迁出)
881
+ ctx.on('inbound:message', (msg) => {
882
+ if (!msg.sessionId)
883
+ return;
884
+ const session = manager.getSession(msg.sessionId);
885
+ if (session && session.status !== 'active') {
886
+ manager.updateSession(msg.sessionId, { status: 'active' }).catch(() => { });
887
+ }
888
+ });
889
+ ctx.on('outbound:message', (msg) => {
890
+ if (!msg.sessionId)
891
+ return;
892
+ const session = manager.getSession(msg.sessionId);
893
+ // 子会话(有 parentId)由 plugin-session-tools 的 agent:turn:after 中间件负责完成并提取 result
894
+ if (session && session.status === 'active' && !session.parentId) {
895
+ manager.updateSession(msg.sessionId, { status: 'completed' }).catch(() => { });
896
+ }
897
+ });
898
+ // 回合终态收口:agent 在 replied/silent/aborted/error 四条路径都会发 agent:turn:after。
899
+ // 上面的 outbound:message 只覆盖"产生了回复"的情形——用户中途停止生成(aborted)或
900
+ // 空回复(silent)时不发 outbound:message,会话会永远停在 'active'(即"进行中")。
901
+ // 这里订阅生命周期钩子作幂等互补,确保任何回合结束都把根会话收口为 'completed'。
902
+ ctx.middleware('agent:turn:after', async (data, next) => {
903
+ await next();
904
+ if (!data.sessionId)
905
+ return;
906
+ const session = manager.getSession(data.sessionId);
907
+ // 子会话由 plugin-session-tools 负责完成并回传 result,这里只收口根会话。
908
+ if (session && session.status === 'active' && !session.parentId) {
909
+ manager.updateSession(data.sessionId, { status: 'completed' }).catch(() => { });
910
+ }
911
+ });
912
+ // 监听用户消息事件 → 自动生成会话标题
913
+ // 在用户首次发消息时即生成标题,无需等待 AI 回复
914
+ // 仅对 webui / cli 等用户交互平台生效,onebot 等外部平台不生成标题
915
+ const TITLE_PLATFORMS = new Set(['webui', 'cli']);
916
+ const titleGenerating = new Set();
917
+ ctx.on('inbound:message', (msg) => {
918
+ const { sessionId, platform } = msg;
919
+ if (!sessionId) {
920
+ ctx.logger.debug('标题生成跳过: 缺少 sessionId');
921
+ return;
922
+ }
923
+ if (titleGenerating.has(sessionId))
924
+ return;
925
+ // 仅对指定平台生成标题;非 webui/cli 平台(如 onebot)静默跳过,避免日志污染。
926
+ if (platform && !TITLE_PLATFORMS.has(platform))
927
+ return;
928
+ const session = manager.getSession(sessionId);
929
+ if (!session) {
930
+ ctx.logger.warn(`标题生成跳过: 会话不存在 ${sessionId}`);
931
+ return;
932
+ }
933
+ // 已有标题或子任务会话跳过(静默)
934
+ if (session.title || session.parentId)
935
+ return;
936
+ titleGenerating.add(sessionId);
937
+ ctx.logger.info(`开始生成会话标题: ${sessionId} (platform=${platform ?? 'unknown'})`);
938
+ // 异步生成,不阻塞消息处理;直接传入用户消息避免依赖历史
939
+ manager
940
+ .generateTitle(sessionId, msg.content)
941
+ .catch(err => ctx.logger.warn('标题生成失败:', err))
942
+ .finally(() => titleGenerating.delete(sessionId));
943
+ });
944
+ // 应用停止时持久化:在 app:stopping 阶段执行,此时各 memory 插件尚未 dispose(数据库连接仍在)
945
+ ctx.on('app:stopping', async () => {
946
+ await manager.shutdown();
947
+ });
948
+ ctx.logger.info('会话管理服务已启用');
949
+ }
950
+ //# 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 { PlatformProfile, SessionConfig, SessionInfo, SessionManagerCapability, SessionManagerCapabilityRegistry, SessionManagerService, SessionTreeNode, } from '@aalis/plugin-session-manager-api';
2
+ export { SessionManagerCapabilities } from '@aalis/plugin-session-manager-api';
3
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,wBAAwB,EACxB,gCAAgC,EAChC,qBAAqB,EACrB,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export { SessionManagerCapabilities } from '@aalis/plugin-session-manager-api';
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@aalis/plugin-session-manager",
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
+ "@aalis/plugin-agent-api": "^0.1.0",
15
+ "@aalis/plugin-webui-api": "^0.1.0",
16
+ "@aalis/plugin-llm-api": "^0.1.0",
17
+ "@aalis/plugin-session-manager-api": "^0.1.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^22.0.0",
21
+ "typescript": "^5.7.0",
22
+ "@aalis/core": "0.1.0",
23
+ "@aalis/plugin-memory-api": "0.1.0",
24
+ "@aalis/plugin-message-api": "0.1.0",
25
+ "@aalis/plugin-persona-api": "0.1.0",
26
+ "@aalis/plugin-tools-api": "0.1.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@aalis/core": "^0.1.0"
30
+ },
31
+ "aalis": {
32
+ "service": {
33
+ "required": [
34
+ "memory"
35
+ ],
36
+ "optional": [
37
+ "agent",
38
+ "platform",
39
+ "persona",
40
+ "llm"
41
+ ],
42
+ "provides": [
43
+ "session-manager"
44
+ ]
45
+ }
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "dev": "tsc --watch"
50
+ }
51
+ }