@lemoncat7/dsh-partner 2.24.0-rc.9 → 2.25.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.
Files changed (173) hide show
  1. package/README.md +2 -2
  2. package/docs/releases/2.24.0-rc.10.md +8 -0
  3. package/docs/releases/2.24.0-rc.11.md +10 -0
  4. package/docs/releases/2.25.0-rc.1.md +12 -0
  5. package/docs/releases/2.25.0-rc.11.md +5 -0
  6. package/docs/releases/2.25.0-rc.2.md +10 -0
  7. package/docs/releases/2.25.0-rc.3.md +11 -0
  8. package/docs/releases/2.25.0-rc.4.md +3 -0
  9. package/docs/releases/2.25.0-rc.5.md +3 -0
  10. package/docs/releases/2.25.0.md +32 -0
  11. package/lib/agent-runtime.d.ts +2 -1
  12. package/lib/agent-runtime.d.ts.map +1 -1
  13. package/lib/agent-runtime.js +38 -14
  14. package/lib/agent-runtime.js.map +1 -1
  15. package/lib/api/features/tts-api.d.ts +4 -0
  16. package/lib/api/features/tts-api.d.ts.map +1 -0
  17. package/lib/api/features/tts-api.js +49 -0
  18. package/lib/api/features/tts-api.js.map +1 -0
  19. package/lib/api.d.ts +2 -0
  20. package/lib/api.d.ts.map +1 -1
  21. package/lib/api.js +11 -5
  22. package/lib/api.js.map +1 -1
  23. package/lib/channels/activity-defaults.d.ts.map +1 -1
  24. package/lib/channels/activity-defaults.js +5 -0
  25. package/lib/channels/activity-defaults.js.map +1 -1
  26. package/lib/channels/direct/transport.d.ts +1 -1
  27. package/lib/channels/direct/transport.d.ts.map +1 -1
  28. package/lib/channels/manager.d.ts +2 -0
  29. package/lib/channels/manager.d.ts.map +1 -1
  30. package/lib/channels/manager.js +16 -2
  31. package/lib/channels/manager.js.map +1 -1
  32. package/lib/channels/outbound-media.d.ts +1 -1
  33. package/lib/channels/outbound-media.d.ts.map +1 -1
  34. package/lib/channels/outbound-media.js +3 -2
  35. package/lib/channels/outbound-media.js.map +1 -1
  36. package/lib/channels/qq/authority.js +1 -1
  37. package/lib/channels/qq/authority.js.map +1 -1
  38. package/lib/channels/qq/reply-tool.d.ts +1 -1
  39. package/lib/channels/qq/reply-tool.d.ts.map +1 -1
  40. package/lib/channels/qq/reply-tool.js +7 -2
  41. package/lib/channels/qq/reply-tool.js.map +1 -1
  42. package/lib/channels/weixin/api.d.ts +1 -1
  43. package/lib/channels/weixin/api.d.ts.map +1 -1
  44. package/lib/channels/weixin/api.js +7 -1
  45. package/lib/channels/weixin/api.js.map +1 -1
  46. package/lib/channels/weixin/connect.d.ts +2 -0
  47. package/lib/channels/weixin/connect.d.ts.map +1 -1
  48. package/lib/character/activity-journal.d.ts +3 -1
  49. package/lib/character/activity-journal.d.ts.map +1 -1
  50. package/lib/character/activity-journal.js +43 -7
  51. package/lib/character/activity-journal.js.map +1 -1
  52. package/lib/character/activity-summary.d.ts +23 -0
  53. package/lib/character/activity-summary.d.ts.map +1 -0
  54. package/lib/character/activity-summary.js +23 -0
  55. package/lib/character/activity-summary.js.map +1 -0
  56. package/lib/character/conversation-behavior.d.ts +1 -0
  57. package/lib/character/conversation-behavior.d.ts.map +1 -1
  58. package/lib/character/conversation-behavior.js +7 -4
  59. package/lib/character/conversation-behavior.js.map +1 -1
  60. package/lib/character/idle-contact.d.ts +7 -0
  61. package/lib/character/idle-contact.d.ts.map +1 -1
  62. package/lib/character/idle-contact.js +57 -8
  63. package/lib/character/idle-contact.js.map +1 -1
  64. package/lib/chat/live-speech.js +1 -1
  65. package/lib/chat/live-speech.js.map +1 -1
  66. package/lib/chat/persona-delivery.d.ts +2 -0
  67. package/lib/chat/persona-delivery.d.ts.map +1 -1
  68. package/lib/chat/persona-delivery.js +2 -0
  69. package/lib/chat/persona-delivery.js.map +1 -1
  70. package/lib/chat/protocol.d.ts +1 -1
  71. package/lib/chat/protocol.js +1 -1
  72. package/lib/chat/tools.d.ts.map +1 -1
  73. package/lib/chat/tools.js +6 -3
  74. package/lib/chat/tools.js.map +1 -1
  75. package/lib/client-api.d.ts +7 -0
  76. package/lib/client-api.d.ts.map +1 -1
  77. package/lib/client-api.js.map +1 -1
  78. package/lib/client.activities.js +3 -0
  79. package/lib/client.js +1126 -1114
  80. package/lib/client.js.map +4 -4
  81. package/lib/client.tts.js +7 -0
  82. package/lib/collaboration/tool-discovery.d.ts +1 -1
  83. package/lib/collaboration/tool-discovery.d.ts.map +1 -1
  84. package/lib/collaboration/tool-discovery.js +10 -5
  85. package/lib/collaboration/tool-discovery.js.map +1 -1
  86. package/lib/companions/management.d.ts +4 -4
  87. package/lib/concern-execution-receipt.d.ts +2 -1
  88. package/lib/concern-execution-receipt.d.ts.map +1 -1
  89. package/lib/concern-execution-receipt.js +15 -13
  90. package/lib/concern-execution-receipt.js.map +1 -1
  91. package/lib/concern-execution.d.ts +3 -1
  92. package/lib/concern-execution.d.ts.map +1 -1
  93. package/lib/concern-execution.js +20 -1
  94. package/lib/concern-execution.js.map +1 -1
  95. package/lib/concern-recording.d.ts +1 -1
  96. package/lib/concern-recording.d.ts.map +1 -1
  97. package/lib/concern-recording.js +14 -5
  98. package/lib/concern-recording.js.map +1 -1
  99. package/lib/concern-store.d.ts.map +1 -1
  100. package/lib/concern-store.js +3 -1
  101. package/lib/concern-store.js.map +1 -1
  102. package/lib/domain.d.ts +3 -0
  103. package/lib/domain.d.ts.map +1 -1
  104. package/lib/domain.js.map +1 -1
  105. package/lib/execution/task-preamble.js +1 -1
  106. package/lib/execution/task-preamble.js.map +1 -1
  107. package/lib/execution/work-tool.js +1 -1
  108. package/lib/execution/work-tool.js.map +1 -1
  109. package/lib/heartbeat.js +1 -1
  110. package/lib/heartbeat.js.map +1 -1
  111. package/lib/index.d.ts.map +1 -1
  112. package/lib/index.js +8 -3
  113. package/lib/index.js.map +1 -1
  114. package/lib/observation-loop.d.ts.map +1 -1
  115. package/lib/observation-loop.js +7 -3
  116. package/lib/observation-loop.js.map +1 -1
  117. package/lib/store.d.ts.map +1 -1
  118. package/lib/store.js +3 -1
  119. package/lib/store.js.map +1 -1
  120. package/lib/ui/channels-panel.d.ts.map +1 -1
  121. package/lib/ui/channels-panel.js +9 -3
  122. package/lib/ui/channels-panel.js.map +1 -1
  123. package/lib/ui/identity-editor.js +1 -1
  124. package/lib/ui/identity-editor.js.map +1 -1
  125. package/lib/ui/idle-contact-editor.js +1 -1
  126. package/lib/ui/idle-contact-editor.js.map +1 -1
  127. package/lib/ui/memory/concern-board.js +1 -1
  128. package/lib/ui/memory/concern-board.js.map +1 -1
  129. package/lib/ui/memory/concern-execution-status.d.ts.map +1 -1
  130. package/lib/ui/memory/concern-execution-status.js +2 -2
  131. package/lib/ui/memory/concern-execution-status.js.map +1 -1
  132. package/lib/ui/qq-channel-settings.js +3 -3
  133. package/lib/ui/qq-channel-settings.js.map +1 -1
  134. package/lib/ui/thoughts-panel-loader.d.ts +4 -0
  135. package/lib/ui/thoughts-panel-loader.d.ts.map +1 -0
  136. package/lib/ui/thoughts-panel-loader.js +23 -0
  137. package/lib/ui/thoughts-panel-loader.js.map +1 -0
  138. package/lib/ui/thoughts-panel.d.ts.map +1 -1
  139. package/lib/ui/thoughts-panel.js +7 -5
  140. package/lib/ui/thoughts-panel.js.map +1 -1
  141. package/lib/ui/tts-settings-loader.d.ts +4 -0
  142. package/lib/ui/tts-settings-loader.d.ts.map +1 -0
  143. package/lib/ui/tts-settings-loader.js +23 -0
  144. package/lib/ui/tts-settings-loader.js.map +1 -0
  145. package/lib/ui/tts-settings.d.ts +11 -0
  146. package/lib/ui/tts-settings.d.ts.map +1 -0
  147. package/lib/ui/tts-settings.js +63 -0
  148. package/lib/ui/tts-settings.js.map +1 -0
  149. package/lib/voice/credentials.d.ts +9 -0
  150. package/lib/voice/credentials.d.ts.map +1 -0
  151. package/lib/voice/credentials.js +12 -0
  152. package/lib/voice/credentials.js.map +1 -0
  153. package/lib/voice/domain.d.ts +42 -0
  154. package/lib/voice/domain.d.ts.map +1 -0
  155. package/lib/voice/domain.js +53 -0
  156. package/lib/voice/domain.js.map +1 -0
  157. package/lib/voice/service.d.ts +63 -0
  158. package/lib/voice/service.d.ts.map +1 -0
  159. package/lib/voice/service.js +211 -0
  160. package/lib/voice/service.js.map +1 -0
  161. package/lib/voice/synthesize.d.ts +12 -0
  162. package/lib/voice/synthesize.d.ts.map +1 -0
  163. package/lib/voice/synthesize.js +97 -0
  164. package/lib/voice/synthesize.js.map +1 -0
  165. package/lib/voice/tool.d.ts +7 -0
  166. package/lib/voice/tool.d.ts.map +1 -0
  167. package/lib/voice/tool.js +73 -0
  168. package/lib/voice/tool.js.map +1 -0
  169. package/lib/voice/validation.d.ts +3 -0
  170. package/lib/voice/validation.d.ts.map +1 -0
  171. package/lib/voice/validation.js +31 -0
  172. package/lib/voice/validation.js.map +1 -0
  173. package/package.json +10 -1
@@ -0,0 +1,7 @@
1
+ import type { PartnerOutboundAttachment } from '../channel-message.js';
2
+ import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
3
+ import type { PartnerStore } from '../store.js';
4
+ import type { TtsService } from './service.js';
5
+ import type { QqActionCall } from '../channels/qq/actions.js';
6
+ export declare function voiceReplyTool(owner: string, store: PartnerStore, service: TtsService, call: QqActionCall, sendAudio?: (sessionId: string, file: PartnerOutboundAttachment, signal: AbortSignal, routeId: string, guard: () => void) => Promise<void>): ToolDefinition;
7
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/voice/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,uBAAuB,CAAA;AAGpE,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAM3D,wBAAgB,cAAc,CAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,YAAY,EAAC,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,YAAY,EAAC,SAAS,CAAC,EAAC,CAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,yBAAyB,EAAC,MAAM,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAI,IAAI,KAAG,OAAO,CAAC,IAAI,CAAC,GAAE,cAAc,CAgC/O"}
@@ -0,0 +1,73 @@
1
+ import { supportsChannelTts } from './domain.js';
2
+ import { directReplyTarget } from '../channels/reply-access.js';
3
+ import { qqGroupPeer, qqSettings } from '../channels/qq/settings.js';
4
+ import { channelReplyAllowed } from '../channels/reply-access.js';
5
+ import { questionOrigin } from '../channels/question-origin.js';
6
+ import { isIdleContactNotice } from '../character/idle-contact.js';
7
+ import { OneBotApiError } from '../channels/qq/connection.js';
8
+ export function voiceReplyTool(owner, store, service, call, sendAudio) {
9
+ return { name: 'partner_voice_reply', description: '使用伙伴「渠道 → TTS」中配置并分配给当前渠道的通用服务向当前聊天对象说话,属于公开聊天回复能力。action=status 查看当前语音服务和可用音色;action=send_file 用 path 发送脚本已生成的当前会话目录内 WAV/MP3(最多10MB),不合成、不改音色、不要求开启或选择 TTS 服务;可 continueTurn:true 连续发送试听,比较和记录音色由你自行完成。action=speak 将按当前人物写好的 text 合成并发送音频(QQ 为语音条,微信、Matrix、Mattermost 为音频附件),不重写语气。不能填写收件人、接口或密钥。默认送达后结束本轮;continueTurn:true 可接着执行或接话。成功后不重复发同样的文字;结果未知不能重试发送。未启用外部 TTS 时 QQ 原生语音仍可用 partner_qq_reply。', parameters: { type: 'object', additionalProperties: false, required: ['action'], properties: { action: { type: 'string', enum: ['status', 'speak', 'send_file'] }, path: { type: 'string', minLength: 1, maxLength: 4096, description: 'send_file 专用,本会话工作目录内已生成的音频路径' }, text: { type: 'string', minLength: 1, maxLength: 2000 }, voice: { type: 'string', maxLength: 200 }, continueTurn: { type: 'boolean' } } }, presentCall: () => ({ card: 'generic', title: '语音 TTS' }),
10
+ output: { schema: { type: 'object' }, render: (_a, v) => [{ type: 'text', text: JSON.stringify(v) }], presentationMeta: (_a, v) => { const r = v; return r.status === 'confirmed' ? { kind: 'partner-chat-v1', parts: [], delivered: true, deliveryKind: 'text', originRouteId: r.originRouteId, inputMessageId: r.inputMessageId, spokenText: r.spokenText, ...(r.continueTurn ? { intermediate: true } : {}) } : null; } },
11
+ async execute(raw, exec) {
12
+ const a = raw;
13
+ if (!a || Object.keys(a).some(k => !['action', 'path', 'text', 'voice', 'continueTurn'].includes(k)) || !['status', 'speak', 'send_file'].includes(a.action) || a.continueTurn !== undefined && typeof a.continueTurn !== 'boolean')
14
+ throw Error('语音参数无效');
15
+ const agent = exec.agent;
16
+ if (!agent)
17
+ throw Error('需要当前渠道会话');
18
+ const origin = () => { const events = agent.session.snapshotEvents(), state = store.snapshot(); const latest = [...events].reverse().find(e => e.type === 'user/message' && (e.data.source.kind === 'user' || isIdleContactNotice(e))); const route = latest && isIdleContactNotice(latest) ? state.sessions.find(r => r.sessionId === agent.session.id && latest.type === 'user/message' && r.idleContactState?.messageId === latest.data.id) : questionOrigin(agent.session.id, events, state.sessions); return { route, input: latest?.type === 'user/message' ? latest.data.id : undefined }; };
19
+ const initial = origin(), route = initial.route, c = store.snapshot().channels.find(c => c.id === route?.channelId && c.companionId === owner);
20
+ if (!route || route.companionId !== owner || !initial.input || !c || !supportsChannelTts(c.platform))
21
+ throw Error('当前会话不是支持语音 TTS 的消息渠道');
22
+ const group = c.platform === 'qq' ? qqGroupPeer(route.userId) : undefined;
23
+ const target = directReplyTarget(store.snapshot(), c.id, route.userId);
24
+ const guard = () => { exec.signal.throwIfAborted(); const now = origin(), state = store.snapshot(), live = state.channels.find(x => x.id === c.id), settings = qqSettings(live?.qq); if (store.isCompanionRemoving(owner) || !live?.enabled || live.updatedAt !== c.updatedAt || live.companionId !== owner || directReplyTarget(state, c.id, route.userId) !== target || now.input !== initial.input || now.route?.id !== route.id)
25
+ throw Error('语音对象或渠道配置已变化'); if (!channelReplyAllowed(state, c.id, route.userId, target || undefined))
26
+ throw Error('当前会话许可已撤回'); if (c.platform === 'qq' && (group ? !settings.groupReplies || !settings.groupIds.includes(group.groupId) : !settings.privateReplies))
27
+ throw Error('当前会话回复已关闭'); };
28
+ guard();
29
+ if (a.action === 'status') {
30
+ if (!c.tts?.enabled)
31
+ return { enabled: false, sendFile: true, nativeQqVoice: c.platform === 'qq' && qqSettings(c.qq).replyVoiceEnabled === true };
32
+ const p = service.profile(owner, c.tts.profileId);
33
+ return { enabled: true, sendFile: true, delivery: c.platform === 'qq' ? 'voice' : 'audio-attachment', provider: p.provider, voice: c.tts.voice || p.voice, name: p.name };
34
+ }
35
+ if (a.action === 'send_file' && (typeof a.path !== 'string' || !a.path.trim() || a.path.length > 4096 || a.voice !== undefined || a.text !== undefined))
36
+ throw Error('send_file 只需 path,可选 continueTurn;音色与内容由原音频决定');
37
+ if (a.action !== 'send_file' && a.path !== undefined)
38
+ throw Error('只有 send_file 接受音频文件路径');
39
+ if (a.action === 'speak' && !c.tts?.enabled)
40
+ throw Error('渠道尚未开启语音 TTS');
41
+ if (c.platform !== 'qq' && !sendAudio)
42
+ throw Error('当前渠道音频发送未初始化');
43
+ if (a.action === 'speak' && (typeof a.text !== 'string' || !a.text.trim() || a.text.length > 2000 || a.voice !== undefined && (typeof a.voice !== 'string' || a.voice.length > 200)))
44
+ throw Error('请提供有效的语音正文和音色');
45
+ if (!a.continueTurn && typeof exec.concludeTurn !== 'function')
46
+ throw Error('当前宿主不支持语音终结');
47
+ const input = { owner, channelId: c.id, routeId: route.id, inputId: initial.input, text: a.text?.trim() ?? '', voice: a.voice, signal: exec.signal, guard, send: async (data, signal, check, file) => {
48
+ if (c.platform !== 'qq') {
49
+ await sendAudio(agent.session.id, file, signal, route.id, check);
50
+ return { confirmed: true };
51
+ }
52
+ try {
53
+ const result = await call(c.id, group ? 'send_group_msg' : 'send_private_msg', { ...(group ? { group_id: Number(group.groupId) } : { user_id: Number(route.userId) }), message: [{ type: 'record', data: { file: 'base64://' + data.toString('base64') } }] }, signal, check);
54
+ return result && ['number', 'string'].includes(typeof result.message_id) ? String(result.message_id) : '';
55
+ }
56
+ catch (e) {
57
+ if (e instanceof OneBotApiError)
58
+ throw Object.assign(Error('渠道明确拒绝发送,可复用已生成音频'), { sendRejected: true });
59
+ throw e;
60
+ }
61
+ } };
62
+ const cwd = route.cwd ?? agent.session.header?.cwd;
63
+ if (a.action === 'send_file' && !cwd)
64
+ throw Error('当前会话缺少工作目录');
65
+ const r = a.action === 'send_file' ? await service.deliverFile({ ...input, cwd: cwd, path: a.path }) : await service.deliver(input);
66
+ if (r.status !== 'confirmed')
67
+ throw Error('本次语音' + (r.status === 'unknown' ? '结果未知' : '尚未确认送达') + ';不要自动重新合成或发送,请核对服务和渠道记录');
68
+ if (!a.continueTurn)
69
+ exec.concludeTurn();
70
+ return { status: r.status, messageId: r.messageId, originRouteId: route.id, inputMessageId: initial.input, spokenText: r.spokenText, continueTurn: a.continueTurn === true };
71
+ } };
72
+ }
73
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/voice/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PartnerState } from '../domain.js';
2
+ export declare function validateTtsState(state: Partial<PartnerState>): void;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/voice/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,cAAc,CAAA;AAE9C,wBAAgB,gBAAgB,CAAC,KAAK,EAAC,OAAO,CAAC,YAAY,CAAC,GAAE,IAAI,CAcjE"}
@@ -0,0 +1,31 @@
1
+ import { channelTts, ttsProfile } from './domain.js';
2
+ export function validateTtsState(state) {
3
+ for (const c of state.companions ?? []) {
4
+ if (c.ttsProfiles === undefined)
5
+ continue;
6
+ if (!Array.isArray(c.ttsProfiles) || c.ttsProfiles.length > 20)
7
+ throw Error('invalid TTS profiles');
8
+ const ids = new Set();
9
+ for (const p of c.ttsProfiles) {
10
+ if (!p || typeof p.id !== 'string' || !/^[a-zA-Z0-9_-]{1,100}$/.test(p.id) || ids.has(p.id) || !Number.isFinite(p.updatedAt) || p.credentialId !== undefined && !/^[a-zA-Z0-9_-]{1,100}$/.test(p.credentialId))
11
+ throw Error('invalid TTS profile identity');
12
+ ids.add(p.id);
13
+ ttsProfile(p, p.id, p.updatedAt, p.credentialId);
14
+ }
15
+ }
16
+ for (const c of state.channels ?? []) {
17
+ if (c.tts)
18
+ channelTts(c.tts);
19
+ if (c.ttsReceipts === undefined)
20
+ continue;
21
+ if (!Array.isArray(c.ttsReceipts) || c.ttsReceipts.length > 500)
22
+ throw Error('invalid TTS receipts');
23
+ const ids = new Set();
24
+ for (const r of c.ttsReceipts) {
25
+ if (!r || !/^[a-f0-9]{64}$/.test(r.id) || ids.has(r.id) || !['generating', 'generated', 'sending', 'confirmed', 'failed', 'unknown'].includes(r.status) || !Number.isFinite(r.at) || typeof r.profileId !== 'string' || typeof r.inputId !== 'string' || typeof r.routeId !== 'string' || typeof r.spokenText !== 'string' || r.spokenText.length > 2000 || r.audioId !== undefined && !/^[a-f0-9]{64}\.(wav|mp3)$/.test(r.audioId))
26
+ throw Error('invalid TTS receipt');
27
+ ids.add(r.id);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/voice/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,MAAM,aAAa,CAAA;AACjD,MAAM,UAAU,gBAAgB,CAAC,KAA2B;IAC3D,KAAI,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,IAAE,EAAE,EAAC,CAAC;QACpC,IAAG,CAAC,CAAC,WAAW,KAAG,SAAS;YAAC,SAAQ;QACrC,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,IAAE,CAAC,CAAC,WAAW,CAAC,MAAM,GAAC,EAAE;YAAC,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAC7F,MAAM,GAAG,GAAC,IAAI,GAAG,EAAU,CAAA;QAC3B,KAAI,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAC,CAAC;YAAA,IAAG,CAAC,CAAC,IAAE,OAAO,CAAC,CAAC,EAAE,KAAG,QAAQ,IAAE,CAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAE,CAAC,CAAC,YAAY,KAAG,SAAS,IAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;gBAAC,MAAM,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAAA,UAAU,CAAC,CAAsC,EAAC,CAAC,CAAC,EAAE,EAAC,CAAC,CAAC,SAAS,EAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QAAA,CAAC;IAC3W,CAAC;IACD,KAAI,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAE,EAAE,EAAC,CAAC;QAClC,IAAG,CAAC,CAAC,GAAG;YAAC,UAAU,CAAC,CAAC,CAAC,GAAwC,CAAC,CAAA;QAC/D,IAAG,CAAC,CAAC,WAAW,KAAG,SAAS;YAAC,SAAQ;QACrC,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,IAAE,CAAC,CAAC,WAAW,CAAC,MAAM,GAAC,GAAG;YAAC,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAC9F,MAAM,GAAG,GAAC,IAAI,GAAG,EAAU,CAAA;QAC3B,KAAI,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAC,CAAC;YAAA,IAAG,CAAC,CAAC,IAAE,CAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAE,CAAC,CAAC,YAAY,EAAC,WAAW,EAAC,SAAS,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAE,OAAO,CAAC,CAAC,SAAS,KAAG,QAAQ,IAAE,OAAO,CAAC,CAAC,OAAO,KAAG,QAAQ,IAAE,OAAO,CAAC,CAAC,OAAO,KAAG,QAAQ,IAAE,OAAO,CAAC,CAAC,UAAU,KAAG,QAAQ,IAAE,CAAC,CAAC,UAAU,CAAC,MAAM,GAAC,IAAI,IAAE,CAAC,CAAC,OAAO,KAAG,SAAS,IAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBAAC,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAAA,CAAC;IAC7c,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncat7/dsh-partner",
3
- "version": "2.24.0-rc.9",
3
+ "version": "2.25.0",
4
4
  "description": "Long-lived AI companions with QQ, WeChat, Matrix and Mattermost channels for DeepSeek Harness",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -31,6 +31,15 @@
31
31
  }
32
32
  },
33
33
  "files": [
34
+ "docs/releases/2.25.0.md",
35
+ "docs/releases/2.25.0-rc.11.md",
36
+ "docs/releases/2.25.0-rc.5.md",
37
+ "docs/releases/2.25.0-rc.4.md",
38
+ "docs/releases/2.25.0-rc.3.md",
39
+ "docs/releases/2.25.0-rc.2.md",
40
+ "docs/releases/2.25.0-rc.1.md",
41
+ "docs/releases/2.24.0-rc.11.md",
42
+ "docs/releases/2.24.0-rc.10.md",
34
43
  "docs/releases/2.24.0-rc.9.md",
35
44
  "docs/releases/2.23.54.md",
36
45
  "docs/releases/2.23.53.md",